diff --git a/.gitignore b/.gitignore
index bd28bb6d..3c8cb3e0 100644
--- a/.gitignore
+++ b/.gitignore
@@ -4,7 +4,6 @@ __pycache__/
coverage/
node_modules/
-dist/
old/*output
old/*.scad
diff --git a/.vscode/settings.json b/.vscode/settings.json
index 4da41f2d..b3c804c4 100644
--- a/.vscode/settings.json
+++ b/.vscode/settings.json
@@ -20,7 +20,7 @@
},
"cSpell.words": ["registryref"],
"editor.codeActionsOnSave": {
- "source.fixAll.eslint": true
+ "source.fixAll.eslint": "explicit"
},
"rpc.enabled": true
}
diff --git a/CNAME b/CNAME
new file mode 100644
index 00000000..9a194389
--- /dev/null
+++ b/CNAME
@@ -0,0 +1 @@
+3duf.org
\ No newline at end of file
diff --git a/dist/animations.css b/dist/animations.css
new file mode 100644
index 00000000..f9bd2c75
--- /dev/null
+++ b/dist/animations.css
@@ -0,0 +1,57 @@
+#resolution-toolbar {
+ align-content: center;
+ position: absolute;
+ width: 500px;
+ height: 120px;
+ top: 10px;
+ right: 100px;
+ background-color: rgb(250, 250, 250);
+ z-index: 9;
+ box-shadow: 0px 2px 5px 0 rgba(0, 0, 0, 0.36);
+ transition: all 0.4s;
+ padding-left: 30px;
+ padding-right: 30px;
+ padding-top: 5px;
+ padding-botton: 5px;
+ opacity: 0.9;
+ border-radius: 5px;
+}
+
+#zoom-toolbar {
+ align-content: center;
+ position: absolute;
+ /*width: 100px;*/
+ height: 30%;
+ top: 100px;
+ right: 30px;
+ /*background-color: rgb(250, 250, 250);*/
+ z-index: 9;
+ transition: all 0.4s;
+ padding-top: 25px;
+ padding-botton: 25px;
+ /*opacity: 0.9;*/
+ border-radius: 5px;
+}
+
+#toolbar-button-panel {
+ position: absolute;
+ top: 10px;
+ right: 10px;
+ z-index: 9;
+}
+
+.showtoolbar {
+ -webkit-transform: translateY(0);
+ transform: translateY(0);
+ visibility: visible;
+}
+
+.hidetoolbar {
+ -webkit-transform: translateY(-100%);
+ transform: translateY(-100%);
+ visibility: hidden;
+}
+
+.collapse {
+ display: none;
+}
diff --git a/dist/css/app.85a0644e.css b/dist/css/app.85a0644e.css
new file mode 100644
index 00000000..63d517af
--- /dev/null
+++ b/dist/css/app.85a0644e.css
@@ -0,0 +1 @@
+.noUi-target,.noUi-target *{-webkit-touch-callout:none;-webkit-tap-highlight-color:transparent;-webkit-user-select:none;touch-action:none;-ms-user-select:none;-moz-user-select:none;user-select:none;box-sizing:border-box}.noUi-target{position:relative}.noUi-base,.noUi-connects{width:100%;height:100%;position:relative;z-index:1}.noUi-connects{overflow:hidden;z-index:0}.noUi-connect,.noUi-origin{will-change:transform;position:absolute;z-index:1;top:0;right:0;height:100%;width:100%;-ms-transform-origin:0 0;-webkit-transform-origin:0 0;-webkit-transform-style:preserve-3d;transform-origin:0 0;transform-style:flat}.noUi-txt-dir-rtl.noUi-horizontal .noUi-origin{left:0;right:auto}.noUi-vertical .noUi-origin{top:-100%;width:0}.noUi-horizontal .noUi-origin{height:0}.noUi-handle{backface-visibility:hidden;position:absolute}.noUi-touch-area{height:100%;width:100%}.noUi-state-tap .noUi-connect,.noUi-state-tap .noUi-origin{transition:transform .3s}.noUi-state-drag *{cursor:inherit!important}.noUi-horizontal{height:18px}.noUi-horizontal .noUi-handle{width:34px;height:28px;right:-17px;top:-6px}.noUi-vertical{width:18px}.noUi-vertical .noUi-handle{width:28px;height:34px;right:-6px;bottom:-17px}.noUi-txt-dir-rtl.noUi-horizontal .noUi-handle{left:-17px;right:auto}.noUi-target{background:#fafafa;border-radius:4px;border:1px solid #d3d3d3;box-shadow:inset 0 1px 1px #f0f0f0,0 3px 6px -5px #bbb}.noUi-connects{border-radius:3px}.noUi-connect{background:#3fb8af}.noUi-draggable{cursor:ew-resize}.noUi-vertical .noUi-draggable{cursor:ns-resize}.noUi-handle{border:1px solid #d9d9d9;border-radius:3px;background:#fff;cursor:default;box-shadow:inset 0 0 1px #fff,inset 0 1px 7px #ebebeb,0 3px 6px -3px #bbb}.noUi-active{box-shadow:inset 0 0 1px #fff,inset 0 1px 7px #ddd,0 3px 6px -3px #bbb}.noUi-handle:after,.noUi-handle:before{content:"";display:block;position:absolute;height:14px;width:1px;background:#e8e7e6;left:14px;top:6px}.noUi-handle:after{left:17px}.noUi-vertical .noUi-handle:after,.noUi-vertical .noUi-handle:before{width:14px;height:1px;left:6px;top:14px}.noUi-vertical .noUi-handle:after{top:17px}[disabled] .noUi-connect{background:#b8b8b8}[disabled].noUi-handle,[disabled] .noUi-handle,[disabled].noUi-target{cursor:not-allowed}.noUi-pips,.noUi-pips *{box-sizing:border-box}.noUi-pips{position:absolute;color:#999}.noUi-value{position:absolute;white-space:nowrap;text-align:center}.noUi-value-sub{color:#ccc;font-size:10px}.noUi-marker{position:absolute;background:#ccc}.noUi-marker-large,.noUi-marker-sub{background:#aaa}.noUi-pips-horizontal{padding:10px 0;height:80px;top:100%;left:0;width:100%}.noUi-value-horizontal{transform:translate(-50%,50%)}.noUi-rtl .noUi-value-horizontal{transform:translate(50%,50%)}.noUi-marker-horizontal.noUi-marker{margin-left:-1px;width:2px;height:5px}.noUi-marker-horizontal.noUi-marker-sub{height:10px}.noUi-marker-horizontal.noUi-marker-large{height:15px}.noUi-pips-vertical{padding:0 10px;height:100%;top:0;left:100%}.noUi-value-vertical{transform:translateY(-50%);padding-left:25px}.noUi-rtl .noUi-value-vertical{transform:translateY(50%)}.noUi-marker-vertical.noUi-marker{width:5px;height:2px;margin-top:-1px}.noUi-marker-vertical.noUi-marker-sub{width:10px}.noUi-marker-vertical.noUi-marker-large{width:15px}.noUi-tooltip{display:block;position:absolute;border:1px solid #d9d9d9;border-radius:3px;background:#fff;color:#000;padding:5px;text-align:center;white-space:nowrap}.noUi-horizontal .noUi-tooltip{transform:translate(-50%);left:50%;bottom:120%}.noUi-vertical .noUi-tooltip{transform:translateY(-50%);top:50%;right:120%}.noUi-horizontal .noUi-origin>.noUi-tooltip{transform:translate(50%);left:auto;bottom:10px}.noUi-vertical .noUi-origin>.noUi-tooltip{transform:translateY(-18px);top:auto;right:28px}#resolution-toolbar[data-v-17cb0ead]{align-content:center;position:absolute;width:500px;height:230px;top:10px;right:100px;background-color:#fafafa;z-index:9;box-shadow:0 2px 5px 0 rgba(0,0,0,.36);transition:all .4s;padding-left:30px;padding-right:30px;padding-top:5px;opacity:.9;border-radius:5px}#grid-button[data-v-17cb0ead]{position:absolute;top:10px;right:10px;z-index:9}#grid-resolution-slider[data-v-17cb0ead]{font-size:10px}#grid-hover[data-v-17cb0ead]{position:absolute;top:22.5px;left:1080px;z-index:9}.veeno.noUi-pips.noUi-pips-horizontal[data-v-17cb0ead]{padding:0;left:10px}#bottom-info-bar[data-v-17cb0ead]{z-index:9;bottom:2px;right:50px;position:absolute}.zoomsliderbase[data-v-1a7b3dea]{position:absolute;top:200px;right:35px;z-index:1000;height:300px}.zslidermain[data-v-1a7b3dea]{height:300px}.topleft-dialog[data-v-151188cb]{position:absolute;top:50px;left:50px}.subtitle-1[data-v-151188cb]{margin-left:12px}#box[data-v-151188cb]{height:90px;width:70px;background-color:#e2e2e2;margin-top:30px}.mdl-textfield__input[data-v-151188cb]{width:100px}.bottom-xy[data-v-151188cb]{margin-top:40px}#left-col[data-v-151188cb]{margin-left:10px}#right-col[data-v-151188cb]{margin-top:10px}.v-text-field[data-v-151188cb]{width:100px}#actions-row[data-v-151188cb]{margin-top:10px}.draggable-dialog .text-h5[data-v-151188cb]{cursor:grab}.draggable-dialog .text-h5[data-v-151188cb]:hover{cursor:grabbing}.subtitle-1[data-v-41dfe81a]{margin-left:55px}.heading-6[data-v-41dfe81a]{margin-left:30px}#actions-row[data-v-41dfe81a]{margin-top:50px;margin-left:30px;padding-bottom:10px}.property-drawer-parent[data-v-41dfe81a]{overflow:visible;position:relative}.change-all-drawer[data-v-41dfe81a]{position:absolute;float:left;width:300px;left:225px;z-index:100}.topleft-dialog[data-v-c6cad3e2]{position:absolute;top:50px;left:50px}.subtitle-1[data-v-c6cad3e2]{margin-left:12px}#box[data-v-c6cad3e2]{height:90px;width:70px;background-color:#e2e2e2;margin-top:30px}.mdl-textfield__input[data-v-c6cad3e2]{width:100px}.bottom-xy[data-v-c6cad3e2]{margin-top:40px}#left-col[data-v-c6cad3e2]{margin-left:10px}#right-col[data-v-c6cad3e2]{margin-top:10px}.v-text-field[data-v-c6cad3e2]{width:100px}#actions-row[data-v-c6cad3e2]{margin-top:10px}.draggable-dialog .text-h5[data-v-c6cad3e2]{cursor:grab}.draggable-dialog .text-h5[data-v-c6cad3e2]:hover{cursor:grabbing}#activateMenu[data-v-94aacf7a]{height:10px}#buttonClass[data-v-94aacf7a]{margin-left:15px;margin-top:15px}#showRename[data-v-94aacf7a]{margin-left:20px}#close[data-v-94aacf7a]{margin-top:20px;margin-left:5px}#activateMenu[data-v-7fd25946]{height:10px}#buttonClass[data-v-7fd25946]{margin-left:15px;margin-top:15px}#showRename[data-v-7fd25946]{margin-left:20px}#close[data-v-7fd25946]{margin-top:20px;margin-left:5px}#view-container[data-v-c5eef416]{width:100%;height:100%;overflow-y:hidden}#c[data-v-c5eef416]{z-index:1;position:absolute;left:0;top:0;cursor:default;width:100%;height:100%}#contextMenu[data-v-c5eef416]{position:absolute;z-index:19;background-color:"#fff"}.property-drawer-parent[data-v-20543ec0]{overflow:visible;position:relative}.btn[data-v-20543ec0]{width:100%}#border_import_panel[data-v-180b9f39]{position:relative;top:10px}#file_input[data-v-180b9f39]{position:relative;top:30px}#drop_box[data-v-89ff16ba]{position:relative;top:10px}#dxf_input[data-v-89ff16ba]{position:relative;top:30px}.md-content[data-v-088f6ffc]{width:75px;height:200px;display:inline-flex;justify-content:center;align-items:center}.layerbutton-flow[data-v-088f6ffc]{background-color:#00f;color:#fff}.property-drawer-parent[data-v-420c4732]{overflow:visible;position:relative}.setting-icon-button[data-v-420c4732]{transform:translateX(50%)}.btn[data-v-420c4732]{width:100%}.property-drawer[data-v-420c4732]{position:absolute;float:left;width:500px;left:225px;z-index:100}.property-drawer[data-v-420c4732] .v-messages{display:none}.property-drawer td[data-v-420c4732]{padding:4px}.property-drawer[data-v-420c4732] .v-input__slot{margin:12px 0}.property-drawer[data-v-420c4732] .v-text-field{padding-top:0}.property-drawer[data-v-420c4732] .v-text-field__details{display:none}.property-drawer-parent[data-v-ad2fe0a0]{overflow:visible;position:relative}.btn[data-v-ad2fe0a0]{width:100%}.table[data-v-ad2fe0a0]{width:480px}.d-inline[data-v-ad2fe0a0]{margin-top:20px;margin-left:150px}.d-inline[data-v-ad2fe0a0]:hover{cursor:pointer}.subtitle-1[data-v-ad2fe0a0]{margin-left:12px}.pencil[data-v-ad2fe0a0]{padding-top:15px;padding-left:15px}.connection-property-drawer[data-v-ad2fe0a0]{position:absolute;float:left;width:1000px;left:225px;top:10px;z-index:100}.connection-property-drawer[data-v-ad2fe0a0] .v-messages{display:none}.connection-property-drawer td[data-v-ad2fe0a0]{padding:4px}.connection-property-drawer[data-v-ad2fe0a0] .v-input__slot{margin:12px 0}.connection-property-drawer[data-v-ad2fe0a0] .v-text-field{padding-top:0}.connection-property-drawer[data-v-ad2fe0a0] .v-text-field__details{display:none}.connection-property-drawer .connection-profile[data-v-ad2fe0a0]{margin-top:10px;margin-left:20px;text-align:center}#dropdown[data-v-ad2fe0a0]{margin-top:10px}.image-placeholder[data-v-ad2fe0a0]{margin-left:35px;margin-top:10px}.special.v-text-field.v-input--is-disabled[data-v-ad2fe0a0]{pointer-events:auto}.md-content[data-v-690cc93d]{width:75px;height:200px;display:inline-flex;justify-content:center;align-items:center}#visualizer-slot[data-v-58399cfc]{width:100%;min-height:100vh}.newbox[data-v-2254ac6c]{position:absolute;right:0;width:85vw;height:100vh}#app{font-family:Avenir,Helvetica,Arial,sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-align:center;color:#2c3e50;margin-top:60px}body{overflow:hidden;height:100vh}html{-ms-scroll-chaining:none;overscroll-behavior:none}
\ No newline at end of file
diff --git a/dist/css/chunk-vendors.acfd7f9b.css b/dist/css/chunk-vendors.acfd7f9b.css
new file mode 100644
index 00000000..1d2e3393
--- /dev/null
+++ b/dist/css/chunk-vendors.acfd7f9b.css
@@ -0,0 +1,5 @@
+.v-btn:not(.v-btn--outlined).accent,.v-btn:not(.v-btn--outlined).error,.v-btn:not(.v-btn--outlined).info,.v-btn:not(.v-btn--outlined).primary,.v-btn:not(.v-btn--outlined).secondary,.v-btn:not(.v-btn--outlined).success,.v-btn:not(.v-btn--outlined).warning{color:#fff}.theme--light.v-btn{color:rgba(0,0,0,.87)}.theme--light.v-btn.v-btn--disabled,.theme--light.v-btn.v-btn--disabled .v-btn__loading,.theme--light.v-btn.v-btn--disabled .v-icon{color:rgba(0,0,0,.26)!important}.theme--light.v-btn.v-btn--disabled.v-btn--has-bg{background-color:rgba(0,0,0,.12)!important}.theme--light.v-btn.v-btn--has-bg{background-color:#f5f5f5}.theme--light.v-btn.v-btn--outlined.v-btn--text{border-color:rgba(0,0,0,.12)}.theme--light.v-btn.v-btn--icon{color:rgba(0,0,0,.54)}.theme--light.v-btn:hover:before{opacity:.08}.theme--light.v-btn:focus:before{opacity:.24}.theme--light.v-btn--active:before,.theme--light.v-btn--active:hover:before{opacity:.18}.theme--light.v-btn--active:focus:before{opacity:.16}.theme--dark.v-btn{color:#fff}.theme--dark.v-btn.v-btn--disabled,.theme--dark.v-btn.v-btn--disabled .v-btn__loading,.theme--dark.v-btn.v-btn--disabled .v-icon{color:hsla(0,0%,100%,.3)!important}.theme--dark.v-btn.v-btn--disabled.v-btn--has-bg{background-color:hsla(0,0%,100%,.12)!important}.theme--dark.v-btn.v-btn--has-bg{background-color:#272727}.theme--dark.v-btn.v-btn--outlined.v-btn--text{border-color:hsla(0,0%,100%,.12)}.theme--dark.v-btn.v-btn--icon{color:#fff}.theme--dark.v-btn:hover:before{opacity:.08}.theme--dark.v-btn:focus:before{opacity:.24}.theme--dark.v-btn--active:before,.theme--dark.v-btn--active:hover:before{opacity:.18}.theme--dark.v-btn--active:focus:before{opacity:.32}.v-btn{align-items:center;border-radius:4px;display:inline-flex;flex:0 0 auto;font-weight:500;letter-spacing:.0892857143em;justify-content:center;outline:0;position:relative;text-decoration:none;text-indent:.0892857143em;text-transform:uppercase;transition-duration:.28s;transition-property:box-shadow,transform,opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;vertical-align:middle;white-space:nowrap}.v-btn.v-size--x-small{font-size:.625rem}.v-btn.v-size--small{font-size:.75rem}.v-btn.v-size--default,.v-btn.v-size--large{font-size:.875rem}.v-btn.v-size--x-large{font-size:1rem}.v-btn:before{background-color:currentColor;border-radius:inherit;bottom:0;color:inherit;content:"";left:0;opacity:0;pointer-events:none;position:absolute;right:0;top:0;transition:opacity .2s cubic-bezier(.4,0,.6,1)}.v-btn:not(.v-btn--round).v-size--x-small{height:20px;min-width:36px;padding:0 8.8888888889px}.v-btn:not(.v-btn--round).v-size--small{height:28px;min-width:50px;padding:0 12.4444444444px}.v-btn:not(.v-btn--round).v-size--default{height:36px;min-width:64px;padding:0 16px}.v-btn:not(.v-btn--round).v-size--large{height:44px;min-width:78px;padding:0 19.5555555556px}.v-btn:not(.v-btn--round).v-size--x-large{height:52px;min-width:92px;padding:0 23.1111111111px}.v-btn>.v-btn__content .v-icon{color:inherit}.v-btn__content{align-items:center;color:inherit;display:flex;flex:1 0 auto;justify-content:inherit;line-height:normal;position:relative;transition:inherit;transition-property:opacity}.v-btn__content .v-icon.v-icon--left,.v-btn__content .v-icon.v-icon--right{font-size:18px;height:18px;width:18px}.v-application--is-ltr .v-btn__content .v-icon--left{margin-left:-4px;margin-right:8px}.v-application--is-ltr .v-btn__content .v-icon--right,.v-application--is-rtl .v-btn__content .v-icon--left{margin-left:8px;margin-right:-4px}.v-application--is-rtl .v-btn__content .v-icon--right{margin-left:-4px;margin-right:8px}.v-btn__loader{align-items:center;display:flex;height:100%;justify-content:center;left:0;position:absolute;top:0;width:100%}.v-btn--absolute.v-btn--right,.v-btn--fixed.v-btn--right{right:16px}.v-btn--absolute.v-btn--left,.v-btn--fixed.v-btn--left{left:16px}.v-btn--absolute.v-btn--top,.v-btn--fixed.v-btn--top{top:16px}.v-btn--absolute.v-btn--bottom,.v-btn--fixed.v-btn--bottom{bottom:16px}.v-btn--absolute{position:absolute}.v-btn--fixed{position:fixed}.v-btn--block{display:flex;flex:1 0 auto;min-width:100%!important;max-width:auto}.v-btn--is-elevated{box-shadow:0 3px 1px -2px rgba(0,0,0,.2),0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12)}.v-btn--is-elevated:after{box-shadow:0 2px 4px -1px rgba(0,0,0,.2),0 4px 5px 0 rgba(0,0,0,.14),0 1px 10px 0 rgba(0,0,0,.12)}.v-btn--is-elevated:active{box-shadow:0 5px 5px -3px rgba(0,0,0,.2),0 8px 10px 1px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12)}.v-btn--is-elevated.v-btn--fab{box-shadow:0 3px 5px -1px rgba(0,0,0,.2),0 6px 10px 0 rgba(0,0,0,.14),0 1px 18px 0 rgba(0,0,0,.12)}.v-btn--is-elevated.v-btn--fab:after{box-shadow:0 5px 5px -3px rgba(0,0,0,.2),0 8px 10px 1px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12)}.v-btn--is-elevated.v-btn--fab:active{box-shadow:0 7px 8px -4px rgba(0,0,0,.2),0 12px 17px 2px rgba(0,0,0,.14),0 5px 22px 4px rgba(0,0,0,.12)}.v-btn--disabled{pointer-events:none}.v-btn--fab,.v-btn--icon{min-height:0;min-width:0;padding:0}.v-btn--fab.v-size--x-small .v-icon,.v-btn--icon.v-size--x-small .v-icon{height:18px;font-size:18px;width:18px}.v-btn--fab.v-size--default .v-icon,.v-btn--fab.v-size--small .v-icon,.v-btn--icon.v-size--default .v-icon,.v-btn--icon.v-size--small .v-icon{height:24px;font-size:24px;width:24px}.v-btn--fab.v-size--large .v-icon,.v-btn--icon.v-size--large .v-icon{height:28px;font-size:28px;width:28px}.v-btn--fab.v-size--x-large .v-icon,.v-btn--icon.v-size--x-large .v-icon{height:32px;font-size:32px;width:32px}.v-btn--icon.v-size--x-small{height:20px;width:20px}.v-btn--icon.v-size--small{height:28px;width:28px}.v-btn--icon.v-size--default{height:36px;width:36px}.v-btn--icon.v-size--large{height:44px;width:44px}.v-btn--icon.v-size--x-large{height:52px;width:52px}.v-btn--fab.v-btn--absolute,.v-btn--fab.v-btn--fixed{z-index:4}.v-btn--fab.v-size--x-small{height:32px;width:32px}.v-btn--fab.v-size--x-small.v-btn--absolute.v-btn--bottom{bottom:-16px}.v-btn--fab.v-size--x-small.v-btn--absolute.v-btn--top{top:-16px}.v-btn--fab.v-size--small{height:40px;width:40px}.v-btn--fab.v-size--small.v-btn--absolute.v-btn--bottom{bottom:-20px}.v-btn--fab.v-size--small.v-btn--absolute.v-btn--top{top:-20px}.v-btn--fab.v-size--default{height:56px;width:56px}.v-btn--fab.v-size--default.v-btn--absolute.v-btn--bottom{bottom:-28px}.v-btn--fab.v-size--default.v-btn--absolute.v-btn--top{top:-28px}.v-btn--fab.v-size--large{height:64px;width:64px}.v-btn--fab.v-size--large.v-btn--absolute.v-btn--bottom{bottom:-32px}.v-btn--fab.v-size--large.v-btn--absolute.v-btn--top{top:-32px}.v-btn--fab.v-size--x-large{height:72px;width:72px}.v-btn--fab.v-size--x-large.v-btn--absolute.v-btn--bottom{bottom:-36px}.v-btn--fab.v-size--x-large.v-btn--absolute.v-btn--top{top:-36px}.v-btn--loading{pointer-events:none;transition:none}.v-btn--loading .v-btn__content{opacity:0}.v-btn--outlined{border:thin solid currentColor}.v-btn--plain:before{display:none}.v-btn--plain:not(.v-btn--active):not(.v-btn--loading):not(:focus):not(:hover) .v-btn__content{opacity:.62}.v-btn--round{border-radius:50%}.v-btn--rounded{border-radius:28px}.v-btn--tile{border-radius:0}.theme--light.v-sheet{background-color:#fff;border-color:#fff;color:rgba(0,0,0,.87)}.theme--light.v-sheet--outlined{border:thin solid rgba(0,0,0,.12)}.theme--dark.v-sheet{background-color:#1e1e1e;border-color:#1e1e1e;color:#fff}.theme--dark.v-sheet--outlined{border:thin solid hsla(0,0%,100%,.12)}.v-sheet{border-radius:0}.v-sheet:not(.v-sheet--outlined){box-shadow:0 0 0 0 rgba(0,0,0,.2),0 0 0 0 rgba(0,0,0,.14),0 0 0 0 rgba(0,0,0,.12)}.v-sheet.v-sheet--shaped{border-radius:24px 0}@keyframes v-shake{59%{margin-left:0}60%,80%{margin-left:2px}70%,90%{margin-left:-2px}}.v-application .black{background-color:#000!important;border-color:#000!important}.v-application .black--text{color:#000!important;caret-color:#000!important}.v-application .white{background-color:#fff!important;border-color:#fff!important}.v-application .white--text{color:#fff!important;caret-color:#fff!important}.v-application .transparent{background-color:transparent!important;border-color:transparent!important}.v-application .transparent--text{color:transparent!important;caret-color:transparent!important}.v-application .red{background-color:#f44336!important;border-color:#f44336!important}.v-application .red--text{color:#f44336!important;caret-color:#f44336!important}.v-application .red.lighten-5{background-color:#ffebee!important;border-color:#ffebee!important}.v-application .red--text.text--lighten-5{color:#ffebee!important;caret-color:#ffebee!important}.v-application .red.lighten-4{background-color:#ffcdd2!important;border-color:#ffcdd2!important}.v-application .red--text.text--lighten-4{color:#ffcdd2!important;caret-color:#ffcdd2!important}.v-application .red.lighten-3{background-color:#ef9a9a!important;border-color:#ef9a9a!important}.v-application .red--text.text--lighten-3{color:#ef9a9a!important;caret-color:#ef9a9a!important}.v-application .red.lighten-2{background-color:#e57373!important;border-color:#e57373!important}.v-application .red--text.text--lighten-2{color:#e57373!important;caret-color:#e57373!important}.v-application .red.lighten-1{background-color:#ef5350!important;border-color:#ef5350!important}.v-application .red--text.text--lighten-1{color:#ef5350!important;caret-color:#ef5350!important}.v-application .red.darken-1{background-color:#e53935!important;border-color:#e53935!important}.v-application .red--text.text--darken-1{color:#e53935!important;caret-color:#e53935!important}.v-application .red.darken-2{background-color:#d32f2f!important;border-color:#d32f2f!important}.v-application .red--text.text--darken-2{color:#d32f2f!important;caret-color:#d32f2f!important}.v-application .red.darken-3{background-color:#c62828!important;border-color:#c62828!important}.v-application .red--text.text--darken-3{color:#c62828!important;caret-color:#c62828!important}.v-application .red.darken-4{background-color:#b71c1c!important;border-color:#b71c1c!important}.v-application .red--text.text--darken-4{color:#b71c1c!important;caret-color:#b71c1c!important}.v-application .red.accent-1{background-color:#ff8a80!important;border-color:#ff8a80!important}.v-application .red--text.text--accent-1{color:#ff8a80!important;caret-color:#ff8a80!important}.v-application .red.accent-2{background-color:#ff5252!important;border-color:#ff5252!important}.v-application .red--text.text--accent-2{color:#ff5252!important;caret-color:#ff5252!important}.v-application .red.accent-3{background-color:#ff1744!important;border-color:#ff1744!important}.v-application .red--text.text--accent-3{color:#ff1744!important;caret-color:#ff1744!important}.v-application .red.accent-4{background-color:#d50000!important;border-color:#d50000!important}.v-application .red--text.text--accent-4{color:#d50000!important;caret-color:#d50000!important}.v-application .pink{background-color:#e91e63!important;border-color:#e91e63!important}.v-application .pink--text{color:#e91e63!important;caret-color:#e91e63!important}.v-application .pink.lighten-5{background-color:#fce4ec!important;border-color:#fce4ec!important}.v-application .pink--text.text--lighten-5{color:#fce4ec!important;caret-color:#fce4ec!important}.v-application .pink.lighten-4{background-color:#f8bbd0!important;border-color:#f8bbd0!important}.v-application .pink--text.text--lighten-4{color:#f8bbd0!important;caret-color:#f8bbd0!important}.v-application .pink.lighten-3{background-color:#f48fb1!important;border-color:#f48fb1!important}.v-application .pink--text.text--lighten-3{color:#f48fb1!important;caret-color:#f48fb1!important}.v-application .pink.lighten-2{background-color:#f06292!important;border-color:#f06292!important}.v-application .pink--text.text--lighten-2{color:#f06292!important;caret-color:#f06292!important}.v-application .pink.lighten-1{background-color:#ec407a!important;border-color:#ec407a!important}.v-application .pink--text.text--lighten-1{color:#ec407a!important;caret-color:#ec407a!important}.v-application .pink.darken-1{background-color:#d81b60!important;border-color:#d81b60!important}.v-application .pink--text.text--darken-1{color:#d81b60!important;caret-color:#d81b60!important}.v-application .pink.darken-2{background-color:#c2185b!important;border-color:#c2185b!important}.v-application .pink--text.text--darken-2{color:#c2185b!important;caret-color:#c2185b!important}.v-application .pink.darken-3{background-color:#ad1457!important;border-color:#ad1457!important}.v-application .pink--text.text--darken-3{color:#ad1457!important;caret-color:#ad1457!important}.v-application .pink.darken-4{background-color:#880e4f!important;border-color:#880e4f!important}.v-application .pink--text.text--darken-4{color:#880e4f!important;caret-color:#880e4f!important}.v-application .pink.accent-1{background-color:#ff80ab!important;border-color:#ff80ab!important}.v-application .pink--text.text--accent-1{color:#ff80ab!important;caret-color:#ff80ab!important}.v-application .pink.accent-2{background-color:#ff4081!important;border-color:#ff4081!important}.v-application .pink--text.text--accent-2{color:#ff4081!important;caret-color:#ff4081!important}.v-application .pink.accent-3{background-color:#f50057!important;border-color:#f50057!important}.v-application .pink--text.text--accent-3{color:#f50057!important;caret-color:#f50057!important}.v-application .pink.accent-4{background-color:#c51162!important;border-color:#c51162!important}.v-application .pink--text.text--accent-4{color:#c51162!important;caret-color:#c51162!important}.v-application .purple{background-color:#9c27b0!important;border-color:#9c27b0!important}.v-application .purple--text{color:#9c27b0!important;caret-color:#9c27b0!important}.v-application .purple.lighten-5{background-color:#f3e5f5!important;border-color:#f3e5f5!important}.v-application .purple--text.text--lighten-5{color:#f3e5f5!important;caret-color:#f3e5f5!important}.v-application .purple.lighten-4{background-color:#e1bee7!important;border-color:#e1bee7!important}.v-application .purple--text.text--lighten-4{color:#e1bee7!important;caret-color:#e1bee7!important}.v-application .purple.lighten-3{background-color:#ce93d8!important;border-color:#ce93d8!important}.v-application .purple--text.text--lighten-3{color:#ce93d8!important;caret-color:#ce93d8!important}.v-application .purple.lighten-2{background-color:#ba68c8!important;border-color:#ba68c8!important}.v-application .purple--text.text--lighten-2{color:#ba68c8!important;caret-color:#ba68c8!important}.v-application .purple.lighten-1{background-color:#ab47bc!important;border-color:#ab47bc!important}.v-application .purple--text.text--lighten-1{color:#ab47bc!important;caret-color:#ab47bc!important}.v-application .purple.darken-1{background-color:#8e24aa!important;border-color:#8e24aa!important}.v-application .purple--text.text--darken-1{color:#8e24aa!important;caret-color:#8e24aa!important}.v-application .purple.darken-2{background-color:#7b1fa2!important;border-color:#7b1fa2!important}.v-application .purple--text.text--darken-2{color:#7b1fa2!important;caret-color:#7b1fa2!important}.v-application .purple.darken-3{background-color:#6a1b9a!important;border-color:#6a1b9a!important}.v-application .purple--text.text--darken-3{color:#6a1b9a!important;caret-color:#6a1b9a!important}.v-application .purple.darken-4{background-color:#4a148c!important;border-color:#4a148c!important}.v-application .purple--text.text--darken-4{color:#4a148c!important;caret-color:#4a148c!important}.v-application .purple.accent-1{background-color:#ea80fc!important;border-color:#ea80fc!important}.v-application .purple--text.text--accent-1{color:#ea80fc!important;caret-color:#ea80fc!important}.v-application .purple.accent-2{background-color:#e040fb!important;border-color:#e040fb!important}.v-application .purple--text.text--accent-2{color:#e040fb!important;caret-color:#e040fb!important}.v-application .purple.accent-3{background-color:#d500f9!important;border-color:#d500f9!important}.v-application .purple--text.text--accent-3{color:#d500f9!important;caret-color:#d500f9!important}.v-application .purple.accent-4{background-color:#a0f!important;border-color:#a0f!important}.v-application .purple--text.text--accent-4{color:#a0f!important;caret-color:#a0f!important}.v-application .deep-purple{background-color:#673ab7!important;border-color:#673ab7!important}.v-application .deep-purple--text{color:#673ab7!important;caret-color:#673ab7!important}.v-application .deep-purple.lighten-5{background-color:#ede7f6!important;border-color:#ede7f6!important}.v-application .deep-purple--text.text--lighten-5{color:#ede7f6!important;caret-color:#ede7f6!important}.v-application .deep-purple.lighten-4{background-color:#d1c4e9!important;border-color:#d1c4e9!important}.v-application .deep-purple--text.text--lighten-4{color:#d1c4e9!important;caret-color:#d1c4e9!important}.v-application .deep-purple.lighten-3{background-color:#b39ddb!important;border-color:#b39ddb!important}.v-application .deep-purple--text.text--lighten-3{color:#b39ddb!important;caret-color:#b39ddb!important}.v-application .deep-purple.lighten-2{background-color:#9575cd!important;border-color:#9575cd!important}.v-application .deep-purple--text.text--lighten-2{color:#9575cd!important;caret-color:#9575cd!important}.v-application .deep-purple.lighten-1{background-color:#7e57c2!important;border-color:#7e57c2!important}.v-application .deep-purple--text.text--lighten-1{color:#7e57c2!important;caret-color:#7e57c2!important}.v-application .deep-purple.darken-1{background-color:#5e35b1!important;border-color:#5e35b1!important}.v-application .deep-purple--text.text--darken-1{color:#5e35b1!important;caret-color:#5e35b1!important}.v-application .deep-purple.darken-2{background-color:#512da8!important;border-color:#512da8!important}.v-application .deep-purple--text.text--darken-2{color:#512da8!important;caret-color:#512da8!important}.v-application .deep-purple.darken-3{background-color:#4527a0!important;border-color:#4527a0!important}.v-application .deep-purple--text.text--darken-3{color:#4527a0!important;caret-color:#4527a0!important}.v-application .deep-purple.darken-4{background-color:#311b92!important;border-color:#311b92!important}.v-application .deep-purple--text.text--darken-4{color:#311b92!important;caret-color:#311b92!important}.v-application .deep-purple.accent-1{background-color:#b388ff!important;border-color:#b388ff!important}.v-application .deep-purple--text.text--accent-1{color:#b388ff!important;caret-color:#b388ff!important}.v-application .deep-purple.accent-2{background-color:#7c4dff!important;border-color:#7c4dff!important}.v-application .deep-purple--text.text--accent-2{color:#7c4dff!important;caret-color:#7c4dff!important}.v-application .deep-purple.accent-3{background-color:#651fff!important;border-color:#651fff!important}.v-application .deep-purple--text.text--accent-3{color:#651fff!important;caret-color:#651fff!important}.v-application .deep-purple.accent-4{background-color:#6200ea!important;border-color:#6200ea!important}.v-application .deep-purple--text.text--accent-4{color:#6200ea!important;caret-color:#6200ea!important}.v-application .indigo{background-color:#3f51b5!important;border-color:#3f51b5!important}.v-application .indigo--text{color:#3f51b5!important;caret-color:#3f51b5!important}.v-application .indigo.lighten-5{background-color:#e8eaf6!important;border-color:#e8eaf6!important}.v-application .indigo--text.text--lighten-5{color:#e8eaf6!important;caret-color:#e8eaf6!important}.v-application .indigo.lighten-4{background-color:#c5cae9!important;border-color:#c5cae9!important}.v-application .indigo--text.text--lighten-4{color:#c5cae9!important;caret-color:#c5cae9!important}.v-application .indigo.lighten-3{background-color:#9fa8da!important;border-color:#9fa8da!important}.v-application .indigo--text.text--lighten-3{color:#9fa8da!important;caret-color:#9fa8da!important}.v-application .indigo.lighten-2{background-color:#7986cb!important;border-color:#7986cb!important}.v-application .indigo--text.text--lighten-2{color:#7986cb!important;caret-color:#7986cb!important}.v-application .indigo.lighten-1{background-color:#5c6bc0!important;border-color:#5c6bc0!important}.v-application .indigo--text.text--lighten-1{color:#5c6bc0!important;caret-color:#5c6bc0!important}.v-application .indigo.darken-1{background-color:#3949ab!important;border-color:#3949ab!important}.v-application .indigo--text.text--darken-1{color:#3949ab!important;caret-color:#3949ab!important}.v-application .indigo.darken-2{background-color:#303f9f!important;border-color:#303f9f!important}.v-application .indigo--text.text--darken-2{color:#303f9f!important;caret-color:#303f9f!important}.v-application .indigo.darken-3{background-color:#283593!important;border-color:#283593!important}.v-application .indigo--text.text--darken-3{color:#283593!important;caret-color:#283593!important}.v-application .indigo.darken-4{background-color:#1a237e!important;border-color:#1a237e!important}.v-application .indigo--text.text--darken-4{color:#1a237e!important;caret-color:#1a237e!important}.v-application .indigo.accent-1{background-color:#8c9eff!important;border-color:#8c9eff!important}.v-application .indigo--text.text--accent-1{color:#8c9eff!important;caret-color:#8c9eff!important}.v-application .indigo.accent-2{background-color:#536dfe!important;border-color:#536dfe!important}.v-application .indigo--text.text--accent-2{color:#536dfe!important;caret-color:#536dfe!important}.v-application .indigo.accent-3{background-color:#3d5afe!important;border-color:#3d5afe!important}.v-application .indigo--text.text--accent-3{color:#3d5afe!important;caret-color:#3d5afe!important}.v-application .indigo.accent-4{background-color:#304ffe!important;border-color:#304ffe!important}.v-application .indigo--text.text--accent-4{color:#304ffe!important;caret-color:#304ffe!important}.v-application .blue{background-color:#2196f3!important;border-color:#2196f3!important}.v-application .blue--text{color:#2196f3!important;caret-color:#2196f3!important}.v-application .blue.lighten-5{background-color:#e3f2fd!important;border-color:#e3f2fd!important}.v-application .blue--text.text--lighten-5{color:#e3f2fd!important;caret-color:#e3f2fd!important}.v-application .blue.lighten-4{background-color:#bbdefb!important;border-color:#bbdefb!important}.v-application .blue--text.text--lighten-4{color:#bbdefb!important;caret-color:#bbdefb!important}.v-application .blue.lighten-3{background-color:#90caf9!important;border-color:#90caf9!important}.v-application .blue--text.text--lighten-3{color:#90caf9!important;caret-color:#90caf9!important}.v-application .blue.lighten-2{background-color:#64b5f6!important;border-color:#64b5f6!important}.v-application .blue--text.text--lighten-2{color:#64b5f6!important;caret-color:#64b5f6!important}.v-application .blue.lighten-1{background-color:#42a5f5!important;border-color:#42a5f5!important}.v-application .blue--text.text--lighten-1{color:#42a5f5!important;caret-color:#42a5f5!important}.v-application .blue.darken-1{background-color:#1e88e5!important;border-color:#1e88e5!important}.v-application .blue--text.text--darken-1{color:#1e88e5!important;caret-color:#1e88e5!important}.v-application .blue.darken-2{background-color:#1976d2!important;border-color:#1976d2!important}.v-application .blue--text.text--darken-2{color:#1976d2!important;caret-color:#1976d2!important}.v-application .blue.darken-3{background-color:#1565c0!important;border-color:#1565c0!important}.v-application .blue--text.text--darken-3{color:#1565c0!important;caret-color:#1565c0!important}.v-application .blue.darken-4{background-color:#0d47a1!important;border-color:#0d47a1!important}.v-application .blue--text.text--darken-4{color:#0d47a1!important;caret-color:#0d47a1!important}.v-application .blue.accent-1{background-color:#82b1ff!important;border-color:#82b1ff!important}.v-application .blue--text.text--accent-1{color:#82b1ff!important;caret-color:#82b1ff!important}.v-application .blue.accent-2{background-color:#448aff!important;border-color:#448aff!important}.v-application .blue--text.text--accent-2{color:#448aff!important;caret-color:#448aff!important}.v-application .blue.accent-3{background-color:#2979ff!important;border-color:#2979ff!important}.v-application .blue--text.text--accent-3{color:#2979ff!important;caret-color:#2979ff!important}.v-application .blue.accent-4{background-color:#2962ff!important;border-color:#2962ff!important}.v-application .blue--text.text--accent-4{color:#2962ff!important;caret-color:#2962ff!important}.v-application .light-blue{background-color:#03a9f4!important;border-color:#03a9f4!important}.v-application .light-blue--text{color:#03a9f4!important;caret-color:#03a9f4!important}.v-application .light-blue.lighten-5{background-color:#e1f5fe!important;border-color:#e1f5fe!important}.v-application .light-blue--text.text--lighten-5{color:#e1f5fe!important;caret-color:#e1f5fe!important}.v-application .light-blue.lighten-4{background-color:#b3e5fc!important;border-color:#b3e5fc!important}.v-application .light-blue--text.text--lighten-4{color:#b3e5fc!important;caret-color:#b3e5fc!important}.v-application .light-blue.lighten-3{background-color:#81d4fa!important;border-color:#81d4fa!important}.v-application .light-blue--text.text--lighten-3{color:#81d4fa!important;caret-color:#81d4fa!important}.v-application .light-blue.lighten-2{background-color:#4fc3f7!important;border-color:#4fc3f7!important}.v-application .light-blue--text.text--lighten-2{color:#4fc3f7!important;caret-color:#4fc3f7!important}.v-application .light-blue.lighten-1{background-color:#29b6f6!important;border-color:#29b6f6!important}.v-application .light-blue--text.text--lighten-1{color:#29b6f6!important;caret-color:#29b6f6!important}.v-application .light-blue.darken-1{background-color:#039be5!important;border-color:#039be5!important}.v-application .light-blue--text.text--darken-1{color:#039be5!important;caret-color:#039be5!important}.v-application .light-blue.darken-2{background-color:#0288d1!important;border-color:#0288d1!important}.v-application .light-blue--text.text--darken-2{color:#0288d1!important;caret-color:#0288d1!important}.v-application .light-blue.darken-3{background-color:#0277bd!important;border-color:#0277bd!important}.v-application .light-blue--text.text--darken-3{color:#0277bd!important;caret-color:#0277bd!important}.v-application .light-blue.darken-4{background-color:#01579b!important;border-color:#01579b!important}.v-application .light-blue--text.text--darken-4{color:#01579b!important;caret-color:#01579b!important}.v-application .light-blue.accent-1{background-color:#80d8ff!important;border-color:#80d8ff!important}.v-application .light-blue--text.text--accent-1{color:#80d8ff!important;caret-color:#80d8ff!important}.v-application .light-blue.accent-2{background-color:#40c4ff!important;border-color:#40c4ff!important}.v-application .light-blue--text.text--accent-2{color:#40c4ff!important;caret-color:#40c4ff!important}.v-application .light-blue.accent-3{background-color:#00b0ff!important;border-color:#00b0ff!important}.v-application .light-blue--text.text--accent-3{color:#00b0ff!important;caret-color:#00b0ff!important}.v-application .light-blue.accent-4{background-color:#0091ea!important;border-color:#0091ea!important}.v-application .light-blue--text.text--accent-4{color:#0091ea!important;caret-color:#0091ea!important}.v-application .cyan{background-color:#00bcd4!important;border-color:#00bcd4!important}.v-application .cyan--text{color:#00bcd4!important;caret-color:#00bcd4!important}.v-application .cyan.lighten-5{background-color:#e0f7fa!important;border-color:#e0f7fa!important}.v-application .cyan--text.text--lighten-5{color:#e0f7fa!important;caret-color:#e0f7fa!important}.v-application .cyan.lighten-4{background-color:#b2ebf2!important;border-color:#b2ebf2!important}.v-application .cyan--text.text--lighten-4{color:#b2ebf2!important;caret-color:#b2ebf2!important}.v-application .cyan.lighten-3{background-color:#80deea!important;border-color:#80deea!important}.v-application .cyan--text.text--lighten-3{color:#80deea!important;caret-color:#80deea!important}.v-application .cyan.lighten-2{background-color:#4dd0e1!important;border-color:#4dd0e1!important}.v-application .cyan--text.text--lighten-2{color:#4dd0e1!important;caret-color:#4dd0e1!important}.v-application .cyan.lighten-1{background-color:#26c6da!important;border-color:#26c6da!important}.v-application .cyan--text.text--lighten-1{color:#26c6da!important;caret-color:#26c6da!important}.v-application .cyan.darken-1{background-color:#00acc1!important;border-color:#00acc1!important}.v-application .cyan--text.text--darken-1{color:#00acc1!important;caret-color:#00acc1!important}.v-application .cyan.darken-2{background-color:#0097a7!important;border-color:#0097a7!important}.v-application .cyan--text.text--darken-2{color:#0097a7!important;caret-color:#0097a7!important}.v-application .cyan.darken-3{background-color:#00838f!important;border-color:#00838f!important}.v-application .cyan--text.text--darken-3{color:#00838f!important;caret-color:#00838f!important}.v-application .cyan.darken-4{background-color:#006064!important;border-color:#006064!important}.v-application .cyan--text.text--darken-4{color:#006064!important;caret-color:#006064!important}.v-application .cyan.accent-1{background-color:#84ffff!important;border-color:#84ffff!important}.v-application .cyan--text.text--accent-1{color:#84ffff!important;caret-color:#84ffff!important}.v-application .cyan.accent-2{background-color:#18ffff!important;border-color:#18ffff!important}.v-application .cyan--text.text--accent-2{color:#18ffff!important;caret-color:#18ffff!important}.v-application .cyan.accent-3{background-color:#00e5ff!important;border-color:#00e5ff!important}.v-application .cyan--text.text--accent-3{color:#00e5ff!important;caret-color:#00e5ff!important}.v-application .cyan.accent-4{background-color:#00b8d4!important;border-color:#00b8d4!important}.v-application .cyan--text.text--accent-4{color:#00b8d4!important;caret-color:#00b8d4!important}.v-application .teal{background-color:#009688!important;border-color:#009688!important}.v-application .teal--text{color:#009688!important;caret-color:#009688!important}.v-application .teal.lighten-5{background-color:#e0f2f1!important;border-color:#e0f2f1!important}.v-application .teal--text.text--lighten-5{color:#e0f2f1!important;caret-color:#e0f2f1!important}.v-application .teal.lighten-4{background-color:#b2dfdb!important;border-color:#b2dfdb!important}.v-application .teal--text.text--lighten-4{color:#b2dfdb!important;caret-color:#b2dfdb!important}.v-application .teal.lighten-3{background-color:#80cbc4!important;border-color:#80cbc4!important}.v-application .teal--text.text--lighten-3{color:#80cbc4!important;caret-color:#80cbc4!important}.v-application .teal.lighten-2{background-color:#4db6ac!important;border-color:#4db6ac!important}.v-application .teal--text.text--lighten-2{color:#4db6ac!important;caret-color:#4db6ac!important}.v-application .teal.lighten-1{background-color:#26a69a!important;border-color:#26a69a!important}.v-application .teal--text.text--lighten-1{color:#26a69a!important;caret-color:#26a69a!important}.v-application .teal.darken-1{background-color:#00897b!important;border-color:#00897b!important}.v-application .teal--text.text--darken-1{color:#00897b!important;caret-color:#00897b!important}.v-application .teal.darken-2{background-color:#00796b!important;border-color:#00796b!important}.v-application .teal--text.text--darken-2{color:#00796b!important;caret-color:#00796b!important}.v-application .teal.darken-3{background-color:#00695c!important;border-color:#00695c!important}.v-application .teal--text.text--darken-3{color:#00695c!important;caret-color:#00695c!important}.v-application .teal.darken-4{background-color:#004d40!important;border-color:#004d40!important}.v-application .teal--text.text--darken-4{color:#004d40!important;caret-color:#004d40!important}.v-application .teal.accent-1{background-color:#a7ffeb!important;border-color:#a7ffeb!important}.v-application .teal--text.text--accent-1{color:#a7ffeb!important;caret-color:#a7ffeb!important}.v-application .teal.accent-2{background-color:#64ffda!important;border-color:#64ffda!important}.v-application .teal--text.text--accent-2{color:#64ffda!important;caret-color:#64ffda!important}.v-application .teal.accent-3{background-color:#1de9b6!important;border-color:#1de9b6!important}.v-application .teal--text.text--accent-3{color:#1de9b6!important;caret-color:#1de9b6!important}.v-application .teal.accent-4{background-color:#00bfa5!important;border-color:#00bfa5!important}.v-application .teal--text.text--accent-4{color:#00bfa5!important;caret-color:#00bfa5!important}.v-application .green{background-color:#4caf50!important;border-color:#4caf50!important}.v-application .green--text{color:#4caf50!important;caret-color:#4caf50!important}.v-application .green.lighten-5{background-color:#e8f5e9!important;border-color:#e8f5e9!important}.v-application .green--text.text--lighten-5{color:#e8f5e9!important;caret-color:#e8f5e9!important}.v-application .green.lighten-4{background-color:#c8e6c9!important;border-color:#c8e6c9!important}.v-application .green--text.text--lighten-4{color:#c8e6c9!important;caret-color:#c8e6c9!important}.v-application .green.lighten-3{background-color:#a5d6a7!important;border-color:#a5d6a7!important}.v-application .green--text.text--lighten-3{color:#a5d6a7!important;caret-color:#a5d6a7!important}.v-application .green.lighten-2{background-color:#81c784!important;border-color:#81c784!important}.v-application .green--text.text--lighten-2{color:#81c784!important;caret-color:#81c784!important}.v-application .green.lighten-1{background-color:#66bb6a!important;border-color:#66bb6a!important}.v-application .green--text.text--lighten-1{color:#66bb6a!important;caret-color:#66bb6a!important}.v-application .green.darken-1{background-color:#43a047!important;border-color:#43a047!important}.v-application .green--text.text--darken-1{color:#43a047!important;caret-color:#43a047!important}.v-application .green.darken-2{background-color:#388e3c!important;border-color:#388e3c!important}.v-application .green--text.text--darken-2{color:#388e3c!important;caret-color:#388e3c!important}.v-application .green.darken-3{background-color:#2e7d32!important;border-color:#2e7d32!important}.v-application .green--text.text--darken-3{color:#2e7d32!important;caret-color:#2e7d32!important}.v-application .green.darken-4{background-color:#1b5e20!important;border-color:#1b5e20!important}.v-application .green--text.text--darken-4{color:#1b5e20!important;caret-color:#1b5e20!important}.v-application .green.accent-1{background-color:#b9f6ca!important;border-color:#b9f6ca!important}.v-application .green--text.text--accent-1{color:#b9f6ca!important;caret-color:#b9f6ca!important}.v-application .green.accent-2{background-color:#69f0ae!important;border-color:#69f0ae!important}.v-application .green--text.text--accent-2{color:#69f0ae!important;caret-color:#69f0ae!important}.v-application .green.accent-3{background-color:#00e676!important;border-color:#00e676!important}.v-application .green--text.text--accent-3{color:#00e676!important;caret-color:#00e676!important}.v-application .green.accent-4{background-color:#00c853!important;border-color:#00c853!important}.v-application .green--text.text--accent-4{color:#00c853!important;caret-color:#00c853!important}.v-application .light-green{background-color:#8bc34a!important;border-color:#8bc34a!important}.v-application .light-green--text{color:#8bc34a!important;caret-color:#8bc34a!important}.v-application .light-green.lighten-5{background-color:#f1f8e9!important;border-color:#f1f8e9!important}.v-application .light-green--text.text--lighten-5{color:#f1f8e9!important;caret-color:#f1f8e9!important}.v-application .light-green.lighten-4{background-color:#dcedc8!important;border-color:#dcedc8!important}.v-application .light-green--text.text--lighten-4{color:#dcedc8!important;caret-color:#dcedc8!important}.v-application .light-green.lighten-3{background-color:#c5e1a5!important;border-color:#c5e1a5!important}.v-application .light-green--text.text--lighten-3{color:#c5e1a5!important;caret-color:#c5e1a5!important}.v-application .light-green.lighten-2{background-color:#aed581!important;border-color:#aed581!important}.v-application .light-green--text.text--lighten-2{color:#aed581!important;caret-color:#aed581!important}.v-application .light-green.lighten-1{background-color:#9ccc65!important;border-color:#9ccc65!important}.v-application .light-green--text.text--lighten-1{color:#9ccc65!important;caret-color:#9ccc65!important}.v-application .light-green.darken-1{background-color:#7cb342!important;border-color:#7cb342!important}.v-application .light-green--text.text--darken-1{color:#7cb342!important;caret-color:#7cb342!important}.v-application .light-green.darken-2{background-color:#689f38!important;border-color:#689f38!important}.v-application .light-green--text.text--darken-2{color:#689f38!important;caret-color:#689f38!important}.v-application .light-green.darken-3{background-color:#558b2f!important;border-color:#558b2f!important}.v-application .light-green--text.text--darken-3{color:#558b2f!important;caret-color:#558b2f!important}.v-application .light-green.darken-4{background-color:#33691e!important;border-color:#33691e!important}.v-application .light-green--text.text--darken-4{color:#33691e!important;caret-color:#33691e!important}.v-application .light-green.accent-1{background-color:#ccff90!important;border-color:#ccff90!important}.v-application .light-green--text.text--accent-1{color:#ccff90!important;caret-color:#ccff90!important}.v-application .light-green.accent-2{background-color:#b2ff59!important;border-color:#b2ff59!important}.v-application .light-green--text.text--accent-2{color:#b2ff59!important;caret-color:#b2ff59!important}.v-application .light-green.accent-3{background-color:#76ff03!important;border-color:#76ff03!important}.v-application .light-green--text.text--accent-3{color:#76ff03!important;caret-color:#76ff03!important}.v-application .light-green.accent-4{background-color:#64dd17!important;border-color:#64dd17!important}.v-application .light-green--text.text--accent-4{color:#64dd17!important;caret-color:#64dd17!important}.v-application .lime{background-color:#cddc39!important;border-color:#cddc39!important}.v-application .lime--text{color:#cddc39!important;caret-color:#cddc39!important}.v-application .lime.lighten-5{background-color:#f9fbe7!important;border-color:#f9fbe7!important}.v-application .lime--text.text--lighten-5{color:#f9fbe7!important;caret-color:#f9fbe7!important}.v-application .lime.lighten-4{background-color:#f0f4c3!important;border-color:#f0f4c3!important}.v-application .lime--text.text--lighten-4{color:#f0f4c3!important;caret-color:#f0f4c3!important}.v-application .lime.lighten-3{background-color:#e6ee9c!important;border-color:#e6ee9c!important}.v-application .lime--text.text--lighten-3{color:#e6ee9c!important;caret-color:#e6ee9c!important}.v-application .lime.lighten-2{background-color:#dce775!important;border-color:#dce775!important}.v-application .lime--text.text--lighten-2{color:#dce775!important;caret-color:#dce775!important}.v-application .lime.lighten-1{background-color:#d4e157!important;border-color:#d4e157!important}.v-application .lime--text.text--lighten-1{color:#d4e157!important;caret-color:#d4e157!important}.v-application .lime.darken-1{background-color:#c0ca33!important;border-color:#c0ca33!important}.v-application .lime--text.text--darken-1{color:#c0ca33!important;caret-color:#c0ca33!important}.v-application .lime.darken-2{background-color:#afb42b!important;border-color:#afb42b!important}.v-application .lime--text.text--darken-2{color:#afb42b!important;caret-color:#afb42b!important}.v-application .lime.darken-3{background-color:#9e9d24!important;border-color:#9e9d24!important}.v-application .lime--text.text--darken-3{color:#9e9d24!important;caret-color:#9e9d24!important}.v-application .lime.darken-4{background-color:#827717!important;border-color:#827717!important}.v-application .lime--text.text--darken-4{color:#827717!important;caret-color:#827717!important}.v-application .lime.accent-1{background-color:#f4ff81!important;border-color:#f4ff81!important}.v-application .lime--text.text--accent-1{color:#f4ff81!important;caret-color:#f4ff81!important}.v-application .lime.accent-2{background-color:#eeff41!important;border-color:#eeff41!important}.v-application .lime--text.text--accent-2{color:#eeff41!important;caret-color:#eeff41!important}.v-application .lime.accent-3{background-color:#c6ff00!important;border-color:#c6ff00!important}.v-application .lime--text.text--accent-3{color:#c6ff00!important;caret-color:#c6ff00!important}.v-application .lime.accent-4{background-color:#aeea00!important;border-color:#aeea00!important}.v-application .lime--text.text--accent-4{color:#aeea00!important;caret-color:#aeea00!important}.v-application .yellow{background-color:#ffeb3b!important;border-color:#ffeb3b!important}.v-application .yellow--text{color:#ffeb3b!important;caret-color:#ffeb3b!important}.v-application .yellow.lighten-5{background-color:#fffde7!important;border-color:#fffde7!important}.v-application .yellow--text.text--lighten-5{color:#fffde7!important;caret-color:#fffde7!important}.v-application .yellow.lighten-4{background-color:#fff9c4!important;border-color:#fff9c4!important}.v-application .yellow--text.text--lighten-4{color:#fff9c4!important;caret-color:#fff9c4!important}.v-application .yellow.lighten-3{background-color:#fff59d!important;border-color:#fff59d!important}.v-application .yellow--text.text--lighten-3{color:#fff59d!important;caret-color:#fff59d!important}.v-application .yellow.lighten-2{background-color:#fff176!important;border-color:#fff176!important}.v-application .yellow--text.text--lighten-2{color:#fff176!important;caret-color:#fff176!important}.v-application .yellow.lighten-1{background-color:#ffee58!important;border-color:#ffee58!important}.v-application .yellow--text.text--lighten-1{color:#ffee58!important;caret-color:#ffee58!important}.v-application .yellow.darken-1{background-color:#fdd835!important;border-color:#fdd835!important}.v-application .yellow--text.text--darken-1{color:#fdd835!important;caret-color:#fdd835!important}.v-application .yellow.darken-2{background-color:#fbc02d!important;border-color:#fbc02d!important}.v-application .yellow--text.text--darken-2{color:#fbc02d!important;caret-color:#fbc02d!important}.v-application .yellow.darken-3{background-color:#f9a825!important;border-color:#f9a825!important}.v-application .yellow--text.text--darken-3{color:#f9a825!important;caret-color:#f9a825!important}.v-application .yellow.darken-4{background-color:#f57f17!important;border-color:#f57f17!important}.v-application .yellow--text.text--darken-4{color:#f57f17!important;caret-color:#f57f17!important}.v-application .yellow.accent-1{background-color:#ffff8d!important;border-color:#ffff8d!important}.v-application .yellow--text.text--accent-1{color:#ffff8d!important;caret-color:#ffff8d!important}.v-application .yellow.accent-2{background-color:#ff0!important;border-color:#ff0!important}.v-application .yellow--text.text--accent-2{color:#ff0!important;caret-color:#ff0!important}.v-application .yellow.accent-3{background-color:#ffea00!important;border-color:#ffea00!important}.v-application .yellow--text.text--accent-3{color:#ffea00!important;caret-color:#ffea00!important}.v-application .yellow.accent-4{background-color:#ffd600!important;border-color:#ffd600!important}.v-application .yellow--text.text--accent-4{color:#ffd600!important;caret-color:#ffd600!important}.v-application .amber{background-color:#ffc107!important;border-color:#ffc107!important}.v-application .amber--text{color:#ffc107!important;caret-color:#ffc107!important}.v-application .amber.lighten-5{background-color:#fff8e1!important;border-color:#fff8e1!important}.v-application .amber--text.text--lighten-5{color:#fff8e1!important;caret-color:#fff8e1!important}.v-application .amber.lighten-4{background-color:#ffecb3!important;border-color:#ffecb3!important}.v-application .amber--text.text--lighten-4{color:#ffecb3!important;caret-color:#ffecb3!important}.v-application .amber.lighten-3{background-color:#ffe082!important;border-color:#ffe082!important}.v-application .amber--text.text--lighten-3{color:#ffe082!important;caret-color:#ffe082!important}.v-application .amber.lighten-2{background-color:#ffd54f!important;border-color:#ffd54f!important}.v-application .amber--text.text--lighten-2{color:#ffd54f!important;caret-color:#ffd54f!important}.v-application .amber.lighten-1{background-color:#ffca28!important;border-color:#ffca28!important}.v-application .amber--text.text--lighten-1{color:#ffca28!important;caret-color:#ffca28!important}.v-application .amber.darken-1{background-color:#ffb300!important;border-color:#ffb300!important}.v-application .amber--text.text--darken-1{color:#ffb300!important;caret-color:#ffb300!important}.v-application .amber.darken-2{background-color:#ffa000!important;border-color:#ffa000!important}.v-application .amber--text.text--darken-2{color:#ffa000!important;caret-color:#ffa000!important}.v-application .amber.darken-3{background-color:#ff8f00!important;border-color:#ff8f00!important}.v-application .amber--text.text--darken-3{color:#ff8f00!important;caret-color:#ff8f00!important}.v-application .amber.darken-4{background-color:#ff6f00!important;border-color:#ff6f00!important}.v-application .amber--text.text--darken-4{color:#ff6f00!important;caret-color:#ff6f00!important}.v-application .amber.accent-1{background-color:#ffe57f!important;border-color:#ffe57f!important}.v-application .amber--text.text--accent-1{color:#ffe57f!important;caret-color:#ffe57f!important}.v-application .amber.accent-2{background-color:#ffd740!important;border-color:#ffd740!important}.v-application .amber--text.text--accent-2{color:#ffd740!important;caret-color:#ffd740!important}.v-application .amber.accent-3{background-color:#ffc400!important;border-color:#ffc400!important}.v-application .amber--text.text--accent-3{color:#ffc400!important;caret-color:#ffc400!important}.v-application .amber.accent-4{background-color:#ffab00!important;border-color:#ffab00!important}.v-application .amber--text.text--accent-4{color:#ffab00!important;caret-color:#ffab00!important}.v-application .orange{background-color:#ff9800!important;border-color:#ff9800!important}.v-application .orange--text{color:#ff9800!important;caret-color:#ff9800!important}.v-application .orange.lighten-5{background-color:#fff3e0!important;border-color:#fff3e0!important}.v-application .orange--text.text--lighten-5{color:#fff3e0!important;caret-color:#fff3e0!important}.v-application .orange.lighten-4{background-color:#ffe0b2!important;border-color:#ffe0b2!important}.v-application .orange--text.text--lighten-4{color:#ffe0b2!important;caret-color:#ffe0b2!important}.v-application .orange.lighten-3{background-color:#ffcc80!important;border-color:#ffcc80!important}.v-application .orange--text.text--lighten-3{color:#ffcc80!important;caret-color:#ffcc80!important}.v-application .orange.lighten-2{background-color:#ffb74d!important;border-color:#ffb74d!important}.v-application .orange--text.text--lighten-2{color:#ffb74d!important;caret-color:#ffb74d!important}.v-application .orange.lighten-1{background-color:#ffa726!important;border-color:#ffa726!important}.v-application .orange--text.text--lighten-1{color:#ffa726!important;caret-color:#ffa726!important}.v-application .orange.darken-1{background-color:#fb8c00!important;border-color:#fb8c00!important}.v-application .orange--text.text--darken-1{color:#fb8c00!important;caret-color:#fb8c00!important}.v-application .orange.darken-2{background-color:#f57c00!important;border-color:#f57c00!important}.v-application .orange--text.text--darken-2{color:#f57c00!important;caret-color:#f57c00!important}.v-application .orange.darken-3{background-color:#ef6c00!important;border-color:#ef6c00!important}.v-application .orange--text.text--darken-3{color:#ef6c00!important;caret-color:#ef6c00!important}.v-application .orange.darken-4{background-color:#e65100!important;border-color:#e65100!important}.v-application .orange--text.text--darken-4{color:#e65100!important;caret-color:#e65100!important}.v-application .orange.accent-1{background-color:#ffd180!important;border-color:#ffd180!important}.v-application .orange--text.text--accent-1{color:#ffd180!important;caret-color:#ffd180!important}.v-application .orange.accent-2{background-color:#ffab40!important;border-color:#ffab40!important}.v-application .orange--text.text--accent-2{color:#ffab40!important;caret-color:#ffab40!important}.v-application .orange.accent-3{background-color:#ff9100!important;border-color:#ff9100!important}.v-application .orange--text.text--accent-3{color:#ff9100!important;caret-color:#ff9100!important}.v-application .orange.accent-4{background-color:#ff6d00!important;border-color:#ff6d00!important}.v-application .orange--text.text--accent-4{color:#ff6d00!important;caret-color:#ff6d00!important}.v-application .deep-orange{background-color:#ff5722!important;border-color:#ff5722!important}.v-application .deep-orange--text{color:#ff5722!important;caret-color:#ff5722!important}.v-application .deep-orange.lighten-5{background-color:#fbe9e7!important;border-color:#fbe9e7!important}.v-application .deep-orange--text.text--lighten-5{color:#fbe9e7!important;caret-color:#fbe9e7!important}.v-application .deep-orange.lighten-4{background-color:#ffccbc!important;border-color:#ffccbc!important}.v-application .deep-orange--text.text--lighten-4{color:#ffccbc!important;caret-color:#ffccbc!important}.v-application .deep-orange.lighten-3{background-color:#ffab91!important;border-color:#ffab91!important}.v-application .deep-orange--text.text--lighten-3{color:#ffab91!important;caret-color:#ffab91!important}.v-application .deep-orange.lighten-2{background-color:#ff8a65!important;border-color:#ff8a65!important}.v-application .deep-orange--text.text--lighten-2{color:#ff8a65!important;caret-color:#ff8a65!important}.v-application .deep-orange.lighten-1{background-color:#ff7043!important;border-color:#ff7043!important}.v-application .deep-orange--text.text--lighten-1{color:#ff7043!important;caret-color:#ff7043!important}.v-application .deep-orange.darken-1{background-color:#f4511e!important;border-color:#f4511e!important}.v-application .deep-orange--text.text--darken-1{color:#f4511e!important;caret-color:#f4511e!important}.v-application .deep-orange.darken-2{background-color:#e64a19!important;border-color:#e64a19!important}.v-application .deep-orange--text.text--darken-2{color:#e64a19!important;caret-color:#e64a19!important}.v-application .deep-orange.darken-3{background-color:#d84315!important;border-color:#d84315!important}.v-application .deep-orange--text.text--darken-3{color:#d84315!important;caret-color:#d84315!important}.v-application .deep-orange.darken-4{background-color:#bf360c!important;border-color:#bf360c!important}.v-application .deep-orange--text.text--darken-4{color:#bf360c!important;caret-color:#bf360c!important}.v-application .deep-orange.accent-1{background-color:#ff9e80!important;border-color:#ff9e80!important}.v-application .deep-orange--text.text--accent-1{color:#ff9e80!important;caret-color:#ff9e80!important}.v-application .deep-orange.accent-2{background-color:#ff6e40!important;border-color:#ff6e40!important}.v-application .deep-orange--text.text--accent-2{color:#ff6e40!important;caret-color:#ff6e40!important}.v-application .deep-orange.accent-3{background-color:#ff3d00!important;border-color:#ff3d00!important}.v-application .deep-orange--text.text--accent-3{color:#ff3d00!important;caret-color:#ff3d00!important}.v-application .deep-orange.accent-4{background-color:#dd2c00!important;border-color:#dd2c00!important}.v-application .deep-orange--text.text--accent-4{color:#dd2c00!important;caret-color:#dd2c00!important}.v-application .brown{background-color:#795548!important;border-color:#795548!important}.v-application .brown--text{color:#795548!important;caret-color:#795548!important}.v-application .brown.lighten-5{background-color:#efebe9!important;border-color:#efebe9!important}.v-application .brown--text.text--lighten-5{color:#efebe9!important;caret-color:#efebe9!important}.v-application .brown.lighten-4{background-color:#d7ccc8!important;border-color:#d7ccc8!important}.v-application .brown--text.text--lighten-4{color:#d7ccc8!important;caret-color:#d7ccc8!important}.v-application .brown.lighten-3{background-color:#bcaaa4!important;border-color:#bcaaa4!important}.v-application .brown--text.text--lighten-3{color:#bcaaa4!important;caret-color:#bcaaa4!important}.v-application .brown.lighten-2{background-color:#a1887f!important;border-color:#a1887f!important}.v-application .brown--text.text--lighten-2{color:#a1887f!important;caret-color:#a1887f!important}.v-application .brown.lighten-1{background-color:#8d6e63!important;border-color:#8d6e63!important}.v-application .brown--text.text--lighten-1{color:#8d6e63!important;caret-color:#8d6e63!important}.v-application .brown.darken-1{background-color:#6d4c41!important;border-color:#6d4c41!important}.v-application .brown--text.text--darken-1{color:#6d4c41!important;caret-color:#6d4c41!important}.v-application .brown.darken-2{background-color:#5d4037!important;border-color:#5d4037!important}.v-application .brown--text.text--darken-2{color:#5d4037!important;caret-color:#5d4037!important}.v-application .brown.darken-3{background-color:#4e342e!important;border-color:#4e342e!important}.v-application .brown--text.text--darken-3{color:#4e342e!important;caret-color:#4e342e!important}.v-application .brown.darken-4{background-color:#3e2723!important;border-color:#3e2723!important}.v-application .brown--text.text--darken-4{color:#3e2723!important;caret-color:#3e2723!important}.v-application .blue-grey{background-color:#607d8b!important;border-color:#607d8b!important}.v-application .blue-grey--text{color:#607d8b!important;caret-color:#607d8b!important}.v-application .blue-grey.lighten-5{background-color:#eceff1!important;border-color:#eceff1!important}.v-application .blue-grey--text.text--lighten-5{color:#eceff1!important;caret-color:#eceff1!important}.v-application .blue-grey.lighten-4{background-color:#cfd8dc!important;border-color:#cfd8dc!important}.v-application .blue-grey--text.text--lighten-4{color:#cfd8dc!important;caret-color:#cfd8dc!important}.v-application .blue-grey.lighten-3{background-color:#b0bec5!important;border-color:#b0bec5!important}.v-application .blue-grey--text.text--lighten-3{color:#b0bec5!important;caret-color:#b0bec5!important}.v-application .blue-grey.lighten-2{background-color:#90a4ae!important;border-color:#90a4ae!important}.v-application .blue-grey--text.text--lighten-2{color:#90a4ae!important;caret-color:#90a4ae!important}.v-application .blue-grey.lighten-1{background-color:#78909c!important;border-color:#78909c!important}.v-application .blue-grey--text.text--lighten-1{color:#78909c!important;caret-color:#78909c!important}.v-application .blue-grey.darken-1{background-color:#546e7a!important;border-color:#546e7a!important}.v-application .blue-grey--text.text--darken-1{color:#546e7a!important;caret-color:#546e7a!important}.v-application .blue-grey.darken-2{background-color:#455a64!important;border-color:#455a64!important}.v-application .blue-grey--text.text--darken-2{color:#455a64!important;caret-color:#455a64!important}.v-application .blue-grey.darken-3{background-color:#37474f!important;border-color:#37474f!important}.v-application .blue-grey--text.text--darken-3{color:#37474f!important;caret-color:#37474f!important}.v-application .blue-grey.darken-4{background-color:#263238!important;border-color:#263238!important}.v-application .blue-grey--text.text--darken-4{color:#263238!important;caret-color:#263238!important}.v-application .grey{background-color:#9e9e9e!important;border-color:#9e9e9e!important}.v-application .grey--text{color:#9e9e9e!important;caret-color:#9e9e9e!important}.v-application .grey.lighten-5{background-color:#fafafa!important;border-color:#fafafa!important}.v-application .grey--text.text--lighten-5{color:#fafafa!important;caret-color:#fafafa!important}.v-application .grey.lighten-4{background-color:#f5f5f5!important;border-color:#f5f5f5!important}.v-application .grey--text.text--lighten-4{color:#f5f5f5!important;caret-color:#f5f5f5!important}.v-application .grey.lighten-3{background-color:#eee!important;border-color:#eee!important}.v-application .grey--text.text--lighten-3{color:#eee!important;caret-color:#eee!important}.v-application .grey.lighten-2{background-color:#e0e0e0!important;border-color:#e0e0e0!important}.v-application .grey--text.text--lighten-2{color:#e0e0e0!important;caret-color:#e0e0e0!important}.v-application .grey.lighten-1{background-color:#bdbdbd!important;border-color:#bdbdbd!important}.v-application .grey--text.text--lighten-1{color:#bdbdbd!important;caret-color:#bdbdbd!important}.v-application .grey.darken-1{background-color:#757575!important;border-color:#757575!important}.v-application .grey--text.text--darken-1{color:#757575!important;caret-color:#757575!important}.v-application .grey.darken-2{background-color:#616161!important;border-color:#616161!important}.v-application .grey--text.text--darken-2{color:#616161!important;caret-color:#616161!important}.v-application .grey.darken-3{background-color:#424242!important;border-color:#424242!important}.v-application .grey--text.text--darken-3{color:#424242!important;caret-color:#424242!important}.v-application .grey.darken-4{background-color:#212121!important;border-color:#212121!important}.v-application .grey--text.text--darken-4{color:#212121!important;caret-color:#212121!important}.v-application .shades.black{background-color:#000!important;border-color:#000!important}.v-application .shades--text.text--black{color:#000!important;caret-color:#000!important}.v-application .shades.white{background-color:#fff!important;border-color:#fff!important}.v-application .shades--text.text--white{color:#fff!important;caret-color:#fff!important}.v-application .shades.transparent{background-color:transparent!important;border-color:transparent!important}.v-application .shades--text.text--transparent{color:transparent!important;caret-color:transparent!important}/*!
+ * ress.css • v2.0.4
+ * MIT License
+ * github.com/filipelinhares/ress
+ */html{box-sizing:border-box;overflow-y:scroll;-webkit-text-size-adjust:100%;word-break:normal;-moz-tab-size:4;-o-tab-size:4;tab-size:4}*,:after,:before{background-repeat:no-repeat;box-sizing:inherit}:after,:before{text-decoration:inherit;vertical-align:inherit}*{padding:0;margin:0}hr{overflow:visible;height:0}details,main{display:block}summary{display:list-item}small{font-size:80%}[hidden]{display:none}abbr[title]{border-bottom:none;text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}a{background-color:transparent}a:active,a:hover{outline-width:0}code,kbd,pre,samp{font-family:monospace,monospace}pre{font-size:1em}b,strong{font-weight:bolder}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}input{border-radius:0}[disabled]{cursor:default}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}textarea{overflow:auto;resize:vertical}button,input,optgroup,select,textarea{font:inherit}optgroup{font-weight:700}button{overflow:visible}button,select{text-transform:none}[role=button],[type=button],[type=reset],[type=submit],button{cursor:pointer;color:inherit}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button:-moz-focusring{outline:1px dotted ButtonText}[type=reset],[type=submit],button,html [type=button]{-webkit-appearance:button}button,input,select,textarea{background-color:transparent;border-style:none}select{-moz-appearance:none;-webkit-appearance:none}select::-ms-expand{display:none}select::-ms-value{color:currentColor}legend{border:0;color:inherit;display:table;white-space:normal;max-width:100%}::-webkit-file-upload-button{-webkit-appearance:button;color:inherit;font:inherit}img{border-style:none}progress{vertical-align:baseline}@media screen{[hidden~=screen]{display:inherit}[hidden~=screen]:not(:active):not(:focus):not(:target){position:absolute!important;clip:rect(0 0 0 0)!important}}[aria-busy=true]{cursor:progress}[aria-controls]{cursor:pointer}[aria-disabled=true]{cursor:default}.v-application .elevation-24{box-shadow:0 11px 15px -7px rgba(0,0,0,.2),0 24px 38px 3px rgba(0,0,0,.14),0 9px 46px 8px rgba(0,0,0,.12)!important}.v-application .elevation-23{box-shadow:0 11px 14px -7px rgba(0,0,0,.2),0 23px 36px 3px rgba(0,0,0,.14),0 9px 44px 8px rgba(0,0,0,.12)!important}.v-application .elevation-22{box-shadow:0 10px 14px -6px rgba(0,0,0,.2),0 22px 35px 3px rgba(0,0,0,.14),0 8px 42px 7px rgba(0,0,0,.12)!important}.v-application .elevation-21{box-shadow:0 10px 13px -6px rgba(0,0,0,.2),0 21px 33px 3px rgba(0,0,0,.14),0 8px 40px 7px rgba(0,0,0,.12)!important}.v-application .elevation-20{box-shadow:0 10px 13px -6px rgba(0,0,0,.2),0 20px 31px 3px rgba(0,0,0,.14),0 8px 38px 7px rgba(0,0,0,.12)!important}.v-application .elevation-19{box-shadow:0 9px 12px -6px rgba(0,0,0,.2),0 19px 29px 2px rgba(0,0,0,.14),0 7px 36px 6px rgba(0,0,0,.12)!important}.v-application .elevation-18{box-shadow:0 9px 11px -5px rgba(0,0,0,.2),0 18px 28px 2px rgba(0,0,0,.14),0 7px 34px 6px rgba(0,0,0,.12)!important}.v-application .elevation-17{box-shadow:0 8px 11px -5px rgba(0,0,0,.2),0 17px 26px 2px rgba(0,0,0,.14),0 6px 32px 5px rgba(0,0,0,.12)!important}.v-application .elevation-16{box-shadow:0 8px 10px -5px rgba(0,0,0,.2),0 16px 24px 2px rgba(0,0,0,.14),0 6px 30px 5px rgba(0,0,0,.12)!important}.v-application .elevation-15{box-shadow:0 8px 9px -5px rgba(0,0,0,.2),0 15px 22px 2px rgba(0,0,0,.14),0 6px 28px 5px rgba(0,0,0,.12)!important}.v-application .elevation-14{box-shadow:0 7px 9px -4px rgba(0,0,0,.2),0 14px 21px 2px rgba(0,0,0,.14),0 5px 26px 4px rgba(0,0,0,.12)!important}.v-application .elevation-13{box-shadow:0 7px 8px -4px rgba(0,0,0,.2),0 13px 19px 2px rgba(0,0,0,.14),0 5px 24px 4px rgba(0,0,0,.12)!important}.v-application .elevation-12{box-shadow:0 7px 8px -4px rgba(0,0,0,.2),0 12px 17px 2px rgba(0,0,0,.14),0 5px 22px 4px rgba(0,0,0,.12)!important}.v-application .elevation-11{box-shadow:0 6px 7px -4px rgba(0,0,0,.2),0 11px 15px 1px rgba(0,0,0,.14),0 4px 20px 3px rgba(0,0,0,.12)!important}.v-application .elevation-10{box-shadow:0 6px 6px -3px rgba(0,0,0,.2),0 10px 14px 1px rgba(0,0,0,.14),0 4px 18px 3px rgba(0,0,0,.12)!important}.v-application .elevation-9{box-shadow:0 5px 6px -3px rgba(0,0,0,.2),0 9px 12px 1px rgba(0,0,0,.14),0 3px 16px 2px rgba(0,0,0,.12)!important}.v-application .elevation-8{box-shadow:0 5px 5px -3px rgba(0,0,0,.2),0 8px 10px 1px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12)!important}.v-application .elevation-7{box-shadow:0 4px 5px -2px rgba(0,0,0,.2),0 7px 10px 1px rgba(0,0,0,.14),0 2px 16px 1px rgba(0,0,0,.12)!important}.v-application .elevation-6{box-shadow:0 3px 5px -1px rgba(0,0,0,.2),0 6px 10px 0 rgba(0,0,0,.14),0 1px 18px 0 rgba(0,0,0,.12)!important}.v-application .elevation-5{box-shadow:0 3px 5px -1px rgba(0,0,0,.2),0 5px 8px 0 rgba(0,0,0,.14),0 1px 14px 0 rgba(0,0,0,.12)!important}.v-application .elevation-4{box-shadow:0 2px 4px -1px rgba(0,0,0,.2),0 4px 5px 0 rgba(0,0,0,.14),0 1px 10px 0 rgba(0,0,0,.12)!important}.v-application .elevation-3{box-shadow:0 3px 3px -2px rgba(0,0,0,.2),0 3px 4px 0 rgba(0,0,0,.14),0 1px 8px 0 rgba(0,0,0,.12)!important}.v-application .elevation-2{box-shadow:0 3px 1px -2px rgba(0,0,0,.2),0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12)!important}.v-application .elevation-1{box-shadow:0 2px 1px -1px rgba(0,0,0,.2),0 1px 1px 0 rgba(0,0,0,.14),0 1px 3px 0 rgba(0,0,0,.12)!important}.v-application .elevation-0{box-shadow:0 0 0 0 rgba(0,0,0,.2),0 0 0 0 rgba(0,0,0,.14),0 0 0 0 rgba(0,0,0,.12)!important}.v-application .carousel-transition-enter{transform:translate(100%)}.v-application .carousel-transition-leave,.v-application .carousel-transition-leave-to{position:absolute;top:0;transform:translate(-100%)}.carousel-reverse-transition-enter{transform:translate(-100%)}.carousel-reverse-transition-leave,.carousel-reverse-transition-leave-to{position:absolute;top:0;transform:translate(100%)}.dialog-transition-enter,.dialog-transition-leave-to{transform:scale(.5);opacity:0}.dialog-transition-enter-to,.dialog-transition-leave{opacity:1}.dialog-bottom-transition-enter,.dialog-bottom-transition-leave-to{transform:translateY(100%)}.dialog-top-transition-enter,.dialog-top-transition-leave-to{transform:translateY(-100%)}.picker-reverse-transition-enter-active,.picker-reverse-transition-leave-active,.picker-transition-enter-active,.picker-transition-leave-active{transition:.3s cubic-bezier(0,0,.2,1)}.picker-reverse-transition-enter,.picker-reverse-transition-leave-to,.picker-transition-enter,.picker-transition-leave-to{opacity:0}.picker-reverse-transition-leave,.picker-reverse-transition-leave-active,.picker-reverse-transition-leave-to,.picker-transition-leave,.picker-transition-leave-active,.picker-transition-leave-to{position:absolute!important}.picker-transition-enter{transform:translateY(100%)}.picker-reverse-transition-enter,.picker-transition-leave-to{transform:translateY(-100%)}.picker-reverse-transition-leave-to{transform:translateY(100%)}.picker-title-transition-enter-to,.picker-title-transition-leave{transform:translate(0)}.picker-title-transition-enter{transform:translate(-100%)}.picker-title-transition-leave-to{opacity:0;transform:translate(100%)}.picker-title-transition-leave,.picker-title-transition-leave-active,.picker-title-transition-leave-to{position:absolute!important}.tab-transition-enter{transform:translate(100%)}.tab-transition-leave,.tab-transition-leave-active{position:absolute;top:0}.tab-transition-leave-to{position:absolute}.tab-reverse-transition-enter,.tab-transition-leave-to{transform:translate(-100%)}.tab-reverse-transition-leave,.tab-reverse-transition-leave-to{top:0;position:absolute;transform:translate(100%)}.expand-transition-enter-active,.expand-transition-leave-active{transition:.3s cubic-bezier(.25,.8,.5,1)!important}.expand-transition-move{transition:transform .6s}.expand-x-transition-enter-active,.expand-x-transition-leave-active{transition:.3s cubic-bezier(.25,.8,.5,1)!important}.expand-x-transition-move{transition:transform .6s}.scale-transition-enter-active,.scale-transition-leave-active{transition:.3s cubic-bezier(.25,.8,.5,1)!important}.scale-transition-move{transition:transform .6s}.scale-transition-enter,.scale-transition-leave,.scale-transition-leave-to{opacity:0;transform:scale(0)}.scale-rotate-transition-enter-active,.scale-rotate-transition-leave-active{transition:.3s cubic-bezier(.25,.8,.5,1)!important}.scale-rotate-transition-move{transition:transform .6s}.scale-rotate-transition-enter,.scale-rotate-transition-leave,.scale-rotate-transition-leave-to{opacity:0;transform:scale(0) rotate(-45deg)}.scale-rotate-reverse-transition-enter-active,.scale-rotate-reverse-transition-leave-active{transition:.3s cubic-bezier(.25,.8,.5,1)!important}.scale-rotate-reverse-transition-move{transition:transform .6s}.scale-rotate-reverse-transition-enter,.scale-rotate-reverse-transition-leave,.scale-rotate-reverse-transition-leave-to{opacity:0;transform:scale(0) rotate(45deg)}.message-transition-enter-active,.message-transition-leave-active{transition:.3s cubic-bezier(.25,.8,.5,1)!important}.message-transition-move{transition:transform .6s}.message-transition-enter,.message-transition-leave-to{opacity:0;transform:translateY(-15px)}.message-transition-leave,.message-transition-leave-active{position:absolute}.slide-y-transition-enter-active,.slide-y-transition-leave-active{transition:.3s cubic-bezier(.25,.8,.5,1)!important}.slide-y-transition-move{transition:transform .6s}.slide-y-transition-enter,.slide-y-transition-leave-to{opacity:0;transform:translateY(-15px)}.slide-y-reverse-transition-enter-active,.slide-y-reverse-transition-leave-active{transition:.3s cubic-bezier(.25,.8,.5,1)!important}.slide-y-reverse-transition-move{transition:transform .6s}.slide-y-reverse-transition-enter,.slide-y-reverse-transition-leave-to{opacity:0;transform:translateY(15px)}.scroll-y-transition-enter-active,.scroll-y-transition-leave-active{transition:.3s cubic-bezier(.25,.8,.5,1)!important}.scroll-y-transition-move{transition:transform .6s}.scroll-y-transition-enter,.scroll-y-transition-leave-to{opacity:0}.scroll-y-transition-enter{transform:translateY(-15px)}.scroll-y-transition-leave-to{transform:translateY(15px)}.scroll-y-reverse-transition-enter-active,.scroll-y-reverse-transition-leave-active{transition:.3s cubic-bezier(.25,.8,.5,1)!important}.scroll-y-reverse-transition-move{transition:transform .6s}.scroll-y-reverse-transition-enter,.scroll-y-reverse-transition-leave-to{opacity:0}.scroll-y-reverse-transition-enter{transform:translateY(15px)}.scroll-y-reverse-transition-leave-to{transform:translateY(-15px)}.scroll-x-transition-enter-active,.scroll-x-transition-leave-active{transition:.3s cubic-bezier(.25,.8,.5,1)!important}.scroll-x-transition-move{transition:transform .6s}.scroll-x-transition-enter,.scroll-x-transition-leave-to{opacity:0}.scroll-x-transition-enter{transform:translateX(-15px)}.scroll-x-transition-leave-to{transform:translateX(15px)}.scroll-x-reverse-transition-enter-active,.scroll-x-reverse-transition-leave-active{transition:.3s cubic-bezier(.25,.8,.5,1)!important}.scroll-x-reverse-transition-move{transition:transform .6s}.scroll-x-reverse-transition-enter,.scroll-x-reverse-transition-leave-to{opacity:0}.scroll-x-reverse-transition-enter{transform:translateX(15px)}.scroll-x-reverse-transition-leave-to{transform:translateX(-15px)}.slide-x-transition-enter-active,.slide-x-transition-leave-active{transition:.3s cubic-bezier(.25,.8,.5,1)!important}.slide-x-transition-move{transition:transform .6s}.slide-x-transition-enter,.slide-x-transition-leave-to{opacity:0;transform:translateX(-15px)}.slide-x-reverse-transition-enter-active,.slide-x-reverse-transition-leave-active{transition:.3s cubic-bezier(.25,.8,.5,1)!important}.slide-x-reverse-transition-move{transition:transform .6s}.slide-x-reverse-transition-enter,.slide-x-reverse-transition-leave-to{opacity:0;transform:translateX(15px)}.fade-transition-enter-active,.fade-transition-leave-active{transition:.3s cubic-bezier(.25,.8,.5,1)!important}.fade-transition-move{transition:transform .6s}.fade-transition-enter,.fade-transition-leave-to{opacity:0!important}.fab-transition-enter-active,.fab-transition-leave-active{transition:.3s cubic-bezier(.25,.8,.5,1)!important}.fab-transition-move{transition:transform .6s}.fab-transition-enter,.fab-transition-leave-to{transform:scale(0) rotate(-45deg)}.v-application .blockquote{padding:16px 0 16px 24px;font-size:18px;font-weight:300}.v-application code,.v-application kbd{border-radius:3px;font-size:85%;font-weight:400}.v-application code{padding:.2em .4em}.v-application kbd{padding:.2em .4rem;box-shadow:0 3px 1px -2px rgba(0,0,0,.2),0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12)}.theme--light.v-application code{background-color:rgba(0,0,0,.05);color:currentColor}.theme--light.v-application kbd{background:#212529;color:#fff}.theme--dark.v-application code{background-color:hsla(0,0%,100%,.1);color:currentColor}.theme--dark.v-application kbd{background:#212529;color:#fff}html{font-size:16px;overflow-x:hidden;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;-webkit-tap-highlight-color:rgba(0,0,0,0)}html.overflow-y-hidden{overflow-y:hidden!important}.v-application{font-family:Roboto,sans-serif;line-height:1.5}.v-application ::-ms-clear,.v-application ::-ms-reveal{display:none}@supports(-webkit-touch-callout:none){body{cursor:pointer}}.v-application .theme--light.heading{color:rgba(0,0,0,.87)}.v-application .theme--dark.heading{color:#fff}.v-application ol,.v-application ul{padding-left:24px}.v-application .display-4{font-size:6rem!important;line-height:6rem;letter-spacing:-.015625em!important}.v-application .display-3,.v-application .display-4{font-weight:300;font-family:Roboto,sans-serif!important}.v-application .display-3{font-size:3.75rem!important;line-height:3.75rem;letter-spacing:-.0083333333em!important}.v-application .display-2{font-size:3rem!important;line-height:3.125rem;letter-spacing:normal!important}.v-application .display-1,.v-application .display-2{font-weight:400;font-family:Roboto,sans-serif!important}.v-application .display-1{font-size:2.125rem!important;line-height:2.5rem;letter-spacing:.0073529412em!important}.v-application .headline{font-size:1.5rem!important;font-weight:400;letter-spacing:normal!important}.v-application .headline,.v-application .title{line-height:2rem;font-family:Roboto,sans-serif!important}.v-application .title{font-size:1.25rem!important;font-weight:500;letter-spacing:.0125em!important}.v-application .subtitle-2{font-size:.875rem!important;font-weight:500;letter-spacing:.0071428571em!important;line-height:1.375rem;font-family:Roboto,sans-serif!important}.v-application .subtitle-1{font-size:1rem!important;letter-spacing:.009375em!important;line-height:1.75rem}.v-application .body-2,.v-application .subtitle-1{font-weight:400;font-family:Roboto,sans-serif!important}.v-application .body-2{font-size:.875rem!important;letter-spacing:.0178571429em!important;line-height:1.25rem}.v-application .body-1{font-size:1rem!important;letter-spacing:.03125em!important;line-height:1.5rem}.v-application .body-1,.v-application .caption{font-weight:400;font-family:Roboto,sans-serif!important}.v-application .caption{font-size:.75rem!important;letter-spacing:.0333333333em!important;line-height:1.25rem}.v-application .overline{font-size:.75rem!important;font-weight:500;letter-spacing:.1666666667em!important;line-height:2rem;text-transform:uppercase;font-family:Roboto,sans-serif!important}.v-application p{margin-bottom:16px}@media only print{.v-application .hidden-print-only{display:none!important}}@media only screen{.v-application .hidden-screen-only{display:none!important}}@media only screen and (max-width:599px){.v-application .hidden-xs-only{display:none!important}}@media only screen and (min-width:600px)and (max-width:959px){.v-application .hidden-sm-only{display:none!important}}@media only screen and (max-width:959px){.v-application .hidden-sm-and-down{display:none!important}}@media only screen and (min-width:600px){.v-application .hidden-sm-and-up{display:none!important}}@media only screen and (min-width:960px)and (max-width:1263px){.v-application .hidden-md-only{display:none!important}}@media only screen and (max-width:1263px){.v-application .hidden-md-and-down{display:none!important}}@media only screen and (min-width:960px){.v-application .hidden-md-and-up{display:none!important}}@media only screen and (min-width:1264px)and (max-width:1903px){.v-application .hidden-lg-only{display:none!important}}@media only screen and (max-width:1903px){.v-application .hidden-lg-and-down{display:none!important}}@media only screen and (min-width:1264px){.v-application .hidden-lg-and-up{display:none!important}}@media only screen and (min-width:1904px){.v-application .hidden-xl-only{display:none!important}}.d-sr-only,.d-sr-only-focusable:not(:focus){border:0!important;clip:rect(0,0,0,0)!important;height:1px!important;margin:-1px!important;overflow:hidden!important;padding:0!important;position:absolute!important;white-space:nowrap!important;width:1px!important}.v-application .font-weight-thin{font-weight:100!important}.v-application .font-weight-light{font-weight:300!important}.v-application .font-weight-regular{font-weight:400!important}.v-application .font-weight-medium{font-weight:500!important}.v-application .font-weight-bold{font-weight:700!important}.v-application .font-weight-black{font-weight:900!important}.v-application .font-italic{font-style:italic!important}.v-application .transition-fast-out-slow-in{transition:.3s cubic-bezier(.4,0,.2,1)!important}.v-application .transition-linear-out-slow-in{transition:.3s cubic-bezier(0,0,.2,1)!important}.v-application .transition-fast-out-linear-in{transition:.3s cubic-bezier(.4,0,1,1)!important}.v-application .transition-ease-in-out{transition:.3s cubic-bezier(.4,0,.6,1)!important}.v-application .transition-fast-in-fast-out{transition:.3s cubic-bezier(.25,.8,.25,1)!important}.v-application .transition-swing{transition:.3s cubic-bezier(.25,.8,.5,1)!important}.v-application .overflow-auto{overflow:auto!important}.v-application .overflow-hidden{overflow:hidden!important}.v-application .overflow-visible{overflow:visible!important}.v-application .overflow-x-auto{overflow-x:auto!important}.v-application .overflow-x-hidden{overflow-x:hidden!important}.v-application .overflow-y-auto{overflow-y:auto!important}.v-application .overflow-y-hidden{overflow-y:hidden!important}.v-application .d-none{display:none!important}.v-application .d-inline{display:inline!important}.v-application .d-inline-block{display:inline-block!important}.v-application .d-block{display:block!important}.v-application .d-table{display:table!important}.v-application .d-table-row{display:table-row!important}.v-application .d-table-cell{display:table-cell!important}.v-application .d-flex{display:flex!important}.v-application .d-inline-flex{display:inline-flex!important}.v-application .float-none{float:none!important}.v-application .float-left{float:left!important}.v-application .float-right{float:right!important}.v-application--is-rtl .float-end{float:left!important}.v-application--is-ltr .float-end,.v-application--is-rtl .float-start{float:right!important}.v-application--is-ltr .float-start{float:left!important}.v-application .flex-fill{flex:1 1 auto!important}.v-application .flex-row{flex-direction:row!important}.v-application .flex-column{flex-direction:column!important}.v-application .flex-row-reverse{flex-direction:row-reverse!important}.v-application .flex-column-reverse{flex-direction:column-reverse!important}.v-application .flex-grow-0{flex-grow:0!important}.v-application .flex-grow-1{flex-grow:1!important}.v-application .flex-shrink-0{flex-shrink:0!important}.v-application .flex-shrink-1{flex-shrink:1!important}.v-application .flex-wrap{flex-wrap:wrap!important}.v-application .flex-nowrap{flex-wrap:nowrap!important}.v-application .flex-wrap-reverse{flex-wrap:wrap-reverse!important}.v-application .justify-start{justify-content:flex-start!important}.v-application .justify-end{justify-content:flex-end!important}.v-application .justify-center{justify-content:center!important}.v-application .justify-space-between{justify-content:space-between!important}.v-application .justify-space-around{justify-content:space-around!important}.v-application .align-start{align-items:flex-start!important}.v-application .align-end{align-items:flex-end!important}.v-application .align-center{align-items:center!important}.v-application .align-baseline{align-items:baseline!important}.v-application .align-stretch{align-items:stretch!important}.v-application .align-content-start{align-content:flex-start!important}.v-application .align-content-end{align-content:flex-end!important}.v-application .align-content-center{align-content:center!important}.v-application .align-content-space-between{align-content:space-between!important}.v-application .align-content-space-around{align-content:space-around!important}.v-application .align-content-stretch{align-content:stretch!important}.v-application .align-self-auto{align-self:auto!important}.v-application .align-self-start{align-self:flex-start!important}.v-application .align-self-end{align-self:flex-end!important}.v-application .align-self-center{align-self:center!important}.v-application .align-self-baseline{align-self:baseline!important}.v-application .align-self-stretch{align-self:stretch!important}.v-application .order-first{order:-1!important}.v-application .order-0{order:0!important}.v-application .order-1{order:1!important}.v-application .order-2{order:2!important}.v-application .order-3{order:3!important}.v-application .order-4{order:4!important}.v-application .order-5{order:5!important}.v-application .order-6{order:6!important}.v-application .order-7{order:7!important}.v-application .order-8{order:8!important}.v-application .order-9{order:9!important}.v-application .order-10{order:10!important}.v-application .order-11{order:11!important}.v-application .order-12{order:12!important}.v-application .order-last{order:13!important}.v-application .ma-0{margin:0!important}.v-application .ma-1{margin:4px!important}.v-application .ma-2{margin:8px!important}.v-application .ma-3{margin:12px!important}.v-application .ma-4{margin:16px!important}.v-application .ma-5{margin:20px!important}.v-application .ma-6{margin:24px!important}.v-application .ma-7{margin:28px!important}.v-application .ma-8{margin:32px!important}.v-application .ma-9{margin:36px!important}.v-application .ma-10{margin:40px!important}.v-application .ma-11{margin:44px!important}.v-application .ma-12{margin:48px!important}.v-application .ma-13{margin:52px!important}.v-application .ma-14{margin:56px!important}.v-application .ma-15{margin:60px!important}.v-application .ma-16{margin:64px!important}.v-application .ma-auto{margin:auto!important}.v-application .mx-0{margin-right:0!important;margin-left:0!important}.v-application .mx-1{margin-right:4px!important;margin-left:4px!important}.v-application .mx-2{margin-right:8px!important;margin-left:8px!important}.v-application .mx-3{margin-right:12px!important;margin-left:12px!important}.v-application .mx-4{margin-right:16px!important;margin-left:16px!important}.v-application .mx-5{margin-right:20px!important;margin-left:20px!important}.v-application .mx-6{margin-right:24px!important;margin-left:24px!important}.v-application .mx-7{margin-right:28px!important;margin-left:28px!important}.v-application .mx-8{margin-right:32px!important;margin-left:32px!important}.v-application .mx-9{margin-right:36px!important;margin-left:36px!important}.v-application .mx-10{margin-right:40px!important;margin-left:40px!important}.v-application .mx-11{margin-right:44px!important;margin-left:44px!important}.v-application .mx-12{margin-right:48px!important;margin-left:48px!important}.v-application .mx-13{margin-right:52px!important;margin-left:52px!important}.v-application .mx-14{margin-right:56px!important;margin-left:56px!important}.v-application .mx-15{margin-right:60px!important;margin-left:60px!important}.v-application .mx-16{margin-right:64px!important;margin-left:64px!important}.v-application .mx-auto{margin-right:auto!important;margin-left:auto!important}.v-application .my-0{margin-top:0!important;margin-bottom:0!important}.v-application .my-1{margin-top:4px!important;margin-bottom:4px!important}.v-application .my-2{margin-top:8px!important;margin-bottom:8px!important}.v-application .my-3{margin-top:12px!important;margin-bottom:12px!important}.v-application .my-4{margin-top:16px!important;margin-bottom:16px!important}.v-application .my-5{margin-top:20px!important;margin-bottom:20px!important}.v-application .my-6{margin-top:24px!important;margin-bottom:24px!important}.v-application .my-7{margin-top:28px!important;margin-bottom:28px!important}.v-application .my-8{margin-top:32px!important;margin-bottom:32px!important}.v-application .my-9{margin-top:36px!important;margin-bottom:36px!important}.v-application .my-10{margin-top:40px!important;margin-bottom:40px!important}.v-application .my-11{margin-top:44px!important;margin-bottom:44px!important}.v-application .my-12{margin-top:48px!important;margin-bottom:48px!important}.v-application .my-13{margin-top:52px!important;margin-bottom:52px!important}.v-application .my-14{margin-top:56px!important;margin-bottom:56px!important}.v-application .my-15{margin-top:60px!important;margin-bottom:60px!important}.v-application .my-16{margin-top:64px!important;margin-bottom:64px!important}.v-application .my-auto{margin-top:auto!important;margin-bottom:auto!important}.v-application .mt-0{margin-top:0!important}.v-application .mt-1{margin-top:4px!important}.v-application .mt-2{margin-top:8px!important}.v-application .mt-3{margin-top:12px!important}.v-application .mt-4{margin-top:16px!important}.v-application .mt-5{margin-top:20px!important}.v-application .mt-6{margin-top:24px!important}.v-application .mt-7{margin-top:28px!important}.v-application .mt-8{margin-top:32px!important}.v-application .mt-9{margin-top:36px!important}.v-application .mt-10{margin-top:40px!important}.v-application .mt-11{margin-top:44px!important}.v-application .mt-12{margin-top:48px!important}.v-application .mt-13{margin-top:52px!important}.v-application .mt-14{margin-top:56px!important}.v-application .mt-15{margin-top:60px!important}.v-application .mt-16{margin-top:64px!important}.v-application .mt-auto{margin-top:auto!important}.v-application .mr-0{margin-right:0!important}.v-application .mr-1{margin-right:4px!important}.v-application .mr-2{margin-right:8px!important}.v-application .mr-3{margin-right:12px!important}.v-application .mr-4{margin-right:16px!important}.v-application .mr-5{margin-right:20px!important}.v-application .mr-6{margin-right:24px!important}.v-application .mr-7{margin-right:28px!important}.v-application .mr-8{margin-right:32px!important}.v-application .mr-9{margin-right:36px!important}.v-application .mr-10{margin-right:40px!important}.v-application .mr-11{margin-right:44px!important}.v-application .mr-12{margin-right:48px!important}.v-application .mr-13{margin-right:52px!important}.v-application .mr-14{margin-right:56px!important}.v-application .mr-15{margin-right:60px!important}.v-application .mr-16{margin-right:64px!important}.v-application .mr-auto{margin-right:auto!important}.v-application .mb-0{margin-bottom:0!important}.v-application .mb-1{margin-bottom:4px!important}.v-application .mb-2{margin-bottom:8px!important}.v-application .mb-3{margin-bottom:12px!important}.v-application .mb-4{margin-bottom:16px!important}.v-application .mb-5{margin-bottom:20px!important}.v-application .mb-6{margin-bottom:24px!important}.v-application .mb-7{margin-bottom:28px!important}.v-application .mb-8{margin-bottom:32px!important}.v-application .mb-9{margin-bottom:36px!important}.v-application .mb-10{margin-bottom:40px!important}.v-application .mb-11{margin-bottom:44px!important}.v-application .mb-12{margin-bottom:48px!important}.v-application .mb-13{margin-bottom:52px!important}.v-application .mb-14{margin-bottom:56px!important}.v-application .mb-15{margin-bottom:60px!important}.v-application .mb-16{margin-bottom:64px!important}.v-application .mb-auto{margin-bottom:auto!important}.v-application .ml-0{margin-left:0!important}.v-application .ml-1{margin-left:4px!important}.v-application .ml-2{margin-left:8px!important}.v-application .ml-3{margin-left:12px!important}.v-application .ml-4{margin-left:16px!important}.v-application .ml-5{margin-left:20px!important}.v-application .ml-6{margin-left:24px!important}.v-application .ml-7{margin-left:28px!important}.v-application .ml-8{margin-left:32px!important}.v-application .ml-9{margin-left:36px!important}.v-application .ml-10{margin-left:40px!important}.v-application .ml-11{margin-left:44px!important}.v-application .ml-12{margin-left:48px!important}.v-application .ml-13{margin-left:52px!important}.v-application .ml-14{margin-left:56px!important}.v-application .ml-15{margin-left:60px!important}.v-application .ml-16{margin-left:64px!important}.v-application .ml-auto{margin-left:auto!important}.v-application--is-ltr .ms-0{margin-left:0!important}.v-application--is-rtl .ms-0{margin-right:0!important}.v-application--is-ltr .ms-1{margin-left:4px!important}.v-application--is-rtl .ms-1{margin-right:4px!important}.v-application--is-ltr .ms-2{margin-left:8px!important}.v-application--is-rtl .ms-2{margin-right:8px!important}.v-application--is-ltr .ms-3{margin-left:12px!important}.v-application--is-rtl .ms-3{margin-right:12px!important}.v-application--is-ltr .ms-4{margin-left:16px!important}.v-application--is-rtl .ms-4{margin-right:16px!important}.v-application--is-ltr .ms-5{margin-left:20px!important}.v-application--is-rtl .ms-5{margin-right:20px!important}.v-application--is-ltr .ms-6{margin-left:24px!important}.v-application--is-rtl .ms-6{margin-right:24px!important}.v-application--is-ltr .ms-7{margin-left:28px!important}.v-application--is-rtl .ms-7{margin-right:28px!important}.v-application--is-ltr .ms-8{margin-left:32px!important}.v-application--is-rtl .ms-8{margin-right:32px!important}.v-application--is-ltr .ms-9{margin-left:36px!important}.v-application--is-rtl .ms-9{margin-right:36px!important}.v-application--is-ltr .ms-10{margin-left:40px!important}.v-application--is-rtl .ms-10{margin-right:40px!important}.v-application--is-ltr .ms-11{margin-left:44px!important}.v-application--is-rtl .ms-11{margin-right:44px!important}.v-application--is-ltr .ms-12{margin-left:48px!important}.v-application--is-rtl .ms-12{margin-right:48px!important}.v-application--is-ltr .ms-13{margin-left:52px!important}.v-application--is-rtl .ms-13{margin-right:52px!important}.v-application--is-ltr .ms-14{margin-left:56px!important}.v-application--is-rtl .ms-14{margin-right:56px!important}.v-application--is-ltr .ms-15{margin-left:60px!important}.v-application--is-rtl .ms-15{margin-right:60px!important}.v-application--is-ltr .ms-16{margin-left:64px!important}.v-application--is-rtl .ms-16{margin-right:64px!important}.v-application--is-ltr .ms-auto{margin-left:auto!important}.v-application--is-rtl .ms-auto{margin-right:auto!important}.v-application--is-ltr .me-0{margin-right:0!important}.v-application--is-rtl .me-0{margin-left:0!important}.v-application--is-ltr .me-1{margin-right:4px!important}.v-application--is-rtl .me-1{margin-left:4px!important}.v-application--is-ltr .me-2{margin-right:8px!important}.v-application--is-rtl .me-2{margin-left:8px!important}.v-application--is-ltr .me-3{margin-right:12px!important}.v-application--is-rtl .me-3{margin-left:12px!important}.v-application--is-ltr .me-4{margin-right:16px!important}.v-application--is-rtl .me-4{margin-left:16px!important}.v-application--is-ltr .me-5{margin-right:20px!important}.v-application--is-rtl .me-5{margin-left:20px!important}.v-application--is-ltr .me-6{margin-right:24px!important}.v-application--is-rtl .me-6{margin-left:24px!important}.v-application--is-ltr .me-7{margin-right:28px!important}.v-application--is-rtl .me-7{margin-left:28px!important}.v-application--is-ltr .me-8{margin-right:32px!important}.v-application--is-rtl .me-8{margin-left:32px!important}.v-application--is-ltr .me-9{margin-right:36px!important}.v-application--is-rtl .me-9{margin-left:36px!important}.v-application--is-ltr .me-10{margin-right:40px!important}.v-application--is-rtl .me-10{margin-left:40px!important}.v-application--is-ltr .me-11{margin-right:44px!important}.v-application--is-rtl .me-11{margin-left:44px!important}.v-application--is-ltr .me-12{margin-right:48px!important}.v-application--is-rtl .me-12{margin-left:48px!important}.v-application--is-ltr .me-13{margin-right:52px!important}.v-application--is-rtl .me-13{margin-left:52px!important}.v-application--is-ltr .me-14{margin-right:56px!important}.v-application--is-rtl .me-14{margin-left:56px!important}.v-application--is-ltr .me-15{margin-right:60px!important}.v-application--is-rtl .me-15{margin-left:60px!important}.v-application--is-ltr .me-16{margin-right:64px!important}.v-application--is-rtl .me-16{margin-left:64px!important}.v-application--is-ltr .me-auto{margin-right:auto!important}.v-application--is-rtl .me-auto{margin-left:auto!important}.v-application .ma-n1{margin:-4px!important}.v-application .ma-n2{margin:-8px!important}.v-application .ma-n3{margin:-12px!important}.v-application .ma-n4{margin:-16px!important}.v-application .ma-n5{margin:-20px!important}.v-application .ma-n6{margin:-24px!important}.v-application .ma-n7{margin:-28px!important}.v-application .ma-n8{margin:-32px!important}.v-application .ma-n9{margin:-36px!important}.v-application .ma-n10{margin:-40px!important}.v-application .ma-n11{margin:-44px!important}.v-application .ma-n12{margin:-48px!important}.v-application .ma-n13{margin:-52px!important}.v-application .ma-n14{margin:-56px!important}.v-application .ma-n15{margin:-60px!important}.v-application .ma-n16{margin:-64px!important}.v-application .mx-n1{margin-right:-4px!important;margin-left:-4px!important}.v-application .mx-n2{margin-right:-8px!important;margin-left:-8px!important}.v-application .mx-n3{margin-right:-12px!important;margin-left:-12px!important}.v-application .mx-n4{margin-right:-16px!important;margin-left:-16px!important}.v-application .mx-n5{margin-right:-20px!important;margin-left:-20px!important}.v-application .mx-n6{margin-right:-24px!important;margin-left:-24px!important}.v-application .mx-n7{margin-right:-28px!important;margin-left:-28px!important}.v-application .mx-n8{margin-right:-32px!important;margin-left:-32px!important}.v-application .mx-n9{margin-right:-36px!important;margin-left:-36px!important}.v-application .mx-n10{margin-right:-40px!important;margin-left:-40px!important}.v-application .mx-n11{margin-right:-44px!important;margin-left:-44px!important}.v-application .mx-n12{margin-right:-48px!important;margin-left:-48px!important}.v-application .mx-n13{margin-right:-52px!important;margin-left:-52px!important}.v-application .mx-n14{margin-right:-56px!important;margin-left:-56px!important}.v-application .mx-n15{margin-right:-60px!important;margin-left:-60px!important}.v-application .mx-n16{margin-right:-64px!important;margin-left:-64px!important}.v-application .my-n1{margin-top:-4px!important;margin-bottom:-4px!important}.v-application .my-n2{margin-top:-8px!important;margin-bottom:-8px!important}.v-application .my-n3{margin-top:-12px!important;margin-bottom:-12px!important}.v-application .my-n4{margin-top:-16px!important;margin-bottom:-16px!important}.v-application .my-n5{margin-top:-20px!important;margin-bottom:-20px!important}.v-application .my-n6{margin-top:-24px!important;margin-bottom:-24px!important}.v-application .my-n7{margin-top:-28px!important;margin-bottom:-28px!important}.v-application .my-n8{margin-top:-32px!important;margin-bottom:-32px!important}.v-application .my-n9{margin-top:-36px!important;margin-bottom:-36px!important}.v-application .my-n10{margin-top:-40px!important;margin-bottom:-40px!important}.v-application .my-n11{margin-top:-44px!important;margin-bottom:-44px!important}.v-application .my-n12{margin-top:-48px!important;margin-bottom:-48px!important}.v-application .my-n13{margin-top:-52px!important;margin-bottom:-52px!important}.v-application .my-n14{margin-top:-56px!important;margin-bottom:-56px!important}.v-application .my-n15{margin-top:-60px!important;margin-bottom:-60px!important}.v-application .my-n16{margin-top:-64px!important;margin-bottom:-64px!important}.v-application .mt-n1{margin-top:-4px!important}.v-application .mt-n2{margin-top:-8px!important}.v-application .mt-n3{margin-top:-12px!important}.v-application .mt-n4{margin-top:-16px!important}.v-application .mt-n5{margin-top:-20px!important}.v-application .mt-n6{margin-top:-24px!important}.v-application .mt-n7{margin-top:-28px!important}.v-application .mt-n8{margin-top:-32px!important}.v-application .mt-n9{margin-top:-36px!important}.v-application .mt-n10{margin-top:-40px!important}.v-application .mt-n11{margin-top:-44px!important}.v-application .mt-n12{margin-top:-48px!important}.v-application .mt-n13{margin-top:-52px!important}.v-application .mt-n14{margin-top:-56px!important}.v-application .mt-n15{margin-top:-60px!important}.v-application .mt-n16{margin-top:-64px!important}.v-application .mr-n1{margin-right:-4px!important}.v-application .mr-n2{margin-right:-8px!important}.v-application .mr-n3{margin-right:-12px!important}.v-application .mr-n4{margin-right:-16px!important}.v-application .mr-n5{margin-right:-20px!important}.v-application .mr-n6{margin-right:-24px!important}.v-application .mr-n7{margin-right:-28px!important}.v-application .mr-n8{margin-right:-32px!important}.v-application .mr-n9{margin-right:-36px!important}.v-application .mr-n10{margin-right:-40px!important}.v-application .mr-n11{margin-right:-44px!important}.v-application .mr-n12{margin-right:-48px!important}.v-application .mr-n13{margin-right:-52px!important}.v-application .mr-n14{margin-right:-56px!important}.v-application .mr-n15{margin-right:-60px!important}.v-application .mr-n16{margin-right:-64px!important}.v-application .mb-n1{margin-bottom:-4px!important}.v-application .mb-n2{margin-bottom:-8px!important}.v-application .mb-n3{margin-bottom:-12px!important}.v-application .mb-n4{margin-bottom:-16px!important}.v-application .mb-n5{margin-bottom:-20px!important}.v-application .mb-n6{margin-bottom:-24px!important}.v-application .mb-n7{margin-bottom:-28px!important}.v-application .mb-n8{margin-bottom:-32px!important}.v-application .mb-n9{margin-bottom:-36px!important}.v-application .mb-n10{margin-bottom:-40px!important}.v-application .mb-n11{margin-bottom:-44px!important}.v-application .mb-n12{margin-bottom:-48px!important}.v-application .mb-n13{margin-bottom:-52px!important}.v-application .mb-n14{margin-bottom:-56px!important}.v-application .mb-n15{margin-bottom:-60px!important}.v-application .mb-n16{margin-bottom:-64px!important}.v-application .ml-n1{margin-left:-4px!important}.v-application .ml-n2{margin-left:-8px!important}.v-application .ml-n3{margin-left:-12px!important}.v-application .ml-n4{margin-left:-16px!important}.v-application .ml-n5{margin-left:-20px!important}.v-application .ml-n6{margin-left:-24px!important}.v-application .ml-n7{margin-left:-28px!important}.v-application .ml-n8{margin-left:-32px!important}.v-application .ml-n9{margin-left:-36px!important}.v-application .ml-n10{margin-left:-40px!important}.v-application .ml-n11{margin-left:-44px!important}.v-application .ml-n12{margin-left:-48px!important}.v-application .ml-n13{margin-left:-52px!important}.v-application .ml-n14{margin-left:-56px!important}.v-application .ml-n15{margin-left:-60px!important}.v-application .ml-n16{margin-left:-64px!important}.v-application--is-ltr .ms-n1{margin-left:-4px!important}.v-application--is-rtl .ms-n1{margin-right:-4px!important}.v-application--is-ltr .ms-n2{margin-left:-8px!important}.v-application--is-rtl .ms-n2{margin-right:-8px!important}.v-application--is-ltr .ms-n3{margin-left:-12px!important}.v-application--is-rtl .ms-n3{margin-right:-12px!important}.v-application--is-ltr .ms-n4{margin-left:-16px!important}.v-application--is-rtl .ms-n4{margin-right:-16px!important}.v-application--is-ltr .ms-n5{margin-left:-20px!important}.v-application--is-rtl .ms-n5{margin-right:-20px!important}.v-application--is-ltr .ms-n6{margin-left:-24px!important}.v-application--is-rtl .ms-n6{margin-right:-24px!important}.v-application--is-ltr .ms-n7{margin-left:-28px!important}.v-application--is-rtl .ms-n7{margin-right:-28px!important}.v-application--is-ltr .ms-n8{margin-left:-32px!important}.v-application--is-rtl .ms-n8{margin-right:-32px!important}.v-application--is-ltr .ms-n9{margin-left:-36px!important}.v-application--is-rtl .ms-n9{margin-right:-36px!important}.v-application--is-ltr .ms-n10{margin-left:-40px!important}.v-application--is-rtl .ms-n10{margin-right:-40px!important}.v-application--is-ltr .ms-n11{margin-left:-44px!important}.v-application--is-rtl .ms-n11{margin-right:-44px!important}.v-application--is-ltr .ms-n12{margin-left:-48px!important}.v-application--is-rtl .ms-n12{margin-right:-48px!important}.v-application--is-ltr .ms-n13{margin-left:-52px!important}.v-application--is-rtl .ms-n13{margin-right:-52px!important}.v-application--is-ltr .ms-n14{margin-left:-56px!important}.v-application--is-rtl .ms-n14{margin-right:-56px!important}.v-application--is-ltr .ms-n15{margin-left:-60px!important}.v-application--is-rtl .ms-n15{margin-right:-60px!important}.v-application--is-ltr .ms-n16{margin-left:-64px!important}.v-application--is-rtl .ms-n16{margin-right:-64px!important}.v-application--is-ltr .me-n1{margin-right:-4px!important}.v-application--is-rtl .me-n1{margin-left:-4px!important}.v-application--is-ltr .me-n2{margin-right:-8px!important}.v-application--is-rtl .me-n2{margin-left:-8px!important}.v-application--is-ltr .me-n3{margin-right:-12px!important}.v-application--is-rtl .me-n3{margin-left:-12px!important}.v-application--is-ltr .me-n4{margin-right:-16px!important}.v-application--is-rtl .me-n4{margin-left:-16px!important}.v-application--is-ltr .me-n5{margin-right:-20px!important}.v-application--is-rtl .me-n5{margin-left:-20px!important}.v-application--is-ltr .me-n6{margin-right:-24px!important}.v-application--is-rtl .me-n6{margin-left:-24px!important}.v-application--is-ltr .me-n7{margin-right:-28px!important}.v-application--is-rtl .me-n7{margin-left:-28px!important}.v-application--is-ltr .me-n8{margin-right:-32px!important}.v-application--is-rtl .me-n8{margin-left:-32px!important}.v-application--is-ltr .me-n9{margin-right:-36px!important}.v-application--is-rtl .me-n9{margin-left:-36px!important}.v-application--is-ltr .me-n10{margin-right:-40px!important}.v-application--is-rtl .me-n10{margin-left:-40px!important}.v-application--is-ltr .me-n11{margin-right:-44px!important}.v-application--is-rtl .me-n11{margin-left:-44px!important}.v-application--is-ltr .me-n12{margin-right:-48px!important}.v-application--is-rtl .me-n12{margin-left:-48px!important}.v-application--is-ltr .me-n13{margin-right:-52px!important}.v-application--is-rtl .me-n13{margin-left:-52px!important}.v-application--is-ltr .me-n14{margin-right:-56px!important}.v-application--is-rtl .me-n14{margin-left:-56px!important}.v-application--is-ltr .me-n15{margin-right:-60px!important}.v-application--is-rtl .me-n15{margin-left:-60px!important}.v-application--is-ltr .me-n16{margin-right:-64px!important}.v-application--is-rtl .me-n16{margin-left:-64px!important}.v-application .pa-0{padding:0!important}.v-application .pa-1{padding:4px!important}.v-application .pa-2{padding:8px!important}.v-application .pa-3{padding:12px!important}.v-application .pa-4{padding:16px!important}.v-application .pa-5{padding:20px!important}.v-application .pa-6{padding:24px!important}.v-application .pa-7{padding:28px!important}.v-application .pa-8{padding:32px!important}.v-application .pa-9{padding:36px!important}.v-application .pa-10{padding:40px!important}.v-application .pa-11{padding:44px!important}.v-application .pa-12{padding:48px!important}.v-application .pa-13{padding:52px!important}.v-application .pa-14{padding:56px!important}.v-application .pa-15{padding:60px!important}.v-application .pa-16{padding:64px!important}.v-application .px-0{padding-right:0!important;padding-left:0!important}.v-application .px-1{padding-right:4px!important;padding-left:4px!important}.v-application .px-2{padding-right:8px!important;padding-left:8px!important}.v-application .px-3{padding-right:12px!important;padding-left:12px!important}.v-application .px-4{padding-right:16px!important;padding-left:16px!important}.v-application .px-5{padding-right:20px!important;padding-left:20px!important}.v-application .px-6{padding-right:24px!important;padding-left:24px!important}.v-application .px-7{padding-right:28px!important;padding-left:28px!important}.v-application .px-8{padding-right:32px!important;padding-left:32px!important}.v-application .px-9{padding-right:36px!important;padding-left:36px!important}.v-application .px-10{padding-right:40px!important;padding-left:40px!important}.v-application .px-11{padding-right:44px!important;padding-left:44px!important}.v-application .px-12{padding-right:48px!important;padding-left:48px!important}.v-application .px-13{padding-right:52px!important;padding-left:52px!important}.v-application .px-14{padding-right:56px!important;padding-left:56px!important}.v-application .px-15{padding-right:60px!important;padding-left:60px!important}.v-application .px-16{padding-right:64px!important;padding-left:64px!important}.v-application .py-0{padding-top:0!important;padding-bottom:0!important}.v-application .py-1{padding-top:4px!important;padding-bottom:4px!important}.v-application .py-2{padding-top:8px!important;padding-bottom:8px!important}.v-application .py-3{padding-top:12px!important;padding-bottom:12px!important}.v-application .py-4{padding-top:16px!important;padding-bottom:16px!important}.v-application .py-5{padding-top:20px!important;padding-bottom:20px!important}.v-application .py-6{padding-top:24px!important;padding-bottom:24px!important}.v-application .py-7{padding-top:28px!important;padding-bottom:28px!important}.v-application .py-8{padding-top:32px!important;padding-bottom:32px!important}.v-application .py-9{padding-top:36px!important;padding-bottom:36px!important}.v-application .py-10{padding-top:40px!important;padding-bottom:40px!important}.v-application .py-11{padding-top:44px!important;padding-bottom:44px!important}.v-application .py-12{padding-top:48px!important;padding-bottom:48px!important}.v-application .py-13{padding-top:52px!important;padding-bottom:52px!important}.v-application .py-14{padding-top:56px!important;padding-bottom:56px!important}.v-application .py-15{padding-top:60px!important;padding-bottom:60px!important}.v-application .py-16{padding-top:64px!important;padding-bottom:64px!important}.v-application .pt-0{padding-top:0!important}.v-application .pt-1{padding-top:4px!important}.v-application .pt-2{padding-top:8px!important}.v-application .pt-3{padding-top:12px!important}.v-application .pt-4{padding-top:16px!important}.v-application .pt-5{padding-top:20px!important}.v-application .pt-6{padding-top:24px!important}.v-application .pt-7{padding-top:28px!important}.v-application .pt-8{padding-top:32px!important}.v-application .pt-9{padding-top:36px!important}.v-application .pt-10{padding-top:40px!important}.v-application .pt-11{padding-top:44px!important}.v-application .pt-12{padding-top:48px!important}.v-application .pt-13{padding-top:52px!important}.v-application .pt-14{padding-top:56px!important}.v-application .pt-15{padding-top:60px!important}.v-application .pt-16{padding-top:64px!important}.v-application .pr-0{padding-right:0!important}.v-application .pr-1{padding-right:4px!important}.v-application .pr-2{padding-right:8px!important}.v-application .pr-3{padding-right:12px!important}.v-application .pr-4{padding-right:16px!important}.v-application .pr-5{padding-right:20px!important}.v-application .pr-6{padding-right:24px!important}.v-application .pr-7{padding-right:28px!important}.v-application .pr-8{padding-right:32px!important}.v-application .pr-9{padding-right:36px!important}.v-application .pr-10{padding-right:40px!important}.v-application .pr-11{padding-right:44px!important}.v-application .pr-12{padding-right:48px!important}.v-application .pr-13{padding-right:52px!important}.v-application .pr-14{padding-right:56px!important}.v-application .pr-15{padding-right:60px!important}.v-application .pr-16{padding-right:64px!important}.v-application .pb-0{padding-bottom:0!important}.v-application .pb-1{padding-bottom:4px!important}.v-application .pb-2{padding-bottom:8px!important}.v-application .pb-3{padding-bottom:12px!important}.v-application .pb-4{padding-bottom:16px!important}.v-application .pb-5{padding-bottom:20px!important}.v-application .pb-6{padding-bottom:24px!important}.v-application .pb-7{padding-bottom:28px!important}.v-application .pb-8{padding-bottom:32px!important}.v-application .pb-9{padding-bottom:36px!important}.v-application .pb-10{padding-bottom:40px!important}.v-application .pb-11{padding-bottom:44px!important}.v-application .pb-12{padding-bottom:48px!important}.v-application .pb-13{padding-bottom:52px!important}.v-application .pb-14{padding-bottom:56px!important}.v-application .pb-15{padding-bottom:60px!important}.v-application .pb-16{padding-bottom:64px!important}.v-application .pl-0{padding-left:0!important}.v-application .pl-1{padding-left:4px!important}.v-application .pl-2{padding-left:8px!important}.v-application .pl-3{padding-left:12px!important}.v-application .pl-4{padding-left:16px!important}.v-application .pl-5{padding-left:20px!important}.v-application .pl-6{padding-left:24px!important}.v-application .pl-7{padding-left:28px!important}.v-application .pl-8{padding-left:32px!important}.v-application .pl-9{padding-left:36px!important}.v-application .pl-10{padding-left:40px!important}.v-application .pl-11{padding-left:44px!important}.v-application .pl-12{padding-left:48px!important}.v-application .pl-13{padding-left:52px!important}.v-application .pl-14{padding-left:56px!important}.v-application .pl-15{padding-left:60px!important}.v-application .pl-16{padding-left:64px!important}.v-application--is-ltr .ps-0{padding-left:0!important}.v-application--is-rtl .ps-0{padding-right:0!important}.v-application--is-ltr .ps-1{padding-left:4px!important}.v-application--is-rtl .ps-1{padding-right:4px!important}.v-application--is-ltr .ps-2{padding-left:8px!important}.v-application--is-rtl .ps-2{padding-right:8px!important}.v-application--is-ltr .ps-3{padding-left:12px!important}.v-application--is-rtl .ps-3{padding-right:12px!important}.v-application--is-ltr .ps-4{padding-left:16px!important}.v-application--is-rtl .ps-4{padding-right:16px!important}.v-application--is-ltr .ps-5{padding-left:20px!important}.v-application--is-rtl .ps-5{padding-right:20px!important}.v-application--is-ltr .ps-6{padding-left:24px!important}.v-application--is-rtl .ps-6{padding-right:24px!important}.v-application--is-ltr .ps-7{padding-left:28px!important}.v-application--is-rtl .ps-7{padding-right:28px!important}.v-application--is-ltr .ps-8{padding-left:32px!important}.v-application--is-rtl .ps-8{padding-right:32px!important}.v-application--is-ltr .ps-9{padding-left:36px!important}.v-application--is-rtl .ps-9{padding-right:36px!important}.v-application--is-ltr .ps-10{padding-left:40px!important}.v-application--is-rtl .ps-10{padding-right:40px!important}.v-application--is-ltr .ps-11{padding-left:44px!important}.v-application--is-rtl .ps-11{padding-right:44px!important}.v-application--is-ltr .ps-12{padding-left:48px!important}.v-application--is-rtl .ps-12{padding-right:48px!important}.v-application--is-ltr .ps-13{padding-left:52px!important}.v-application--is-rtl .ps-13{padding-right:52px!important}.v-application--is-ltr .ps-14{padding-left:56px!important}.v-application--is-rtl .ps-14{padding-right:56px!important}.v-application--is-ltr .ps-15{padding-left:60px!important}.v-application--is-rtl .ps-15{padding-right:60px!important}.v-application--is-ltr .ps-16{padding-left:64px!important}.v-application--is-rtl .ps-16{padding-right:64px!important}.v-application--is-ltr .pe-0{padding-right:0!important}.v-application--is-rtl .pe-0{padding-left:0!important}.v-application--is-ltr .pe-1{padding-right:4px!important}.v-application--is-rtl .pe-1{padding-left:4px!important}.v-application--is-ltr .pe-2{padding-right:8px!important}.v-application--is-rtl .pe-2{padding-left:8px!important}.v-application--is-ltr .pe-3{padding-right:12px!important}.v-application--is-rtl .pe-3{padding-left:12px!important}.v-application--is-ltr .pe-4{padding-right:16px!important}.v-application--is-rtl .pe-4{padding-left:16px!important}.v-application--is-ltr .pe-5{padding-right:20px!important}.v-application--is-rtl .pe-5{padding-left:20px!important}.v-application--is-ltr .pe-6{padding-right:24px!important}.v-application--is-rtl .pe-6{padding-left:24px!important}.v-application--is-ltr .pe-7{padding-right:28px!important}.v-application--is-rtl .pe-7{padding-left:28px!important}.v-application--is-ltr .pe-8{padding-right:32px!important}.v-application--is-rtl .pe-8{padding-left:32px!important}.v-application--is-ltr .pe-9{padding-right:36px!important}.v-application--is-rtl .pe-9{padding-left:36px!important}.v-application--is-ltr .pe-10{padding-right:40px!important}.v-application--is-rtl .pe-10{padding-left:40px!important}.v-application--is-ltr .pe-11{padding-right:44px!important}.v-application--is-rtl .pe-11{padding-left:44px!important}.v-application--is-ltr .pe-12{padding-right:48px!important}.v-application--is-rtl .pe-12{padding-left:48px!important}.v-application--is-ltr .pe-13{padding-right:52px!important}.v-application--is-rtl .pe-13{padding-left:52px!important}.v-application--is-ltr .pe-14{padding-right:56px!important}.v-application--is-rtl .pe-14{padding-left:56px!important}.v-application--is-ltr .pe-15{padding-right:60px!important}.v-application--is-rtl .pe-15{padding-left:60px!important}.v-application--is-ltr .pe-16{padding-right:64px!important}.v-application--is-rtl .pe-16{padding-left:64px!important}.v-application .rounded-0{border-radius:0!important}.v-application .rounded-sm{border-radius:2px!important}.v-application .rounded{border-radius:4px!important}.v-application .rounded-lg{border-radius:8px!important}.v-application .rounded-xl{border-radius:24px!important}.v-application .rounded-pill{border-radius:9999px!important}.v-application .rounded-circle{border-radius:50%!important}.v-application .rounded-t-0{border-top-left-radius:0!important;border-top-right-radius:0!important}.v-application .rounded-t-sm{border-top-left-radius:2px!important;border-top-right-radius:2px!important}.v-application .rounded-t{border-top-left-radius:4px!important;border-top-right-radius:4px!important}.v-application .rounded-t-lg{border-top-left-radius:8px!important;border-top-right-radius:8px!important}.v-application .rounded-t-xl{border-top-left-radius:24px!important;border-top-right-radius:24px!important}.v-application .rounded-t-pill{border-top-left-radius:9999px!important;border-top-right-radius:9999px!important}.v-application .rounded-t-circle{border-top-left-radius:50%!important;border-top-right-radius:50%!important}.v-application .rounded-r-0{border-top-right-radius:0!important;border-bottom-right-radius:0!important}.v-application .rounded-r-sm{border-top-right-radius:2px!important;border-bottom-right-radius:2px!important}.v-application .rounded-r{border-top-right-radius:4px!important;border-bottom-right-radius:4px!important}.v-application .rounded-r-lg{border-top-right-radius:8px!important;border-bottom-right-radius:8px!important}.v-application .rounded-r-xl{border-top-right-radius:24px!important;border-bottom-right-radius:24px!important}.v-application .rounded-r-pill{border-top-right-radius:9999px!important;border-bottom-right-radius:9999px!important}.v-application .rounded-r-circle{border-top-right-radius:50%!important;border-bottom-right-radius:50%!important}.v-application .rounded-b-0{border-bottom-left-radius:0!important;border-bottom-right-radius:0!important}.v-application .rounded-b-sm{border-bottom-left-radius:2px!important;border-bottom-right-radius:2px!important}.v-application .rounded-b{border-bottom-left-radius:4px!important;border-bottom-right-radius:4px!important}.v-application .rounded-b-lg{border-bottom-left-radius:8px!important;border-bottom-right-radius:8px!important}.v-application .rounded-b-xl{border-bottom-left-radius:24px!important;border-bottom-right-radius:24px!important}.v-application .rounded-b-pill{border-bottom-left-radius:9999px!important;border-bottom-right-radius:9999px!important}.v-application .rounded-b-circle{border-bottom-left-radius:50%!important;border-bottom-right-radius:50%!important}.v-application .rounded-l-0{border-top-left-radius:0!important;border-bottom-left-radius:0!important}.v-application .rounded-l-sm{border-top-left-radius:2px!important;border-bottom-left-radius:2px!important}.v-application .rounded-l{border-top-left-radius:4px!important;border-bottom-left-radius:4px!important}.v-application .rounded-l-lg{border-top-left-radius:8px!important;border-bottom-left-radius:8px!important}.v-application .rounded-l-xl{border-top-left-radius:24px!important;border-bottom-left-radius:24px!important}.v-application .rounded-l-pill{border-top-left-radius:9999px!important;border-bottom-left-radius:9999px!important}.v-application .rounded-l-circle{border-top-left-radius:50%!important;border-bottom-left-radius:50%!important}.v-application .rounded-tl-0{border-top-left-radius:0!important}.v-application .rounded-tl-sm{border-top-left-radius:2px!important}.v-application .rounded-tl{border-top-left-radius:4px!important}.v-application .rounded-tl-lg{border-top-left-radius:8px!important}.v-application .rounded-tl-xl{border-top-left-radius:24px!important}.v-application .rounded-tl-pill{border-top-left-radius:9999px!important}.v-application .rounded-tl-circle{border-top-left-radius:50%!important}.v-application .rounded-tr-0{border-top-right-radius:0!important}.v-application .rounded-tr-sm{border-top-right-radius:2px!important}.v-application .rounded-tr{border-top-right-radius:4px!important}.v-application .rounded-tr-lg{border-top-right-radius:8px!important}.v-application .rounded-tr-xl{border-top-right-radius:24px!important}.v-application .rounded-tr-pill{border-top-right-radius:9999px!important}.v-application .rounded-tr-circle{border-top-right-radius:50%!important}.v-application .rounded-br-0{border-bottom-right-radius:0!important}.v-application .rounded-br-sm{border-bottom-right-radius:2px!important}.v-application .rounded-br{border-bottom-right-radius:4px!important}.v-application .rounded-br-lg{border-bottom-right-radius:8px!important}.v-application .rounded-br-xl{border-bottom-right-radius:24px!important}.v-application .rounded-br-pill{border-bottom-right-radius:9999px!important}.v-application .rounded-br-circle{border-bottom-right-radius:50%!important}.v-application .rounded-bl-0{border-bottom-left-radius:0!important}.v-application .rounded-bl-sm{border-bottom-left-radius:2px!important}.v-application .rounded-bl{border-bottom-left-radius:4px!important}.v-application .rounded-bl-lg{border-bottom-left-radius:8px!important}.v-application .rounded-bl-xl{border-bottom-left-radius:24px!important}.v-application .rounded-bl-pill{border-bottom-left-radius:9999px!important}.v-application .rounded-bl-circle{border-bottom-left-radius:50%!important}.v-application .text-left{text-align:left!important}.v-application .text-right{text-align:right!important}.v-application .text-center{text-align:center!important}.v-application .text-justify{text-align:justify!important}.v-application .text-start{text-align:start!important}.v-application .text-end{text-align:end!important}.v-application .text-decoration-line-through{text-decoration:line-through!important}.v-application .text-decoration-none{text-decoration:none!important}.v-application .text-decoration-overline{text-decoration:overline!important}.v-application .text-decoration-underline{text-decoration:underline!important}.v-application .text-wrap{white-space:normal!important}.v-application .text-no-wrap{white-space:nowrap!important}.v-application .text-pre{white-space:pre!important}.v-application .text-pre-line{white-space:pre-line!important}.v-application .text-pre-wrap{white-space:pre-wrap!important}.v-application .text-break{overflow-wrap:break-word!important;word-break:break-word!important}.v-application .text-truncate{white-space:nowrap!important;overflow:hidden!important;text-overflow:ellipsis!important}.v-application .text-none{text-transform:none!important}.v-application .text-capitalize{text-transform:capitalize!important}.v-application .text-lowercase{text-transform:lowercase!important}.v-application .text-uppercase{text-transform:uppercase!important}.v-application .text-h1{font-size:6rem!important;line-height:6rem;letter-spacing:-.015625em!important}.v-application .text-h1,.v-application .text-h2{font-weight:300;font-family:Roboto,sans-serif!important}.v-application .text-h2{font-size:3.75rem!important;line-height:3.75rem;letter-spacing:-.0083333333em!important}.v-application .text-h3{font-size:3rem!important;line-height:3.125rem;letter-spacing:normal!important}.v-application .text-h3,.v-application .text-h4{font-weight:400;font-family:Roboto,sans-serif!important}.v-application .text-h4{font-size:2.125rem!important;line-height:2.5rem;letter-spacing:.0073529412em!important}.v-application .text-h5{font-size:1.5rem!important;font-weight:400;letter-spacing:normal!important}.v-application .text-h5,.v-application .text-h6{line-height:2rem;font-family:Roboto,sans-serif!important}.v-application .text-h6{font-size:1.25rem!important;font-weight:500;letter-spacing:.0125em!important}.v-application .text-subtitle-1{font-size:1rem!important;font-weight:400;line-height:1.75rem;letter-spacing:.009375em!important;font-family:Roboto,sans-serif!important}.v-application .text-subtitle-2{font-size:.875rem!important;font-weight:500;line-height:1.375rem;letter-spacing:.0071428571em!important;font-family:Roboto,sans-serif!important}.v-application .text-body-1{font-size:1rem!important;font-weight:400;line-height:1.5rem;letter-spacing:.03125em!important;font-family:Roboto,sans-serif!important}.v-application .text-body-2{font-weight:400;line-height:1.25rem;letter-spacing:.0178571429em!important}.v-application .text-body-2,.v-application .text-button{font-size:.875rem!important;font-family:Roboto,sans-serif!important}.v-application .text-button{font-weight:500;line-height:2.25rem;letter-spacing:.0892857143em!important;text-transform:uppercase!important}.v-application .text-caption{font-weight:400;line-height:1.25rem;letter-spacing:.0333333333em!important}.v-application .text-caption,.v-application .text-overline{font-size:.75rem!important;font-family:Roboto,sans-serif!important}.v-application .text-overline{font-weight:500;line-height:2rem;letter-spacing:.1666666667em!important;text-transform:uppercase!important}@media(min-width:600px){.v-application .d-sm-none{display:none!important}.v-application .d-sm-inline{display:inline!important}.v-application .d-sm-inline-block{display:inline-block!important}.v-application .d-sm-block{display:block!important}.v-application .d-sm-table{display:table!important}.v-application .d-sm-table-row{display:table-row!important}.v-application .d-sm-table-cell{display:table-cell!important}.v-application .d-sm-flex{display:flex!important}.v-application .d-sm-inline-flex{display:inline-flex!important}.v-application .float-sm-none{float:none!important}.v-application .float-sm-left{float:left!important}.v-application .float-sm-right{float:right!important}.v-application--is-rtl .float-sm-end{float:left!important}.v-application--is-ltr .float-sm-end,.v-application--is-rtl .float-sm-start{float:right!important}.v-application--is-ltr .float-sm-start{float:left!important}.v-application .flex-sm-fill{flex:1 1 auto!important}.v-application .flex-sm-row{flex-direction:row!important}.v-application .flex-sm-column{flex-direction:column!important}.v-application .flex-sm-row-reverse{flex-direction:row-reverse!important}.v-application .flex-sm-column-reverse{flex-direction:column-reverse!important}.v-application .flex-sm-grow-0{flex-grow:0!important}.v-application .flex-sm-grow-1{flex-grow:1!important}.v-application .flex-sm-shrink-0{flex-shrink:0!important}.v-application .flex-sm-shrink-1{flex-shrink:1!important}.v-application .flex-sm-wrap{flex-wrap:wrap!important}.v-application .flex-sm-nowrap{flex-wrap:nowrap!important}.v-application .flex-sm-wrap-reverse{flex-wrap:wrap-reverse!important}.v-application .justify-sm-start{justify-content:flex-start!important}.v-application .justify-sm-end{justify-content:flex-end!important}.v-application .justify-sm-center{justify-content:center!important}.v-application .justify-sm-space-between{justify-content:space-between!important}.v-application .justify-sm-space-around{justify-content:space-around!important}.v-application .align-sm-start{align-items:flex-start!important}.v-application .align-sm-end{align-items:flex-end!important}.v-application .align-sm-center{align-items:center!important}.v-application .align-sm-baseline{align-items:baseline!important}.v-application .align-sm-stretch{align-items:stretch!important}.v-application .align-content-sm-start{align-content:flex-start!important}.v-application .align-content-sm-end{align-content:flex-end!important}.v-application .align-content-sm-center{align-content:center!important}.v-application .align-content-sm-space-between{align-content:space-between!important}.v-application .align-content-sm-space-around{align-content:space-around!important}.v-application .align-content-sm-stretch{align-content:stretch!important}.v-application .align-self-sm-auto{align-self:auto!important}.v-application .align-self-sm-start{align-self:flex-start!important}.v-application .align-self-sm-end{align-self:flex-end!important}.v-application .align-self-sm-center{align-self:center!important}.v-application .align-self-sm-baseline{align-self:baseline!important}.v-application .align-self-sm-stretch{align-self:stretch!important}.v-application .order-sm-first{order:-1!important}.v-application .order-sm-0{order:0!important}.v-application .order-sm-1{order:1!important}.v-application .order-sm-2{order:2!important}.v-application .order-sm-3{order:3!important}.v-application .order-sm-4{order:4!important}.v-application .order-sm-5{order:5!important}.v-application .order-sm-6{order:6!important}.v-application .order-sm-7{order:7!important}.v-application .order-sm-8{order:8!important}.v-application .order-sm-9{order:9!important}.v-application .order-sm-10{order:10!important}.v-application .order-sm-11{order:11!important}.v-application .order-sm-12{order:12!important}.v-application .order-sm-last{order:13!important}.v-application .ma-sm-0{margin:0!important}.v-application .ma-sm-1{margin:4px!important}.v-application .ma-sm-2{margin:8px!important}.v-application .ma-sm-3{margin:12px!important}.v-application .ma-sm-4{margin:16px!important}.v-application .ma-sm-5{margin:20px!important}.v-application .ma-sm-6{margin:24px!important}.v-application .ma-sm-7{margin:28px!important}.v-application .ma-sm-8{margin:32px!important}.v-application .ma-sm-9{margin:36px!important}.v-application .ma-sm-10{margin:40px!important}.v-application .ma-sm-11{margin:44px!important}.v-application .ma-sm-12{margin:48px!important}.v-application .ma-sm-13{margin:52px!important}.v-application .ma-sm-14{margin:56px!important}.v-application .ma-sm-15{margin:60px!important}.v-application .ma-sm-16{margin:64px!important}.v-application .ma-sm-auto{margin:auto!important}.v-application .mx-sm-0{margin-right:0!important;margin-left:0!important}.v-application .mx-sm-1{margin-right:4px!important;margin-left:4px!important}.v-application .mx-sm-2{margin-right:8px!important;margin-left:8px!important}.v-application .mx-sm-3{margin-right:12px!important;margin-left:12px!important}.v-application .mx-sm-4{margin-right:16px!important;margin-left:16px!important}.v-application .mx-sm-5{margin-right:20px!important;margin-left:20px!important}.v-application .mx-sm-6{margin-right:24px!important;margin-left:24px!important}.v-application .mx-sm-7{margin-right:28px!important;margin-left:28px!important}.v-application .mx-sm-8{margin-right:32px!important;margin-left:32px!important}.v-application .mx-sm-9{margin-right:36px!important;margin-left:36px!important}.v-application .mx-sm-10{margin-right:40px!important;margin-left:40px!important}.v-application .mx-sm-11{margin-right:44px!important;margin-left:44px!important}.v-application .mx-sm-12{margin-right:48px!important;margin-left:48px!important}.v-application .mx-sm-13{margin-right:52px!important;margin-left:52px!important}.v-application .mx-sm-14{margin-right:56px!important;margin-left:56px!important}.v-application .mx-sm-15{margin-right:60px!important;margin-left:60px!important}.v-application .mx-sm-16{margin-right:64px!important;margin-left:64px!important}.v-application .mx-sm-auto{margin-right:auto!important;margin-left:auto!important}.v-application .my-sm-0{margin-top:0!important;margin-bottom:0!important}.v-application .my-sm-1{margin-top:4px!important;margin-bottom:4px!important}.v-application .my-sm-2{margin-top:8px!important;margin-bottom:8px!important}.v-application .my-sm-3{margin-top:12px!important;margin-bottom:12px!important}.v-application .my-sm-4{margin-top:16px!important;margin-bottom:16px!important}.v-application .my-sm-5{margin-top:20px!important;margin-bottom:20px!important}.v-application .my-sm-6{margin-top:24px!important;margin-bottom:24px!important}.v-application .my-sm-7{margin-top:28px!important;margin-bottom:28px!important}.v-application .my-sm-8{margin-top:32px!important;margin-bottom:32px!important}.v-application .my-sm-9{margin-top:36px!important;margin-bottom:36px!important}.v-application .my-sm-10{margin-top:40px!important;margin-bottom:40px!important}.v-application .my-sm-11{margin-top:44px!important;margin-bottom:44px!important}.v-application .my-sm-12{margin-top:48px!important;margin-bottom:48px!important}.v-application .my-sm-13{margin-top:52px!important;margin-bottom:52px!important}.v-application .my-sm-14{margin-top:56px!important;margin-bottom:56px!important}.v-application .my-sm-15{margin-top:60px!important;margin-bottom:60px!important}.v-application .my-sm-16{margin-top:64px!important;margin-bottom:64px!important}.v-application .my-sm-auto{margin-top:auto!important;margin-bottom:auto!important}.v-application .mt-sm-0{margin-top:0!important}.v-application .mt-sm-1{margin-top:4px!important}.v-application .mt-sm-2{margin-top:8px!important}.v-application .mt-sm-3{margin-top:12px!important}.v-application .mt-sm-4{margin-top:16px!important}.v-application .mt-sm-5{margin-top:20px!important}.v-application .mt-sm-6{margin-top:24px!important}.v-application .mt-sm-7{margin-top:28px!important}.v-application .mt-sm-8{margin-top:32px!important}.v-application .mt-sm-9{margin-top:36px!important}.v-application .mt-sm-10{margin-top:40px!important}.v-application .mt-sm-11{margin-top:44px!important}.v-application .mt-sm-12{margin-top:48px!important}.v-application .mt-sm-13{margin-top:52px!important}.v-application .mt-sm-14{margin-top:56px!important}.v-application .mt-sm-15{margin-top:60px!important}.v-application .mt-sm-16{margin-top:64px!important}.v-application .mt-sm-auto{margin-top:auto!important}.v-application .mr-sm-0{margin-right:0!important}.v-application .mr-sm-1{margin-right:4px!important}.v-application .mr-sm-2{margin-right:8px!important}.v-application .mr-sm-3{margin-right:12px!important}.v-application .mr-sm-4{margin-right:16px!important}.v-application .mr-sm-5{margin-right:20px!important}.v-application .mr-sm-6{margin-right:24px!important}.v-application .mr-sm-7{margin-right:28px!important}.v-application .mr-sm-8{margin-right:32px!important}.v-application .mr-sm-9{margin-right:36px!important}.v-application .mr-sm-10{margin-right:40px!important}.v-application .mr-sm-11{margin-right:44px!important}.v-application .mr-sm-12{margin-right:48px!important}.v-application .mr-sm-13{margin-right:52px!important}.v-application .mr-sm-14{margin-right:56px!important}.v-application .mr-sm-15{margin-right:60px!important}.v-application .mr-sm-16{margin-right:64px!important}.v-application .mr-sm-auto{margin-right:auto!important}.v-application .mb-sm-0{margin-bottom:0!important}.v-application .mb-sm-1{margin-bottom:4px!important}.v-application .mb-sm-2{margin-bottom:8px!important}.v-application .mb-sm-3{margin-bottom:12px!important}.v-application .mb-sm-4{margin-bottom:16px!important}.v-application .mb-sm-5{margin-bottom:20px!important}.v-application .mb-sm-6{margin-bottom:24px!important}.v-application .mb-sm-7{margin-bottom:28px!important}.v-application .mb-sm-8{margin-bottom:32px!important}.v-application .mb-sm-9{margin-bottom:36px!important}.v-application .mb-sm-10{margin-bottom:40px!important}.v-application .mb-sm-11{margin-bottom:44px!important}.v-application .mb-sm-12{margin-bottom:48px!important}.v-application .mb-sm-13{margin-bottom:52px!important}.v-application .mb-sm-14{margin-bottom:56px!important}.v-application .mb-sm-15{margin-bottom:60px!important}.v-application .mb-sm-16{margin-bottom:64px!important}.v-application .mb-sm-auto{margin-bottom:auto!important}.v-application .ml-sm-0{margin-left:0!important}.v-application .ml-sm-1{margin-left:4px!important}.v-application .ml-sm-2{margin-left:8px!important}.v-application .ml-sm-3{margin-left:12px!important}.v-application .ml-sm-4{margin-left:16px!important}.v-application .ml-sm-5{margin-left:20px!important}.v-application .ml-sm-6{margin-left:24px!important}.v-application .ml-sm-7{margin-left:28px!important}.v-application .ml-sm-8{margin-left:32px!important}.v-application .ml-sm-9{margin-left:36px!important}.v-application .ml-sm-10{margin-left:40px!important}.v-application .ml-sm-11{margin-left:44px!important}.v-application .ml-sm-12{margin-left:48px!important}.v-application .ml-sm-13{margin-left:52px!important}.v-application .ml-sm-14{margin-left:56px!important}.v-application .ml-sm-15{margin-left:60px!important}.v-application .ml-sm-16{margin-left:64px!important}.v-application .ml-sm-auto{margin-left:auto!important}.v-application--is-ltr .ms-sm-0{margin-left:0!important}.v-application--is-rtl .ms-sm-0{margin-right:0!important}.v-application--is-ltr .ms-sm-1{margin-left:4px!important}.v-application--is-rtl .ms-sm-1{margin-right:4px!important}.v-application--is-ltr .ms-sm-2{margin-left:8px!important}.v-application--is-rtl .ms-sm-2{margin-right:8px!important}.v-application--is-ltr .ms-sm-3{margin-left:12px!important}.v-application--is-rtl .ms-sm-3{margin-right:12px!important}.v-application--is-ltr .ms-sm-4{margin-left:16px!important}.v-application--is-rtl .ms-sm-4{margin-right:16px!important}.v-application--is-ltr .ms-sm-5{margin-left:20px!important}.v-application--is-rtl .ms-sm-5{margin-right:20px!important}.v-application--is-ltr .ms-sm-6{margin-left:24px!important}.v-application--is-rtl .ms-sm-6{margin-right:24px!important}.v-application--is-ltr .ms-sm-7{margin-left:28px!important}.v-application--is-rtl .ms-sm-7{margin-right:28px!important}.v-application--is-ltr .ms-sm-8{margin-left:32px!important}.v-application--is-rtl .ms-sm-8{margin-right:32px!important}.v-application--is-ltr .ms-sm-9{margin-left:36px!important}.v-application--is-rtl .ms-sm-9{margin-right:36px!important}.v-application--is-ltr .ms-sm-10{margin-left:40px!important}.v-application--is-rtl .ms-sm-10{margin-right:40px!important}.v-application--is-ltr .ms-sm-11{margin-left:44px!important}.v-application--is-rtl .ms-sm-11{margin-right:44px!important}.v-application--is-ltr .ms-sm-12{margin-left:48px!important}.v-application--is-rtl .ms-sm-12{margin-right:48px!important}.v-application--is-ltr .ms-sm-13{margin-left:52px!important}.v-application--is-rtl .ms-sm-13{margin-right:52px!important}.v-application--is-ltr .ms-sm-14{margin-left:56px!important}.v-application--is-rtl .ms-sm-14{margin-right:56px!important}.v-application--is-ltr .ms-sm-15{margin-left:60px!important}.v-application--is-rtl .ms-sm-15{margin-right:60px!important}.v-application--is-ltr .ms-sm-16{margin-left:64px!important}.v-application--is-rtl .ms-sm-16{margin-right:64px!important}.v-application--is-ltr .ms-sm-auto{margin-left:auto!important}.v-application--is-rtl .ms-sm-auto{margin-right:auto!important}.v-application--is-ltr .me-sm-0{margin-right:0!important}.v-application--is-rtl .me-sm-0{margin-left:0!important}.v-application--is-ltr .me-sm-1{margin-right:4px!important}.v-application--is-rtl .me-sm-1{margin-left:4px!important}.v-application--is-ltr .me-sm-2{margin-right:8px!important}.v-application--is-rtl .me-sm-2{margin-left:8px!important}.v-application--is-ltr .me-sm-3{margin-right:12px!important}.v-application--is-rtl .me-sm-3{margin-left:12px!important}.v-application--is-ltr .me-sm-4{margin-right:16px!important}.v-application--is-rtl .me-sm-4{margin-left:16px!important}.v-application--is-ltr .me-sm-5{margin-right:20px!important}.v-application--is-rtl .me-sm-5{margin-left:20px!important}.v-application--is-ltr .me-sm-6{margin-right:24px!important}.v-application--is-rtl .me-sm-6{margin-left:24px!important}.v-application--is-ltr .me-sm-7{margin-right:28px!important}.v-application--is-rtl .me-sm-7{margin-left:28px!important}.v-application--is-ltr .me-sm-8{margin-right:32px!important}.v-application--is-rtl .me-sm-8{margin-left:32px!important}.v-application--is-ltr .me-sm-9{margin-right:36px!important}.v-application--is-rtl .me-sm-9{margin-left:36px!important}.v-application--is-ltr .me-sm-10{margin-right:40px!important}.v-application--is-rtl .me-sm-10{margin-left:40px!important}.v-application--is-ltr .me-sm-11{margin-right:44px!important}.v-application--is-rtl .me-sm-11{margin-left:44px!important}.v-application--is-ltr .me-sm-12{margin-right:48px!important}.v-application--is-rtl .me-sm-12{margin-left:48px!important}.v-application--is-ltr .me-sm-13{margin-right:52px!important}.v-application--is-rtl .me-sm-13{margin-left:52px!important}.v-application--is-ltr .me-sm-14{margin-right:56px!important}.v-application--is-rtl .me-sm-14{margin-left:56px!important}.v-application--is-ltr .me-sm-15{margin-right:60px!important}.v-application--is-rtl .me-sm-15{margin-left:60px!important}.v-application--is-ltr .me-sm-16{margin-right:64px!important}.v-application--is-rtl .me-sm-16{margin-left:64px!important}.v-application--is-ltr .me-sm-auto{margin-right:auto!important}.v-application--is-rtl .me-sm-auto{margin-left:auto!important}.v-application .ma-sm-n1{margin:-4px!important}.v-application .ma-sm-n2{margin:-8px!important}.v-application .ma-sm-n3{margin:-12px!important}.v-application .ma-sm-n4{margin:-16px!important}.v-application .ma-sm-n5{margin:-20px!important}.v-application .ma-sm-n6{margin:-24px!important}.v-application .ma-sm-n7{margin:-28px!important}.v-application .ma-sm-n8{margin:-32px!important}.v-application .ma-sm-n9{margin:-36px!important}.v-application .ma-sm-n10{margin:-40px!important}.v-application .ma-sm-n11{margin:-44px!important}.v-application .ma-sm-n12{margin:-48px!important}.v-application .ma-sm-n13{margin:-52px!important}.v-application .ma-sm-n14{margin:-56px!important}.v-application .ma-sm-n15{margin:-60px!important}.v-application .ma-sm-n16{margin:-64px!important}.v-application .mx-sm-n1{margin-right:-4px!important;margin-left:-4px!important}.v-application .mx-sm-n2{margin-right:-8px!important;margin-left:-8px!important}.v-application .mx-sm-n3{margin-right:-12px!important;margin-left:-12px!important}.v-application .mx-sm-n4{margin-right:-16px!important;margin-left:-16px!important}.v-application .mx-sm-n5{margin-right:-20px!important;margin-left:-20px!important}.v-application .mx-sm-n6{margin-right:-24px!important;margin-left:-24px!important}.v-application .mx-sm-n7{margin-right:-28px!important;margin-left:-28px!important}.v-application .mx-sm-n8{margin-right:-32px!important;margin-left:-32px!important}.v-application .mx-sm-n9{margin-right:-36px!important;margin-left:-36px!important}.v-application .mx-sm-n10{margin-right:-40px!important;margin-left:-40px!important}.v-application .mx-sm-n11{margin-right:-44px!important;margin-left:-44px!important}.v-application .mx-sm-n12{margin-right:-48px!important;margin-left:-48px!important}.v-application .mx-sm-n13{margin-right:-52px!important;margin-left:-52px!important}.v-application .mx-sm-n14{margin-right:-56px!important;margin-left:-56px!important}.v-application .mx-sm-n15{margin-right:-60px!important;margin-left:-60px!important}.v-application .mx-sm-n16{margin-right:-64px!important;margin-left:-64px!important}.v-application .my-sm-n1{margin-top:-4px!important;margin-bottom:-4px!important}.v-application .my-sm-n2{margin-top:-8px!important;margin-bottom:-8px!important}.v-application .my-sm-n3{margin-top:-12px!important;margin-bottom:-12px!important}.v-application .my-sm-n4{margin-top:-16px!important;margin-bottom:-16px!important}.v-application .my-sm-n5{margin-top:-20px!important;margin-bottom:-20px!important}.v-application .my-sm-n6{margin-top:-24px!important;margin-bottom:-24px!important}.v-application .my-sm-n7{margin-top:-28px!important;margin-bottom:-28px!important}.v-application .my-sm-n8{margin-top:-32px!important;margin-bottom:-32px!important}.v-application .my-sm-n9{margin-top:-36px!important;margin-bottom:-36px!important}.v-application .my-sm-n10{margin-top:-40px!important;margin-bottom:-40px!important}.v-application .my-sm-n11{margin-top:-44px!important;margin-bottom:-44px!important}.v-application .my-sm-n12{margin-top:-48px!important;margin-bottom:-48px!important}.v-application .my-sm-n13{margin-top:-52px!important;margin-bottom:-52px!important}.v-application .my-sm-n14{margin-top:-56px!important;margin-bottom:-56px!important}.v-application .my-sm-n15{margin-top:-60px!important;margin-bottom:-60px!important}.v-application .my-sm-n16{margin-top:-64px!important;margin-bottom:-64px!important}.v-application .mt-sm-n1{margin-top:-4px!important}.v-application .mt-sm-n2{margin-top:-8px!important}.v-application .mt-sm-n3{margin-top:-12px!important}.v-application .mt-sm-n4{margin-top:-16px!important}.v-application .mt-sm-n5{margin-top:-20px!important}.v-application .mt-sm-n6{margin-top:-24px!important}.v-application .mt-sm-n7{margin-top:-28px!important}.v-application .mt-sm-n8{margin-top:-32px!important}.v-application .mt-sm-n9{margin-top:-36px!important}.v-application .mt-sm-n10{margin-top:-40px!important}.v-application .mt-sm-n11{margin-top:-44px!important}.v-application .mt-sm-n12{margin-top:-48px!important}.v-application .mt-sm-n13{margin-top:-52px!important}.v-application .mt-sm-n14{margin-top:-56px!important}.v-application .mt-sm-n15{margin-top:-60px!important}.v-application .mt-sm-n16{margin-top:-64px!important}.v-application .mr-sm-n1{margin-right:-4px!important}.v-application .mr-sm-n2{margin-right:-8px!important}.v-application .mr-sm-n3{margin-right:-12px!important}.v-application .mr-sm-n4{margin-right:-16px!important}.v-application .mr-sm-n5{margin-right:-20px!important}.v-application .mr-sm-n6{margin-right:-24px!important}.v-application .mr-sm-n7{margin-right:-28px!important}.v-application .mr-sm-n8{margin-right:-32px!important}.v-application .mr-sm-n9{margin-right:-36px!important}.v-application .mr-sm-n10{margin-right:-40px!important}.v-application .mr-sm-n11{margin-right:-44px!important}.v-application .mr-sm-n12{margin-right:-48px!important}.v-application .mr-sm-n13{margin-right:-52px!important}.v-application .mr-sm-n14{margin-right:-56px!important}.v-application .mr-sm-n15{margin-right:-60px!important}.v-application .mr-sm-n16{margin-right:-64px!important}.v-application .mb-sm-n1{margin-bottom:-4px!important}.v-application .mb-sm-n2{margin-bottom:-8px!important}.v-application .mb-sm-n3{margin-bottom:-12px!important}.v-application .mb-sm-n4{margin-bottom:-16px!important}.v-application .mb-sm-n5{margin-bottom:-20px!important}.v-application .mb-sm-n6{margin-bottom:-24px!important}.v-application .mb-sm-n7{margin-bottom:-28px!important}.v-application .mb-sm-n8{margin-bottom:-32px!important}.v-application .mb-sm-n9{margin-bottom:-36px!important}.v-application .mb-sm-n10{margin-bottom:-40px!important}.v-application .mb-sm-n11{margin-bottom:-44px!important}.v-application .mb-sm-n12{margin-bottom:-48px!important}.v-application .mb-sm-n13{margin-bottom:-52px!important}.v-application .mb-sm-n14{margin-bottom:-56px!important}.v-application .mb-sm-n15{margin-bottom:-60px!important}.v-application .mb-sm-n16{margin-bottom:-64px!important}.v-application .ml-sm-n1{margin-left:-4px!important}.v-application .ml-sm-n2{margin-left:-8px!important}.v-application .ml-sm-n3{margin-left:-12px!important}.v-application .ml-sm-n4{margin-left:-16px!important}.v-application .ml-sm-n5{margin-left:-20px!important}.v-application .ml-sm-n6{margin-left:-24px!important}.v-application .ml-sm-n7{margin-left:-28px!important}.v-application .ml-sm-n8{margin-left:-32px!important}.v-application .ml-sm-n9{margin-left:-36px!important}.v-application .ml-sm-n10{margin-left:-40px!important}.v-application .ml-sm-n11{margin-left:-44px!important}.v-application .ml-sm-n12{margin-left:-48px!important}.v-application .ml-sm-n13{margin-left:-52px!important}.v-application .ml-sm-n14{margin-left:-56px!important}.v-application .ml-sm-n15{margin-left:-60px!important}.v-application .ml-sm-n16{margin-left:-64px!important}.v-application--is-ltr .ms-sm-n1{margin-left:-4px!important}.v-application--is-rtl .ms-sm-n1{margin-right:-4px!important}.v-application--is-ltr .ms-sm-n2{margin-left:-8px!important}.v-application--is-rtl .ms-sm-n2{margin-right:-8px!important}.v-application--is-ltr .ms-sm-n3{margin-left:-12px!important}.v-application--is-rtl .ms-sm-n3{margin-right:-12px!important}.v-application--is-ltr .ms-sm-n4{margin-left:-16px!important}.v-application--is-rtl .ms-sm-n4{margin-right:-16px!important}.v-application--is-ltr .ms-sm-n5{margin-left:-20px!important}.v-application--is-rtl .ms-sm-n5{margin-right:-20px!important}.v-application--is-ltr .ms-sm-n6{margin-left:-24px!important}.v-application--is-rtl .ms-sm-n6{margin-right:-24px!important}.v-application--is-ltr .ms-sm-n7{margin-left:-28px!important}.v-application--is-rtl .ms-sm-n7{margin-right:-28px!important}.v-application--is-ltr .ms-sm-n8{margin-left:-32px!important}.v-application--is-rtl .ms-sm-n8{margin-right:-32px!important}.v-application--is-ltr .ms-sm-n9{margin-left:-36px!important}.v-application--is-rtl .ms-sm-n9{margin-right:-36px!important}.v-application--is-ltr .ms-sm-n10{margin-left:-40px!important}.v-application--is-rtl .ms-sm-n10{margin-right:-40px!important}.v-application--is-ltr .ms-sm-n11{margin-left:-44px!important}.v-application--is-rtl .ms-sm-n11{margin-right:-44px!important}.v-application--is-ltr .ms-sm-n12{margin-left:-48px!important}.v-application--is-rtl .ms-sm-n12{margin-right:-48px!important}.v-application--is-ltr .ms-sm-n13{margin-left:-52px!important}.v-application--is-rtl .ms-sm-n13{margin-right:-52px!important}.v-application--is-ltr .ms-sm-n14{margin-left:-56px!important}.v-application--is-rtl .ms-sm-n14{margin-right:-56px!important}.v-application--is-ltr .ms-sm-n15{margin-left:-60px!important}.v-application--is-rtl .ms-sm-n15{margin-right:-60px!important}.v-application--is-ltr .ms-sm-n16{margin-left:-64px!important}.v-application--is-rtl .ms-sm-n16{margin-right:-64px!important}.v-application--is-ltr .me-sm-n1{margin-right:-4px!important}.v-application--is-rtl .me-sm-n1{margin-left:-4px!important}.v-application--is-ltr .me-sm-n2{margin-right:-8px!important}.v-application--is-rtl .me-sm-n2{margin-left:-8px!important}.v-application--is-ltr .me-sm-n3{margin-right:-12px!important}.v-application--is-rtl .me-sm-n3{margin-left:-12px!important}.v-application--is-ltr .me-sm-n4{margin-right:-16px!important}.v-application--is-rtl .me-sm-n4{margin-left:-16px!important}.v-application--is-ltr .me-sm-n5{margin-right:-20px!important}.v-application--is-rtl .me-sm-n5{margin-left:-20px!important}.v-application--is-ltr .me-sm-n6{margin-right:-24px!important}.v-application--is-rtl .me-sm-n6{margin-left:-24px!important}.v-application--is-ltr .me-sm-n7{margin-right:-28px!important}.v-application--is-rtl .me-sm-n7{margin-left:-28px!important}.v-application--is-ltr .me-sm-n8{margin-right:-32px!important}.v-application--is-rtl .me-sm-n8{margin-left:-32px!important}.v-application--is-ltr .me-sm-n9{margin-right:-36px!important}.v-application--is-rtl .me-sm-n9{margin-left:-36px!important}.v-application--is-ltr .me-sm-n10{margin-right:-40px!important}.v-application--is-rtl .me-sm-n10{margin-left:-40px!important}.v-application--is-ltr .me-sm-n11{margin-right:-44px!important}.v-application--is-rtl .me-sm-n11{margin-left:-44px!important}.v-application--is-ltr .me-sm-n12{margin-right:-48px!important}.v-application--is-rtl .me-sm-n12{margin-left:-48px!important}.v-application--is-ltr .me-sm-n13{margin-right:-52px!important}.v-application--is-rtl .me-sm-n13{margin-left:-52px!important}.v-application--is-ltr .me-sm-n14{margin-right:-56px!important}.v-application--is-rtl .me-sm-n14{margin-left:-56px!important}.v-application--is-ltr .me-sm-n15{margin-right:-60px!important}.v-application--is-rtl .me-sm-n15{margin-left:-60px!important}.v-application--is-ltr .me-sm-n16{margin-right:-64px!important}.v-application--is-rtl .me-sm-n16{margin-left:-64px!important}.v-application .pa-sm-0{padding:0!important}.v-application .pa-sm-1{padding:4px!important}.v-application .pa-sm-2{padding:8px!important}.v-application .pa-sm-3{padding:12px!important}.v-application .pa-sm-4{padding:16px!important}.v-application .pa-sm-5{padding:20px!important}.v-application .pa-sm-6{padding:24px!important}.v-application .pa-sm-7{padding:28px!important}.v-application .pa-sm-8{padding:32px!important}.v-application .pa-sm-9{padding:36px!important}.v-application .pa-sm-10{padding:40px!important}.v-application .pa-sm-11{padding:44px!important}.v-application .pa-sm-12{padding:48px!important}.v-application .pa-sm-13{padding:52px!important}.v-application .pa-sm-14{padding:56px!important}.v-application .pa-sm-15{padding:60px!important}.v-application .pa-sm-16{padding:64px!important}.v-application .px-sm-0{padding-right:0!important;padding-left:0!important}.v-application .px-sm-1{padding-right:4px!important;padding-left:4px!important}.v-application .px-sm-2{padding-right:8px!important;padding-left:8px!important}.v-application .px-sm-3{padding-right:12px!important;padding-left:12px!important}.v-application .px-sm-4{padding-right:16px!important;padding-left:16px!important}.v-application .px-sm-5{padding-right:20px!important;padding-left:20px!important}.v-application .px-sm-6{padding-right:24px!important;padding-left:24px!important}.v-application .px-sm-7{padding-right:28px!important;padding-left:28px!important}.v-application .px-sm-8{padding-right:32px!important;padding-left:32px!important}.v-application .px-sm-9{padding-right:36px!important;padding-left:36px!important}.v-application .px-sm-10{padding-right:40px!important;padding-left:40px!important}.v-application .px-sm-11{padding-right:44px!important;padding-left:44px!important}.v-application .px-sm-12{padding-right:48px!important;padding-left:48px!important}.v-application .px-sm-13{padding-right:52px!important;padding-left:52px!important}.v-application .px-sm-14{padding-right:56px!important;padding-left:56px!important}.v-application .px-sm-15{padding-right:60px!important;padding-left:60px!important}.v-application .px-sm-16{padding-right:64px!important;padding-left:64px!important}.v-application .py-sm-0{padding-top:0!important;padding-bottom:0!important}.v-application .py-sm-1{padding-top:4px!important;padding-bottom:4px!important}.v-application .py-sm-2{padding-top:8px!important;padding-bottom:8px!important}.v-application .py-sm-3{padding-top:12px!important;padding-bottom:12px!important}.v-application .py-sm-4{padding-top:16px!important;padding-bottom:16px!important}.v-application .py-sm-5{padding-top:20px!important;padding-bottom:20px!important}.v-application .py-sm-6{padding-top:24px!important;padding-bottom:24px!important}.v-application .py-sm-7{padding-top:28px!important;padding-bottom:28px!important}.v-application .py-sm-8{padding-top:32px!important;padding-bottom:32px!important}.v-application .py-sm-9{padding-top:36px!important;padding-bottom:36px!important}.v-application .py-sm-10{padding-top:40px!important;padding-bottom:40px!important}.v-application .py-sm-11{padding-top:44px!important;padding-bottom:44px!important}.v-application .py-sm-12{padding-top:48px!important;padding-bottom:48px!important}.v-application .py-sm-13{padding-top:52px!important;padding-bottom:52px!important}.v-application .py-sm-14{padding-top:56px!important;padding-bottom:56px!important}.v-application .py-sm-15{padding-top:60px!important;padding-bottom:60px!important}.v-application .py-sm-16{padding-top:64px!important;padding-bottom:64px!important}.v-application .pt-sm-0{padding-top:0!important}.v-application .pt-sm-1{padding-top:4px!important}.v-application .pt-sm-2{padding-top:8px!important}.v-application .pt-sm-3{padding-top:12px!important}.v-application .pt-sm-4{padding-top:16px!important}.v-application .pt-sm-5{padding-top:20px!important}.v-application .pt-sm-6{padding-top:24px!important}.v-application .pt-sm-7{padding-top:28px!important}.v-application .pt-sm-8{padding-top:32px!important}.v-application .pt-sm-9{padding-top:36px!important}.v-application .pt-sm-10{padding-top:40px!important}.v-application .pt-sm-11{padding-top:44px!important}.v-application .pt-sm-12{padding-top:48px!important}.v-application .pt-sm-13{padding-top:52px!important}.v-application .pt-sm-14{padding-top:56px!important}.v-application .pt-sm-15{padding-top:60px!important}.v-application .pt-sm-16{padding-top:64px!important}.v-application .pr-sm-0{padding-right:0!important}.v-application .pr-sm-1{padding-right:4px!important}.v-application .pr-sm-2{padding-right:8px!important}.v-application .pr-sm-3{padding-right:12px!important}.v-application .pr-sm-4{padding-right:16px!important}.v-application .pr-sm-5{padding-right:20px!important}.v-application .pr-sm-6{padding-right:24px!important}.v-application .pr-sm-7{padding-right:28px!important}.v-application .pr-sm-8{padding-right:32px!important}.v-application .pr-sm-9{padding-right:36px!important}.v-application .pr-sm-10{padding-right:40px!important}.v-application .pr-sm-11{padding-right:44px!important}.v-application .pr-sm-12{padding-right:48px!important}.v-application .pr-sm-13{padding-right:52px!important}.v-application .pr-sm-14{padding-right:56px!important}.v-application .pr-sm-15{padding-right:60px!important}.v-application .pr-sm-16{padding-right:64px!important}.v-application .pb-sm-0{padding-bottom:0!important}.v-application .pb-sm-1{padding-bottom:4px!important}.v-application .pb-sm-2{padding-bottom:8px!important}.v-application .pb-sm-3{padding-bottom:12px!important}.v-application .pb-sm-4{padding-bottom:16px!important}.v-application .pb-sm-5{padding-bottom:20px!important}.v-application .pb-sm-6{padding-bottom:24px!important}.v-application .pb-sm-7{padding-bottom:28px!important}.v-application .pb-sm-8{padding-bottom:32px!important}.v-application .pb-sm-9{padding-bottom:36px!important}.v-application .pb-sm-10{padding-bottom:40px!important}.v-application .pb-sm-11{padding-bottom:44px!important}.v-application .pb-sm-12{padding-bottom:48px!important}.v-application .pb-sm-13{padding-bottom:52px!important}.v-application .pb-sm-14{padding-bottom:56px!important}.v-application .pb-sm-15{padding-bottom:60px!important}.v-application .pb-sm-16{padding-bottom:64px!important}.v-application .pl-sm-0{padding-left:0!important}.v-application .pl-sm-1{padding-left:4px!important}.v-application .pl-sm-2{padding-left:8px!important}.v-application .pl-sm-3{padding-left:12px!important}.v-application .pl-sm-4{padding-left:16px!important}.v-application .pl-sm-5{padding-left:20px!important}.v-application .pl-sm-6{padding-left:24px!important}.v-application .pl-sm-7{padding-left:28px!important}.v-application .pl-sm-8{padding-left:32px!important}.v-application .pl-sm-9{padding-left:36px!important}.v-application .pl-sm-10{padding-left:40px!important}.v-application .pl-sm-11{padding-left:44px!important}.v-application .pl-sm-12{padding-left:48px!important}.v-application .pl-sm-13{padding-left:52px!important}.v-application .pl-sm-14{padding-left:56px!important}.v-application .pl-sm-15{padding-left:60px!important}.v-application .pl-sm-16{padding-left:64px!important}.v-application--is-ltr .ps-sm-0{padding-left:0!important}.v-application--is-rtl .ps-sm-0{padding-right:0!important}.v-application--is-ltr .ps-sm-1{padding-left:4px!important}.v-application--is-rtl .ps-sm-1{padding-right:4px!important}.v-application--is-ltr .ps-sm-2{padding-left:8px!important}.v-application--is-rtl .ps-sm-2{padding-right:8px!important}.v-application--is-ltr .ps-sm-3{padding-left:12px!important}.v-application--is-rtl .ps-sm-3{padding-right:12px!important}.v-application--is-ltr .ps-sm-4{padding-left:16px!important}.v-application--is-rtl .ps-sm-4{padding-right:16px!important}.v-application--is-ltr .ps-sm-5{padding-left:20px!important}.v-application--is-rtl .ps-sm-5{padding-right:20px!important}.v-application--is-ltr .ps-sm-6{padding-left:24px!important}.v-application--is-rtl .ps-sm-6{padding-right:24px!important}.v-application--is-ltr .ps-sm-7{padding-left:28px!important}.v-application--is-rtl .ps-sm-7{padding-right:28px!important}.v-application--is-ltr .ps-sm-8{padding-left:32px!important}.v-application--is-rtl .ps-sm-8{padding-right:32px!important}.v-application--is-ltr .ps-sm-9{padding-left:36px!important}.v-application--is-rtl .ps-sm-9{padding-right:36px!important}.v-application--is-ltr .ps-sm-10{padding-left:40px!important}.v-application--is-rtl .ps-sm-10{padding-right:40px!important}.v-application--is-ltr .ps-sm-11{padding-left:44px!important}.v-application--is-rtl .ps-sm-11{padding-right:44px!important}.v-application--is-ltr .ps-sm-12{padding-left:48px!important}.v-application--is-rtl .ps-sm-12{padding-right:48px!important}.v-application--is-ltr .ps-sm-13{padding-left:52px!important}.v-application--is-rtl .ps-sm-13{padding-right:52px!important}.v-application--is-ltr .ps-sm-14{padding-left:56px!important}.v-application--is-rtl .ps-sm-14{padding-right:56px!important}.v-application--is-ltr .ps-sm-15{padding-left:60px!important}.v-application--is-rtl .ps-sm-15{padding-right:60px!important}.v-application--is-ltr .ps-sm-16{padding-left:64px!important}.v-application--is-rtl .ps-sm-16{padding-right:64px!important}.v-application--is-ltr .pe-sm-0{padding-right:0!important}.v-application--is-rtl .pe-sm-0{padding-left:0!important}.v-application--is-ltr .pe-sm-1{padding-right:4px!important}.v-application--is-rtl .pe-sm-1{padding-left:4px!important}.v-application--is-ltr .pe-sm-2{padding-right:8px!important}.v-application--is-rtl .pe-sm-2{padding-left:8px!important}.v-application--is-ltr .pe-sm-3{padding-right:12px!important}.v-application--is-rtl .pe-sm-3{padding-left:12px!important}.v-application--is-ltr .pe-sm-4{padding-right:16px!important}.v-application--is-rtl .pe-sm-4{padding-left:16px!important}.v-application--is-ltr .pe-sm-5{padding-right:20px!important}.v-application--is-rtl .pe-sm-5{padding-left:20px!important}.v-application--is-ltr .pe-sm-6{padding-right:24px!important}.v-application--is-rtl .pe-sm-6{padding-left:24px!important}.v-application--is-ltr .pe-sm-7{padding-right:28px!important}.v-application--is-rtl .pe-sm-7{padding-left:28px!important}.v-application--is-ltr .pe-sm-8{padding-right:32px!important}.v-application--is-rtl .pe-sm-8{padding-left:32px!important}.v-application--is-ltr .pe-sm-9{padding-right:36px!important}.v-application--is-rtl .pe-sm-9{padding-left:36px!important}.v-application--is-ltr .pe-sm-10{padding-right:40px!important}.v-application--is-rtl .pe-sm-10{padding-left:40px!important}.v-application--is-ltr .pe-sm-11{padding-right:44px!important}.v-application--is-rtl .pe-sm-11{padding-left:44px!important}.v-application--is-ltr .pe-sm-12{padding-right:48px!important}.v-application--is-rtl .pe-sm-12{padding-left:48px!important}.v-application--is-ltr .pe-sm-13{padding-right:52px!important}.v-application--is-rtl .pe-sm-13{padding-left:52px!important}.v-application--is-ltr .pe-sm-14{padding-right:56px!important}.v-application--is-rtl .pe-sm-14{padding-left:56px!important}.v-application--is-ltr .pe-sm-15{padding-right:60px!important}.v-application--is-rtl .pe-sm-15{padding-left:60px!important}.v-application--is-ltr .pe-sm-16{padding-right:64px!important}.v-application--is-rtl .pe-sm-16{padding-left:64px!important}.v-application .text-sm-left{text-align:left!important}.v-application .text-sm-right{text-align:right!important}.v-application .text-sm-center{text-align:center!important}.v-application .text-sm-justify{text-align:justify!important}.v-application .text-sm-start{text-align:start!important}.v-application .text-sm-end{text-align:end!important}.v-application .text-sm-h1{font-size:6rem!important;line-height:6rem;letter-spacing:-.015625em!important}.v-application .text-sm-h1,.v-application .text-sm-h2{font-weight:300;font-family:Roboto,sans-serif!important}.v-application .text-sm-h2{font-size:3.75rem!important;line-height:3.75rem;letter-spacing:-.0083333333em!important}.v-application .text-sm-h3{font-size:3rem!important;line-height:3.125rem;letter-spacing:normal!important}.v-application .text-sm-h3,.v-application .text-sm-h4{font-weight:400;font-family:Roboto,sans-serif!important}.v-application .text-sm-h4{font-size:2.125rem!important;line-height:2.5rem;letter-spacing:.0073529412em!important}.v-application .text-sm-h5{font-size:1.5rem!important;font-weight:400;letter-spacing:normal!important}.v-application .text-sm-h5,.v-application .text-sm-h6{line-height:2rem;font-family:Roboto,sans-serif!important}.v-application .text-sm-h6{font-size:1.25rem!important;font-weight:500;letter-spacing:.0125em!important}.v-application .text-sm-subtitle-1{font-size:1rem!important;font-weight:400;line-height:1.75rem;letter-spacing:.009375em!important;font-family:Roboto,sans-serif!important}.v-application .text-sm-subtitle-2{font-size:.875rem!important;font-weight:500;line-height:1.375rem;letter-spacing:.0071428571em!important;font-family:Roboto,sans-serif!important}.v-application .text-sm-body-1{font-size:1rem!important;font-weight:400;line-height:1.5rem;letter-spacing:.03125em!important;font-family:Roboto,sans-serif!important}.v-application .text-sm-body-2{font-weight:400;line-height:1.25rem;letter-spacing:.0178571429em!important}.v-application .text-sm-body-2,.v-application .text-sm-button{font-size:.875rem!important;font-family:Roboto,sans-serif!important}.v-application .text-sm-button{font-weight:500;line-height:2.25rem;letter-spacing:.0892857143em!important;text-transform:uppercase!important}.v-application .text-sm-caption{font-weight:400;line-height:1.25rem;letter-spacing:.0333333333em!important}.v-application .text-sm-caption,.v-application .text-sm-overline{font-size:.75rem!important;font-family:Roboto,sans-serif!important}.v-application .text-sm-overline{font-weight:500;line-height:2rem;letter-spacing:.1666666667em!important;text-transform:uppercase!important}}@media(min-width:960px){.v-application .d-md-none{display:none!important}.v-application .d-md-inline{display:inline!important}.v-application .d-md-inline-block{display:inline-block!important}.v-application .d-md-block{display:block!important}.v-application .d-md-table{display:table!important}.v-application .d-md-table-row{display:table-row!important}.v-application .d-md-table-cell{display:table-cell!important}.v-application .d-md-flex{display:flex!important}.v-application .d-md-inline-flex{display:inline-flex!important}.v-application .float-md-none{float:none!important}.v-application .float-md-left{float:left!important}.v-application .float-md-right{float:right!important}.v-application--is-rtl .float-md-end{float:left!important}.v-application--is-ltr .float-md-end,.v-application--is-rtl .float-md-start{float:right!important}.v-application--is-ltr .float-md-start{float:left!important}.v-application .flex-md-fill{flex:1 1 auto!important}.v-application .flex-md-row{flex-direction:row!important}.v-application .flex-md-column{flex-direction:column!important}.v-application .flex-md-row-reverse{flex-direction:row-reverse!important}.v-application .flex-md-column-reverse{flex-direction:column-reverse!important}.v-application .flex-md-grow-0{flex-grow:0!important}.v-application .flex-md-grow-1{flex-grow:1!important}.v-application .flex-md-shrink-0{flex-shrink:0!important}.v-application .flex-md-shrink-1{flex-shrink:1!important}.v-application .flex-md-wrap{flex-wrap:wrap!important}.v-application .flex-md-nowrap{flex-wrap:nowrap!important}.v-application .flex-md-wrap-reverse{flex-wrap:wrap-reverse!important}.v-application .justify-md-start{justify-content:flex-start!important}.v-application .justify-md-end{justify-content:flex-end!important}.v-application .justify-md-center{justify-content:center!important}.v-application .justify-md-space-between{justify-content:space-between!important}.v-application .justify-md-space-around{justify-content:space-around!important}.v-application .align-md-start{align-items:flex-start!important}.v-application .align-md-end{align-items:flex-end!important}.v-application .align-md-center{align-items:center!important}.v-application .align-md-baseline{align-items:baseline!important}.v-application .align-md-stretch{align-items:stretch!important}.v-application .align-content-md-start{align-content:flex-start!important}.v-application .align-content-md-end{align-content:flex-end!important}.v-application .align-content-md-center{align-content:center!important}.v-application .align-content-md-space-between{align-content:space-between!important}.v-application .align-content-md-space-around{align-content:space-around!important}.v-application .align-content-md-stretch{align-content:stretch!important}.v-application .align-self-md-auto{align-self:auto!important}.v-application .align-self-md-start{align-self:flex-start!important}.v-application .align-self-md-end{align-self:flex-end!important}.v-application .align-self-md-center{align-self:center!important}.v-application .align-self-md-baseline{align-self:baseline!important}.v-application .align-self-md-stretch{align-self:stretch!important}.v-application .order-md-first{order:-1!important}.v-application .order-md-0{order:0!important}.v-application .order-md-1{order:1!important}.v-application .order-md-2{order:2!important}.v-application .order-md-3{order:3!important}.v-application .order-md-4{order:4!important}.v-application .order-md-5{order:5!important}.v-application .order-md-6{order:6!important}.v-application .order-md-7{order:7!important}.v-application .order-md-8{order:8!important}.v-application .order-md-9{order:9!important}.v-application .order-md-10{order:10!important}.v-application .order-md-11{order:11!important}.v-application .order-md-12{order:12!important}.v-application .order-md-last{order:13!important}.v-application .ma-md-0{margin:0!important}.v-application .ma-md-1{margin:4px!important}.v-application .ma-md-2{margin:8px!important}.v-application .ma-md-3{margin:12px!important}.v-application .ma-md-4{margin:16px!important}.v-application .ma-md-5{margin:20px!important}.v-application .ma-md-6{margin:24px!important}.v-application .ma-md-7{margin:28px!important}.v-application .ma-md-8{margin:32px!important}.v-application .ma-md-9{margin:36px!important}.v-application .ma-md-10{margin:40px!important}.v-application .ma-md-11{margin:44px!important}.v-application .ma-md-12{margin:48px!important}.v-application .ma-md-13{margin:52px!important}.v-application .ma-md-14{margin:56px!important}.v-application .ma-md-15{margin:60px!important}.v-application .ma-md-16{margin:64px!important}.v-application .ma-md-auto{margin:auto!important}.v-application .mx-md-0{margin-right:0!important;margin-left:0!important}.v-application .mx-md-1{margin-right:4px!important;margin-left:4px!important}.v-application .mx-md-2{margin-right:8px!important;margin-left:8px!important}.v-application .mx-md-3{margin-right:12px!important;margin-left:12px!important}.v-application .mx-md-4{margin-right:16px!important;margin-left:16px!important}.v-application .mx-md-5{margin-right:20px!important;margin-left:20px!important}.v-application .mx-md-6{margin-right:24px!important;margin-left:24px!important}.v-application .mx-md-7{margin-right:28px!important;margin-left:28px!important}.v-application .mx-md-8{margin-right:32px!important;margin-left:32px!important}.v-application .mx-md-9{margin-right:36px!important;margin-left:36px!important}.v-application .mx-md-10{margin-right:40px!important;margin-left:40px!important}.v-application .mx-md-11{margin-right:44px!important;margin-left:44px!important}.v-application .mx-md-12{margin-right:48px!important;margin-left:48px!important}.v-application .mx-md-13{margin-right:52px!important;margin-left:52px!important}.v-application .mx-md-14{margin-right:56px!important;margin-left:56px!important}.v-application .mx-md-15{margin-right:60px!important;margin-left:60px!important}.v-application .mx-md-16{margin-right:64px!important;margin-left:64px!important}.v-application .mx-md-auto{margin-right:auto!important;margin-left:auto!important}.v-application .my-md-0{margin-top:0!important;margin-bottom:0!important}.v-application .my-md-1{margin-top:4px!important;margin-bottom:4px!important}.v-application .my-md-2{margin-top:8px!important;margin-bottom:8px!important}.v-application .my-md-3{margin-top:12px!important;margin-bottom:12px!important}.v-application .my-md-4{margin-top:16px!important;margin-bottom:16px!important}.v-application .my-md-5{margin-top:20px!important;margin-bottom:20px!important}.v-application .my-md-6{margin-top:24px!important;margin-bottom:24px!important}.v-application .my-md-7{margin-top:28px!important;margin-bottom:28px!important}.v-application .my-md-8{margin-top:32px!important;margin-bottom:32px!important}.v-application .my-md-9{margin-top:36px!important;margin-bottom:36px!important}.v-application .my-md-10{margin-top:40px!important;margin-bottom:40px!important}.v-application .my-md-11{margin-top:44px!important;margin-bottom:44px!important}.v-application .my-md-12{margin-top:48px!important;margin-bottom:48px!important}.v-application .my-md-13{margin-top:52px!important;margin-bottom:52px!important}.v-application .my-md-14{margin-top:56px!important;margin-bottom:56px!important}.v-application .my-md-15{margin-top:60px!important;margin-bottom:60px!important}.v-application .my-md-16{margin-top:64px!important;margin-bottom:64px!important}.v-application .my-md-auto{margin-top:auto!important;margin-bottom:auto!important}.v-application .mt-md-0{margin-top:0!important}.v-application .mt-md-1{margin-top:4px!important}.v-application .mt-md-2{margin-top:8px!important}.v-application .mt-md-3{margin-top:12px!important}.v-application .mt-md-4{margin-top:16px!important}.v-application .mt-md-5{margin-top:20px!important}.v-application .mt-md-6{margin-top:24px!important}.v-application .mt-md-7{margin-top:28px!important}.v-application .mt-md-8{margin-top:32px!important}.v-application .mt-md-9{margin-top:36px!important}.v-application .mt-md-10{margin-top:40px!important}.v-application .mt-md-11{margin-top:44px!important}.v-application .mt-md-12{margin-top:48px!important}.v-application .mt-md-13{margin-top:52px!important}.v-application .mt-md-14{margin-top:56px!important}.v-application .mt-md-15{margin-top:60px!important}.v-application .mt-md-16{margin-top:64px!important}.v-application .mt-md-auto{margin-top:auto!important}.v-application .mr-md-0{margin-right:0!important}.v-application .mr-md-1{margin-right:4px!important}.v-application .mr-md-2{margin-right:8px!important}.v-application .mr-md-3{margin-right:12px!important}.v-application .mr-md-4{margin-right:16px!important}.v-application .mr-md-5{margin-right:20px!important}.v-application .mr-md-6{margin-right:24px!important}.v-application .mr-md-7{margin-right:28px!important}.v-application .mr-md-8{margin-right:32px!important}.v-application .mr-md-9{margin-right:36px!important}.v-application .mr-md-10{margin-right:40px!important}.v-application .mr-md-11{margin-right:44px!important}.v-application .mr-md-12{margin-right:48px!important}.v-application .mr-md-13{margin-right:52px!important}.v-application .mr-md-14{margin-right:56px!important}.v-application .mr-md-15{margin-right:60px!important}.v-application .mr-md-16{margin-right:64px!important}.v-application .mr-md-auto{margin-right:auto!important}.v-application .mb-md-0{margin-bottom:0!important}.v-application .mb-md-1{margin-bottom:4px!important}.v-application .mb-md-2{margin-bottom:8px!important}.v-application .mb-md-3{margin-bottom:12px!important}.v-application .mb-md-4{margin-bottom:16px!important}.v-application .mb-md-5{margin-bottom:20px!important}.v-application .mb-md-6{margin-bottom:24px!important}.v-application .mb-md-7{margin-bottom:28px!important}.v-application .mb-md-8{margin-bottom:32px!important}.v-application .mb-md-9{margin-bottom:36px!important}.v-application .mb-md-10{margin-bottom:40px!important}.v-application .mb-md-11{margin-bottom:44px!important}.v-application .mb-md-12{margin-bottom:48px!important}.v-application .mb-md-13{margin-bottom:52px!important}.v-application .mb-md-14{margin-bottom:56px!important}.v-application .mb-md-15{margin-bottom:60px!important}.v-application .mb-md-16{margin-bottom:64px!important}.v-application .mb-md-auto{margin-bottom:auto!important}.v-application .ml-md-0{margin-left:0!important}.v-application .ml-md-1{margin-left:4px!important}.v-application .ml-md-2{margin-left:8px!important}.v-application .ml-md-3{margin-left:12px!important}.v-application .ml-md-4{margin-left:16px!important}.v-application .ml-md-5{margin-left:20px!important}.v-application .ml-md-6{margin-left:24px!important}.v-application .ml-md-7{margin-left:28px!important}.v-application .ml-md-8{margin-left:32px!important}.v-application .ml-md-9{margin-left:36px!important}.v-application .ml-md-10{margin-left:40px!important}.v-application .ml-md-11{margin-left:44px!important}.v-application .ml-md-12{margin-left:48px!important}.v-application .ml-md-13{margin-left:52px!important}.v-application .ml-md-14{margin-left:56px!important}.v-application .ml-md-15{margin-left:60px!important}.v-application .ml-md-16{margin-left:64px!important}.v-application .ml-md-auto{margin-left:auto!important}.v-application--is-ltr .ms-md-0{margin-left:0!important}.v-application--is-rtl .ms-md-0{margin-right:0!important}.v-application--is-ltr .ms-md-1{margin-left:4px!important}.v-application--is-rtl .ms-md-1{margin-right:4px!important}.v-application--is-ltr .ms-md-2{margin-left:8px!important}.v-application--is-rtl .ms-md-2{margin-right:8px!important}.v-application--is-ltr .ms-md-3{margin-left:12px!important}.v-application--is-rtl .ms-md-3{margin-right:12px!important}.v-application--is-ltr .ms-md-4{margin-left:16px!important}.v-application--is-rtl .ms-md-4{margin-right:16px!important}.v-application--is-ltr .ms-md-5{margin-left:20px!important}.v-application--is-rtl .ms-md-5{margin-right:20px!important}.v-application--is-ltr .ms-md-6{margin-left:24px!important}.v-application--is-rtl .ms-md-6{margin-right:24px!important}.v-application--is-ltr .ms-md-7{margin-left:28px!important}.v-application--is-rtl .ms-md-7{margin-right:28px!important}.v-application--is-ltr .ms-md-8{margin-left:32px!important}.v-application--is-rtl .ms-md-8{margin-right:32px!important}.v-application--is-ltr .ms-md-9{margin-left:36px!important}.v-application--is-rtl .ms-md-9{margin-right:36px!important}.v-application--is-ltr .ms-md-10{margin-left:40px!important}.v-application--is-rtl .ms-md-10{margin-right:40px!important}.v-application--is-ltr .ms-md-11{margin-left:44px!important}.v-application--is-rtl .ms-md-11{margin-right:44px!important}.v-application--is-ltr .ms-md-12{margin-left:48px!important}.v-application--is-rtl .ms-md-12{margin-right:48px!important}.v-application--is-ltr .ms-md-13{margin-left:52px!important}.v-application--is-rtl .ms-md-13{margin-right:52px!important}.v-application--is-ltr .ms-md-14{margin-left:56px!important}.v-application--is-rtl .ms-md-14{margin-right:56px!important}.v-application--is-ltr .ms-md-15{margin-left:60px!important}.v-application--is-rtl .ms-md-15{margin-right:60px!important}.v-application--is-ltr .ms-md-16{margin-left:64px!important}.v-application--is-rtl .ms-md-16{margin-right:64px!important}.v-application--is-ltr .ms-md-auto{margin-left:auto!important}.v-application--is-rtl .ms-md-auto{margin-right:auto!important}.v-application--is-ltr .me-md-0{margin-right:0!important}.v-application--is-rtl .me-md-0{margin-left:0!important}.v-application--is-ltr .me-md-1{margin-right:4px!important}.v-application--is-rtl .me-md-1{margin-left:4px!important}.v-application--is-ltr .me-md-2{margin-right:8px!important}.v-application--is-rtl .me-md-2{margin-left:8px!important}.v-application--is-ltr .me-md-3{margin-right:12px!important}.v-application--is-rtl .me-md-3{margin-left:12px!important}.v-application--is-ltr .me-md-4{margin-right:16px!important}.v-application--is-rtl .me-md-4{margin-left:16px!important}.v-application--is-ltr .me-md-5{margin-right:20px!important}.v-application--is-rtl .me-md-5{margin-left:20px!important}.v-application--is-ltr .me-md-6{margin-right:24px!important}.v-application--is-rtl .me-md-6{margin-left:24px!important}.v-application--is-ltr .me-md-7{margin-right:28px!important}.v-application--is-rtl .me-md-7{margin-left:28px!important}.v-application--is-ltr .me-md-8{margin-right:32px!important}.v-application--is-rtl .me-md-8{margin-left:32px!important}.v-application--is-ltr .me-md-9{margin-right:36px!important}.v-application--is-rtl .me-md-9{margin-left:36px!important}.v-application--is-ltr .me-md-10{margin-right:40px!important}.v-application--is-rtl .me-md-10{margin-left:40px!important}.v-application--is-ltr .me-md-11{margin-right:44px!important}.v-application--is-rtl .me-md-11{margin-left:44px!important}.v-application--is-ltr .me-md-12{margin-right:48px!important}.v-application--is-rtl .me-md-12{margin-left:48px!important}.v-application--is-ltr .me-md-13{margin-right:52px!important}.v-application--is-rtl .me-md-13{margin-left:52px!important}.v-application--is-ltr .me-md-14{margin-right:56px!important}.v-application--is-rtl .me-md-14{margin-left:56px!important}.v-application--is-ltr .me-md-15{margin-right:60px!important}.v-application--is-rtl .me-md-15{margin-left:60px!important}.v-application--is-ltr .me-md-16{margin-right:64px!important}.v-application--is-rtl .me-md-16{margin-left:64px!important}.v-application--is-ltr .me-md-auto{margin-right:auto!important}.v-application--is-rtl .me-md-auto{margin-left:auto!important}.v-application .ma-md-n1{margin:-4px!important}.v-application .ma-md-n2{margin:-8px!important}.v-application .ma-md-n3{margin:-12px!important}.v-application .ma-md-n4{margin:-16px!important}.v-application .ma-md-n5{margin:-20px!important}.v-application .ma-md-n6{margin:-24px!important}.v-application .ma-md-n7{margin:-28px!important}.v-application .ma-md-n8{margin:-32px!important}.v-application .ma-md-n9{margin:-36px!important}.v-application .ma-md-n10{margin:-40px!important}.v-application .ma-md-n11{margin:-44px!important}.v-application .ma-md-n12{margin:-48px!important}.v-application .ma-md-n13{margin:-52px!important}.v-application .ma-md-n14{margin:-56px!important}.v-application .ma-md-n15{margin:-60px!important}.v-application .ma-md-n16{margin:-64px!important}.v-application .mx-md-n1{margin-right:-4px!important;margin-left:-4px!important}.v-application .mx-md-n2{margin-right:-8px!important;margin-left:-8px!important}.v-application .mx-md-n3{margin-right:-12px!important;margin-left:-12px!important}.v-application .mx-md-n4{margin-right:-16px!important;margin-left:-16px!important}.v-application .mx-md-n5{margin-right:-20px!important;margin-left:-20px!important}.v-application .mx-md-n6{margin-right:-24px!important;margin-left:-24px!important}.v-application .mx-md-n7{margin-right:-28px!important;margin-left:-28px!important}.v-application .mx-md-n8{margin-right:-32px!important;margin-left:-32px!important}.v-application .mx-md-n9{margin-right:-36px!important;margin-left:-36px!important}.v-application .mx-md-n10{margin-right:-40px!important;margin-left:-40px!important}.v-application .mx-md-n11{margin-right:-44px!important;margin-left:-44px!important}.v-application .mx-md-n12{margin-right:-48px!important;margin-left:-48px!important}.v-application .mx-md-n13{margin-right:-52px!important;margin-left:-52px!important}.v-application .mx-md-n14{margin-right:-56px!important;margin-left:-56px!important}.v-application .mx-md-n15{margin-right:-60px!important;margin-left:-60px!important}.v-application .mx-md-n16{margin-right:-64px!important;margin-left:-64px!important}.v-application .my-md-n1{margin-top:-4px!important;margin-bottom:-4px!important}.v-application .my-md-n2{margin-top:-8px!important;margin-bottom:-8px!important}.v-application .my-md-n3{margin-top:-12px!important;margin-bottom:-12px!important}.v-application .my-md-n4{margin-top:-16px!important;margin-bottom:-16px!important}.v-application .my-md-n5{margin-top:-20px!important;margin-bottom:-20px!important}.v-application .my-md-n6{margin-top:-24px!important;margin-bottom:-24px!important}.v-application .my-md-n7{margin-top:-28px!important;margin-bottom:-28px!important}.v-application .my-md-n8{margin-top:-32px!important;margin-bottom:-32px!important}.v-application .my-md-n9{margin-top:-36px!important;margin-bottom:-36px!important}.v-application .my-md-n10{margin-top:-40px!important;margin-bottom:-40px!important}.v-application .my-md-n11{margin-top:-44px!important;margin-bottom:-44px!important}.v-application .my-md-n12{margin-top:-48px!important;margin-bottom:-48px!important}.v-application .my-md-n13{margin-top:-52px!important;margin-bottom:-52px!important}.v-application .my-md-n14{margin-top:-56px!important;margin-bottom:-56px!important}.v-application .my-md-n15{margin-top:-60px!important;margin-bottom:-60px!important}.v-application .my-md-n16{margin-top:-64px!important;margin-bottom:-64px!important}.v-application .mt-md-n1{margin-top:-4px!important}.v-application .mt-md-n2{margin-top:-8px!important}.v-application .mt-md-n3{margin-top:-12px!important}.v-application .mt-md-n4{margin-top:-16px!important}.v-application .mt-md-n5{margin-top:-20px!important}.v-application .mt-md-n6{margin-top:-24px!important}.v-application .mt-md-n7{margin-top:-28px!important}.v-application .mt-md-n8{margin-top:-32px!important}.v-application .mt-md-n9{margin-top:-36px!important}.v-application .mt-md-n10{margin-top:-40px!important}.v-application .mt-md-n11{margin-top:-44px!important}.v-application .mt-md-n12{margin-top:-48px!important}.v-application .mt-md-n13{margin-top:-52px!important}.v-application .mt-md-n14{margin-top:-56px!important}.v-application .mt-md-n15{margin-top:-60px!important}.v-application .mt-md-n16{margin-top:-64px!important}.v-application .mr-md-n1{margin-right:-4px!important}.v-application .mr-md-n2{margin-right:-8px!important}.v-application .mr-md-n3{margin-right:-12px!important}.v-application .mr-md-n4{margin-right:-16px!important}.v-application .mr-md-n5{margin-right:-20px!important}.v-application .mr-md-n6{margin-right:-24px!important}.v-application .mr-md-n7{margin-right:-28px!important}.v-application .mr-md-n8{margin-right:-32px!important}.v-application .mr-md-n9{margin-right:-36px!important}.v-application .mr-md-n10{margin-right:-40px!important}.v-application .mr-md-n11{margin-right:-44px!important}.v-application .mr-md-n12{margin-right:-48px!important}.v-application .mr-md-n13{margin-right:-52px!important}.v-application .mr-md-n14{margin-right:-56px!important}.v-application .mr-md-n15{margin-right:-60px!important}.v-application .mr-md-n16{margin-right:-64px!important}.v-application .mb-md-n1{margin-bottom:-4px!important}.v-application .mb-md-n2{margin-bottom:-8px!important}.v-application .mb-md-n3{margin-bottom:-12px!important}.v-application .mb-md-n4{margin-bottom:-16px!important}.v-application .mb-md-n5{margin-bottom:-20px!important}.v-application .mb-md-n6{margin-bottom:-24px!important}.v-application .mb-md-n7{margin-bottom:-28px!important}.v-application .mb-md-n8{margin-bottom:-32px!important}.v-application .mb-md-n9{margin-bottom:-36px!important}.v-application .mb-md-n10{margin-bottom:-40px!important}.v-application .mb-md-n11{margin-bottom:-44px!important}.v-application .mb-md-n12{margin-bottom:-48px!important}.v-application .mb-md-n13{margin-bottom:-52px!important}.v-application .mb-md-n14{margin-bottom:-56px!important}.v-application .mb-md-n15{margin-bottom:-60px!important}.v-application .mb-md-n16{margin-bottom:-64px!important}.v-application .ml-md-n1{margin-left:-4px!important}.v-application .ml-md-n2{margin-left:-8px!important}.v-application .ml-md-n3{margin-left:-12px!important}.v-application .ml-md-n4{margin-left:-16px!important}.v-application .ml-md-n5{margin-left:-20px!important}.v-application .ml-md-n6{margin-left:-24px!important}.v-application .ml-md-n7{margin-left:-28px!important}.v-application .ml-md-n8{margin-left:-32px!important}.v-application .ml-md-n9{margin-left:-36px!important}.v-application .ml-md-n10{margin-left:-40px!important}.v-application .ml-md-n11{margin-left:-44px!important}.v-application .ml-md-n12{margin-left:-48px!important}.v-application .ml-md-n13{margin-left:-52px!important}.v-application .ml-md-n14{margin-left:-56px!important}.v-application .ml-md-n15{margin-left:-60px!important}.v-application .ml-md-n16{margin-left:-64px!important}.v-application--is-ltr .ms-md-n1{margin-left:-4px!important}.v-application--is-rtl .ms-md-n1{margin-right:-4px!important}.v-application--is-ltr .ms-md-n2{margin-left:-8px!important}.v-application--is-rtl .ms-md-n2{margin-right:-8px!important}.v-application--is-ltr .ms-md-n3{margin-left:-12px!important}.v-application--is-rtl .ms-md-n3{margin-right:-12px!important}.v-application--is-ltr .ms-md-n4{margin-left:-16px!important}.v-application--is-rtl .ms-md-n4{margin-right:-16px!important}.v-application--is-ltr .ms-md-n5{margin-left:-20px!important}.v-application--is-rtl .ms-md-n5{margin-right:-20px!important}.v-application--is-ltr .ms-md-n6{margin-left:-24px!important}.v-application--is-rtl .ms-md-n6{margin-right:-24px!important}.v-application--is-ltr .ms-md-n7{margin-left:-28px!important}.v-application--is-rtl .ms-md-n7{margin-right:-28px!important}.v-application--is-ltr .ms-md-n8{margin-left:-32px!important}.v-application--is-rtl .ms-md-n8{margin-right:-32px!important}.v-application--is-ltr .ms-md-n9{margin-left:-36px!important}.v-application--is-rtl .ms-md-n9{margin-right:-36px!important}.v-application--is-ltr .ms-md-n10{margin-left:-40px!important}.v-application--is-rtl .ms-md-n10{margin-right:-40px!important}.v-application--is-ltr .ms-md-n11{margin-left:-44px!important}.v-application--is-rtl .ms-md-n11{margin-right:-44px!important}.v-application--is-ltr .ms-md-n12{margin-left:-48px!important}.v-application--is-rtl .ms-md-n12{margin-right:-48px!important}.v-application--is-ltr .ms-md-n13{margin-left:-52px!important}.v-application--is-rtl .ms-md-n13{margin-right:-52px!important}.v-application--is-ltr .ms-md-n14{margin-left:-56px!important}.v-application--is-rtl .ms-md-n14{margin-right:-56px!important}.v-application--is-ltr .ms-md-n15{margin-left:-60px!important}.v-application--is-rtl .ms-md-n15{margin-right:-60px!important}.v-application--is-ltr .ms-md-n16{margin-left:-64px!important}.v-application--is-rtl .ms-md-n16{margin-right:-64px!important}.v-application--is-ltr .me-md-n1{margin-right:-4px!important}.v-application--is-rtl .me-md-n1{margin-left:-4px!important}.v-application--is-ltr .me-md-n2{margin-right:-8px!important}.v-application--is-rtl .me-md-n2{margin-left:-8px!important}.v-application--is-ltr .me-md-n3{margin-right:-12px!important}.v-application--is-rtl .me-md-n3{margin-left:-12px!important}.v-application--is-ltr .me-md-n4{margin-right:-16px!important}.v-application--is-rtl .me-md-n4{margin-left:-16px!important}.v-application--is-ltr .me-md-n5{margin-right:-20px!important}.v-application--is-rtl .me-md-n5{margin-left:-20px!important}.v-application--is-ltr .me-md-n6{margin-right:-24px!important}.v-application--is-rtl .me-md-n6{margin-left:-24px!important}.v-application--is-ltr .me-md-n7{margin-right:-28px!important}.v-application--is-rtl .me-md-n7{margin-left:-28px!important}.v-application--is-ltr .me-md-n8{margin-right:-32px!important}.v-application--is-rtl .me-md-n8{margin-left:-32px!important}.v-application--is-ltr .me-md-n9{margin-right:-36px!important}.v-application--is-rtl .me-md-n9{margin-left:-36px!important}.v-application--is-ltr .me-md-n10{margin-right:-40px!important}.v-application--is-rtl .me-md-n10{margin-left:-40px!important}.v-application--is-ltr .me-md-n11{margin-right:-44px!important}.v-application--is-rtl .me-md-n11{margin-left:-44px!important}.v-application--is-ltr .me-md-n12{margin-right:-48px!important}.v-application--is-rtl .me-md-n12{margin-left:-48px!important}.v-application--is-ltr .me-md-n13{margin-right:-52px!important}.v-application--is-rtl .me-md-n13{margin-left:-52px!important}.v-application--is-ltr .me-md-n14{margin-right:-56px!important}.v-application--is-rtl .me-md-n14{margin-left:-56px!important}.v-application--is-ltr .me-md-n15{margin-right:-60px!important}.v-application--is-rtl .me-md-n15{margin-left:-60px!important}.v-application--is-ltr .me-md-n16{margin-right:-64px!important}.v-application--is-rtl .me-md-n16{margin-left:-64px!important}.v-application .pa-md-0{padding:0!important}.v-application .pa-md-1{padding:4px!important}.v-application .pa-md-2{padding:8px!important}.v-application .pa-md-3{padding:12px!important}.v-application .pa-md-4{padding:16px!important}.v-application .pa-md-5{padding:20px!important}.v-application .pa-md-6{padding:24px!important}.v-application .pa-md-7{padding:28px!important}.v-application .pa-md-8{padding:32px!important}.v-application .pa-md-9{padding:36px!important}.v-application .pa-md-10{padding:40px!important}.v-application .pa-md-11{padding:44px!important}.v-application .pa-md-12{padding:48px!important}.v-application .pa-md-13{padding:52px!important}.v-application .pa-md-14{padding:56px!important}.v-application .pa-md-15{padding:60px!important}.v-application .pa-md-16{padding:64px!important}.v-application .px-md-0{padding-right:0!important;padding-left:0!important}.v-application .px-md-1{padding-right:4px!important;padding-left:4px!important}.v-application .px-md-2{padding-right:8px!important;padding-left:8px!important}.v-application .px-md-3{padding-right:12px!important;padding-left:12px!important}.v-application .px-md-4{padding-right:16px!important;padding-left:16px!important}.v-application .px-md-5{padding-right:20px!important;padding-left:20px!important}.v-application .px-md-6{padding-right:24px!important;padding-left:24px!important}.v-application .px-md-7{padding-right:28px!important;padding-left:28px!important}.v-application .px-md-8{padding-right:32px!important;padding-left:32px!important}.v-application .px-md-9{padding-right:36px!important;padding-left:36px!important}.v-application .px-md-10{padding-right:40px!important;padding-left:40px!important}.v-application .px-md-11{padding-right:44px!important;padding-left:44px!important}.v-application .px-md-12{padding-right:48px!important;padding-left:48px!important}.v-application .px-md-13{padding-right:52px!important;padding-left:52px!important}.v-application .px-md-14{padding-right:56px!important;padding-left:56px!important}.v-application .px-md-15{padding-right:60px!important;padding-left:60px!important}.v-application .px-md-16{padding-right:64px!important;padding-left:64px!important}.v-application .py-md-0{padding-top:0!important;padding-bottom:0!important}.v-application .py-md-1{padding-top:4px!important;padding-bottom:4px!important}.v-application .py-md-2{padding-top:8px!important;padding-bottom:8px!important}.v-application .py-md-3{padding-top:12px!important;padding-bottom:12px!important}.v-application .py-md-4{padding-top:16px!important;padding-bottom:16px!important}.v-application .py-md-5{padding-top:20px!important;padding-bottom:20px!important}.v-application .py-md-6{padding-top:24px!important;padding-bottom:24px!important}.v-application .py-md-7{padding-top:28px!important;padding-bottom:28px!important}.v-application .py-md-8{padding-top:32px!important;padding-bottom:32px!important}.v-application .py-md-9{padding-top:36px!important;padding-bottom:36px!important}.v-application .py-md-10{padding-top:40px!important;padding-bottom:40px!important}.v-application .py-md-11{padding-top:44px!important;padding-bottom:44px!important}.v-application .py-md-12{padding-top:48px!important;padding-bottom:48px!important}.v-application .py-md-13{padding-top:52px!important;padding-bottom:52px!important}.v-application .py-md-14{padding-top:56px!important;padding-bottom:56px!important}.v-application .py-md-15{padding-top:60px!important;padding-bottom:60px!important}.v-application .py-md-16{padding-top:64px!important;padding-bottom:64px!important}.v-application .pt-md-0{padding-top:0!important}.v-application .pt-md-1{padding-top:4px!important}.v-application .pt-md-2{padding-top:8px!important}.v-application .pt-md-3{padding-top:12px!important}.v-application .pt-md-4{padding-top:16px!important}.v-application .pt-md-5{padding-top:20px!important}.v-application .pt-md-6{padding-top:24px!important}.v-application .pt-md-7{padding-top:28px!important}.v-application .pt-md-8{padding-top:32px!important}.v-application .pt-md-9{padding-top:36px!important}.v-application .pt-md-10{padding-top:40px!important}.v-application .pt-md-11{padding-top:44px!important}.v-application .pt-md-12{padding-top:48px!important}.v-application .pt-md-13{padding-top:52px!important}.v-application .pt-md-14{padding-top:56px!important}.v-application .pt-md-15{padding-top:60px!important}.v-application .pt-md-16{padding-top:64px!important}.v-application .pr-md-0{padding-right:0!important}.v-application .pr-md-1{padding-right:4px!important}.v-application .pr-md-2{padding-right:8px!important}.v-application .pr-md-3{padding-right:12px!important}.v-application .pr-md-4{padding-right:16px!important}.v-application .pr-md-5{padding-right:20px!important}.v-application .pr-md-6{padding-right:24px!important}.v-application .pr-md-7{padding-right:28px!important}.v-application .pr-md-8{padding-right:32px!important}.v-application .pr-md-9{padding-right:36px!important}.v-application .pr-md-10{padding-right:40px!important}.v-application .pr-md-11{padding-right:44px!important}.v-application .pr-md-12{padding-right:48px!important}.v-application .pr-md-13{padding-right:52px!important}.v-application .pr-md-14{padding-right:56px!important}.v-application .pr-md-15{padding-right:60px!important}.v-application .pr-md-16{padding-right:64px!important}.v-application .pb-md-0{padding-bottom:0!important}.v-application .pb-md-1{padding-bottom:4px!important}.v-application .pb-md-2{padding-bottom:8px!important}.v-application .pb-md-3{padding-bottom:12px!important}.v-application .pb-md-4{padding-bottom:16px!important}.v-application .pb-md-5{padding-bottom:20px!important}.v-application .pb-md-6{padding-bottom:24px!important}.v-application .pb-md-7{padding-bottom:28px!important}.v-application .pb-md-8{padding-bottom:32px!important}.v-application .pb-md-9{padding-bottom:36px!important}.v-application .pb-md-10{padding-bottom:40px!important}.v-application .pb-md-11{padding-bottom:44px!important}.v-application .pb-md-12{padding-bottom:48px!important}.v-application .pb-md-13{padding-bottom:52px!important}.v-application .pb-md-14{padding-bottom:56px!important}.v-application .pb-md-15{padding-bottom:60px!important}.v-application .pb-md-16{padding-bottom:64px!important}.v-application .pl-md-0{padding-left:0!important}.v-application .pl-md-1{padding-left:4px!important}.v-application .pl-md-2{padding-left:8px!important}.v-application .pl-md-3{padding-left:12px!important}.v-application .pl-md-4{padding-left:16px!important}.v-application .pl-md-5{padding-left:20px!important}.v-application .pl-md-6{padding-left:24px!important}.v-application .pl-md-7{padding-left:28px!important}.v-application .pl-md-8{padding-left:32px!important}.v-application .pl-md-9{padding-left:36px!important}.v-application .pl-md-10{padding-left:40px!important}.v-application .pl-md-11{padding-left:44px!important}.v-application .pl-md-12{padding-left:48px!important}.v-application .pl-md-13{padding-left:52px!important}.v-application .pl-md-14{padding-left:56px!important}.v-application .pl-md-15{padding-left:60px!important}.v-application .pl-md-16{padding-left:64px!important}.v-application--is-ltr .ps-md-0{padding-left:0!important}.v-application--is-rtl .ps-md-0{padding-right:0!important}.v-application--is-ltr .ps-md-1{padding-left:4px!important}.v-application--is-rtl .ps-md-1{padding-right:4px!important}.v-application--is-ltr .ps-md-2{padding-left:8px!important}.v-application--is-rtl .ps-md-2{padding-right:8px!important}.v-application--is-ltr .ps-md-3{padding-left:12px!important}.v-application--is-rtl .ps-md-3{padding-right:12px!important}.v-application--is-ltr .ps-md-4{padding-left:16px!important}.v-application--is-rtl .ps-md-4{padding-right:16px!important}.v-application--is-ltr .ps-md-5{padding-left:20px!important}.v-application--is-rtl .ps-md-5{padding-right:20px!important}.v-application--is-ltr .ps-md-6{padding-left:24px!important}.v-application--is-rtl .ps-md-6{padding-right:24px!important}.v-application--is-ltr .ps-md-7{padding-left:28px!important}.v-application--is-rtl .ps-md-7{padding-right:28px!important}.v-application--is-ltr .ps-md-8{padding-left:32px!important}.v-application--is-rtl .ps-md-8{padding-right:32px!important}.v-application--is-ltr .ps-md-9{padding-left:36px!important}.v-application--is-rtl .ps-md-9{padding-right:36px!important}.v-application--is-ltr .ps-md-10{padding-left:40px!important}.v-application--is-rtl .ps-md-10{padding-right:40px!important}.v-application--is-ltr .ps-md-11{padding-left:44px!important}.v-application--is-rtl .ps-md-11{padding-right:44px!important}.v-application--is-ltr .ps-md-12{padding-left:48px!important}.v-application--is-rtl .ps-md-12{padding-right:48px!important}.v-application--is-ltr .ps-md-13{padding-left:52px!important}.v-application--is-rtl .ps-md-13{padding-right:52px!important}.v-application--is-ltr .ps-md-14{padding-left:56px!important}.v-application--is-rtl .ps-md-14{padding-right:56px!important}.v-application--is-ltr .ps-md-15{padding-left:60px!important}.v-application--is-rtl .ps-md-15{padding-right:60px!important}.v-application--is-ltr .ps-md-16{padding-left:64px!important}.v-application--is-rtl .ps-md-16{padding-right:64px!important}.v-application--is-ltr .pe-md-0{padding-right:0!important}.v-application--is-rtl .pe-md-0{padding-left:0!important}.v-application--is-ltr .pe-md-1{padding-right:4px!important}.v-application--is-rtl .pe-md-1{padding-left:4px!important}.v-application--is-ltr .pe-md-2{padding-right:8px!important}.v-application--is-rtl .pe-md-2{padding-left:8px!important}.v-application--is-ltr .pe-md-3{padding-right:12px!important}.v-application--is-rtl .pe-md-3{padding-left:12px!important}.v-application--is-ltr .pe-md-4{padding-right:16px!important}.v-application--is-rtl .pe-md-4{padding-left:16px!important}.v-application--is-ltr .pe-md-5{padding-right:20px!important}.v-application--is-rtl .pe-md-5{padding-left:20px!important}.v-application--is-ltr .pe-md-6{padding-right:24px!important}.v-application--is-rtl .pe-md-6{padding-left:24px!important}.v-application--is-ltr .pe-md-7{padding-right:28px!important}.v-application--is-rtl .pe-md-7{padding-left:28px!important}.v-application--is-ltr .pe-md-8{padding-right:32px!important}.v-application--is-rtl .pe-md-8{padding-left:32px!important}.v-application--is-ltr .pe-md-9{padding-right:36px!important}.v-application--is-rtl .pe-md-9{padding-left:36px!important}.v-application--is-ltr .pe-md-10{padding-right:40px!important}.v-application--is-rtl .pe-md-10{padding-left:40px!important}.v-application--is-ltr .pe-md-11{padding-right:44px!important}.v-application--is-rtl .pe-md-11{padding-left:44px!important}.v-application--is-ltr .pe-md-12{padding-right:48px!important}.v-application--is-rtl .pe-md-12{padding-left:48px!important}.v-application--is-ltr .pe-md-13{padding-right:52px!important}.v-application--is-rtl .pe-md-13{padding-left:52px!important}.v-application--is-ltr .pe-md-14{padding-right:56px!important}.v-application--is-rtl .pe-md-14{padding-left:56px!important}.v-application--is-ltr .pe-md-15{padding-right:60px!important}.v-application--is-rtl .pe-md-15{padding-left:60px!important}.v-application--is-ltr .pe-md-16{padding-right:64px!important}.v-application--is-rtl .pe-md-16{padding-left:64px!important}.v-application .text-md-left{text-align:left!important}.v-application .text-md-right{text-align:right!important}.v-application .text-md-center{text-align:center!important}.v-application .text-md-justify{text-align:justify!important}.v-application .text-md-start{text-align:start!important}.v-application .text-md-end{text-align:end!important}.v-application .text-md-h1{font-size:6rem!important;line-height:6rem;letter-spacing:-.015625em!important}.v-application .text-md-h1,.v-application .text-md-h2{font-weight:300;font-family:Roboto,sans-serif!important}.v-application .text-md-h2{font-size:3.75rem!important;line-height:3.75rem;letter-spacing:-.0083333333em!important}.v-application .text-md-h3{font-size:3rem!important;line-height:3.125rem;letter-spacing:normal!important}.v-application .text-md-h3,.v-application .text-md-h4{font-weight:400;font-family:Roboto,sans-serif!important}.v-application .text-md-h4{font-size:2.125rem!important;line-height:2.5rem;letter-spacing:.0073529412em!important}.v-application .text-md-h5{font-size:1.5rem!important;font-weight:400;letter-spacing:normal!important}.v-application .text-md-h5,.v-application .text-md-h6{line-height:2rem;font-family:Roboto,sans-serif!important}.v-application .text-md-h6{font-size:1.25rem!important;font-weight:500;letter-spacing:.0125em!important}.v-application .text-md-subtitle-1{font-size:1rem!important;font-weight:400;line-height:1.75rem;letter-spacing:.009375em!important;font-family:Roboto,sans-serif!important}.v-application .text-md-subtitle-2{font-size:.875rem!important;font-weight:500;line-height:1.375rem;letter-spacing:.0071428571em!important;font-family:Roboto,sans-serif!important}.v-application .text-md-body-1{font-size:1rem!important;font-weight:400;line-height:1.5rem;letter-spacing:.03125em!important;font-family:Roboto,sans-serif!important}.v-application .text-md-body-2{font-weight:400;line-height:1.25rem;letter-spacing:.0178571429em!important}.v-application .text-md-body-2,.v-application .text-md-button{font-size:.875rem!important;font-family:Roboto,sans-serif!important}.v-application .text-md-button{font-weight:500;line-height:2.25rem;letter-spacing:.0892857143em!important;text-transform:uppercase!important}.v-application .text-md-caption{font-weight:400;line-height:1.25rem;letter-spacing:.0333333333em!important}.v-application .text-md-caption,.v-application .text-md-overline{font-size:.75rem!important;font-family:Roboto,sans-serif!important}.v-application .text-md-overline{font-weight:500;line-height:2rem;letter-spacing:.1666666667em!important;text-transform:uppercase!important}}@media(min-width:1264px){.v-application .d-lg-none{display:none!important}.v-application .d-lg-inline{display:inline!important}.v-application .d-lg-inline-block{display:inline-block!important}.v-application .d-lg-block{display:block!important}.v-application .d-lg-table{display:table!important}.v-application .d-lg-table-row{display:table-row!important}.v-application .d-lg-table-cell{display:table-cell!important}.v-application .d-lg-flex{display:flex!important}.v-application .d-lg-inline-flex{display:inline-flex!important}.v-application .float-lg-none{float:none!important}.v-application .float-lg-left{float:left!important}.v-application .float-lg-right{float:right!important}.v-application--is-rtl .float-lg-end{float:left!important}.v-application--is-ltr .float-lg-end,.v-application--is-rtl .float-lg-start{float:right!important}.v-application--is-ltr .float-lg-start{float:left!important}.v-application .flex-lg-fill{flex:1 1 auto!important}.v-application .flex-lg-row{flex-direction:row!important}.v-application .flex-lg-column{flex-direction:column!important}.v-application .flex-lg-row-reverse{flex-direction:row-reverse!important}.v-application .flex-lg-column-reverse{flex-direction:column-reverse!important}.v-application .flex-lg-grow-0{flex-grow:0!important}.v-application .flex-lg-grow-1{flex-grow:1!important}.v-application .flex-lg-shrink-0{flex-shrink:0!important}.v-application .flex-lg-shrink-1{flex-shrink:1!important}.v-application .flex-lg-wrap{flex-wrap:wrap!important}.v-application .flex-lg-nowrap{flex-wrap:nowrap!important}.v-application .flex-lg-wrap-reverse{flex-wrap:wrap-reverse!important}.v-application .justify-lg-start{justify-content:flex-start!important}.v-application .justify-lg-end{justify-content:flex-end!important}.v-application .justify-lg-center{justify-content:center!important}.v-application .justify-lg-space-between{justify-content:space-between!important}.v-application .justify-lg-space-around{justify-content:space-around!important}.v-application .align-lg-start{align-items:flex-start!important}.v-application .align-lg-end{align-items:flex-end!important}.v-application .align-lg-center{align-items:center!important}.v-application .align-lg-baseline{align-items:baseline!important}.v-application .align-lg-stretch{align-items:stretch!important}.v-application .align-content-lg-start{align-content:flex-start!important}.v-application .align-content-lg-end{align-content:flex-end!important}.v-application .align-content-lg-center{align-content:center!important}.v-application .align-content-lg-space-between{align-content:space-between!important}.v-application .align-content-lg-space-around{align-content:space-around!important}.v-application .align-content-lg-stretch{align-content:stretch!important}.v-application .align-self-lg-auto{align-self:auto!important}.v-application .align-self-lg-start{align-self:flex-start!important}.v-application .align-self-lg-end{align-self:flex-end!important}.v-application .align-self-lg-center{align-self:center!important}.v-application .align-self-lg-baseline{align-self:baseline!important}.v-application .align-self-lg-stretch{align-self:stretch!important}.v-application .order-lg-first{order:-1!important}.v-application .order-lg-0{order:0!important}.v-application .order-lg-1{order:1!important}.v-application .order-lg-2{order:2!important}.v-application .order-lg-3{order:3!important}.v-application .order-lg-4{order:4!important}.v-application .order-lg-5{order:5!important}.v-application .order-lg-6{order:6!important}.v-application .order-lg-7{order:7!important}.v-application .order-lg-8{order:8!important}.v-application .order-lg-9{order:9!important}.v-application .order-lg-10{order:10!important}.v-application .order-lg-11{order:11!important}.v-application .order-lg-12{order:12!important}.v-application .order-lg-last{order:13!important}.v-application .ma-lg-0{margin:0!important}.v-application .ma-lg-1{margin:4px!important}.v-application .ma-lg-2{margin:8px!important}.v-application .ma-lg-3{margin:12px!important}.v-application .ma-lg-4{margin:16px!important}.v-application .ma-lg-5{margin:20px!important}.v-application .ma-lg-6{margin:24px!important}.v-application .ma-lg-7{margin:28px!important}.v-application .ma-lg-8{margin:32px!important}.v-application .ma-lg-9{margin:36px!important}.v-application .ma-lg-10{margin:40px!important}.v-application .ma-lg-11{margin:44px!important}.v-application .ma-lg-12{margin:48px!important}.v-application .ma-lg-13{margin:52px!important}.v-application .ma-lg-14{margin:56px!important}.v-application .ma-lg-15{margin:60px!important}.v-application .ma-lg-16{margin:64px!important}.v-application .ma-lg-auto{margin:auto!important}.v-application .mx-lg-0{margin-right:0!important;margin-left:0!important}.v-application .mx-lg-1{margin-right:4px!important;margin-left:4px!important}.v-application .mx-lg-2{margin-right:8px!important;margin-left:8px!important}.v-application .mx-lg-3{margin-right:12px!important;margin-left:12px!important}.v-application .mx-lg-4{margin-right:16px!important;margin-left:16px!important}.v-application .mx-lg-5{margin-right:20px!important;margin-left:20px!important}.v-application .mx-lg-6{margin-right:24px!important;margin-left:24px!important}.v-application .mx-lg-7{margin-right:28px!important;margin-left:28px!important}.v-application .mx-lg-8{margin-right:32px!important;margin-left:32px!important}.v-application .mx-lg-9{margin-right:36px!important;margin-left:36px!important}.v-application .mx-lg-10{margin-right:40px!important;margin-left:40px!important}.v-application .mx-lg-11{margin-right:44px!important;margin-left:44px!important}.v-application .mx-lg-12{margin-right:48px!important;margin-left:48px!important}.v-application .mx-lg-13{margin-right:52px!important;margin-left:52px!important}.v-application .mx-lg-14{margin-right:56px!important;margin-left:56px!important}.v-application .mx-lg-15{margin-right:60px!important;margin-left:60px!important}.v-application .mx-lg-16{margin-right:64px!important;margin-left:64px!important}.v-application .mx-lg-auto{margin-right:auto!important;margin-left:auto!important}.v-application .my-lg-0{margin-top:0!important;margin-bottom:0!important}.v-application .my-lg-1{margin-top:4px!important;margin-bottom:4px!important}.v-application .my-lg-2{margin-top:8px!important;margin-bottom:8px!important}.v-application .my-lg-3{margin-top:12px!important;margin-bottom:12px!important}.v-application .my-lg-4{margin-top:16px!important;margin-bottom:16px!important}.v-application .my-lg-5{margin-top:20px!important;margin-bottom:20px!important}.v-application .my-lg-6{margin-top:24px!important;margin-bottom:24px!important}.v-application .my-lg-7{margin-top:28px!important;margin-bottom:28px!important}.v-application .my-lg-8{margin-top:32px!important;margin-bottom:32px!important}.v-application .my-lg-9{margin-top:36px!important;margin-bottom:36px!important}.v-application .my-lg-10{margin-top:40px!important;margin-bottom:40px!important}.v-application .my-lg-11{margin-top:44px!important;margin-bottom:44px!important}.v-application .my-lg-12{margin-top:48px!important;margin-bottom:48px!important}.v-application .my-lg-13{margin-top:52px!important;margin-bottom:52px!important}.v-application .my-lg-14{margin-top:56px!important;margin-bottom:56px!important}.v-application .my-lg-15{margin-top:60px!important;margin-bottom:60px!important}.v-application .my-lg-16{margin-top:64px!important;margin-bottom:64px!important}.v-application .my-lg-auto{margin-top:auto!important;margin-bottom:auto!important}.v-application .mt-lg-0{margin-top:0!important}.v-application .mt-lg-1{margin-top:4px!important}.v-application .mt-lg-2{margin-top:8px!important}.v-application .mt-lg-3{margin-top:12px!important}.v-application .mt-lg-4{margin-top:16px!important}.v-application .mt-lg-5{margin-top:20px!important}.v-application .mt-lg-6{margin-top:24px!important}.v-application .mt-lg-7{margin-top:28px!important}.v-application .mt-lg-8{margin-top:32px!important}.v-application .mt-lg-9{margin-top:36px!important}.v-application .mt-lg-10{margin-top:40px!important}.v-application .mt-lg-11{margin-top:44px!important}.v-application .mt-lg-12{margin-top:48px!important}.v-application .mt-lg-13{margin-top:52px!important}.v-application .mt-lg-14{margin-top:56px!important}.v-application .mt-lg-15{margin-top:60px!important}.v-application .mt-lg-16{margin-top:64px!important}.v-application .mt-lg-auto{margin-top:auto!important}.v-application .mr-lg-0{margin-right:0!important}.v-application .mr-lg-1{margin-right:4px!important}.v-application .mr-lg-2{margin-right:8px!important}.v-application .mr-lg-3{margin-right:12px!important}.v-application .mr-lg-4{margin-right:16px!important}.v-application .mr-lg-5{margin-right:20px!important}.v-application .mr-lg-6{margin-right:24px!important}.v-application .mr-lg-7{margin-right:28px!important}.v-application .mr-lg-8{margin-right:32px!important}.v-application .mr-lg-9{margin-right:36px!important}.v-application .mr-lg-10{margin-right:40px!important}.v-application .mr-lg-11{margin-right:44px!important}.v-application .mr-lg-12{margin-right:48px!important}.v-application .mr-lg-13{margin-right:52px!important}.v-application .mr-lg-14{margin-right:56px!important}.v-application .mr-lg-15{margin-right:60px!important}.v-application .mr-lg-16{margin-right:64px!important}.v-application .mr-lg-auto{margin-right:auto!important}.v-application .mb-lg-0{margin-bottom:0!important}.v-application .mb-lg-1{margin-bottom:4px!important}.v-application .mb-lg-2{margin-bottom:8px!important}.v-application .mb-lg-3{margin-bottom:12px!important}.v-application .mb-lg-4{margin-bottom:16px!important}.v-application .mb-lg-5{margin-bottom:20px!important}.v-application .mb-lg-6{margin-bottom:24px!important}.v-application .mb-lg-7{margin-bottom:28px!important}.v-application .mb-lg-8{margin-bottom:32px!important}.v-application .mb-lg-9{margin-bottom:36px!important}.v-application .mb-lg-10{margin-bottom:40px!important}.v-application .mb-lg-11{margin-bottom:44px!important}.v-application .mb-lg-12{margin-bottom:48px!important}.v-application .mb-lg-13{margin-bottom:52px!important}.v-application .mb-lg-14{margin-bottom:56px!important}.v-application .mb-lg-15{margin-bottom:60px!important}.v-application .mb-lg-16{margin-bottom:64px!important}.v-application .mb-lg-auto{margin-bottom:auto!important}.v-application .ml-lg-0{margin-left:0!important}.v-application .ml-lg-1{margin-left:4px!important}.v-application .ml-lg-2{margin-left:8px!important}.v-application .ml-lg-3{margin-left:12px!important}.v-application .ml-lg-4{margin-left:16px!important}.v-application .ml-lg-5{margin-left:20px!important}.v-application .ml-lg-6{margin-left:24px!important}.v-application .ml-lg-7{margin-left:28px!important}.v-application .ml-lg-8{margin-left:32px!important}.v-application .ml-lg-9{margin-left:36px!important}.v-application .ml-lg-10{margin-left:40px!important}.v-application .ml-lg-11{margin-left:44px!important}.v-application .ml-lg-12{margin-left:48px!important}.v-application .ml-lg-13{margin-left:52px!important}.v-application .ml-lg-14{margin-left:56px!important}.v-application .ml-lg-15{margin-left:60px!important}.v-application .ml-lg-16{margin-left:64px!important}.v-application .ml-lg-auto{margin-left:auto!important}.v-application--is-ltr .ms-lg-0{margin-left:0!important}.v-application--is-rtl .ms-lg-0{margin-right:0!important}.v-application--is-ltr .ms-lg-1{margin-left:4px!important}.v-application--is-rtl .ms-lg-1{margin-right:4px!important}.v-application--is-ltr .ms-lg-2{margin-left:8px!important}.v-application--is-rtl .ms-lg-2{margin-right:8px!important}.v-application--is-ltr .ms-lg-3{margin-left:12px!important}.v-application--is-rtl .ms-lg-3{margin-right:12px!important}.v-application--is-ltr .ms-lg-4{margin-left:16px!important}.v-application--is-rtl .ms-lg-4{margin-right:16px!important}.v-application--is-ltr .ms-lg-5{margin-left:20px!important}.v-application--is-rtl .ms-lg-5{margin-right:20px!important}.v-application--is-ltr .ms-lg-6{margin-left:24px!important}.v-application--is-rtl .ms-lg-6{margin-right:24px!important}.v-application--is-ltr .ms-lg-7{margin-left:28px!important}.v-application--is-rtl .ms-lg-7{margin-right:28px!important}.v-application--is-ltr .ms-lg-8{margin-left:32px!important}.v-application--is-rtl .ms-lg-8{margin-right:32px!important}.v-application--is-ltr .ms-lg-9{margin-left:36px!important}.v-application--is-rtl .ms-lg-9{margin-right:36px!important}.v-application--is-ltr .ms-lg-10{margin-left:40px!important}.v-application--is-rtl .ms-lg-10{margin-right:40px!important}.v-application--is-ltr .ms-lg-11{margin-left:44px!important}.v-application--is-rtl .ms-lg-11{margin-right:44px!important}.v-application--is-ltr .ms-lg-12{margin-left:48px!important}.v-application--is-rtl .ms-lg-12{margin-right:48px!important}.v-application--is-ltr .ms-lg-13{margin-left:52px!important}.v-application--is-rtl .ms-lg-13{margin-right:52px!important}.v-application--is-ltr .ms-lg-14{margin-left:56px!important}.v-application--is-rtl .ms-lg-14{margin-right:56px!important}.v-application--is-ltr .ms-lg-15{margin-left:60px!important}.v-application--is-rtl .ms-lg-15{margin-right:60px!important}.v-application--is-ltr .ms-lg-16{margin-left:64px!important}.v-application--is-rtl .ms-lg-16{margin-right:64px!important}.v-application--is-ltr .ms-lg-auto{margin-left:auto!important}.v-application--is-rtl .ms-lg-auto{margin-right:auto!important}.v-application--is-ltr .me-lg-0{margin-right:0!important}.v-application--is-rtl .me-lg-0{margin-left:0!important}.v-application--is-ltr .me-lg-1{margin-right:4px!important}.v-application--is-rtl .me-lg-1{margin-left:4px!important}.v-application--is-ltr .me-lg-2{margin-right:8px!important}.v-application--is-rtl .me-lg-2{margin-left:8px!important}.v-application--is-ltr .me-lg-3{margin-right:12px!important}.v-application--is-rtl .me-lg-3{margin-left:12px!important}.v-application--is-ltr .me-lg-4{margin-right:16px!important}.v-application--is-rtl .me-lg-4{margin-left:16px!important}.v-application--is-ltr .me-lg-5{margin-right:20px!important}.v-application--is-rtl .me-lg-5{margin-left:20px!important}.v-application--is-ltr .me-lg-6{margin-right:24px!important}.v-application--is-rtl .me-lg-6{margin-left:24px!important}.v-application--is-ltr .me-lg-7{margin-right:28px!important}.v-application--is-rtl .me-lg-7{margin-left:28px!important}.v-application--is-ltr .me-lg-8{margin-right:32px!important}.v-application--is-rtl .me-lg-8{margin-left:32px!important}.v-application--is-ltr .me-lg-9{margin-right:36px!important}.v-application--is-rtl .me-lg-9{margin-left:36px!important}.v-application--is-ltr .me-lg-10{margin-right:40px!important}.v-application--is-rtl .me-lg-10{margin-left:40px!important}.v-application--is-ltr .me-lg-11{margin-right:44px!important}.v-application--is-rtl .me-lg-11{margin-left:44px!important}.v-application--is-ltr .me-lg-12{margin-right:48px!important}.v-application--is-rtl .me-lg-12{margin-left:48px!important}.v-application--is-ltr .me-lg-13{margin-right:52px!important}.v-application--is-rtl .me-lg-13{margin-left:52px!important}.v-application--is-ltr .me-lg-14{margin-right:56px!important}.v-application--is-rtl .me-lg-14{margin-left:56px!important}.v-application--is-ltr .me-lg-15{margin-right:60px!important}.v-application--is-rtl .me-lg-15{margin-left:60px!important}.v-application--is-ltr .me-lg-16{margin-right:64px!important}.v-application--is-rtl .me-lg-16{margin-left:64px!important}.v-application--is-ltr .me-lg-auto{margin-right:auto!important}.v-application--is-rtl .me-lg-auto{margin-left:auto!important}.v-application .ma-lg-n1{margin:-4px!important}.v-application .ma-lg-n2{margin:-8px!important}.v-application .ma-lg-n3{margin:-12px!important}.v-application .ma-lg-n4{margin:-16px!important}.v-application .ma-lg-n5{margin:-20px!important}.v-application .ma-lg-n6{margin:-24px!important}.v-application .ma-lg-n7{margin:-28px!important}.v-application .ma-lg-n8{margin:-32px!important}.v-application .ma-lg-n9{margin:-36px!important}.v-application .ma-lg-n10{margin:-40px!important}.v-application .ma-lg-n11{margin:-44px!important}.v-application .ma-lg-n12{margin:-48px!important}.v-application .ma-lg-n13{margin:-52px!important}.v-application .ma-lg-n14{margin:-56px!important}.v-application .ma-lg-n15{margin:-60px!important}.v-application .ma-lg-n16{margin:-64px!important}.v-application .mx-lg-n1{margin-right:-4px!important;margin-left:-4px!important}.v-application .mx-lg-n2{margin-right:-8px!important;margin-left:-8px!important}.v-application .mx-lg-n3{margin-right:-12px!important;margin-left:-12px!important}.v-application .mx-lg-n4{margin-right:-16px!important;margin-left:-16px!important}.v-application .mx-lg-n5{margin-right:-20px!important;margin-left:-20px!important}.v-application .mx-lg-n6{margin-right:-24px!important;margin-left:-24px!important}.v-application .mx-lg-n7{margin-right:-28px!important;margin-left:-28px!important}.v-application .mx-lg-n8{margin-right:-32px!important;margin-left:-32px!important}.v-application .mx-lg-n9{margin-right:-36px!important;margin-left:-36px!important}.v-application .mx-lg-n10{margin-right:-40px!important;margin-left:-40px!important}.v-application .mx-lg-n11{margin-right:-44px!important;margin-left:-44px!important}.v-application .mx-lg-n12{margin-right:-48px!important;margin-left:-48px!important}.v-application .mx-lg-n13{margin-right:-52px!important;margin-left:-52px!important}.v-application .mx-lg-n14{margin-right:-56px!important;margin-left:-56px!important}.v-application .mx-lg-n15{margin-right:-60px!important;margin-left:-60px!important}.v-application .mx-lg-n16{margin-right:-64px!important;margin-left:-64px!important}.v-application .my-lg-n1{margin-top:-4px!important;margin-bottom:-4px!important}.v-application .my-lg-n2{margin-top:-8px!important;margin-bottom:-8px!important}.v-application .my-lg-n3{margin-top:-12px!important;margin-bottom:-12px!important}.v-application .my-lg-n4{margin-top:-16px!important;margin-bottom:-16px!important}.v-application .my-lg-n5{margin-top:-20px!important;margin-bottom:-20px!important}.v-application .my-lg-n6{margin-top:-24px!important;margin-bottom:-24px!important}.v-application .my-lg-n7{margin-top:-28px!important;margin-bottom:-28px!important}.v-application .my-lg-n8{margin-top:-32px!important;margin-bottom:-32px!important}.v-application .my-lg-n9{margin-top:-36px!important;margin-bottom:-36px!important}.v-application .my-lg-n10{margin-top:-40px!important;margin-bottom:-40px!important}.v-application .my-lg-n11{margin-top:-44px!important;margin-bottom:-44px!important}.v-application .my-lg-n12{margin-top:-48px!important;margin-bottom:-48px!important}.v-application .my-lg-n13{margin-top:-52px!important;margin-bottom:-52px!important}.v-application .my-lg-n14{margin-top:-56px!important;margin-bottom:-56px!important}.v-application .my-lg-n15{margin-top:-60px!important;margin-bottom:-60px!important}.v-application .my-lg-n16{margin-top:-64px!important;margin-bottom:-64px!important}.v-application .mt-lg-n1{margin-top:-4px!important}.v-application .mt-lg-n2{margin-top:-8px!important}.v-application .mt-lg-n3{margin-top:-12px!important}.v-application .mt-lg-n4{margin-top:-16px!important}.v-application .mt-lg-n5{margin-top:-20px!important}.v-application .mt-lg-n6{margin-top:-24px!important}.v-application .mt-lg-n7{margin-top:-28px!important}.v-application .mt-lg-n8{margin-top:-32px!important}.v-application .mt-lg-n9{margin-top:-36px!important}.v-application .mt-lg-n10{margin-top:-40px!important}.v-application .mt-lg-n11{margin-top:-44px!important}.v-application .mt-lg-n12{margin-top:-48px!important}.v-application .mt-lg-n13{margin-top:-52px!important}.v-application .mt-lg-n14{margin-top:-56px!important}.v-application .mt-lg-n15{margin-top:-60px!important}.v-application .mt-lg-n16{margin-top:-64px!important}.v-application .mr-lg-n1{margin-right:-4px!important}.v-application .mr-lg-n2{margin-right:-8px!important}.v-application .mr-lg-n3{margin-right:-12px!important}.v-application .mr-lg-n4{margin-right:-16px!important}.v-application .mr-lg-n5{margin-right:-20px!important}.v-application .mr-lg-n6{margin-right:-24px!important}.v-application .mr-lg-n7{margin-right:-28px!important}.v-application .mr-lg-n8{margin-right:-32px!important}.v-application .mr-lg-n9{margin-right:-36px!important}.v-application .mr-lg-n10{margin-right:-40px!important}.v-application .mr-lg-n11{margin-right:-44px!important}.v-application .mr-lg-n12{margin-right:-48px!important}.v-application .mr-lg-n13{margin-right:-52px!important}.v-application .mr-lg-n14{margin-right:-56px!important}.v-application .mr-lg-n15{margin-right:-60px!important}.v-application .mr-lg-n16{margin-right:-64px!important}.v-application .mb-lg-n1{margin-bottom:-4px!important}.v-application .mb-lg-n2{margin-bottom:-8px!important}.v-application .mb-lg-n3{margin-bottom:-12px!important}.v-application .mb-lg-n4{margin-bottom:-16px!important}.v-application .mb-lg-n5{margin-bottom:-20px!important}.v-application .mb-lg-n6{margin-bottom:-24px!important}.v-application .mb-lg-n7{margin-bottom:-28px!important}.v-application .mb-lg-n8{margin-bottom:-32px!important}.v-application .mb-lg-n9{margin-bottom:-36px!important}.v-application .mb-lg-n10{margin-bottom:-40px!important}.v-application .mb-lg-n11{margin-bottom:-44px!important}.v-application .mb-lg-n12{margin-bottom:-48px!important}.v-application .mb-lg-n13{margin-bottom:-52px!important}.v-application .mb-lg-n14{margin-bottom:-56px!important}.v-application .mb-lg-n15{margin-bottom:-60px!important}.v-application .mb-lg-n16{margin-bottom:-64px!important}.v-application .ml-lg-n1{margin-left:-4px!important}.v-application .ml-lg-n2{margin-left:-8px!important}.v-application .ml-lg-n3{margin-left:-12px!important}.v-application .ml-lg-n4{margin-left:-16px!important}.v-application .ml-lg-n5{margin-left:-20px!important}.v-application .ml-lg-n6{margin-left:-24px!important}.v-application .ml-lg-n7{margin-left:-28px!important}.v-application .ml-lg-n8{margin-left:-32px!important}.v-application .ml-lg-n9{margin-left:-36px!important}.v-application .ml-lg-n10{margin-left:-40px!important}.v-application .ml-lg-n11{margin-left:-44px!important}.v-application .ml-lg-n12{margin-left:-48px!important}.v-application .ml-lg-n13{margin-left:-52px!important}.v-application .ml-lg-n14{margin-left:-56px!important}.v-application .ml-lg-n15{margin-left:-60px!important}.v-application .ml-lg-n16{margin-left:-64px!important}.v-application--is-ltr .ms-lg-n1{margin-left:-4px!important}.v-application--is-rtl .ms-lg-n1{margin-right:-4px!important}.v-application--is-ltr .ms-lg-n2{margin-left:-8px!important}.v-application--is-rtl .ms-lg-n2{margin-right:-8px!important}.v-application--is-ltr .ms-lg-n3{margin-left:-12px!important}.v-application--is-rtl .ms-lg-n3{margin-right:-12px!important}.v-application--is-ltr .ms-lg-n4{margin-left:-16px!important}.v-application--is-rtl .ms-lg-n4{margin-right:-16px!important}.v-application--is-ltr .ms-lg-n5{margin-left:-20px!important}.v-application--is-rtl .ms-lg-n5{margin-right:-20px!important}.v-application--is-ltr .ms-lg-n6{margin-left:-24px!important}.v-application--is-rtl .ms-lg-n6{margin-right:-24px!important}.v-application--is-ltr .ms-lg-n7{margin-left:-28px!important}.v-application--is-rtl .ms-lg-n7{margin-right:-28px!important}.v-application--is-ltr .ms-lg-n8{margin-left:-32px!important}.v-application--is-rtl .ms-lg-n8{margin-right:-32px!important}.v-application--is-ltr .ms-lg-n9{margin-left:-36px!important}.v-application--is-rtl .ms-lg-n9{margin-right:-36px!important}.v-application--is-ltr .ms-lg-n10{margin-left:-40px!important}.v-application--is-rtl .ms-lg-n10{margin-right:-40px!important}.v-application--is-ltr .ms-lg-n11{margin-left:-44px!important}.v-application--is-rtl .ms-lg-n11{margin-right:-44px!important}.v-application--is-ltr .ms-lg-n12{margin-left:-48px!important}.v-application--is-rtl .ms-lg-n12{margin-right:-48px!important}.v-application--is-ltr .ms-lg-n13{margin-left:-52px!important}.v-application--is-rtl .ms-lg-n13{margin-right:-52px!important}.v-application--is-ltr .ms-lg-n14{margin-left:-56px!important}.v-application--is-rtl .ms-lg-n14{margin-right:-56px!important}.v-application--is-ltr .ms-lg-n15{margin-left:-60px!important}.v-application--is-rtl .ms-lg-n15{margin-right:-60px!important}.v-application--is-ltr .ms-lg-n16{margin-left:-64px!important}.v-application--is-rtl .ms-lg-n16{margin-right:-64px!important}.v-application--is-ltr .me-lg-n1{margin-right:-4px!important}.v-application--is-rtl .me-lg-n1{margin-left:-4px!important}.v-application--is-ltr .me-lg-n2{margin-right:-8px!important}.v-application--is-rtl .me-lg-n2{margin-left:-8px!important}.v-application--is-ltr .me-lg-n3{margin-right:-12px!important}.v-application--is-rtl .me-lg-n3{margin-left:-12px!important}.v-application--is-ltr .me-lg-n4{margin-right:-16px!important}.v-application--is-rtl .me-lg-n4{margin-left:-16px!important}.v-application--is-ltr .me-lg-n5{margin-right:-20px!important}.v-application--is-rtl .me-lg-n5{margin-left:-20px!important}.v-application--is-ltr .me-lg-n6{margin-right:-24px!important}.v-application--is-rtl .me-lg-n6{margin-left:-24px!important}.v-application--is-ltr .me-lg-n7{margin-right:-28px!important}.v-application--is-rtl .me-lg-n7{margin-left:-28px!important}.v-application--is-ltr .me-lg-n8{margin-right:-32px!important}.v-application--is-rtl .me-lg-n8{margin-left:-32px!important}.v-application--is-ltr .me-lg-n9{margin-right:-36px!important}.v-application--is-rtl .me-lg-n9{margin-left:-36px!important}.v-application--is-ltr .me-lg-n10{margin-right:-40px!important}.v-application--is-rtl .me-lg-n10{margin-left:-40px!important}.v-application--is-ltr .me-lg-n11{margin-right:-44px!important}.v-application--is-rtl .me-lg-n11{margin-left:-44px!important}.v-application--is-ltr .me-lg-n12{margin-right:-48px!important}.v-application--is-rtl .me-lg-n12{margin-left:-48px!important}.v-application--is-ltr .me-lg-n13{margin-right:-52px!important}.v-application--is-rtl .me-lg-n13{margin-left:-52px!important}.v-application--is-ltr .me-lg-n14{margin-right:-56px!important}.v-application--is-rtl .me-lg-n14{margin-left:-56px!important}.v-application--is-ltr .me-lg-n15{margin-right:-60px!important}.v-application--is-rtl .me-lg-n15{margin-left:-60px!important}.v-application--is-ltr .me-lg-n16{margin-right:-64px!important}.v-application--is-rtl .me-lg-n16{margin-left:-64px!important}.v-application .pa-lg-0{padding:0!important}.v-application .pa-lg-1{padding:4px!important}.v-application .pa-lg-2{padding:8px!important}.v-application .pa-lg-3{padding:12px!important}.v-application .pa-lg-4{padding:16px!important}.v-application .pa-lg-5{padding:20px!important}.v-application .pa-lg-6{padding:24px!important}.v-application .pa-lg-7{padding:28px!important}.v-application .pa-lg-8{padding:32px!important}.v-application .pa-lg-9{padding:36px!important}.v-application .pa-lg-10{padding:40px!important}.v-application .pa-lg-11{padding:44px!important}.v-application .pa-lg-12{padding:48px!important}.v-application .pa-lg-13{padding:52px!important}.v-application .pa-lg-14{padding:56px!important}.v-application .pa-lg-15{padding:60px!important}.v-application .pa-lg-16{padding:64px!important}.v-application .px-lg-0{padding-right:0!important;padding-left:0!important}.v-application .px-lg-1{padding-right:4px!important;padding-left:4px!important}.v-application .px-lg-2{padding-right:8px!important;padding-left:8px!important}.v-application .px-lg-3{padding-right:12px!important;padding-left:12px!important}.v-application .px-lg-4{padding-right:16px!important;padding-left:16px!important}.v-application .px-lg-5{padding-right:20px!important;padding-left:20px!important}.v-application .px-lg-6{padding-right:24px!important;padding-left:24px!important}.v-application .px-lg-7{padding-right:28px!important;padding-left:28px!important}.v-application .px-lg-8{padding-right:32px!important;padding-left:32px!important}.v-application .px-lg-9{padding-right:36px!important;padding-left:36px!important}.v-application .px-lg-10{padding-right:40px!important;padding-left:40px!important}.v-application .px-lg-11{padding-right:44px!important;padding-left:44px!important}.v-application .px-lg-12{padding-right:48px!important;padding-left:48px!important}.v-application .px-lg-13{padding-right:52px!important;padding-left:52px!important}.v-application .px-lg-14{padding-right:56px!important;padding-left:56px!important}.v-application .px-lg-15{padding-right:60px!important;padding-left:60px!important}.v-application .px-lg-16{padding-right:64px!important;padding-left:64px!important}.v-application .py-lg-0{padding-top:0!important;padding-bottom:0!important}.v-application .py-lg-1{padding-top:4px!important;padding-bottom:4px!important}.v-application .py-lg-2{padding-top:8px!important;padding-bottom:8px!important}.v-application .py-lg-3{padding-top:12px!important;padding-bottom:12px!important}.v-application .py-lg-4{padding-top:16px!important;padding-bottom:16px!important}.v-application .py-lg-5{padding-top:20px!important;padding-bottom:20px!important}.v-application .py-lg-6{padding-top:24px!important;padding-bottom:24px!important}.v-application .py-lg-7{padding-top:28px!important;padding-bottom:28px!important}.v-application .py-lg-8{padding-top:32px!important;padding-bottom:32px!important}.v-application .py-lg-9{padding-top:36px!important;padding-bottom:36px!important}.v-application .py-lg-10{padding-top:40px!important;padding-bottom:40px!important}.v-application .py-lg-11{padding-top:44px!important;padding-bottom:44px!important}.v-application .py-lg-12{padding-top:48px!important;padding-bottom:48px!important}.v-application .py-lg-13{padding-top:52px!important;padding-bottom:52px!important}.v-application .py-lg-14{padding-top:56px!important;padding-bottom:56px!important}.v-application .py-lg-15{padding-top:60px!important;padding-bottom:60px!important}.v-application .py-lg-16{padding-top:64px!important;padding-bottom:64px!important}.v-application .pt-lg-0{padding-top:0!important}.v-application .pt-lg-1{padding-top:4px!important}.v-application .pt-lg-2{padding-top:8px!important}.v-application .pt-lg-3{padding-top:12px!important}.v-application .pt-lg-4{padding-top:16px!important}.v-application .pt-lg-5{padding-top:20px!important}.v-application .pt-lg-6{padding-top:24px!important}.v-application .pt-lg-7{padding-top:28px!important}.v-application .pt-lg-8{padding-top:32px!important}.v-application .pt-lg-9{padding-top:36px!important}.v-application .pt-lg-10{padding-top:40px!important}.v-application .pt-lg-11{padding-top:44px!important}.v-application .pt-lg-12{padding-top:48px!important}.v-application .pt-lg-13{padding-top:52px!important}.v-application .pt-lg-14{padding-top:56px!important}.v-application .pt-lg-15{padding-top:60px!important}.v-application .pt-lg-16{padding-top:64px!important}.v-application .pr-lg-0{padding-right:0!important}.v-application .pr-lg-1{padding-right:4px!important}.v-application .pr-lg-2{padding-right:8px!important}.v-application .pr-lg-3{padding-right:12px!important}.v-application .pr-lg-4{padding-right:16px!important}.v-application .pr-lg-5{padding-right:20px!important}.v-application .pr-lg-6{padding-right:24px!important}.v-application .pr-lg-7{padding-right:28px!important}.v-application .pr-lg-8{padding-right:32px!important}.v-application .pr-lg-9{padding-right:36px!important}.v-application .pr-lg-10{padding-right:40px!important}.v-application .pr-lg-11{padding-right:44px!important}.v-application .pr-lg-12{padding-right:48px!important}.v-application .pr-lg-13{padding-right:52px!important}.v-application .pr-lg-14{padding-right:56px!important}.v-application .pr-lg-15{padding-right:60px!important}.v-application .pr-lg-16{padding-right:64px!important}.v-application .pb-lg-0{padding-bottom:0!important}.v-application .pb-lg-1{padding-bottom:4px!important}.v-application .pb-lg-2{padding-bottom:8px!important}.v-application .pb-lg-3{padding-bottom:12px!important}.v-application .pb-lg-4{padding-bottom:16px!important}.v-application .pb-lg-5{padding-bottom:20px!important}.v-application .pb-lg-6{padding-bottom:24px!important}.v-application .pb-lg-7{padding-bottom:28px!important}.v-application .pb-lg-8{padding-bottom:32px!important}.v-application .pb-lg-9{padding-bottom:36px!important}.v-application .pb-lg-10{padding-bottom:40px!important}.v-application .pb-lg-11{padding-bottom:44px!important}.v-application .pb-lg-12{padding-bottom:48px!important}.v-application .pb-lg-13{padding-bottom:52px!important}.v-application .pb-lg-14{padding-bottom:56px!important}.v-application .pb-lg-15{padding-bottom:60px!important}.v-application .pb-lg-16{padding-bottom:64px!important}.v-application .pl-lg-0{padding-left:0!important}.v-application .pl-lg-1{padding-left:4px!important}.v-application .pl-lg-2{padding-left:8px!important}.v-application .pl-lg-3{padding-left:12px!important}.v-application .pl-lg-4{padding-left:16px!important}.v-application .pl-lg-5{padding-left:20px!important}.v-application .pl-lg-6{padding-left:24px!important}.v-application .pl-lg-7{padding-left:28px!important}.v-application .pl-lg-8{padding-left:32px!important}.v-application .pl-lg-9{padding-left:36px!important}.v-application .pl-lg-10{padding-left:40px!important}.v-application .pl-lg-11{padding-left:44px!important}.v-application .pl-lg-12{padding-left:48px!important}.v-application .pl-lg-13{padding-left:52px!important}.v-application .pl-lg-14{padding-left:56px!important}.v-application .pl-lg-15{padding-left:60px!important}.v-application .pl-lg-16{padding-left:64px!important}.v-application--is-ltr .ps-lg-0{padding-left:0!important}.v-application--is-rtl .ps-lg-0{padding-right:0!important}.v-application--is-ltr .ps-lg-1{padding-left:4px!important}.v-application--is-rtl .ps-lg-1{padding-right:4px!important}.v-application--is-ltr .ps-lg-2{padding-left:8px!important}.v-application--is-rtl .ps-lg-2{padding-right:8px!important}.v-application--is-ltr .ps-lg-3{padding-left:12px!important}.v-application--is-rtl .ps-lg-3{padding-right:12px!important}.v-application--is-ltr .ps-lg-4{padding-left:16px!important}.v-application--is-rtl .ps-lg-4{padding-right:16px!important}.v-application--is-ltr .ps-lg-5{padding-left:20px!important}.v-application--is-rtl .ps-lg-5{padding-right:20px!important}.v-application--is-ltr .ps-lg-6{padding-left:24px!important}.v-application--is-rtl .ps-lg-6{padding-right:24px!important}.v-application--is-ltr .ps-lg-7{padding-left:28px!important}.v-application--is-rtl .ps-lg-7{padding-right:28px!important}.v-application--is-ltr .ps-lg-8{padding-left:32px!important}.v-application--is-rtl .ps-lg-8{padding-right:32px!important}.v-application--is-ltr .ps-lg-9{padding-left:36px!important}.v-application--is-rtl .ps-lg-9{padding-right:36px!important}.v-application--is-ltr .ps-lg-10{padding-left:40px!important}.v-application--is-rtl .ps-lg-10{padding-right:40px!important}.v-application--is-ltr .ps-lg-11{padding-left:44px!important}.v-application--is-rtl .ps-lg-11{padding-right:44px!important}.v-application--is-ltr .ps-lg-12{padding-left:48px!important}.v-application--is-rtl .ps-lg-12{padding-right:48px!important}.v-application--is-ltr .ps-lg-13{padding-left:52px!important}.v-application--is-rtl .ps-lg-13{padding-right:52px!important}.v-application--is-ltr .ps-lg-14{padding-left:56px!important}.v-application--is-rtl .ps-lg-14{padding-right:56px!important}.v-application--is-ltr .ps-lg-15{padding-left:60px!important}.v-application--is-rtl .ps-lg-15{padding-right:60px!important}.v-application--is-ltr .ps-lg-16{padding-left:64px!important}.v-application--is-rtl .ps-lg-16{padding-right:64px!important}.v-application--is-ltr .pe-lg-0{padding-right:0!important}.v-application--is-rtl .pe-lg-0{padding-left:0!important}.v-application--is-ltr .pe-lg-1{padding-right:4px!important}.v-application--is-rtl .pe-lg-1{padding-left:4px!important}.v-application--is-ltr .pe-lg-2{padding-right:8px!important}.v-application--is-rtl .pe-lg-2{padding-left:8px!important}.v-application--is-ltr .pe-lg-3{padding-right:12px!important}.v-application--is-rtl .pe-lg-3{padding-left:12px!important}.v-application--is-ltr .pe-lg-4{padding-right:16px!important}.v-application--is-rtl .pe-lg-4{padding-left:16px!important}.v-application--is-ltr .pe-lg-5{padding-right:20px!important}.v-application--is-rtl .pe-lg-5{padding-left:20px!important}.v-application--is-ltr .pe-lg-6{padding-right:24px!important}.v-application--is-rtl .pe-lg-6{padding-left:24px!important}.v-application--is-ltr .pe-lg-7{padding-right:28px!important}.v-application--is-rtl .pe-lg-7{padding-left:28px!important}.v-application--is-ltr .pe-lg-8{padding-right:32px!important}.v-application--is-rtl .pe-lg-8{padding-left:32px!important}.v-application--is-ltr .pe-lg-9{padding-right:36px!important}.v-application--is-rtl .pe-lg-9{padding-left:36px!important}.v-application--is-ltr .pe-lg-10{padding-right:40px!important}.v-application--is-rtl .pe-lg-10{padding-left:40px!important}.v-application--is-ltr .pe-lg-11{padding-right:44px!important}.v-application--is-rtl .pe-lg-11{padding-left:44px!important}.v-application--is-ltr .pe-lg-12{padding-right:48px!important}.v-application--is-rtl .pe-lg-12{padding-left:48px!important}.v-application--is-ltr .pe-lg-13{padding-right:52px!important}.v-application--is-rtl .pe-lg-13{padding-left:52px!important}.v-application--is-ltr .pe-lg-14{padding-right:56px!important}.v-application--is-rtl .pe-lg-14{padding-left:56px!important}.v-application--is-ltr .pe-lg-15{padding-right:60px!important}.v-application--is-rtl .pe-lg-15{padding-left:60px!important}.v-application--is-ltr .pe-lg-16{padding-right:64px!important}.v-application--is-rtl .pe-lg-16{padding-left:64px!important}.v-application .text-lg-left{text-align:left!important}.v-application .text-lg-right{text-align:right!important}.v-application .text-lg-center{text-align:center!important}.v-application .text-lg-justify{text-align:justify!important}.v-application .text-lg-start{text-align:start!important}.v-application .text-lg-end{text-align:end!important}.v-application .text-lg-h1{font-size:6rem!important;line-height:6rem;letter-spacing:-.015625em!important}.v-application .text-lg-h1,.v-application .text-lg-h2{font-weight:300;font-family:Roboto,sans-serif!important}.v-application .text-lg-h2{font-size:3.75rem!important;line-height:3.75rem;letter-spacing:-.0083333333em!important}.v-application .text-lg-h3{font-size:3rem!important;line-height:3.125rem;letter-spacing:normal!important}.v-application .text-lg-h3,.v-application .text-lg-h4{font-weight:400;font-family:Roboto,sans-serif!important}.v-application .text-lg-h4{font-size:2.125rem!important;line-height:2.5rem;letter-spacing:.0073529412em!important}.v-application .text-lg-h5{font-size:1.5rem!important;font-weight:400;letter-spacing:normal!important}.v-application .text-lg-h5,.v-application .text-lg-h6{line-height:2rem;font-family:Roboto,sans-serif!important}.v-application .text-lg-h6{font-size:1.25rem!important;font-weight:500;letter-spacing:.0125em!important}.v-application .text-lg-subtitle-1{font-size:1rem!important;font-weight:400;line-height:1.75rem;letter-spacing:.009375em!important;font-family:Roboto,sans-serif!important}.v-application .text-lg-subtitle-2{font-size:.875rem!important;font-weight:500;line-height:1.375rem;letter-spacing:.0071428571em!important;font-family:Roboto,sans-serif!important}.v-application .text-lg-body-1{font-size:1rem!important;font-weight:400;line-height:1.5rem;letter-spacing:.03125em!important;font-family:Roboto,sans-serif!important}.v-application .text-lg-body-2{font-weight:400;line-height:1.25rem;letter-spacing:.0178571429em!important}.v-application .text-lg-body-2,.v-application .text-lg-button{font-size:.875rem!important;font-family:Roboto,sans-serif!important}.v-application .text-lg-button{font-weight:500;line-height:2.25rem;letter-spacing:.0892857143em!important;text-transform:uppercase!important}.v-application .text-lg-caption{font-weight:400;line-height:1.25rem;letter-spacing:.0333333333em!important}.v-application .text-lg-caption,.v-application .text-lg-overline{font-size:.75rem!important;font-family:Roboto,sans-serif!important}.v-application .text-lg-overline{font-weight:500;line-height:2rem;letter-spacing:.1666666667em!important;text-transform:uppercase!important}}@media(min-width:1904px){.v-application .d-xl-none{display:none!important}.v-application .d-xl-inline{display:inline!important}.v-application .d-xl-inline-block{display:inline-block!important}.v-application .d-xl-block{display:block!important}.v-application .d-xl-table{display:table!important}.v-application .d-xl-table-row{display:table-row!important}.v-application .d-xl-table-cell{display:table-cell!important}.v-application .d-xl-flex{display:flex!important}.v-application .d-xl-inline-flex{display:inline-flex!important}.v-application .float-xl-none{float:none!important}.v-application .float-xl-left{float:left!important}.v-application .float-xl-right{float:right!important}.v-application--is-rtl .float-xl-end{float:left!important}.v-application--is-ltr .float-xl-end,.v-application--is-rtl .float-xl-start{float:right!important}.v-application--is-ltr .float-xl-start{float:left!important}.v-application .flex-xl-fill{flex:1 1 auto!important}.v-application .flex-xl-row{flex-direction:row!important}.v-application .flex-xl-column{flex-direction:column!important}.v-application .flex-xl-row-reverse{flex-direction:row-reverse!important}.v-application .flex-xl-column-reverse{flex-direction:column-reverse!important}.v-application .flex-xl-grow-0{flex-grow:0!important}.v-application .flex-xl-grow-1{flex-grow:1!important}.v-application .flex-xl-shrink-0{flex-shrink:0!important}.v-application .flex-xl-shrink-1{flex-shrink:1!important}.v-application .flex-xl-wrap{flex-wrap:wrap!important}.v-application .flex-xl-nowrap{flex-wrap:nowrap!important}.v-application .flex-xl-wrap-reverse{flex-wrap:wrap-reverse!important}.v-application .justify-xl-start{justify-content:flex-start!important}.v-application .justify-xl-end{justify-content:flex-end!important}.v-application .justify-xl-center{justify-content:center!important}.v-application .justify-xl-space-between{justify-content:space-between!important}.v-application .justify-xl-space-around{justify-content:space-around!important}.v-application .align-xl-start{align-items:flex-start!important}.v-application .align-xl-end{align-items:flex-end!important}.v-application .align-xl-center{align-items:center!important}.v-application .align-xl-baseline{align-items:baseline!important}.v-application .align-xl-stretch{align-items:stretch!important}.v-application .align-content-xl-start{align-content:flex-start!important}.v-application .align-content-xl-end{align-content:flex-end!important}.v-application .align-content-xl-center{align-content:center!important}.v-application .align-content-xl-space-between{align-content:space-between!important}.v-application .align-content-xl-space-around{align-content:space-around!important}.v-application .align-content-xl-stretch{align-content:stretch!important}.v-application .align-self-xl-auto{align-self:auto!important}.v-application .align-self-xl-start{align-self:flex-start!important}.v-application .align-self-xl-end{align-self:flex-end!important}.v-application .align-self-xl-center{align-self:center!important}.v-application .align-self-xl-baseline{align-self:baseline!important}.v-application .align-self-xl-stretch{align-self:stretch!important}.v-application .order-xl-first{order:-1!important}.v-application .order-xl-0{order:0!important}.v-application .order-xl-1{order:1!important}.v-application .order-xl-2{order:2!important}.v-application .order-xl-3{order:3!important}.v-application .order-xl-4{order:4!important}.v-application .order-xl-5{order:5!important}.v-application .order-xl-6{order:6!important}.v-application .order-xl-7{order:7!important}.v-application .order-xl-8{order:8!important}.v-application .order-xl-9{order:9!important}.v-application .order-xl-10{order:10!important}.v-application .order-xl-11{order:11!important}.v-application .order-xl-12{order:12!important}.v-application .order-xl-last{order:13!important}.v-application .ma-xl-0{margin:0!important}.v-application .ma-xl-1{margin:4px!important}.v-application .ma-xl-2{margin:8px!important}.v-application .ma-xl-3{margin:12px!important}.v-application .ma-xl-4{margin:16px!important}.v-application .ma-xl-5{margin:20px!important}.v-application .ma-xl-6{margin:24px!important}.v-application .ma-xl-7{margin:28px!important}.v-application .ma-xl-8{margin:32px!important}.v-application .ma-xl-9{margin:36px!important}.v-application .ma-xl-10{margin:40px!important}.v-application .ma-xl-11{margin:44px!important}.v-application .ma-xl-12{margin:48px!important}.v-application .ma-xl-13{margin:52px!important}.v-application .ma-xl-14{margin:56px!important}.v-application .ma-xl-15{margin:60px!important}.v-application .ma-xl-16{margin:64px!important}.v-application .ma-xl-auto{margin:auto!important}.v-application .mx-xl-0{margin-right:0!important;margin-left:0!important}.v-application .mx-xl-1{margin-right:4px!important;margin-left:4px!important}.v-application .mx-xl-2{margin-right:8px!important;margin-left:8px!important}.v-application .mx-xl-3{margin-right:12px!important;margin-left:12px!important}.v-application .mx-xl-4{margin-right:16px!important;margin-left:16px!important}.v-application .mx-xl-5{margin-right:20px!important;margin-left:20px!important}.v-application .mx-xl-6{margin-right:24px!important;margin-left:24px!important}.v-application .mx-xl-7{margin-right:28px!important;margin-left:28px!important}.v-application .mx-xl-8{margin-right:32px!important;margin-left:32px!important}.v-application .mx-xl-9{margin-right:36px!important;margin-left:36px!important}.v-application .mx-xl-10{margin-right:40px!important;margin-left:40px!important}.v-application .mx-xl-11{margin-right:44px!important;margin-left:44px!important}.v-application .mx-xl-12{margin-right:48px!important;margin-left:48px!important}.v-application .mx-xl-13{margin-right:52px!important;margin-left:52px!important}.v-application .mx-xl-14{margin-right:56px!important;margin-left:56px!important}.v-application .mx-xl-15{margin-right:60px!important;margin-left:60px!important}.v-application .mx-xl-16{margin-right:64px!important;margin-left:64px!important}.v-application .mx-xl-auto{margin-right:auto!important;margin-left:auto!important}.v-application .my-xl-0{margin-top:0!important;margin-bottom:0!important}.v-application .my-xl-1{margin-top:4px!important;margin-bottom:4px!important}.v-application .my-xl-2{margin-top:8px!important;margin-bottom:8px!important}.v-application .my-xl-3{margin-top:12px!important;margin-bottom:12px!important}.v-application .my-xl-4{margin-top:16px!important;margin-bottom:16px!important}.v-application .my-xl-5{margin-top:20px!important;margin-bottom:20px!important}.v-application .my-xl-6{margin-top:24px!important;margin-bottom:24px!important}.v-application .my-xl-7{margin-top:28px!important;margin-bottom:28px!important}.v-application .my-xl-8{margin-top:32px!important;margin-bottom:32px!important}.v-application .my-xl-9{margin-top:36px!important;margin-bottom:36px!important}.v-application .my-xl-10{margin-top:40px!important;margin-bottom:40px!important}.v-application .my-xl-11{margin-top:44px!important;margin-bottom:44px!important}.v-application .my-xl-12{margin-top:48px!important;margin-bottom:48px!important}.v-application .my-xl-13{margin-top:52px!important;margin-bottom:52px!important}.v-application .my-xl-14{margin-top:56px!important;margin-bottom:56px!important}.v-application .my-xl-15{margin-top:60px!important;margin-bottom:60px!important}.v-application .my-xl-16{margin-top:64px!important;margin-bottom:64px!important}.v-application .my-xl-auto{margin-top:auto!important;margin-bottom:auto!important}.v-application .mt-xl-0{margin-top:0!important}.v-application .mt-xl-1{margin-top:4px!important}.v-application .mt-xl-2{margin-top:8px!important}.v-application .mt-xl-3{margin-top:12px!important}.v-application .mt-xl-4{margin-top:16px!important}.v-application .mt-xl-5{margin-top:20px!important}.v-application .mt-xl-6{margin-top:24px!important}.v-application .mt-xl-7{margin-top:28px!important}.v-application .mt-xl-8{margin-top:32px!important}.v-application .mt-xl-9{margin-top:36px!important}.v-application .mt-xl-10{margin-top:40px!important}.v-application .mt-xl-11{margin-top:44px!important}.v-application .mt-xl-12{margin-top:48px!important}.v-application .mt-xl-13{margin-top:52px!important}.v-application .mt-xl-14{margin-top:56px!important}.v-application .mt-xl-15{margin-top:60px!important}.v-application .mt-xl-16{margin-top:64px!important}.v-application .mt-xl-auto{margin-top:auto!important}.v-application .mr-xl-0{margin-right:0!important}.v-application .mr-xl-1{margin-right:4px!important}.v-application .mr-xl-2{margin-right:8px!important}.v-application .mr-xl-3{margin-right:12px!important}.v-application .mr-xl-4{margin-right:16px!important}.v-application .mr-xl-5{margin-right:20px!important}.v-application .mr-xl-6{margin-right:24px!important}.v-application .mr-xl-7{margin-right:28px!important}.v-application .mr-xl-8{margin-right:32px!important}.v-application .mr-xl-9{margin-right:36px!important}.v-application .mr-xl-10{margin-right:40px!important}.v-application .mr-xl-11{margin-right:44px!important}.v-application .mr-xl-12{margin-right:48px!important}.v-application .mr-xl-13{margin-right:52px!important}.v-application .mr-xl-14{margin-right:56px!important}.v-application .mr-xl-15{margin-right:60px!important}.v-application .mr-xl-16{margin-right:64px!important}.v-application .mr-xl-auto{margin-right:auto!important}.v-application .mb-xl-0{margin-bottom:0!important}.v-application .mb-xl-1{margin-bottom:4px!important}.v-application .mb-xl-2{margin-bottom:8px!important}.v-application .mb-xl-3{margin-bottom:12px!important}.v-application .mb-xl-4{margin-bottom:16px!important}.v-application .mb-xl-5{margin-bottom:20px!important}.v-application .mb-xl-6{margin-bottom:24px!important}.v-application .mb-xl-7{margin-bottom:28px!important}.v-application .mb-xl-8{margin-bottom:32px!important}.v-application .mb-xl-9{margin-bottom:36px!important}.v-application .mb-xl-10{margin-bottom:40px!important}.v-application .mb-xl-11{margin-bottom:44px!important}.v-application .mb-xl-12{margin-bottom:48px!important}.v-application .mb-xl-13{margin-bottom:52px!important}.v-application .mb-xl-14{margin-bottom:56px!important}.v-application .mb-xl-15{margin-bottom:60px!important}.v-application .mb-xl-16{margin-bottom:64px!important}.v-application .mb-xl-auto{margin-bottom:auto!important}.v-application .ml-xl-0{margin-left:0!important}.v-application .ml-xl-1{margin-left:4px!important}.v-application .ml-xl-2{margin-left:8px!important}.v-application .ml-xl-3{margin-left:12px!important}.v-application .ml-xl-4{margin-left:16px!important}.v-application .ml-xl-5{margin-left:20px!important}.v-application .ml-xl-6{margin-left:24px!important}.v-application .ml-xl-7{margin-left:28px!important}.v-application .ml-xl-8{margin-left:32px!important}.v-application .ml-xl-9{margin-left:36px!important}.v-application .ml-xl-10{margin-left:40px!important}.v-application .ml-xl-11{margin-left:44px!important}.v-application .ml-xl-12{margin-left:48px!important}.v-application .ml-xl-13{margin-left:52px!important}.v-application .ml-xl-14{margin-left:56px!important}.v-application .ml-xl-15{margin-left:60px!important}.v-application .ml-xl-16{margin-left:64px!important}.v-application .ml-xl-auto{margin-left:auto!important}.v-application--is-ltr .ms-xl-0{margin-left:0!important}.v-application--is-rtl .ms-xl-0{margin-right:0!important}.v-application--is-ltr .ms-xl-1{margin-left:4px!important}.v-application--is-rtl .ms-xl-1{margin-right:4px!important}.v-application--is-ltr .ms-xl-2{margin-left:8px!important}.v-application--is-rtl .ms-xl-2{margin-right:8px!important}.v-application--is-ltr .ms-xl-3{margin-left:12px!important}.v-application--is-rtl .ms-xl-3{margin-right:12px!important}.v-application--is-ltr .ms-xl-4{margin-left:16px!important}.v-application--is-rtl .ms-xl-4{margin-right:16px!important}.v-application--is-ltr .ms-xl-5{margin-left:20px!important}.v-application--is-rtl .ms-xl-5{margin-right:20px!important}.v-application--is-ltr .ms-xl-6{margin-left:24px!important}.v-application--is-rtl .ms-xl-6{margin-right:24px!important}.v-application--is-ltr .ms-xl-7{margin-left:28px!important}.v-application--is-rtl .ms-xl-7{margin-right:28px!important}.v-application--is-ltr .ms-xl-8{margin-left:32px!important}.v-application--is-rtl .ms-xl-8{margin-right:32px!important}.v-application--is-ltr .ms-xl-9{margin-left:36px!important}.v-application--is-rtl .ms-xl-9{margin-right:36px!important}.v-application--is-ltr .ms-xl-10{margin-left:40px!important}.v-application--is-rtl .ms-xl-10{margin-right:40px!important}.v-application--is-ltr .ms-xl-11{margin-left:44px!important}.v-application--is-rtl .ms-xl-11{margin-right:44px!important}.v-application--is-ltr .ms-xl-12{margin-left:48px!important}.v-application--is-rtl .ms-xl-12{margin-right:48px!important}.v-application--is-ltr .ms-xl-13{margin-left:52px!important}.v-application--is-rtl .ms-xl-13{margin-right:52px!important}.v-application--is-ltr .ms-xl-14{margin-left:56px!important}.v-application--is-rtl .ms-xl-14{margin-right:56px!important}.v-application--is-ltr .ms-xl-15{margin-left:60px!important}.v-application--is-rtl .ms-xl-15{margin-right:60px!important}.v-application--is-ltr .ms-xl-16{margin-left:64px!important}.v-application--is-rtl .ms-xl-16{margin-right:64px!important}.v-application--is-ltr .ms-xl-auto{margin-left:auto!important}.v-application--is-rtl .ms-xl-auto{margin-right:auto!important}.v-application--is-ltr .me-xl-0{margin-right:0!important}.v-application--is-rtl .me-xl-0{margin-left:0!important}.v-application--is-ltr .me-xl-1{margin-right:4px!important}.v-application--is-rtl .me-xl-1{margin-left:4px!important}.v-application--is-ltr .me-xl-2{margin-right:8px!important}.v-application--is-rtl .me-xl-2{margin-left:8px!important}.v-application--is-ltr .me-xl-3{margin-right:12px!important}.v-application--is-rtl .me-xl-3{margin-left:12px!important}.v-application--is-ltr .me-xl-4{margin-right:16px!important}.v-application--is-rtl .me-xl-4{margin-left:16px!important}.v-application--is-ltr .me-xl-5{margin-right:20px!important}.v-application--is-rtl .me-xl-5{margin-left:20px!important}.v-application--is-ltr .me-xl-6{margin-right:24px!important}.v-application--is-rtl .me-xl-6{margin-left:24px!important}.v-application--is-ltr .me-xl-7{margin-right:28px!important}.v-application--is-rtl .me-xl-7{margin-left:28px!important}.v-application--is-ltr .me-xl-8{margin-right:32px!important}.v-application--is-rtl .me-xl-8{margin-left:32px!important}.v-application--is-ltr .me-xl-9{margin-right:36px!important}.v-application--is-rtl .me-xl-9{margin-left:36px!important}.v-application--is-ltr .me-xl-10{margin-right:40px!important}.v-application--is-rtl .me-xl-10{margin-left:40px!important}.v-application--is-ltr .me-xl-11{margin-right:44px!important}.v-application--is-rtl .me-xl-11{margin-left:44px!important}.v-application--is-ltr .me-xl-12{margin-right:48px!important}.v-application--is-rtl .me-xl-12{margin-left:48px!important}.v-application--is-ltr .me-xl-13{margin-right:52px!important}.v-application--is-rtl .me-xl-13{margin-left:52px!important}.v-application--is-ltr .me-xl-14{margin-right:56px!important}.v-application--is-rtl .me-xl-14{margin-left:56px!important}.v-application--is-ltr .me-xl-15{margin-right:60px!important}.v-application--is-rtl .me-xl-15{margin-left:60px!important}.v-application--is-ltr .me-xl-16{margin-right:64px!important}.v-application--is-rtl .me-xl-16{margin-left:64px!important}.v-application--is-ltr .me-xl-auto{margin-right:auto!important}.v-application--is-rtl .me-xl-auto{margin-left:auto!important}.v-application .ma-xl-n1{margin:-4px!important}.v-application .ma-xl-n2{margin:-8px!important}.v-application .ma-xl-n3{margin:-12px!important}.v-application .ma-xl-n4{margin:-16px!important}.v-application .ma-xl-n5{margin:-20px!important}.v-application .ma-xl-n6{margin:-24px!important}.v-application .ma-xl-n7{margin:-28px!important}.v-application .ma-xl-n8{margin:-32px!important}.v-application .ma-xl-n9{margin:-36px!important}.v-application .ma-xl-n10{margin:-40px!important}.v-application .ma-xl-n11{margin:-44px!important}.v-application .ma-xl-n12{margin:-48px!important}.v-application .ma-xl-n13{margin:-52px!important}.v-application .ma-xl-n14{margin:-56px!important}.v-application .ma-xl-n15{margin:-60px!important}.v-application .ma-xl-n16{margin:-64px!important}.v-application .mx-xl-n1{margin-right:-4px!important;margin-left:-4px!important}.v-application .mx-xl-n2{margin-right:-8px!important;margin-left:-8px!important}.v-application .mx-xl-n3{margin-right:-12px!important;margin-left:-12px!important}.v-application .mx-xl-n4{margin-right:-16px!important;margin-left:-16px!important}.v-application .mx-xl-n5{margin-right:-20px!important;margin-left:-20px!important}.v-application .mx-xl-n6{margin-right:-24px!important;margin-left:-24px!important}.v-application .mx-xl-n7{margin-right:-28px!important;margin-left:-28px!important}.v-application .mx-xl-n8{margin-right:-32px!important;margin-left:-32px!important}.v-application .mx-xl-n9{margin-right:-36px!important;margin-left:-36px!important}.v-application .mx-xl-n10{margin-right:-40px!important;margin-left:-40px!important}.v-application .mx-xl-n11{margin-right:-44px!important;margin-left:-44px!important}.v-application .mx-xl-n12{margin-right:-48px!important;margin-left:-48px!important}.v-application .mx-xl-n13{margin-right:-52px!important;margin-left:-52px!important}.v-application .mx-xl-n14{margin-right:-56px!important;margin-left:-56px!important}.v-application .mx-xl-n15{margin-right:-60px!important;margin-left:-60px!important}.v-application .mx-xl-n16{margin-right:-64px!important;margin-left:-64px!important}.v-application .my-xl-n1{margin-top:-4px!important;margin-bottom:-4px!important}.v-application .my-xl-n2{margin-top:-8px!important;margin-bottom:-8px!important}.v-application .my-xl-n3{margin-top:-12px!important;margin-bottom:-12px!important}.v-application .my-xl-n4{margin-top:-16px!important;margin-bottom:-16px!important}.v-application .my-xl-n5{margin-top:-20px!important;margin-bottom:-20px!important}.v-application .my-xl-n6{margin-top:-24px!important;margin-bottom:-24px!important}.v-application .my-xl-n7{margin-top:-28px!important;margin-bottom:-28px!important}.v-application .my-xl-n8{margin-top:-32px!important;margin-bottom:-32px!important}.v-application .my-xl-n9{margin-top:-36px!important;margin-bottom:-36px!important}.v-application .my-xl-n10{margin-top:-40px!important;margin-bottom:-40px!important}.v-application .my-xl-n11{margin-top:-44px!important;margin-bottom:-44px!important}.v-application .my-xl-n12{margin-top:-48px!important;margin-bottom:-48px!important}.v-application .my-xl-n13{margin-top:-52px!important;margin-bottom:-52px!important}.v-application .my-xl-n14{margin-top:-56px!important;margin-bottom:-56px!important}.v-application .my-xl-n15{margin-top:-60px!important;margin-bottom:-60px!important}.v-application .my-xl-n16{margin-top:-64px!important;margin-bottom:-64px!important}.v-application .mt-xl-n1{margin-top:-4px!important}.v-application .mt-xl-n2{margin-top:-8px!important}.v-application .mt-xl-n3{margin-top:-12px!important}.v-application .mt-xl-n4{margin-top:-16px!important}.v-application .mt-xl-n5{margin-top:-20px!important}.v-application .mt-xl-n6{margin-top:-24px!important}.v-application .mt-xl-n7{margin-top:-28px!important}.v-application .mt-xl-n8{margin-top:-32px!important}.v-application .mt-xl-n9{margin-top:-36px!important}.v-application .mt-xl-n10{margin-top:-40px!important}.v-application .mt-xl-n11{margin-top:-44px!important}.v-application .mt-xl-n12{margin-top:-48px!important}.v-application .mt-xl-n13{margin-top:-52px!important}.v-application .mt-xl-n14{margin-top:-56px!important}.v-application .mt-xl-n15{margin-top:-60px!important}.v-application .mt-xl-n16{margin-top:-64px!important}.v-application .mr-xl-n1{margin-right:-4px!important}.v-application .mr-xl-n2{margin-right:-8px!important}.v-application .mr-xl-n3{margin-right:-12px!important}.v-application .mr-xl-n4{margin-right:-16px!important}.v-application .mr-xl-n5{margin-right:-20px!important}.v-application .mr-xl-n6{margin-right:-24px!important}.v-application .mr-xl-n7{margin-right:-28px!important}.v-application .mr-xl-n8{margin-right:-32px!important}.v-application .mr-xl-n9{margin-right:-36px!important}.v-application .mr-xl-n10{margin-right:-40px!important}.v-application .mr-xl-n11{margin-right:-44px!important}.v-application .mr-xl-n12{margin-right:-48px!important}.v-application .mr-xl-n13{margin-right:-52px!important}.v-application .mr-xl-n14{margin-right:-56px!important}.v-application .mr-xl-n15{margin-right:-60px!important}.v-application .mr-xl-n16{margin-right:-64px!important}.v-application .mb-xl-n1{margin-bottom:-4px!important}.v-application .mb-xl-n2{margin-bottom:-8px!important}.v-application .mb-xl-n3{margin-bottom:-12px!important}.v-application .mb-xl-n4{margin-bottom:-16px!important}.v-application .mb-xl-n5{margin-bottom:-20px!important}.v-application .mb-xl-n6{margin-bottom:-24px!important}.v-application .mb-xl-n7{margin-bottom:-28px!important}.v-application .mb-xl-n8{margin-bottom:-32px!important}.v-application .mb-xl-n9{margin-bottom:-36px!important}.v-application .mb-xl-n10{margin-bottom:-40px!important}.v-application .mb-xl-n11{margin-bottom:-44px!important}.v-application .mb-xl-n12{margin-bottom:-48px!important}.v-application .mb-xl-n13{margin-bottom:-52px!important}.v-application .mb-xl-n14{margin-bottom:-56px!important}.v-application .mb-xl-n15{margin-bottom:-60px!important}.v-application .mb-xl-n16{margin-bottom:-64px!important}.v-application .ml-xl-n1{margin-left:-4px!important}.v-application .ml-xl-n2{margin-left:-8px!important}.v-application .ml-xl-n3{margin-left:-12px!important}.v-application .ml-xl-n4{margin-left:-16px!important}.v-application .ml-xl-n5{margin-left:-20px!important}.v-application .ml-xl-n6{margin-left:-24px!important}.v-application .ml-xl-n7{margin-left:-28px!important}.v-application .ml-xl-n8{margin-left:-32px!important}.v-application .ml-xl-n9{margin-left:-36px!important}.v-application .ml-xl-n10{margin-left:-40px!important}.v-application .ml-xl-n11{margin-left:-44px!important}.v-application .ml-xl-n12{margin-left:-48px!important}.v-application .ml-xl-n13{margin-left:-52px!important}.v-application .ml-xl-n14{margin-left:-56px!important}.v-application .ml-xl-n15{margin-left:-60px!important}.v-application .ml-xl-n16{margin-left:-64px!important}.v-application--is-ltr .ms-xl-n1{margin-left:-4px!important}.v-application--is-rtl .ms-xl-n1{margin-right:-4px!important}.v-application--is-ltr .ms-xl-n2{margin-left:-8px!important}.v-application--is-rtl .ms-xl-n2{margin-right:-8px!important}.v-application--is-ltr .ms-xl-n3{margin-left:-12px!important}.v-application--is-rtl .ms-xl-n3{margin-right:-12px!important}.v-application--is-ltr .ms-xl-n4{margin-left:-16px!important}.v-application--is-rtl .ms-xl-n4{margin-right:-16px!important}.v-application--is-ltr .ms-xl-n5{margin-left:-20px!important}.v-application--is-rtl .ms-xl-n5{margin-right:-20px!important}.v-application--is-ltr .ms-xl-n6{margin-left:-24px!important}.v-application--is-rtl .ms-xl-n6{margin-right:-24px!important}.v-application--is-ltr .ms-xl-n7{margin-left:-28px!important}.v-application--is-rtl .ms-xl-n7{margin-right:-28px!important}.v-application--is-ltr .ms-xl-n8{margin-left:-32px!important}.v-application--is-rtl .ms-xl-n8{margin-right:-32px!important}.v-application--is-ltr .ms-xl-n9{margin-left:-36px!important}.v-application--is-rtl .ms-xl-n9{margin-right:-36px!important}.v-application--is-ltr .ms-xl-n10{margin-left:-40px!important}.v-application--is-rtl .ms-xl-n10{margin-right:-40px!important}.v-application--is-ltr .ms-xl-n11{margin-left:-44px!important}.v-application--is-rtl .ms-xl-n11{margin-right:-44px!important}.v-application--is-ltr .ms-xl-n12{margin-left:-48px!important}.v-application--is-rtl .ms-xl-n12{margin-right:-48px!important}.v-application--is-ltr .ms-xl-n13{margin-left:-52px!important}.v-application--is-rtl .ms-xl-n13{margin-right:-52px!important}.v-application--is-ltr .ms-xl-n14{margin-left:-56px!important}.v-application--is-rtl .ms-xl-n14{margin-right:-56px!important}.v-application--is-ltr .ms-xl-n15{margin-left:-60px!important}.v-application--is-rtl .ms-xl-n15{margin-right:-60px!important}.v-application--is-ltr .ms-xl-n16{margin-left:-64px!important}.v-application--is-rtl .ms-xl-n16{margin-right:-64px!important}.v-application--is-ltr .me-xl-n1{margin-right:-4px!important}.v-application--is-rtl .me-xl-n1{margin-left:-4px!important}.v-application--is-ltr .me-xl-n2{margin-right:-8px!important}.v-application--is-rtl .me-xl-n2{margin-left:-8px!important}.v-application--is-ltr .me-xl-n3{margin-right:-12px!important}.v-application--is-rtl .me-xl-n3{margin-left:-12px!important}.v-application--is-ltr .me-xl-n4{margin-right:-16px!important}.v-application--is-rtl .me-xl-n4{margin-left:-16px!important}.v-application--is-ltr .me-xl-n5{margin-right:-20px!important}.v-application--is-rtl .me-xl-n5{margin-left:-20px!important}.v-application--is-ltr .me-xl-n6{margin-right:-24px!important}.v-application--is-rtl .me-xl-n6{margin-left:-24px!important}.v-application--is-ltr .me-xl-n7{margin-right:-28px!important}.v-application--is-rtl .me-xl-n7{margin-left:-28px!important}.v-application--is-ltr .me-xl-n8{margin-right:-32px!important}.v-application--is-rtl .me-xl-n8{margin-left:-32px!important}.v-application--is-ltr .me-xl-n9{margin-right:-36px!important}.v-application--is-rtl .me-xl-n9{margin-left:-36px!important}.v-application--is-ltr .me-xl-n10{margin-right:-40px!important}.v-application--is-rtl .me-xl-n10{margin-left:-40px!important}.v-application--is-ltr .me-xl-n11{margin-right:-44px!important}.v-application--is-rtl .me-xl-n11{margin-left:-44px!important}.v-application--is-ltr .me-xl-n12{margin-right:-48px!important}.v-application--is-rtl .me-xl-n12{margin-left:-48px!important}.v-application--is-ltr .me-xl-n13{margin-right:-52px!important}.v-application--is-rtl .me-xl-n13{margin-left:-52px!important}.v-application--is-ltr .me-xl-n14{margin-right:-56px!important}.v-application--is-rtl .me-xl-n14{margin-left:-56px!important}.v-application--is-ltr .me-xl-n15{margin-right:-60px!important}.v-application--is-rtl .me-xl-n15{margin-left:-60px!important}.v-application--is-ltr .me-xl-n16{margin-right:-64px!important}.v-application--is-rtl .me-xl-n16{margin-left:-64px!important}.v-application .pa-xl-0{padding:0!important}.v-application .pa-xl-1{padding:4px!important}.v-application .pa-xl-2{padding:8px!important}.v-application .pa-xl-3{padding:12px!important}.v-application .pa-xl-4{padding:16px!important}.v-application .pa-xl-5{padding:20px!important}.v-application .pa-xl-6{padding:24px!important}.v-application .pa-xl-7{padding:28px!important}.v-application .pa-xl-8{padding:32px!important}.v-application .pa-xl-9{padding:36px!important}.v-application .pa-xl-10{padding:40px!important}.v-application .pa-xl-11{padding:44px!important}.v-application .pa-xl-12{padding:48px!important}.v-application .pa-xl-13{padding:52px!important}.v-application .pa-xl-14{padding:56px!important}.v-application .pa-xl-15{padding:60px!important}.v-application .pa-xl-16{padding:64px!important}.v-application .px-xl-0{padding-right:0!important;padding-left:0!important}.v-application .px-xl-1{padding-right:4px!important;padding-left:4px!important}.v-application .px-xl-2{padding-right:8px!important;padding-left:8px!important}.v-application .px-xl-3{padding-right:12px!important;padding-left:12px!important}.v-application .px-xl-4{padding-right:16px!important;padding-left:16px!important}.v-application .px-xl-5{padding-right:20px!important;padding-left:20px!important}.v-application .px-xl-6{padding-right:24px!important;padding-left:24px!important}.v-application .px-xl-7{padding-right:28px!important;padding-left:28px!important}.v-application .px-xl-8{padding-right:32px!important;padding-left:32px!important}.v-application .px-xl-9{padding-right:36px!important;padding-left:36px!important}.v-application .px-xl-10{padding-right:40px!important;padding-left:40px!important}.v-application .px-xl-11{padding-right:44px!important;padding-left:44px!important}.v-application .px-xl-12{padding-right:48px!important;padding-left:48px!important}.v-application .px-xl-13{padding-right:52px!important;padding-left:52px!important}.v-application .px-xl-14{padding-right:56px!important;padding-left:56px!important}.v-application .px-xl-15{padding-right:60px!important;padding-left:60px!important}.v-application .px-xl-16{padding-right:64px!important;padding-left:64px!important}.v-application .py-xl-0{padding-top:0!important;padding-bottom:0!important}.v-application .py-xl-1{padding-top:4px!important;padding-bottom:4px!important}.v-application .py-xl-2{padding-top:8px!important;padding-bottom:8px!important}.v-application .py-xl-3{padding-top:12px!important;padding-bottom:12px!important}.v-application .py-xl-4{padding-top:16px!important;padding-bottom:16px!important}.v-application .py-xl-5{padding-top:20px!important;padding-bottom:20px!important}.v-application .py-xl-6{padding-top:24px!important;padding-bottom:24px!important}.v-application .py-xl-7{padding-top:28px!important;padding-bottom:28px!important}.v-application .py-xl-8{padding-top:32px!important;padding-bottom:32px!important}.v-application .py-xl-9{padding-top:36px!important;padding-bottom:36px!important}.v-application .py-xl-10{padding-top:40px!important;padding-bottom:40px!important}.v-application .py-xl-11{padding-top:44px!important;padding-bottom:44px!important}.v-application .py-xl-12{padding-top:48px!important;padding-bottom:48px!important}.v-application .py-xl-13{padding-top:52px!important;padding-bottom:52px!important}.v-application .py-xl-14{padding-top:56px!important;padding-bottom:56px!important}.v-application .py-xl-15{padding-top:60px!important;padding-bottom:60px!important}.v-application .py-xl-16{padding-top:64px!important;padding-bottom:64px!important}.v-application .pt-xl-0{padding-top:0!important}.v-application .pt-xl-1{padding-top:4px!important}.v-application .pt-xl-2{padding-top:8px!important}.v-application .pt-xl-3{padding-top:12px!important}.v-application .pt-xl-4{padding-top:16px!important}.v-application .pt-xl-5{padding-top:20px!important}.v-application .pt-xl-6{padding-top:24px!important}.v-application .pt-xl-7{padding-top:28px!important}.v-application .pt-xl-8{padding-top:32px!important}.v-application .pt-xl-9{padding-top:36px!important}.v-application .pt-xl-10{padding-top:40px!important}.v-application .pt-xl-11{padding-top:44px!important}.v-application .pt-xl-12{padding-top:48px!important}.v-application .pt-xl-13{padding-top:52px!important}.v-application .pt-xl-14{padding-top:56px!important}.v-application .pt-xl-15{padding-top:60px!important}.v-application .pt-xl-16{padding-top:64px!important}.v-application .pr-xl-0{padding-right:0!important}.v-application .pr-xl-1{padding-right:4px!important}.v-application .pr-xl-2{padding-right:8px!important}.v-application .pr-xl-3{padding-right:12px!important}.v-application .pr-xl-4{padding-right:16px!important}.v-application .pr-xl-5{padding-right:20px!important}.v-application .pr-xl-6{padding-right:24px!important}.v-application .pr-xl-7{padding-right:28px!important}.v-application .pr-xl-8{padding-right:32px!important}.v-application .pr-xl-9{padding-right:36px!important}.v-application .pr-xl-10{padding-right:40px!important}.v-application .pr-xl-11{padding-right:44px!important}.v-application .pr-xl-12{padding-right:48px!important}.v-application .pr-xl-13{padding-right:52px!important}.v-application .pr-xl-14{padding-right:56px!important}.v-application .pr-xl-15{padding-right:60px!important}.v-application .pr-xl-16{padding-right:64px!important}.v-application .pb-xl-0{padding-bottom:0!important}.v-application .pb-xl-1{padding-bottom:4px!important}.v-application .pb-xl-2{padding-bottom:8px!important}.v-application .pb-xl-3{padding-bottom:12px!important}.v-application .pb-xl-4{padding-bottom:16px!important}.v-application .pb-xl-5{padding-bottom:20px!important}.v-application .pb-xl-6{padding-bottom:24px!important}.v-application .pb-xl-7{padding-bottom:28px!important}.v-application .pb-xl-8{padding-bottom:32px!important}.v-application .pb-xl-9{padding-bottom:36px!important}.v-application .pb-xl-10{padding-bottom:40px!important}.v-application .pb-xl-11{padding-bottom:44px!important}.v-application .pb-xl-12{padding-bottom:48px!important}.v-application .pb-xl-13{padding-bottom:52px!important}.v-application .pb-xl-14{padding-bottom:56px!important}.v-application .pb-xl-15{padding-bottom:60px!important}.v-application .pb-xl-16{padding-bottom:64px!important}.v-application .pl-xl-0{padding-left:0!important}.v-application .pl-xl-1{padding-left:4px!important}.v-application .pl-xl-2{padding-left:8px!important}.v-application .pl-xl-3{padding-left:12px!important}.v-application .pl-xl-4{padding-left:16px!important}.v-application .pl-xl-5{padding-left:20px!important}.v-application .pl-xl-6{padding-left:24px!important}.v-application .pl-xl-7{padding-left:28px!important}.v-application .pl-xl-8{padding-left:32px!important}.v-application .pl-xl-9{padding-left:36px!important}.v-application .pl-xl-10{padding-left:40px!important}.v-application .pl-xl-11{padding-left:44px!important}.v-application .pl-xl-12{padding-left:48px!important}.v-application .pl-xl-13{padding-left:52px!important}.v-application .pl-xl-14{padding-left:56px!important}.v-application .pl-xl-15{padding-left:60px!important}.v-application .pl-xl-16{padding-left:64px!important}.v-application--is-ltr .ps-xl-0{padding-left:0!important}.v-application--is-rtl .ps-xl-0{padding-right:0!important}.v-application--is-ltr .ps-xl-1{padding-left:4px!important}.v-application--is-rtl .ps-xl-1{padding-right:4px!important}.v-application--is-ltr .ps-xl-2{padding-left:8px!important}.v-application--is-rtl .ps-xl-2{padding-right:8px!important}.v-application--is-ltr .ps-xl-3{padding-left:12px!important}.v-application--is-rtl .ps-xl-3{padding-right:12px!important}.v-application--is-ltr .ps-xl-4{padding-left:16px!important}.v-application--is-rtl .ps-xl-4{padding-right:16px!important}.v-application--is-ltr .ps-xl-5{padding-left:20px!important}.v-application--is-rtl .ps-xl-5{padding-right:20px!important}.v-application--is-ltr .ps-xl-6{padding-left:24px!important}.v-application--is-rtl .ps-xl-6{padding-right:24px!important}.v-application--is-ltr .ps-xl-7{padding-left:28px!important}.v-application--is-rtl .ps-xl-7{padding-right:28px!important}.v-application--is-ltr .ps-xl-8{padding-left:32px!important}.v-application--is-rtl .ps-xl-8{padding-right:32px!important}.v-application--is-ltr .ps-xl-9{padding-left:36px!important}.v-application--is-rtl .ps-xl-9{padding-right:36px!important}.v-application--is-ltr .ps-xl-10{padding-left:40px!important}.v-application--is-rtl .ps-xl-10{padding-right:40px!important}.v-application--is-ltr .ps-xl-11{padding-left:44px!important}.v-application--is-rtl .ps-xl-11{padding-right:44px!important}.v-application--is-ltr .ps-xl-12{padding-left:48px!important}.v-application--is-rtl .ps-xl-12{padding-right:48px!important}.v-application--is-ltr .ps-xl-13{padding-left:52px!important}.v-application--is-rtl .ps-xl-13{padding-right:52px!important}.v-application--is-ltr .ps-xl-14{padding-left:56px!important}.v-application--is-rtl .ps-xl-14{padding-right:56px!important}.v-application--is-ltr .ps-xl-15{padding-left:60px!important}.v-application--is-rtl .ps-xl-15{padding-right:60px!important}.v-application--is-ltr .ps-xl-16{padding-left:64px!important}.v-application--is-rtl .ps-xl-16{padding-right:64px!important}.v-application--is-ltr .pe-xl-0{padding-right:0!important}.v-application--is-rtl .pe-xl-0{padding-left:0!important}.v-application--is-ltr .pe-xl-1{padding-right:4px!important}.v-application--is-rtl .pe-xl-1{padding-left:4px!important}.v-application--is-ltr .pe-xl-2{padding-right:8px!important}.v-application--is-rtl .pe-xl-2{padding-left:8px!important}.v-application--is-ltr .pe-xl-3{padding-right:12px!important}.v-application--is-rtl .pe-xl-3{padding-left:12px!important}.v-application--is-ltr .pe-xl-4{padding-right:16px!important}.v-application--is-rtl .pe-xl-4{padding-left:16px!important}.v-application--is-ltr .pe-xl-5{padding-right:20px!important}.v-application--is-rtl .pe-xl-5{padding-left:20px!important}.v-application--is-ltr .pe-xl-6{padding-right:24px!important}.v-application--is-rtl .pe-xl-6{padding-left:24px!important}.v-application--is-ltr .pe-xl-7{padding-right:28px!important}.v-application--is-rtl .pe-xl-7{padding-left:28px!important}.v-application--is-ltr .pe-xl-8{padding-right:32px!important}.v-application--is-rtl .pe-xl-8{padding-left:32px!important}.v-application--is-ltr .pe-xl-9{padding-right:36px!important}.v-application--is-rtl .pe-xl-9{padding-left:36px!important}.v-application--is-ltr .pe-xl-10{padding-right:40px!important}.v-application--is-rtl .pe-xl-10{padding-left:40px!important}.v-application--is-ltr .pe-xl-11{padding-right:44px!important}.v-application--is-rtl .pe-xl-11{padding-left:44px!important}.v-application--is-ltr .pe-xl-12{padding-right:48px!important}.v-application--is-rtl .pe-xl-12{padding-left:48px!important}.v-application--is-ltr .pe-xl-13{padding-right:52px!important}.v-application--is-rtl .pe-xl-13{padding-left:52px!important}.v-application--is-ltr .pe-xl-14{padding-right:56px!important}.v-application--is-rtl .pe-xl-14{padding-left:56px!important}.v-application--is-ltr .pe-xl-15{padding-right:60px!important}.v-application--is-rtl .pe-xl-15{padding-left:60px!important}.v-application--is-ltr .pe-xl-16{padding-right:64px!important}.v-application--is-rtl .pe-xl-16{padding-left:64px!important}.v-application .text-xl-left{text-align:left!important}.v-application .text-xl-right{text-align:right!important}.v-application .text-xl-center{text-align:center!important}.v-application .text-xl-justify{text-align:justify!important}.v-application .text-xl-start{text-align:start!important}.v-application .text-xl-end{text-align:end!important}.v-application .text-xl-h1{font-size:6rem!important;line-height:6rem;letter-spacing:-.015625em!important}.v-application .text-xl-h1,.v-application .text-xl-h2{font-weight:300;font-family:Roboto,sans-serif!important}.v-application .text-xl-h2{font-size:3.75rem!important;line-height:3.75rem;letter-spacing:-.0083333333em!important}.v-application .text-xl-h3{font-size:3rem!important;line-height:3.125rem;letter-spacing:normal!important}.v-application .text-xl-h3,.v-application .text-xl-h4{font-weight:400;font-family:Roboto,sans-serif!important}.v-application .text-xl-h4{font-size:2.125rem!important;line-height:2.5rem;letter-spacing:.0073529412em!important}.v-application .text-xl-h5{font-size:1.5rem!important;font-weight:400;letter-spacing:normal!important}.v-application .text-xl-h5,.v-application .text-xl-h6{line-height:2rem;font-family:Roboto,sans-serif!important}.v-application .text-xl-h6{font-size:1.25rem!important;font-weight:500;letter-spacing:.0125em!important}.v-application .text-xl-subtitle-1{font-size:1rem!important;font-weight:400;line-height:1.75rem;letter-spacing:.009375em!important;font-family:Roboto,sans-serif!important}.v-application .text-xl-subtitle-2{font-size:.875rem!important;font-weight:500;line-height:1.375rem;letter-spacing:.0071428571em!important;font-family:Roboto,sans-serif!important}.v-application .text-xl-body-1{font-size:1rem!important;font-weight:400;line-height:1.5rem;letter-spacing:.03125em!important;font-family:Roboto,sans-serif!important}.v-application .text-xl-body-2{font-weight:400;line-height:1.25rem;letter-spacing:.0178571429em!important}.v-application .text-xl-body-2,.v-application .text-xl-button{font-size:.875rem!important;font-family:Roboto,sans-serif!important}.v-application .text-xl-button{font-weight:500;line-height:2.25rem;letter-spacing:.0892857143em!important;text-transform:uppercase!important}.v-application .text-xl-caption{font-weight:400;line-height:1.25rem;letter-spacing:.0333333333em!important}.v-application .text-xl-caption,.v-application .text-xl-overline{font-size:.75rem!important;font-family:Roboto,sans-serif!important}.v-application .text-xl-overline{font-weight:500;line-height:2rem;letter-spacing:.1666666667em!important;text-transform:uppercase!important}}@media print{.v-application .d-print-none{display:none!important}.v-application .d-print-inline{display:inline!important}.v-application .d-print-inline-block{display:inline-block!important}.v-application .d-print-block{display:block!important}.v-application .d-print-table{display:table!important}.v-application .d-print-table-row{display:table-row!important}.v-application .d-print-table-cell{display:table-cell!important}.v-application .d-print-flex{display:flex!important}.v-application .d-print-inline-flex{display:inline-flex!important}.v-application .float-print-none{float:none!important}.v-application .float-print-left{float:left!important}.v-application .float-print-right{float:right!important}.v-application--is-rtl .float-print-end{float:left!important}.v-application--is-ltr .float-print-end,.v-application--is-rtl .float-print-start{float:right!important}.v-application--is-ltr .float-print-start{float:left!important}}.v-ripple__container{border-radius:inherit;width:100%;height:100%;z-index:0;contain:strict}.v-ripple__animation,.v-ripple__container{color:inherit;position:absolute;left:0;top:0;overflow:hidden;pointer-events:none}.v-ripple__animation{border-radius:50%;background:currentColor;opacity:0;will-change:transform,opacity}.v-ripple__animation--enter{transition:none}.v-ripple__animation--in{transition:transform .25s cubic-bezier(.4,0,.2,1),opacity .1s cubic-bezier(.4,0,.2,1)}.v-ripple__animation--out{transition:opacity .3s cubic-bezier(.4,0,.2,1)}.v-progress-circular{position:relative;display:inline-flex;vertical-align:middle;justify-content:center;align-items:center}.v-progress-circular>svg{width:100%;height:100%;margin:auto;position:absolute;top:0;bottom:0;left:0;right:0;z-index:0}.v-progress-circular--indeterminate>svg{animation:progress-circular-rotate 1.4s linear infinite;transform-origin:center center;transition:all .2s ease-in-out}.v-progress-circular--indeterminate .v-progress-circular__overlay{animation:progress-circular-dash 1.4s ease-in-out infinite;stroke-linecap:round;stroke-dasharray:80,200;stroke-dashoffset:0px}.v-progress-circular--indeterminate:not(.v-progress-circular--visible) .v-progress-circular__overlay,.v-progress-circular--indeterminate:not(.v-progress-circular--visible)>svg{animation-play-state:paused!important}.v-progress-circular__info{align-items:center;display:flex;justify-content:center}.v-progress-circular__underlay{stroke:hsla(0,0%,62%,.4);z-index:1}.v-progress-circular__overlay{stroke:currentColor;z-index:2;transition:all .6s ease-in-out}@keyframes progress-circular-dash{0%{stroke-dasharray:1,200;stroke-dashoffset:0px}50%{stroke-dasharray:100,200;stroke-dashoffset:-15px}to{stroke-dasharray:100,200;stroke-dashoffset:-124px}}@keyframes progress-circular-rotate{to{transform:rotate(1turn)}}.theme--light.v-card{background-color:#fff;color:rgba(0,0,0,.87)}.theme--light.v-card>.v-card__subtitle,.theme--light.v-card>.v-card__text{color:rgba(0,0,0,.6)}.theme--dark.v-card{background-color:#1e1e1e;color:#fff}.theme--dark.v-card>.v-card__subtitle,.theme--dark.v-card>.v-card__text{color:hsla(0,0%,100%,.7)}.v-sheet.v-card{border-radius:4px}.v-sheet.v-card:not(.v-sheet--outlined){box-shadow:0 3px 1px -2px rgba(0,0,0,.2),0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12)}.v-sheet.v-card.v-sheet--shaped{border-radius:24px 4px}.v-card{border-width:thin;display:block;max-width:100%;outline:none;text-decoration:none;transition-property:box-shadow,opacity;overflow-wrap:break-word;position:relative;white-space:normal}.v-card>.v-card__progress+:not(.v-btn):not(.v-chip):not(.v-avatar),.v-card>:first-child:not(.v-btn):not(.v-chip):not(.v-avatar){border-top-left-radius:inherit;border-top-right-radius:inherit}.v-card>:last-child:not(.v-btn):not(.v-chip):not(.v-avatar){border-bottom-left-radius:inherit;border-bottom-right-radius:inherit}.v-card__progress{top:0;left:0;right:0;overflow:hidden}.v-card__subtitle+.v-card__text{padding-top:0}.v-card__subtitle,.v-card__text{font-size:.875rem;font-weight:400;line-height:1.375rem;letter-spacing:.0071428571em}.v-card__subtitle,.v-card__text,.v-card__title{padding:16px}.v-card__title{align-items:center;display:flex;flex-wrap:wrap;font-size:1.25rem;font-weight:500;letter-spacing:.0125em;line-height:2rem;word-break:break-all}.v-card__title+.v-card__subtitle,.v-card__title+.v-card__text{padding-top:0}.v-card__title+.v-card__subtitle{margin-top:-16px}.v-card__text{width:100%}.v-card__actions{align-items:center;display:flex;padding:8px}.v-card__actions>.v-btn.v-btn{padding:0 8px}.v-application--is-ltr .v-card__actions>.v-btn.v-btn+.v-btn{margin-left:8px}.v-application--is-ltr .v-card__actions>.v-btn.v-btn .v-icon--left{margin-left:4px}.v-application--is-ltr .v-card__actions>.v-btn.v-btn .v-icon--right{margin-right:4px}.v-application--is-rtl .v-card__actions>.v-btn.v-btn+.v-btn{margin-right:8px}.v-application--is-rtl .v-card__actions>.v-btn.v-btn .v-icon--left{margin-right:4px}.v-application--is-rtl .v-card__actions>.v-btn.v-btn .v-icon--right{margin-left:4px}.v-card--flat{box-shadow:0 0 0 0 rgba(0,0,0,.2),0 0 0 0 rgba(0,0,0,.14),0 0 0 0 rgba(0,0,0,.12)!important}.v-sheet.v-card--hover{cursor:pointer;transition:box-shadow .4s cubic-bezier(.25,.8,.25,1)}.v-sheet.v-card--hover:focus,.v-sheet.v-card--hover:hover{box-shadow:0 5px 5px -3px rgba(0,0,0,.2),0 8px 10px 1px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12)}.v-card--link,.v-card--link .v-chip{cursor:pointer}.v-card--link:focus:before{opacity:.08}.v-card--link:before{background:currentColor;bottom:0;content:"";left:0;opacity:0;pointer-events:none;position:absolute;right:0;top:0;transition:opacity .2s}.v-card--disabled{pointer-events:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.v-card--disabled>:not(.v-card__progress){opacity:.6;transition:inherit}.v-card--loading{overflow:hidden}.v-card--raised{box-shadow:0 5px 5px -3px rgba(0,0,0,.2),0 8px 10px 1px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12)}.theme--light.v-progress-linear{color:rgba(0,0,0,.87)}.theme--dark.v-progress-linear{color:#fff}.v-progress-linear{background:transparent;overflow:hidden;position:relative;transition:.2s cubic-bezier(.4,0,.6,1);width:100%}.v-progress-linear__buffer{height:inherit;left:0;position:absolute;top:0;transition:inherit;width:100%}.v-progress-linear--reverse .v-progress-linear__buffer{left:auto;right:0}.v-progress-linear__background{bottom:0;left:0;position:absolute;top:0;transition:inherit}.v-progress-linear--reverse .v-progress-linear__background{left:auto;right:0}.v-progress-linear__content{align-items:center;display:flex;height:100%;left:0;justify-content:center;position:absolute;top:0;width:100%}.v-progress-linear--reverse .v-progress-linear__content{left:auto;right:0}.v-progress-linear__determinate{height:inherit;left:0;position:absolute;transition:inherit}.v-progress-linear--reverse .v-progress-linear__determinate{left:auto;right:0}.v-progress-linear .v-progress-linear__indeterminate .long,.v-progress-linear .v-progress-linear__indeterminate .short{animation-play-state:paused;background-color:inherit;bottom:0;height:inherit;left:0;position:absolute;right:auto;top:0;width:auto;will-change:left,right}.v-progress-linear .v-progress-linear__indeterminate--active .long{animation-name:indeterminate-ltr;animation-duration:2.2s;animation-iteration-count:infinite}.v-progress-linear .v-progress-linear__indeterminate--active .short{animation-name:indeterminate-short-ltr;animation-duration:2.2s;animation-iteration-count:infinite}.v-progress-linear--reverse .v-progress-linear__indeterminate .long,.v-progress-linear--reverse .v-progress-linear__indeterminate .short{left:auto;right:0}.v-progress-linear--reverse .v-progress-linear__indeterminate--active .long{animation-name:indeterminate-rtl}.v-progress-linear--reverse .v-progress-linear__indeterminate--active .short{animation-name:indeterminate-short-rtl}.v-progress-linear__stream{animation:stream-ltr .25s linear infinite;animation-play-state:paused;border-color:currentColor;border-top:4px dotted;bottom:0;left:auto;right:-8px;opacity:.3;pointer-events:none;position:absolute;top:calc(50% - 2px);transition:inherit}.v-progress-linear--reverse .v-progress-linear__stream{animation:stream-rtl .25s linear infinite;left:-8px;right:auto}.v-progress-linear__wrapper{overflow:hidden;position:relative;transition:inherit}.v-progress-linear--absolute,.v-progress-linear--fixed{left:0;z-index:1}.v-progress-linear--absolute{position:absolute}.v-progress-linear--fixed{position:fixed}.v-progress-linear--reactive .v-progress-linear__content{pointer-events:none}.v-progress-linear--rounded{border-radius:4px}.v-progress-linear--striped .v-progress-linear__determinate{background-image:linear-gradient(135deg,hsla(0,0%,100%,.25) 25%,transparent 0,transparent 50%,hsla(0,0%,100%,.25) 0,hsla(0,0%,100%,.25) 75%,transparent 0,transparent);background-size:40px 40px;background-repeat:repeat}.v-progress-linear--query .v-progress-linear__indeterminate--active .long{animation-name:query-ltr;animation-duration:2s;animation-iteration-count:infinite}.v-progress-linear--query .v-progress-linear__indeterminate--active .short{animation-name:query-short-ltr;animation-duration:2s;animation-iteration-count:infinite}.v-progress-linear--query.v-progress-linear--reverse .v-progress-linear__indeterminate--active .long{animation-name:query-rtl}.v-progress-linear--query.v-progress-linear--reverse .v-progress-linear__indeterminate--active .short{animation-name:query-short-rtl}.v-progress-linear--visible .v-progress-linear__indeterminate--active .long,.v-progress-linear--visible .v-progress-linear__indeterminate--active .short,.v-progress-linear--visible .v-progress-linear__stream{animation-play-state:running}@keyframes indeterminate-ltr{0%{left:-90%;right:100%}60%{left:-90%;right:100%}to{left:100%;right:-35%}}@keyframes indeterminate-rtl{0%{left:100%;right:-90%}60%{left:100%;right:-90%}to{left:-35%;right:100%}}@keyframes indeterminate-short-ltr{0%{left:-200%;right:100%}60%{left:107%;right:-8%}to{left:107%;right:-8%}}@keyframes indeterminate-short-rtl{0%{left:100%;right:-200%}60%{left:-8%;right:107%}to{left:-8%;right:107%}}@keyframes query-ltr{0%{right:-90%;left:100%}60%{right:-90%;left:100%}to{right:100%;left:-35%}}@keyframes query-rtl{0%{right:100%;left:-90%}60%{right:100%;left:-90%}to{right:-35%;left:100%}}@keyframes query-short-ltr{0%{right:-200%;left:100%}60%{right:107%;left:-8%}to{right:107%;left:-8%}}@keyframes query-short-rtl{0%{right:100%;left:-200%}60%{right:-8%;left:107%}to{right:-8%;left:107%}}@keyframes stream-ltr{to{transform:translateX(-8px)}}@keyframes stream-rtl{to{transform:translateX(8px)}}.theme--light.v-input--selection-controls.v-input--is-disabled:not(.v-input--indeterminate) .v-icon{color:rgba(0,0,0,.26)!important}.theme--dark.v-input--selection-controls.v-input--is-disabled:not(.v-input--indeterminate) .v-icon{color:hsla(0,0%,100%,.3)!important}.v-input--selection-controls{margin-top:16px;padding-top:4px}.v-input--selection-controls>.v-input__append-outer,.v-input--selection-controls>.v-input__prepend-outer{margin-top:0;margin-bottom:0}.v-input--selection-controls:not(.v-input--hide-details)>.v-input__slot{margin-bottom:12px}.v-input--selection-controls .v-input__slot,.v-input--selection-controls .v-radio{cursor:pointer}.v-input--selection-controls .v-input__slot>.v-label,.v-input--selection-controls .v-radio>.v-label{align-items:center;display:inline-flex;flex:1 1 auto;height:auto}.v-input--selection-controls__input{color:inherit;display:inline-flex;flex:0 0 auto;height:24px;position:relative;transition:.3s cubic-bezier(.25,.8,.5,1);transition-property:transform;width:24px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.v-input--selection-controls__input .v-icon{width:100%}.v-application--is-ltr .v-input--selection-controls__input{margin-right:8px}.v-application--is-rtl .v-input--selection-controls__input{margin-left:8px}.v-input--selection-controls__input input[role=checkbox],.v-input--selection-controls__input input[role=radio],.v-input--selection-controls__input input[role=switch]{position:absolute;opacity:0;width:100%;height:100%;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.v-input--selection-controls__input+.v-label{cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.v-input--selection-controls__ripple{border-radius:50%;cursor:pointer;height:34px;position:absolute;transition:inherit;width:34px;left:-12px;top:calc(50% - 24px);margin:7px}.v-input--selection-controls__ripple:before{border-radius:inherit;bottom:0;content:"";position:absolute;opacity:.2;left:0;right:0;top:0;transform-origin:center center;transform:scale(.2);transition:inherit}.v-input--selection-controls__ripple>.v-ripple__container{transform:scale(1.2)}.v-input--selection-controls.v-input--dense .v-input--selection-controls__ripple{width:28px;height:28px;left:-9px}.v-input--selection-controls.v-input--dense:not(.v-input--switch) .v-input--selection-controls__ripple{top:calc(50% - 21px)}.v-input--selection-controls.v-input{flex:0 1 auto}.v-input--selection-controls.v-input--is-focused .v-input--selection-controls__ripple:before,.v-input--selection-controls .v-radio--is-focused .v-input--selection-controls__ripple:before{background:currentColor;transform:scale(1.2)}.v-input--selection-controls__input:hover .v-input--selection-controls__ripple:before{background:currentColor;transform:scale(1.2);transition:none}.theme--light.v-input--switch .v-input--switch__thumb{color:#fff}.theme--light.v-input--switch .v-input--switch__track{color:rgba(0,0,0,.38)}.theme--light.v-input--switch.v-input--is-disabled:not(.v-input--is-dirty) .v-input--switch__thumb{color:#fafafa!important}.theme--light.v-input--switch.v-input--is-disabled:not(.v-input--is-dirty) .v-input--switch__track{color:rgba(0,0,0,.12)!important}.theme--dark.v-input--switch .v-input--switch__thumb{color:#bdbdbd}.theme--dark.v-input--switch .v-input--switch__track{color:hsla(0,0%,100%,.3)}.theme--dark.v-input--switch.v-input--is-disabled:not(.v-input--is-dirty) .v-input--switch__thumb{color:#424242!important}.theme--dark.v-input--switch.v-input--is-disabled:not(.v-input--is-dirty) .v-input--switch__track{color:hsla(0,0%,100%,.1)!important}.v-input--switch__thumb,.v-input--switch__track{background-color:currentColor;pointer-events:none;transition:inherit}.v-input--switch__track{border-radius:8px;width:36px;height:14px;left:2px;position:absolute;opacity:.6;right:2px;top:calc(50% - 7px)}.v-input--switch__thumb{border-radius:50%;top:calc(50% - 10px);height:20px;position:relative;width:20px;display:flex;justify-content:center;align-items:center;transition:.3s cubic-bezier(.25,.8,.5,1)}.v-input--switch .v-input--selection-controls__input{width:38px}.v-input--switch .v-input--selection-controls__ripple{top:calc(50% - 24px)}.v-input--switch.v-input--dense .v-input--switch__thumb{width:18px;height:18px}.v-input--switch.v-input--dense .v-input--switch__track{height:12px;width:32px}.v-input--switch.v-input--dense.v-input--switch--inset .v-input--switch__track{height:22px;width:44px;top:calc(50% - 12px);left:-3px}.v-input--switch.v-input--dense .v-input--selection-controls__ripple{top:calc(50% - 22px)}.v-input--switch.v-input--is-dirty.v-input--is-disabled{opacity:.6}.v-application--is-ltr .v-input--switch .v-input--selection-controls__ripple{left:-14px}.v-application--is-ltr .v-input--switch.v-input--dense .v-input--selection-controls__ripple{left:-12px}.v-application--is-ltr .v-input--switch.v-input--is-dirty .v-input--selection-controls__ripple,.v-application--is-ltr .v-input--switch.v-input--is-dirty .v-input--switch__thumb{transform:translate(20px)}.v-application--is-rtl .v-input--switch .v-input--selection-controls__ripple{right:-14px}.v-application--is-rtl .v-input--switch.v-input--dense .v-input--selection-controls__ripple{right:-12px}.v-application--is-rtl .v-input--switch.v-input--is-dirty .v-input--selection-controls__ripple,.v-application--is-rtl .v-input--switch.v-input--is-dirty .v-input--switch__thumb{transform:translate(-20px)}.v-input--switch:not(.v-input--switch--flat):not(.v-input--switch--inset) .v-input--switch__thumb{box-shadow:0 2px 4px -1px rgba(0,0,0,.2),0 4px 5px 0 rgba(0,0,0,.14),0 1px 10px 0 rgba(0,0,0,.12)}.v-input--switch--inset .v-input--selection-controls__input,.v-input--switch--inset .v-input--switch__track{width:48px}.v-input--switch--inset .v-input--switch__track{border-radius:14px;height:28px;left:-4px;opacity:.32;top:calc(50% - 14px)}.v-application--is-ltr .v-input--switch--inset .v-input--selection-controls__ripple,.v-application--is-ltr .v-input--switch--inset .v-input--switch__thumb{transform:translate(0)!important}.v-application--is-rtl .v-input--switch--inset .v-input--selection-controls__ripple,.v-application--is-rtl .v-input--switch--inset .v-input--switch__thumb{transform:translate(-6px)!important}.v-application--is-ltr .v-input--switch--inset.v-input--is-dirty .v-input--selection-controls__ripple,.v-application--is-ltr .v-input--switch--inset.v-input--is-dirty .v-input--switch__thumb{transform:translate(20px)!important}.v-application--is-rtl .v-input--switch--inset.v-input--is-dirty .v-input--selection-controls__ripple,.v-application--is-rtl .v-input--switch--inset.v-input--is-dirty .v-input--switch__thumb{transform:translate(-26px)!important}.theme--light.v-input,.theme--light.v-input input,.theme--light.v-input textarea{color:rgba(0,0,0,.87)}.theme--light.v-input input::-moz-placeholder,.theme--light.v-input textarea::-moz-placeholder{color:rgba(0,0,0,.38)}.theme--light.v-input input:-ms-input-placeholder,.theme--light.v-input textarea:-ms-input-placeholder{color:rgba(0,0,0,.38)}.theme--light.v-input input::placeholder,.theme--light.v-input textarea::placeholder{color:rgba(0,0,0,.38)}.theme--light.v-input--is-disabled,.theme--light.v-input--is-disabled input,.theme--light.v-input--is-disabled textarea{color:rgba(0,0,0,.38)}.theme--dark.v-input,.theme--dark.v-input input,.theme--dark.v-input textarea{color:#fff}.theme--dark.v-input input::-moz-placeholder,.theme--dark.v-input textarea::-moz-placeholder{color:hsla(0,0%,100%,.5)}.theme--dark.v-input input:-ms-input-placeholder,.theme--dark.v-input textarea:-ms-input-placeholder{color:hsla(0,0%,100%,.5)}.theme--dark.v-input input::placeholder,.theme--dark.v-input textarea::placeholder{color:hsla(0,0%,100%,.5)}.theme--dark.v-input--is-disabled,.theme--dark.v-input--is-disabled input,.theme--dark.v-input--is-disabled textarea{color:hsla(0,0%,100%,.5)}.v-input{align-items:flex-start;display:flex;flex:1 1 auto;font-size:16px;letter-spacing:normal;max-width:100%;text-align:left}.v-input .v-progress-linear{top:calc(100% - 1px);left:0}.v-input input{max-height:32px}.v-input input:invalid,.v-input textarea:invalid{box-shadow:none}.v-input input:active,.v-input input:focus,.v-input textarea:active,.v-input textarea:focus{outline:none}.v-input .v-label{height:20px;line-height:20px;letter-spacing:normal}.v-input__append-outer,.v-input__prepend-outer{display:inline-flex;margin-bottom:4px;margin-top:4px;line-height:1}.v-input__append-outer .v-icon,.v-input__prepend-outer .v-icon{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.v-application--is-ltr .v-input__append-outer{margin-left:9px}.v-application--is-ltr .v-input__prepend-outer,.v-application--is-rtl .v-input__append-outer{margin-right:9px}.v-application--is-rtl .v-input__prepend-outer{margin-left:9px}.v-input__control{display:flex;flex-direction:column;height:auto;flex-grow:1;flex-wrap:wrap;min-width:0;width:100%}.v-input__icon{align-items:center;display:inline-flex;height:24px;flex:1 0 auto;justify-content:center;min-width:24px;width:24px}.v-input__icon--clear{border-radius:50%}.v-input__icon--clear .v-icon--disabled{visibility:hidden}.v-input__slot{align-items:center;color:inherit;display:flex;margin-bottom:8px;min-height:inherit;position:relative;transition:.3s cubic-bezier(.25,.8,.5,1);width:100%}.v-input--dense>.v-input__control>.v-input__slot{margin-bottom:4px}.v-input--is-disabled:not(.v-input--is-readonly){pointer-events:none}.v-input--is-loading>.v-input__control>.v-input__slot:after,.v-input--is-loading>.v-input__control>.v-input__slot:before{display:none}.v-input--hide-details>.v-input__control>.v-input__slot{margin-bottom:0}.v-input--has-state.error--text .v-label{animation:v-shake .6s cubic-bezier(.25,.8,.5,1)}.theme--light.v-icon{color:rgba(0,0,0,.54)}.theme--light.v-icon:focus:after{opacity:.12}.theme--light.v-icon.v-icon.v-icon--disabled{color:rgba(0,0,0,.38)!important}.theme--dark.v-icon{color:#fff}.theme--dark.v-icon:focus:after{opacity:.24}.theme--dark.v-icon.v-icon.v-icon--disabled{color:hsla(0,0%,100%,.5)!important}.v-icon.v-icon{align-items:center;display:inline-flex;font-feature-settings:"liga";font-size:24px;justify-content:center;letter-spacing:normal;line-height:1;position:relative;text-indent:0;transition:.3s cubic-bezier(.25,.8,.5,1),visibility 0s;vertical-align:middle;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.v-icon.v-icon:after{background-color:currentColor;border-radius:50%;content:"";display:inline-block;height:100%;left:0;opacity:0;pointer-events:none;position:absolute;top:0;transform:scale(1.3);width:100%;transition:opacity .2s cubic-bezier(.4,0,.6,1)}.v-icon.v-icon--dense{font-size:20px}.v-icon--right{margin-left:8px}.v-icon--left{margin-right:8px}.v-icon.v-icon.v-icon--link{cursor:pointer;outline:none}.v-icon--disabled{pointer-events:none}.v-icon--dense__component,.v-icon--dense__svg{height:20px}.v-icon__component,.v-icon__svg{height:24px;width:24px}.v-icon__svg{fill:currentColor}.theme--light.v-label{color:rgba(0,0,0,.6)}.theme--light.v-label--is-disabled{color:rgba(0,0,0,.38)}.theme--dark.v-label{color:hsla(0,0%,100%,.7)}.theme--dark.v-label--is-disabled{color:hsla(0,0%,100%,.5)}.v-label{font-size:16px;line-height:1;min-height:8px;transition:.3s cubic-bezier(.25,.8,.5,1)}.theme--light.v-messages{color:rgba(0,0,0,.6)}.theme--dark.v-messages{color:hsla(0,0%,100%,.7)}.v-messages{flex:1 1 auto;font-size:12px;min-height:14px;min-width:1px;position:relative}.v-application--is-ltr .v-messages{text-align:left}.v-application--is-rtl .v-messages{text-align:right}.v-messages__message{line-height:12px;word-break:break-word;overflow-wrap:break-word;word-wrap:break-word;-webkit-hyphens:auto;-ms-hyphens:auto;hyphens:auto}.v-tooltip{display:none}.v-tooltip--attached{display:inline}.v-tooltip__content{background:rgba(97,97,97,.9);color:#fff;border-radius:4px;font-size:14px;line-height:22px;display:inline-block;padding:5px 16px;position:absolute;text-transform:none;width:auto;opacity:1;pointer-events:none}.v-tooltip__content--fixed{position:fixed}.v-tooltip__content[class*=-active]{transition-timing-function:cubic-bezier(0,0,.2,1)}.v-tooltip__content[class*=enter-active]{transition-duration:.15s}.v-tooltip__content[class*=leave-active]{transition-duration:75ms}@font-face{font-family:Material Design Icons;src:url(../fonts/materialdesignicons-webfont.64d4cf64.eot);src:url(../fonts/materialdesignicons-webfont.64d4cf64.eot?#iefix&v=5.9.55) format("embedded-opentype"),url(../fonts/materialdesignicons-webfont.7a44ea19.woff2) format("woff2"),url(../fonts/materialdesignicons-webfont.147e3378.woff) format("woff"),url(../fonts/materialdesignicons-webfont.174c02fc.ttf) format("truetype");font-weight:400;font-style:normal}.mdi-set,.mdi:before{display:inline-block;font:normal normal normal 24px/1 Material Design Icons;font-size:inherit;text-rendering:auto;line-height:inherit;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.mdi-ab-testing:before{content:"\F01C9"}.mdi-abacus:before{content:"\F16E0"}.mdi-abjad-arabic:before{content:"\F1328"}.mdi-abjad-hebrew:before{content:"\F1329"}.mdi-abugida-devanagari:before{content:"\F132A"}.mdi-abugida-thai:before{content:"\F132B"}.mdi-access-point:before{content:"\F0003"}.mdi-access-point-check:before{content:"\F1538"}.mdi-access-point-minus:before{content:"\F1539"}.mdi-access-point-network:before{content:"\F0002"}.mdi-access-point-network-off:before{content:"\F0BE1"}.mdi-access-point-off:before{content:"\F1511"}.mdi-access-point-plus:before{content:"\F153A"}.mdi-access-point-remove:before{content:"\F153B"}.mdi-account:before{content:"\F0004"}.mdi-account-alert:before{content:"\F0005"}.mdi-account-alert-outline:before{content:"\F0B50"}.mdi-account-arrow-left:before{content:"\F0B51"}.mdi-account-arrow-left-outline:before{content:"\F0B52"}.mdi-account-arrow-right:before{content:"\F0B53"}.mdi-account-arrow-right-outline:before{content:"\F0B54"}.mdi-account-box:before{content:"\F0006"}.mdi-account-box-multiple:before{content:"\F0934"}.mdi-account-box-multiple-outline:before{content:"\F100A"}.mdi-account-box-outline:before{content:"\F0007"}.mdi-account-cancel:before{content:"\F12DF"}.mdi-account-cancel-outline:before{content:"\F12E0"}.mdi-account-cash:before{content:"\F1097"}.mdi-account-cash-outline:before{content:"\F1098"}.mdi-account-check:before{content:"\F0008"}.mdi-account-check-outline:before{content:"\F0BE2"}.mdi-account-child:before{content:"\F0A89"}.mdi-account-child-circle:before{content:"\F0A8A"}.mdi-account-child-outline:before{content:"\F10C8"}.mdi-account-circle:before{content:"\F0009"}.mdi-account-circle-outline:before{content:"\F0B55"}.mdi-account-clock:before{content:"\F0B56"}.mdi-account-clock-outline:before{content:"\F0B57"}.mdi-account-cog:before{content:"\F1370"}.mdi-account-cog-outline:before{content:"\F1371"}.mdi-account-convert:before{content:"\F000A"}.mdi-account-convert-outline:before{content:"\F1301"}.mdi-account-cowboy-hat:before{content:"\F0E9B"}.mdi-account-details:before{content:"\F0631"}.mdi-account-details-outline:before{content:"\F1372"}.mdi-account-edit:before{content:"\F06BC"}.mdi-account-edit-outline:before{content:"\F0FFB"}.mdi-account-group:before{content:"\F0849"}.mdi-account-group-outline:before{content:"\F0B58"}.mdi-account-hard-hat:before{content:"\F05B5"}.mdi-account-heart:before{content:"\F0899"}.mdi-account-heart-outline:before{content:"\F0BE3"}.mdi-account-key:before{content:"\F000B"}.mdi-account-key-outline:before{content:"\F0BE4"}.mdi-account-lock:before{content:"\F115E"}.mdi-account-lock-outline:before{content:"\F115F"}.mdi-account-minus:before{content:"\F000D"}.mdi-account-minus-outline:before{content:"\F0AEC"}.mdi-account-multiple:before{content:"\F000E"}.mdi-account-multiple-check:before{content:"\F08C5"}.mdi-account-multiple-check-outline:before{content:"\F11FE"}.mdi-account-multiple-minus:before{content:"\F05D3"}.mdi-account-multiple-minus-outline:before{content:"\F0BE5"}.mdi-account-multiple-outline:before{content:"\F000F"}.mdi-account-multiple-plus:before{content:"\F0010"}.mdi-account-multiple-plus-outline:before{content:"\F0800"}.mdi-account-multiple-remove:before{content:"\F120A"}.mdi-account-multiple-remove-outline:before{content:"\F120B"}.mdi-account-music:before{content:"\F0803"}.mdi-account-music-outline:before{content:"\F0CE9"}.mdi-account-network:before{content:"\F0011"}.mdi-account-network-outline:before{content:"\F0BE6"}.mdi-account-off:before{content:"\F0012"}.mdi-account-off-outline:before{content:"\F0BE7"}.mdi-account-outline:before{content:"\F0013"}.mdi-account-plus:before{content:"\F0014"}.mdi-account-plus-outline:before{content:"\F0801"}.mdi-account-question:before{content:"\F0B59"}.mdi-account-question-outline:before{content:"\F0B5A"}.mdi-account-reactivate:before{content:"\F152B"}.mdi-account-reactivate-outline:before{content:"\F152C"}.mdi-account-remove:before{content:"\F0015"}.mdi-account-remove-outline:before{content:"\F0AED"}.mdi-account-search:before{content:"\F0016"}.mdi-account-search-outline:before{content:"\F0935"}.mdi-account-settings:before{content:"\F0630"}.mdi-account-settings-outline:before{content:"\F10C9"}.mdi-account-star:before{content:"\F0017"}.mdi-account-star-outline:before{content:"\F0BE8"}.mdi-account-supervisor:before{content:"\F0A8B"}.mdi-account-supervisor-circle:before{content:"\F0A8C"}.mdi-account-supervisor-circle-outline:before{content:"\F14EC"}.mdi-account-supervisor-outline:before{content:"\F112D"}.mdi-account-switch:before{content:"\F0019"}.mdi-account-switch-outline:before{content:"\F04CB"}.mdi-account-tie:before{content:"\F0CE3"}.mdi-account-tie-outline:before{content:"\F10CA"}.mdi-account-tie-voice:before{content:"\F1308"}.mdi-account-tie-voice-off:before{content:"\F130A"}.mdi-account-tie-voice-off-outline:before{content:"\F130B"}.mdi-account-tie-voice-outline:before{content:"\F1309"}.mdi-account-voice:before{content:"\F05CB"}.mdi-adjust:before{content:"\F001A"}.mdi-adobe:before{content:"\F0936"}.mdi-adobe-acrobat:before{content:"\F0F9D"}.mdi-air-conditioner:before{content:"\F001B"}.mdi-air-filter:before{content:"\F0D43"}.mdi-air-horn:before{content:"\F0DAC"}.mdi-air-humidifier:before{content:"\F1099"}.mdi-air-humidifier-off:before{content:"\F1466"}.mdi-air-purifier:before{content:"\F0D44"}.mdi-airbag:before{content:"\F0BE9"}.mdi-airballoon:before{content:"\F001C"}.mdi-airballoon-outline:before{content:"\F100B"}.mdi-airplane:before{content:"\F001D"}.mdi-airplane-landing:before{content:"\F05D4"}.mdi-airplane-off:before{content:"\F001E"}.mdi-airplane-takeoff:before{content:"\F05D5"}.mdi-airport:before{content:"\F084B"}.mdi-alarm:before{content:"\F0020"}.mdi-alarm-bell:before{content:"\F078E"}.mdi-alarm-check:before{content:"\F0021"}.mdi-alarm-light:before{content:"\F078F"}.mdi-alarm-light-off:before{content:"\F171E"}.mdi-alarm-light-off-outline:before{content:"\F171F"}.mdi-alarm-light-outline:before{content:"\F0BEA"}.mdi-alarm-multiple:before{content:"\F0022"}.mdi-alarm-note:before{content:"\F0E71"}.mdi-alarm-note-off:before{content:"\F0E72"}.mdi-alarm-off:before{content:"\F0023"}.mdi-alarm-panel:before{content:"\F15C4"}.mdi-alarm-panel-outline:before{content:"\F15C5"}.mdi-alarm-plus:before{content:"\F0024"}.mdi-alarm-snooze:before{content:"\F068E"}.mdi-album:before{content:"\F0025"}.mdi-alert:before{content:"\F0026"}.mdi-alert-box:before{content:"\F0027"}.mdi-alert-box-outline:before{content:"\F0CE4"}.mdi-alert-circle:before{content:"\F0028"}.mdi-alert-circle-check:before{content:"\F11ED"}.mdi-alert-circle-check-outline:before{content:"\F11EE"}.mdi-alert-circle-outline:before{content:"\F05D6"}.mdi-alert-decagram:before{content:"\F06BD"}.mdi-alert-decagram-outline:before{content:"\F0CE5"}.mdi-alert-minus:before{content:"\F14BB"}.mdi-alert-minus-outline:before{content:"\F14BE"}.mdi-alert-octagon:before{content:"\F0029"}.mdi-alert-octagon-outline:before{content:"\F0CE6"}.mdi-alert-octagram:before{content:"\F0767"}.mdi-alert-octagram-outline:before{content:"\F0CE7"}.mdi-alert-outline:before{content:"\F002A"}.mdi-alert-plus:before{content:"\F14BA"}.mdi-alert-plus-outline:before{content:"\F14BD"}.mdi-alert-remove:before{content:"\F14BC"}.mdi-alert-remove-outline:before{content:"\F14BF"}.mdi-alert-rhombus:before{content:"\F11CE"}.mdi-alert-rhombus-outline:before{content:"\F11CF"}.mdi-alien:before{content:"\F089A"}.mdi-alien-outline:before{content:"\F10CB"}.mdi-align-horizontal-center:before{content:"\F11C3"}.mdi-align-horizontal-left:before{content:"\F11C2"}.mdi-align-horizontal-right:before{content:"\F11C4"}.mdi-align-vertical-bottom:before{content:"\F11C5"}.mdi-align-vertical-center:before{content:"\F11C6"}.mdi-align-vertical-top:before{content:"\F11C7"}.mdi-all-inclusive:before{content:"\F06BE"}.mdi-allergy:before{content:"\F1258"}.mdi-alpha:before{content:"\F002B"}.mdi-alpha-a:before{content:"\F0AEE"}.mdi-alpha-a-box:before{content:"\F0B08"}.mdi-alpha-a-box-outline:before{content:"\F0BEB"}.mdi-alpha-a-circle:before{content:"\F0BEC"}.mdi-alpha-a-circle-outline:before{content:"\F0BED"}.mdi-alpha-b:before{content:"\F0AEF"}.mdi-alpha-b-box:before{content:"\F0B09"}.mdi-alpha-b-box-outline:before{content:"\F0BEE"}.mdi-alpha-b-circle:before{content:"\F0BEF"}.mdi-alpha-b-circle-outline:before{content:"\F0BF0"}.mdi-alpha-c:before{content:"\F0AF0"}.mdi-alpha-c-box:before{content:"\F0B0A"}.mdi-alpha-c-box-outline:before{content:"\F0BF1"}.mdi-alpha-c-circle:before{content:"\F0BF2"}.mdi-alpha-c-circle-outline:before{content:"\F0BF3"}.mdi-alpha-d:before{content:"\F0AF1"}.mdi-alpha-d-box:before{content:"\F0B0B"}.mdi-alpha-d-box-outline:before{content:"\F0BF4"}.mdi-alpha-d-circle:before{content:"\F0BF5"}.mdi-alpha-d-circle-outline:before{content:"\F0BF6"}.mdi-alpha-e:before{content:"\F0AF2"}.mdi-alpha-e-box:before{content:"\F0B0C"}.mdi-alpha-e-box-outline:before{content:"\F0BF7"}.mdi-alpha-e-circle:before{content:"\F0BF8"}.mdi-alpha-e-circle-outline:before{content:"\F0BF9"}.mdi-alpha-f:before{content:"\F0AF3"}.mdi-alpha-f-box:before{content:"\F0B0D"}.mdi-alpha-f-box-outline:before{content:"\F0BFA"}.mdi-alpha-f-circle:before{content:"\F0BFB"}.mdi-alpha-f-circle-outline:before{content:"\F0BFC"}.mdi-alpha-g:before{content:"\F0AF4"}.mdi-alpha-g-box:before{content:"\F0B0E"}.mdi-alpha-g-box-outline:before{content:"\F0BFD"}.mdi-alpha-g-circle:before{content:"\F0BFE"}.mdi-alpha-g-circle-outline:before{content:"\F0BFF"}.mdi-alpha-h:before{content:"\F0AF5"}.mdi-alpha-h-box:before{content:"\F0B0F"}.mdi-alpha-h-box-outline:before{content:"\F0C00"}.mdi-alpha-h-circle:before{content:"\F0C01"}.mdi-alpha-h-circle-outline:before{content:"\F0C02"}.mdi-alpha-i:before{content:"\F0AF6"}.mdi-alpha-i-box:before{content:"\F0B10"}.mdi-alpha-i-box-outline:before{content:"\F0C03"}.mdi-alpha-i-circle:before{content:"\F0C04"}.mdi-alpha-i-circle-outline:before{content:"\F0C05"}.mdi-alpha-j:before{content:"\F0AF7"}.mdi-alpha-j-box:before{content:"\F0B11"}.mdi-alpha-j-box-outline:before{content:"\F0C06"}.mdi-alpha-j-circle:before{content:"\F0C07"}.mdi-alpha-j-circle-outline:before{content:"\F0C08"}.mdi-alpha-k:before{content:"\F0AF8"}.mdi-alpha-k-box:before{content:"\F0B12"}.mdi-alpha-k-box-outline:before{content:"\F0C09"}.mdi-alpha-k-circle:before{content:"\F0C0A"}.mdi-alpha-k-circle-outline:before{content:"\F0C0B"}.mdi-alpha-l:before{content:"\F0AF9"}.mdi-alpha-l-box:before{content:"\F0B13"}.mdi-alpha-l-box-outline:before{content:"\F0C0C"}.mdi-alpha-l-circle:before{content:"\F0C0D"}.mdi-alpha-l-circle-outline:before{content:"\F0C0E"}.mdi-alpha-m:before{content:"\F0AFA"}.mdi-alpha-m-box:before{content:"\F0B14"}.mdi-alpha-m-box-outline:before{content:"\F0C0F"}.mdi-alpha-m-circle:before{content:"\F0C10"}.mdi-alpha-m-circle-outline:before{content:"\F0C11"}.mdi-alpha-n:before{content:"\F0AFB"}.mdi-alpha-n-box:before{content:"\F0B15"}.mdi-alpha-n-box-outline:before{content:"\F0C12"}.mdi-alpha-n-circle:before{content:"\F0C13"}.mdi-alpha-n-circle-outline:before{content:"\F0C14"}.mdi-alpha-o:before{content:"\F0AFC"}.mdi-alpha-o-box:before{content:"\F0B16"}.mdi-alpha-o-box-outline:before{content:"\F0C15"}.mdi-alpha-o-circle:before{content:"\F0C16"}.mdi-alpha-o-circle-outline:before{content:"\F0C17"}.mdi-alpha-p:before{content:"\F0AFD"}.mdi-alpha-p-box:before{content:"\F0B17"}.mdi-alpha-p-box-outline:before{content:"\F0C18"}.mdi-alpha-p-circle:before{content:"\F0C19"}.mdi-alpha-p-circle-outline:before{content:"\F0C1A"}.mdi-alpha-q:before{content:"\F0AFE"}.mdi-alpha-q-box:before{content:"\F0B18"}.mdi-alpha-q-box-outline:before{content:"\F0C1B"}.mdi-alpha-q-circle:before{content:"\F0C1C"}.mdi-alpha-q-circle-outline:before{content:"\F0C1D"}.mdi-alpha-r:before{content:"\F0AFF"}.mdi-alpha-r-box:before{content:"\F0B19"}.mdi-alpha-r-box-outline:before{content:"\F0C1E"}.mdi-alpha-r-circle:before{content:"\F0C1F"}.mdi-alpha-r-circle-outline:before{content:"\F0C20"}.mdi-alpha-s:before{content:"\F0B00"}.mdi-alpha-s-box:before{content:"\F0B1A"}.mdi-alpha-s-box-outline:before{content:"\F0C21"}.mdi-alpha-s-circle:before{content:"\F0C22"}.mdi-alpha-s-circle-outline:before{content:"\F0C23"}.mdi-alpha-t:before{content:"\F0B01"}.mdi-alpha-t-box:before{content:"\F0B1B"}.mdi-alpha-t-box-outline:before{content:"\F0C24"}.mdi-alpha-t-circle:before{content:"\F0C25"}.mdi-alpha-t-circle-outline:before{content:"\F0C26"}.mdi-alpha-u:before{content:"\F0B02"}.mdi-alpha-u-box:before{content:"\F0B1C"}.mdi-alpha-u-box-outline:before{content:"\F0C27"}.mdi-alpha-u-circle:before{content:"\F0C28"}.mdi-alpha-u-circle-outline:before{content:"\F0C29"}.mdi-alpha-v:before{content:"\F0B03"}.mdi-alpha-v-box:before{content:"\F0B1D"}.mdi-alpha-v-box-outline:before{content:"\F0C2A"}.mdi-alpha-v-circle:before{content:"\F0C2B"}.mdi-alpha-v-circle-outline:before{content:"\F0C2C"}.mdi-alpha-w:before{content:"\F0B04"}.mdi-alpha-w-box:before{content:"\F0B1E"}.mdi-alpha-w-box-outline:before{content:"\F0C2D"}.mdi-alpha-w-circle:before{content:"\F0C2E"}.mdi-alpha-w-circle-outline:before{content:"\F0C2F"}.mdi-alpha-x:before{content:"\F0B05"}.mdi-alpha-x-box:before{content:"\F0B1F"}.mdi-alpha-x-box-outline:before{content:"\F0C30"}.mdi-alpha-x-circle:before{content:"\F0C31"}.mdi-alpha-x-circle-outline:before{content:"\F0C32"}.mdi-alpha-y:before{content:"\F0B06"}.mdi-alpha-y-box:before{content:"\F0B20"}.mdi-alpha-y-box-outline:before{content:"\F0C33"}.mdi-alpha-y-circle:before{content:"\F0C34"}.mdi-alpha-y-circle-outline:before{content:"\F0C35"}.mdi-alpha-z:before{content:"\F0B07"}.mdi-alpha-z-box:before{content:"\F0B21"}.mdi-alpha-z-box-outline:before{content:"\F0C36"}.mdi-alpha-z-circle:before{content:"\F0C37"}.mdi-alpha-z-circle-outline:before{content:"\F0C38"}.mdi-alphabet-aurebesh:before{content:"\F132C"}.mdi-alphabet-cyrillic:before{content:"\F132D"}.mdi-alphabet-greek:before{content:"\F132E"}.mdi-alphabet-latin:before{content:"\F132F"}.mdi-alphabet-piqad:before{content:"\F1330"}.mdi-alphabet-tengwar:before{content:"\F1337"}.mdi-alphabetical:before{content:"\F002C"}.mdi-alphabetical-off:before{content:"\F100C"}.mdi-alphabetical-variant:before{content:"\F100D"}.mdi-alphabetical-variant-off:before{content:"\F100E"}.mdi-altimeter:before{content:"\F05D7"}.mdi-amazon:before{content:"\F002D"}.mdi-amazon-alexa:before{content:"\F08C6"}.mdi-ambulance:before{content:"\F002F"}.mdi-ammunition:before{content:"\F0CE8"}.mdi-ampersand:before{content:"\F0A8D"}.mdi-amplifier:before{content:"\F0030"}.mdi-amplifier-off:before{content:"\F11B5"}.mdi-anchor:before{content:"\F0031"}.mdi-android:before{content:"\F0032"}.mdi-android-auto:before{content:"\F0A8E"}.mdi-android-debug-bridge:before{content:"\F0033"}.mdi-android-messages:before{content:"\F0D45"}.mdi-android-studio:before{content:"\F0034"}.mdi-angle-acute:before{content:"\F0937"}.mdi-angle-obtuse:before{content:"\F0938"}.mdi-angle-right:before{content:"\F0939"}.mdi-angular:before{content:"\F06B2"}.mdi-angularjs:before{content:"\F06BF"}.mdi-animation:before{content:"\F05D8"}.mdi-animation-outline:before{content:"\F0A8F"}.mdi-animation-play:before{content:"\F093A"}.mdi-animation-play-outline:before{content:"\F0A90"}.mdi-ansible:before{content:"\F109A"}.mdi-antenna:before{content:"\F1119"}.mdi-anvil:before{content:"\F089B"}.mdi-apache-kafka:before{content:"\F100F"}.mdi-api:before{content:"\F109B"}.mdi-api-off:before{content:"\F1257"}.mdi-apple:before{content:"\F0035"}.mdi-apple-airplay:before{content:"\F001F"}.mdi-apple-finder:before{content:"\F0036"}.mdi-apple-icloud:before{content:"\F0038"}.mdi-apple-ios:before{content:"\F0037"}.mdi-apple-keyboard-caps:before{content:"\F0632"}.mdi-apple-keyboard-command:before{content:"\F0633"}.mdi-apple-keyboard-control:before{content:"\F0634"}.mdi-apple-keyboard-option:before{content:"\F0635"}.mdi-apple-keyboard-shift:before{content:"\F0636"}.mdi-apple-safari:before{content:"\F0039"}.mdi-application:before{content:"\F0614"}.mdi-application-cog:before{content:"\F1577"}.mdi-application-export:before{content:"\F0DAD"}.mdi-application-import:before{content:"\F0DAE"}.mdi-application-settings:before{content:"\F1555"}.mdi-approximately-equal:before{content:"\F0F9E"}.mdi-approximately-equal-box:before{content:"\F0F9F"}.mdi-apps:before{content:"\F003B"}.mdi-apps-box:before{content:"\F0D46"}.mdi-arch:before{content:"\F08C7"}.mdi-archive:before{content:"\F003C"}.mdi-archive-alert:before{content:"\F14FD"}.mdi-archive-alert-outline:before{content:"\F14FE"}.mdi-archive-arrow-down:before{content:"\F1259"}.mdi-archive-arrow-down-outline:before{content:"\F125A"}.mdi-archive-arrow-up:before{content:"\F125B"}.mdi-archive-arrow-up-outline:before{content:"\F125C"}.mdi-archive-outline:before{content:"\F120E"}.mdi-arm-flex:before{content:"\F0FD7"}.mdi-arm-flex-outline:before{content:"\F0FD6"}.mdi-arrange-bring-forward:before{content:"\F003D"}.mdi-arrange-bring-to-front:before{content:"\F003E"}.mdi-arrange-send-backward:before{content:"\F003F"}.mdi-arrange-send-to-back:before{content:"\F0040"}.mdi-arrow-all:before{content:"\F0041"}.mdi-arrow-bottom-left:before{content:"\F0042"}.mdi-arrow-bottom-left-bold-outline:before{content:"\F09B7"}.mdi-arrow-bottom-left-thick:before{content:"\F09B8"}.mdi-arrow-bottom-left-thin-circle-outline:before{content:"\F1596"}.mdi-arrow-bottom-right:before{content:"\F0043"}.mdi-arrow-bottom-right-bold-outline:before{content:"\F09B9"}.mdi-arrow-bottom-right-thick:before{content:"\F09BA"}.mdi-arrow-bottom-right-thin-circle-outline:before{content:"\F1595"}.mdi-arrow-collapse:before{content:"\F0615"}.mdi-arrow-collapse-all:before{content:"\F0044"}.mdi-arrow-collapse-down:before{content:"\F0792"}.mdi-arrow-collapse-horizontal:before{content:"\F084C"}.mdi-arrow-collapse-left:before{content:"\F0793"}.mdi-arrow-collapse-right:before{content:"\F0794"}.mdi-arrow-collapse-up:before{content:"\F0795"}.mdi-arrow-collapse-vertical:before{content:"\F084D"}.mdi-arrow-decision:before{content:"\F09BB"}.mdi-arrow-decision-auto:before{content:"\F09BC"}.mdi-arrow-decision-auto-outline:before{content:"\F09BD"}.mdi-arrow-decision-outline:before{content:"\F09BE"}.mdi-arrow-down:before{content:"\F0045"}.mdi-arrow-down-bold:before{content:"\F072E"}.mdi-arrow-down-bold-box:before{content:"\F072F"}.mdi-arrow-down-bold-box-outline:before{content:"\F0730"}.mdi-arrow-down-bold-circle:before{content:"\F0047"}.mdi-arrow-down-bold-circle-outline:before{content:"\F0048"}.mdi-arrow-down-bold-hexagon-outline:before{content:"\F0049"}.mdi-arrow-down-bold-outline:before{content:"\F09BF"}.mdi-arrow-down-box:before{content:"\F06C0"}.mdi-arrow-down-circle:before{content:"\F0CDB"}.mdi-arrow-down-circle-outline:before{content:"\F0CDC"}.mdi-arrow-down-drop-circle:before{content:"\F004A"}.mdi-arrow-down-drop-circle-outline:before{content:"\F004B"}.mdi-arrow-down-thick:before{content:"\F0046"}.mdi-arrow-down-thin-circle-outline:before{content:"\F1599"}.mdi-arrow-expand:before{content:"\F0616"}.mdi-arrow-expand-all:before{content:"\F004C"}.mdi-arrow-expand-down:before{content:"\F0796"}.mdi-arrow-expand-horizontal:before{content:"\F084E"}.mdi-arrow-expand-left:before{content:"\F0797"}.mdi-arrow-expand-right:before{content:"\F0798"}.mdi-arrow-expand-up:before{content:"\F0799"}.mdi-arrow-expand-vertical:before{content:"\F084F"}.mdi-arrow-horizontal-lock:before{content:"\F115B"}.mdi-arrow-left:before{content:"\F004D"}.mdi-arrow-left-bold:before{content:"\F0731"}.mdi-arrow-left-bold-box:before{content:"\F0732"}.mdi-arrow-left-bold-box-outline:before{content:"\F0733"}.mdi-arrow-left-bold-circle:before{content:"\F004F"}.mdi-arrow-left-bold-circle-outline:before{content:"\F0050"}.mdi-arrow-left-bold-hexagon-outline:before{content:"\F0051"}.mdi-arrow-left-bold-outline:before{content:"\F09C0"}.mdi-arrow-left-box:before{content:"\F06C1"}.mdi-arrow-left-circle:before{content:"\F0CDD"}.mdi-arrow-left-circle-outline:before{content:"\F0CDE"}.mdi-arrow-left-drop-circle:before{content:"\F0052"}.mdi-arrow-left-drop-circle-outline:before{content:"\F0053"}.mdi-arrow-left-right:before{content:"\F0E73"}.mdi-arrow-left-right-bold:before{content:"\F0E74"}.mdi-arrow-left-right-bold-outline:before{content:"\F09C1"}.mdi-arrow-left-thick:before{content:"\F004E"}.mdi-arrow-left-thin-circle-outline:before{content:"\F159A"}.mdi-arrow-right:before{content:"\F0054"}.mdi-arrow-right-bold:before{content:"\F0734"}.mdi-arrow-right-bold-box:before{content:"\F0735"}.mdi-arrow-right-bold-box-outline:before{content:"\F0736"}.mdi-arrow-right-bold-circle:before{content:"\F0056"}.mdi-arrow-right-bold-circle-outline:before{content:"\F0057"}.mdi-arrow-right-bold-hexagon-outline:before{content:"\F0058"}.mdi-arrow-right-bold-outline:before{content:"\F09C2"}.mdi-arrow-right-box:before{content:"\F06C2"}.mdi-arrow-right-circle:before{content:"\F0CDF"}.mdi-arrow-right-circle-outline:before{content:"\F0CE0"}.mdi-arrow-right-drop-circle:before{content:"\F0059"}.mdi-arrow-right-drop-circle-outline:before{content:"\F005A"}.mdi-arrow-right-thick:before{content:"\F0055"}.mdi-arrow-right-thin-circle-outline:before{content:"\F1598"}.mdi-arrow-split-horizontal:before{content:"\F093B"}.mdi-arrow-split-vertical:before{content:"\F093C"}.mdi-arrow-top-left:before{content:"\F005B"}.mdi-arrow-top-left-bold-outline:before{content:"\F09C3"}.mdi-arrow-top-left-bottom-right:before{content:"\F0E75"}.mdi-arrow-top-left-bottom-right-bold:before{content:"\F0E76"}.mdi-arrow-top-left-thick:before{content:"\F09C4"}.mdi-arrow-top-left-thin-circle-outline:before{content:"\F1593"}.mdi-arrow-top-right:before{content:"\F005C"}.mdi-arrow-top-right-bold-outline:before{content:"\F09C5"}.mdi-arrow-top-right-bottom-left:before{content:"\F0E77"}.mdi-arrow-top-right-bottom-left-bold:before{content:"\F0E78"}.mdi-arrow-top-right-thick:before{content:"\F09C6"}.mdi-arrow-top-right-thin-circle-outline:before{content:"\F1594"}.mdi-arrow-up:before{content:"\F005D"}.mdi-arrow-up-bold:before{content:"\F0737"}.mdi-arrow-up-bold-box:before{content:"\F0738"}.mdi-arrow-up-bold-box-outline:before{content:"\F0739"}.mdi-arrow-up-bold-circle:before{content:"\F005F"}.mdi-arrow-up-bold-circle-outline:before{content:"\F0060"}.mdi-arrow-up-bold-hexagon-outline:before{content:"\F0061"}.mdi-arrow-up-bold-outline:before{content:"\F09C7"}.mdi-arrow-up-box:before{content:"\F06C3"}.mdi-arrow-up-circle:before{content:"\F0CE1"}.mdi-arrow-up-circle-outline:before{content:"\F0CE2"}.mdi-arrow-up-down:before{content:"\F0E79"}.mdi-arrow-up-down-bold:before{content:"\F0E7A"}.mdi-arrow-up-down-bold-outline:before{content:"\F09C8"}.mdi-arrow-up-drop-circle:before{content:"\F0062"}.mdi-arrow-up-drop-circle-outline:before{content:"\F0063"}.mdi-arrow-up-thick:before{content:"\F005E"}.mdi-arrow-up-thin-circle-outline:before{content:"\F1597"}.mdi-arrow-vertical-lock:before{content:"\F115C"}.mdi-artstation:before{content:"\F0B5B"}.mdi-aspect-ratio:before{content:"\F0A24"}.mdi-assistant:before{content:"\F0064"}.mdi-asterisk:before{content:"\F06C4"}.mdi-at:before{content:"\F0065"}.mdi-atlassian:before{content:"\F0804"}.mdi-atm:before{content:"\F0D47"}.mdi-atom:before{content:"\F0768"}.mdi-atom-variant:before{content:"\F0E7B"}.mdi-attachment:before{content:"\F0066"}.mdi-audio-video:before{content:"\F093D"}.mdi-audio-video-off:before{content:"\F11B6"}.mdi-augmented-reality:before{content:"\F0850"}.mdi-auto-download:before{content:"\F137E"}.mdi-auto-fix:before{content:"\F0068"}.mdi-auto-upload:before{content:"\F0069"}.mdi-autorenew:before{content:"\F006A"}.mdi-av-timer:before{content:"\F006B"}.mdi-aws:before{content:"\F0E0F"}.mdi-axe:before{content:"\F08C8"}.mdi-axis:before{content:"\F0D48"}.mdi-axis-arrow:before{content:"\F0D49"}.mdi-axis-arrow-info:before{content:"\F140E"}.mdi-axis-arrow-lock:before{content:"\F0D4A"}.mdi-axis-lock:before{content:"\F0D4B"}.mdi-axis-x-arrow:before{content:"\F0D4C"}.mdi-axis-x-arrow-lock:before{content:"\F0D4D"}.mdi-axis-x-rotate-clockwise:before{content:"\F0D4E"}.mdi-axis-x-rotate-counterclockwise:before{content:"\F0D4F"}.mdi-axis-x-y-arrow-lock:before{content:"\F0D50"}.mdi-axis-y-arrow:before{content:"\F0D51"}.mdi-axis-y-arrow-lock:before{content:"\F0D52"}.mdi-axis-y-rotate-clockwise:before{content:"\F0D53"}.mdi-axis-y-rotate-counterclockwise:before{content:"\F0D54"}.mdi-axis-z-arrow:before{content:"\F0D55"}.mdi-axis-z-arrow-lock:before{content:"\F0D56"}.mdi-axis-z-rotate-clockwise:before{content:"\F0D57"}.mdi-axis-z-rotate-counterclockwise:before{content:"\F0D58"}.mdi-babel:before{content:"\F0A25"}.mdi-baby:before{content:"\F006C"}.mdi-baby-bottle:before{content:"\F0F39"}.mdi-baby-bottle-outline:before{content:"\F0F3A"}.mdi-baby-buggy:before{content:"\F13E0"}.mdi-baby-carriage:before{content:"\F068F"}.mdi-baby-carriage-off:before{content:"\F0FA0"}.mdi-baby-face:before{content:"\F0E7C"}.mdi-baby-face-outline:before{content:"\F0E7D"}.mdi-backburger:before{content:"\F006D"}.mdi-backspace:before{content:"\F006E"}.mdi-backspace-outline:before{content:"\F0B5C"}.mdi-backspace-reverse:before{content:"\F0E7E"}.mdi-backspace-reverse-outline:before{content:"\F0E7F"}.mdi-backup-restore:before{content:"\F006F"}.mdi-bacteria:before{content:"\F0ED5"}.mdi-bacteria-outline:before{content:"\F0ED6"}.mdi-badge-account:before{content:"\F0DA7"}.mdi-badge-account-alert:before{content:"\F0DA8"}.mdi-badge-account-alert-outline:before{content:"\F0DA9"}.mdi-badge-account-horizontal:before{content:"\F0E0D"}.mdi-badge-account-horizontal-outline:before{content:"\F0E0E"}.mdi-badge-account-outline:before{content:"\F0DAA"}.mdi-badminton:before{content:"\F0851"}.mdi-bag-carry-on:before{content:"\F0F3B"}.mdi-bag-carry-on-check:before{content:"\F0D65"}.mdi-bag-carry-on-off:before{content:"\F0F3C"}.mdi-bag-checked:before{content:"\F0F3D"}.mdi-bag-personal:before{content:"\F0E10"}.mdi-bag-personal-off:before{content:"\F0E11"}.mdi-bag-personal-off-outline:before{content:"\F0E12"}.mdi-bag-personal-outline:before{content:"\F0E13"}.mdi-bag-suitcase:before{content:"\F158B"}.mdi-bag-suitcase-off:before{content:"\F158D"}.mdi-bag-suitcase-off-outline:before{content:"\F158E"}.mdi-bag-suitcase-outline:before{content:"\F158C"}.mdi-baguette:before{content:"\F0F3E"}.mdi-balloon:before{content:"\F0A26"}.mdi-ballot:before{content:"\F09C9"}.mdi-ballot-outline:before{content:"\F09CA"}.mdi-ballot-recount:before{content:"\F0C39"}.mdi-ballot-recount-outline:before{content:"\F0C3A"}.mdi-bandage:before{content:"\F0DAF"}.mdi-bandcamp:before{content:"\F0675"}.mdi-bank:before{content:"\F0070"}.mdi-bank-check:before{content:"\F1655"}.mdi-bank-minus:before{content:"\F0DB0"}.mdi-bank-off:before{content:"\F1656"}.mdi-bank-off-outline:before{content:"\F1657"}.mdi-bank-outline:before{content:"\F0E80"}.mdi-bank-plus:before{content:"\F0DB1"}.mdi-bank-remove:before{content:"\F0DB2"}.mdi-bank-transfer:before{content:"\F0A27"}.mdi-bank-transfer-in:before{content:"\F0A28"}.mdi-bank-transfer-out:before{content:"\F0A29"}.mdi-barcode:before{content:"\F0071"}.mdi-barcode-off:before{content:"\F1236"}.mdi-barcode-scan:before{content:"\F0072"}.mdi-barley:before{content:"\F0073"}.mdi-barley-off:before{content:"\F0B5D"}.mdi-barn:before{content:"\F0B5E"}.mdi-barrel:before{content:"\F0074"}.mdi-baseball:before{content:"\F0852"}.mdi-baseball-bat:before{content:"\F0853"}.mdi-baseball-diamond:before{content:"\F15EC"}.mdi-baseball-diamond-outline:before{content:"\F15ED"}.mdi-bash:before{content:"\F1183"}.mdi-basket:before{content:"\F0076"}.mdi-basket-fill:before{content:"\F0077"}.mdi-basket-minus:before{content:"\F1523"}.mdi-basket-minus-outline:before{content:"\F1524"}.mdi-basket-off:before{content:"\F1525"}.mdi-basket-off-outline:before{content:"\F1526"}.mdi-basket-outline:before{content:"\F1181"}.mdi-basket-plus:before{content:"\F1527"}.mdi-basket-plus-outline:before{content:"\F1528"}.mdi-basket-remove:before{content:"\F1529"}.mdi-basket-remove-outline:before{content:"\F152A"}.mdi-basket-unfill:before{content:"\F0078"}.mdi-basketball:before{content:"\F0806"}.mdi-basketball-hoop:before{content:"\F0C3B"}.mdi-basketball-hoop-outline:before{content:"\F0C3C"}.mdi-bat:before{content:"\F0B5F"}.mdi-battery:before{content:"\F0079"}.mdi-battery-10:before{content:"\F007A"}.mdi-battery-10-bluetooth:before{content:"\F093E"}.mdi-battery-20:before{content:"\F007B"}.mdi-battery-20-bluetooth:before{content:"\F093F"}.mdi-battery-30:before{content:"\F007C"}.mdi-battery-30-bluetooth:before{content:"\F0940"}.mdi-battery-40:before{content:"\F007D"}.mdi-battery-40-bluetooth:before{content:"\F0941"}.mdi-battery-50:before{content:"\F007E"}.mdi-battery-50-bluetooth:before{content:"\F0942"}.mdi-battery-60:before{content:"\F007F"}.mdi-battery-60-bluetooth:before{content:"\F0943"}.mdi-battery-70:before{content:"\F0080"}.mdi-battery-70-bluetooth:before{content:"\F0944"}.mdi-battery-80:before{content:"\F0081"}.mdi-battery-80-bluetooth:before{content:"\F0945"}.mdi-battery-90:before{content:"\F0082"}.mdi-battery-90-bluetooth:before{content:"\F0946"}.mdi-battery-alert:before{content:"\F0083"}.mdi-battery-alert-bluetooth:before{content:"\F0947"}.mdi-battery-alert-variant:before{content:"\F10CC"}.mdi-battery-alert-variant-outline:before{content:"\F10CD"}.mdi-battery-bluetooth:before{content:"\F0948"}.mdi-battery-bluetooth-variant:before{content:"\F0949"}.mdi-battery-charging:before{content:"\F0084"}.mdi-battery-charging-10:before{content:"\F089C"}.mdi-battery-charging-100:before{content:"\F0085"}.mdi-battery-charging-20:before{content:"\F0086"}.mdi-battery-charging-30:before{content:"\F0087"}.mdi-battery-charging-40:before{content:"\F0088"}.mdi-battery-charging-50:before{content:"\F089D"}.mdi-battery-charging-60:before{content:"\F0089"}.mdi-battery-charging-70:before{content:"\F089E"}.mdi-battery-charging-80:before{content:"\F008A"}.mdi-battery-charging-90:before{content:"\F008B"}.mdi-battery-charging-high:before{content:"\F12A6"}.mdi-battery-charging-low:before{content:"\F12A4"}.mdi-battery-charging-medium:before{content:"\F12A5"}.mdi-battery-charging-outline:before{content:"\F089F"}.mdi-battery-charging-wireless:before{content:"\F0807"}.mdi-battery-charging-wireless-10:before{content:"\F0808"}.mdi-battery-charging-wireless-20:before{content:"\F0809"}.mdi-battery-charging-wireless-30:before{content:"\F080A"}.mdi-battery-charging-wireless-40:before{content:"\F080B"}.mdi-battery-charging-wireless-50:before{content:"\F080C"}.mdi-battery-charging-wireless-60:before{content:"\F080D"}.mdi-battery-charging-wireless-70:before{content:"\F080E"}.mdi-battery-charging-wireless-80:before{content:"\F080F"}.mdi-battery-charging-wireless-90:before{content:"\F0810"}.mdi-battery-charging-wireless-alert:before{content:"\F0811"}.mdi-battery-charging-wireless-outline:before{content:"\F0812"}.mdi-battery-heart:before{content:"\F120F"}.mdi-battery-heart-outline:before{content:"\F1210"}.mdi-battery-heart-variant:before{content:"\F1211"}.mdi-battery-high:before{content:"\F12A3"}.mdi-battery-low:before{content:"\F12A1"}.mdi-battery-medium:before{content:"\F12A2"}.mdi-battery-minus:before{content:"\F008C"}.mdi-battery-negative:before{content:"\F008D"}.mdi-battery-off:before{content:"\F125D"}.mdi-battery-off-outline:before{content:"\F125E"}.mdi-battery-outline:before{content:"\F008E"}.mdi-battery-plus:before{content:"\F008F"}.mdi-battery-positive:before{content:"\F0090"}.mdi-battery-unknown:before{content:"\F0091"}.mdi-battery-unknown-bluetooth:before{content:"\F094A"}.mdi-battlenet:before{content:"\F0B60"}.mdi-beach:before{content:"\F0092"}.mdi-beaker:before{content:"\F0CEA"}.mdi-beaker-alert:before{content:"\F1229"}.mdi-beaker-alert-outline:before{content:"\F122A"}.mdi-beaker-check:before{content:"\F122B"}.mdi-beaker-check-outline:before{content:"\F122C"}.mdi-beaker-minus:before{content:"\F122D"}.mdi-beaker-minus-outline:before{content:"\F122E"}.mdi-beaker-outline:before{content:"\F0690"}.mdi-beaker-plus:before{content:"\F122F"}.mdi-beaker-plus-outline:before{content:"\F1230"}.mdi-beaker-question:before{content:"\F1231"}.mdi-beaker-question-outline:before{content:"\F1232"}.mdi-beaker-remove:before{content:"\F1233"}.mdi-beaker-remove-outline:before{content:"\F1234"}.mdi-bed:before{content:"\F02E3"}.mdi-bed-double:before{content:"\F0FD4"}.mdi-bed-double-outline:before{content:"\F0FD3"}.mdi-bed-empty:before{content:"\F08A0"}.mdi-bed-king:before{content:"\F0FD2"}.mdi-bed-king-outline:before{content:"\F0FD1"}.mdi-bed-outline:before{content:"\F0099"}.mdi-bed-queen:before{content:"\F0FD0"}.mdi-bed-queen-outline:before{content:"\F0FDB"}.mdi-bed-single:before{content:"\F106D"}.mdi-bed-single-outline:before{content:"\F106E"}.mdi-bee:before{content:"\F0FA1"}.mdi-bee-flower:before{content:"\F0FA2"}.mdi-beehive-off-outline:before{content:"\F13ED"}.mdi-beehive-outline:before{content:"\F10CE"}.mdi-beekeeper:before{content:"\F14E2"}.mdi-beer:before{content:"\F0098"}.mdi-beer-outline:before{content:"\F130C"}.mdi-bell:before{content:"\F009A"}.mdi-bell-alert:before{content:"\F0D59"}.mdi-bell-alert-outline:before{content:"\F0E81"}.mdi-bell-cancel:before{content:"\F13E7"}.mdi-bell-cancel-outline:before{content:"\F13E8"}.mdi-bell-check:before{content:"\F11E5"}.mdi-bell-check-outline:before{content:"\F11E6"}.mdi-bell-circle:before{content:"\F0D5A"}.mdi-bell-circle-outline:before{content:"\F0D5B"}.mdi-bell-minus:before{content:"\F13E9"}.mdi-bell-minus-outline:before{content:"\F13EA"}.mdi-bell-off:before{content:"\F009B"}.mdi-bell-off-outline:before{content:"\F0A91"}.mdi-bell-outline:before{content:"\F009C"}.mdi-bell-plus:before{content:"\F009D"}.mdi-bell-plus-outline:before{content:"\F0A92"}.mdi-bell-remove:before{content:"\F13EB"}.mdi-bell-remove-outline:before{content:"\F13EC"}.mdi-bell-ring:before{content:"\F009E"}.mdi-bell-ring-outline:before{content:"\F009F"}.mdi-bell-sleep:before{content:"\F00A0"}.mdi-bell-sleep-outline:before{content:"\F0A93"}.mdi-beta:before{content:"\F00A1"}.mdi-betamax:before{content:"\F09CB"}.mdi-biathlon:before{content:"\F0E14"}.mdi-bicycle:before{content:"\F109C"}.mdi-bicycle-basket:before{content:"\F1235"}.mdi-bicycle-electric:before{content:"\F15B4"}.mdi-bicycle-penny-farthing:before{content:"\F15E9"}.mdi-bike:before{content:"\F00A3"}.mdi-bike-fast:before{content:"\F111F"}.mdi-billboard:before{content:"\F1010"}.mdi-billiards:before{content:"\F0B61"}.mdi-billiards-rack:before{content:"\F0B62"}.mdi-binoculars:before{content:"\F00A5"}.mdi-bio:before{content:"\F00A6"}.mdi-biohazard:before{content:"\F00A7"}.mdi-bird:before{content:"\F15C6"}.mdi-bitbucket:before{content:"\F00A8"}.mdi-bitcoin:before{content:"\F0813"}.mdi-black-mesa:before{content:"\F00A9"}.mdi-blender:before{content:"\F0CEB"}.mdi-blender-software:before{content:"\F00AB"}.mdi-blinds:before{content:"\F00AC"}.mdi-blinds-open:before{content:"\F1011"}.mdi-block-helper:before{content:"\F00AD"}.mdi-blogger:before{content:"\F00AE"}.mdi-blood-bag:before{content:"\F0CEC"}.mdi-bluetooth:before{content:"\F00AF"}.mdi-bluetooth-audio:before{content:"\F00B0"}.mdi-bluetooth-connect:before{content:"\F00B1"}.mdi-bluetooth-off:before{content:"\F00B2"}.mdi-bluetooth-settings:before{content:"\F00B3"}.mdi-bluetooth-transfer:before{content:"\F00B4"}.mdi-blur:before{content:"\F00B5"}.mdi-blur-linear:before{content:"\F00B6"}.mdi-blur-off:before{content:"\F00B7"}.mdi-blur-radial:before{content:"\F00B8"}.mdi-bolnisi-cross:before{content:"\F0CED"}.mdi-bolt:before{content:"\F0DB3"}.mdi-bomb:before{content:"\F0691"}.mdi-bomb-off:before{content:"\F06C5"}.mdi-bone:before{content:"\F00B9"}.mdi-book:before{content:"\F00BA"}.mdi-book-account:before{content:"\F13AD"}.mdi-book-account-outline:before{content:"\F13AE"}.mdi-book-alert:before{content:"\F167C"}.mdi-book-alert-outline:before{content:"\F167D"}.mdi-book-alphabet:before{content:"\F061D"}.mdi-book-arrow-down:before{content:"\F167E"}.mdi-book-arrow-down-outline:before{content:"\F167F"}.mdi-book-arrow-left:before{content:"\F1680"}.mdi-book-arrow-left-outline:before{content:"\F1681"}.mdi-book-arrow-right:before{content:"\F1682"}.mdi-book-arrow-right-outline:before{content:"\F1683"}.mdi-book-arrow-up:before{content:"\F1684"}.mdi-book-arrow-up-outline:before{content:"\F1685"}.mdi-book-cancel:before{content:"\F1686"}.mdi-book-cancel-outline:before{content:"\F1687"}.mdi-book-check:before{content:"\F14F3"}.mdi-book-check-outline:before{content:"\F14F4"}.mdi-book-clock:before{content:"\F1688"}.mdi-book-clock-outline:before{content:"\F1689"}.mdi-book-cog:before{content:"\F168A"}.mdi-book-cog-outline:before{content:"\F168B"}.mdi-book-cross:before{content:"\F00A2"}.mdi-book-edit:before{content:"\F168C"}.mdi-book-edit-outline:before{content:"\F168D"}.mdi-book-education:before{content:"\F16C9"}.mdi-book-education-outline:before{content:"\F16CA"}.mdi-book-information-variant:before{content:"\F106F"}.mdi-book-lock:before{content:"\F079A"}.mdi-book-lock-open:before{content:"\F079B"}.mdi-book-lock-open-outline:before{content:"\F168E"}.mdi-book-lock-outline:before{content:"\F168F"}.mdi-book-marker:before{content:"\F1690"}.mdi-book-marker-outline:before{content:"\F1691"}.mdi-book-minus:before{content:"\F05D9"}.mdi-book-minus-multiple:before{content:"\F0A94"}.mdi-book-minus-multiple-outline:before{content:"\F090B"}.mdi-book-minus-outline:before{content:"\F1692"}.mdi-book-multiple:before{content:"\F00BB"}.mdi-book-multiple-outline:before{content:"\F0436"}.mdi-book-music:before{content:"\F0067"}.mdi-book-music-outline:before{content:"\F1693"}.mdi-book-off:before{content:"\F1694"}.mdi-book-off-outline:before{content:"\F1695"}.mdi-book-open:before{content:"\F00BD"}.mdi-book-open-blank-variant:before{content:"\F00BE"}.mdi-book-open-outline:before{content:"\F0B63"}.mdi-book-open-page-variant:before{content:"\F05DA"}.mdi-book-open-page-variant-outline:before{content:"\F15D6"}.mdi-book-open-variant:before{content:"\F14F7"}.mdi-book-outline:before{content:"\F0B64"}.mdi-book-play:before{content:"\F0E82"}.mdi-book-play-outline:before{content:"\F0E83"}.mdi-book-plus:before{content:"\F05DB"}.mdi-book-plus-multiple:before{content:"\F0A95"}.mdi-book-plus-multiple-outline:before{content:"\F0ADE"}.mdi-book-plus-outline:before{content:"\F1696"}.mdi-book-refresh:before{content:"\F1697"}.mdi-book-refresh-outline:before{content:"\F1698"}.mdi-book-remove:before{content:"\F0A97"}.mdi-book-remove-multiple:before{content:"\F0A96"}.mdi-book-remove-multiple-outline:before{content:"\F04CA"}.mdi-book-remove-outline:before{content:"\F1699"}.mdi-book-search:before{content:"\F0E84"}.mdi-book-search-outline:before{content:"\F0E85"}.mdi-book-settings:before{content:"\F169A"}.mdi-book-settings-outline:before{content:"\F169B"}.mdi-book-sync:before{content:"\F169C"}.mdi-book-sync-outline:before{content:"\F16C8"}.mdi-book-variant:before{content:"\F00BF"}.mdi-book-variant-multiple:before{content:"\F00BC"}.mdi-bookmark:before{content:"\F00C0"}.mdi-bookmark-check:before{content:"\F00C1"}.mdi-bookmark-check-outline:before{content:"\F137B"}.mdi-bookmark-minus:before{content:"\F09CC"}.mdi-bookmark-minus-outline:before{content:"\F09CD"}.mdi-bookmark-multiple:before{content:"\F0E15"}.mdi-bookmark-multiple-outline:before{content:"\F0E16"}.mdi-bookmark-music:before{content:"\F00C2"}.mdi-bookmark-music-outline:before{content:"\F1379"}.mdi-bookmark-off:before{content:"\F09CE"}.mdi-bookmark-off-outline:before{content:"\F09CF"}.mdi-bookmark-outline:before{content:"\F00C3"}.mdi-bookmark-plus:before{content:"\F00C5"}.mdi-bookmark-plus-outline:before{content:"\F00C4"}.mdi-bookmark-remove:before{content:"\F00C6"}.mdi-bookmark-remove-outline:before{content:"\F137A"}.mdi-bookshelf:before{content:"\F125F"}.mdi-boom-gate:before{content:"\F0E86"}.mdi-boom-gate-alert:before{content:"\F0E87"}.mdi-boom-gate-alert-outline:before{content:"\F0E88"}.mdi-boom-gate-down:before{content:"\F0E89"}.mdi-boom-gate-down-outline:before{content:"\F0E8A"}.mdi-boom-gate-outline:before{content:"\F0E8B"}.mdi-boom-gate-up:before{content:"\F0E8C"}.mdi-boom-gate-up-outline:before{content:"\F0E8D"}.mdi-boombox:before{content:"\F05DC"}.mdi-boomerang:before{content:"\F10CF"}.mdi-bootstrap:before{content:"\F06C6"}.mdi-border-all:before{content:"\F00C7"}.mdi-border-all-variant:before{content:"\F08A1"}.mdi-border-bottom:before{content:"\F00C8"}.mdi-border-bottom-variant:before{content:"\F08A2"}.mdi-border-color:before{content:"\F00C9"}.mdi-border-horizontal:before{content:"\F00CA"}.mdi-border-inside:before{content:"\F00CB"}.mdi-border-left:before{content:"\F00CC"}.mdi-border-left-variant:before{content:"\F08A3"}.mdi-border-none:before{content:"\F00CD"}.mdi-border-none-variant:before{content:"\F08A4"}.mdi-border-outside:before{content:"\F00CE"}.mdi-border-right:before{content:"\F00CF"}.mdi-border-right-variant:before{content:"\F08A5"}.mdi-border-style:before{content:"\F00D0"}.mdi-border-top:before{content:"\F00D1"}.mdi-border-top-variant:before{content:"\F08A6"}.mdi-border-vertical:before{content:"\F00D2"}.mdi-bottle-soda:before{content:"\F1070"}.mdi-bottle-soda-classic:before{content:"\F1071"}.mdi-bottle-soda-classic-outline:before{content:"\F1363"}.mdi-bottle-soda-outline:before{content:"\F1072"}.mdi-bottle-tonic:before{content:"\F112E"}.mdi-bottle-tonic-outline:before{content:"\F112F"}.mdi-bottle-tonic-plus:before{content:"\F1130"}.mdi-bottle-tonic-plus-outline:before{content:"\F1131"}.mdi-bottle-tonic-skull:before{content:"\F1132"}.mdi-bottle-tonic-skull-outline:before{content:"\F1133"}.mdi-bottle-wine:before{content:"\F0854"}.mdi-bottle-wine-outline:before{content:"\F1310"}.mdi-bow-tie:before{content:"\F0678"}.mdi-bowl:before{content:"\F028E"}.mdi-bowl-mix:before{content:"\F0617"}.mdi-bowl-mix-outline:before{content:"\F02E4"}.mdi-bowl-outline:before{content:"\F02A9"}.mdi-bowling:before{content:"\F00D3"}.mdi-box:before{content:"\F00D4"}.mdi-box-cutter:before{content:"\F00D5"}.mdi-box-cutter-off:before{content:"\F0B4A"}.mdi-box-shadow:before{content:"\F0637"}.mdi-boxing-glove:before{content:"\F0B65"}.mdi-braille:before{content:"\F09D0"}.mdi-brain:before{content:"\F09D1"}.mdi-bread-slice:before{content:"\F0CEE"}.mdi-bread-slice-outline:before{content:"\F0CEF"}.mdi-bridge:before{content:"\F0618"}.mdi-briefcase:before{content:"\F00D6"}.mdi-briefcase-account:before{content:"\F0CF0"}.mdi-briefcase-account-outline:before{content:"\F0CF1"}.mdi-briefcase-check:before{content:"\F00D7"}.mdi-briefcase-check-outline:before{content:"\F131E"}.mdi-briefcase-clock:before{content:"\F10D0"}.mdi-briefcase-clock-outline:before{content:"\F10D1"}.mdi-briefcase-download:before{content:"\F00D8"}.mdi-briefcase-download-outline:before{content:"\F0C3D"}.mdi-briefcase-edit:before{content:"\F0A98"}.mdi-briefcase-edit-outline:before{content:"\F0C3E"}.mdi-briefcase-minus:before{content:"\F0A2A"}.mdi-briefcase-minus-outline:before{content:"\F0C3F"}.mdi-briefcase-off:before{content:"\F1658"}.mdi-briefcase-off-outline:before{content:"\F1659"}.mdi-briefcase-outline:before{content:"\F0814"}.mdi-briefcase-plus:before{content:"\F0A2B"}.mdi-briefcase-plus-outline:before{content:"\F0C40"}.mdi-briefcase-remove:before{content:"\F0A2C"}.mdi-briefcase-remove-outline:before{content:"\F0C41"}.mdi-briefcase-search:before{content:"\F0A2D"}.mdi-briefcase-search-outline:before{content:"\F0C42"}.mdi-briefcase-upload:before{content:"\F00D9"}.mdi-briefcase-upload-outline:before{content:"\F0C43"}.mdi-briefcase-variant:before{content:"\F1494"}.mdi-briefcase-variant-off:before{content:"\F165A"}.mdi-briefcase-variant-off-outline:before{content:"\F165B"}.mdi-briefcase-variant-outline:before{content:"\F1495"}.mdi-brightness-1:before{content:"\F00DA"}.mdi-brightness-2:before{content:"\F00DB"}.mdi-brightness-3:before{content:"\F00DC"}.mdi-brightness-4:before{content:"\F00DD"}.mdi-brightness-5:before{content:"\F00DE"}.mdi-brightness-6:before{content:"\F00DF"}.mdi-brightness-7:before{content:"\F00E0"}.mdi-brightness-auto:before{content:"\F00E1"}.mdi-brightness-percent:before{content:"\F0CF2"}.mdi-broadcast:before{content:"\F1720"}.mdi-broadcast-off:before{content:"\F1721"}.mdi-broom:before{content:"\F00E2"}.mdi-brush:before{content:"\F00E3"}.mdi-bucket:before{content:"\F1415"}.mdi-bucket-outline:before{content:"\F1416"}.mdi-buddhism:before{content:"\F094B"}.mdi-buffer:before{content:"\F0619"}.mdi-buffet:before{content:"\F0578"}.mdi-bug:before{content:"\F00E4"}.mdi-bug-check:before{content:"\F0A2E"}.mdi-bug-check-outline:before{content:"\F0A2F"}.mdi-bug-outline:before{content:"\F0A30"}.mdi-bugle:before{content:"\F0DB4"}.mdi-bulldozer:before{content:"\F0B22"}.mdi-bullet:before{content:"\F0CF3"}.mdi-bulletin-board:before{content:"\F00E5"}.mdi-bullhorn:before{content:"\F00E6"}.mdi-bullhorn-outline:before{content:"\F0B23"}.mdi-bullseye:before{content:"\F05DD"}.mdi-bullseye-arrow:before{content:"\F08C9"}.mdi-bulma:before{content:"\F12E7"}.mdi-bunk-bed:before{content:"\F1302"}.mdi-bunk-bed-outline:before{content:"\F0097"}.mdi-bus:before{content:"\F00E7"}.mdi-bus-alert:before{content:"\F0A99"}.mdi-bus-articulated-end:before{content:"\F079C"}.mdi-bus-articulated-front:before{content:"\F079D"}.mdi-bus-clock:before{content:"\F08CA"}.mdi-bus-double-decker:before{content:"\F079E"}.mdi-bus-marker:before{content:"\F1212"}.mdi-bus-multiple:before{content:"\F0F3F"}.mdi-bus-school:before{content:"\F079F"}.mdi-bus-side:before{content:"\F07A0"}.mdi-bus-stop:before{content:"\F1012"}.mdi-bus-stop-covered:before{content:"\F1013"}.mdi-bus-stop-uncovered:before{content:"\F1014"}.mdi-butterfly:before{content:"\F1589"}.mdi-butterfly-outline:before{content:"\F158A"}.mdi-cable-data:before{content:"\F1394"}.mdi-cached:before{content:"\F00E8"}.mdi-cactus:before{content:"\F0DB5"}.mdi-cake:before{content:"\F00E9"}.mdi-cake-layered:before{content:"\F00EA"}.mdi-cake-variant:before{content:"\F00EB"}.mdi-calculator:before{content:"\F00EC"}.mdi-calculator-variant:before{content:"\F0A9A"}.mdi-calculator-variant-outline:before{content:"\F15A6"}.mdi-calendar:before{content:"\F00ED"}.mdi-calendar-account:before{content:"\F0ED7"}.mdi-calendar-account-outline:before{content:"\F0ED8"}.mdi-calendar-alert:before{content:"\F0A31"}.mdi-calendar-arrow-left:before{content:"\F1134"}.mdi-calendar-arrow-right:before{content:"\F1135"}.mdi-calendar-blank:before{content:"\F00EE"}.mdi-calendar-blank-multiple:before{content:"\F1073"}.mdi-calendar-blank-outline:before{content:"\F0B66"}.mdi-calendar-check:before{content:"\F00EF"}.mdi-calendar-check-outline:before{content:"\F0C44"}.mdi-calendar-clock:before{content:"\F00F0"}.mdi-calendar-clock-outline:before{content:"\F16E1"}.mdi-calendar-cursor:before{content:"\F157B"}.mdi-calendar-edit:before{content:"\F08A7"}.mdi-calendar-end:before{content:"\F166C"}.mdi-calendar-export:before{content:"\F0B24"}.mdi-calendar-heart:before{content:"\F09D2"}.mdi-calendar-import:before{content:"\F0B25"}.mdi-calendar-lock:before{content:"\F1641"}.mdi-calendar-lock-outline:before{content:"\F1642"}.mdi-calendar-minus:before{content:"\F0D5C"}.mdi-calendar-month:before{content:"\F0E17"}.mdi-calendar-month-outline:before{content:"\F0E18"}.mdi-calendar-multiple:before{content:"\F00F1"}.mdi-calendar-multiple-check:before{content:"\F00F2"}.mdi-calendar-multiselect:before{content:"\F0A32"}.mdi-calendar-outline:before{content:"\F0B67"}.mdi-calendar-plus:before{content:"\F00F3"}.mdi-calendar-question:before{content:"\F0692"}.mdi-calendar-range:before{content:"\F0679"}.mdi-calendar-range-outline:before{content:"\F0B68"}.mdi-calendar-refresh:before{content:"\F01E1"}.mdi-calendar-refresh-outline:before{content:"\F0203"}.mdi-calendar-remove:before{content:"\F00F4"}.mdi-calendar-remove-outline:before{content:"\F0C45"}.mdi-calendar-search:before{content:"\F094C"}.mdi-calendar-star:before{content:"\F09D3"}.mdi-calendar-start:before{content:"\F166D"}.mdi-calendar-sync:before{content:"\F0E8E"}.mdi-calendar-sync-outline:before{content:"\F0E8F"}.mdi-calendar-text:before{content:"\F00F5"}.mdi-calendar-text-outline:before{content:"\F0C46"}.mdi-calendar-today:before{content:"\F00F6"}.mdi-calendar-week:before{content:"\F0A33"}.mdi-calendar-week-begin:before{content:"\F0A34"}.mdi-calendar-weekend:before{content:"\F0ED9"}.mdi-calendar-weekend-outline:before{content:"\F0EDA"}.mdi-call-made:before{content:"\F00F7"}.mdi-call-merge:before{content:"\F00F8"}.mdi-call-missed:before{content:"\F00F9"}.mdi-call-received:before{content:"\F00FA"}.mdi-call-split:before{content:"\F00FB"}.mdi-camcorder:before{content:"\F00FC"}.mdi-camcorder-off:before{content:"\F00FF"}.mdi-camera:before{content:"\F0100"}.mdi-camera-account:before{content:"\F08CB"}.mdi-camera-burst:before{content:"\F0693"}.mdi-camera-control:before{content:"\F0B69"}.mdi-camera-enhance:before{content:"\F0101"}.mdi-camera-enhance-outline:before{content:"\F0B6A"}.mdi-camera-flip:before{content:"\F15D9"}.mdi-camera-flip-outline:before{content:"\F15DA"}.mdi-camera-front:before{content:"\F0102"}.mdi-camera-front-variant:before{content:"\F0103"}.mdi-camera-gopro:before{content:"\F07A1"}.mdi-camera-image:before{content:"\F08CC"}.mdi-camera-iris:before{content:"\F0104"}.mdi-camera-metering-center:before{content:"\F07A2"}.mdi-camera-metering-matrix:before{content:"\F07A3"}.mdi-camera-metering-partial:before{content:"\F07A4"}.mdi-camera-metering-spot:before{content:"\F07A5"}.mdi-camera-off:before{content:"\F05DF"}.mdi-camera-outline:before{content:"\F0D5D"}.mdi-camera-party-mode:before{content:"\F0105"}.mdi-camera-plus:before{content:"\F0EDB"}.mdi-camera-plus-outline:before{content:"\F0EDC"}.mdi-camera-rear:before{content:"\F0106"}.mdi-camera-rear-variant:before{content:"\F0107"}.mdi-camera-retake:before{content:"\F0E19"}.mdi-camera-retake-outline:before{content:"\F0E1A"}.mdi-camera-switch:before{content:"\F0108"}.mdi-camera-switch-outline:before{content:"\F084A"}.mdi-camera-timer:before{content:"\F0109"}.mdi-camera-wireless:before{content:"\F0DB6"}.mdi-camera-wireless-outline:before{content:"\F0DB7"}.mdi-campfire:before{content:"\F0EDD"}.mdi-cancel:before{content:"\F073A"}.mdi-candle:before{content:"\F05E2"}.mdi-candycane:before{content:"\F010A"}.mdi-cannabis:before{content:"\F07A6"}.mdi-cannabis-off:before{content:"\F166E"}.mdi-caps-lock:before{content:"\F0A9B"}.mdi-car:before{content:"\F010B"}.mdi-car-2-plus:before{content:"\F1015"}.mdi-car-3-plus:before{content:"\F1016"}.mdi-car-arrow-left:before{content:"\F13B2"}.mdi-car-arrow-right:before{content:"\F13B3"}.mdi-car-back:before{content:"\F0E1B"}.mdi-car-battery:before{content:"\F010C"}.mdi-car-brake-abs:before{content:"\F0C47"}.mdi-car-brake-alert:before{content:"\F0C48"}.mdi-car-brake-hold:before{content:"\F0D5E"}.mdi-car-brake-parking:before{content:"\F0D5F"}.mdi-car-brake-retarder:before{content:"\F1017"}.mdi-car-child-seat:before{content:"\F0FA3"}.mdi-car-clutch:before{content:"\F1018"}.mdi-car-cog:before{content:"\F13CC"}.mdi-car-connected:before{content:"\F010D"}.mdi-car-convertible:before{content:"\F07A7"}.mdi-car-coolant-level:before{content:"\F1019"}.mdi-car-cruise-control:before{content:"\F0D60"}.mdi-car-defrost-front:before{content:"\F0D61"}.mdi-car-defrost-rear:before{content:"\F0D62"}.mdi-car-door:before{content:"\F0B6B"}.mdi-car-door-lock:before{content:"\F109D"}.mdi-car-electric:before{content:"\F0B6C"}.mdi-car-electric-outline:before{content:"\F15B5"}.mdi-car-emergency:before{content:"\F160F"}.mdi-car-esp:before{content:"\F0C49"}.mdi-car-estate:before{content:"\F07A8"}.mdi-car-hatchback:before{content:"\F07A9"}.mdi-car-info:before{content:"\F11BE"}.mdi-car-key:before{content:"\F0B6D"}.mdi-car-lifted-pickup:before{content:"\F152D"}.mdi-car-light-dimmed:before{content:"\F0C4A"}.mdi-car-light-fog:before{content:"\F0C4B"}.mdi-car-light-high:before{content:"\F0C4C"}.mdi-car-limousine:before{content:"\F08CD"}.mdi-car-multiple:before{content:"\F0B6E"}.mdi-car-off:before{content:"\F0E1C"}.mdi-car-outline:before{content:"\F14ED"}.mdi-car-parking-lights:before{content:"\F0D63"}.mdi-car-pickup:before{content:"\F07AA"}.mdi-car-seat:before{content:"\F0FA4"}.mdi-car-seat-cooler:before{content:"\F0FA5"}.mdi-car-seat-heater:before{content:"\F0FA6"}.mdi-car-settings:before{content:"\F13CD"}.mdi-car-shift-pattern:before{content:"\F0F40"}.mdi-car-side:before{content:"\F07AB"}.mdi-car-sports:before{content:"\F07AC"}.mdi-car-tire-alert:before{content:"\F0C4D"}.mdi-car-traction-control:before{content:"\F0D64"}.mdi-car-turbocharger:before{content:"\F101A"}.mdi-car-wash:before{content:"\F010E"}.mdi-car-windshield:before{content:"\F101B"}.mdi-car-windshield-outline:before{content:"\F101C"}.mdi-carabiner:before{content:"\F14C0"}.mdi-caravan:before{content:"\F07AD"}.mdi-card:before{content:"\F0B6F"}.mdi-card-account-details:before{content:"\F05D2"}.mdi-card-account-details-outline:before{content:"\F0DAB"}.mdi-card-account-details-star:before{content:"\F02A3"}.mdi-card-account-details-star-outline:before{content:"\F06DB"}.mdi-card-account-mail:before{content:"\F018E"}.mdi-card-account-mail-outline:before{content:"\F0E98"}.mdi-card-account-phone:before{content:"\F0E99"}.mdi-card-account-phone-outline:before{content:"\F0E9A"}.mdi-card-bulleted:before{content:"\F0B70"}.mdi-card-bulleted-off:before{content:"\F0B71"}.mdi-card-bulleted-off-outline:before{content:"\F0B72"}.mdi-card-bulleted-outline:before{content:"\F0B73"}.mdi-card-bulleted-settings:before{content:"\F0B74"}.mdi-card-bulleted-settings-outline:before{content:"\F0B75"}.mdi-card-minus:before{content:"\F1600"}.mdi-card-minus-outline:before{content:"\F1601"}.mdi-card-off:before{content:"\F1602"}.mdi-card-off-outline:before{content:"\F1603"}.mdi-card-outline:before{content:"\F0B76"}.mdi-card-plus:before{content:"\F11FF"}.mdi-card-plus-outline:before{content:"\F1200"}.mdi-card-remove:before{content:"\F1604"}.mdi-card-remove-outline:before{content:"\F1605"}.mdi-card-search:before{content:"\F1074"}.mdi-card-search-outline:before{content:"\F1075"}.mdi-card-text:before{content:"\F0B77"}.mdi-card-text-outline:before{content:"\F0B78"}.mdi-cards:before{content:"\F0638"}.mdi-cards-club:before{content:"\F08CE"}.mdi-cards-diamond:before{content:"\F08CF"}.mdi-cards-diamond-outline:before{content:"\F101D"}.mdi-cards-heart:before{content:"\F08D0"}.mdi-cards-outline:before{content:"\F0639"}.mdi-cards-playing-outline:before{content:"\F063A"}.mdi-cards-spade:before{content:"\F08D1"}.mdi-cards-variant:before{content:"\F06C7"}.mdi-carrot:before{content:"\F010F"}.mdi-cart:before{content:"\F0110"}.mdi-cart-arrow-down:before{content:"\F0D66"}.mdi-cart-arrow-right:before{content:"\F0C4E"}.mdi-cart-arrow-up:before{content:"\F0D67"}.mdi-cart-check:before{content:"\F15EA"}.mdi-cart-minus:before{content:"\F0D68"}.mdi-cart-off:before{content:"\F066B"}.mdi-cart-outline:before{content:"\F0111"}.mdi-cart-plus:before{content:"\F0112"}.mdi-cart-remove:before{content:"\F0D69"}.mdi-cart-variant:before{content:"\F15EB"}.mdi-case-sensitive-alt:before{content:"\F0113"}.mdi-cash:before{content:"\F0114"}.mdi-cash-100:before{content:"\F0115"}.mdi-cash-check:before{content:"\F14EE"}.mdi-cash-lock:before{content:"\F14EA"}.mdi-cash-lock-open:before{content:"\F14EB"}.mdi-cash-marker:before{content:"\F0DB8"}.mdi-cash-minus:before{content:"\F1260"}.mdi-cash-multiple:before{content:"\F0116"}.mdi-cash-plus:before{content:"\F1261"}.mdi-cash-refund:before{content:"\F0A9C"}.mdi-cash-register:before{content:"\F0CF4"}.mdi-cash-remove:before{content:"\F1262"}.mdi-cash-usd:before{content:"\F1176"}.mdi-cash-usd-outline:before{content:"\F0117"}.mdi-cassette:before{content:"\F09D4"}.mdi-cast:before{content:"\F0118"}.mdi-cast-audio:before{content:"\F101E"}.mdi-cast-connected:before{content:"\F0119"}.mdi-cast-education:before{content:"\F0E1D"}.mdi-cast-off:before{content:"\F078A"}.mdi-castle:before{content:"\F011A"}.mdi-cat:before{content:"\F011B"}.mdi-cctv:before{content:"\F07AE"}.mdi-ceiling-light:before{content:"\F0769"}.mdi-cellphone:before{content:"\F011C"}.mdi-cellphone-android:before{content:"\F011D"}.mdi-cellphone-arrow-down:before{content:"\F09D5"}.mdi-cellphone-basic:before{content:"\F011E"}.mdi-cellphone-charging:before{content:"\F1397"}.mdi-cellphone-cog:before{content:"\F0951"}.mdi-cellphone-dock:before{content:"\F011F"}.mdi-cellphone-erase:before{content:"\F094D"}.mdi-cellphone-information:before{content:"\F0F41"}.mdi-cellphone-iphone:before{content:"\F0120"}.mdi-cellphone-key:before{content:"\F094E"}.mdi-cellphone-link:before{content:"\F0121"}.mdi-cellphone-link-off:before{content:"\F0122"}.mdi-cellphone-lock:before{content:"\F094F"}.mdi-cellphone-message:before{content:"\F08D3"}.mdi-cellphone-message-off:before{content:"\F10D2"}.mdi-cellphone-nfc:before{content:"\F0E90"}.mdi-cellphone-nfc-off:before{content:"\F12D8"}.mdi-cellphone-off:before{content:"\F0950"}.mdi-cellphone-play:before{content:"\F101F"}.mdi-cellphone-screenshot:before{content:"\F0A35"}.mdi-cellphone-settings:before{content:"\F0123"}.mdi-cellphone-sound:before{content:"\F0952"}.mdi-cellphone-text:before{content:"\F08D2"}.mdi-cellphone-wireless:before{content:"\F0815"}.mdi-celtic-cross:before{content:"\F0CF5"}.mdi-centos:before{content:"\F111A"}.mdi-certificate:before{content:"\F0124"}.mdi-certificate-outline:before{content:"\F1188"}.mdi-chair-rolling:before{content:"\F0F48"}.mdi-chair-school:before{content:"\F0125"}.mdi-charity:before{content:"\F0C4F"}.mdi-chart-arc:before{content:"\F0126"}.mdi-chart-areaspline:before{content:"\F0127"}.mdi-chart-areaspline-variant:before{content:"\F0E91"}.mdi-chart-bar:before{content:"\F0128"}.mdi-chart-bar-stacked:before{content:"\F076A"}.mdi-chart-bell-curve:before{content:"\F0C50"}.mdi-chart-bell-curve-cumulative:before{content:"\F0FA7"}.mdi-chart-box:before{content:"\F154D"}.mdi-chart-box-outline:before{content:"\F154E"}.mdi-chart-box-plus-outline:before{content:"\F154F"}.mdi-chart-bubble:before{content:"\F05E3"}.mdi-chart-donut:before{content:"\F07AF"}.mdi-chart-donut-variant:before{content:"\F07B0"}.mdi-chart-gantt:before{content:"\F066C"}.mdi-chart-histogram:before{content:"\F0129"}.mdi-chart-line:before{content:"\F012A"}.mdi-chart-line-stacked:before{content:"\F076B"}.mdi-chart-line-variant:before{content:"\F07B1"}.mdi-chart-multiline:before{content:"\F08D4"}.mdi-chart-multiple:before{content:"\F1213"}.mdi-chart-pie:before{content:"\F012B"}.mdi-chart-ppf:before{content:"\F1380"}.mdi-chart-sankey:before{content:"\F11DF"}.mdi-chart-sankey-variant:before{content:"\F11E0"}.mdi-chart-scatter-plot:before{content:"\F0E92"}.mdi-chart-scatter-plot-hexbin:before{content:"\F066D"}.mdi-chart-timeline:before{content:"\F066E"}.mdi-chart-timeline-variant:before{content:"\F0E93"}.mdi-chart-timeline-variant-shimmer:before{content:"\F15B6"}.mdi-chart-tree:before{content:"\F0E94"}.mdi-chat:before{content:"\F0B79"}.mdi-chat-alert:before{content:"\F0B7A"}.mdi-chat-alert-outline:before{content:"\F12C9"}.mdi-chat-minus:before{content:"\F1410"}.mdi-chat-minus-outline:before{content:"\F1413"}.mdi-chat-outline:before{content:"\F0EDE"}.mdi-chat-plus:before{content:"\F140F"}.mdi-chat-plus-outline:before{content:"\F1412"}.mdi-chat-processing:before{content:"\F0B7B"}.mdi-chat-processing-outline:before{content:"\F12CA"}.mdi-chat-question:before{content:"\F1738"}.mdi-chat-question-outline:before{content:"\F1739"}.mdi-chat-remove:before{content:"\F1411"}.mdi-chat-remove-outline:before{content:"\F1414"}.mdi-chat-sleep:before{content:"\F12D1"}.mdi-chat-sleep-outline:before{content:"\F12D2"}.mdi-check:before{content:"\F012C"}.mdi-check-all:before{content:"\F012D"}.mdi-check-bold:before{content:"\F0E1E"}.mdi-check-box-multiple-outline:before{content:"\F0C51"}.mdi-check-box-outline:before{content:"\F0C52"}.mdi-check-circle:before{content:"\F05E0"}.mdi-check-circle-outline:before{content:"\F05E1"}.mdi-check-decagram:before{content:"\F0791"}.mdi-check-decagram-outline:before{content:"\F1740"}.mdi-check-network:before{content:"\F0C53"}.mdi-check-network-outline:before{content:"\F0C54"}.mdi-check-outline:before{content:"\F0855"}.mdi-check-underline:before{content:"\F0E1F"}.mdi-check-underline-circle:before{content:"\F0E20"}.mdi-check-underline-circle-outline:before{content:"\F0E21"}.mdi-checkbook:before{content:"\F0A9D"}.mdi-checkbox-blank:before{content:"\F012E"}.mdi-checkbox-blank-circle:before{content:"\F012F"}.mdi-checkbox-blank-circle-outline:before{content:"\F0130"}.mdi-checkbox-blank-off:before{content:"\F12EC"}.mdi-checkbox-blank-off-outline:before{content:"\F12ED"}.mdi-checkbox-blank-outline:before{content:"\F0131"}.mdi-checkbox-intermediate:before{content:"\F0856"}.mdi-checkbox-marked:before{content:"\F0132"}.mdi-checkbox-marked-circle:before{content:"\F0133"}.mdi-checkbox-marked-circle-outline:before{content:"\F0134"}.mdi-checkbox-marked-outline:before{content:"\F0135"}.mdi-checkbox-multiple-blank:before{content:"\F0136"}.mdi-checkbox-multiple-blank-circle:before{content:"\F063B"}.mdi-checkbox-multiple-blank-circle-outline:before{content:"\F063C"}.mdi-checkbox-multiple-blank-outline:before{content:"\F0137"}.mdi-checkbox-multiple-marked:before{content:"\F0138"}.mdi-checkbox-multiple-marked-circle:before{content:"\F063D"}.mdi-checkbox-multiple-marked-circle-outline:before{content:"\F063E"}.mdi-checkbox-multiple-marked-outline:before{content:"\F0139"}.mdi-checkerboard:before{content:"\F013A"}.mdi-checkerboard-minus:before{content:"\F1202"}.mdi-checkerboard-plus:before{content:"\F1201"}.mdi-checkerboard-remove:before{content:"\F1203"}.mdi-cheese:before{content:"\F12B9"}.mdi-cheese-off:before{content:"\F13EE"}.mdi-chef-hat:before{content:"\F0B7C"}.mdi-chemical-weapon:before{content:"\F013B"}.mdi-chess-bishop:before{content:"\F085C"}.mdi-chess-king:before{content:"\F0857"}.mdi-chess-knight:before{content:"\F0858"}.mdi-chess-pawn:before{content:"\F0859"}.mdi-chess-queen:before{content:"\F085A"}.mdi-chess-rook:before{content:"\F085B"}.mdi-chevron-double-down:before{content:"\F013C"}.mdi-chevron-double-left:before{content:"\F013D"}.mdi-chevron-double-right:before{content:"\F013E"}.mdi-chevron-double-up:before{content:"\F013F"}.mdi-chevron-down:before{content:"\F0140"}.mdi-chevron-down-box:before{content:"\F09D6"}.mdi-chevron-down-box-outline:before{content:"\F09D7"}.mdi-chevron-down-circle:before{content:"\F0B26"}.mdi-chevron-down-circle-outline:before{content:"\F0B27"}.mdi-chevron-left:before{content:"\F0141"}.mdi-chevron-left-box:before{content:"\F09D8"}.mdi-chevron-left-box-outline:before{content:"\F09D9"}.mdi-chevron-left-circle:before{content:"\F0B28"}.mdi-chevron-left-circle-outline:before{content:"\F0B29"}.mdi-chevron-right:before{content:"\F0142"}.mdi-chevron-right-box:before{content:"\F09DA"}.mdi-chevron-right-box-outline:before{content:"\F09DB"}.mdi-chevron-right-circle:before{content:"\F0B2A"}.mdi-chevron-right-circle-outline:before{content:"\F0B2B"}.mdi-chevron-triple-down:before{content:"\F0DB9"}.mdi-chevron-triple-left:before{content:"\F0DBA"}.mdi-chevron-triple-right:before{content:"\F0DBB"}.mdi-chevron-triple-up:before{content:"\F0DBC"}.mdi-chevron-up:before{content:"\F0143"}.mdi-chevron-up-box:before{content:"\F09DC"}.mdi-chevron-up-box-outline:before{content:"\F09DD"}.mdi-chevron-up-circle:before{content:"\F0B2C"}.mdi-chevron-up-circle-outline:before{content:"\F0B2D"}.mdi-chili-hot:before{content:"\F07B2"}.mdi-chili-medium:before{content:"\F07B3"}.mdi-chili-mild:before{content:"\F07B4"}.mdi-chili-off:before{content:"\F1467"}.mdi-chip:before{content:"\F061A"}.mdi-christianity:before{content:"\F0953"}.mdi-christianity-outline:before{content:"\F0CF6"}.mdi-church:before{content:"\F0144"}.mdi-cigar:before{content:"\F1189"}.mdi-cigar-off:before{content:"\F141B"}.mdi-circle:before{content:"\F0765"}.mdi-circle-box:before{content:"\F15DC"}.mdi-circle-box-outline:before{content:"\F15DD"}.mdi-circle-double:before{content:"\F0E95"}.mdi-circle-edit-outline:before{content:"\F08D5"}.mdi-circle-expand:before{content:"\F0E96"}.mdi-circle-half:before{content:"\F1395"}.mdi-circle-half-full:before{content:"\F1396"}.mdi-circle-medium:before{content:"\F09DE"}.mdi-circle-multiple:before{content:"\F0B38"}.mdi-circle-multiple-outline:before{content:"\F0695"}.mdi-circle-off-outline:before{content:"\F10D3"}.mdi-circle-outline:before{content:"\F0766"}.mdi-circle-slice-1:before{content:"\F0A9E"}.mdi-circle-slice-2:before{content:"\F0A9F"}.mdi-circle-slice-3:before{content:"\F0AA0"}.mdi-circle-slice-4:before{content:"\F0AA1"}.mdi-circle-slice-5:before{content:"\F0AA2"}.mdi-circle-slice-6:before{content:"\F0AA3"}.mdi-circle-slice-7:before{content:"\F0AA4"}.mdi-circle-slice-8:before{content:"\F0AA5"}.mdi-circle-small:before{content:"\F09DF"}.mdi-circular-saw:before{content:"\F0E22"}.mdi-city:before{content:"\F0146"}.mdi-city-variant:before{content:"\F0A36"}.mdi-city-variant-outline:before{content:"\F0A37"}.mdi-clipboard:before{content:"\F0147"}.mdi-clipboard-account:before{content:"\F0148"}.mdi-clipboard-account-outline:before{content:"\F0C55"}.mdi-clipboard-alert:before{content:"\F0149"}.mdi-clipboard-alert-outline:before{content:"\F0CF7"}.mdi-clipboard-arrow-down:before{content:"\F014A"}.mdi-clipboard-arrow-down-outline:before{content:"\F0C56"}.mdi-clipboard-arrow-left:before{content:"\F014B"}.mdi-clipboard-arrow-left-outline:before{content:"\F0CF8"}.mdi-clipboard-arrow-right:before{content:"\F0CF9"}.mdi-clipboard-arrow-right-outline:before{content:"\F0CFA"}.mdi-clipboard-arrow-up:before{content:"\F0C57"}.mdi-clipboard-arrow-up-outline:before{content:"\F0C58"}.mdi-clipboard-check:before{content:"\F014E"}.mdi-clipboard-check-multiple:before{content:"\F1263"}.mdi-clipboard-check-multiple-outline:before{content:"\F1264"}.mdi-clipboard-check-outline:before{content:"\F08A8"}.mdi-clipboard-clock:before{content:"\F16E2"}.mdi-clipboard-clock-outline:before{content:"\F16E3"}.mdi-clipboard-edit:before{content:"\F14E5"}.mdi-clipboard-edit-outline:before{content:"\F14E6"}.mdi-clipboard-file:before{content:"\F1265"}.mdi-clipboard-file-outline:before{content:"\F1266"}.mdi-clipboard-flow:before{content:"\F06C8"}.mdi-clipboard-flow-outline:before{content:"\F1117"}.mdi-clipboard-list:before{content:"\F10D4"}.mdi-clipboard-list-outline:before{content:"\F10D5"}.mdi-clipboard-minus:before{content:"\F1618"}.mdi-clipboard-minus-outline:before{content:"\F1619"}.mdi-clipboard-multiple:before{content:"\F1267"}.mdi-clipboard-multiple-outline:before{content:"\F1268"}.mdi-clipboard-off:before{content:"\F161A"}.mdi-clipboard-off-outline:before{content:"\F161B"}.mdi-clipboard-outline:before{content:"\F014C"}.mdi-clipboard-play:before{content:"\F0C59"}.mdi-clipboard-play-multiple:before{content:"\F1269"}.mdi-clipboard-play-multiple-outline:before{content:"\F126A"}.mdi-clipboard-play-outline:before{content:"\F0C5A"}.mdi-clipboard-plus:before{content:"\F0751"}.mdi-clipboard-plus-outline:before{content:"\F131F"}.mdi-clipboard-pulse:before{content:"\F085D"}.mdi-clipboard-pulse-outline:before{content:"\F085E"}.mdi-clipboard-remove:before{content:"\F161C"}.mdi-clipboard-remove-outline:before{content:"\F161D"}.mdi-clipboard-search:before{content:"\F161E"}.mdi-clipboard-search-outline:before{content:"\F161F"}.mdi-clipboard-text:before{content:"\F014D"}.mdi-clipboard-text-multiple:before{content:"\F126B"}.mdi-clipboard-text-multiple-outline:before{content:"\F126C"}.mdi-clipboard-text-off:before{content:"\F1620"}.mdi-clipboard-text-off-outline:before{content:"\F1621"}.mdi-clipboard-text-outline:before{content:"\F0A38"}.mdi-clipboard-text-play:before{content:"\F0C5B"}.mdi-clipboard-text-play-outline:before{content:"\F0C5C"}.mdi-clipboard-text-search:before{content:"\F1622"}.mdi-clipboard-text-search-outline:before{content:"\F1623"}.mdi-clippy:before{content:"\F014F"}.mdi-clock:before{content:"\F0954"}.mdi-clock-alert:before{content:"\F0955"}.mdi-clock-alert-outline:before{content:"\F05CE"}.mdi-clock-check:before{content:"\F0FA8"}.mdi-clock-check-outline:before{content:"\F0FA9"}.mdi-clock-digital:before{content:"\F0E97"}.mdi-clock-end:before{content:"\F0151"}.mdi-clock-fast:before{content:"\F0152"}.mdi-clock-in:before{content:"\F0153"}.mdi-clock-out:before{content:"\F0154"}.mdi-clock-outline:before{content:"\F0150"}.mdi-clock-start:before{content:"\F0155"}.mdi-clock-time-eight:before{content:"\F1446"}.mdi-clock-time-eight-outline:before{content:"\F1452"}.mdi-clock-time-eleven:before{content:"\F1449"}.mdi-clock-time-eleven-outline:before{content:"\F1455"}.mdi-clock-time-five:before{content:"\F1443"}.mdi-clock-time-five-outline:before{content:"\F144F"}.mdi-clock-time-four:before{content:"\F1442"}.mdi-clock-time-four-outline:before{content:"\F144E"}.mdi-clock-time-nine:before{content:"\F1447"}.mdi-clock-time-nine-outline:before{content:"\F1453"}.mdi-clock-time-one:before{content:"\F143F"}.mdi-clock-time-one-outline:before{content:"\F144B"}.mdi-clock-time-seven:before{content:"\F1445"}.mdi-clock-time-seven-outline:before{content:"\F1451"}.mdi-clock-time-six:before{content:"\F1444"}.mdi-clock-time-six-outline:before{content:"\F1450"}.mdi-clock-time-ten:before{content:"\F1448"}.mdi-clock-time-ten-outline:before{content:"\F1454"}.mdi-clock-time-three:before{content:"\F1441"}.mdi-clock-time-three-outline:before{content:"\F144D"}.mdi-clock-time-twelve:before{content:"\F144A"}.mdi-clock-time-twelve-outline:before{content:"\F1456"}.mdi-clock-time-two:before{content:"\F1440"}.mdi-clock-time-two-outline:before{content:"\F144C"}.mdi-close:before{content:"\F0156"}.mdi-close-box:before{content:"\F0157"}.mdi-close-box-multiple:before{content:"\F0C5D"}.mdi-close-box-multiple-outline:before{content:"\F0C5E"}.mdi-close-box-outline:before{content:"\F0158"}.mdi-close-circle:before{content:"\F0159"}.mdi-close-circle-multiple:before{content:"\F062A"}.mdi-close-circle-multiple-outline:before{content:"\F0883"}.mdi-close-circle-outline:before{content:"\F015A"}.mdi-close-network:before{content:"\F015B"}.mdi-close-network-outline:before{content:"\F0C5F"}.mdi-close-octagon:before{content:"\F015C"}.mdi-close-octagon-outline:before{content:"\F015D"}.mdi-close-outline:before{content:"\F06C9"}.mdi-close-thick:before{content:"\F1398"}.mdi-closed-caption:before{content:"\F015E"}.mdi-closed-caption-outline:before{content:"\F0DBD"}.mdi-cloud:before{content:"\F015F"}.mdi-cloud-alert:before{content:"\F09E0"}.mdi-cloud-braces:before{content:"\F07B5"}.mdi-cloud-check:before{content:"\F0160"}.mdi-cloud-check-outline:before{content:"\F12CC"}.mdi-cloud-circle:before{content:"\F0161"}.mdi-cloud-download:before{content:"\F0162"}.mdi-cloud-download-outline:before{content:"\F0B7D"}.mdi-cloud-lock:before{content:"\F11F1"}.mdi-cloud-lock-outline:before{content:"\F11F2"}.mdi-cloud-off-outline:before{content:"\F0164"}.mdi-cloud-outline:before{content:"\F0163"}.mdi-cloud-print:before{content:"\F0165"}.mdi-cloud-print-outline:before{content:"\F0166"}.mdi-cloud-question:before{content:"\F0A39"}.mdi-cloud-refresh:before{content:"\F052A"}.mdi-cloud-search:before{content:"\F0956"}.mdi-cloud-search-outline:before{content:"\F0957"}.mdi-cloud-sync:before{content:"\F063F"}.mdi-cloud-sync-outline:before{content:"\F12D6"}.mdi-cloud-tags:before{content:"\F07B6"}.mdi-cloud-upload:before{content:"\F0167"}.mdi-cloud-upload-outline:before{content:"\F0B7E"}.mdi-clover:before{content:"\F0816"}.mdi-coach-lamp:before{content:"\F1020"}.mdi-coat-rack:before{content:"\F109E"}.mdi-code-array:before{content:"\F0168"}.mdi-code-braces:before{content:"\F0169"}.mdi-code-braces-box:before{content:"\F10D6"}.mdi-code-brackets:before{content:"\F016A"}.mdi-code-equal:before{content:"\F016B"}.mdi-code-greater-than:before{content:"\F016C"}.mdi-code-greater-than-or-equal:before{content:"\F016D"}.mdi-code-json:before{content:"\F0626"}.mdi-code-less-than:before{content:"\F016E"}.mdi-code-less-than-or-equal:before{content:"\F016F"}.mdi-code-not-equal:before{content:"\F0170"}.mdi-code-not-equal-variant:before{content:"\F0171"}.mdi-code-parentheses:before{content:"\F0172"}.mdi-code-parentheses-box:before{content:"\F10D7"}.mdi-code-string:before{content:"\F0173"}.mdi-code-tags:before{content:"\F0174"}.mdi-code-tags-check:before{content:"\F0694"}.mdi-codepen:before{content:"\F0175"}.mdi-coffee:before{content:"\F0176"}.mdi-coffee-maker:before{content:"\F109F"}.mdi-coffee-off:before{content:"\F0FAA"}.mdi-coffee-off-outline:before{content:"\F0FAB"}.mdi-coffee-outline:before{content:"\F06CA"}.mdi-coffee-to-go:before{content:"\F0177"}.mdi-coffee-to-go-outline:before{content:"\F130E"}.mdi-coffin:before{content:"\F0B7F"}.mdi-cog:before{content:"\F0493"}.mdi-cog-box:before{content:"\F0494"}.mdi-cog-clockwise:before{content:"\F11DD"}.mdi-cog-counterclockwise:before{content:"\F11DE"}.mdi-cog-off:before{content:"\F13CE"}.mdi-cog-off-outline:before{content:"\F13CF"}.mdi-cog-outline:before{content:"\F08BB"}.mdi-cog-refresh:before{content:"\F145E"}.mdi-cog-refresh-outline:before{content:"\F145F"}.mdi-cog-sync:before{content:"\F1460"}.mdi-cog-sync-outline:before{content:"\F1461"}.mdi-cog-transfer:before{content:"\F105B"}.mdi-cog-transfer-outline:before{content:"\F105C"}.mdi-cogs:before{content:"\F08D6"}.mdi-collage:before{content:"\F0640"}.mdi-collapse-all:before{content:"\F0AA6"}.mdi-collapse-all-outline:before{content:"\F0AA7"}.mdi-color-helper:before{content:"\F0179"}.mdi-comma:before{content:"\F0E23"}.mdi-comma-box:before{content:"\F0E2B"}.mdi-comma-box-outline:before{content:"\F0E24"}.mdi-comma-circle:before{content:"\F0E25"}.mdi-comma-circle-outline:before{content:"\F0E26"}.mdi-comment:before{content:"\F017A"}.mdi-comment-account:before{content:"\F017B"}.mdi-comment-account-outline:before{content:"\F017C"}.mdi-comment-alert:before{content:"\F017D"}.mdi-comment-alert-outline:before{content:"\F017E"}.mdi-comment-arrow-left:before{content:"\F09E1"}.mdi-comment-arrow-left-outline:before{content:"\F09E2"}.mdi-comment-arrow-right:before{content:"\F09E3"}.mdi-comment-arrow-right-outline:before{content:"\F09E4"}.mdi-comment-bookmark:before{content:"\F15AE"}.mdi-comment-bookmark-outline:before{content:"\F15AF"}.mdi-comment-check:before{content:"\F017F"}.mdi-comment-check-outline:before{content:"\F0180"}.mdi-comment-edit:before{content:"\F11BF"}.mdi-comment-edit-outline:before{content:"\F12C4"}.mdi-comment-eye:before{content:"\F0A3A"}.mdi-comment-eye-outline:before{content:"\F0A3B"}.mdi-comment-flash:before{content:"\F15B0"}.mdi-comment-flash-outline:before{content:"\F15B1"}.mdi-comment-minus:before{content:"\F15DF"}.mdi-comment-minus-outline:before{content:"\F15E0"}.mdi-comment-multiple:before{content:"\F085F"}.mdi-comment-multiple-outline:before{content:"\F0181"}.mdi-comment-off:before{content:"\F15E1"}.mdi-comment-off-outline:before{content:"\F15E2"}.mdi-comment-outline:before{content:"\F0182"}.mdi-comment-plus:before{content:"\F09E5"}.mdi-comment-plus-outline:before{content:"\F0183"}.mdi-comment-processing:before{content:"\F0184"}.mdi-comment-processing-outline:before{content:"\F0185"}.mdi-comment-question:before{content:"\F0817"}.mdi-comment-question-outline:before{content:"\F0186"}.mdi-comment-quote:before{content:"\F1021"}.mdi-comment-quote-outline:before{content:"\F1022"}.mdi-comment-remove:before{content:"\F05DE"}.mdi-comment-remove-outline:before{content:"\F0187"}.mdi-comment-search:before{content:"\F0A3C"}.mdi-comment-search-outline:before{content:"\F0A3D"}.mdi-comment-text:before{content:"\F0188"}.mdi-comment-text-multiple:before{content:"\F0860"}.mdi-comment-text-multiple-outline:before{content:"\F0861"}.mdi-comment-text-outline:before{content:"\F0189"}.mdi-compare:before{content:"\F018A"}.mdi-compare-horizontal:before{content:"\F1492"}.mdi-compare-vertical:before{content:"\F1493"}.mdi-compass:before{content:"\F018B"}.mdi-compass-off:before{content:"\F0B80"}.mdi-compass-off-outline:before{content:"\F0B81"}.mdi-compass-outline:before{content:"\F018C"}.mdi-compass-rose:before{content:"\F1382"}.mdi-concourse-ci:before{content:"\F10A0"}.mdi-connection:before{content:"\F1616"}.mdi-console:before{content:"\F018D"}.mdi-console-line:before{content:"\F07B7"}.mdi-console-network:before{content:"\F08A9"}.mdi-console-network-outline:before{content:"\F0C60"}.mdi-consolidate:before{content:"\F10D8"}.mdi-contactless-payment:before{content:"\F0D6A"}.mdi-contactless-payment-circle:before{content:"\F0321"}.mdi-contactless-payment-circle-outline:before{content:"\F0408"}.mdi-contacts:before{content:"\F06CB"}.mdi-contacts-outline:before{content:"\F05B8"}.mdi-contain:before{content:"\F0A3E"}.mdi-contain-end:before{content:"\F0A3F"}.mdi-contain-start:before{content:"\F0A40"}.mdi-content-copy:before{content:"\F018F"}.mdi-content-cut:before{content:"\F0190"}.mdi-content-duplicate:before{content:"\F0191"}.mdi-content-paste:before{content:"\F0192"}.mdi-content-save:before{content:"\F0193"}.mdi-content-save-alert:before{content:"\F0F42"}.mdi-content-save-alert-outline:before{content:"\F0F43"}.mdi-content-save-all:before{content:"\F0194"}.mdi-content-save-all-outline:before{content:"\F0F44"}.mdi-content-save-cog:before{content:"\F145B"}.mdi-content-save-cog-outline:before{content:"\F145C"}.mdi-content-save-edit:before{content:"\F0CFB"}.mdi-content-save-edit-outline:before{content:"\F0CFC"}.mdi-content-save-move:before{content:"\F0E27"}.mdi-content-save-move-outline:before{content:"\F0E28"}.mdi-content-save-off:before{content:"\F1643"}.mdi-content-save-off-outline:before{content:"\F1644"}.mdi-content-save-outline:before{content:"\F0818"}.mdi-content-save-settings:before{content:"\F061B"}.mdi-content-save-settings-outline:before{content:"\F0B2E"}.mdi-contrast:before{content:"\F0195"}.mdi-contrast-box:before{content:"\F0196"}.mdi-contrast-circle:before{content:"\F0197"}.mdi-controller-classic:before{content:"\F0B82"}.mdi-controller-classic-outline:before{content:"\F0B83"}.mdi-cookie:before{content:"\F0198"}.mdi-cookie-alert:before{content:"\F16D0"}.mdi-cookie-alert-outline:before{content:"\F16D1"}.mdi-cookie-check:before{content:"\F16D2"}.mdi-cookie-check-outline:before{content:"\F16D3"}.mdi-cookie-clock:before{content:"\F16E4"}.mdi-cookie-clock-outline:before{content:"\F16E5"}.mdi-cookie-cog:before{content:"\F16D4"}.mdi-cookie-cog-outline:before{content:"\F16D5"}.mdi-cookie-edit:before{content:"\F16E6"}.mdi-cookie-edit-outline:before{content:"\F16E7"}.mdi-cookie-lock:before{content:"\F16E8"}.mdi-cookie-lock-outline:before{content:"\F16E9"}.mdi-cookie-minus:before{content:"\F16DA"}.mdi-cookie-minus-outline:before{content:"\F16DB"}.mdi-cookie-off:before{content:"\F16EA"}.mdi-cookie-off-outline:before{content:"\F16EB"}.mdi-cookie-outline:before{content:"\F16DE"}.mdi-cookie-plus:before{content:"\F16D6"}.mdi-cookie-plus-outline:before{content:"\F16D7"}.mdi-cookie-refresh:before{content:"\F16EC"}.mdi-cookie-refresh-outline:before{content:"\F16ED"}.mdi-cookie-remove:before{content:"\F16D8"}.mdi-cookie-remove-outline:before{content:"\F16D9"}.mdi-cookie-settings:before{content:"\F16DC"}.mdi-cookie-settings-outline:before{content:"\F16DD"}.mdi-coolant-temperature:before{content:"\F03C8"}.mdi-copyright:before{content:"\F05E6"}.mdi-cordova:before{content:"\F0958"}.mdi-corn:before{content:"\F07B8"}.mdi-corn-off:before{content:"\F13EF"}.mdi-cosine-wave:before{content:"\F1479"}.mdi-counter:before{content:"\F0199"}.mdi-cow:before{content:"\F019A"}.mdi-cpu-32-bit:before{content:"\F0EDF"}.mdi-cpu-64-bit:before{content:"\F0EE0"}.mdi-crane:before{content:"\F0862"}.mdi-creation:before{content:"\F0674"}.mdi-creative-commons:before{content:"\F0D6B"}.mdi-credit-card:before{content:"\F0FEF"}.mdi-credit-card-check:before{content:"\F13D0"}.mdi-credit-card-check-outline:before{content:"\F13D1"}.mdi-credit-card-clock:before{content:"\F0EE1"}.mdi-credit-card-clock-outline:before{content:"\F0EE2"}.mdi-credit-card-marker:before{content:"\F06A8"}.mdi-credit-card-marker-outline:before{content:"\F0DBE"}.mdi-credit-card-minus:before{content:"\F0FAC"}.mdi-credit-card-minus-outline:before{content:"\F0FAD"}.mdi-credit-card-multiple:before{content:"\F0FF0"}.mdi-credit-card-multiple-outline:before{content:"\F019C"}.mdi-credit-card-off:before{content:"\F0FF1"}.mdi-credit-card-off-outline:before{content:"\F05E4"}.mdi-credit-card-outline:before{content:"\F019B"}.mdi-credit-card-plus:before{content:"\F0FF2"}.mdi-credit-card-plus-outline:before{content:"\F0676"}.mdi-credit-card-refresh:before{content:"\F1645"}.mdi-credit-card-refresh-outline:before{content:"\F1646"}.mdi-credit-card-refund:before{content:"\F0FF3"}.mdi-credit-card-refund-outline:before{content:"\F0AA8"}.mdi-credit-card-remove:before{content:"\F0FAE"}.mdi-credit-card-remove-outline:before{content:"\F0FAF"}.mdi-credit-card-scan:before{content:"\F0FF4"}.mdi-credit-card-scan-outline:before{content:"\F019D"}.mdi-credit-card-search:before{content:"\F1647"}.mdi-credit-card-search-outline:before{content:"\F1648"}.mdi-credit-card-settings:before{content:"\F0FF5"}.mdi-credit-card-settings-outline:before{content:"\F08D7"}.mdi-credit-card-sync:before{content:"\F1649"}.mdi-credit-card-sync-outline:before{content:"\F164A"}.mdi-credit-card-wireless:before{content:"\F0802"}.mdi-credit-card-wireless-off:before{content:"\F057A"}.mdi-credit-card-wireless-off-outline:before{content:"\F057B"}.mdi-credit-card-wireless-outline:before{content:"\F0D6C"}.mdi-cricket:before{content:"\F0D6D"}.mdi-crop:before{content:"\F019E"}.mdi-crop-free:before{content:"\F019F"}.mdi-crop-landscape:before{content:"\F01A0"}.mdi-crop-portrait:before{content:"\F01A1"}.mdi-crop-rotate:before{content:"\F0696"}.mdi-crop-square:before{content:"\F01A2"}.mdi-crosshairs:before{content:"\F01A3"}.mdi-crosshairs-gps:before{content:"\F01A4"}.mdi-crosshairs-off:before{content:"\F0F45"}.mdi-crosshairs-question:before{content:"\F1136"}.mdi-crown:before{content:"\F01A5"}.mdi-crown-outline:before{content:"\F11D0"}.mdi-cryengine:before{content:"\F0959"}.mdi-crystal-ball:before{content:"\F0B2F"}.mdi-cube:before{content:"\F01A6"}.mdi-cube-off:before{content:"\F141C"}.mdi-cube-off-outline:before{content:"\F141D"}.mdi-cube-outline:before{content:"\F01A7"}.mdi-cube-scan:before{content:"\F0B84"}.mdi-cube-send:before{content:"\F01A8"}.mdi-cube-unfolded:before{content:"\F01A9"}.mdi-cup:before{content:"\F01AA"}.mdi-cup-off:before{content:"\F05E5"}.mdi-cup-off-outline:before{content:"\F137D"}.mdi-cup-outline:before{content:"\F130F"}.mdi-cup-water:before{content:"\F01AB"}.mdi-cupboard:before{content:"\F0F46"}.mdi-cupboard-outline:before{content:"\F0F47"}.mdi-cupcake:before{content:"\F095A"}.mdi-curling:before{content:"\F0863"}.mdi-currency-bdt:before{content:"\F0864"}.mdi-currency-brl:before{content:"\F0B85"}.mdi-currency-btc:before{content:"\F01AC"}.mdi-currency-cny:before{content:"\F07BA"}.mdi-currency-eth:before{content:"\F07BB"}.mdi-currency-eur:before{content:"\F01AD"}.mdi-currency-eur-off:before{content:"\F1315"}.mdi-currency-gbp:before{content:"\F01AE"}.mdi-currency-ils:before{content:"\F0C61"}.mdi-currency-inr:before{content:"\F01AF"}.mdi-currency-jpy:before{content:"\F07BC"}.mdi-currency-krw:before{content:"\F07BD"}.mdi-currency-kzt:before{content:"\F0865"}.mdi-currency-mnt:before{content:"\F1512"}.mdi-currency-ngn:before{content:"\F01B0"}.mdi-currency-php:before{content:"\F09E6"}.mdi-currency-rial:before{content:"\F0E9C"}.mdi-currency-rub:before{content:"\F01B1"}.mdi-currency-sign:before{content:"\F07BE"}.mdi-currency-try:before{content:"\F01B2"}.mdi-currency-twd:before{content:"\F07BF"}.mdi-currency-usd:before{content:"\F01C1"}.mdi-currency-usd-circle:before{content:"\F116B"}.mdi-currency-usd-circle-outline:before{content:"\F0178"}.mdi-currency-usd-off:before{content:"\F067A"}.mdi-current-ac:before{content:"\F1480"}.mdi-current-dc:before{content:"\F095C"}.mdi-cursor-default:before{content:"\F01C0"}.mdi-cursor-default-click:before{content:"\F0CFD"}.mdi-cursor-default-click-outline:before{content:"\F0CFE"}.mdi-cursor-default-gesture:before{content:"\F1127"}.mdi-cursor-default-gesture-outline:before{content:"\F1128"}.mdi-cursor-default-outline:before{content:"\F01BF"}.mdi-cursor-move:before{content:"\F01BE"}.mdi-cursor-pointer:before{content:"\F01BD"}.mdi-cursor-text:before{content:"\F05E7"}.mdi-dance-ballroom:before{content:"\F15FB"}.mdi-dance-pole:before{content:"\F1578"}.mdi-data-matrix:before{content:"\F153C"}.mdi-data-matrix-edit:before{content:"\F153D"}.mdi-data-matrix-minus:before{content:"\F153E"}.mdi-data-matrix-plus:before{content:"\F153F"}.mdi-data-matrix-remove:before{content:"\F1540"}.mdi-data-matrix-scan:before{content:"\F1541"}.mdi-database:before{content:"\F01BC"}.mdi-database-alert:before{content:"\F163A"}.mdi-database-alert-outline:before{content:"\F1624"}.mdi-database-arrow-down:before{content:"\F163B"}.mdi-database-arrow-down-outline:before{content:"\F1625"}.mdi-database-arrow-left:before{content:"\F163C"}.mdi-database-arrow-left-outline:before{content:"\F1626"}.mdi-database-arrow-right:before{content:"\F163D"}.mdi-database-arrow-right-outline:before{content:"\F1627"}.mdi-database-arrow-up:before{content:"\F163E"}.mdi-database-arrow-up-outline:before{content:"\F1628"}.mdi-database-check:before{content:"\F0AA9"}.mdi-database-check-outline:before{content:"\F1629"}.mdi-database-clock:before{content:"\F163F"}.mdi-database-clock-outline:before{content:"\F162A"}.mdi-database-cog:before{content:"\F164B"}.mdi-database-cog-outline:before{content:"\F164C"}.mdi-database-edit:before{content:"\F0B86"}.mdi-database-edit-outline:before{content:"\F162B"}.mdi-database-export:before{content:"\F095E"}.mdi-database-export-outline:before{content:"\F162C"}.mdi-database-import:before{content:"\F095D"}.mdi-database-import-outline:before{content:"\F162D"}.mdi-database-lock:before{content:"\F0AAA"}.mdi-database-lock-outline:before{content:"\F162E"}.mdi-database-marker:before{content:"\F12F6"}.mdi-database-marker-outline:before{content:"\F162F"}.mdi-database-minus:before{content:"\F01BB"}.mdi-database-minus-outline:before{content:"\F1630"}.mdi-database-off:before{content:"\F1640"}.mdi-database-off-outline:before{content:"\F1631"}.mdi-database-outline:before{content:"\F1632"}.mdi-database-plus:before{content:"\F01BA"}.mdi-database-plus-outline:before{content:"\F1633"}.mdi-database-refresh:before{content:"\F05C2"}.mdi-database-refresh-outline:before{content:"\F1634"}.mdi-database-remove:before{content:"\F0D00"}.mdi-database-remove-outline:before{content:"\F1635"}.mdi-database-search:before{content:"\F0866"}.mdi-database-search-outline:before{content:"\F1636"}.mdi-database-settings:before{content:"\F0D01"}.mdi-database-settings-outline:before{content:"\F1637"}.mdi-database-sync:before{content:"\F0CFF"}.mdi-database-sync-outline:before{content:"\F1638"}.mdi-death-star:before{content:"\F08D8"}.mdi-death-star-variant:before{content:"\F08D9"}.mdi-deathly-hallows:before{content:"\F0B87"}.mdi-debian:before{content:"\F08DA"}.mdi-debug-step-into:before{content:"\F01B9"}.mdi-debug-step-out:before{content:"\F01B8"}.mdi-debug-step-over:before{content:"\F01B7"}.mdi-decagram:before{content:"\F076C"}.mdi-decagram-outline:before{content:"\F076D"}.mdi-decimal:before{content:"\F10A1"}.mdi-decimal-comma:before{content:"\F10A2"}.mdi-decimal-comma-decrease:before{content:"\F10A3"}.mdi-decimal-comma-increase:before{content:"\F10A4"}.mdi-decimal-decrease:before{content:"\F01B6"}.mdi-decimal-increase:before{content:"\F01B5"}.mdi-delete:before{content:"\F01B4"}.mdi-delete-alert:before{content:"\F10A5"}.mdi-delete-alert-outline:before{content:"\F10A6"}.mdi-delete-circle:before{content:"\F0683"}.mdi-delete-circle-outline:before{content:"\F0B88"}.mdi-delete-clock:before{content:"\F1556"}.mdi-delete-clock-outline:before{content:"\F1557"}.mdi-delete-empty:before{content:"\F06CC"}.mdi-delete-empty-outline:before{content:"\F0E9D"}.mdi-delete-forever:before{content:"\F05E8"}.mdi-delete-forever-outline:before{content:"\F0B89"}.mdi-delete-off:before{content:"\F10A7"}.mdi-delete-off-outline:before{content:"\F10A8"}.mdi-delete-outline:before{content:"\F09E7"}.mdi-delete-restore:before{content:"\F0819"}.mdi-delete-sweep:before{content:"\F05E9"}.mdi-delete-sweep-outline:before{content:"\F0C62"}.mdi-delete-variant:before{content:"\F01B3"}.mdi-delta:before{content:"\F01C2"}.mdi-desk:before{content:"\F1239"}.mdi-desk-lamp:before{content:"\F095F"}.mdi-deskphone:before{content:"\F01C3"}.mdi-desktop-classic:before{content:"\F07C0"}.mdi-desktop-mac:before{content:"\F01C4"}.mdi-desktop-mac-dashboard:before{content:"\F09E8"}.mdi-desktop-tower:before{content:"\F01C5"}.mdi-desktop-tower-monitor:before{content:"\F0AAB"}.mdi-details:before{content:"\F01C6"}.mdi-dev-to:before{content:"\F0D6E"}.mdi-developer-board:before{content:"\F0697"}.mdi-deviantart:before{content:"\F01C7"}.mdi-devices:before{content:"\F0FB0"}.mdi-diabetes:before{content:"\F1126"}.mdi-dialpad:before{content:"\F061C"}.mdi-diameter:before{content:"\F0C63"}.mdi-diameter-outline:before{content:"\F0C64"}.mdi-diameter-variant:before{content:"\F0C65"}.mdi-diamond:before{content:"\F0B8A"}.mdi-diamond-outline:before{content:"\F0B8B"}.mdi-diamond-stone:before{content:"\F01C8"}.mdi-dice-1:before{content:"\F01CA"}.mdi-dice-1-outline:before{content:"\F114A"}.mdi-dice-2:before{content:"\F01CB"}.mdi-dice-2-outline:before{content:"\F114B"}.mdi-dice-3:before{content:"\F01CC"}.mdi-dice-3-outline:before{content:"\F114C"}.mdi-dice-4:before{content:"\F01CD"}.mdi-dice-4-outline:before{content:"\F114D"}.mdi-dice-5:before{content:"\F01CE"}.mdi-dice-5-outline:before{content:"\F114E"}.mdi-dice-6:before{content:"\F01CF"}.mdi-dice-6-outline:before{content:"\F114F"}.mdi-dice-d10:before{content:"\F1153"}.mdi-dice-d10-outline:before{content:"\F076F"}.mdi-dice-d12:before{content:"\F1154"}.mdi-dice-d12-outline:before{content:"\F0867"}.mdi-dice-d20:before{content:"\F1155"}.mdi-dice-d20-outline:before{content:"\F05EA"}.mdi-dice-d4:before{content:"\F1150"}.mdi-dice-d4-outline:before{content:"\F05EB"}.mdi-dice-d6:before{content:"\F1151"}.mdi-dice-d6-outline:before{content:"\F05ED"}.mdi-dice-d8:before{content:"\F1152"}.mdi-dice-d8-outline:before{content:"\F05EC"}.mdi-dice-multiple:before{content:"\F076E"}.mdi-dice-multiple-outline:before{content:"\F1156"}.mdi-digital-ocean:before{content:"\F1237"}.mdi-dip-switch:before{content:"\F07C1"}.mdi-directions:before{content:"\F01D0"}.mdi-directions-fork:before{content:"\F0641"}.mdi-disc:before{content:"\F05EE"}.mdi-disc-alert:before{content:"\F01D1"}.mdi-disc-player:before{content:"\F0960"}.mdi-discord:before{content:"\F066F"}.mdi-dishwasher:before{content:"\F0AAC"}.mdi-dishwasher-alert:before{content:"\F11B8"}.mdi-dishwasher-off:before{content:"\F11B9"}.mdi-disqus:before{content:"\F01D2"}.mdi-distribute-horizontal-center:before{content:"\F11C9"}.mdi-distribute-horizontal-left:before{content:"\F11C8"}.mdi-distribute-horizontal-right:before{content:"\F11CA"}.mdi-distribute-vertical-bottom:before{content:"\F11CB"}.mdi-distribute-vertical-center:before{content:"\F11CC"}.mdi-distribute-vertical-top:before{content:"\F11CD"}.mdi-diving-flippers:before{content:"\F0DBF"}.mdi-diving-helmet:before{content:"\F0DC0"}.mdi-diving-scuba:before{content:"\F0DC1"}.mdi-diving-scuba-flag:before{content:"\F0DC2"}.mdi-diving-scuba-tank:before{content:"\F0DC3"}.mdi-diving-scuba-tank-multiple:before{content:"\F0DC4"}.mdi-diving-snorkel:before{content:"\F0DC5"}.mdi-division:before{content:"\F01D4"}.mdi-division-box:before{content:"\F01D5"}.mdi-dlna:before{content:"\F0A41"}.mdi-dna:before{content:"\F0684"}.mdi-dns:before{content:"\F01D6"}.mdi-dns-outline:before{content:"\F0B8C"}.mdi-do-not-disturb:before{content:"\F0698"}.mdi-do-not-disturb-off:before{content:"\F0699"}.mdi-dock-bottom:before{content:"\F10A9"}.mdi-dock-left:before{content:"\F10AA"}.mdi-dock-right:before{content:"\F10AB"}.mdi-dock-top:before{content:"\F1513"}.mdi-dock-window:before{content:"\F10AC"}.mdi-docker:before{content:"\F0868"}.mdi-doctor:before{content:"\F0A42"}.mdi-dog:before{content:"\F0A43"}.mdi-dog-service:before{content:"\F0AAD"}.mdi-dog-side:before{content:"\F0A44"}.mdi-dog-side-off:before{content:"\F16EE"}.mdi-dolby:before{content:"\F06B3"}.mdi-dolly:before{content:"\F0E9E"}.mdi-domain:before{content:"\F01D7"}.mdi-domain-off:before{content:"\F0D6F"}.mdi-domain-plus:before{content:"\F10AD"}.mdi-domain-remove:before{content:"\F10AE"}.mdi-dome-light:before{content:"\F141E"}.mdi-domino-mask:before{content:"\F1023"}.mdi-donkey:before{content:"\F07C2"}.mdi-door:before{content:"\F081A"}.mdi-door-closed:before{content:"\F081B"}.mdi-door-closed-lock:before{content:"\F10AF"}.mdi-door-open:before{content:"\F081C"}.mdi-doorbell:before{content:"\F12E6"}.mdi-doorbell-video:before{content:"\F0869"}.mdi-dot-net:before{content:"\F0AAE"}.mdi-dots-grid:before{content:"\F15FC"}.mdi-dots-hexagon:before{content:"\F15FF"}.mdi-dots-horizontal:before{content:"\F01D8"}.mdi-dots-horizontal-circle:before{content:"\F07C3"}.mdi-dots-horizontal-circle-outline:before{content:"\F0B8D"}.mdi-dots-square:before{content:"\F15FD"}.mdi-dots-triangle:before{content:"\F15FE"}.mdi-dots-vertical:before{content:"\F01D9"}.mdi-dots-vertical-circle:before{content:"\F07C4"}.mdi-dots-vertical-circle-outline:before{content:"\F0B8E"}.mdi-douban:before{content:"\F069A"}.mdi-download:before{content:"\F01DA"}.mdi-download-box:before{content:"\F1462"}.mdi-download-box-outline:before{content:"\F1463"}.mdi-download-circle:before{content:"\F1464"}.mdi-download-circle-outline:before{content:"\F1465"}.mdi-download-lock:before{content:"\F1320"}.mdi-download-lock-outline:before{content:"\F1321"}.mdi-download-multiple:before{content:"\F09E9"}.mdi-download-network:before{content:"\F06F4"}.mdi-download-network-outline:before{content:"\F0C66"}.mdi-download-off:before{content:"\F10B0"}.mdi-download-off-outline:before{content:"\F10B1"}.mdi-download-outline:before{content:"\F0B8F"}.mdi-drag:before{content:"\F01DB"}.mdi-drag-horizontal:before{content:"\F01DC"}.mdi-drag-horizontal-variant:before{content:"\F12F0"}.mdi-drag-variant:before{content:"\F0B90"}.mdi-drag-vertical:before{content:"\F01DD"}.mdi-drag-vertical-variant:before{content:"\F12F1"}.mdi-drama-masks:before{content:"\F0D02"}.mdi-draw:before{content:"\F0F49"}.mdi-drawing:before{content:"\F01DE"}.mdi-drawing-box:before{content:"\F01DF"}.mdi-dresser:before{content:"\F0F4A"}.mdi-dresser-outline:before{content:"\F0F4B"}.mdi-drone:before{content:"\F01E2"}.mdi-dropbox:before{content:"\F01E3"}.mdi-drupal:before{content:"\F01E4"}.mdi-duck:before{content:"\F01E5"}.mdi-dumbbell:before{content:"\F01E6"}.mdi-dump-truck:before{content:"\F0C67"}.mdi-ear-hearing:before{content:"\F07C5"}.mdi-ear-hearing-off:before{content:"\F0A45"}.mdi-earth:before{content:"\F01E7"}.mdi-earth-arrow-right:before{content:"\F1311"}.mdi-earth-box:before{content:"\F06CD"}.mdi-earth-box-minus:before{content:"\F1407"}.mdi-earth-box-off:before{content:"\F06CE"}.mdi-earth-box-plus:before{content:"\F1406"}.mdi-earth-box-remove:before{content:"\F1408"}.mdi-earth-minus:before{content:"\F1404"}.mdi-earth-off:before{content:"\F01E8"}.mdi-earth-plus:before{content:"\F1403"}.mdi-earth-remove:before{content:"\F1405"}.mdi-egg:before{content:"\F0AAF"}.mdi-egg-easter:before{content:"\F0AB0"}.mdi-egg-off:before{content:"\F13F0"}.mdi-egg-off-outline:before{content:"\F13F1"}.mdi-egg-outline:before{content:"\F13F2"}.mdi-eiffel-tower:before{content:"\F156B"}.mdi-eight-track:before{content:"\F09EA"}.mdi-eject:before{content:"\F01EA"}.mdi-eject-outline:before{content:"\F0B91"}.mdi-electric-switch:before{content:"\F0E9F"}.mdi-electric-switch-closed:before{content:"\F10D9"}.mdi-electron-framework:before{content:"\F1024"}.mdi-elephant:before{content:"\F07C6"}.mdi-elevation-decline:before{content:"\F01EB"}.mdi-elevation-rise:before{content:"\F01EC"}.mdi-elevator:before{content:"\F01ED"}.mdi-elevator-down:before{content:"\F12C2"}.mdi-elevator-passenger:before{content:"\F1381"}.mdi-elevator-up:before{content:"\F12C1"}.mdi-ellipse:before{content:"\F0EA0"}.mdi-ellipse-outline:before{content:"\F0EA1"}.mdi-email:before{content:"\F01EE"}.mdi-email-alert:before{content:"\F06CF"}.mdi-email-alert-outline:before{content:"\F0D42"}.mdi-email-box:before{content:"\F0D03"}.mdi-email-check:before{content:"\F0AB1"}.mdi-email-check-outline:before{content:"\F0AB2"}.mdi-email-edit:before{content:"\F0EE3"}.mdi-email-edit-outline:before{content:"\F0EE4"}.mdi-email-lock:before{content:"\F01F1"}.mdi-email-mark-as-unread:before{content:"\F0B92"}.mdi-email-minus:before{content:"\F0EE5"}.mdi-email-minus-outline:before{content:"\F0EE6"}.mdi-email-multiple:before{content:"\F0EE7"}.mdi-email-multiple-outline:before{content:"\F0EE8"}.mdi-email-newsletter:before{content:"\F0FB1"}.mdi-email-off:before{content:"\F13E3"}.mdi-email-off-outline:before{content:"\F13E4"}.mdi-email-open:before{content:"\F01EF"}.mdi-email-open-multiple:before{content:"\F0EE9"}.mdi-email-open-multiple-outline:before{content:"\F0EEA"}.mdi-email-open-outline:before{content:"\F05EF"}.mdi-email-outline:before{content:"\F01F0"}.mdi-email-plus:before{content:"\F09EB"}.mdi-email-plus-outline:before{content:"\F09EC"}.mdi-email-receive:before{content:"\F10DA"}.mdi-email-receive-outline:before{content:"\F10DB"}.mdi-email-remove:before{content:"\F1661"}.mdi-email-remove-outline:before{content:"\F1662"}.mdi-email-search:before{content:"\F0961"}.mdi-email-search-outline:before{content:"\F0962"}.mdi-email-send:before{content:"\F10DC"}.mdi-email-send-outline:before{content:"\F10DD"}.mdi-email-sync:before{content:"\F12C7"}.mdi-email-sync-outline:before{content:"\F12C8"}.mdi-email-variant:before{content:"\F05F0"}.mdi-ember:before{content:"\F0B30"}.mdi-emby:before{content:"\F06B4"}.mdi-emoticon:before{content:"\F0C68"}.mdi-emoticon-angry:before{content:"\F0C69"}.mdi-emoticon-angry-outline:before{content:"\F0C6A"}.mdi-emoticon-confused:before{content:"\F10DE"}.mdi-emoticon-confused-outline:before{content:"\F10DF"}.mdi-emoticon-cool:before{content:"\F0C6B"}.mdi-emoticon-cool-outline:before{content:"\F01F3"}.mdi-emoticon-cry:before{content:"\F0C6C"}.mdi-emoticon-cry-outline:before{content:"\F0C6D"}.mdi-emoticon-dead:before{content:"\F0C6E"}.mdi-emoticon-dead-outline:before{content:"\F069B"}.mdi-emoticon-devil:before{content:"\F0C6F"}.mdi-emoticon-devil-outline:before{content:"\F01F4"}.mdi-emoticon-excited:before{content:"\F0C70"}.mdi-emoticon-excited-outline:before{content:"\F069C"}.mdi-emoticon-frown:before{content:"\F0F4C"}.mdi-emoticon-frown-outline:before{content:"\F0F4D"}.mdi-emoticon-happy:before{content:"\F0C71"}.mdi-emoticon-happy-outline:before{content:"\F01F5"}.mdi-emoticon-kiss:before{content:"\F0C72"}.mdi-emoticon-kiss-outline:before{content:"\F0C73"}.mdi-emoticon-lol:before{content:"\F1214"}.mdi-emoticon-lol-outline:before{content:"\F1215"}.mdi-emoticon-neutral:before{content:"\F0C74"}.mdi-emoticon-neutral-outline:before{content:"\F01F6"}.mdi-emoticon-outline:before{content:"\F01F2"}.mdi-emoticon-poop:before{content:"\F01F7"}.mdi-emoticon-poop-outline:before{content:"\F0C75"}.mdi-emoticon-sad:before{content:"\F0C76"}.mdi-emoticon-sad-outline:before{content:"\F01F8"}.mdi-emoticon-sick:before{content:"\F157C"}.mdi-emoticon-sick-outline:before{content:"\F157D"}.mdi-emoticon-tongue:before{content:"\F01F9"}.mdi-emoticon-tongue-outline:before{content:"\F0C77"}.mdi-emoticon-wink:before{content:"\F0C78"}.mdi-emoticon-wink-outline:before{content:"\F0C79"}.mdi-engine:before{content:"\F01FA"}.mdi-engine-off:before{content:"\F0A46"}.mdi-engine-off-outline:before{content:"\F0A47"}.mdi-engine-outline:before{content:"\F01FB"}.mdi-epsilon:before{content:"\F10E0"}.mdi-equal:before{content:"\F01FC"}.mdi-equal-box:before{content:"\F01FD"}.mdi-equalizer:before{content:"\F0EA2"}.mdi-equalizer-outline:before{content:"\F0EA3"}.mdi-eraser:before{content:"\F01FE"}.mdi-eraser-variant:before{content:"\F0642"}.mdi-escalator:before{content:"\F01FF"}.mdi-escalator-box:before{content:"\F1399"}.mdi-escalator-down:before{content:"\F12C0"}.mdi-escalator-up:before{content:"\F12BF"}.mdi-eslint:before{content:"\F0C7A"}.mdi-et:before{content:"\F0AB3"}.mdi-ethereum:before{content:"\F086A"}.mdi-ethernet:before{content:"\F0200"}.mdi-ethernet-cable:before{content:"\F0201"}.mdi-ethernet-cable-off:before{content:"\F0202"}.mdi-ev-plug-ccs1:before{content:"\F1519"}.mdi-ev-plug-ccs2:before{content:"\F151A"}.mdi-ev-plug-chademo:before{content:"\F151B"}.mdi-ev-plug-tesla:before{content:"\F151C"}.mdi-ev-plug-type1:before{content:"\F151D"}.mdi-ev-plug-type2:before{content:"\F151E"}.mdi-ev-station:before{content:"\F05F1"}.mdi-evernote:before{content:"\F0204"}.mdi-excavator:before{content:"\F1025"}.mdi-exclamation:before{content:"\F0205"}.mdi-exclamation-thick:before{content:"\F1238"}.mdi-exit-run:before{content:"\F0A48"}.mdi-exit-to-app:before{content:"\F0206"}.mdi-expand-all:before{content:"\F0AB4"}.mdi-expand-all-outline:before{content:"\F0AB5"}.mdi-expansion-card:before{content:"\F08AE"}.mdi-expansion-card-variant:before{content:"\F0FB2"}.mdi-exponent:before{content:"\F0963"}.mdi-exponent-box:before{content:"\F0964"}.mdi-export:before{content:"\F0207"}.mdi-export-variant:before{content:"\F0B93"}.mdi-eye:before{content:"\F0208"}.mdi-eye-check:before{content:"\F0D04"}.mdi-eye-check-outline:before{content:"\F0D05"}.mdi-eye-circle:before{content:"\F0B94"}.mdi-eye-circle-outline:before{content:"\F0B95"}.mdi-eye-minus:before{content:"\F1026"}.mdi-eye-minus-outline:before{content:"\F1027"}.mdi-eye-off:before{content:"\F0209"}.mdi-eye-off-outline:before{content:"\F06D1"}.mdi-eye-outline:before{content:"\F06D0"}.mdi-eye-plus:before{content:"\F086B"}.mdi-eye-plus-outline:before{content:"\F086C"}.mdi-eye-remove:before{content:"\F15E3"}.mdi-eye-remove-outline:before{content:"\F15E4"}.mdi-eye-settings:before{content:"\F086D"}.mdi-eye-settings-outline:before{content:"\F086E"}.mdi-eyedropper:before{content:"\F020A"}.mdi-eyedropper-minus:before{content:"\F13DD"}.mdi-eyedropper-off:before{content:"\F13DF"}.mdi-eyedropper-plus:before{content:"\F13DC"}.mdi-eyedropper-remove:before{content:"\F13DE"}.mdi-eyedropper-variant:before{content:"\F020B"}.mdi-face:before{content:"\F0643"}.mdi-face-agent:before{content:"\F0D70"}.mdi-face-mask:before{content:"\F1586"}.mdi-face-mask-outline:before{content:"\F1587"}.mdi-face-outline:before{content:"\F0B96"}.mdi-face-profile:before{content:"\F0644"}.mdi-face-profile-woman:before{content:"\F1076"}.mdi-face-recognition:before{content:"\F0C7B"}.mdi-face-shimmer:before{content:"\F15CC"}.mdi-face-shimmer-outline:before{content:"\F15CD"}.mdi-face-woman:before{content:"\F1077"}.mdi-face-woman-outline:before{content:"\F1078"}.mdi-face-woman-shimmer:before{content:"\F15CE"}.mdi-face-woman-shimmer-outline:before{content:"\F15CF"}.mdi-facebook:before{content:"\F020C"}.mdi-facebook-gaming:before{content:"\F07DD"}.mdi-facebook-messenger:before{content:"\F020E"}.mdi-facebook-workplace:before{content:"\F0B31"}.mdi-factory:before{content:"\F020F"}.mdi-family-tree:before{content:"\F160E"}.mdi-fan:before{content:"\F0210"}.mdi-fan-alert:before{content:"\F146C"}.mdi-fan-auto:before{content:"\F171D"}.mdi-fan-chevron-down:before{content:"\F146D"}.mdi-fan-chevron-up:before{content:"\F146E"}.mdi-fan-minus:before{content:"\F1470"}.mdi-fan-off:before{content:"\F081D"}.mdi-fan-plus:before{content:"\F146F"}.mdi-fan-remove:before{content:"\F1471"}.mdi-fan-speed-1:before{content:"\F1472"}.mdi-fan-speed-2:before{content:"\F1473"}.mdi-fan-speed-3:before{content:"\F1474"}.mdi-fast-forward:before{content:"\F0211"}.mdi-fast-forward-10:before{content:"\F0D71"}.mdi-fast-forward-30:before{content:"\F0D06"}.mdi-fast-forward-5:before{content:"\F11F8"}.mdi-fast-forward-60:before{content:"\F160B"}.mdi-fast-forward-outline:before{content:"\F06D2"}.mdi-fax:before{content:"\F0212"}.mdi-feather:before{content:"\F06D3"}.mdi-feature-search:before{content:"\F0A49"}.mdi-feature-search-outline:before{content:"\F0A4A"}.mdi-fedora:before{content:"\F08DB"}.mdi-fencing:before{content:"\F14C1"}.mdi-ferris-wheel:before{content:"\F0EA4"}.mdi-ferry:before{content:"\F0213"}.mdi-file:before{content:"\F0214"}.mdi-file-account:before{content:"\F073B"}.mdi-file-account-outline:before{content:"\F1028"}.mdi-file-alert:before{content:"\F0A4B"}.mdi-file-alert-outline:before{content:"\F0A4C"}.mdi-file-cabinet:before{content:"\F0AB6"}.mdi-file-cad:before{content:"\F0EEB"}.mdi-file-cad-box:before{content:"\F0EEC"}.mdi-file-cancel:before{content:"\F0DC6"}.mdi-file-cancel-outline:before{content:"\F0DC7"}.mdi-file-certificate:before{content:"\F1186"}.mdi-file-certificate-outline:before{content:"\F1187"}.mdi-file-chart:before{content:"\F0215"}.mdi-file-chart-outline:before{content:"\F1029"}.mdi-file-check:before{content:"\F0216"}.mdi-file-check-outline:before{content:"\F0E29"}.mdi-file-clock:before{content:"\F12E1"}.mdi-file-clock-outline:before{content:"\F12E2"}.mdi-file-cloud:before{content:"\F0217"}.mdi-file-cloud-outline:before{content:"\F102A"}.mdi-file-code:before{content:"\F022E"}.mdi-file-code-outline:before{content:"\F102B"}.mdi-file-cog:before{content:"\F107B"}.mdi-file-cog-outline:before{content:"\F107C"}.mdi-file-compare:before{content:"\F08AA"}.mdi-file-delimited:before{content:"\F0218"}.mdi-file-delimited-outline:before{content:"\F0EA5"}.mdi-file-document:before{content:"\F0219"}.mdi-file-document-edit:before{content:"\F0DC8"}.mdi-file-document-edit-outline:before{content:"\F0DC9"}.mdi-file-document-multiple:before{content:"\F1517"}.mdi-file-document-multiple-outline:before{content:"\F1518"}.mdi-file-document-outline:before{content:"\F09EE"}.mdi-file-download:before{content:"\F0965"}.mdi-file-download-outline:before{content:"\F0966"}.mdi-file-edit:before{content:"\F11E7"}.mdi-file-edit-outline:before{content:"\F11E8"}.mdi-file-excel:before{content:"\F021B"}.mdi-file-excel-box:before{content:"\F021C"}.mdi-file-excel-box-outline:before{content:"\F102C"}.mdi-file-excel-outline:before{content:"\F102D"}.mdi-file-export:before{content:"\F021D"}.mdi-file-export-outline:before{content:"\F102E"}.mdi-file-eye:before{content:"\F0DCA"}.mdi-file-eye-outline:before{content:"\F0DCB"}.mdi-file-find:before{content:"\F021E"}.mdi-file-find-outline:before{content:"\F0B97"}.mdi-file-hidden:before{content:"\F0613"}.mdi-file-image:before{content:"\F021F"}.mdi-file-image-outline:before{content:"\F0EB0"}.mdi-file-import:before{content:"\F0220"}.mdi-file-import-outline:before{content:"\F102F"}.mdi-file-key:before{content:"\F1184"}.mdi-file-key-outline:before{content:"\F1185"}.mdi-file-link:before{content:"\F1177"}.mdi-file-link-outline:before{content:"\F1178"}.mdi-file-lock:before{content:"\F0221"}.mdi-file-lock-outline:before{content:"\F1030"}.mdi-file-move:before{content:"\F0AB9"}.mdi-file-move-outline:before{content:"\F1031"}.mdi-file-multiple:before{content:"\F0222"}.mdi-file-multiple-outline:before{content:"\F1032"}.mdi-file-music:before{content:"\F0223"}.mdi-file-music-outline:before{content:"\F0E2A"}.mdi-file-outline:before{content:"\F0224"}.mdi-file-pdf:before{content:"\F0225"}.mdi-file-pdf-box:before{content:"\F0226"}.mdi-file-pdf-box-outline:before{content:"\F0FB3"}.mdi-file-pdf-outline:before{content:"\F0E2D"}.mdi-file-percent:before{content:"\F081E"}.mdi-file-percent-outline:before{content:"\F1033"}.mdi-file-phone:before{content:"\F1179"}.mdi-file-phone-outline:before{content:"\F117A"}.mdi-file-plus:before{content:"\F0752"}.mdi-file-plus-outline:before{content:"\F0EED"}.mdi-file-powerpoint:before{content:"\F0227"}.mdi-file-powerpoint-box:before{content:"\F0228"}.mdi-file-powerpoint-box-outline:before{content:"\F1034"}.mdi-file-powerpoint-outline:before{content:"\F1035"}.mdi-file-presentation-box:before{content:"\F0229"}.mdi-file-question:before{content:"\F086F"}.mdi-file-question-outline:before{content:"\F1036"}.mdi-file-refresh:before{content:"\F0918"}.mdi-file-refresh-outline:before{content:"\F0541"}.mdi-file-remove:before{content:"\F0B98"}.mdi-file-remove-outline:before{content:"\F1037"}.mdi-file-replace:before{content:"\F0B32"}.mdi-file-replace-outline:before{content:"\F0B33"}.mdi-file-restore:before{content:"\F0670"}.mdi-file-restore-outline:before{content:"\F1038"}.mdi-file-search:before{content:"\F0C7C"}.mdi-file-search-outline:before{content:"\F0C7D"}.mdi-file-send:before{content:"\F022A"}.mdi-file-send-outline:before{content:"\F1039"}.mdi-file-settings:before{content:"\F1079"}.mdi-file-settings-outline:before{content:"\F107A"}.mdi-file-star:before{content:"\F103A"}.mdi-file-star-outline:before{content:"\F103B"}.mdi-file-swap:before{content:"\F0FB4"}.mdi-file-swap-outline:before{content:"\F0FB5"}.mdi-file-sync:before{content:"\F1216"}.mdi-file-sync-outline:before{content:"\F1217"}.mdi-file-table:before{content:"\F0C7E"}.mdi-file-table-box:before{content:"\F10E1"}.mdi-file-table-box-multiple:before{content:"\F10E2"}.mdi-file-table-box-multiple-outline:before{content:"\F10E3"}.mdi-file-table-box-outline:before{content:"\F10E4"}.mdi-file-table-outline:before{content:"\F0C7F"}.mdi-file-tree:before{content:"\F0645"}.mdi-file-tree-outline:before{content:"\F13D2"}.mdi-file-undo:before{content:"\F08DC"}.mdi-file-undo-outline:before{content:"\F103C"}.mdi-file-upload:before{content:"\F0A4D"}.mdi-file-upload-outline:before{content:"\F0A4E"}.mdi-file-video:before{content:"\F022B"}.mdi-file-video-outline:before{content:"\F0E2C"}.mdi-file-word:before{content:"\F022C"}.mdi-file-word-box:before{content:"\F022D"}.mdi-file-word-box-outline:before{content:"\F103D"}.mdi-file-word-outline:before{content:"\F103E"}.mdi-film:before{content:"\F022F"}.mdi-filmstrip:before{content:"\F0230"}.mdi-filmstrip-box:before{content:"\F0332"}.mdi-filmstrip-box-multiple:before{content:"\F0D18"}.mdi-filmstrip-off:before{content:"\F0231"}.mdi-filter:before{content:"\F0232"}.mdi-filter-menu:before{content:"\F10E5"}.mdi-filter-menu-outline:before{content:"\F10E6"}.mdi-filter-minus:before{content:"\F0EEE"}.mdi-filter-minus-outline:before{content:"\F0EEF"}.mdi-filter-off:before{content:"\F14EF"}.mdi-filter-off-outline:before{content:"\F14F0"}.mdi-filter-outline:before{content:"\F0233"}.mdi-filter-plus:before{content:"\F0EF0"}.mdi-filter-plus-outline:before{content:"\F0EF1"}.mdi-filter-remove:before{content:"\F0234"}.mdi-filter-remove-outline:before{content:"\F0235"}.mdi-filter-variant:before{content:"\F0236"}.mdi-filter-variant-minus:before{content:"\F1112"}.mdi-filter-variant-plus:before{content:"\F1113"}.mdi-filter-variant-remove:before{content:"\F103F"}.mdi-finance:before{content:"\F081F"}.mdi-find-replace:before{content:"\F06D4"}.mdi-fingerprint:before{content:"\F0237"}.mdi-fingerprint-off:before{content:"\F0EB1"}.mdi-fire:before{content:"\F0238"}.mdi-fire-alert:before{content:"\F15D7"}.mdi-fire-extinguisher:before{content:"\F0EF2"}.mdi-fire-hydrant:before{content:"\F1137"}.mdi-fire-hydrant-alert:before{content:"\F1138"}.mdi-fire-hydrant-off:before{content:"\F1139"}.mdi-fire-off:before{content:"\F1722"}.mdi-fire-truck:before{content:"\F08AB"}.mdi-firebase:before{content:"\F0967"}.mdi-firefox:before{content:"\F0239"}.mdi-fireplace:before{content:"\F0E2E"}.mdi-fireplace-off:before{content:"\F0E2F"}.mdi-firework:before{content:"\F0E30"}.mdi-firework-off:before{content:"\F1723"}.mdi-fish:before{content:"\F023A"}.mdi-fish-off:before{content:"\F13F3"}.mdi-fishbowl:before{content:"\F0EF3"}.mdi-fishbowl-outline:before{content:"\F0EF4"}.mdi-fit-to-page:before{content:"\F0EF5"}.mdi-fit-to-page-outline:before{content:"\F0EF6"}.mdi-flag:before{content:"\F023B"}.mdi-flag-checkered:before{content:"\F023C"}.mdi-flag-minus:before{content:"\F0B99"}.mdi-flag-minus-outline:before{content:"\F10B2"}.mdi-flag-outline:before{content:"\F023D"}.mdi-flag-plus:before{content:"\F0B9A"}.mdi-flag-plus-outline:before{content:"\F10B3"}.mdi-flag-remove:before{content:"\F0B9B"}.mdi-flag-remove-outline:before{content:"\F10B4"}.mdi-flag-triangle:before{content:"\F023F"}.mdi-flag-variant:before{content:"\F0240"}.mdi-flag-variant-outline:before{content:"\F023E"}.mdi-flare:before{content:"\F0D72"}.mdi-flash:before{content:"\F0241"}.mdi-flash-alert:before{content:"\F0EF7"}.mdi-flash-alert-outline:before{content:"\F0EF8"}.mdi-flash-auto:before{content:"\F0242"}.mdi-flash-circle:before{content:"\F0820"}.mdi-flash-off:before{content:"\F0243"}.mdi-flash-outline:before{content:"\F06D5"}.mdi-flash-red-eye:before{content:"\F067B"}.mdi-flashlight:before{content:"\F0244"}.mdi-flashlight-off:before{content:"\F0245"}.mdi-flask:before{content:"\F0093"}.mdi-flask-empty:before{content:"\F0094"}.mdi-flask-empty-minus:before{content:"\F123A"}.mdi-flask-empty-minus-outline:before{content:"\F123B"}.mdi-flask-empty-off:before{content:"\F13F4"}.mdi-flask-empty-off-outline:before{content:"\F13F5"}.mdi-flask-empty-outline:before{content:"\F0095"}.mdi-flask-empty-plus:before{content:"\F123C"}.mdi-flask-empty-plus-outline:before{content:"\F123D"}.mdi-flask-empty-remove:before{content:"\F123E"}.mdi-flask-empty-remove-outline:before{content:"\F123F"}.mdi-flask-minus:before{content:"\F1240"}.mdi-flask-minus-outline:before{content:"\F1241"}.mdi-flask-off:before{content:"\F13F6"}.mdi-flask-off-outline:before{content:"\F13F7"}.mdi-flask-outline:before{content:"\F0096"}.mdi-flask-plus:before{content:"\F1242"}.mdi-flask-plus-outline:before{content:"\F1243"}.mdi-flask-remove:before{content:"\F1244"}.mdi-flask-remove-outline:before{content:"\F1245"}.mdi-flask-round-bottom:before{content:"\F124B"}.mdi-flask-round-bottom-empty:before{content:"\F124C"}.mdi-flask-round-bottom-empty-outline:before{content:"\F124D"}.mdi-flask-round-bottom-outline:before{content:"\F124E"}.mdi-fleur-de-lis:before{content:"\F1303"}.mdi-flip-horizontal:before{content:"\F10E7"}.mdi-flip-to-back:before{content:"\F0247"}.mdi-flip-to-front:before{content:"\F0248"}.mdi-flip-vertical:before{content:"\F10E8"}.mdi-floor-lamp:before{content:"\F08DD"}.mdi-floor-lamp-dual:before{content:"\F1040"}.mdi-floor-lamp-variant:before{content:"\F1041"}.mdi-floor-plan:before{content:"\F0821"}.mdi-floppy:before{content:"\F0249"}.mdi-floppy-variant:before{content:"\F09EF"}.mdi-flower:before{content:"\F024A"}.mdi-flower-outline:before{content:"\F09F0"}.mdi-flower-poppy:before{content:"\F0D08"}.mdi-flower-tulip:before{content:"\F09F1"}.mdi-flower-tulip-outline:before{content:"\F09F2"}.mdi-focus-auto:before{content:"\F0F4E"}.mdi-focus-field:before{content:"\F0F4F"}.mdi-focus-field-horizontal:before{content:"\F0F50"}.mdi-focus-field-vertical:before{content:"\F0F51"}.mdi-folder:before{content:"\F024B"}.mdi-folder-account:before{content:"\F024C"}.mdi-folder-account-outline:before{content:"\F0B9C"}.mdi-folder-alert:before{content:"\F0DCC"}.mdi-folder-alert-outline:before{content:"\F0DCD"}.mdi-folder-clock:before{content:"\F0ABA"}.mdi-folder-clock-outline:before{content:"\F0ABB"}.mdi-folder-cog:before{content:"\F107F"}.mdi-folder-cog-outline:before{content:"\F1080"}.mdi-folder-download:before{content:"\F024D"}.mdi-folder-download-outline:before{content:"\F10E9"}.mdi-folder-edit:before{content:"\F08DE"}.mdi-folder-edit-outline:before{content:"\F0DCE"}.mdi-folder-google-drive:before{content:"\F024E"}.mdi-folder-heart:before{content:"\F10EA"}.mdi-folder-heart-outline:before{content:"\F10EB"}.mdi-folder-home:before{content:"\F10B5"}.mdi-folder-home-outline:before{content:"\F10B6"}.mdi-folder-image:before{content:"\F024F"}.mdi-folder-information:before{content:"\F10B7"}.mdi-folder-information-outline:before{content:"\F10B8"}.mdi-folder-key:before{content:"\F08AC"}.mdi-folder-key-network:before{content:"\F08AD"}.mdi-folder-key-network-outline:before{content:"\F0C80"}.mdi-folder-key-outline:before{content:"\F10EC"}.mdi-folder-lock:before{content:"\F0250"}.mdi-folder-lock-open:before{content:"\F0251"}.mdi-folder-marker:before{content:"\F126D"}.mdi-folder-marker-outline:before{content:"\F126E"}.mdi-folder-move:before{content:"\F0252"}.mdi-folder-move-outline:before{content:"\F1246"}.mdi-folder-multiple:before{content:"\F0253"}.mdi-folder-multiple-image:before{content:"\F0254"}.mdi-folder-multiple-outline:before{content:"\F0255"}.mdi-folder-multiple-plus:before{content:"\F147E"}.mdi-folder-multiple-plus-outline:before{content:"\F147F"}.mdi-folder-music:before{content:"\F1359"}.mdi-folder-music-outline:before{content:"\F135A"}.mdi-folder-network:before{content:"\F0870"}.mdi-folder-network-outline:before{content:"\F0C81"}.mdi-folder-open:before{content:"\F0770"}.mdi-folder-open-outline:before{content:"\F0DCF"}.mdi-folder-outline:before{content:"\F0256"}.mdi-folder-plus:before{content:"\F0257"}.mdi-folder-plus-outline:before{content:"\F0B9D"}.mdi-folder-pound:before{content:"\F0D09"}.mdi-folder-pound-outline:before{content:"\F0D0A"}.mdi-folder-refresh:before{content:"\F0749"}.mdi-folder-refresh-outline:before{content:"\F0542"}.mdi-folder-remove:before{content:"\F0258"}.mdi-folder-remove-outline:before{content:"\F0B9E"}.mdi-folder-search:before{content:"\F0968"}.mdi-folder-search-outline:before{content:"\F0969"}.mdi-folder-settings:before{content:"\F107D"}.mdi-folder-settings-outline:before{content:"\F107E"}.mdi-folder-star:before{content:"\F069D"}.mdi-folder-star-multiple:before{content:"\F13D3"}.mdi-folder-star-multiple-outline:before{content:"\F13D4"}.mdi-folder-star-outline:before{content:"\F0B9F"}.mdi-folder-swap:before{content:"\F0FB6"}.mdi-folder-swap-outline:before{content:"\F0FB7"}.mdi-folder-sync:before{content:"\F0D0B"}.mdi-folder-sync-outline:before{content:"\F0D0C"}.mdi-folder-table:before{content:"\F12E3"}.mdi-folder-table-outline:before{content:"\F12E4"}.mdi-folder-text:before{content:"\F0C82"}.mdi-folder-text-outline:before{content:"\F0C83"}.mdi-folder-upload:before{content:"\F0259"}.mdi-folder-upload-outline:before{content:"\F10ED"}.mdi-folder-zip:before{content:"\F06EB"}.mdi-folder-zip-outline:before{content:"\F07B9"}.mdi-font-awesome:before{content:"\F003A"}.mdi-food:before{content:"\F025A"}.mdi-food-apple:before{content:"\F025B"}.mdi-food-apple-outline:before{content:"\F0C84"}.mdi-food-croissant:before{content:"\F07C8"}.mdi-food-drumstick:before{content:"\F141F"}.mdi-food-drumstick-off:before{content:"\F1468"}.mdi-food-drumstick-off-outline:before{content:"\F1469"}.mdi-food-drumstick-outline:before{content:"\F1420"}.mdi-food-fork-drink:before{content:"\F05F2"}.mdi-food-halal:before{content:"\F1572"}.mdi-food-kosher:before{content:"\F1573"}.mdi-food-off:before{content:"\F05F3"}.mdi-food-steak:before{content:"\F146A"}.mdi-food-steak-off:before{content:"\F146B"}.mdi-food-turkey:before{content:"\F171C"}.mdi-food-variant:before{content:"\F025C"}.mdi-food-variant-off:before{content:"\F13E5"}.mdi-foot-print:before{content:"\F0F52"}.mdi-football:before{content:"\F025D"}.mdi-football-australian:before{content:"\F025E"}.mdi-football-helmet:before{content:"\F025F"}.mdi-forklift:before{content:"\F07C9"}.mdi-form-dropdown:before{content:"\F1400"}.mdi-form-select:before{content:"\F1401"}.mdi-form-textarea:before{content:"\F1095"}.mdi-form-textbox:before{content:"\F060E"}.mdi-form-textbox-lock:before{content:"\F135D"}.mdi-form-textbox-password:before{content:"\F07F5"}.mdi-format-align-bottom:before{content:"\F0753"}.mdi-format-align-center:before{content:"\F0260"}.mdi-format-align-justify:before{content:"\F0261"}.mdi-format-align-left:before{content:"\F0262"}.mdi-format-align-middle:before{content:"\F0754"}.mdi-format-align-right:before{content:"\F0263"}.mdi-format-align-top:before{content:"\F0755"}.mdi-format-annotation-minus:before{content:"\F0ABC"}.mdi-format-annotation-plus:before{content:"\F0646"}.mdi-format-bold:before{content:"\F0264"}.mdi-format-clear:before{content:"\F0265"}.mdi-format-color-fill:before{content:"\F0266"}.mdi-format-color-highlight:before{content:"\F0E31"}.mdi-format-color-marker-cancel:before{content:"\F1313"}.mdi-format-color-text:before{content:"\F069E"}.mdi-format-columns:before{content:"\F08DF"}.mdi-format-float-center:before{content:"\F0267"}.mdi-format-float-left:before{content:"\F0268"}.mdi-format-float-none:before{content:"\F0269"}.mdi-format-float-right:before{content:"\F026A"}.mdi-format-font:before{content:"\F06D6"}.mdi-format-font-size-decrease:before{content:"\F09F3"}.mdi-format-font-size-increase:before{content:"\F09F4"}.mdi-format-header-1:before{content:"\F026B"}.mdi-format-header-2:before{content:"\F026C"}.mdi-format-header-3:before{content:"\F026D"}.mdi-format-header-4:before{content:"\F026E"}.mdi-format-header-5:before{content:"\F026F"}.mdi-format-header-6:before{content:"\F0270"}.mdi-format-header-decrease:before{content:"\F0271"}.mdi-format-header-equal:before{content:"\F0272"}.mdi-format-header-increase:before{content:"\F0273"}.mdi-format-header-pound:before{content:"\F0274"}.mdi-format-horizontal-align-center:before{content:"\F061E"}.mdi-format-horizontal-align-left:before{content:"\F061F"}.mdi-format-horizontal-align-right:before{content:"\F0620"}.mdi-format-indent-decrease:before{content:"\F0275"}.mdi-format-indent-increase:before{content:"\F0276"}.mdi-format-italic:before{content:"\F0277"}.mdi-format-letter-case:before{content:"\F0B34"}.mdi-format-letter-case-lower:before{content:"\F0B35"}.mdi-format-letter-case-upper:before{content:"\F0B36"}.mdi-format-letter-ends-with:before{content:"\F0FB8"}.mdi-format-letter-matches:before{content:"\F0FB9"}.mdi-format-letter-starts-with:before{content:"\F0FBA"}.mdi-format-line-spacing:before{content:"\F0278"}.mdi-format-line-style:before{content:"\F05C8"}.mdi-format-line-weight:before{content:"\F05C9"}.mdi-format-list-bulleted:before{content:"\F0279"}.mdi-format-list-bulleted-square:before{content:"\F0DD0"}.mdi-format-list-bulleted-triangle:before{content:"\F0EB2"}.mdi-format-list-bulleted-type:before{content:"\F027A"}.mdi-format-list-checkbox:before{content:"\F096A"}.mdi-format-list-checks:before{content:"\F0756"}.mdi-format-list-numbered:before{content:"\F027B"}.mdi-format-list-numbered-rtl:before{content:"\F0D0D"}.mdi-format-list-text:before{content:"\F126F"}.mdi-format-overline:before{content:"\F0EB3"}.mdi-format-page-break:before{content:"\F06D7"}.mdi-format-paint:before{content:"\F027C"}.mdi-format-paragraph:before{content:"\F027D"}.mdi-format-pilcrow:before{content:"\F06D8"}.mdi-format-quote-close:before{content:"\F027E"}.mdi-format-quote-close-outline:before{content:"\F11A8"}.mdi-format-quote-open:before{content:"\F0757"}.mdi-format-quote-open-outline:before{content:"\F11A7"}.mdi-format-rotate-90:before{content:"\F06AA"}.mdi-format-section:before{content:"\F069F"}.mdi-format-size:before{content:"\F027F"}.mdi-format-strikethrough:before{content:"\F0280"}.mdi-format-strikethrough-variant:before{content:"\F0281"}.mdi-format-subscript:before{content:"\F0282"}.mdi-format-superscript:before{content:"\F0283"}.mdi-format-text:before{content:"\F0284"}.mdi-format-text-rotation-angle-down:before{content:"\F0FBB"}.mdi-format-text-rotation-angle-up:before{content:"\F0FBC"}.mdi-format-text-rotation-down:before{content:"\F0D73"}.mdi-format-text-rotation-down-vertical:before{content:"\F0FBD"}.mdi-format-text-rotation-none:before{content:"\F0D74"}.mdi-format-text-rotation-up:before{content:"\F0FBE"}.mdi-format-text-rotation-vertical:before{content:"\F0FBF"}.mdi-format-text-variant:before{content:"\F0E32"}.mdi-format-text-variant-outline:before{content:"\F150F"}.mdi-format-text-wrapping-clip:before{content:"\F0D0E"}.mdi-format-text-wrapping-overflow:before{content:"\F0D0F"}.mdi-format-text-wrapping-wrap:before{content:"\F0D10"}.mdi-format-textbox:before{content:"\F0D11"}.mdi-format-textdirection-l-to-r:before{content:"\F0285"}.mdi-format-textdirection-r-to-l:before{content:"\F0286"}.mdi-format-title:before{content:"\F05F4"}.mdi-format-underline:before{content:"\F0287"}.mdi-format-vertical-align-bottom:before{content:"\F0621"}.mdi-format-vertical-align-center:before{content:"\F0622"}.mdi-format-vertical-align-top:before{content:"\F0623"}.mdi-format-wrap-inline:before{content:"\F0288"}.mdi-format-wrap-square:before{content:"\F0289"}.mdi-format-wrap-tight:before{content:"\F028A"}.mdi-format-wrap-top-bottom:before{content:"\F028B"}.mdi-forum:before{content:"\F028C"}.mdi-forum-outline:before{content:"\F0822"}.mdi-forward:before{content:"\F028D"}.mdi-forwardburger:before{content:"\F0D75"}.mdi-fountain:before{content:"\F096B"}.mdi-fountain-pen:before{content:"\F0D12"}.mdi-fountain-pen-tip:before{content:"\F0D13"}.mdi-freebsd:before{content:"\F08E0"}.mdi-frequently-asked-questions:before{content:"\F0EB4"}.mdi-fridge:before{content:"\F0290"}.mdi-fridge-alert:before{content:"\F11B1"}.mdi-fridge-alert-outline:before{content:"\F11B2"}.mdi-fridge-bottom:before{content:"\F0292"}.mdi-fridge-industrial:before{content:"\F15EE"}.mdi-fridge-industrial-alert:before{content:"\F15EF"}.mdi-fridge-industrial-alert-outline:before{content:"\F15F0"}.mdi-fridge-industrial-off:before{content:"\F15F1"}.mdi-fridge-industrial-off-outline:before{content:"\F15F2"}.mdi-fridge-industrial-outline:before{content:"\F15F3"}.mdi-fridge-off:before{content:"\F11AF"}.mdi-fridge-off-outline:before{content:"\F11B0"}.mdi-fridge-outline:before{content:"\F028F"}.mdi-fridge-top:before{content:"\F0291"}.mdi-fridge-variant:before{content:"\F15F4"}.mdi-fridge-variant-alert:before{content:"\F15F5"}.mdi-fridge-variant-alert-outline:before{content:"\F15F6"}.mdi-fridge-variant-off:before{content:"\F15F7"}.mdi-fridge-variant-off-outline:before{content:"\F15F8"}.mdi-fridge-variant-outline:before{content:"\F15F9"}.mdi-fruit-cherries:before{content:"\F1042"}.mdi-fruit-cherries-off:before{content:"\F13F8"}.mdi-fruit-citrus:before{content:"\F1043"}.mdi-fruit-citrus-off:before{content:"\F13F9"}.mdi-fruit-grapes:before{content:"\F1044"}.mdi-fruit-grapes-outline:before{content:"\F1045"}.mdi-fruit-pineapple:before{content:"\F1046"}.mdi-fruit-watermelon:before{content:"\F1047"}.mdi-fuel:before{content:"\F07CA"}.mdi-fullscreen:before{content:"\F0293"}.mdi-fullscreen-exit:before{content:"\F0294"}.mdi-function:before{content:"\F0295"}.mdi-function-variant:before{content:"\F0871"}.mdi-furigana-horizontal:before{content:"\F1081"}.mdi-furigana-vertical:before{content:"\F1082"}.mdi-fuse:before{content:"\F0C85"}.mdi-fuse-alert:before{content:"\F142D"}.mdi-fuse-blade:before{content:"\F0C86"}.mdi-fuse-off:before{content:"\F142C"}.mdi-gamepad:before{content:"\F0296"}.mdi-gamepad-circle:before{content:"\F0E33"}.mdi-gamepad-circle-down:before{content:"\F0E34"}.mdi-gamepad-circle-left:before{content:"\F0E35"}.mdi-gamepad-circle-outline:before{content:"\F0E36"}.mdi-gamepad-circle-right:before{content:"\F0E37"}.mdi-gamepad-circle-up:before{content:"\F0E38"}.mdi-gamepad-down:before{content:"\F0E39"}.mdi-gamepad-left:before{content:"\F0E3A"}.mdi-gamepad-right:before{content:"\F0E3B"}.mdi-gamepad-round:before{content:"\F0E3C"}.mdi-gamepad-round-down:before{content:"\F0E3D"}.mdi-gamepad-round-left:before{content:"\F0E3E"}.mdi-gamepad-round-outline:before{content:"\F0E3F"}.mdi-gamepad-round-right:before{content:"\F0E40"}.mdi-gamepad-round-up:before{content:"\F0E41"}.mdi-gamepad-square:before{content:"\F0EB5"}.mdi-gamepad-square-outline:before{content:"\F0EB6"}.mdi-gamepad-up:before{content:"\F0E42"}.mdi-gamepad-variant:before{content:"\F0297"}.mdi-gamepad-variant-outline:before{content:"\F0EB7"}.mdi-gamma:before{content:"\F10EE"}.mdi-gantry-crane:before{content:"\F0DD1"}.mdi-garage:before{content:"\F06D9"}.mdi-garage-alert:before{content:"\F0872"}.mdi-garage-alert-variant:before{content:"\F12D5"}.mdi-garage-open:before{content:"\F06DA"}.mdi-garage-open-variant:before{content:"\F12D4"}.mdi-garage-variant:before{content:"\F12D3"}.mdi-gas-cylinder:before{content:"\F0647"}.mdi-gas-station:before{content:"\F0298"}.mdi-gas-station-off:before{content:"\F1409"}.mdi-gas-station-off-outline:before{content:"\F140A"}.mdi-gas-station-outline:before{content:"\F0EB8"}.mdi-gate:before{content:"\F0299"}.mdi-gate-and:before{content:"\F08E1"}.mdi-gate-arrow-right:before{content:"\F1169"}.mdi-gate-nand:before{content:"\F08E2"}.mdi-gate-nor:before{content:"\F08E3"}.mdi-gate-not:before{content:"\F08E4"}.mdi-gate-open:before{content:"\F116A"}.mdi-gate-or:before{content:"\F08E5"}.mdi-gate-xnor:before{content:"\F08E6"}.mdi-gate-xor:before{content:"\F08E7"}.mdi-gatsby:before{content:"\F0E43"}.mdi-gauge:before{content:"\F029A"}.mdi-gauge-empty:before{content:"\F0873"}.mdi-gauge-full:before{content:"\F0874"}.mdi-gauge-low:before{content:"\F0875"}.mdi-gavel:before{content:"\F029B"}.mdi-gender-female:before{content:"\F029C"}.mdi-gender-male:before{content:"\F029D"}.mdi-gender-male-female:before{content:"\F029E"}.mdi-gender-male-female-variant:before{content:"\F113F"}.mdi-gender-non-binary:before{content:"\F1140"}.mdi-gender-transgender:before{content:"\F029F"}.mdi-gentoo:before{content:"\F08E8"}.mdi-gesture:before{content:"\F07CB"}.mdi-gesture-double-tap:before{content:"\F073C"}.mdi-gesture-pinch:before{content:"\F0ABD"}.mdi-gesture-spread:before{content:"\F0ABE"}.mdi-gesture-swipe:before{content:"\F0D76"}.mdi-gesture-swipe-down:before{content:"\F073D"}.mdi-gesture-swipe-horizontal:before{content:"\F0ABF"}.mdi-gesture-swipe-left:before{content:"\F073E"}.mdi-gesture-swipe-right:before{content:"\F073F"}.mdi-gesture-swipe-up:before{content:"\F0740"}.mdi-gesture-swipe-vertical:before{content:"\F0AC0"}.mdi-gesture-tap:before{content:"\F0741"}.mdi-gesture-tap-box:before{content:"\F12A9"}.mdi-gesture-tap-button:before{content:"\F12A8"}.mdi-gesture-tap-hold:before{content:"\F0D77"}.mdi-gesture-two-double-tap:before{content:"\F0742"}.mdi-gesture-two-tap:before{content:"\F0743"}.mdi-ghost:before{content:"\F02A0"}.mdi-ghost-off:before{content:"\F09F5"}.mdi-ghost-off-outline:before{content:"\F165C"}.mdi-ghost-outline:before{content:"\F165D"}.mdi-gif:before{content:"\F0D78"}.mdi-gift:before{content:"\F0E44"}.mdi-gift-off:before{content:"\F16EF"}.mdi-gift-off-outline:before{content:"\F16F0"}.mdi-gift-open:before{content:"\F16F1"}.mdi-gift-open-outline:before{content:"\F16F2"}.mdi-gift-outline:before{content:"\F02A1"}.mdi-git:before{content:"\F02A2"}.mdi-github:before{content:"\F02A4"}.mdi-gitlab:before{content:"\F0BA0"}.mdi-glass-cocktail:before{content:"\F0356"}.mdi-glass-cocktail-off:before{content:"\F15E6"}.mdi-glass-flute:before{content:"\F02A5"}.mdi-glass-mug:before{content:"\F02A6"}.mdi-glass-mug-off:before{content:"\F15E7"}.mdi-glass-mug-variant:before{content:"\F1116"}.mdi-glass-mug-variant-off:before{content:"\F15E8"}.mdi-glass-pint-outline:before{content:"\F130D"}.mdi-glass-stange:before{content:"\F02A7"}.mdi-glass-tulip:before{content:"\F02A8"}.mdi-glass-wine:before{content:"\F0876"}.mdi-glasses:before{content:"\F02AA"}.mdi-globe-light:before{content:"\F12D7"}.mdi-globe-model:before{content:"\F08E9"}.mdi-gmail:before{content:"\F02AB"}.mdi-gnome:before{content:"\F02AC"}.mdi-go-kart:before{content:"\F0D79"}.mdi-go-kart-track:before{content:"\F0D7A"}.mdi-gog:before{content:"\F0BA1"}.mdi-gold:before{content:"\F124F"}.mdi-golf:before{content:"\F0823"}.mdi-golf-cart:before{content:"\F11A4"}.mdi-golf-tee:before{content:"\F1083"}.mdi-gondola:before{content:"\F0686"}.mdi-goodreads:before{content:"\F0D7B"}.mdi-google:before{content:"\F02AD"}.mdi-google-ads:before{content:"\F0C87"}.mdi-google-analytics:before{content:"\F07CC"}.mdi-google-assistant:before{content:"\F07CD"}.mdi-google-cardboard:before{content:"\F02AE"}.mdi-google-chrome:before{content:"\F02AF"}.mdi-google-circles:before{content:"\F02B0"}.mdi-google-circles-communities:before{content:"\F02B1"}.mdi-google-circles-extended:before{content:"\F02B2"}.mdi-google-circles-group:before{content:"\F02B3"}.mdi-google-classroom:before{content:"\F02C0"}.mdi-google-cloud:before{content:"\F11F6"}.mdi-google-controller:before{content:"\F02B4"}.mdi-google-controller-off:before{content:"\F02B5"}.mdi-google-downasaur:before{content:"\F1362"}.mdi-google-drive:before{content:"\F02B6"}.mdi-google-earth:before{content:"\F02B7"}.mdi-google-fit:before{content:"\F096C"}.mdi-google-glass:before{content:"\F02B8"}.mdi-google-hangouts:before{content:"\F02C9"}.mdi-google-home:before{content:"\F0824"}.mdi-google-keep:before{content:"\F06DC"}.mdi-google-lens:before{content:"\F09F6"}.mdi-google-maps:before{content:"\F05F5"}.mdi-google-my-business:before{content:"\F1048"}.mdi-google-nearby:before{content:"\F02B9"}.mdi-google-photos:before{content:"\F06DD"}.mdi-google-play:before{content:"\F02BC"}.mdi-google-plus:before{content:"\F02BD"}.mdi-google-podcast:before{content:"\F0EB9"}.mdi-google-spreadsheet:before{content:"\F09F7"}.mdi-google-street-view:before{content:"\F0C88"}.mdi-google-translate:before{content:"\F02BF"}.mdi-gradient:before{content:"\F06A0"}.mdi-grain:before{content:"\F0D7C"}.mdi-graph:before{content:"\F1049"}.mdi-graph-outline:before{content:"\F104A"}.mdi-graphql:before{content:"\F0877"}.mdi-grass:before{content:"\F1510"}.mdi-grave-stone:before{content:"\F0BA2"}.mdi-grease-pencil:before{content:"\F0648"}.mdi-greater-than:before{content:"\F096D"}.mdi-greater-than-or-equal:before{content:"\F096E"}.mdi-grid:before{content:"\F02C1"}.mdi-grid-large:before{content:"\F0758"}.mdi-grid-off:before{content:"\F02C2"}.mdi-grill:before{content:"\F0E45"}.mdi-grill-outline:before{content:"\F118A"}.mdi-group:before{content:"\F02C3"}.mdi-guitar-acoustic:before{content:"\F0771"}.mdi-guitar-electric:before{content:"\F02C4"}.mdi-guitar-pick:before{content:"\F02C5"}.mdi-guitar-pick-outline:before{content:"\F02C6"}.mdi-guy-fawkes-mask:before{content:"\F0825"}.mdi-hail:before{content:"\F0AC1"}.mdi-hair-dryer:before{content:"\F10EF"}.mdi-hair-dryer-outline:before{content:"\F10F0"}.mdi-halloween:before{content:"\F0BA3"}.mdi-hamburger:before{content:"\F0685"}.mdi-hammer:before{content:"\F08EA"}.mdi-hammer-screwdriver:before{content:"\F1322"}.mdi-hammer-wrench:before{content:"\F1323"}.mdi-hand:before{content:"\F0A4F"}.mdi-hand-heart:before{content:"\F10F1"}.mdi-hand-heart-outline:before{content:"\F157E"}.mdi-hand-left:before{content:"\F0E46"}.mdi-hand-okay:before{content:"\F0A50"}.mdi-hand-peace:before{content:"\F0A51"}.mdi-hand-peace-variant:before{content:"\F0A52"}.mdi-hand-pointing-down:before{content:"\F0A53"}.mdi-hand-pointing-left:before{content:"\F0A54"}.mdi-hand-pointing-right:before{content:"\F02C7"}.mdi-hand-pointing-up:before{content:"\F0A55"}.mdi-hand-right:before{content:"\F0E47"}.mdi-hand-saw:before{content:"\F0E48"}.mdi-hand-wash:before{content:"\F157F"}.mdi-hand-wash-outline:before{content:"\F1580"}.mdi-hand-water:before{content:"\F139F"}.mdi-handball:before{content:"\F0F53"}.mdi-handcuffs:before{content:"\F113E"}.mdi-handshake:before{content:"\F1218"}.mdi-handshake-outline:before{content:"\F15A1"}.mdi-hanger:before{content:"\F02C8"}.mdi-hard-hat:before{content:"\F096F"}.mdi-harddisk:before{content:"\F02CA"}.mdi-harddisk-plus:before{content:"\F104B"}.mdi-harddisk-remove:before{content:"\F104C"}.mdi-hat-fedora:before{content:"\F0BA4"}.mdi-hazard-lights:before{content:"\F0C89"}.mdi-hdr:before{content:"\F0D7D"}.mdi-hdr-off:before{content:"\F0D7E"}.mdi-head:before{content:"\F135E"}.mdi-head-alert:before{content:"\F1338"}.mdi-head-alert-outline:before{content:"\F1339"}.mdi-head-check:before{content:"\F133A"}.mdi-head-check-outline:before{content:"\F133B"}.mdi-head-cog:before{content:"\F133C"}.mdi-head-cog-outline:before{content:"\F133D"}.mdi-head-dots-horizontal:before{content:"\F133E"}.mdi-head-dots-horizontal-outline:before{content:"\F133F"}.mdi-head-flash:before{content:"\F1340"}.mdi-head-flash-outline:before{content:"\F1341"}.mdi-head-heart:before{content:"\F1342"}.mdi-head-heart-outline:before{content:"\F1343"}.mdi-head-lightbulb:before{content:"\F1344"}.mdi-head-lightbulb-outline:before{content:"\F1345"}.mdi-head-minus:before{content:"\F1346"}.mdi-head-minus-outline:before{content:"\F1347"}.mdi-head-outline:before{content:"\F135F"}.mdi-head-plus:before{content:"\F1348"}.mdi-head-plus-outline:before{content:"\F1349"}.mdi-head-question:before{content:"\F134A"}.mdi-head-question-outline:before{content:"\F134B"}.mdi-head-remove:before{content:"\F134C"}.mdi-head-remove-outline:before{content:"\F134D"}.mdi-head-snowflake:before{content:"\F134E"}.mdi-head-snowflake-outline:before{content:"\F134F"}.mdi-head-sync:before{content:"\F1350"}.mdi-head-sync-outline:before{content:"\F1351"}.mdi-headphones:before{content:"\F02CB"}.mdi-headphones-bluetooth:before{content:"\F0970"}.mdi-headphones-box:before{content:"\F02CC"}.mdi-headphones-off:before{content:"\F07CE"}.mdi-headphones-settings:before{content:"\F02CD"}.mdi-headset:before{content:"\F02CE"}.mdi-headset-dock:before{content:"\F02CF"}.mdi-headset-off:before{content:"\F02D0"}.mdi-heart:before{content:"\F02D1"}.mdi-heart-box:before{content:"\F02D2"}.mdi-heart-box-outline:before{content:"\F02D3"}.mdi-heart-broken:before{content:"\F02D4"}.mdi-heart-broken-outline:before{content:"\F0D14"}.mdi-heart-circle:before{content:"\F0971"}.mdi-heart-circle-outline:before{content:"\F0972"}.mdi-heart-cog:before{content:"\F1663"}.mdi-heart-cog-outline:before{content:"\F1664"}.mdi-heart-flash:before{content:"\F0EF9"}.mdi-heart-half:before{content:"\F06DF"}.mdi-heart-half-full:before{content:"\F06DE"}.mdi-heart-half-outline:before{content:"\F06E0"}.mdi-heart-minus:before{content:"\F142F"}.mdi-heart-minus-outline:before{content:"\F1432"}.mdi-heart-multiple:before{content:"\F0A56"}.mdi-heart-multiple-outline:before{content:"\F0A57"}.mdi-heart-off:before{content:"\F0759"}.mdi-heart-off-outline:before{content:"\F1434"}.mdi-heart-outline:before{content:"\F02D5"}.mdi-heart-plus:before{content:"\F142E"}.mdi-heart-plus-outline:before{content:"\F1431"}.mdi-heart-pulse:before{content:"\F05F6"}.mdi-heart-remove:before{content:"\F1430"}.mdi-heart-remove-outline:before{content:"\F1433"}.mdi-heart-settings:before{content:"\F1665"}.mdi-heart-settings-outline:before{content:"\F1666"}.mdi-helicopter:before{content:"\F0AC2"}.mdi-help:before{content:"\F02D6"}.mdi-help-box:before{content:"\F078B"}.mdi-help-circle:before{content:"\F02D7"}.mdi-help-circle-outline:before{content:"\F0625"}.mdi-help-network:before{content:"\F06F5"}.mdi-help-network-outline:before{content:"\F0C8A"}.mdi-help-rhombus:before{content:"\F0BA5"}.mdi-help-rhombus-outline:before{content:"\F0BA6"}.mdi-hexadecimal:before{content:"\F12A7"}.mdi-hexagon:before{content:"\F02D8"}.mdi-hexagon-multiple:before{content:"\F06E1"}.mdi-hexagon-multiple-outline:before{content:"\F10F2"}.mdi-hexagon-outline:before{content:"\F02D9"}.mdi-hexagon-slice-1:before{content:"\F0AC3"}.mdi-hexagon-slice-2:before{content:"\F0AC4"}.mdi-hexagon-slice-3:before{content:"\F0AC5"}.mdi-hexagon-slice-4:before{content:"\F0AC6"}.mdi-hexagon-slice-5:before{content:"\F0AC7"}.mdi-hexagon-slice-6:before{content:"\F0AC8"}.mdi-hexagram:before{content:"\F0AC9"}.mdi-hexagram-outline:before{content:"\F0ACA"}.mdi-high-definition:before{content:"\F07CF"}.mdi-high-definition-box:before{content:"\F0878"}.mdi-highway:before{content:"\F05F7"}.mdi-hiking:before{content:"\F0D7F"}.mdi-hinduism:before{content:"\F0973"}.mdi-history:before{content:"\F02DA"}.mdi-hockey-puck:before{content:"\F0879"}.mdi-hockey-sticks:before{content:"\F087A"}.mdi-hololens:before{content:"\F02DB"}.mdi-home:before{content:"\F02DC"}.mdi-home-account:before{content:"\F0826"}.mdi-home-alert:before{content:"\F087B"}.mdi-home-alert-outline:before{content:"\F15D0"}.mdi-home-analytics:before{content:"\F0EBA"}.mdi-home-assistant:before{content:"\F07D0"}.mdi-home-automation:before{content:"\F07D1"}.mdi-home-circle:before{content:"\F07D2"}.mdi-home-circle-outline:before{content:"\F104D"}.mdi-home-city:before{content:"\F0D15"}.mdi-home-city-outline:before{content:"\F0D16"}.mdi-home-currency-usd:before{content:"\F08AF"}.mdi-home-edit:before{content:"\F1159"}.mdi-home-edit-outline:before{content:"\F115A"}.mdi-home-export-outline:before{content:"\F0F9B"}.mdi-home-flood:before{content:"\F0EFA"}.mdi-home-floor-0:before{content:"\F0DD2"}.mdi-home-floor-1:before{content:"\F0D80"}.mdi-home-floor-2:before{content:"\F0D81"}.mdi-home-floor-3:before{content:"\F0D82"}.mdi-home-floor-a:before{content:"\F0D83"}.mdi-home-floor-b:before{content:"\F0D84"}.mdi-home-floor-g:before{content:"\F0D85"}.mdi-home-floor-l:before{content:"\F0D86"}.mdi-home-floor-negative-1:before{content:"\F0DD3"}.mdi-home-group:before{content:"\F0DD4"}.mdi-home-heart:before{content:"\F0827"}.mdi-home-import-outline:before{content:"\F0F9C"}.mdi-home-lightbulb:before{content:"\F1251"}.mdi-home-lightbulb-outline:before{content:"\F1252"}.mdi-home-lock:before{content:"\F08EB"}.mdi-home-lock-open:before{content:"\F08EC"}.mdi-home-map-marker:before{content:"\F05F8"}.mdi-home-minus:before{content:"\F0974"}.mdi-home-minus-outline:before{content:"\F13D5"}.mdi-home-modern:before{content:"\F02DD"}.mdi-home-outline:before{content:"\F06A1"}.mdi-home-plus:before{content:"\F0975"}.mdi-home-plus-outline:before{content:"\F13D6"}.mdi-home-remove:before{content:"\F1247"}.mdi-home-remove-outline:before{content:"\F13D7"}.mdi-home-roof:before{content:"\F112B"}.mdi-home-search:before{content:"\F13B0"}.mdi-home-search-outline:before{content:"\F13B1"}.mdi-home-thermometer:before{content:"\F0F54"}.mdi-home-thermometer-outline:before{content:"\F0F55"}.mdi-home-variant:before{content:"\F02DE"}.mdi-home-variant-outline:before{content:"\F0BA7"}.mdi-hook:before{content:"\F06E2"}.mdi-hook-off:before{content:"\F06E3"}.mdi-hops:before{content:"\F02DF"}.mdi-horizontal-rotate-clockwise:before{content:"\F10F3"}.mdi-horizontal-rotate-counterclockwise:before{content:"\F10F4"}.mdi-horse:before{content:"\F15BF"}.mdi-horse-human:before{content:"\F15C0"}.mdi-horse-variant:before{content:"\F15C1"}.mdi-horseshoe:before{content:"\F0A58"}.mdi-hospital:before{content:"\F0FF6"}.mdi-hospital-box:before{content:"\F02E0"}.mdi-hospital-box-outline:before{content:"\F0FF7"}.mdi-hospital-building:before{content:"\F02E1"}.mdi-hospital-marker:before{content:"\F02E2"}.mdi-hot-tub:before{content:"\F0828"}.mdi-hours-24:before{content:"\F1478"}.mdi-hubspot:before{content:"\F0D17"}.mdi-hulu:before{content:"\F0829"}.mdi-human:before{content:"\F02E6"}.mdi-human-baby-changing-table:before{content:"\F138B"}.mdi-human-cane:before{content:"\F1581"}.mdi-human-capacity-decrease:before{content:"\F159B"}.mdi-human-capacity-increase:before{content:"\F159C"}.mdi-human-child:before{content:"\F02E7"}.mdi-human-edit:before{content:"\F14E8"}.mdi-human-female:before{content:"\F0649"}.mdi-human-female-boy:before{content:"\F0A59"}.mdi-human-female-dance:before{content:"\F15C9"}.mdi-human-female-female:before{content:"\F0A5A"}.mdi-human-female-girl:before{content:"\F0A5B"}.mdi-human-greeting:before{content:"\F064A"}.mdi-human-greeting-proximity:before{content:"\F159D"}.mdi-human-handsdown:before{content:"\F064B"}.mdi-human-handsup:before{content:"\F064C"}.mdi-human-male:before{content:"\F064D"}.mdi-human-male-boy:before{content:"\F0A5C"}.mdi-human-male-child:before{content:"\F138C"}.mdi-human-male-female:before{content:"\F02E8"}.mdi-human-male-girl:before{content:"\F0A5D"}.mdi-human-male-height:before{content:"\F0EFB"}.mdi-human-male-height-variant:before{content:"\F0EFC"}.mdi-human-male-male:before{content:"\F0A5E"}.mdi-human-pregnant:before{content:"\F05CF"}.mdi-human-queue:before{content:"\F1571"}.mdi-human-scooter:before{content:"\F11E9"}.mdi-human-wheelchair:before{content:"\F138D"}.mdi-humble-bundle:before{content:"\F0744"}.mdi-hvac:before{content:"\F1352"}.mdi-hvac-off:before{content:"\F159E"}.mdi-hydraulic-oil-level:before{content:"\F1324"}.mdi-hydraulic-oil-temperature:before{content:"\F1325"}.mdi-hydro-power:before{content:"\F12E5"}.mdi-ice-cream:before{content:"\F082A"}.mdi-ice-cream-off:before{content:"\F0E52"}.mdi-ice-pop:before{content:"\F0EFD"}.mdi-id-card:before{content:"\F0FC0"}.mdi-identifier:before{content:"\F0EFE"}.mdi-ideogram-cjk:before{content:"\F1331"}.mdi-ideogram-cjk-variant:before{content:"\F1332"}.mdi-iframe:before{content:"\F0C8B"}.mdi-iframe-array:before{content:"\F10F5"}.mdi-iframe-array-outline:before{content:"\F10F6"}.mdi-iframe-braces:before{content:"\F10F7"}.mdi-iframe-braces-outline:before{content:"\F10F8"}.mdi-iframe-outline:before{content:"\F0C8C"}.mdi-iframe-parentheses:before{content:"\F10F9"}.mdi-iframe-parentheses-outline:before{content:"\F10FA"}.mdi-iframe-variable:before{content:"\F10FB"}.mdi-iframe-variable-outline:before{content:"\F10FC"}.mdi-image:before{content:"\F02E9"}.mdi-image-album:before{content:"\F02EA"}.mdi-image-area:before{content:"\F02EB"}.mdi-image-area-close:before{content:"\F02EC"}.mdi-image-auto-adjust:before{content:"\F0FC1"}.mdi-image-broken:before{content:"\F02ED"}.mdi-image-broken-variant:before{content:"\F02EE"}.mdi-image-edit:before{content:"\F11E3"}.mdi-image-edit-outline:before{content:"\F11E4"}.mdi-image-filter-black-white:before{content:"\F02F0"}.mdi-image-filter-center-focus:before{content:"\F02F1"}.mdi-image-filter-center-focus-strong:before{content:"\F0EFF"}.mdi-image-filter-center-focus-strong-outline:before{content:"\F0F00"}.mdi-image-filter-center-focus-weak:before{content:"\F02F2"}.mdi-image-filter-drama:before{content:"\F02F3"}.mdi-image-filter-frames:before{content:"\F02F4"}.mdi-image-filter-hdr:before{content:"\F02F5"}.mdi-image-filter-none:before{content:"\F02F6"}.mdi-image-filter-tilt-shift:before{content:"\F02F7"}.mdi-image-filter-vintage:before{content:"\F02F8"}.mdi-image-frame:before{content:"\F0E49"}.mdi-image-minus:before{content:"\F1419"}.mdi-image-move:before{content:"\F09F8"}.mdi-image-multiple:before{content:"\F02F9"}.mdi-image-multiple-outline:before{content:"\F02EF"}.mdi-image-off:before{content:"\F082B"}.mdi-image-off-outline:before{content:"\F11D1"}.mdi-image-outline:before{content:"\F0976"}.mdi-image-plus:before{content:"\F087C"}.mdi-image-remove:before{content:"\F1418"}.mdi-image-search:before{content:"\F0977"}.mdi-image-search-outline:before{content:"\F0978"}.mdi-image-size-select-actual:before{content:"\F0C8D"}.mdi-image-size-select-large:before{content:"\F0C8E"}.mdi-image-size-select-small:before{content:"\F0C8F"}.mdi-image-text:before{content:"\F160D"}.mdi-import:before{content:"\F02FA"}.mdi-inbox:before{content:"\F0687"}.mdi-inbox-arrow-down:before{content:"\F02FB"}.mdi-inbox-arrow-down-outline:before{content:"\F1270"}.mdi-inbox-arrow-up:before{content:"\F03D1"}.mdi-inbox-arrow-up-outline:before{content:"\F1271"}.mdi-inbox-full:before{content:"\F1272"}.mdi-inbox-full-outline:before{content:"\F1273"}.mdi-inbox-multiple:before{content:"\F08B0"}.mdi-inbox-multiple-outline:before{content:"\F0BA8"}.mdi-inbox-outline:before{content:"\F1274"}.mdi-inbox-remove:before{content:"\F159F"}.mdi-inbox-remove-outline:before{content:"\F15A0"}.mdi-incognito:before{content:"\F05F9"}.mdi-incognito-circle:before{content:"\F1421"}.mdi-incognito-circle-off:before{content:"\F1422"}.mdi-incognito-off:before{content:"\F0075"}.mdi-infinity:before{content:"\F06E4"}.mdi-information:before{content:"\F02FC"}.mdi-information-outline:before{content:"\F02FD"}.mdi-information-variant:before{content:"\F064E"}.mdi-instagram:before{content:"\F02FE"}.mdi-instrument-triangle:before{content:"\F104E"}.mdi-invert-colors:before{content:"\F0301"}.mdi-invert-colors-off:before{content:"\F0E4A"}.mdi-iobroker:before{content:"\F12E8"}.mdi-ip:before{content:"\F0A5F"}.mdi-ip-network:before{content:"\F0A60"}.mdi-ip-network-outline:before{content:"\F0C90"}.mdi-ipod:before{content:"\F0C91"}.mdi-islam:before{content:"\F0979"}.mdi-island:before{content:"\F104F"}.mdi-iv-bag:before{content:"\F10B9"}.mdi-jabber:before{content:"\F0DD5"}.mdi-jeepney:before{content:"\F0302"}.mdi-jellyfish:before{content:"\F0F01"}.mdi-jellyfish-outline:before{content:"\F0F02"}.mdi-jira:before{content:"\F0303"}.mdi-jquery:before{content:"\F087D"}.mdi-jsfiddle:before{content:"\F0304"}.mdi-judaism:before{content:"\F097A"}.mdi-jump-rope:before{content:"\F12FF"}.mdi-kabaddi:before{content:"\F0D87"}.mdi-kangaroo:before{content:"\F1558"}.mdi-karate:before{content:"\F082C"}.mdi-keg:before{content:"\F0305"}.mdi-kettle:before{content:"\F05FA"}.mdi-kettle-alert:before{content:"\F1317"}.mdi-kettle-alert-outline:before{content:"\F1318"}.mdi-kettle-off:before{content:"\F131B"}.mdi-kettle-off-outline:before{content:"\F131C"}.mdi-kettle-outline:before{content:"\F0F56"}.mdi-kettle-pour-over:before{content:"\F173C"}.mdi-kettle-steam:before{content:"\F1319"}.mdi-kettle-steam-outline:before{content:"\F131A"}.mdi-kettlebell:before{content:"\F1300"}.mdi-key:before{content:"\F0306"}.mdi-key-arrow-right:before{content:"\F1312"}.mdi-key-chain:before{content:"\F1574"}.mdi-key-chain-variant:before{content:"\F1575"}.mdi-key-change:before{content:"\F0307"}.mdi-key-link:before{content:"\F119F"}.mdi-key-minus:before{content:"\F0308"}.mdi-key-outline:before{content:"\F0DD6"}.mdi-key-plus:before{content:"\F0309"}.mdi-key-remove:before{content:"\F030A"}.mdi-key-star:before{content:"\F119E"}.mdi-key-variant:before{content:"\F030B"}.mdi-key-wireless:before{content:"\F0FC2"}.mdi-keyboard:before{content:"\F030C"}.mdi-keyboard-backspace:before{content:"\F030D"}.mdi-keyboard-caps:before{content:"\F030E"}.mdi-keyboard-close:before{content:"\F030F"}.mdi-keyboard-esc:before{content:"\F12B7"}.mdi-keyboard-f1:before{content:"\F12AB"}.mdi-keyboard-f10:before{content:"\F12B4"}.mdi-keyboard-f11:before{content:"\F12B5"}.mdi-keyboard-f12:before{content:"\F12B6"}.mdi-keyboard-f2:before{content:"\F12AC"}.mdi-keyboard-f3:before{content:"\F12AD"}.mdi-keyboard-f4:before{content:"\F12AE"}.mdi-keyboard-f5:before{content:"\F12AF"}.mdi-keyboard-f6:before{content:"\F12B0"}.mdi-keyboard-f7:before{content:"\F12B1"}.mdi-keyboard-f8:before{content:"\F12B2"}.mdi-keyboard-f9:before{content:"\F12B3"}.mdi-keyboard-off:before{content:"\F0310"}.mdi-keyboard-off-outline:before{content:"\F0E4B"}.mdi-keyboard-outline:before{content:"\F097B"}.mdi-keyboard-return:before{content:"\F0311"}.mdi-keyboard-settings:before{content:"\F09F9"}.mdi-keyboard-settings-outline:before{content:"\F09FA"}.mdi-keyboard-space:before{content:"\F1050"}.mdi-keyboard-tab:before{content:"\F0312"}.mdi-keyboard-variant:before{content:"\F0313"}.mdi-khanda:before{content:"\F10FD"}.mdi-kickstarter:before{content:"\F0745"}.mdi-klingon:before{content:"\F135B"}.mdi-knife:before{content:"\F09FB"}.mdi-knife-military:before{content:"\F09FC"}.mdi-koala:before{content:"\F173F"}.mdi-kodi:before{content:"\F0314"}.mdi-kubernetes:before{content:"\F10FE"}.mdi-label:before{content:"\F0315"}.mdi-label-multiple:before{content:"\F1375"}.mdi-label-multiple-outline:before{content:"\F1376"}.mdi-label-off:before{content:"\F0ACB"}.mdi-label-off-outline:before{content:"\F0ACC"}.mdi-label-outline:before{content:"\F0316"}.mdi-label-percent:before{content:"\F12EA"}.mdi-label-percent-outline:before{content:"\F12EB"}.mdi-label-variant:before{content:"\F0ACD"}.mdi-label-variant-outline:before{content:"\F0ACE"}.mdi-ladder:before{content:"\F15A2"}.mdi-ladybug:before{content:"\F082D"}.mdi-lambda:before{content:"\F0627"}.mdi-lamp:before{content:"\F06B5"}.mdi-lamps:before{content:"\F1576"}.mdi-lan:before{content:"\F0317"}.mdi-lan-check:before{content:"\F12AA"}.mdi-lan-connect:before{content:"\F0318"}.mdi-lan-disconnect:before{content:"\F0319"}.mdi-lan-pending:before{content:"\F031A"}.mdi-language-c:before{content:"\F0671"}.mdi-language-cpp:before{content:"\F0672"}.mdi-language-csharp:before{content:"\F031B"}.mdi-language-css3:before{content:"\F031C"}.mdi-language-fortran:before{content:"\F121A"}.mdi-language-go:before{content:"\F07D3"}.mdi-language-haskell:before{content:"\F0C92"}.mdi-language-html5:before{content:"\F031D"}.mdi-language-java:before{content:"\F0B37"}.mdi-language-javascript:before{content:"\F031E"}.mdi-language-kotlin:before{content:"\F1219"}.mdi-language-lua:before{content:"\F08B1"}.mdi-language-markdown:before{content:"\F0354"}.mdi-language-markdown-outline:before{content:"\F0F5B"}.mdi-language-php:before{content:"\F031F"}.mdi-language-python:before{content:"\F0320"}.mdi-language-r:before{content:"\F07D4"}.mdi-language-ruby:before{content:"\F0D2D"}.mdi-language-ruby-on-rails:before{content:"\F0ACF"}.mdi-language-rust:before{content:"\F1617"}.mdi-language-swift:before{content:"\F06E5"}.mdi-language-typescript:before{content:"\F06E6"}.mdi-language-xaml:before{content:"\F0673"}.mdi-laptop:before{content:"\F0322"}.mdi-laptop-chromebook:before{content:"\F0323"}.mdi-laptop-mac:before{content:"\F0324"}.mdi-laptop-off:before{content:"\F06E7"}.mdi-laptop-windows:before{content:"\F0325"}.mdi-laravel:before{content:"\F0AD0"}.mdi-laser-pointer:before{content:"\F1484"}.mdi-lasso:before{content:"\F0F03"}.mdi-lastpass:before{content:"\F0446"}.mdi-latitude:before{content:"\F0F57"}.mdi-launch:before{content:"\F0327"}.mdi-lava-lamp:before{content:"\F07D5"}.mdi-layers:before{content:"\F0328"}.mdi-layers-minus:before{content:"\F0E4C"}.mdi-layers-off:before{content:"\F0329"}.mdi-layers-off-outline:before{content:"\F09FD"}.mdi-layers-outline:before{content:"\F09FE"}.mdi-layers-plus:before{content:"\F0E4D"}.mdi-layers-remove:before{content:"\F0E4E"}.mdi-layers-search:before{content:"\F1206"}.mdi-layers-search-outline:before{content:"\F1207"}.mdi-layers-triple:before{content:"\F0F58"}.mdi-layers-triple-outline:before{content:"\F0F59"}.mdi-lead-pencil:before{content:"\F064F"}.mdi-leaf:before{content:"\F032A"}.mdi-leaf-maple:before{content:"\F0C93"}.mdi-leaf-maple-off:before{content:"\F12DA"}.mdi-leaf-off:before{content:"\F12D9"}.mdi-leak:before{content:"\F0DD7"}.mdi-leak-off:before{content:"\F0DD8"}.mdi-led-off:before{content:"\F032B"}.mdi-led-on:before{content:"\F032C"}.mdi-led-outline:before{content:"\F032D"}.mdi-led-strip:before{content:"\F07D6"}.mdi-led-strip-variant:before{content:"\F1051"}.mdi-led-variant-off:before{content:"\F032E"}.mdi-led-variant-on:before{content:"\F032F"}.mdi-led-variant-outline:before{content:"\F0330"}.mdi-leek:before{content:"\F117D"}.mdi-less-than:before{content:"\F097C"}.mdi-less-than-or-equal:before{content:"\F097D"}.mdi-library:before{content:"\F0331"}.mdi-library-shelves:before{content:"\F0BA9"}.mdi-license:before{content:"\F0FC3"}.mdi-lifebuoy:before{content:"\F087E"}.mdi-light-switch:before{content:"\F097E"}.mdi-lightbulb:before{content:"\F0335"}.mdi-lightbulb-cfl:before{content:"\F1208"}.mdi-lightbulb-cfl-off:before{content:"\F1209"}.mdi-lightbulb-cfl-spiral:before{content:"\F1275"}.mdi-lightbulb-cfl-spiral-off:before{content:"\F12C3"}.mdi-lightbulb-group:before{content:"\F1253"}.mdi-lightbulb-group-off:before{content:"\F12CD"}.mdi-lightbulb-group-off-outline:before{content:"\F12CE"}.mdi-lightbulb-group-outline:before{content:"\F1254"}.mdi-lightbulb-multiple:before{content:"\F1255"}.mdi-lightbulb-multiple-off:before{content:"\F12CF"}.mdi-lightbulb-multiple-off-outline:before{content:"\F12D0"}.mdi-lightbulb-multiple-outline:before{content:"\F1256"}.mdi-lightbulb-off:before{content:"\F0E4F"}.mdi-lightbulb-off-outline:before{content:"\F0E50"}.mdi-lightbulb-on:before{content:"\F06E8"}.mdi-lightbulb-on-outline:before{content:"\F06E9"}.mdi-lightbulb-outline:before{content:"\F0336"}.mdi-lighthouse:before{content:"\F09FF"}.mdi-lighthouse-on:before{content:"\F0A00"}.mdi-lightning-bolt:before{content:"\F140B"}.mdi-lightning-bolt-outline:before{content:"\F140C"}.mdi-lingerie:before{content:"\F1476"}.mdi-link:before{content:"\F0337"}.mdi-link-box:before{content:"\F0D1A"}.mdi-link-box-outline:before{content:"\F0D1B"}.mdi-link-box-variant:before{content:"\F0D1C"}.mdi-link-box-variant-outline:before{content:"\F0D1D"}.mdi-link-lock:before{content:"\F10BA"}.mdi-link-off:before{content:"\F0338"}.mdi-link-plus:before{content:"\F0C94"}.mdi-link-variant:before{content:"\F0339"}.mdi-link-variant-minus:before{content:"\F10FF"}.mdi-link-variant-off:before{content:"\F033A"}.mdi-link-variant-plus:before{content:"\F1100"}.mdi-link-variant-remove:before{content:"\F1101"}.mdi-linkedin:before{content:"\F033B"}.mdi-linux:before{content:"\F033D"}.mdi-linux-mint:before{content:"\F08ED"}.mdi-lipstick:before{content:"\F13B5"}.mdi-list-status:before{content:"\F15AB"}.mdi-litecoin:before{content:"\F0A61"}.mdi-loading:before{content:"\F0772"}.mdi-location-enter:before{content:"\F0FC4"}.mdi-location-exit:before{content:"\F0FC5"}.mdi-lock:before{content:"\F033E"}.mdi-lock-alert:before{content:"\F08EE"}.mdi-lock-alert-outline:before{content:"\F15D1"}.mdi-lock-check:before{content:"\F139A"}.mdi-lock-check-outline:before{content:"\F16A8"}.mdi-lock-clock:before{content:"\F097F"}.mdi-lock-minus:before{content:"\F16A9"}.mdi-lock-minus-outline:before{content:"\F16AA"}.mdi-lock-off:before{content:"\F1671"}.mdi-lock-off-outline:before{content:"\F1672"}.mdi-lock-open:before{content:"\F033F"}.mdi-lock-open-alert:before{content:"\F139B"}.mdi-lock-open-alert-outline:before{content:"\F15D2"}.mdi-lock-open-check:before{content:"\F139C"}.mdi-lock-open-check-outline:before{content:"\F16AB"}.mdi-lock-open-minus:before{content:"\F16AC"}.mdi-lock-open-minus-outline:before{content:"\F16AD"}.mdi-lock-open-outline:before{content:"\F0340"}.mdi-lock-open-plus:before{content:"\F16AE"}.mdi-lock-open-plus-outline:before{content:"\F16AF"}.mdi-lock-open-remove:before{content:"\F16B0"}.mdi-lock-open-remove-outline:before{content:"\F16B1"}.mdi-lock-open-variant:before{content:"\F0FC6"}.mdi-lock-open-variant-outline:before{content:"\F0FC7"}.mdi-lock-outline:before{content:"\F0341"}.mdi-lock-pattern:before{content:"\F06EA"}.mdi-lock-plus:before{content:"\F05FB"}.mdi-lock-plus-outline:before{content:"\F16B2"}.mdi-lock-question:before{content:"\F08EF"}.mdi-lock-remove:before{content:"\F16B3"}.mdi-lock-remove-outline:before{content:"\F16B4"}.mdi-lock-reset:before{content:"\F0773"}.mdi-lock-smart:before{content:"\F08B2"}.mdi-locker:before{content:"\F07D7"}.mdi-locker-multiple:before{content:"\F07D8"}.mdi-login:before{content:"\F0342"}.mdi-login-variant:before{content:"\F05FC"}.mdi-logout:before{content:"\F0343"}.mdi-logout-variant:before{content:"\F05FD"}.mdi-longitude:before{content:"\F0F5A"}.mdi-looks:before{content:"\F0344"}.mdi-lotion:before{content:"\F1582"}.mdi-lotion-outline:before{content:"\F1583"}.mdi-lotion-plus:before{content:"\F1584"}.mdi-lotion-plus-outline:before{content:"\F1585"}.mdi-loupe:before{content:"\F0345"}.mdi-lumx:before{content:"\F0346"}.mdi-lungs:before{content:"\F1084"}.mdi-magnet:before{content:"\F0347"}.mdi-magnet-on:before{content:"\F0348"}.mdi-magnify:before{content:"\F0349"}.mdi-magnify-close:before{content:"\F0980"}.mdi-magnify-minus:before{content:"\F034A"}.mdi-magnify-minus-cursor:before{content:"\F0A62"}.mdi-magnify-minus-outline:before{content:"\F06EC"}.mdi-magnify-plus:before{content:"\F034B"}.mdi-magnify-plus-cursor:before{content:"\F0A63"}.mdi-magnify-plus-outline:before{content:"\F06ED"}.mdi-magnify-remove-cursor:before{content:"\F120C"}.mdi-magnify-remove-outline:before{content:"\F120D"}.mdi-magnify-scan:before{content:"\F1276"}.mdi-mail:before{content:"\F0EBB"}.mdi-mailbox:before{content:"\F06EE"}.mdi-mailbox-open:before{content:"\F0D88"}.mdi-mailbox-open-outline:before{content:"\F0D89"}.mdi-mailbox-open-up:before{content:"\F0D8A"}.mdi-mailbox-open-up-outline:before{content:"\F0D8B"}.mdi-mailbox-outline:before{content:"\F0D8C"}.mdi-mailbox-up:before{content:"\F0D8D"}.mdi-mailbox-up-outline:before{content:"\F0D8E"}.mdi-manjaro:before{content:"\F160A"}.mdi-map:before{content:"\F034D"}.mdi-map-check:before{content:"\F0EBC"}.mdi-map-check-outline:before{content:"\F0EBD"}.mdi-map-clock:before{content:"\F0D1E"}.mdi-map-clock-outline:before{content:"\F0D1F"}.mdi-map-legend:before{content:"\F0A01"}.mdi-map-marker:before{content:"\F034E"}.mdi-map-marker-alert:before{content:"\F0F05"}.mdi-map-marker-alert-outline:before{content:"\F0F06"}.mdi-map-marker-check:before{content:"\F0C95"}.mdi-map-marker-check-outline:before{content:"\F12FB"}.mdi-map-marker-circle:before{content:"\F034F"}.mdi-map-marker-distance:before{content:"\F08F0"}.mdi-map-marker-down:before{content:"\F1102"}.mdi-map-marker-left:before{content:"\F12DB"}.mdi-map-marker-left-outline:before{content:"\F12DD"}.mdi-map-marker-minus:before{content:"\F0650"}.mdi-map-marker-minus-outline:before{content:"\F12F9"}.mdi-map-marker-multiple:before{content:"\F0350"}.mdi-map-marker-multiple-outline:before{content:"\F1277"}.mdi-map-marker-off:before{content:"\F0351"}.mdi-map-marker-off-outline:before{content:"\F12FD"}.mdi-map-marker-outline:before{content:"\F07D9"}.mdi-map-marker-path:before{content:"\F0D20"}.mdi-map-marker-plus:before{content:"\F0651"}.mdi-map-marker-plus-outline:before{content:"\F12F8"}.mdi-map-marker-question:before{content:"\F0F07"}.mdi-map-marker-question-outline:before{content:"\F0F08"}.mdi-map-marker-radius:before{content:"\F0352"}.mdi-map-marker-radius-outline:before{content:"\F12FC"}.mdi-map-marker-remove:before{content:"\F0F09"}.mdi-map-marker-remove-outline:before{content:"\F12FA"}.mdi-map-marker-remove-variant:before{content:"\F0F0A"}.mdi-map-marker-right:before{content:"\F12DC"}.mdi-map-marker-right-outline:before{content:"\F12DE"}.mdi-map-marker-star:before{content:"\F1608"}.mdi-map-marker-star-outline:before{content:"\F1609"}.mdi-map-marker-up:before{content:"\F1103"}.mdi-map-minus:before{content:"\F0981"}.mdi-map-outline:before{content:"\F0982"}.mdi-map-plus:before{content:"\F0983"}.mdi-map-search:before{content:"\F0984"}.mdi-map-search-outline:before{content:"\F0985"}.mdi-mapbox:before{content:"\F0BAA"}.mdi-margin:before{content:"\F0353"}.mdi-marker:before{content:"\F0652"}.mdi-marker-cancel:before{content:"\F0DD9"}.mdi-marker-check:before{content:"\F0355"}.mdi-mastodon:before{content:"\F0AD1"}.mdi-material-design:before{content:"\F0986"}.mdi-material-ui:before{content:"\F0357"}.mdi-math-compass:before{content:"\F0358"}.mdi-math-cos:before{content:"\F0C96"}.mdi-math-integral:before{content:"\F0FC8"}.mdi-math-integral-box:before{content:"\F0FC9"}.mdi-math-log:before{content:"\F1085"}.mdi-math-norm:before{content:"\F0FCA"}.mdi-math-norm-box:before{content:"\F0FCB"}.mdi-math-sin:before{content:"\F0C97"}.mdi-math-tan:before{content:"\F0C98"}.mdi-matrix:before{content:"\F0628"}.mdi-medal:before{content:"\F0987"}.mdi-medal-outline:before{content:"\F1326"}.mdi-medical-bag:before{content:"\F06EF"}.mdi-meditation:before{content:"\F117B"}.mdi-memory:before{content:"\F035B"}.mdi-menu:before{content:"\F035C"}.mdi-menu-down:before{content:"\F035D"}.mdi-menu-down-outline:before{content:"\F06B6"}.mdi-menu-left:before{content:"\F035E"}.mdi-menu-left-outline:before{content:"\F0A02"}.mdi-menu-open:before{content:"\F0BAB"}.mdi-menu-right:before{content:"\F035F"}.mdi-menu-right-outline:before{content:"\F0A03"}.mdi-menu-swap:before{content:"\F0A64"}.mdi-menu-swap-outline:before{content:"\F0A65"}.mdi-menu-up:before{content:"\F0360"}.mdi-menu-up-outline:before{content:"\F06B7"}.mdi-merge:before{content:"\F0F5C"}.mdi-message:before{content:"\F0361"}.mdi-message-alert:before{content:"\F0362"}.mdi-message-alert-outline:before{content:"\F0A04"}.mdi-message-arrow-left:before{content:"\F12F2"}.mdi-message-arrow-left-outline:before{content:"\F12F3"}.mdi-message-arrow-right:before{content:"\F12F4"}.mdi-message-arrow-right-outline:before{content:"\F12F5"}.mdi-message-bookmark:before{content:"\F15AC"}.mdi-message-bookmark-outline:before{content:"\F15AD"}.mdi-message-bulleted:before{content:"\F06A2"}.mdi-message-bulleted-off:before{content:"\F06A3"}.mdi-message-cog:before{content:"\F06F1"}.mdi-message-cog-outline:before{content:"\F1172"}.mdi-message-draw:before{content:"\F0363"}.mdi-message-flash:before{content:"\F15A9"}.mdi-message-flash-outline:before{content:"\F15AA"}.mdi-message-image:before{content:"\F0364"}.mdi-message-image-outline:before{content:"\F116C"}.mdi-message-lock:before{content:"\F0FCC"}.mdi-message-lock-outline:before{content:"\F116D"}.mdi-message-minus:before{content:"\F116E"}.mdi-message-minus-outline:before{content:"\F116F"}.mdi-message-off:before{content:"\F164D"}.mdi-message-off-outline:before{content:"\F164E"}.mdi-message-outline:before{content:"\F0365"}.mdi-message-plus:before{content:"\F0653"}.mdi-message-plus-outline:before{content:"\F10BB"}.mdi-message-processing:before{content:"\F0366"}.mdi-message-processing-outline:before{content:"\F1170"}.mdi-message-question:before{content:"\F173A"}.mdi-message-question-outline:before{content:"\F173B"}.mdi-message-reply:before{content:"\F0367"}.mdi-message-reply-outline:before{content:"\F173D"}.mdi-message-reply-text:before{content:"\F0368"}.mdi-message-reply-text-outline:before{content:"\F173E"}.mdi-message-settings:before{content:"\F06F0"}.mdi-message-settings-outline:before{content:"\F1171"}.mdi-message-text:before{content:"\F0369"}.mdi-message-text-clock:before{content:"\F1173"}.mdi-message-text-clock-outline:before{content:"\F1174"}.mdi-message-text-lock:before{content:"\F0FCD"}.mdi-message-text-lock-outline:before{content:"\F1175"}.mdi-message-text-outline:before{content:"\F036A"}.mdi-message-video:before{content:"\F036B"}.mdi-meteor:before{content:"\F0629"}.mdi-metronome:before{content:"\F07DA"}.mdi-metronome-tick:before{content:"\F07DB"}.mdi-micro-sd:before{content:"\F07DC"}.mdi-microphone:before{content:"\F036C"}.mdi-microphone-minus:before{content:"\F08B3"}.mdi-microphone-off:before{content:"\F036D"}.mdi-microphone-outline:before{content:"\F036E"}.mdi-microphone-plus:before{content:"\F08B4"}.mdi-microphone-settings:before{content:"\F036F"}.mdi-microphone-variant:before{content:"\F0370"}.mdi-microphone-variant-off:before{content:"\F0371"}.mdi-microscope:before{content:"\F0654"}.mdi-microsoft:before{content:"\F0372"}.mdi-microsoft-access:before{content:"\F138E"}.mdi-microsoft-azure:before{content:"\F0805"}.mdi-microsoft-azure-devops:before{content:"\F0FD5"}.mdi-microsoft-bing:before{content:"\F00A4"}.mdi-microsoft-dynamics-365:before{content:"\F0988"}.mdi-microsoft-edge:before{content:"\F01E9"}.mdi-microsoft-edge-legacy:before{content:"\F1250"}.mdi-microsoft-excel:before{content:"\F138F"}.mdi-microsoft-internet-explorer:before{content:"\F0300"}.mdi-microsoft-office:before{content:"\F03C6"}.mdi-microsoft-onedrive:before{content:"\F03CA"}.mdi-microsoft-onenote:before{content:"\F0747"}.mdi-microsoft-outlook:before{content:"\F0D22"}.mdi-microsoft-powerpoint:before{content:"\F1390"}.mdi-microsoft-sharepoint:before{content:"\F1391"}.mdi-microsoft-teams:before{content:"\F02BB"}.mdi-microsoft-visual-studio:before{content:"\F0610"}.mdi-microsoft-visual-studio-code:before{content:"\F0A1E"}.mdi-microsoft-windows:before{content:"\F05B3"}.mdi-microsoft-windows-classic:before{content:"\F0A21"}.mdi-microsoft-word:before{content:"\F1392"}.mdi-microsoft-xbox:before{content:"\F05B9"}.mdi-microsoft-xbox-controller:before{content:"\F05BA"}.mdi-microsoft-xbox-controller-battery-alert:before{content:"\F074B"}.mdi-microsoft-xbox-controller-battery-charging:before{content:"\F0A22"}.mdi-microsoft-xbox-controller-battery-empty:before{content:"\F074C"}.mdi-microsoft-xbox-controller-battery-full:before{content:"\F074D"}.mdi-microsoft-xbox-controller-battery-low:before{content:"\F074E"}.mdi-microsoft-xbox-controller-battery-medium:before{content:"\F074F"}.mdi-microsoft-xbox-controller-battery-unknown:before{content:"\F0750"}.mdi-microsoft-xbox-controller-menu:before{content:"\F0E6F"}.mdi-microsoft-xbox-controller-off:before{content:"\F05BB"}.mdi-microsoft-xbox-controller-view:before{content:"\F0E70"}.mdi-microsoft-yammer:before{content:"\F0789"}.mdi-microwave:before{content:"\F0C99"}.mdi-microwave-off:before{content:"\F1423"}.mdi-middleware:before{content:"\F0F5D"}.mdi-middleware-outline:before{content:"\F0F5E"}.mdi-midi:before{content:"\F08F1"}.mdi-midi-port:before{content:"\F08F2"}.mdi-mine:before{content:"\F0DDA"}.mdi-minecraft:before{content:"\F0373"}.mdi-mini-sd:before{content:"\F0A05"}.mdi-minidisc:before{content:"\F0A06"}.mdi-minus:before{content:"\F0374"}.mdi-minus-box:before{content:"\F0375"}.mdi-minus-box-multiple:before{content:"\F1141"}.mdi-minus-box-multiple-outline:before{content:"\F1142"}.mdi-minus-box-outline:before{content:"\F06F2"}.mdi-minus-circle:before{content:"\F0376"}.mdi-minus-circle-multiple:before{content:"\F035A"}.mdi-minus-circle-multiple-outline:before{content:"\F0AD3"}.mdi-minus-circle-off:before{content:"\F1459"}.mdi-minus-circle-off-outline:before{content:"\F145A"}.mdi-minus-circle-outline:before{content:"\F0377"}.mdi-minus-network:before{content:"\F0378"}.mdi-minus-network-outline:before{content:"\F0C9A"}.mdi-minus-thick:before{content:"\F1639"}.mdi-mirror:before{content:"\F11FD"}.mdi-mixed-martial-arts:before{content:"\F0D8F"}.mdi-mixed-reality:before{content:"\F087F"}.mdi-molecule:before{content:"\F0BAC"}.mdi-molecule-co:before{content:"\F12FE"}.mdi-molecule-co2:before{content:"\F07E4"}.mdi-monitor:before{content:"\F0379"}.mdi-monitor-cellphone:before{content:"\F0989"}.mdi-monitor-cellphone-star:before{content:"\F098A"}.mdi-monitor-clean:before{content:"\F1104"}.mdi-monitor-dashboard:before{content:"\F0A07"}.mdi-monitor-edit:before{content:"\F12C6"}.mdi-monitor-eye:before{content:"\F13B4"}.mdi-monitor-lock:before{content:"\F0DDB"}.mdi-monitor-multiple:before{content:"\F037A"}.mdi-monitor-off:before{content:"\F0D90"}.mdi-monitor-screenshot:before{content:"\F0E51"}.mdi-monitor-share:before{content:"\F1483"}.mdi-monitor-speaker:before{content:"\F0F5F"}.mdi-monitor-speaker-off:before{content:"\F0F60"}.mdi-monitor-star:before{content:"\F0DDC"}.mdi-moon-first-quarter:before{content:"\F0F61"}.mdi-moon-full:before{content:"\F0F62"}.mdi-moon-last-quarter:before{content:"\F0F63"}.mdi-moon-new:before{content:"\F0F64"}.mdi-moon-waning-crescent:before{content:"\F0F65"}.mdi-moon-waning-gibbous:before{content:"\F0F66"}.mdi-moon-waxing-crescent:before{content:"\F0F67"}.mdi-moon-waxing-gibbous:before{content:"\F0F68"}.mdi-moped:before{content:"\F1086"}.mdi-moped-electric:before{content:"\F15B7"}.mdi-moped-electric-outline:before{content:"\F15B8"}.mdi-moped-outline:before{content:"\F15B9"}.mdi-more:before{content:"\F037B"}.mdi-mother-heart:before{content:"\F1314"}.mdi-mother-nurse:before{content:"\F0D21"}.mdi-motion:before{content:"\F15B2"}.mdi-motion-outline:before{content:"\F15B3"}.mdi-motion-pause:before{content:"\F1590"}.mdi-motion-pause-outline:before{content:"\F1592"}.mdi-motion-play:before{content:"\F158F"}.mdi-motion-play-outline:before{content:"\F1591"}.mdi-motion-sensor:before{content:"\F0D91"}.mdi-motion-sensor-off:before{content:"\F1435"}.mdi-motorbike:before{content:"\F037C"}.mdi-motorbike-electric:before{content:"\F15BA"}.mdi-mouse:before{content:"\F037D"}.mdi-mouse-bluetooth:before{content:"\F098B"}.mdi-mouse-move-down:before{content:"\F1550"}.mdi-mouse-move-up:before{content:"\F1551"}.mdi-mouse-move-vertical:before{content:"\F1552"}.mdi-mouse-off:before{content:"\F037E"}.mdi-mouse-variant:before{content:"\F037F"}.mdi-mouse-variant-off:before{content:"\F0380"}.mdi-move-resize:before{content:"\F0655"}.mdi-move-resize-variant:before{content:"\F0656"}.mdi-movie:before{content:"\F0381"}.mdi-movie-check:before{content:"\F16F3"}.mdi-movie-check-outline:before{content:"\F16F4"}.mdi-movie-cog:before{content:"\F16F5"}.mdi-movie-cog-outline:before{content:"\F16F6"}.mdi-movie-edit:before{content:"\F1122"}.mdi-movie-edit-outline:before{content:"\F1123"}.mdi-movie-filter:before{content:"\F1124"}.mdi-movie-filter-outline:before{content:"\F1125"}.mdi-movie-minus:before{content:"\F16F7"}.mdi-movie-minus-outline:before{content:"\F16F8"}.mdi-movie-off:before{content:"\F16F9"}.mdi-movie-off-outline:before{content:"\F16FA"}.mdi-movie-open:before{content:"\F0FCE"}.mdi-movie-open-check:before{content:"\F16FB"}.mdi-movie-open-check-outline:before{content:"\F16FC"}.mdi-movie-open-cog:before{content:"\F16FD"}.mdi-movie-open-cog-outline:before{content:"\F16FE"}.mdi-movie-open-edit:before{content:"\F16FF"}.mdi-movie-open-edit-outline:before{content:"\F1700"}.mdi-movie-open-minus:before{content:"\F1701"}.mdi-movie-open-minus-outline:before{content:"\F1702"}.mdi-movie-open-off:before{content:"\F1703"}.mdi-movie-open-off-outline:before{content:"\F1704"}.mdi-movie-open-outline:before{content:"\F0FCF"}.mdi-movie-open-play:before{content:"\F1705"}.mdi-movie-open-play-outline:before{content:"\F1706"}.mdi-movie-open-plus:before{content:"\F1707"}.mdi-movie-open-plus-outline:before{content:"\F1708"}.mdi-movie-open-remove:before{content:"\F1709"}.mdi-movie-open-remove-outline:before{content:"\F170A"}.mdi-movie-open-settings:before{content:"\F170B"}.mdi-movie-open-settings-outline:before{content:"\F170C"}.mdi-movie-open-star:before{content:"\F170D"}.mdi-movie-open-star-outline:before{content:"\F170E"}.mdi-movie-outline:before{content:"\F0DDD"}.mdi-movie-play:before{content:"\F170F"}.mdi-movie-play-outline:before{content:"\F1710"}.mdi-movie-plus:before{content:"\F1711"}.mdi-movie-plus-outline:before{content:"\F1712"}.mdi-movie-remove:before{content:"\F1713"}.mdi-movie-remove-outline:before{content:"\F1714"}.mdi-movie-roll:before{content:"\F07DE"}.mdi-movie-search:before{content:"\F11D2"}.mdi-movie-search-outline:before{content:"\F11D3"}.mdi-movie-settings:before{content:"\F1715"}.mdi-movie-settings-outline:before{content:"\F1716"}.mdi-movie-star:before{content:"\F1717"}.mdi-movie-star-outline:before{content:"\F1718"}.mdi-mower:before{content:"\F166F"}.mdi-mower-bag:before{content:"\F1670"}.mdi-muffin:before{content:"\F098C"}.mdi-multiplication:before{content:"\F0382"}.mdi-multiplication-box:before{content:"\F0383"}.mdi-mushroom:before{content:"\F07DF"}.mdi-mushroom-off:before{content:"\F13FA"}.mdi-mushroom-off-outline:before{content:"\F13FB"}.mdi-mushroom-outline:before{content:"\F07E0"}.mdi-music:before{content:"\F075A"}.mdi-music-accidental-double-flat:before{content:"\F0F69"}.mdi-music-accidental-double-sharp:before{content:"\F0F6A"}.mdi-music-accidental-flat:before{content:"\F0F6B"}.mdi-music-accidental-natural:before{content:"\F0F6C"}.mdi-music-accidental-sharp:before{content:"\F0F6D"}.mdi-music-box:before{content:"\F0384"}.mdi-music-box-multiple:before{content:"\F0333"}.mdi-music-box-multiple-outline:before{content:"\F0F04"}.mdi-music-box-outline:before{content:"\F0385"}.mdi-music-circle:before{content:"\F0386"}.mdi-music-circle-outline:before{content:"\F0AD4"}.mdi-music-clef-alto:before{content:"\F0F6E"}.mdi-music-clef-bass:before{content:"\F0F6F"}.mdi-music-clef-treble:before{content:"\F0F70"}.mdi-music-note:before{content:"\F0387"}.mdi-music-note-bluetooth:before{content:"\F05FE"}.mdi-music-note-bluetooth-off:before{content:"\F05FF"}.mdi-music-note-eighth:before{content:"\F0388"}.mdi-music-note-eighth-dotted:before{content:"\F0F71"}.mdi-music-note-half:before{content:"\F0389"}.mdi-music-note-half-dotted:before{content:"\F0F72"}.mdi-music-note-off:before{content:"\F038A"}.mdi-music-note-off-outline:before{content:"\F0F73"}.mdi-music-note-outline:before{content:"\F0F74"}.mdi-music-note-plus:before{content:"\F0DDE"}.mdi-music-note-quarter:before{content:"\F038B"}.mdi-music-note-quarter-dotted:before{content:"\F0F75"}.mdi-music-note-sixteenth:before{content:"\F038C"}.mdi-music-note-sixteenth-dotted:before{content:"\F0F76"}.mdi-music-note-whole:before{content:"\F038D"}.mdi-music-note-whole-dotted:before{content:"\F0F77"}.mdi-music-off:before{content:"\F075B"}.mdi-music-rest-eighth:before{content:"\F0F78"}.mdi-music-rest-half:before{content:"\F0F79"}.mdi-music-rest-quarter:before{content:"\F0F7A"}.mdi-music-rest-sixteenth:before{content:"\F0F7B"}.mdi-music-rest-whole:before{content:"\F0F7C"}.mdi-mustache:before{content:"\F15DE"}.mdi-nail:before{content:"\F0DDF"}.mdi-nas:before{content:"\F08F3"}.mdi-nativescript:before{content:"\F0880"}.mdi-nature:before{content:"\F038E"}.mdi-nature-people:before{content:"\F038F"}.mdi-navigation:before{content:"\F0390"}.mdi-navigation-outline:before{content:"\F1607"}.mdi-near-me:before{content:"\F05CD"}.mdi-necklace:before{content:"\F0F0B"}.mdi-needle:before{content:"\F0391"}.mdi-netflix:before{content:"\F0746"}.mdi-network:before{content:"\F06F3"}.mdi-network-off:before{content:"\F0C9B"}.mdi-network-off-outline:before{content:"\F0C9C"}.mdi-network-outline:before{content:"\F0C9D"}.mdi-network-strength-1:before{content:"\F08F4"}.mdi-network-strength-1-alert:before{content:"\F08F5"}.mdi-network-strength-2:before{content:"\F08F6"}.mdi-network-strength-2-alert:before{content:"\F08F7"}.mdi-network-strength-3:before{content:"\F08F8"}.mdi-network-strength-3-alert:before{content:"\F08F9"}.mdi-network-strength-4:before{content:"\F08FA"}.mdi-network-strength-4-alert:before{content:"\F08FB"}.mdi-network-strength-off:before{content:"\F08FC"}.mdi-network-strength-off-outline:before{content:"\F08FD"}.mdi-network-strength-outline:before{content:"\F08FE"}.mdi-new-box:before{content:"\F0394"}.mdi-newspaper:before{content:"\F0395"}.mdi-newspaper-minus:before{content:"\F0F0C"}.mdi-newspaper-plus:before{content:"\F0F0D"}.mdi-newspaper-variant:before{content:"\F1001"}.mdi-newspaper-variant-multiple:before{content:"\F1002"}.mdi-newspaper-variant-multiple-outline:before{content:"\F1003"}.mdi-newspaper-variant-outline:before{content:"\F1004"}.mdi-nfc:before{content:"\F0396"}.mdi-nfc-search-variant:before{content:"\F0E53"}.mdi-nfc-tap:before{content:"\F0397"}.mdi-nfc-variant:before{content:"\F0398"}.mdi-nfc-variant-off:before{content:"\F0E54"}.mdi-ninja:before{content:"\F0774"}.mdi-nintendo-game-boy:before{content:"\F1393"}.mdi-nintendo-switch:before{content:"\F07E1"}.mdi-nintendo-wii:before{content:"\F05AB"}.mdi-nintendo-wiiu:before{content:"\F072D"}.mdi-nix:before{content:"\F1105"}.mdi-nodejs:before{content:"\F0399"}.mdi-noodles:before{content:"\F117E"}.mdi-not-equal:before{content:"\F098D"}.mdi-not-equal-variant:before{content:"\F098E"}.mdi-note:before{content:"\F039A"}.mdi-note-minus:before{content:"\F164F"}.mdi-note-minus-outline:before{content:"\F1650"}.mdi-note-multiple:before{content:"\F06B8"}.mdi-note-multiple-outline:before{content:"\F06B9"}.mdi-note-outline:before{content:"\F039B"}.mdi-note-plus:before{content:"\F039C"}.mdi-note-plus-outline:before{content:"\F039D"}.mdi-note-remove:before{content:"\F1651"}.mdi-note-remove-outline:before{content:"\F1652"}.mdi-note-search:before{content:"\F1653"}.mdi-note-search-outline:before{content:"\F1654"}.mdi-note-text:before{content:"\F039E"}.mdi-note-text-outline:before{content:"\F11D7"}.mdi-notebook:before{content:"\F082E"}.mdi-notebook-check:before{content:"\F14F5"}.mdi-notebook-check-outline:before{content:"\F14F6"}.mdi-notebook-edit:before{content:"\F14E7"}.mdi-notebook-edit-outline:before{content:"\F14E9"}.mdi-notebook-minus:before{content:"\F1610"}.mdi-notebook-minus-outline:before{content:"\F1611"}.mdi-notebook-multiple:before{content:"\F0E55"}.mdi-notebook-outline:before{content:"\F0EBF"}.mdi-notebook-plus:before{content:"\F1612"}.mdi-notebook-plus-outline:before{content:"\F1613"}.mdi-notebook-remove:before{content:"\F1614"}.mdi-notebook-remove-outline:before{content:"\F1615"}.mdi-notification-clear-all:before{content:"\F039F"}.mdi-npm:before{content:"\F06F7"}.mdi-nuke:before{content:"\F06A4"}.mdi-null:before{content:"\F07E2"}.mdi-numeric:before{content:"\F03A0"}.mdi-numeric-0:before{content:"\F0B39"}.mdi-numeric-0-box:before{content:"\F03A1"}.mdi-numeric-0-box-multiple:before{content:"\F0F0E"}.mdi-numeric-0-box-multiple-outline:before{content:"\F03A2"}.mdi-numeric-0-box-outline:before{content:"\F03A3"}.mdi-numeric-0-circle:before{content:"\F0C9E"}.mdi-numeric-0-circle-outline:before{content:"\F0C9F"}.mdi-numeric-1:before{content:"\F0B3A"}.mdi-numeric-1-box:before{content:"\F03A4"}.mdi-numeric-1-box-multiple:before{content:"\F0F0F"}.mdi-numeric-1-box-multiple-outline:before{content:"\F03A5"}.mdi-numeric-1-box-outline:before{content:"\F03A6"}.mdi-numeric-1-circle:before{content:"\F0CA0"}.mdi-numeric-1-circle-outline:before{content:"\F0CA1"}.mdi-numeric-10:before{content:"\F0FE9"}.mdi-numeric-10-box:before{content:"\F0F7D"}.mdi-numeric-10-box-multiple:before{content:"\F0FEA"}.mdi-numeric-10-box-multiple-outline:before{content:"\F0FEB"}.mdi-numeric-10-box-outline:before{content:"\F0F7E"}.mdi-numeric-10-circle:before{content:"\F0FEC"}.mdi-numeric-10-circle-outline:before{content:"\F0FED"}.mdi-numeric-2:before{content:"\F0B3B"}.mdi-numeric-2-box:before{content:"\F03A7"}.mdi-numeric-2-box-multiple:before{content:"\F0F10"}.mdi-numeric-2-box-multiple-outline:before{content:"\F03A8"}.mdi-numeric-2-box-outline:before{content:"\F03A9"}.mdi-numeric-2-circle:before{content:"\F0CA2"}.mdi-numeric-2-circle-outline:before{content:"\F0CA3"}.mdi-numeric-3:before{content:"\F0B3C"}.mdi-numeric-3-box:before{content:"\F03AA"}.mdi-numeric-3-box-multiple:before{content:"\F0F11"}.mdi-numeric-3-box-multiple-outline:before{content:"\F03AB"}.mdi-numeric-3-box-outline:before{content:"\F03AC"}.mdi-numeric-3-circle:before{content:"\F0CA4"}.mdi-numeric-3-circle-outline:before{content:"\F0CA5"}.mdi-numeric-4:before{content:"\F0B3D"}.mdi-numeric-4-box:before{content:"\F03AD"}.mdi-numeric-4-box-multiple:before{content:"\F0F12"}.mdi-numeric-4-box-multiple-outline:before{content:"\F03B2"}.mdi-numeric-4-box-outline:before{content:"\F03AE"}.mdi-numeric-4-circle:before{content:"\F0CA6"}.mdi-numeric-4-circle-outline:before{content:"\F0CA7"}.mdi-numeric-5:before{content:"\F0B3E"}.mdi-numeric-5-box:before{content:"\F03B1"}.mdi-numeric-5-box-multiple:before{content:"\F0F13"}.mdi-numeric-5-box-multiple-outline:before{content:"\F03AF"}.mdi-numeric-5-box-outline:before{content:"\F03B0"}.mdi-numeric-5-circle:before{content:"\F0CA8"}.mdi-numeric-5-circle-outline:before{content:"\F0CA9"}.mdi-numeric-6:before{content:"\F0B3F"}.mdi-numeric-6-box:before{content:"\F03B3"}.mdi-numeric-6-box-multiple:before{content:"\F0F14"}.mdi-numeric-6-box-multiple-outline:before{content:"\F03B4"}.mdi-numeric-6-box-outline:before{content:"\F03B5"}.mdi-numeric-6-circle:before{content:"\F0CAA"}.mdi-numeric-6-circle-outline:before{content:"\F0CAB"}.mdi-numeric-7:before{content:"\F0B40"}.mdi-numeric-7-box:before{content:"\F03B6"}.mdi-numeric-7-box-multiple:before{content:"\F0F15"}.mdi-numeric-7-box-multiple-outline:before{content:"\F03B7"}.mdi-numeric-7-box-outline:before{content:"\F03B8"}.mdi-numeric-7-circle:before{content:"\F0CAC"}.mdi-numeric-7-circle-outline:before{content:"\F0CAD"}.mdi-numeric-8:before{content:"\F0B41"}.mdi-numeric-8-box:before{content:"\F03B9"}.mdi-numeric-8-box-multiple:before{content:"\F0F16"}.mdi-numeric-8-box-multiple-outline:before{content:"\F03BA"}.mdi-numeric-8-box-outline:before{content:"\F03BB"}.mdi-numeric-8-circle:before{content:"\F0CAE"}.mdi-numeric-8-circle-outline:before{content:"\F0CAF"}.mdi-numeric-9:before{content:"\F0B42"}.mdi-numeric-9-box:before{content:"\F03BC"}.mdi-numeric-9-box-multiple:before{content:"\F0F17"}.mdi-numeric-9-box-multiple-outline:before{content:"\F03BD"}.mdi-numeric-9-box-outline:before{content:"\F03BE"}.mdi-numeric-9-circle:before{content:"\F0CB0"}.mdi-numeric-9-circle-outline:before{content:"\F0CB1"}.mdi-numeric-9-plus:before{content:"\F0FEE"}.mdi-numeric-9-plus-box:before{content:"\F03BF"}.mdi-numeric-9-plus-box-multiple:before{content:"\F0F18"}.mdi-numeric-9-plus-box-multiple-outline:before{content:"\F03C0"}.mdi-numeric-9-plus-box-outline:before{content:"\F03C1"}.mdi-numeric-9-plus-circle:before{content:"\F0CB2"}.mdi-numeric-9-plus-circle-outline:before{content:"\F0CB3"}.mdi-numeric-negative-1:before{content:"\F1052"}.mdi-numeric-positive-1:before{content:"\F15CB"}.mdi-nut:before{content:"\F06F8"}.mdi-nutrition:before{content:"\F03C2"}.mdi-nuxt:before{content:"\F1106"}.mdi-oar:before{content:"\F067C"}.mdi-ocarina:before{content:"\F0DE0"}.mdi-oci:before{content:"\F12E9"}.mdi-ocr:before{content:"\F113A"}.mdi-octagon:before{content:"\F03C3"}.mdi-octagon-outline:before{content:"\F03C4"}.mdi-octagram:before{content:"\F06F9"}.mdi-octagram-outline:before{content:"\F0775"}.mdi-odnoklassniki:before{content:"\F03C5"}.mdi-offer:before{content:"\F121B"}.mdi-office-building:before{content:"\F0991"}.mdi-office-building-marker:before{content:"\F1520"}.mdi-office-building-marker-outline:before{content:"\F1521"}.mdi-office-building-outline:before{content:"\F151F"}.mdi-oil:before{content:"\F03C7"}.mdi-oil-lamp:before{content:"\F0F19"}.mdi-oil-level:before{content:"\F1053"}.mdi-oil-temperature:before{content:"\F0FF8"}.mdi-omega:before{content:"\F03C9"}.mdi-one-up:before{content:"\F0BAD"}.mdi-onepassword:before{content:"\F0881"}.mdi-opacity:before{content:"\F05CC"}.mdi-open-in-app:before{content:"\F03CB"}.mdi-open-in-new:before{content:"\F03CC"}.mdi-open-source-initiative:before{content:"\F0BAE"}.mdi-openid:before{content:"\F03CD"}.mdi-opera:before{content:"\F03CE"}.mdi-orbit:before{content:"\F0018"}.mdi-orbit-variant:before{content:"\F15DB"}.mdi-order-alphabetical-ascending:before{content:"\F020D"}.mdi-order-alphabetical-descending:before{content:"\F0D07"}.mdi-order-bool-ascending:before{content:"\F02BE"}.mdi-order-bool-ascending-variant:before{content:"\F098F"}.mdi-order-bool-descending:before{content:"\F1384"}.mdi-order-bool-descending-variant:before{content:"\F0990"}.mdi-order-numeric-ascending:before{content:"\F0545"}.mdi-order-numeric-descending:before{content:"\F0546"}.mdi-origin:before{content:"\F0B43"}.mdi-ornament:before{content:"\F03CF"}.mdi-ornament-variant:before{content:"\F03D0"}.mdi-outdoor-lamp:before{content:"\F1054"}.mdi-overscan:before{content:"\F1005"}.mdi-owl:before{content:"\F03D2"}.mdi-pac-man:before{content:"\F0BAF"}.mdi-package:before{content:"\F03D3"}.mdi-package-down:before{content:"\F03D4"}.mdi-package-up:before{content:"\F03D5"}.mdi-package-variant:before{content:"\F03D6"}.mdi-package-variant-closed:before{content:"\F03D7"}.mdi-page-first:before{content:"\F0600"}.mdi-page-last:before{content:"\F0601"}.mdi-page-layout-body:before{content:"\F06FA"}.mdi-page-layout-footer:before{content:"\F06FB"}.mdi-page-layout-header:before{content:"\F06FC"}.mdi-page-layout-header-footer:before{content:"\F0F7F"}.mdi-page-layout-sidebar-left:before{content:"\F06FD"}.mdi-page-layout-sidebar-right:before{content:"\F06FE"}.mdi-page-next:before{content:"\F0BB0"}.mdi-page-next-outline:before{content:"\F0BB1"}.mdi-page-previous:before{content:"\F0BB2"}.mdi-page-previous-outline:before{content:"\F0BB3"}.mdi-pail:before{content:"\F1417"}.mdi-pail-minus:before{content:"\F1437"}.mdi-pail-minus-outline:before{content:"\F143C"}.mdi-pail-off:before{content:"\F1439"}.mdi-pail-off-outline:before{content:"\F143E"}.mdi-pail-outline:before{content:"\F143A"}.mdi-pail-plus:before{content:"\F1436"}.mdi-pail-plus-outline:before{content:"\F143B"}.mdi-pail-remove:before{content:"\F1438"}.mdi-pail-remove-outline:before{content:"\F143D"}.mdi-palette:before{content:"\F03D8"}.mdi-palette-advanced:before{content:"\F03D9"}.mdi-palette-outline:before{content:"\F0E0C"}.mdi-palette-swatch:before{content:"\F08B5"}.mdi-palette-swatch-outline:before{content:"\F135C"}.mdi-palm-tree:before{content:"\F1055"}.mdi-pan:before{content:"\F0BB4"}.mdi-pan-bottom-left:before{content:"\F0BB5"}.mdi-pan-bottom-right:before{content:"\F0BB6"}.mdi-pan-down:before{content:"\F0BB7"}.mdi-pan-horizontal:before{content:"\F0BB8"}.mdi-pan-left:before{content:"\F0BB9"}.mdi-pan-right:before{content:"\F0BBA"}.mdi-pan-top-left:before{content:"\F0BBB"}.mdi-pan-top-right:before{content:"\F0BBC"}.mdi-pan-up:before{content:"\F0BBD"}.mdi-pan-vertical:before{content:"\F0BBE"}.mdi-panda:before{content:"\F03DA"}.mdi-pandora:before{content:"\F03DB"}.mdi-panorama:before{content:"\F03DC"}.mdi-panorama-fisheye:before{content:"\F03DD"}.mdi-panorama-horizontal:before{content:"\F03DE"}.mdi-panorama-vertical:before{content:"\F03DF"}.mdi-panorama-wide-angle:before{content:"\F03E0"}.mdi-paper-cut-vertical:before{content:"\F03E1"}.mdi-paper-roll:before{content:"\F1157"}.mdi-paper-roll-outline:before{content:"\F1158"}.mdi-paperclip:before{content:"\F03E2"}.mdi-parachute:before{content:"\F0CB4"}.mdi-parachute-outline:before{content:"\F0CB5"}.mdi-parking:before{content:"\F03E3"}.mdi-party-popper:before{content:"\F1056"}.mdi-passport:before{content:"\F07E3"}.mdi-passport-biometric:before{content:"\F0DE1"}.mdi-pasta:before{content:"\F1160"}.mdi-patio-heater:before{content:"\F0F80"}.mdi-patreon:before{content:"\F0882"}.mdi-pause:before{content:"\F03E4"}.mdi-pause-circle:before{content:"\F03E5"}.mdi-pause-circle-outline:before{content:"\F03E6"}.mdi-pause-octagon:before{content:"\F03E7"}.mdi-pause-octagon-outline:before{content:"\F03E8"}.mdi-paw:before{content:"\F03E9"}.mdi-paw-off:before{content:"\F0657"}.mdi-paw-off-outline:before{content:"\F1676"}.mdi-paw-outline:before{content:"\F1675"}.mdi-pdf-box:before{content:"\F0E56"}.mdi-peace:before{content:"\F0884"}.mdi-peanut:before{content:"\F0FFC"}.mdi-peanut-off:before{content:"\F0FFD"}.mdi-peanut-off-outline:before{content:"\F0FFF"}.mdi-peanut-outline:before{content:"\F0FFE"}.mdi-pen:before{content:"\F03EA"}.mdi-pen-lock:before{content:"\F0DE2"}.mdi-pen-minus:before{content:"\F0DE3"}.mdi-pen-off:before{content:"\F0DE4"}.mdi-pen-plus:before{content:"\F0DE5"}.mdi-pen-remove:before{content:"\F0DE6"}.mdi-pencil:before{content:"\F03EB"}.mdi-pencil-box:before{content:"\F03EC"}.mdi-pencil-box-multiple:before{content:"\F1144"}.mdi-pencil-box-multiple-outline:before{content:"\F1145"}.mdi-pencil-box-outline:before{content:"\F03ED"}.mdi-pencil-circle:before{content:"\F06FF"}.mdi-pencil-circle-outline:before{content:"\F0776"}.mdi-pencil-lock:before{content:"\F03EE"}.mdi-pencil-lock-outline:before{content:"\F0DE7"}.mdi-pencil-minus:before{content:"\F0DE8"}.mdi-pencil-minus-outline:before{content:"\F0DE9"}.mdi-pencil-off:before{content:"\F03EF"}.mdi-pencil-off-outline:before{content:"\F0DEA"}.mdi-pencil-outline:before{content:"\F0CB6"}.mdi-pencil-plus:before{content:"\F0DEB"}.mdi-pencil-plus-outline:before{content:"\F0DEC"}.mdi-pencil-remove:before{content:"\F0DED"}.mdi-pencil-remove-outline:before{content:"\F0DEE"}.mdi-pencil-ruler:before{content:"\F1353"}.mdi-penguin:before{content:"\F0EC0"}.mdi-pentagon:before{content:"\F0701"}.mdi-pentagon-outline:before{content:"\F0700"}.mdi-pentagram:before{content:"\F1667"}.mdi-percent:before{content:"\F03F0"}.mdi-percent-outline:before{content:"\F1278"}.mdi-periodic-table:before{content:"\F08B6"}.mdi-perspective-less:before{content:"\F0D23"}.mdi-perspective-more:before{content:"\F0D24"}.mdi-pharmacy:before{content:"\F03F1"}.mdi-phone:before{content:"\F03F2"}.mdi-phone-alert:before{content:"\F0F1A"}.mdi-phone-alert-outline:before{content:"\F118E"}.mdi-phone-bluetooth:before{content:"\F03F3"}.mdi-phone-bluetooth-outline:before{content:"\F118F"}.mdi-phone-cancel:before{content:"\F10BC"}.mdi-phone-cancel-outline:before{content:"\F1190"}.mdi-phone-check:before{content:"\F11A9"}.mdi-phone-check-outline:before{content:"\F11AA"}.mdi-phone-classic:before{content:"\F0602"}.mdi-phone-classic-off:before{content:"\F1279"}.mdi-phone-dial:before{content:"\F1559"}.mdi-phone-dial-outline:before{content:"\F155A"}.mdi-phone-forward:before{content:"\F03F4"}.mdi-phone-forward-outline:before{content:"\F1191"}.mdi-phone-hangup:before{content:"\F03F5"}.mdi-phone-hangup-outline:before{content:"\F1192"}.mdi-phone-in-talk:before{content:"\F03F6"}.mdi-phone-in-talk-outline:before{content:"\F1182"}.mdi-phone-incoming:before{content:"\F03F7"}.mdi-phone-incoming-outline:before{content:"\F1193"}.mdi-phone-lock:before{content:"\F03F8"}.mdi-phone-lock-outline:before{content:"\F1194"}.mdi-phone-log:before{content:"\F03F9"}.mdi-phone-log-outline:before{content:"\F1195"}.mdi-phone-message:before{content:"\F1196"}.mdi-phone-message-outline:before{content:"\F1197"}.mdi-phone-minus:before{content:"\F0658"}.mdi-phone-minus-outline:before{content:"\F1198"}.mdi-phone-missed:before{content:"\F03FA"}.mdi-phone-missed-outline:before{content:"\F11A5"}.mdi-phone-off:before{content:"\F0DEF"}.mdi-phone-off-outline:before{content:"\F11A6"}.mdi-phone-outgoing:before{content:"\F03FB"}.mdi-phone-outgoing-outline:before{content:"\F1199"}.mdi-phone-outline:before{content:"\F0DF0"}.mdi-phone-paused:before{content:"\F03FC"}.mdi-phone-paused-outline:before{content:"\F119A"}.mdi-phone-plus:before{content:"\F0659"}.mdi-phone-plus-outline:before{content:"\F119B"}.mdi-phone-remove:before{content:"\F152F"}.mdi-phone-remove-outline:before{content:"\F1530"}.mdi-phone-return:before{content:"\F082F"}.mdi-phone-return-outline:before{content:"\F119C"}.mdi-phone-ring:before{content:"\F11AB"}.mdi-phone-ring-outline:before{content:"\F11AC"}.mdi-phone-rotate-landscape:before{content:"\F0885"}.mdi-phone-rotate-portrait:before{content:"\F0886"}.mdi-phone-settings:before{content:"\F03FD"}.mdi-phone-settings-outline:before{content:"\F119D"}.mdi-phone-voip:before{content:"\F03FE"}.mdi-pi:before{content:"\F03FF"}.mdi-pi-box:before{content:"\F0400"}.mdi-pi-hole:before{content:"\F0DF1"}.mdi-piano:before{content:"\F067D"}.mdi-pickaxe:before{content:"\F08B7"}.mdi-picture-in-picture-bottom-right:before{content:"\F0E57"}.mdi-picture-in-picture-bottom-right-outline:before{content:"\F0E58"}.mdi-picture-in-picture-top-right:before{content:"\F0E59"}.mdi-picture-in-picture-top-right-outline:before{content:"\F0E5A"}.mdi-pier:before{content:"\F0887"}.mdi-pier-crane:before{content:"\F0888"}.mdi-pig:before{content:"\F0401"}.mdi-pig-variant:before{content:"\F1006"}.mdi-pig-variant-outline:before{content:"\F1678"}.mdi-piggy-bank:before{content:"\F1007"}.mdi-piggy-bank-outline:before{content:"\F1679"}.mdi-pill:before{content:"\F0402"}.mdi-pillar:before{content:"\F0702"}.mdi-pin:before{content:"\F0403"}.mdi-pin-off:before{content:"\F0404"}.mdi-pin-off-outline:before{content:"\F0930"}.mdi-pin-outline:before{content:"\F0931"}.mdi-pine-tree:before{content:"\F0405"}.mdi-pine-tree-box:before{content:"\F0406"}.mdi-pine-tree-fire:before{content:"\F141A"}.mdi-pinterest:before{content:"\F0407"}.mdi-pinwheel:before{content:"\F0AD5"}.mdi-pinwheel-outline:before{content:"\F0AD6"}.mdi-pipe:before{content:"\F07E5"}.mdi-pipe-disconnected:before{content:"\F07E6"}.mdi-pipe-leak:before{content:"\F0889"}.mdi-pipe-wrench:before{content:"\F1354"}.mdi-pirate:before{content:"\F0A08"}.mdi-pistol:before{content:"\F0703"}.mdi-piston:before{content:"\F088A"}.mdi-pitchfork:before{content:"\F1553"}.mdi-pizza:before{content:"\F0409"}.mdi-play:before{content:"\F040A"}.mdi-play-box:before{content:"\F127A"}.mdi-play-box-multiple:before{content:"\F0D19"}.mdi-play-box-multiple-outline:before{content:"\F13E6"}.mdi-play-box-outline:before{content:"\F040B"}.mdi-play-circle:before{content:"\F040C"}.mdi-play-circle-outline:before{content:"\F040D"}.mdi-play-network:before{content:"\F088B"}.mdi-play-network-outline:before{content:"\F0CB7"}.mdi-play-outline:before{content:"\F0F1B"}.mdi-play-pause:before{content:"\F040E"}.mdi-play-protected-content:before{content:"\F040F"}.mdi-play-speed:before{content:"\F08FF"}.mdi-playlist-check:before{content:"\F05C7"}.mdi-playlist-edit:before{content:"\F0900"}.mdi-playlist-minus:before{content:"\F0410"}.mdi-playlist-music:before{content:"\F0CB8"}.mdi-playlist-music-outline:before{content:"\F0CB9"}.mdi-playlist-play:before{content:"\F0411"}.mdi-playlist-plus:before{content:"\F0412"}.mdi-playlist-remove:before{content:"\F0413"}.mdi-playlist-star:before{content:"\F0DF2"}.mdi-plex:before{content:"\F06BA"}.mdi-plus:before{content:"\F0415"}.mdi-plus-box:before{content:"\F0416"}.mdi-plus-box-multiple:before{content:"\F0334"}.mdi-plus-box-multiple-outline:before{content:"\F1143"}.mdi-plus-box-outline:before{content:"\F0704"}.mdi-plus-circle:before{content:"\F0417"}.mdi-plus-circle-multiple:before{content:"\F034C"}.mdi-plus-circle-multiple-outline:before{content:"\F0418"}.mdi-plus-circle-outline:before{content:"\F0419"}.mdi-plus-minus:before{content:"\F0992"}.mdi-plus-minus-box:before{content:"\F0993"}.mdi-plus-minus-variant:before{content:"\F14C9"}.mdi-plus-network:before{content:"\F041A"}.mdi-plus-network-outline:before{content:"\F0CBA"}.mdi-plus-one:before{content:"\F041B"}.mdi-plus-outline:before{content:"\F0705"}.mdi-plus-thick:before{content:"\F11EC"}.mdi-podcast:before{content:"\F0994"}.mdi-podium:before{content:"\F0D25"}.mdi-podium-bronze:before{content:"\F0D26"}.mdi-podium-gold:before{content:"\F0D27"}.mdi-podium-silver:before{content:"\F0D28"}.mdi-point-of-sale:before{content:"\F0D92"}.mdi-pokeball:before{content:"\F041D"}.mdi-pokemon-go:before{content:"\F0A09"}.mdi-poker-chip:before{content:"\F0830"}.mdi-polaroid:before{content:"\F041E"}.mdi-police-badge:before{content:"\F1167"}.mdi-police-badge-outline:before{content:"\F1168"}.mdi-poll:before{content:"\F041F"}.mdi-poll-box:before{content:"\F0420"}.mdi-poll-box-outline:before{content:"\F127B"}.mdi-polo:before{content:"\F14C3"}.mdi-polymer:before{content:"\F0421"}.mdi-pool:before{content:"\F0606"}.mdi-popcorn:before{content:"\F0422"}.mdi-post:before{content:"\F1008"}.mdi-post-outline:before{content:"\F1009"}.mdi-postage-stamp:before{content:"\F0CBB"}.mdi-pot:before{content:"\F02E5"}.mdi-pot-mix:before{content:"\F065B"}.mdi-pot-mix-outline:before{content:"\F0677"}.mdi-pot-outline:before{content:"\F02FF"}.mdi-pot-steam:before{content:"\F065A"}.mdi-pot-steam-outline:before{content:"\F0326"}.mdi-pound:before{content:"\F0423"}.mdi-pound-box:before{content:"\F0424"}.mdi-pound-box-outline:before{content:"\F117F"}.mdi-power:before{content:"\F0425"}.mdi-power-cycle:before{content:"\F0901"}.mdi-power-off:before{content:"\F0902"}.mdi-power-on:before{content:"\F0903"}.mdi-power-plug:before{content:"\F06A5"}.mdi-power-plug-off:before{content:"\F06A6"}.mdi-power-plug-off-outline:before{content:"\F1424"}.mdi-power-plug-outline:before{content:"\F1425"}.mdi-power-settings:before{content:"\F0426"}.mdi-power-sleep:before{content:"\F0904"}.mdi-power-socket:before{content:"\F0427"}.mdi-power-socket-au:before{content:"\F0905"}.mdi-power-socket-de:before{content:"\F1107"}.mdi-power-socket-eu:before{content:"\F07E7"}.mdi-power-socket-fr:before{content:"\F1108"}.mdi-power-socket-it:before{content:"\F14FF"}.mdi-power-socket-jp:before{content:"\F1109"}.mdi-power-socket-uk:before{content:"\F07E8"}.mdi-power-socket-us:before{content:"\F07E9"}.mdi-power-standby:before{content:"\F0906"}.mdi-powershell:before{content:"\F0A0A"}.mdi-prescription:before{content:"\F0706"}.mdi-presentation:before{content:"\F0428"}.mdi-presentation-play:before{content:"\F0429"}.mdi-pretzel:before{content:"\F1562"}.mdi-printer:before{content:"\F042A"}.mdi-printer-3d:before{content:"\F042B"}.mdi-printer-3d-nozzle:before{content:"\F0E5B"}.mdi-printer-3d-nozzle-alert:before{content:"\F11C0"}.mdi-printer-3d-nozzle-alert-outline:before{content:"\F11C1"}.mdi-printer-3d-nozzle-outline:before{content:"\F0E5C"}.mdi-printer-alert:before{content:"\F042C"}.mdi-printer-check:before{content:"\F1146"}.mdi-printer-eye:before{content:"\F1458"}.mdi-printer-off:before{content:"\F0E5D"}.mdi-printer-pos:before{content:"\F1057"}.mdi-printer-search:before{content:"\F1457"}.mdi-printer-settings:before{content:"\F0707"}.mdi-printer-wireless:before{content:"\F0A0B"}.mdi-priority-high:before{content:"\F0603"}.mdi-priority-low:before{content:"\F0604"}.mdi-professional-hexagon:before{content:"\F042D"}.mdi-progress-alert:before{content:"\F0CBC"}.mdi-progress-check:before{content:"\F0995"}.mdi-progress-clock:before{content:"\F0996"}.mdi-progress-close:before{content:"\F110A"}.mdi-progress-download:before{content:"\F0997"}.mdi-progress-question:before{content:"\F1522"}.mdi-progress-upload:before{content:"\F0998"}.mdi-progress-wrench:before{content:"\F0CBD"}.mdi-projector:before{content:"\F042E"}.mdi-projector-screen:before{content:"\F042F"}.mdi-projector-screen-outline:before{content:"\F1724"}.mdi-propane-tank:before{content:"\F1357"}.mdi-propane-tank-outline:before{content:"\F1358"}.mdi-protocol:before{content:"\F0FD8"}.mdi-publish:before{content:"\F06A7"}.mdi-pulse:before{content:"\F0430"}.mdi-pump:before{content:"\F1402"}.mdi-pumpkin:before{content:"\F0BBF"}.mdi-purse:before{content:"\F0F1C"}.mdi-purse-outline:before{content:"\F0F1D"}.mdi-puzzle:before{content:"\F0431"}.mdi-puzzle-check:before{content:"\F1426"}.mdi-puzzle-check-outline:before{content:"\F1427"}.mdi-puzzle-edit:before{content:"\F14D3"}.mdi-puzzle-edit-outline:before{content:"\F14D9"}.mdi-puzzle-heart:before{content:"\F14D4"}.mdi-puzzle-heart-outline:before{content:"\F14DA"}.mdi-puzzle-minus:before{content:"\F14D1"}.mdi-puzzle-minus-outline:before{content:"\F14D7"}.mdi-puzzle-outline:before{content:"\F0A66"}.mdi-puzzle-plus:before{content:"\F14D0"}.mdi-puzzle-plus-outline:before{content:"\F14D6"}.mdi-puzzle-remove:before{content:"\F14D2"}.mdi-puzzle-remove-outline:before{content:"\F14D8"}.mdi-puzzle-star:before{content:"\F14D5"}.mdi-puzzle-star-outline:before{content:"\F14DB"}.mdi-qi:before{content:"\F0999"}.mdi-qqchat:before{content:"\F0605"}.mdi-qrcode:before{content:"\F0432"}.mdi-qrcode-edit:before{content:"\F08B8"}.mdi-qrcode-minus:before{content:"\F118C"}.mdi-qrcode-plus:before{content:"\F118B"}.mdi-qrcode-remove:before{content:"\F118D"}.mdi-qrcode-scan:before{content:"\F0433"}.mdi-quadcopter:before{content:"\F0434"}.mdi-quality-high:before{content:"\F0435"}.mdi-quality-low:before{content:"\F0A0C"}.mdi-quality-medium:before{content:"\F0A0D"}.mdi-quora:before{content:"\F0D29"}.mdi-rabbit:before{content:"\F0907"}.mdi-racing-helmet:before{content:"\F0D93"}.mdi-racquetball:before{content:"\F0D94"}.mdi-radar:before{content:"\F0437"}.mdi-radiator:before{content:"\F0438"}.mdi-radiator-disabled:before{content:"\F0AD7"}.mdi-radiator-off:before{content:"\F0AD8"}.mdi-radio:before{content:"\F0439"}.mdi-radio-am:before{content:"\F0CBE"}.mdi-radio-fm:before{content:"\F0CBF"}.mdi-radio-handheld:before{content:"\F043A"}.mdi-radio-off:before{content:"\F121C"}.mdi-radio-tower:before{content:"\F043B"}.mdi-radioactive:before{content:"\F043C"}.mdi-radioactive-off:before{content:"\F0EC1"}.mdi-radiobox-blank:before{content:"\F043D"}.mdi-radiobox-marked:before{content:"\F043E"}.mdi-radiology-box:before{content:"\F14C5"}.mdi-radiology-box-outline:before{content:"\F14C6"}.mdi-radius:before{content:"\F0CC0"}.mdi-radius-outline:before{content:"\F0CC1"}.mdi-railroad-light:before{content:"\F0F1E"}.mdi-rake:before{content:"\F1544"}.mdi-raspberry-pi:before{content:"\F043F"}.mdi-ray-end:before{content:"\F0440"}.mdi-ray-end-arrow:before{content:"\F0441"}.mdi-ray-start:before{content:"\F0442"}.mdi-ray-start-arrow:before{content:"\F0443"}.mdi-ray-start-end:before{content:"\F0444"}.mdi-ray-start-vertex-end:before{content:"\F15D8"}.mdi-ray-vertex:before{content:"\F0445"}.mdi-react:before{content:"\F0708"}.mdi-read:before{content:"\F0447"}.mdi-receipt:before{content:"\F0449"}.mdi-record:before{content:"\F044A"}.mdi-record-circle:before{content:"\F0EC2"}.mdi-record-circle-outline:before{content:"\F0EC3"}.mdi-record-player:before{content:"\F099A"}.mdi-record-rec:before{content:"\F044B"}.mdi-rectangle:before{content:"\F0E5E"}.mdi-rectangle-outline:before{content:"\F0E5F"}.mdi-recycle:before{content:"\F044C"}.mdi-recycle-variant:before{content:"\F139D"}.mdi-reddit:before{content:"\F044D"}.mdi-redhat:before{content:"\F111B"}.mdi-redo:before{content:"\F044E"}.mdi-redo-variant:before{content:"\F044F"}.mdi-reflect-horizontal:before{content:"\F0A0E"}.mdi-reflect-vertical:before{content:"\F0A0F"}.mdi-refresh:before{content:"\F0450"}.mdi-refresh-circle:before{content:"\F1377"}.mdi-regex:before{content:"\F0451"}.mdi-registered-trademark:before{content:"\F0A67"}.mdi-reiterate:before{content:"\F1588"}.mdi-relation-many-to-many:before{content:"\F1496"}.mdi-relation-many-to-one:before{content:"\F1497"}.mdi-relation-many-to-one-or-many:before{content:"\F1498"}.mdi-relation-many-to-only-one:before{content:"\F1499"}.mdi-relation-many-to-zero-or-many:before{content:"\F149A"}.mdi-relation-many-to-zero-or-one:before{content:"\F149B"}.mdi-relation-one-or-many-to-many:before{content:"\F149C"}.mdi-relation-one-or-many-to-one:before{content:"\F149D"}.mdi-relation-one-or-many-to-one-or-many:before{content:"\F149E"}.mdi-relation-one-or-many-to-only-one:before{content:"\F149F"}.mdi-relation-one-or-many-to-zero-or-many:before{content:"\F14A0"}.mdi-relation-one-or-many-to-zero-or-one:before{content:"\F14A1"}.mdi-relation-one-to-many:before{content:"\F14A2"}.mdi-relation-one-to-one:before{content:"\F14A3"}.mdi-relation-one-to-one-or-many:before{content:"\F14A4"}.mdi-relation-one-to-only-one:before{content:"\F14A5"}.mdi-relation-one-to-zero-or-many:before{content:"\F14A6"}.mdi-relation-one-to-zero-or-one:before{content:"\F14A7"}.mdi-relation-only-one-to-many:before{content:"\F14A8"}.mdi-relation-only-one-to-one:before{content:"\F14A9"}.mdi-relation-only-one-to-one-or-many:before{content:"\F14AA"}.mdi-relation-only-one-to-only-one:before{content:"\F14AB"}.mdi-relation-only-one-to-zero-or-many:before{content:"\F14AC"}.mdi-relation-only-one-to-zero-or-one:before{content:"\F14AD"}.mdi-relation-zero-or-many-to-many:before{content:"\F14AE"}.mdi-relation-zero-or-many-to-one:before{content:"\F14AF"}.mdi-relation-zero-or-many-to-one-or-many:before{content:"\F14B0"}.mdi-relation-zero-or-many-to-only-one:before{content:"\F14B1"}.mdi-relation-zero-or-many-to-zero-or-many:before{content:"\F14B2"}.mdi-relation-zero-or-many-to-zero-or-one:before{content:"\F14B3"}.mdi-relation-zero-or-one-to-many:before{content:"\F14B4"}.mdi-relation-zero-or-one-to-one:before{content:"\F14B5"}.mdi-relation-zero-or-one-to-one-or-many:before{content:"\F14B6"}.mdi-relation-zero-or-one-to-only-one:before{content:"\F14B7"}.mdi-relation-zero-or-one-to-zero-or-many:before{content:"\F14B8"}.mdi-relation-zero-or-one-to-zero-or-one:before{content:"\F14B9"}.mdi-relative-scale:before{content:"\F0452"}.mdi-reload:before{content:"\F0453"}.mdi-reload-alert:before{content:"\F110B"}.mdi-reminder:before{content:"\F088C"}.mdi-remote:before{content:"\F0454"}.mdi-remote-desktop:before{content:"\F08B9"}.mdi-remote-off:before{content:"\F0EC4"}.mdi-remote-tv:before{content:"\F0EC5"}.mdi-remote-tv-off:before{content:"\F0EC6"}.mdi-rename-box:before{content:"\F0455"}.mdi-reorder-horizontal:before{content:"\F0688"}.mdi-reorder-vertical:before{content:"\F0689"}.mdi-repeat:before{content:"\F0456"}.mdi-repeat-off:before{content:"\F0457"}.mdi-repeat-once:before{content:"\F0458"}.mdi-replay:before{content:"\F0459"}.mdi-reply:before{content:"\F045A"}.mdi-reply-all:before{content:"\F045B"}.mdi-reply-all-outline:before{content:"\F0F1F"}.mdi-reply-circle:before{content:"\F11AE"}.mdi-reply-outline:before{content:"\F0F20"}.mdi-reproduction:before{content:"\F045C"}.mdi-resistor:before{content:"\F0B44"}.mdi-resistor-nodes:before{content:"\F0B45"}.mdi-resize:before{content:"\F0A68"}.mdi-resize-bottom-right:before{content:"\F045D"}.mdi-responsive:before{content:"\F045E"}.mdi-restart:before{content:"\F0709"}.mdi-restart-alert:before{content:"\F110C"}.mdi-restart-off:before{content:"\F0D95"}.mdi-restore:before{content:"\F099B"}.mdi-restore-alert:before{content:"\F110D"}.mdi-rewind:before{content:"\F045F"}.mdi-rewind-10:before{content:"\F0D2A"}.mdi-rewind-30:before{content:"\F0D96"}.mdi-rewind-5:before{content:"\F11F9"}.mdi-rewind-60:before{content:"\F160C"}.mdi-rewind-outline:before{content:"\F070A"}.mdi-rhombus:before{content:"\F070B"}.mdi-rhombus-medium:before{content:"\F0A10"}.mdi-rhombus-medium-outline:before{content:"\F14DC"}.mdi-rhombus-outline:before{content:"\F070C"}.mdi-rhombus-split:before{content:"\F0A11"}.mdi-rhombus-split-outline:before{content:"\F14DD"}.mdi-ribbon:before{content:"\F0460"}.mdi-rice:before{content:"\F07EA"}.mdi-rickshaw:before{content:"\F15BB"}.mdi-rickshaw-electric:before{content:"\F15BC"}.mdi-ring:before{content:"\F07EB"}.mdi-rivet:before{content:"\F0E60"}.mdi-road:before{content:"\F0461"}.mdi-road-variant:before{content:"\F0462"}.mdi-robber:before{content:"\F1058"}.mdi-robot:before{content:"\F06A9"}.mdi-robot-angry:before{content:"\F169D"}.mdi-robot-angry-outline:before{content:"\F169E"}.mdi-robot-confused:before{content:"\F169F"}.mdi-robot-confused-outline:before{content:"\F16A0"}.mdi-robot-dead:before{content:"\F16A1"}.mdi-robot-dead-outline:before{content:"\F16A2"}.mdi-robot-excited:before{content:"\F16A3"}.mdi-robot-excited-outline:before{content:"\F16A4"}.mdi-robot-happy:before{content:"\F1719"}.mdi-robot-happy-outline:before{content:"\F171A"}.mdi-robot-industrial:before{content:"\F0B46"}.mdi-robot-love:before{content:"\F16A5"}.mdi-robot-love-outline:before{content:"\F16A6"}.mdi-robot-mower:before{content:"\F11F7"}.mdi-robot-mower-outline:before{content:"\F11F3"}.mdi-robot-off:before{content:"\F16A7"}.mdi-robot-off-outline:before{content:"\F167B"}.mdi-robot-outline:before{content:"\F167A"}.mdi-robot-vacuum:before{content:"\F070D"}.mdi-robot-vacuum-variant:before{content:"\F0908"}.mdi-rocket:before{content:"\F0463"}.mdi-rocket-launch:before{content:"\F14DE"}.mdi-rocket-launch-outline:before{content:"\F14DF"}.mdi-rocket-outline:before{content:"\F13AF"}.mdi-rodent:before{content:"\F1327"}.mdi-roller-skate:before{content:"\F0D2B"}.mdi-roller-skate-off:before{content:"\F0145"}.mdi-rollerblade:before{content:"\F0D2C"}.mdi-rollerblade-off:before{content:"\F002E"}.mdi-rollupjs:before{content:"\F0BC0"}.mdi-roman-numeral-1:before{content:"\F1088"}.mdi-roman-numeral-10:before{content:"\F1091"}.mdi-roman-numeral-2:before{content:"\F1089"}.mdi-roman-numeral-3:before{content:"\F108A"}.mdi-roman-numeral-4:before{content:"\F108B"}.mdi-roman-numeral-5:before{content:"\F108C"}.mdi-roman-numeral-6:before{content:"\F108D"}.mdi-roman-numeral-7:before{content:"\F108E"}.mdi-roman-numeral-8:before{content:"\F108F"}.mdi-roman-numeral-9:before{content:"\F1090"}.mdi-room-service:before{content:"\F088D"}.mdi-room-service-outline:before{content:"\F0D97"}.mdi-rotate-3d:before{content:"\F0EC7"}.mdi-rotate-3d-variant:before{content:"\F0464"}.mdi-rotate-left:before{content:"\F0465"}.mdi-rotate-left-variant:before{content:"\F0466"}.mdi-rotate-orbit:before{content:"\F0D98"}.mdi-rotate-right:before{content:"\F0467"}.mdi-rotate-right-variant:before{content:"\F0468"}.mdi-rounded-corner:before{content:"\F0607"}.mdi-router:before{content:"\F11E2"}.mdi-router-network:before{content:"\F1087"}.mdi-router-wireless:before{content:"\F0469"}.mdi-router-wireless-off:before{content:"\F15A3"}.mdi-router-wireless-settings:before{content:"\F0A69"}.mdi-routes:before{content:"\F046A"}.mdi-routes-clock:before{content:"\F1059"}.mdi-rowing:before{content:"\F0608"}.mdi-rss:before{content:"\F046B"}.mdi-rss-box:before{content:"\F046C"}.mdi-rss-off:before{content:"\F0F21"}.mdi-rug:before{content:"\F1475"}.mdi-rugby:before{content:"\F0D99"}.mdi-ruler:before{content:"\F046D"}.mdi-ruler-square:before{content:"\F0CC2"}.mdi-ruler-square-compass:before{content:"\F0EBE"}.mdi-run:before{content:"\F070E"}.mdi-run-fast:before{content:"\F046E"}.mdi-rv-truck:before{content:"\F11D4"}.mdi-sack:before{content:"\F0D2E"}.mdi-sack-percent:before{content:"\F0D2F"}.mdi-safe:before{content:"\F0A6A"}.mdi-safe-square:before{content:"\F127C"}.mdi-safe-square-outline:before{content:"\F127D"}.mdi-safety-goggles:before{content:"\F0D30"}.mdi-sail-boat:before{content:"\F0EC8"}.mdi-sale:before{content:"\F046F"}.mdi-salesforce:before{content:"\F088E"}.mdi-sass:before{content:"\F07EC"}.mdi-satellite:before{content:"\F0470"}.mdi-satellite-uplink:before{content:"\F0909"}.mdi-satellite-variant:before{content:"\F0471"}.mdi-sausage:before{content:"\F08BA"}.mdi-saw-blade:before{content:"\F0E61"}.mdi-sawtooth-wave:before{content:"\F147A"}.mdi-saxophone:before{content:"\F0609"}.mdi-scale:before{content:"\F0472"}.mdi-scale-balance:before{content:"\F05D1"}.mdi-scale-bathroom:before{content:"\F0473"}.mdi-scale-off:before{content:"\F105A"}.mdi-scan-helper:before{content:"\F13D8"}.mdi-scanner:before{content:"\F06AB"}.mdi-scanner-off:before{content:"\F090A"}.mdi-scatter-plot:before{content:"\F0EC9"}.mdi-scatter-plot-outline:before{content:"\F0ECA"}.mdi-school:before{content:"\F0474"}.mdi-school-outline:before{content:"\F1180"}.mdi-scissors-cutting:before{content:"\F0A6B"}.mdi-scooter:before{content:"\F15BD"}.mdi-scooter-electric:before{content:"\F15BE"}.mdi-scoreboard:before{content:"\F127E"}.mdi-scoreboard-outline:before{content:"\F127F"}.mdi-screen-rotation:before{content:"\F0475"}.mdi-screen-rotation-lock:before{content:"\F0478"}.mdi-screw-flat-top:before{content:"\F0DF3"}.mdi-screw-lag:before{content:"\F0DF4"}.mdi-screw-machine-flat-top:before{content:"\F0DF5"}.mdi-screw-machine-round-top:before{content:"\F0DF6"}.mdi-screw-round-top:before{content:"\F0DF7"}.mdi-screwdriver:before{content:"\F0476"}.mdi-script:before{content:"\F0BC1"}.mdi-script-outline:before{content:"\F0477"}.mdi-script-text:before{content:"\F0BC2"}.mdi-script-text-key:before{content:"\F1725"}.mdi-script-text-key-outline:before{content:"\F1726"}.mdi-script-text-outline:before{content:"\F0BC3"}.mdi-script-text-play:before{content:"\F1727"}.mdi-script-text-play-outline:before{content:"\F1728"}.mdi-sd:before{content:"\F0479"}.mdi-seal:before{content:"\F047A"}.mdi-seal-variant:before{content:"\F0FD9"}.mdi-search-web:before{content:"\F070F"}.mdi-seat:before{content:"\F0CC3"}.mdi-seat-flat:before{content:"\F047B"}.mdi-seat-flat-angled:before{content:"\F047C"}.mdi-seat-individual-suite:before{content:"\F047D"}.mdi-seat-legroom-extra:before{content:"\F047E"}.mdi-seat-legroom-normal:before{content:"\F047F"}.mdi-seat-legroom-reduced:before{content:"\F0480"}.mdi-seat-outline:before{content:"\F0CC4"}.mdi-seat-passenger:before{content:"\F1249"}.mdi-seat-recline-extra:before{content:"\F0481"}.mdi-seat-recline-normal:before{content:"\F0482"}.mdi-seatbelt:before{content:"\F0CC5"}.mdi-security:before{content:"\F0483"}.mdi-security-network:before{content:"\F0484"}.mdi-seed:before{content:"\F0E62"}.mdi-seed-off:before{content:"\F13FD"}.mdi-seed-off-outline:before{content:"\F13FE"}.mdi-seed-outline:before{content:"\F0E63"}.mdi-seesaw:before{content:"\F15A4"}.mdi-segment:before{content:"\F0ECB"}.mdi-select:before{content:"\F0485"}.mdi-select-all:before{content:"\F0486"}.mdi-select-color:before{content:"\F0D31"}.mdi-select-compare:before{content:"\F0AD9"}.mdi-select-drag:before{content:"\F0A6C"}.mdi-select-group:before{content:"\F0F82"}.mdi-select-inverse:before{content:"\F0487"}.mdi-select-marker:before{content:"\F1280"}.mdi-select-multiple:before{content:"\F1281"}.mdi-select-multiple-marker:before{content:"\F1282"}.mdi-select-off:before{content:"\F0488"}.mdi-select-place:before{content:"\F0FDA"}.mdi-select-search:before{content:"\F1204"}.mdi-selection:before{content:"\F0489"}.mdi-selection-drag:before{content:"\F0A6D"}.mdi-selection-ellipse:before{content:"\F0D32"}.mdi-selection-ellipse-arrow-inside:before{content:"\F0F22"}.mdi-selection-marker:before{content:"\F1283"}.mdi-selection-multiple:before{content:"\F1285"}.mdi-selection-multiple-marker:before{content:"\F1284"}.mdi-selection-off:before{content:"\F0777"}.mdi-selection-search:before{content:"\F1205"}.mdi-semantic-web:before{content:"\F1316"}.mdi-send:before{content:"\F048A"}.mdi-send-check:before{content:"\F1161"}.mdi-send-check-outline:before{content:"\F1162"}.mdi-send-circle:before{content:"\F0DF8"}.mdi-send-circle-outline:before{content:"\F0DF9"}.mdi-send-clock:before{content:"\F1163"}.mdi-send-clock-outline:before{content:"\F1164"}.mdi-send-lock:before{content:"\F07ED"}.mdi-send-lock-outline:before{content:"\F1166"}.mdi-send-outline:before{content:"\F1165"}.mdi-serial-port:before{content:"\F065C"}.mdi-server:before{content:"\F048B"}.mdi-server-minus:before{content:"\F048C"}.mdi-server-network:before{content:"\F048D"}.mdi-server-network-off:before{content:"\F048E"}.mdi-server-off:before{content:"\F048F"}.mdi-server-plus:before{content:"\F0490"}.mdi-server-remove:before{content:"\F0491"}.mdi-server-security:before{content:"\F0492"}.mdi-set-all:before{content:"\F0778"}.mdi-set-center:before{content:"\F0779"}.mdi-set-center-right:before{content:"\F077A"}.mdi-set-left:before{content:"\F077B"}.mdi-set-left-center:before{content:"\F077C"}.mdi-set-left-right:before{content:"\F077D"}.mdi-set-merge:before{content:"\F14E0"}.mdi-set-none:before{content:"\F077E"}.mdi-set-right:before{content:"\F077F"}.mdi-set-split:before{content:"\F14E1"}.mdi-set-square:before{content:"\F145D"}.mdi-set-top-box:before{content:"\F099F"}.mdi-settings-helper:before{content:"\F0A6E"}.mdi-shaker:before{content:"\F110E"}.mdi-shaker-outline:before{content:"\F110F"}.mdi-shape:before{content:"\F0831"}.mdi-shape-circle-plus:before{content:"\F065D"}.mdi-shape-outline:before{content:"\F0832"}.mdi-shape-oval-plus:before{content:"\F11FA"}.mdi-shape-plus:before{content:"\F0495"}.mdi-shape-polygon-plus:before{content:"\F065E"}.mdi-shape-rectangle-plus:before{content:"\F065F"}.mdi-shape-square-plus:before{content:"\F0660"}.mdi-shape-square-rounded-plus:before{content:"\F14FA"}.mdi-share:before{content:"\F0496"}.mdi-share-all:before{content:"\F11F4"}.mdi-share-all-outline:before{content:"\F11F5"}.mdi-share-circle:before{content:"\F11AD"}.mdi-share-off:before{content:"\F0F23"}.mdi-share-off-outline:before{content:"\F0F24"}.mdi-share-outline:before{content:"\F0932"}.mdi-share-variant:before{content:"\F0497"}.mdi-share-variant-outline:before{content:"\F1514"}.mdi-shark-fin:before{content:"\F1673"}.mdi-shark-fin-outline:before{content:"\F1674"}.mdi-sheep:before{content:"\F0CC6"}.mdi-shield:before{content:"\F0498"}.mdi-shield-account:before{content:"\F088F"}.mdi-shield-account-outline:before{content:"\F0A12"}.mdi-shield-account-variant:before{content:"\F15A7"}.mdi-shield-account-variant-outline:before{content:"\F15A8"}.mdi-shield-airplane:before{content:"\F06BB"}.mdi-shield-airplane-outline:before{content:"\F0CC7"}.mdi-shield-alert:before{content:"\F0ECC"}.mdi-shield-alert-outline:before{content:"\F0ECD"}.mdi-shield-bug:before{content:"\F13DA"}.mdi-shield-bug-outline:before{content:"\F13DB"}.mdi-shield-car:before{content:"\F0F83"}.mdi-shield-check:before{content:"\F0565"}.mdi-shield-check-outline:before{content:"\F0CC8"}.mdi-shield-cross:before{content:"\F0CC9"}.mdi-shield-cross-outline:before{content:"\F0CCA"}.mdi-shield-edit:before{content:"\F11A0"}.mdi-shield-edit-outline:before{content:"\F11A1"}.mdi-shield-half:before{content:"\F1360"}.mdi-shield-half-full:before{content:"\F0780"}.mdi-shield-home:before{content:"\F068A"}.mdi-shield-home-outline:before{content:"\F0CCB"}.mdi-shield-key:before{content:"\F0BC4"}.mdi-shield-key-outline:before{content:"\F0BC5"}.mdi-shield-link-variant:before{content:"\F0D33"}.mdi-shield-link-variant-outline:before{content:"\F0D34"}.mdi-shield-lock:before{content:"\F099D"}.mdi-shield-lock-outline:before{content:"\F0CCC"}.mdi-shield-off:before{content:"\F099E"}.mdi-shield-off-outline:before{content:"\F099C"}.mdi-shield-outline:before{content:"\F0499"}.mdi-shield-plus:before{content:"\F0ADA"}.mdi-shield-plus-outline:before{content:"\F0ADB"}.mdi-shield-refresh:before{content:"\F00AA"}.mdi-shield-refresh-outline:before{content:"\F01E0"}.mdi-shield-remove:before{content:"\F0ADC"}.mdi-shield-remove-outline:before{content:"\F0ADD"}.mdi-shield-search:before{content:"\F0D9A"}.mdi-shield-star:before{content:"\F113B"}.mdi-shield-star-outline:before{content:"\F113C"}.mdi-shield-sun:before{content:"\F105D"}.mdi-shield-sun-outline:before{content:"\F105E"}.mdi-shield-sync:before{content:"\F11A2"}.mdi-shield-sync-outline:before{content:"\F11A3"}.mdi-ship-wheel:before{content:"\F0833"}.mdi-shoe-ballet:before{content:"\F15CA"}.mdi-shoe-cleat:before{content:"\F15C7"}.mdi-shoe-formal:before{content:"\F0B47"}.mdi-shoe-heel:before{content:"\F0B48"}.mdi-shoe-print:before{content:"\F0DFA"}.mdi-shoe-sneaker:before{content:"\F15C8"}.mdi-shopping:before{content:"\F049A"}.mdi-shopping-music:before{content:"\F049B"}.mdi-shopping-outline:before{content:"\F11D5"}.mdi-shopping-search:before{content:"\F0F84"}.mdi-shore:before{content:"\F14F9"}.mdi-shovel:before{content:"\F0710"}.mdi-shovel-off:before{content:"\F0711"}.mdi-shower:before{content:"\F09A0"}.mdi-shower-head:before{content:"\F09A1"}.mdi-shredder:before{content:"\F049C"}.mdi-shuffle:before{content:"\F049D"}.mdi-shuffle-disabled:before{content:"\F049E"}.mdi-shuffle-variant:before{content:"\F049F"}.mdi-shuriken:before{content:"\F137F"}.mdi-sigma:before{content:"\F04A0"}.mdi-sigma-lower:before{content:"\F062B"}.mdi-sign-caution:before{content:"\F04A1"}.mdi-sign-direction:before{content:"\F0781"}.mdi-sign-direction-minus:before{content:"\F1000"}.mdi-sign-direction-plus:before{content:"\F0FDC"}.mdi-sign-direction-remove:before{content:"\F0FDD"}.mdi-sign-pole:before{content:"\F14F8"}.mdi-sign-real-estate:before{content:"\F1118"}.mdi-sign-text:before{content:"\F0782"}.mdi-signal:before{content:"\F04A2"}.mdi-signal-2g:before{content:"\F0712"}.mdi-signal-3g:before{content:"\F0713"}.mdi-signal-4g:before{content:"\F0714"}.mdi-signal-5g:before{content:"\F0A6F"}.mdi-signal-cellular-1:before{content:"\F08BC"}.mdi-signal-cellular-2:before{content:"\F08BD"}.mdi-signal-cellular-3:before{content:"\F08BE"}.mdi-signal-cellular-outline:before{content:"\F08BF"}.mdi-signal-distance-variant:before{content:"\F0E64"}.mdi-signal-hspa:before{content:"\F0715"}.mdi-signal-hspa-plus:before{content:"\F0716"}.mdi-signal-off:before{content:"\F0783"}.mdi-signal-variant:before{content:"\F060A"}.mdi-signature:before{content:"\F0DFB"}.mdi-signature-freehand:before{content:"\F0DFC"}.mdi-signature-image:before{content:"\F0DFD"}.mdi-signature-text:before{content:"\F0DFE"}.mdi-silo:before{content:"\F0B49"}.mdi-silverware:before{content:"\F04A3"}.mdi-silverware-clean:before{content:"\F0FDE"}.mdi-silverware-fork:before{content:"\F04A4"}.mdi-silverware-fork-knife:before{content:"\F0A70"}.mdi-silverware-spoon:before{content:"\F04A5"}.mdi-silverware-variant:before{content:"\F04A6"}.mdi-sim:before{content:"\F04A7"}.mdi-sim-alert:before{content:"\F04A8"}.mdi-sim-alert-outline:before{content:"\F15D3"}.mdi-sim-off:before{content:"\F04A9"}.mdi-sim-off-outline:before{content:"\F15D4"}.mdi-sim-outline:before{content:"\F15D5"}.mdi-simple-icons:before{content:"\F131D"}.mdi-sina-weibo:before{content:"\F0ADF"}.mdi-sine-wave:before{content:"\F095B"}.mdi-sitemap:before{content:"\F04AA"}.mdi-size-l:before{content:"\F13A6"}.mdi-size-m:before{content:"\F13A5"}.mdi-size-s:before{content:"\F13A4"}.mdi-size-xl:before{content:"\F13A7"}.mdi-size-xs:before{content:"\F13A3"}.mdi-size-xxl:before{content:"\F13A8"}.mdi-size-xxs:before{content:"\F13A2"}.mdi-size-xxxl:before{content:"\F13A9"}.mdi-skate:before{content:"\F0D35"}.mdi-skateboard:before{content:"\F14C2"}.mdi-skew-less:before{content:"\F0D36"}.mdi-skew-more:before{content:"\F0D37"}.mdi-ski:before{content:"\F1304"}.mdi-ski-cross-country:before{content:"\F1305"}.mdi-ski-water:before{content:"\F1306"}.mdi-skip-backward:before{content:"\F04AB"}.mdi-skip-backward-outline:before{content:"\F0F25"}.mdi-skip-forward:before{content:"\F04AC"}.mdi-skip-forward-outline:before{content:"\F0F26"}.mdi-skip-next:before{content:"\F04AD"}.mdi-skip-next-circle:before{content:"\F0661"}.mdi-skip-next-circle-outline:before{content:"\F0662"}.mdi-skip-next-outline:before{content:"\F0F27"}.mdi-skip-previous:before{content:"\F04AE"}.mdi-skip-previous-circle:before{content:"\F0663"}.mdi-skip-previous-circle-outline:before{content:"\F0664"}.mdi-skip-previous-outline:before{content:"\F0F28"}.mdi-skull:before{content:"\F068C"}.mdi-skull-crossbones:before{content:"\F0BC6"}.mdi-skull-crossbones-outline:before{content:"\F0BC7"}.mdi-skull-outline:before{content:"\F0BC8"}.mdi-skull-scan:before{content:"\F14C7"}.mdi-skull-scan-outline:before{content:"\F14C8"}.mdi-skype:before{content:"\F04AF"}.mdi-skype-business:before{content:"\F04B0"}.mdi-slack:before{content:"\F04B1"}.mdi-slash-forward:before{content:"\F0FDF"}.mdi-slash-forward-box:before{content:"\F0FE0"}.mdi-sleep:before{content:"\F04B2"}.mdi-sleep-off:before{content:"\F04B3"}.mdi-slide:before{content:"\F15A5"}.mdi-slope-downhill:before{content:"\F0DFF"}.mdi-slope-uphill:before{content:"\F0E00"}.mdi-slot-machine:before{content:"\F1114"}.mdi-slot-machine-outline:before{content:"\F1115"}.mdi-smart-card:before{content:"\F10BD"}.mdi-smart-card-outline:before{content:"\F10BE"}.mdi-smart-card-reader:before{content:"\F10BF"}.mdi-smart-card-reader-outline:before{content:"\F10C0"}.mdi-smog:before{content:"\F0A71"}.mdi-smoke-detector:before{content:"\F0392"}.mdi-smoking:before{content:"\F04B4"}.mdi-smoking-off:before{content:"\F04B5"}.mdi-smoking-pipe:before{content:"\F140D"}.mdi-smoking-pipe-off:before{content:"\F1428"}.mdi-snail:before{content:"\F1677"}.mdi-snake:before{content:"\F150E"}.mdi-snapchat:before{content:"\F04B6"}.mdi-snowboard:before{content:"\F1307"}.mdi-snowflake:before{content:"\F0717"}.mdi-snowflake-alert:before{content:"\F0F29"}.mdi-snowflake-melt:before{content:"\F12CB"}.mdi-snowflake-off:before{content:"\F14E3"}.mdi-snowflake-variant:before{content:"\F0F2A"}.mdi-snowman:before{content:"\F04B7"}.mdi-soccer:before{content:"\F04B8"}.mdi-soccer-field:before{content:"\F0834"}.mdi-social-distance-2-meters:before{content:"\F1579"}.mdi-social-distance-6-feet:before{content:"\F157A"}.mdi-sofa:before{content:"\F04B9"}.mdi-sofa-outline:before{content:"\F156D"}.mdi-sofa-single:before{content:"\F156E"}.mdi-sofa-single-outline:before{content:"\F156F"}.mdi-solar-panel:before{content:"\F0D9B"}.mdi-solar-panel-large:before{content:"\F0D9C"}.mdi-solar-power:before{content:"\F0A72"}.mdi-soldering-iron:before{content:"\F1092"}.mdi-solid:before{content:"\F068D"}.mdi-sony-playstation:before{content:"\F0414"}.mdi-sort:before{content:"\F04BA"}.mdi-sort-alphabetical-ascending:before{content:"\F05BD"}.mdi-sort-alphabetical-ascending-variant:before{content:"\F1148"}.mdi-sort-alphabetical-descending:before{content:"\F05BF"}.mdi-sort-alphabetical-descending-variant:before{content:"\F1149"}.mdi-sort-alphabetical-variant:before{content:"\F04BB"}.mdi-sort-ascending:before{content:"\F04BC"}.mdi-sort-bool-ascending:before{content:"\F1385"}.mdi-sort-bool-ascending-variant:before{content:"\F1386"}.mdi-sort-bool-descending:before{content:"\F1387"}.mdi-sort-bool-descending-variant:before{content:"\F1388"}.mdi-sort-calendar-ascending:before{content:"\F1547"}.mdi-sort-calendar-descending:before{content:"\F1548"}.mdi-sort-clock-ascending:before{content:"\F1549"}.mdi-sort-clock-ascending-outline:before{content:"\F154A"}.mdi-sort-clock-descending:before{content:"\F154B"}.mdi-sort-clock-descending-outline:before{content:"\F154C"}.mdi-sort-descending:before{content:"\F04BD"}.mdi-sort-numeric-ascending:before{content:"\F1389"}.mdi-sort-numeric-ascending-variant:before{content:"\F090D"}.mdi-sort-numeric-descending:before{content:"\F138A"}.mdi-sort-numeric-descending-variant:before{content:"\F0AD2"}.mdi-sort-numeric-variant:before{content:"\F04BE"}.mdi-sort-reverse-variant:before{content:"\F033C"}.mdi-sort-variant:before{content:"\F04BF"}.mdi-sort-variant-lock:before{content:"\F0CCD"}.mdi-sort-variant-lock-open:before{content:"\F0CCE"}.mdi-sort-variant-remove:before{content:"\F1147"}.mdi-soundcloud:before{content:"\F04C0"}.mdi-source-branch:before{content:"\F062C"}.mdi-source-branch-check:before{content:"\F14CF"}.mdi-source-branch-minus:before{content:"\F14CB"}.mdi-source-branch-plus:before{content:"\F14CA"}.mdi-source-branch-refresh:before{content:"\F14CD"}.mdi-source-branch-remove:before{content:"\F14CC"}.mdi-source-branch-sync:before{content:"\F14CE"}.mdi-source-commit:before{content:"\F0718"}.mdi-source-commit-end:before{content:"\F0719"}.mdi-source-commit-end-local:before{content:"\F071A"}.mdi-source-commit-local:before{content:"\F071B"}.mdi-source-commit-next-local:before{content:"\F071C"}.mdi-source-commit-start:before{content:"\F071D"}.mdi-source-commit-start-next-local:before{content:"\F071E"}.mdi-source-fork:before{content:"\F04C1"}.mdi-source-merge:before{content:"\F062D"}.mdi-source-pull:before{content:"\F04C2"}.mdi-source-repository:before{content:"\F0CCF"}.mdi-source-repository-multiple:before{content:"\F0CD0"}.mdi-soy-sauce:before{content:"\F07EE"}.mdi-soy-sauce-off:before{content:"\F13FC"}.mdi-spa:before{content:"\F0CD1"}.mdi-spa-outline:before{content:"\F0CD2"}.mdi-space-invaders:before{content:"\F0BC9"}.mdi-space-station:before{content:"\F1383"}.mdi-spade:before{content:"\F0E65"}.mdi-sparkles:before{content:"\F1545"}.mdi-speaker:before{content:"\F04C3"}.mdi-speaker-bluetooth:before{content:"\F09A2"}.mdi-speaker-multiple:before{content:"\F0D38"}.mdi-speaker-off:before{content:"\F04C4"}.mdi-speaker-wireless:before{content:"\F071F"}.mdi-speedometer:before{content:"\F04C5"}.mdi-speedometer-medium:before{content:"\F0F85"}.mdi-speedometer-slow:before{content:"\F0F86"}.mdi-spellcheck:before{content:"\F04C6"}.mdi-spider:before{content:"\F11EA"}.mdi-spider-thread:before{content:"\F11EB"}.mdi-spider-web:before{content:"\F0BCA"}.mdi-spirit-level:before{content:"\F14F1"}.mdi-spoon-sugar:before{content:"\F1429"}.mdi-spotify:before{content:"\F04C7"}.mdi-spotlight:before{content:"\F04C8"}.mdi-spotlight-beam:before{content:"\F04C9"}.mdi-spray:before{content:"\F0665"}.mdi-spray-bottle:before{content:"\F0AE0"}.mdi-sprinkler:before{content:"\F105F"}.mdi-sprinkler-variant:before{content:"\F1060"}.mdi-sprout:before{content:"\F0E66"}.mdi-sprout-outline:before{content:"\F0E67"}.mdi-square:before{content:"\F0764"}.mdi-square-circle:before{content:"\F1500"}.mdi-square-edit-outline:before{content:"\F090C"}.mdi-square-medium:before{content:"\F0A13"}.mdi-square-medium-outline:before{content:"\F0A14"}.mdi-square-off:before{content:"\F12EE"}.mdi-square-off-outline:before{content:"\F12EF"}.mdi-square-outline:before{content:"\F0763"}.mdi-square-root:before{content:"\F0784"}.mdi-square-root-box:before{content:"\F09A3"}.mdi-square-rounded:before{content:"\F14FB"}.mdi-square-rounded-outline:before{content:"\F14FC"}.mdi-square-small:before{content:"\F0A15"}.mdi-square-wave:before{content:"\F147B"}.mdi-squeegee:before{content:"\F0AE1"}.mdi-ssh:before{content:"\F08C0"}.mdi-stack-exchange:before{content:"\F060B"}.mdi-stack-overflow:before{content:"\F04CC"}.mdi-stackpath:before{content:"\F0359"}.mdi-stadium:before{content:"\F0FF9"}.mdi-stadium-variant:before{content:"\F0720"}.mdi-stairs:before{content:"\F04CD"}.mdi-stairs-box:before{content:"\F139E"}.mdi-stairs-down:before{content:"\F12BE"}.mdi-stairs-up:before{content:"\F12BD"}.mdi-stamper:before{content:"\F0D39"}.mdi-standard-definition:before{content:"\F07EF"}.mdi-star:before{content:"\F04CE"}.mdi-star-box:before{content:"\F0A73"}.mdi-star-box-multiple:before{content:"\F1286"}.mdi-star-box-multiple-outline:before{content:"\F1287"}.mdi-star-box-outline:before{content:"\F0A74"}.mdi-star-check:before{content:"\F1566"}.mdi-star-check-outline:before{content:"\F156A"}.mdi-star-circle:before{content:"\F04CF"}.mdi-star-circle-outline:before{content:"\F09A4"}.mdi-star-cog:before{content:"\F1668"}.mdi-star-cog-outline:before{content:"\F1669"}.mdi-star-face:before{content:"\F09A5"}.mdi-star-four-points:before{content:"\F0AE2"}.mdi-star-four-points-outline:before{content:"\F0AE3"}.mdi-star-half:before{content:"\F0246"}.mdi-star-half-full:before{content:"\F04D0"}.mdi-star-minus:before{content:"\F1564"}.mdi-star-minus-outline:before{content:"\F1568"}.mdi-star-off:before{content:"\F04D1"}.mdi-star-off-outline:before{content:"\F155B"}.mdi-star-outline:before{content:"\F04D2"}.mdi-star-plus:before{content:"\F1563"}.mdi-star-plus-outline:before{content:"\F1567"}.mdi-star-remove:before{content:"\F1565"}.mdi-star-remove-outline:before{content:"\F1569"}.mdi-star-settings:before{content:"\F166A"}.mdi-star-settings-outline:before{content:"\F166B"}.mdi-star-shooting:before{content:"\F1741"}.mdi-star-shooting-outline:before{content:"\F1742"}.mdi-star-three-points:before{content:"\F0AE4"}.mdi-star-three-points-outline:before{content:"\F0AE5"}.mdi-state-machine:before{content:"\F11EF"}.mdi-steam:before{content:"\F04D3"}.mdi-steering:before{content:"\F04D4"}.mdi-steering-off:before{content:"\F090E"}.mdi-step-backward:before{content:"\F04D5"}.mdi-step-backward-2:before{content:"\F04D6"}.mdi-step-forward:before{content:"\F04D7"}.mdi-step-forward-2:before{content:"\F04D8"}.mdi-stethoscope:before{content:"\F04D9"}.mdi-sticker:before{content:"\F1364"}.mdi-sticker-alert:before{content:"\F1365"}.mdi-sticker-alert-outline:before{content:"\F1366"}.mdi-sticker-check:before{content:"\F1367"}.mdi-sticker-check-outline:before{content:"\F1368"}.mdi-sticker-circle-outline:before{content:"\F05D0"}.mdi-sticker-emoji:before{content:"\F0785"}.mdi-sticker-minus:before{content:"\F1369"}.mdi-sticker-minus-outline:before{content:"\F136A"}.mdi-sticker-outline:before{content:"\F136B"}.mdi-sticker-plus:before{content:"\F136C"}.mdi-sticker-plus-outline:before{content:"\F136D"}.mdi-sticker-remove:before{content:"\F136E"}.mdi-sticker-remove-outline:before{content:"\F136F"}.mdi-stocking:before{content:"\F04DA"}.mdi-stomach:before{content:"\F1093"}.mdi-stop:before{content:"\F04DB"}.mdi-stop-circle:before{content:"\F0666"}.mdi-stop-circle-outline:before{content:"\F0667"}.mdi-store:before{content:"\F04DC"}.mdi-store-24-hour:before{content:"\F04DD"}.mdi-store-minus:before{content:"\F165E"}.mdi-store-outline:before{content:"\F1361"}.mdi-store-plus:before{content:"\F165F"}.mdi-store-remove:before{content:"\F1660"}.mdi-storefront:before{content:"\F07C7"}.mdi-storefront-outline:before{content:"\F10C1"}.mdi-stove:before{content:"\F04DE"}.mdi-strategy:before{content:"\F11D6"}.mdi-stretch-to-page:before{content:"\F0F2B"}.mdi-stretch-to-page-outline:before{content:"\F0F2C"}.mdi-string-lights:before{content:"\F12BA"}.mdi-string-lights-off:before{content:"\F12BB"}.mdi-subdirectory-arrow-left:before{content:"\F060C"}.mdi-subdirectory-arrow-right:before{content:"\F060D"}.mdi-submarine:before{content:"\F156C"}.mdi-subtitles:before{content:"\F0A16"}.mdi-subtitles-outline:before{content:"\F0A17"}.mdi-subway:before{content:"\F06AC"}.mdi-subway-alert-variant:before{content:"\F0D9D"}.mdi-subway-variant:before{content:"\F04DF"}.mdi-summit:before{content:"\F0786"}.mdi-sunglasses:before{content:"\F04E0"}.mdi-surround-sound:before{content:"\F05C5"}.mdi-surround-sound-2-0:before{content:"\F07F0"}.mdi-surround-sound-2-1:before{content:"\F1729"}.mdi-surround-sound-3-1:before{content:"\F07F1"}.mdi-surround-sound-5-1:before{content:"\F07F2"}.mdi-surround-sound-5-1-2:before{content:"\F172A"}.mdi-surround-sound-7-1:before{content:"\F07F3"}.mdi-svg:before{content:"\F0721"}.mdi-swap-horizontal:before{content:"\F04E1"}.mdi-swap-horizontal-bold:before{content:"\F0BCD"}.mdi-swap-horizontal-circle:before{content:"\F0FE1"}.mdi-swap-horizontal-circle-outline:before{content:"\F0FE2"}.mdi-swap-horizontal-variant:before{content:"\F08C1"}.mdi-swap-vertical:before{content:"\F04E2"}.mdi-swap-vertical-bold:before{content:"\F0BCE"}.mdi-swap-vertical-circle:before{content:"\F0FE3"}.mdi-swap-vertical-circle-outline:before{content:"\F0FE4"}.mdi-swap-vertical-variant:before{content:"\F08C2"}.mdi-swim:before{content:"\F04E3"}.mdi-switch:before{content:"\F04E4"}.mdi-sword:before{content:"\F04E5"}.mdi-sword-cross:before{content:"\F0787"}.mdi-syllabary-hangul:before{content:"\F1333"}.mdi-syllabary-hiragana:before{content:"\F1334"}.mdi-syllabary-katakana:before{content:"\F1335"}.mdi-syllabary-katakana-halfwidth:before{content:"\F1336"}.mdi-symbol:before{content:"\F1501"}.mdi-symfony:before{content:"\F0AE6"}.mdi-sync:before{content:"\F04E6"}.mdi-sync-alert:before{content:"\F04E7"}.mdi-sync-circle:before{content:"\F1378"}.mdi-sync-off:before{content:"\F04E8"}.mdi-tab:before{content:"\F04E9"}.mdi-tab-minus:before{content:"\F0B4B"}.mdi-tab-plus:before{content:"\F075C"}.mdi-tab-remove:before{content:"\F0B4C"}.mdi-tab-unselected:before{content:"\F04EA"}.mdi-table:before{content:"\F04EB"}.mdi-table-account:before{content:"\F13B9"}.mdi-table-alert:before{content:"\F13BA"}.mdi-table-arrow-down:before{content:"\F13BB"}.mdi-table-arrow-left:before{content:"\F13BC"}.mdi-table-arrow-right:before{content:"\F13BD"}.mdi-table-arrow-up:before{content:"\F13BE"}.mdi-table-border:before{content:"\F0A18"}.mdi-table-cancel:before{content:"\F13BF"}.mdi-table-chair:before{content:"\F1061"}.mdi-table-check:before{content:"\F13C0"}.mdi-table-clock:before{content:"\F13C1"}.mdi-table-cog:before{content:"\F13C2"}.mdi-table-column:before{content:"\F0835"}.mdi-table-column-plus-after:before{content:"\F04EC"}.mdi-table-column-plus-before:before{content:"\F04ED"}.mdi-table-column-remove:before{content:"\F04EE"}.mdi-table-column-width:before{content:"\F04EF"}.mdi-table-edit:before{content:"\F04F0"}.mdi-table-eye:before{content:"\F1094"}.mdi-table-eye-off:before{content:"\F13C3"}.mdi-table-furniture:before{content:"\F05BC"}.mdi-table-headers-eye:before{content:"\F121D"}.mdi-table-headers-eye-off:before{content:"\F121E"}.mdi-table-heart:before{content:"\F13C4"}.mdi-table-key:before{content:"\F13C5"}.mdi-table-large:before{content:"\F04F1"}.mdi-table-large-plus:before{content:"\F0F87"}.mdi-table-large-remove:before{content:"\F0F88"}.mdi-table-lock:before{content:"\F13C6"}.mdi-table-merge-cells:before{content:"\F09A6"}.mdi-table-minus:before{content:"\F13C7"}.mdi-table-multiple:before{content:"\F13C8"}.mdi-table-network:before{content:"\F13C9"}.mdi-table-of-contents:before{content:"\F0836"}.mdi-table-off:before{content:"\F13CA"}.mdi-table-picnic:before{content:"\F1743"}.mdi-table-plus:before{content:"\F0A75"}.mdi-table-refresh:before{content:"\F13A0"}.mdi-table-remove:before{content:"\F0A76"}.mdi-table-row:before{content:"\F0837"}.mdi-table-row-height:before{content:"\F04F2"}.mdi-table-row-plus-after:before{content:"\F04F3"}.mdi-table-row-plus-before:before{content:"\F04F4"}.mdi-table-row-remove:before{content:"\F04F5"}.mdi-table-search:before{content:"\F090F"}.mdi-table-settings:before{content:"\F0838"}.mdi-table-split-cell:before{content:"\F142A"}.mdi-table-star:before{content:"\F13CB"}.mdi-table-sync:before{content:"\F13A1"}.mdi-table-tennis:before{content:"\F0E68"}.mdi-tablet:before{content:"\F04F6"}.mdi-tablet-android:before{content:"\F04F7"}.mdi-tablet-cellphone:before{content:"\F09A7"}.mdi-tablet-dashboard:before{content:"\F0ECE"}.mdi-tablet-ipad:before{content:"\F04F8"}.mdi-taco:before{content:"\F0762"}.mdi-tag:before{content:"\F04F9"}.mdi-tag-arrow-down:before{content:"\F172B"}.mdi-tag-arrow-down-outline:before{content:"\F172C"}.mdi-tag-arrow-left:before{content:"\F172D"}.mdi-tag-arrow-left-outline:before{content:"\F172E"}.mdi-tag-arrow-right:before{content:"\F172F"}.mdi-tag-arrow-right-outline:before{content:"\F1730"}.mdi-tag-arrow-up:before{content:"\F1731"}.mdi-tag-arrow-up-outline:before{content:"\F1732"}.mdi-tag-faces:before{content:"\F04FA"}.mdi-tag-heart:before{content:"\F068B"}.mdi-tag-heart-outline:before{content:"\F0BCF"}.mdi-tag-minus:before{content:"\F0910"}.mdi-tag-minus-outline:before{content:"\F121F"}.mdi-tag-multiple:before{content:"\F04FB"}.mdi-tag-multiple-outline:before{content:"\F12F7"}.mdi-tag-off:before{content:"\F1220"}.mdi-tag-off-outline:before{content:"\F1221"}.mdi-tag-outline:before{content:"\F04FC"}.mdi-tag-plus:before{content:"\F0722"}.mdi-tag-plus-outline:before{content:"\F1222"}.mdi-tag-remove:before{content:"\F0723"}.mdi-tag-remove-outline:before{content:"\F1223"}.mdi-tag-text:before{content:"\F1224"}.mdi-tag-text-outline:before{content:"\F04FD"}.mdi-tailwind:before{content:"\F13FF"}.mdi-tank:before{content:"\F0D3A"}.mdi-tanker-truck:before{content:"\F0FE5"}.mdi-tape-drive:before{content:"\F16DF"}.mdi-tape-measure:before{content:"\F0B4D"}.mdi-target:before{content:"\F04FE"}.mdi-target-account:before{content:"\F0BD0"}.mdi-target-variant:before{content:"\F0A77"}.mdi-taxi:before{content:"\F04FF"}.mdi-tea:before{content:"\F0D9E"}.mdi-tea-outline:before{content:"\F0D9F"}.mdi-teach:before{content:"\F0890"}.mdi-teamviewer:before{content:"\F0500"}.mdi-telegram:before{content:"\F0501"}.mdi-telescope:before{content:"\F0B4E"}.mdi-television:before{content:"\F0502"}.mdi-television-ambient-light:before{content:"\F1356"}.mdi-television-box:before{content:"\F0839"}.mdi-television-classic:before{content:"\F07F4"}.mdi-television-classic-off:before{content:"\F083A"}.mdi-television-clean:before{content:"\F1110"}.mdi-television-guide:before{content:"\F0503"}.mdi-television-off:before{content:"\F083B"}.mdi-television-pause:before{content:"\F0F89"}.mdi-television-play:before{content:"\F0ECF"}.mdi-television-stop:before{content:"\F0F8A"}.mdi-temperature-celsius:before{content:"\F0504"}.mdi-temperature-fahrenheit:before{content:"\F0505"}.mdi-temperature-kelvin:before{content:"\F0506"}.mdi-tennis:before{content:"\F0DA0"}.mdi-tennis-ball:before{content:"\F0507"}.mdi-tent:before{content:"\F0508"}.mdi-terraform:before{content:"\F1062"}.mdi-terrain:before{content:"\F0509"}.mdi-test-tube:before{content:"\F0668"}.mdi-test-tube-empty:before{content:"\F0911"}.mdi-test-tube-off:before{content:"\F0912"}.mdi-text:before{content:"\F09A8"}.mdi-text-account:before{content:"\F1570"}.mdi-text-box:before{content:"\F021A"}.mdi-text-box-check:before{content:"\F0EA6"}.mdi-text-box-check-outline:before{content:"\F0EA7"}.mdi-text-box-minus:before{content:"\F0EA8"}.mdi-text-box-minus-outline:before{content:"\F0EA9"}.mdi-text-box-multiple:before{content:"\F0AB7"}.mdi-text-box-multiple-outline:before{content:"\F0AB8"}.mdi-text-box-outline:before{content:"\F09ED"}.mdi-text-box-plus:before{content:"\F0EAA"}.mdi-text-box-plus-outline:before{content:"\F0EAB"}.mdi-text-box-remove:before{content:"\F0EAC"}.mdi-text-box-remove-outline:before{content:"\F0EAD"}.mdi-text-box-search:before{content:"\F0EAE"}.mdi-text-box-search-outline:before{content:"\F0EAF"}.mdi-text-recognition:before{content:"\F113D"}.mdi-text-search:before{content:"\F13B8"}.mdi-text-shadow:before{content:"\F0669"}.mdi-text-short:before{content:"\F09A9"}.mdi-text-subject:before{content:"\F09AA"}.mdi-text-to-speech:before{content:"\F050A"}.mdi-text-to-speech-off:before{content:"\F050B"}.mdi-texture:before{content:"\F050C"}.mdi-texture-box:before{content:"\F0FE6"}.mdi-theater:before{content:"\F050D"}.mdi-theme-light-dark:before{content:"\F050E"}.mdi-thermometer:before{content:"\F050F"}.mdi-thermometer-alert:before{content:"\F0E01"}.mdi-thermometer-chevron-down:before{content:"\F0E02"}.mdi-thermometer-chevron-up:before{content:"\F0E03"}.mdi-thermometer-high:before{content:"\F10C2"}.mdi-thermometer-lines:before{content:"\F0510"}.mdi-thermometer-low:before{content:"\F10C3"}.mdi-thermometer-minus:before{content:"\F0E04"}.mdi-thermometer-off:before{content:"\F1531"}.mdi-thermometer-plus:before{content:"\F0E05"}.mdi-thermostat:before{content:"\F0393"}.mdi-thermostat-box:before{content:"\F0891"}.mdi-thought-bubble:before{content:"\F07F6"}.mdi-thought-bubble-outline:before{content:"\F07F7"}.mdi-thumb-down:before{content:"\F0511"}.mdi-thumb-down-outline:before{content:"\F0512"}.mdi-thumb-up:before{content:"\F0513"}.mdi-thumb-up-outline:before{content:"\F0514"}.mdi-thumbs-up-down:before{content:"\F0515"}.mdi-ticket:before{content:"\F0516"}.mdi-ticket-account:before{content:"\F0517"}.mdi-ticket-confirmation:before{content:"\F0518"}.mdi-ticket-confirmation-outline:before{content:"\F13AA"}.mdi-ticket-outline:before{content:"\F0913"}.mdi-ticket-percent:before{content:"\F0724"}.mdi-ticket-percent-outline:before{content:"\F142B"}.mdi-tie:before{content:"\F0519"}.mdi-tilde:before{content:"\F0725"}.mdi-timelapse:before{content:"\F051A"}.mdi-timeline:before{content:"\F0BD1"}.mdi-timeline-alert:before{content:"\F0F95"}.mdi-timeline-alert-outline:before{content:"\F0F98"}.mdi-timeline-check:before{content:"\F1532"}.mdi-timeline-check-outline:before{content:"\F1533"}.mdi-timeline-clock:before{content:"\F11FB"}.mdi-timeline-clock-outline:before{content:"\F11FC"}.mdi-timeline-help:before{content:"\F0F99"}.mdi-timeline-help-outline:before{content:"\F0F9A"}.mdi-timeline-minus:before{content:"\F1534"}.mdi-timeline-minus-outline:before{content:"\F1535"}.mdi-timeline-outline:before{content:"\F0BD2"}.mdi-timeline-plus:before{content:"\F0F96"}.mdi-timeline-plus-outline:before{content:"\F0F97"}.mdi-timeline-remove:before{content:"\F1536"}.mdi-timeline-remove-outline:before{content:"\F1537"}.mdi-timeline-text:before{content:"\F0BD3"}.mdi-timeline-text-outline:before{content:"\F0BD4"}.mdi-timer:before{content:"\F13AB"}.mdi-timer-10:before{content:"\F051C"}.mdi-timer-3:before{content:"\F051D"}.mdi-timer-off:before{content:"\F13AC"}.mdi-timer-off-outline:before{content:"\F051E"}.mdi-timer-outline:before{content:"\F051B"}.mdi-timer-sand:before{content:"\F051F"}.mdi-timer-sand-empty:before{content:"\F06AD"}.mdi-timer-sand-full:before{content:"\F078C"}.mdi-timetable:before{content:"\F0520"}.mdi-toaster:before{content:"\F1063"}.mdi-toaster-off:before{content:"\F11B7"}.mdi-toaster-oven:before{content:"\F0CD3"}.mdi-toggle-switch:before{content:"\F0521"}.mdi-toggle-switch-off:before{content:"\F0522"}.mdi-toggle-switch-off-outline:before{content:"\F0A19"}.mdi-toggle-switch-outline:before{content:"\F0A1A"}.mdi-toilet:before{content:"\F09AB"}.mdi-toolbox:before{content:"\F09AC"}.mdi-toolbox-outline:before{content:"\F09AD"}.mdi-tools:before{content:"\F1064"}.mdi-tooltip:before{content:"\F0523"}.mdi-tooltip-account:before{content:"\F000C"}.mdi-tooltip-check:before{content:"\F155C"}.mdi-tooltip-check-outline:before{content:"\F155D"}.mdi-tooltip-edit:before{content:"\F0524"}.mdi-tooltip-edit-outline:before{content:"\F12C5"}.mdi-tooltip-image:before{content:"\F0525"}.mdi-tooltip-image-outline:before{content:"\F0BD5"}.mdi-tooltip-minus:before{content:"\F155E"}.mdi-tooltip-minus-outline:before{content:"\F155F"}.mdi-tooltip-outline:before{content:"\F0526"}.mdi-tooltip-plus:before{content:"\F0BD6"}.mdi-tooltip-plus-outline:before{content:"\F0527"}.mdi-tooltip-remove:before{content:"\F1560"}.mdi-tooltip-remove-outline:before{content:"\F1561"}.mdi-tooltip-text:before{content:"\F0528"}.mdi-tooltip-text-outline:before{content:"\F0BD7"}.mdi-tooth:before{content:"\F08C3"}.mdi-tooth-outline:before{content:"\F0529"}.mdi-toothbrush:before{content:"\F1129"}.mdi-toothbrush-electric:before{content:"\F112C"}.mdi-toothbrush-paste:before{content:"\F112A"}.mdi-torch:before{content:"\F1606"}.mdi-tortoise:before{content:"\F0D3B"}.mdi-toslink:before{content:"\F12B8"}.mdi-tournament:before{content:"\F09AE"}.mdi-tow-truck:before{content:"\F083C"}.mdi-tower-beach:before{content:"\F0681"}.mdi-tower-fire:before{content:"\F0682"}.mdi-toy-brick:before{content:"\F1288"}.mdi-toy-brick-marker:before{content:"\F1289"}.mdi-toy-brick-marker-outline:before{content:"\F128A"}.mdi-toy-brick-minus:before{content:"\F128B"}.mdi-toy-brick-minus-outline:before{content:"\F128C"}.mdi-toy-brick-outline:before{content:"\F128D"}.mdi-toy-brick-plus:before{content:"\F128E"}.mdi-toy-brick-plus-outline:before{content:"\F128F"}.mdi-toy-brick-remove:before{content:"\F1290"}.mdi-toy-brick-remove-outline:before{content:"\F1291"}.mdi-toy-brick-search:before{content:"\F1292"}.mdi-toy-brick-search-outline:before{content:"\F1293"}.mdi-track-light:before{content:"\F0914"}.mdi-trackpad:before{content:"\F07F8"}.mdi-trackpad-lock:before{content:"\F0933"}.mdi-tractor:before{content:"\F0892"}.mdi-tractor-variant:before{content:"\F14C4"}.mdi-trademark:before{content:"\F0A78"}.mdi-traffic-cone:before{content:"\F137C"}.mdi-traffic-light:before{content:"\F052B"}.mdi-train:before{content:"\F052C"}.mdi-train-car:before{content:"\F0BD8"}.mdi-train-car-passenger:before{content:"\F1733"}.mdi-train-car-passenger-door:before{content:"\F1734"}.mdi-train-car-passenger-door-open:before{content:"\F1735"}.mdi-train-car-passenger-variant:before{content:"\F1736"}.mdi-train-variant:before{content:"\F08C4"}.mdi-tram:before{content:"\F052D"}.mdi-tram-side:before{content:"\F0FE7"}.mdi-transcribe:before{content:"\F052E"}.mdi-transcribe-close:before{content:"\F052F"}.mdi-transfer:before{content:"\F1065"}.mdi-transfer-down:before{content:"\F0DA1"}.mdi-transfer-left:before{content:"\F0DA2"}.mdi-transfer-right:before{content:"\F0530"}.mdi-transfer-up:before{content:"\F0DA3"}.mdi-transit-connection:before{content:"\F0D3C"}.mdi-transit-connection-horizontal:before{content:"\F1546"}.mdi-transit-connection-variant:before{content:"\F0D3D"}.mdi-transit-detour:before{content:"\F0F8B"}.mdi-transit-skip:before{content:"\F1515"}.mdi-transit-transfer:before{content:"\F06AE"}.mdi-transition:before{content:"\F0915"}.mdi-transition-masked:before{content:"\F0916"}.mdi-translate:before{content:"\F05CA"}.mdi-translate-off:before{content:"\F0E06"}.mdi-transmission-tower:before{content:"\F0D3E"}.mdi-trash-can:before{content:"\F0A79"}.mdi-trash-can-outline:before{content:"\F0A7A"}.mdi-tray:before{content:"\F1294"}.mdi-tray-alert:before{content:"\F1295"}.mdi-tray-full:before{content:"\F1296"}.mdi-tray-minus:before{content:"\F1297"}.mdi-tray-plus:before{content:"\F1298"}.mdi-tray-remove:before{content:"\F1299"}.mdi-treasure-chest:before{content:"\F0726"}.mdi-tree:before{content:"\F0531"}.mdi-tree-outline:before{content:"\F0E69"}.mdi-trello:before{content:"\F0532"}.mdi-trending-down:before{content:"\F0533"}.mdi-trending-neutral:before{content:"\F0534"}.mdi-trending-up:before{content:"\F0535"}.mdi-triangle:before{content:"\F0536"}.mdi-triangle-outline:before{content:"\F0537"}.mdi-triangle-wave:before{content:"\F147C"}.mdi-triforce:before{content:"\F0BD9"}.mdi-trophy:before{content:"\F0538"}.mdi-trophy-award:before{content:"\F0539"}.mdi-trophy-broken:before{content:"\F0DA4"}.mdi-trophy-outline:before{content:"\F053A"}.mdi-trophy-variant:before{content:"\F053B"}.mdi-trophy-variant-outline:before{content:"\F053C"}.mdi-truck:before{content:"\F053D"}.mdi-truck-check:before{content:"\F0CD4"}.mdi-truck-check-outline:before{content:"\F129A"}.mdi-truck-delivery:before{content:"\F053E"}.mdi-truck-delivery-outline:before{content:"\F129B"}.mdi-truck-fast:before{content:"\F0788"}.mdi-truck-fast-outline:before{content:"\F129C"}.mdi-truck-outline:before{content:"\F129D"}.mdi-truck-trailer:before{content:"\F0727"}.mdi-trumpet:before{content:"\F1096"}.mdi-tshirt-crew:before{content:"\F0A7B"}.mdi-tshirt-crew-outline:before{content:"\F053F"}.mdi-tshirt-v:before{content:"\F0A7C"}.mdi-tshirt-v-outline:before{content:"\F0540"}.mdi-tumble-dryer:before{content:"\F0917"}.mdi-tumble-dryer-alert:before{content:"\F11BA"}.mdi-tumble-dryer-off:before{content:"\F11BB"}.mdi-tune:before{content:"\F062E"}.mdi-tune-variant:before{content:"\F1542"}.mdi-tune-vertical:before{content:"\F066A"}.mdi-tune-vertical-variant:before{content:"\F1543"}.mdi-turkey:before{content:"\F171B"}.mdi-turnstile:before{content:"\F0CD5"}.mdi-turnstile-outline:before{content:"\F0CD6"}.mdi-turtle:before{content:"\F0CD7"}.mdi-twitch:before{content:"\F0543"}.mdi-twitter:before{content:"\F0544"}.mdi-twitter-retweet:before{content:"\F0547"}.mdi-two-factor-authentication:before{content:"\F09AF"}.mdi-typewriter:before{content:"\F0F2D"}.mdi-ubisoft:before{content:"\F0BDA"}.mdi-ubuntu:before{content:"\F0548"}.mdi-ufo:before{content:"\F10C4"}.mdi-ufo-outline:before{content:"\F10C5"}.mdi-ultra-high-definition:before{content:"\F07F9"}.mdi-umbraco:before{content:"\F0549"}.mdi-umbrella:before{content:"\F054A"}.mdi-umbrella-closed:before{content:"\F09B0"}.mdi-umbrella-closed-outline:before{content:"\F13E2"}.mdi-umbrella-closed-variant:before{content:"\F13E1"}.mdi-umbrella-outline:before{content:"\F054B"}.mdi-undo:before{content:"\F054C"}.mdi-undo-variant:before{content:"\F054D"}.mdi-unfold-less-horizontal:before{content:"\F054E"}.mdi-unfold-less-vertical:before{content:"\F0760"}.mdi-unfold-more-horizontal:before{content:"\F054F"}.mdi-unfold-more-vertical:before{content:"\F0761"}.mdi-ungroup:before{content:"\F0550"}.mdi-unicode:before{content:"\F0ED0"}.mdi-unicorn:before{content:"\F15C2"}.mdi-unicorn-variant:before{content:"\F15C3"}.mdi-unicycle:before{content:"\F15E5"}.mdi-unity:before{content:"\F06AF"}.mdi-unreal:before{content:"\F09B1"}.mdi-untappd:before{content:"\F0551"}.mdi-update:before{content:"\F06B0"}.mdi-upload:before{content:"\F0552"}.mdi-upload-lock:before{content:"\F1373"}.mdi-upload-lock-outline:before{content:"\F1374"}.mdi-upload-multiple:before{content:"\F083D"}.mdi-upload-network:before{content:"\F06F6"}.mdi-upload-network-outline:before{content:"\F0CD8"}.mdi-upload-off:before{content:"\F10C6"}.mdi-upload-off-outline:before{content:"\F10C7"}.mdi-upload-outline:before{content:"\F0E07"}.mdi-usb:before{content:"\F0553"}.mdi-usb-flash-drive:before{content:"\F129E"}.mdi-usb-flash-drive-outline:before{content:"\F129F"}.mdi-usb-port:before{content:"\F11F0"}.mdi-valve:before{content:"\F1066"}.mdi-valve-closed:before{content:"\F1067"}.mdi-valve-open:before{content:"\F1068"}.mdi-van-passenger:before{content:"\F07FA"}.mdi-van-utility:before{content:"\F07FB"}.mdi-vanish:before{content:"\F07FC"}.mdi-vanish-quarter:before{content:"\F1554"}.mdi-vanity-light:before{content:"\F11E1"}.mdi-variable:before{content:"\F0AE7"}.mdi-variable-box:before{content:"\F1111"}.mdi-vector-arrange-above:before{content:"\F0554"}.mdi-vector-arrange-below:before{content:"\F0555"}.mdi-vector-bezier:before{content:"\F0AE8"}.mdi-vector-circle:before{content:"\F0556"}.mdi-vector-circle-variant:before{content:"\F0557"}.mdi-vector-combine:before{content:"\F0558"}.mdi-vector-curve:before{content:"\F0559"}.mdi-vector-difference:before{content:"\F055A"}.mdi-vector-difference-ab:before{content:"\F055B"}.mdi-vector-difference-ba:before{content:"\F055C"}.mdi-vector-ellipse:before{content:"\F0893"}.mdi-vector-intersection:before{content:"\F055D"}.mdi-vector-line:before{content:"\F055E"}.mdi-vector-link:before{content:"\F0FE8"}.mdi-vector-point:before{content:"\F055F"}.mdi-vector-polygon:before{content:"\F0560"}.mdi-vector-polyline:before{content:"\F0561"}.mdi-vector-polyline-edit:before{content:"\F1225"}.mdi-vector-polyline-minus:before{content:"\F1226"}.mdi-vector-polyline-plus:before{content:"\F1227"}.mdi-vector-polyline-remove:before{content:"\F1228"}.mdi-vector-radius:before{content:"\F074A"}.mdi-vector-rectangle:before{content:"\F05C6"}.mdi-vector-selection:before{content:"\F0562"}.mdi-vector-square:before{content:"\F0001"}.mdi-vector-triangle:before{content:"\F0563"}.mdi-vector-union:before{content:"\F0564"}.mdi-vhs:before{content:"\F0A1B"}.mdi-vibrate:before{content:"\F0566"}.mdi-vibrate-off:before{content:"\F0CD9"}.mdi-video:before{content:"\F0567"}.mdi-video-3d:before{content:"\F07FD"}.mdi-video-3d-off:before{content:"\F13D9"}.mdi-video-3d-variant:before{content:"\F0ED1"}.mdi-video-4k-box:before{content:"\F083E"}.mdi-video-account:before{content:"\F0919"}.mdi-video-box:before{content:"\F00FD"}.mdi-video-box-off:before{content:"\F00FE"}.mdi-video-check:before{content:"\F1069"}.mdi-video-check-outline:before{content:"\F106A"}.mdi-video-high-definition:before{content:"\F152E"}.mdi-video-image:before{content:"\F091A"}.mdi-video-input-antenna:before{content:"\F083F"}.mdi-video-input-component:before{content:"\F0840"}.mdi-video-input-hdmi:before{content:"\F0841"}.mdi-video-input-scart:before{content:"\F0F8C"}.mdi-video-input-svideo:before{content:"\F0842"}.mdi-video-minus:before{content:"\F09B2"}.mdi-video-minus-outline:before{content:"\F02BA"}.mdi-video-off:before{content:"\F0568"}.mdi-video-off-outline:before{content:"\F0BDB"}.mdi-video-outline:before{content:"\F0BDC"}.mdi-video-plus:before{content:"\F09B3"}.mdi-video-plus-outline:before{content:"\F01D3"}.mdi-video-stabilization:before{content:"\F091B"}.mdi-video-switch:before{content:"\F0569"}.mdi-video-switch-outline:before{content:"\F0790"}.mdi-video-vintage:before{content:"\F0A1C"}.mdi-video-wireless:before{content:"\F0ED2"}.mdi-video-wireless-outline:before{content:"\F0ED3"}.mdi-view-agenda:before{content:"\F056A"}.mdi-view-agenda-outline:before{content:"\F11D8"}.mdi-view-array:before{content:"\F056B"}.mdi-view-array-outline:before{content:"\F1485"}.mdi-view-carousel:before{content:"\F056C"}.mdi-view-carousel-outline:before{content:"\F1486"}.mdi-view-column:before{content:"\F056D"}.mdi-view-column-outline:before{content:"\F1487"}.mdi-view-comfy:before{content:"\F0E6A"}.mdi-view-comfy-outline:before{content:"\F1488"}.mdi-view-compact:before{content:"\F0E6B"}.mdi-view-compact-outline:before{content:"\F0E6C"}.mdi-view-dashboard:before{content:"\F056E"}.mdi-view-dashboard-outline:before{content:"\F0A1D"}.mdi-view-dashboard-variant:before{content:"\F0843"}.mdi-view-dashboard-variant-outline:before{content:"\F1489"}.mdi-view-day:before{content:"\F056F"}.mdi-view-day-outline:before{content:"\F148A"}.mdi-view-grid:before{content:"\F0570"}.mdi-view-grid-outline:before{content:"\F11D9"}.mdi-view-grid-plus:before{content:"\F0F8D"}.mdi-view-grid-plus-outline:before{content:"\F11DA"}.mdi-view-headline:before{content:"\F0571"}.mdi-view-list:before{content:"\F0572"}.mdi-view-list-outline:before{content:"\F148B"}.mdi-view-module:before{content:"\F0573"}.mdi-view-module-outline:before{content:"\F148C"}.mdi-view-parallel:before{content:"\F0728"}.mdi-view-parallel-outline:before{content:"\F148D"}.mdi-view-quilt:before{content:"\F0574"}.mdi-view-quilt-outline:before{content:"\F148E"}.mdi-view-sequential:before{content:"\F0729"}.mdi-view-sequential-outline:before{content:"\F148F"}.mdi-view-split-horizontal:before{content:"\F0BCB"}.mdi-view-split-vertical:before{content:"\F0BCC"}.mdi-view-stream:before{content:"\F0575"}.mdi-view-stream-outline:before{content:"\F1490"}.mdi-view-week:before{content:"\F0576"}.mdi-view-week-outline:before{content:"\F1491"}.mdi-vimeo:before{content:"\F0577"}.mdi-violin:before{content:"\F060F"}.mdi-virtual-reality:before{content:"\F0894"}.mdi-virus:before{content:"\F13B6"}.mdi-virus-outline:before{content:"\F13B7"}.mdi-vk:before{content:"\F0579"}.mdi-vlc:before{content:"\F057C"}.mdi-voice-off:before{content:"\F0ED4"}.mdi-voicemail:before{content:"\F057D"}.mdi-volleyball:before{content:"\F09B4"}.mdi-volume-high:before{content:"\F057E"}.mdi-volume-low:before{content:"\F057F"}.mdi-volume-medium:before{content:"\F0580"}.mdi-volume-minus:before{content:"\F075E"}.mdi-volume-mute:before{content:"\F075F"}.mdi-volume-off:before{content:"\F0581"}.mdi-volume-plus:before{content:"\F075D"}.mdi-volume-source:before{content:"\F1120"}.mdi-volume-variant-off:before{content:"\F0E08"}.mdi-volume-vibrate:before{content:"\F1121"}.mdi-vote:before{content:"\F0A1F"}.mdi-vote-outline:before{content:"\F0A20"}.mdi-vpn:before{content:"\F0582"}.mdi-vuejs:before{content:"\F0844"}.mdi-vuetify:before{content:"\F0E6D"}.mdi-walk:before{content:"\F0583"}.mdi-wall:before{content:"\F07FE"}.mdi-wall-sconce:before{content:"\F091C"}.mdi-wall-sconce-flat:before{content:"\F091D"}.mdi-wall-sconce-flat-variant:before{content:"\F041C"}.mdi-wall-sconce-round:before{content:"\F0748"}.mdi-wall-sconce-round-variant:before{content:"\F091E"}.mdi-wallet:before{content:"\F0584"}.mdi-wallet-giftcard:before{content:"\F0585"}.mdi-wallet-membership:before{content:"\F0586"}.mdi-wallet-outline:before{content:"\F0BDD"}.mdi-wallet-plus:before{content:"\F0F8E"}.mdi-wallet-plus-outline:before{content:"\F0F8F"}.mdi-wallet-travel:before{content:"\F0587"}.mdi-wallpaper:before{content:"\F0E09"}.mdi-wan:before{content:"\F0588"}.mdi-wardrobe:before{content:"\F0F90"}.mdi-wardrobe-outline:before{content:"\F0F91"}.mdi-warehouse:before{content:"\F0F81"}.mdi-washing-machine:before{content:"\F072A"}.mdi-washing-machine-alert:before{content:"\F11BC"}.mdi-washing-machine-off:before{content:"\F11BD"}.mdi-watch:before{content:"\F0589"}.mdi-watch-export:before{content:"\F058A"}.mdi-watch-export-variant:before{content:"\F0895"}.mdi-watch-import:before{content:"\F058B"}.mdi-watch-import-variant:before{content:"\F0896"}.mdi-watch-variant:before{content:"\F0897"}.mdi-watch-vibrate:before{content:"\F06B1"}.mdi-watch-vibrate-off:before{content:"\F0CDA"}.mdi-water:before{content:"\F058C"}.mdi-water-alert:before{content:"\F1502"}.mdi-water-alert-outline:before{content:"\F1503"}.mdi-water-boiler:before{content:"\F0F92"}.mdi-water-boiler-alert:before{content:"\F11B3"}.mdi-water-boiler-off:before{content:"\F11B4"}.mdi-water-check:before{content:"\F1504"}.mdi-water-check-outline:before{content:"\F1505"}.mdi-water-minus:before{content:"\F1506"}.mdi-water-minus-outline:before{content:"\F1507"}.mdi-water-off:before{content:"\F058D"}.mdi-water-off-outline:before{content:"\F1508"}.mdi-water-outline:before{content:"\F0E0A"}.mdi-water-percent:before{content:"\F058E"}.mdi-water-percent-alert:before{content:"\F1509"}.mdi-water-plus:before{content:"\F150A"}.mdi-water-plus-outline:before{content:"\F150B"}.mdi-water-polo:before{content:"\F12A0"}.mdi-water-pump:before{content:"\F058F"}.mdi-water-pump-off:before{content:"\F0F93"}.mdi-water-remove:before{content:"\F150C"}.mdi-water-remove-outline:before{content:"\F150D"}.mdi-water-well:before{content:"\F106B"}.mdi-water-well-outline:before{content:"\F106C"}.mdi-watering-can:before{content:"\F1481"}.mdi-watering-can-outline:before{content:"\F1482"}.mdi-watermark:before{content:"\F0612"}.mdi-wave:before{content:"\F0F2E"}.mdi-waveform:before{content:"\F147D"}.mdi-waves:before{content:"\F078D"}.mdi-waze:before{content:"\F0BDE"}.mdi-weather-cloudy:before{content:"\F0590"}.mdi-weather-cloudy-alert:before{content:"\F0F2F"}.mdi-weather-cloudy-arrow-right:before{content:"\F0E6E"}.mdi-weather-fog:before{content:"\F0591"}.mdi-weather-hail:before{content:"\F0592"}.mdi-weather-hazy:before{content:"\F0F30"}.mdi-weather-hurricane:before{content:"\F0898"}.mdi-weather-lightning:before{content:"\F0593"}.mdi-weather-lightning-rainy:before{content:"\F067E"}.mdi-weather-night:before{content:"\F0594"}.mdi-weather-night-partly-cloudy:before{content:"\F0F31"}.mdi-weather-partly-cloudy:before{content:"\F0595"}.mdi-weather-partly-lightning:before{content:"\F0F32"}.mdi-weather-partly-rainy:before{content:"\F0F33"}.mdi-weather-partly-snowy:before{content:"\F0F34"}.mdi-weather-partly-snowy-rainy:before{content:"\F0F35"}.mdi-weather-pouring:before{content:"\F0596"}.mdi-weather-rainy:before{content:"\F0597"}.mdi-weather-snowy:before{content:"\F0598"}.mdi-weather-snowy-heavy:before{content:"\F0F36"}.mdi-weather-snowy-rainy:before{content:"\F067F"}.mdi-weather-sunny:before{content:"\F0599"}.mdi-weather-sunny-alert:before{content:"\F0F37"}.mdi-weather-sunny-off:before{content:"\F14E4"}.mdi-weather-sunset:before{content:"\F059A"}.mdi-weather-sunset-down:before{content:"\F059B"}.mdi-weather-sunset-up:before{content:"\F059C"}.mdi-weather-tornado:before{content:"\F0F38"}.mdi-weather-windy:before{content:"\F059D"}.mdi-weather-windy-variant:before{content:"\F059E"}.mdi-web:before{content:"\F059F"}.mdi-web-box:before{content:"\F0F94"}.mdi-web-clock:before{content:"\F124A"}.mdi-webcam:before{content:"\F05A0"}.mdi-webcam-off:before{content:"\F1737"}.mdi-webhook:before{content:"\F062F"}.mdi-webpack:before{content:"\F072B"}.mdi-webrtc:before{content:"\F1248"}.mdi-wechat:before{content:"\F0611"}.mdi-weight:before{content:"\F05A1"}.mdi-weight-gram:before{content:"\F0D3F"}.mdi-weight-kilogram:before{content:"\F05A2"}.mdi-weight-lifter:before{content:"\F115D"}.mdi-weight-pound:before{content:"\F09B5"}.mdi-whatsapp:before{content:"\F05A3"}.mdi-wheel-barrow:before{content:"\F14F2"}.mdi-wheelchair-accessibility:before{content:"\F05A4"}.mdi-whistle:before{content:"\F09B6"}.mdi-whistle-outline:before{content:"\F12BC"}.mdi-white-balance-auto:before{content:"\F05A5"}.mdi-white-balance-incandescent:before{content:"\F05A6"}.mdi-white-balance-iridescent:before{content:"\F05A7"}.mdi-white-balance-sunny:before{content:"\F05A8"}.mdi-widgets:before{content:"\F072C"}.mdi-widgets-outline:before{content:"\F1355"}.mdi-wifi:before{content:"\F05A9"}.mdi-wifi-alert:before{content:"\F16B5"}.mdi-wifi-arrow-down:before{content:"\F16B6"}.mdi-wifi-arrow-left:before{content:"\F16B7"}.mdi-wifi-arrow-left-right:before{content:"\F16B8"}.mdi-wifi-arrow-right:before{content:"\F16B9"}.mdi-wifi-arrow-up:before{content:"\F16BA"}.mdi-wifi-arrow-up-down:before{content:"\F16BB"}.mdi-wifi-cancel:before{content:"\F16BC"}.mdi-wifi-check:before{content:"\F16BD"}.mdi-wifi-cog:before{content:"\F16BE"}.mdi-wifi-lock:before{content:"\F16BF"}.mdi-wifi-lock-open:before{content:"\F16C0"}.mdi-wifi-marker:before{content:"\F16C1"}.mdi-wifi-minus:before{content:"\F16C2"}.mdi-wifi-off:before{content:"\F05AA"}.mdi-wifi-plus:before{content:"\F16C3"}.mdi-wifi-refresh:before{content:"\F16C4"}.mdi-wifi-remove:before{content:"\F16C5"}.mdi-wifi-settings:before{content:"\F16C6"}.mdi-wifi-star:before{content:"\F0E0B"}.mdi-wifi-strength-1:before{content:"\F091F"}.mdi-wifi-strength-1-alert:before{content:"\F0920"}.mdi-wifi-strength-1-lock:before{content:"\F0921"}.mdi-wifi-strength-1-lock-open:before{content:"\F16CB"}.mdi-wifi-strength-2:before{content:"\F0922"}.mdi-wifi-strength-2-alert:before{content:"\F0923"}.mdi-wifi-strength-2-lock:before{content:"\F0924"}.mdi-wifi-strength-2-lock-open:before{content:"\F16CC"}.mdi-wifi-strength-3:before{content:"\F0925"}.mdi-wifi-strength-3-alert:before{content:"\F0926"}.mdi-wifi-strength-3-lock:before{content:"\F0927"}.mdi-wifi-strength-3-lock-open:before{content:"\F16CD"}.mdi-wifi-strength-4:before{content:"\F0928"}.mdi-wifi-strength-4-alert:before{content:"\F0929"}.mdi-wifi-strength-4-lock:before{content:"\F092A"}.mdi-wifi-strength-4-lock-open:before{content:"\F16CE"}.mdi-wifi-strength-alert-outline:before{content:"\F092B"}.mdi-wifi-strength-lock-open-outline:before{content:"\F16CF"}.mdi-wifi-strength-lock-outline:before{content:"\F092C"}.mdi-wifi-strength-off:before{content:"\F092D"}.mdi-wifi-strength-off-outline:before{content:"\F092E"}.mdi-wifi-strength-outline:before{content:"\F092F"}.mdi-wifi-sync:before{content:"\F16C7"}.mdi-wikipedia:before{content:"\F05AC"}.mdi-wind-turbine:before{content:"\F0DA5"}.mdi-window-close:before{content:"\F05AD"}.mdi-window-closed:before{content:"\F05AE"}.mdi-window-closed-variant:before{content:"\F11DB"}.mdi-window-maximize:before{content:"\F05AF"}.mdi-window-minimize:before{content:"\F05B0"}.mdi-window-open:before{content:"\F05B1"}.mdi-window-open-variant:before{content:"\F11DC"}.mdi-window-restore:before{content:"\F05B2"}.mdi-window-shutter:before{content:"\F111C"}.mdi-window-shutter-alert:before{content:"\F111D"}.mdi-window-shutter-open:before{content:"\F111E"}.mdi-windsock:before{content:"\F15FA"}.mdi-wiper:before{content:"\F0AE9"}.mdi-wiper-wash:before{content:"\F0DA6"}.mdi-wizard-hat:before{content:"\F1477"}.mdi-wordpress:before{content:"\F05B4"}.mdi-wrap:before{content:"\F05B6"}.mdi-wrap-disabled:before{content:"\F0BDF"}.mdi-wrench:before{content:"\F05B7"}.mdi-wrench-outline:before{content:"\F0BE0"}.mdi-xamarin:before{content:"\F0845"}.mdi-xamarin-outline:before{content:"\F0846"}.mdi-xing:before{content:"\F05BE"}.mdi-xml:before{content:"\F05C0"}.mdi-xmpp:before{content:"\F07FF"}.mdi-y-combinator:before{content:"\F0624"}.mdi-yahoo:before{content:"\F0B4F"}.mdi-yeast:before{content:"\F05C1"}.mdi-yin-yang:before{content:"\F0680"}.mdi-yoga:before{content:"\F117C"}.mdi-youtube:before{content:"\F05C3"}.mdi-youtube-gaming:before{content:"\F0848"}.mdi-youtube-studio:before{content:"\F0847"}.mdi-youtube-subscription:before{content:"\F0D40"}.mdi-youtube-tv:before{content:"\F0448"}.mdi-yurt:before{content:"\F1516"}.mdi-z-wave:before{content:"\F0AEA"}.mdi-zend:before{content:"\F0AEB"}.mdi-zigbee:before{content:"\F0D41"}.mdi-zip-box:before{content:"\F05C4"}.mdi-zip-box-outline:before{content:"\F0FFA"}.mdi-zip-disk:before{content:"\F0A23"}.mdi-zodiac-aquarius:before{content:"\F0A7D"}.mdi-zodiac-aries:before{content:"\F0A7E"}.mdi-zodiac-cancer:before{content:"\F0A7F"}.mdi-zodiac-capricorn:before{content:"\F0A80"}.mdi-zodiac-gemini:before{content:"\F0A81"}.mdi-zodiac-leo:before{content:"\F0A82"}.mdi-zodiac-libra:before{content:"\F0A83"}.mdi-zodiac-pisces:before{content:"\F0A84"}.mdi-zodiac-sagittarius:before{content:"\F0A85"}.mdi-zodiac-scorpio:before{content:"\F0A86"}.mdi-zodiac-taurus:before{content:"\F0A87"}.mdi-zodiac-virgo:before{content:"\F0A88"}.mdi-blank:before{content:"\F68C";visibility:hidden}.mdi-18px.mdi-set,.mdi-18px.mdi:before{font-size:18px}.mdi-24px.mdi-set,.mdi-24px.mdi:before{font-size:24px}.mdi-36px.mdi-set,.mdi-36px.mdi:before{font-size:36px}.mdi-48px.mdi-set,.mdi-48px.mdi:before{font-size:48px}.mdi-dark:before{color:rgba(0,0,0,.54)}.mdi-dark.mdi-inactive:before{color:rgba(0,0,0,.26)}.mdi-light:before{color:#fff}.mdi-light.mdi-inactive:before{color:hsla(0,0%,100%,.3)}.mdi-rotate-45:before{transform:rotate(45deg)}.mdi-rotate-90:before{transform:rotate(90deg)}.mdi-rotate-135:before{transform:rotate(135deg)}.mdi-rotate-180:before{transform:rotate(180deg)}.mdi-rotate-225:before{transform:rotate(225deg)}.mdi-rotate-270:before{transform:rotate(270deg)}.mdi-rotate-315:before{transform:rotate(315deg)}.mdi-flip-h:before{transform:scaleX(-1);filter:FlipH;-ms-filter:"FlipH"}.mdi-flip-v:before{transform:scaleY(-1);filter:FlipV;-ms-filter:"FlipV"}.mdi-spin:before{animation:mdi-spin 2s linear infinite}@keyframes mdi-spin{0%{transform:rotate(0deg)}to{transform:rotate(359deg)}}.container{width:100%;padding:12px;margin-right:auto;margin-left:auto}@media(min-width:960px){.container{max-width:900px}}@media(min-width:1264px){.container{max-width:1185px}}@media(min-width:1904px){.container{max-width:1785px}}.container--fluid{max-width:100%}.row{display:flex;flex-wrap:wrap;flex:1 1 auto;margin:-12px}.row+.row{margin-top:12px}.row+.row--dense{margin-top:4px}.row--dense{margin:-4px}.row--dense>.col,.row--dense>[class*=col-]{padding:4px}.row.no-gutters{margin:0}.row.no-gutters>.col,.row.no-gutters>[class*=col-]{padding:0}.col,.col-1,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-10,.col-11,.col-12,.col-auto,.col-lg,.col-lg-1,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-auto,.col-md,.col-md-1,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-10,.col-md-11,.col-md-12,.col-md-auto,.col-sm,.col-sm-1,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-auto,.col-xl,.col-xl-1,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-auto{width:100%;padding:12px}.col{flex-basis:0;flex-grow:1;max-width:100%}.col-auto{flex:0 0 auto;width:auto;max-width:100%}.col-1{flex:0 0 8.3333333333%;max-width:8.3333333333%}.col-2{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-3{flex:0 0 25%;max-width:25%}.col-4{flex:0 0 33.3333333333%;max-width:33.3333333333%}.col-5{flex:0 0 41.6666666667%;max-width:41.6666666667%}.col-6{flex:0 0 50%;max-width:50%}.col-7{flex:0 0 58.3333333333%;max-width:58.3333333333%}.col-8{flex:0 0 66.6666666667%;max-width:66.6666666667%}.col-9{flex:0 0 75%;max-width:75%}.col-10{flex:0 0 83.3333333333%;max-width:83.3333333333%}.col-11{flex:0 0 91.6666666667%;max-width:91.6666666667%}.col-12{flex:0 0 100%;max-width:100%}.v-application--is-ltr .offset-1{margin-left:8.3333333333%}.v-application--is-rtl .offset-1{margin-right:8.3333333333%}.v-application--is-ltr .offset-2{margin-left:16.6666666667%}.v-application--is-rtl .offset-2{margin-right:16.6666666667%}.v-application--is-ltr .offset-3{margin-left:25%}.v-application--is-rtl .offset-3{margin-right:25%}.v-application--is-ltr .offset-4{margin-left:33.3333333333%}.v-application--is-rtl .offset-4{margin-right:33.3333333333%}.v-application--is-ltr .offset-5{margin-left:41.6666666667%}.v-application--is-rtl .offset-5{margin-right:41.6666666667%}.v-application--is-ltr .offset-6{margin-left:50%}.v-application--is-rtl .offset-6{margin-right:50%}.v-application--is-ltr .offset-7{margin-left:58.3333333333%}.v-application--is-rtl .offset-7{margin-right:58.3333333333%}.v-application--is-ltr .offset-8{margin-left:66.6666666667%}.v-application--is-rtl .offset-8{margin-right:66.6666666667%}.v-application--is-ltr .offset-9{margin-left:75%}.v-application--is-rtl .offset-9{margin-right:75%}.v-application--is-ltr .offset-10{margin-left:83.3333333333%}.v-application--is-rtl .offset-10{margin-right:83.3333333333%}.v-application--is-ltr .offset-11{margin-left:91.6666666667%}.v-application--is-rtl .offset-11{margin-right:91.6666666667%}@media(min-width:600px){.col-sm{flex-basis:0;flex-grow:1;max-width:100%}.col-sm-auto{flex:0 0 auto;width:auto;max-width:100%}.col-sm-1{flex:0 0 8.3333333333%;max-width:8.3333333333%}.col-sm-2{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-sm-3{flex:0 0 25%;max-width:25%}.col-sm-4{flex:0 0 33.3333333333%;max-width:33.3333333333%}.col-sm-5{flex:0 0 41.6666666667%;max-width:41.6666666667%}.col-sm-6{flex:0 0 50%;max-width:50%}.col-sm-7{flex:0 0 58.3333333333%;max-width:58.3333333333%}.col-sm-8{flex:0 0 66.6666666667%;max-width:66.6666666667%}.col-sm-9{flex:0 0 75%;max-width:75%}.col-sm-10{flex:0 0 83.3333333333%;max-width:83.3333333333%}.col-sm-11{flex:0 0 91.6666666667%;max-width:91.6666666667%}.col-sm-12{flex:0 0 100%;max-width:100%}.v-application--is-ltr .offset-sm-0{margin-left:0}.v-application--is-rtl .offset-sm-0{margin-right:0}.v-application--is-ltr .offset-sm-1{margin-left:8.3333333333%}.v-application--is-rtl .offset-sm-1{margin-right:8.3333333333%}.v-application--is-ltr .offset-sm-2{margin-left:16.6666666667%}.v-application--is-rtl .offset-sm-2{margin-right:16.6666666667%}.v-application--is-ltr .offset-sm-3{margin-left:25%}.v-application--is-rtl .offset-sm-3{margin-right:25%}.v-application--is-ltr .offset-sm-4{margin-left:33.3333333333%}.v-application--is-rtl .offset-sm-4{margin-right:33.3333333333%}.v-application--is-ltr .offset-sm-5{margin-left:41.6666666667%}.v-application--is-rtl .offset-sm-5{margin-right:41.6666666667%}.v-application--is-ltr .offset-sm-6{margin-left:50%}.v-application--is-rtl .offset-sm-6{margin-right:50%}.v-application--is-ltr .offset-sm-7{margin-left:58.3333333333%}.v-application--is-rtl .offset-sm-7{margin-right:58.3333333333%}.v-application--is-ltr .offset-sm-8{margin-left:66.6666666667%}.v-application--is-rtl .offset-sm-8{margin-right:66.6666666667%}.v-application--is-ltr .offset-sm-9{margin-left:75%}.v-application--is-rtl .offset-sm-9{margin-right:75%}.v-application--is-ltr .offset-sm-10{margin-left:83.3333333333%}.v-application--is-rtl .offset-sm-10{margin-right:83.3333333333%}.v-application--is-ltr .offset-sm-11{margin-left:91.6666666667%}.v-application--is-rtl .offset-sm-11{margin-right:91.6666666667%}}@media(min-width:960px){.col-md{flex-basis:0;flex-grow:1;max-width:100%}.col-md-auto{flex:0 0 auto;width:auto;max-width:100%}.col-md-1{flex:0 0 8.3333333333%;max-width:8.3333333333%}.col-md-2{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-md-3{flex:0 0 25%;max-width:25%}.col-md-4{flex:0 0 33.3333333333%;max-width:33.3333333333%}.col-md-5{flex:0 0 41.6666666667%;max-width:41.6666666667%}.col-md-6{flex:0 0 50%;max-width:50%}.col-md-7{flex:0 0 58.3333333333%;max-width:58.3333333333%}.col-md-8{flex:0 0 66.6666666667%;max-width:66.6666666667%}.col-md-9{flex:0 0 75%;max-width:75%}.col-md-10{flex:0 0 83.3333333333%;max-width:83.3333333333%}.col-md-11{flex:0 0 91.6666666667%;max-width:91.6666666667%}.col-md-12{flex:0 0 100%;max-width:100%}.v-application--is-ltr .offset-md-0{margin-left:0}.v-application--is-rtl .offset-md-0{margin-right:0}.v-application--is-ltr .offset-md-1{margin-left:8.3333333333%}.v-application--is-rtl .offset-md-1{margin-right:8.3333333333%}.v-application--is-ltr .offset-md-2{margin-left:16.6666666667%}.v-application--is-rtl .offset-md-2{margin-right:16.6666666667%}.v-application--is-ltr .offset-md-3{margin-left:25%}.v-application--is-rtl .offset-md-3{margin-right:25%}.v-application--is-ltr .offset-md-4{margin-left:33.3333333333%}.v-application--is-rtl .offset-md-4{margin-right:33.3333333333%}.v-application--is-ltr .offset-md-5{margin-left:41.6666666667%}.v-application--is-rtl .offset-md-5{margin-right:41.6666666667%}.v-application--is-ltr .offset-md-6{margin-left:50%}.v-application--is-rtl .offset-md-6{margin-right:50%}.v-application--is-ltr .offset-md-7{margin-left:58.3333333333%}.v-application--is-rtl .offset-md-7{margin-right:58.3333333333%}.v-application--is-ltr .offset-md-8{margin-left:66.6666666667%}.v-application--is-rtl .offset-md-8{margin-right:66.6666666667%}.v-application--is-ltr .offset-md-9{margin-left:75%}.v-application--is-rtl .offset-md-9{margin-right:75%}.v-application--is-ltr .offset-md-10{margin-left:83.3333333333%}.v-application--is-rtl .offset-md-10{margin-right:83.3333333333%}.v-application--is-ltr .offset-md-11{margin-left:91.6666666667%}.v-application--is-rtl .offset-md-11{margin-right:91.6666666667%}}@media(min-width:1264px){.col-lg{flex-basis:0;flex-grow:1;max-width:100%}.col-lg-auto{flex:0 0 auto;width:auto;max-width:100%}.col-lg-1{flex:0 0 8.3333333333%;max-width:8.3333333333%}.col-lg-2{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-lg-3{flex:0 0 25%;max-width:25%}.col-lg-4{flex:0 0 33.3333333333%;max-width:33.3333333333%}.col-lg-5{flex:0 0 41.6666666667%;max-width:41.6666666667%}.col-lg-6{flex:0 0 50%;max-width:50%}.col-lg-7{flex:0 0 58.3333333333%;max-width:58.3333333333%}.col-lg-8{flex:0 0 66.6666666667%;max-width:66.6666666667%}.col-lg-9{flex:0 0 75%;max-width:75%}.col-lg-10{flex:0 0 83.3333333333%;max-width:83.3333333333%}.col-lg-11{flex:0 0 91.6666666667%;max-width:91.6666666667%}.col-lg-12{flex:0 0 100%;max-width:100%}.v-application--is-ltr .offset-lg-0{margin-left:0}.v-application--is-rtl .offset-lg-0{margin-right:0}.v-application--is-ltr .offset-lg-1{margin-left:8.3333333333%}.v-application--is-rtl .offset-lg-1{margin-right:8.3333333333%}.v-application--is-ltr .offset-lg-2{margin-left:16.6666666667%}.v-application--is-rtl .offset-lg-2{margin-right:16.6666666667%}.v-application--is-ltr .offset-lg-3{margin-left:25%}.v-application--is-rtl .offset-lg-3{margin-right:25%}.v-application--is-ltr .offset-lg-4{margin-left:33.3333333333%}.v-application--is-rtl .offset-lg-4{margin-right:33.3333333333%}.v-application--is-ltr .offset-lg-5{margin-left:41.6666666667%}.v-application--is-rtl .offset-lg-5{margin-right:41.6666666667%}.v-application--is-ltr .offset-lg-6{margin-left:50%}.v-application--is-rtl .offset-lg-6{margin-right:50%}.v-application--is-ltr .offset-lg-7{margin-left:58.3333333333%}.v-application--is-rtl .offset-lg-7{margin-right:58.3333333333%}.v-application--is-ltr .offset-lg-8{margin-left:66.6666666667%}.v-application--is-rtl .offset-lg-8{margin-right:66.6666666667%}.v-application--is-ltr .offset-lg-9{margin-left:75%}.v-application--is-rtl .offset-lg-9{margin-right:75%}.v-application--is-ltr .offset-lg-10{margin-left:83.3333333333%}.v-application--is-rtl .offset-lg-10{margin-right:83.3333333333%}.v-application--is-ltr .offset-lg-11{margin-left:91.6666666667%}.v-application--is-rtl .offset-lg-11{margin-right:91.6666666667%}}@media(min-width:1904px){.col-xl{flex-basis:0;flex-grow:1;max-width:100%}.col-xl-auto{flex:0 0 auto;width:auto;max-width:100%}.col-xl-1{flex:0 0 8.3333333333%;max-width:8.3333333333%}.col-xl-2{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-xl-3{flex:0 0 25%;max-width:25%}.col-xl-4{flex:0 0 33.3333333333%;max-width:33.3333333333%}.col-xl-5{flex:0 0 41.6666666667%;max-width:41.6666666667%}.col-xl-6{flex:0 0 50%;max-width:50%}.col-xl-7{flex:0 0 58.3333333333%;max-width:58.3333333333%}.col-xl-8{flex:0 0 66.6666666667%;max-width:66.6666666667%}.col-xl-9{flex:0 0 75%;max-width:75%}.col-xl-10{flex:0 0 83.3333333333%;max-width:83.3333333333%}.col-xl-11{flex:0 0 91.6666666667%;max-width:91.6666666667%}.col-xl-12{flex:0 0 100%;max-width:100%}.v-application--is-ltr .offset-xl-0{margin-left:0}.v-application--is-rtl .offset-xl-0{margin-right:0}.v-application--is-ltr .offset-xl-1{margin-left:8.3333333333%}.v-application--is-rtl .offset-xl-1{margin-right:8.3333333333%}.v-application--is-ltr .offset-xl-2{margin-left:16.6666666667%}.v-application--is-rtl .offset-xl-2{margin-right:16.6666666667%}.v-application--is-ltr .offset-xl-3{margin-left:25%}.v-application--is-rtl .offset-xl-3{margin-right:25%}.v-application--is-ltr .offset-xl-4{margin-left:33.3333333333%}.v-application--is-rtl .offset-xl-4{margin-right:33.3333333333%}.v-application--is-ltr .offset-xl-5{margin-left:41.6666666667%}.v-application--is-rtl .offset-xl-5{margin-right:41.6666666667%}.v-application--is-ltr .offset-xl-6{margin-left:50%}.v-application--is-rtl .offset-xl-6{margin-right:50%}.v-application--is-ltr .offset-xl-7{margin-left:58.3333333333%}.v-application--is-rtl .offset-xl-7{margin-right:58.3333333333%}.v-application--is-ltr .offset-xl-8{margin-left:66.6666666667%}.v-application--is-rtl .offset-xl-8{margin-right:66.6666666667%}.v-application--is-ltr .offset-xl-9{margin-left:75%}.v-application--is-rtl .offset-xl-9{margin-right:75%}.v-application--is-ltr .offset-xl-10{margin-left:83.3333333333%}.v-application--is-rtl .offset-xl-10{margin-right:83.3333333333%}.v-application--is-ltr .offset-xl-11{margin-left:91.6666666667%}.v-application--is-rtl .offset-xl-11{margin-right:91.6666666667%}}.v-dialog{border-radius:4px;margin:24px;overflow-y:auto;pointer-events:auto;transition:.3s cubic-bezier(.25,.8,.25,1);width:100%;z-index:inherit;box-shadow:0 11px 15px -7px rgba(0,0,0,.2),0 24px 38px 3px rgba(0,0,0,.14),0 9px 46px 8px rgba(0,0,0,.12)}.v-dialog:not(.v-dialog--fullscreen){max-height:90%}.v-dialog>*{width:100%}.v-dialog>.v-card>.v-card__title{font-size:1.25rem;font-weight:500;letter-spacing:.0125em;padding:16px 24px 10px}.v-dialog>.v-card>.v-card__subtitle,.v-dialog>.v-card>.v-card__text{padding:0 24px 20px}.v-dialog>.v-card>.v-card__actions{padding:8px 16px}.v-dialog__content{align-items:center;display:flex;height:100%;justify-content:center;left:0;pointer-events:none;position:fixed;top:0;transition:.2s cubic-bezier(.25,.8,.25,1),z-index 1ms;width:100%;z-index:6;outline:none}.v-dialog__container{display:none}.v-dialog__container--attached{display:inline}.v-dialog--animated{animation-duration:.15s;animation-name:animate-dialog;animation-timing-function:cubic-bezier(.25,.8,.25,1)}.v-dialog--fullscreen{border-radius:0;margin:0;height:100%;position:fixed;overflow-y:auto;top:0;left:0}.v-dialog--fullscreen>.v-card{min-height:100%;min-width:100%;margin:0!important;padding:0!important}.v-dialog--scrollable,.v-dialog--scrollable>form{display:flex}.v-dialog--scrollable>.v-card,.v-dialog--scrollable>form>.v-card{display:flex;flex:1 1 100%;flex-direction:column;max-height:100%;max-width:100%}.v-dialog--scrollable>.v-card>.v-card__actions,.v-dialog--scrollable>.v-card>.v-card__title,.v-dialog--scrollable>form>.v-card>.v-card__actions,.v-dialog--scrollable>form>.v-card>.v-card__title{flex:0 0 auto}.v-dialog--scrollable>.v-card>.v-card__text,.v-dialog--scrollable>form>.v-card>.v-card__text{backface-visibility:hidden;flex:1 1 auto;overflow-y:auto}@keyframes animate-dialog{0%{transform:scale(1)}50%{transform:scale(1.03)}to{transform:scale(1)}}.theme--light.v-overlay{color:rgba(0,0,0,.87)}.theme--dark.v-overlay{color:#fff}.v-overlay{align-items:center;border-radius:inherit;display:flex;justify-content:center;position:fixed;top:0;left:0;right:0;bottom:0;pointer-events:none;transition:.3s cubic-bezier(.25,.8,.5,1),z-index 1ms}.v-overlay__content{position:relative}.v-overlay__scrim{border-radius:inherit;bottom:0;height:100%;left:0;position:absolute;right:0;top:0;transition:inherit;width:100%;will-change:opacity}.v-overlay--absolute{position:absolute}.v-overlay--active{pointer-events:auto}.theme--light.v-divider{border-color:rgba(0,0,0,.12)}.theme--dark.v-divider{border-color:hsla(0,0%,100%,.12)}.v-divider{display:block;flex:1 1 0px;max-width:100%;height:0;max-height:0;border:solid;border-width:thin 0 0 0;transition:inherit}.v-divider--inset:not(.v-divider--vertical){max-width:calc(100% - 72px)}.v-application--is-ltr .v-divider--inset:not(.v-divider--vertical){margin-left:72px}.v-application--is-rtl .v-divider--inset:not(.v-divider--vertical){margin-right:72px}.v-divider--vertical{align-self:stretch;border:solid;border-width:0 thin 0 0;display:inline-flex;height:inherit;min-height:100%;max-height:100%;max-width:0;width:0;vertical-align:text-bottom;margin:0 -1px}.v-divider--vertical.v-divider--inset{margin-top:8px;min-height:0;max-height:calc(100% - 16px)}.container.grow-shrink-0{flex-grow:0;flex-shrink:0}.container.fill-height{align-items:center;display:flex;flex-wrap:wrap}.container.fill-height>.row{flex:1 1 100%;max-width:calc(100% + 24px)}.container.fill-height>.layout{height:100%;flex:1 1 auto}.container.fill-height>.layout.grow-shrink-0{flex-grow:0;flex-shrink:0}.container.grid-list-xs .layout .flex{padding:1px}.container.grid-list-xs .layout:only-child{margin:-1px}.container.grid-list-xs .layout:not(:only-child){margin:auto -1px}.container.grid-list-xs :not(:only-child) .layout:first-child{margin-top:-1px}.container.grid-list-xs :not(:only-child) .layout:last-child{margin-bottom:-1px}.container.grid-list-sm .layout .flex{padding:2px}.container.grid-list-sm .layout:only-child{margin:-2px}.container.grid-list-sm .layout:not(:only-child){margin:auto -2px}.container.grid-list-sm :not(:only-child) .layout:first-child{margin-top:-2px}.container.grid-list-sm :not(:only-child) .layout:last-child{margin-bottom:-2px}.container.grid-list-md .layout .flex{padding:4px}.container.grid-list-md .layout:only-child{margin:-4px}.container.grid-list-md .layout:not(:only-child){margin:auto -4px}.container.grid-list-md :not(:only-child) .layout:first-child{margin-top:-4px}.container.grid-list-md :not(:only-child) .layout:last-child{margin-bottom:-4px}.container.grid-list-lg .layout .flex{padding:8px}.container.grid-list-lg .layout:only-child{margin:-8px}.container.grid-list-lg .layout:not(:only-child){margin:auto -8px}.container.grid-list-lg :not(:only-child) .layout:first-child{margin-top:-8px}.container.grid-list-lg :not(:only-child) .layout:last-child{margin-bottom:-8px}.container.grid-list-xl .layout .flex{padding:12px}.container.grid-list-xl .layout:only-child{margin:-12px}.container.grid-list-xl .layout:not(:only-child){margin:auto -12px}.container.grid-list-xl :not(:only-child) .layout:first-child{margin-top:-12px}.container.grid-list-xl :not(:only-child) .layout:last-child{margin-bottom:-12px}.layout{display:flex;flex:1 1 auto;flex-wrap:nowrap;min-width:0}.layout.reverse{flex-direction:row-reverse}.layout.column{flex-direction:column}.layout.column.reverse{flex-direction:column-reverse}.layout.column>.flex{max-width:100%}.layout.wrap{flex-wrap:wrap}.layout.grow-shrink-0{flex-grow:0;flex-shrink:0}@media (min-width:0){.flex.xs12{flex-basis:100%;flex-grow:0;max-width:100%}.flex.order-xs12{order:12}.flex.xs11{flex-basis:91.6666666667%;flex-grow:0;max-width:91.6666666667%}.flex.order-xs11{order:11}.flex.xs10{flex-basis:83.3333333333%;flex-grow:0;max-width:83.3333333333%}.flex.order-xs10{order:10}.flex.xs9{flex-basis:75%;flex-grow:0;max-width:75%}.flex.order-xs9{order:9}.flex.xs8{flex-basis:66.6666666667%;flex-grow:0;max-width:66.6666666667%}.flex.order-xs8{order:8}.flex.xs7{flex-basis:58.3333333333%;flex-grow:0;max-width:58.3333333333%}.flex.order-xs7{order:7}.flex.xs6{flex-basis:50%;flex-grow:0;max-width:50%}.flex.order-xs6{order:6}.flex.xs5{flex-basis:41.6666666667%;flex-grow:0;max-width:41.6666666667%}.flex.order-xs5{order:5}.flex.xs4{flex-basis:33.3333333333%;flex-grow:0;max-width:33.3333333333%}.flex.order-xs4{order:4}.flex.xs3{flex-basis:25%;flex-grow:0;max-width:25%}.flex.order-xs3{order:3}.flex.xs2{flex-basis:16.6666666667%;flex-grow:0;max-width:16.6666666667%}.flex.order-xs2{order:2}.flex.xs1{flex-basis:8.3333333333%;flex-grow:0;max-width:8.3333333333%}.flex.order-xs1{order:1}.v-application--is-ltr .flex.offset-xs12{margin-left:100%}.v-application--is-rtl .flex.offset-xs12{margin-right:100%}.v-application--is-ltr .flex.offset-xs11{margin-left:91.6666666667%}.v-application--is-rtl .flex.offset-xs11{margin-right:91.6666666667%}.v-application--is-ltr .flex.offset-xs10{margin-left:83.3333333333%}.v-application--is-rtl .flex.offset-xs10{margin-right:83.3333333333%}.v-application--is-ltr .flex.offset-xs9{margin-left:75%}.v-application--is-rtl .flex.offset-xs9{margin-right:75%}.v-application--is-ltr .flex.offset-xs8{margin-left:66.6666666667%}.v-application--is-rtl .flex.offset-xs8{margin-right:66.6666666667%}.v-application--is-ltr .flex.offset-xs7{margin-left:58.3333333333%}.v-application--is-rtl .flex.offset-xs7{margin-right:58.3333333333%}.v-application--is-ltr .flex.offset-xs6{margin-left:50%}.v-application--is-rtl .flex.offset-xs6{margin-right:50%}.v-application--is-ltr .flex.offset-xs5{margin-left:41.6666666667%}.v-application--is-rtl .flex.offset-xs5{margin-right:41.6666666667%}.v-application--is-ltr .flex.offset-xs4{margin-left:33.3333333333%}.v-application--is-rtl .flex.offset-xs4{margin-right:33.3333333333%}.v-application--is-ltr .flex.offset-xs3{margin-left:25%}.v-application--is-rtl .flex.offset-xs3{margin-right:25%}.v-application--is-ltr .flex.offset-xs2{margin-left:16.6666666667%}.v-application--is-rtl .flex.offset-xs2{margin-right:16.6666666667%}.v-application--is-ltr .flex.offset-xs1{margin-left:8.3333333333%}.v-application--is-rtl .flex.offset-xs1{margin-right:8.3333333333%}.v-application--is-ltr .flex.offset-xs0{margin-left:0}.v-application--is-rtl .flex.offset-xs0{margin-right:0}}@media (min-width:600px){.flex.sm12{flex-basis:100%;flex-grow:0;max-width:100%}.flex.order-sm12{order:12}.flex.sm11{flex-basis:91.6666666667%;flex-grow:0;max-width:91.6666666667%}.flex.order-sm11{order:11}.flex.sm10{flex-basis:83.3333333333%;flex-grow:0;max-width:83.3333333333%}.flex.order-sm10{order:10}.flex.sm9{flex-basis:75%;flex-grow:0;max-width:75%}.flex.order-sm9{order:9}.flex.sm8{flex-basis:66.6666666667%;flex-grow:0;max-width:66.6666666667%}.flex.order-sm8{order:8}.flex.sm7{flex-basis:58.3333333333%;flex-grow:0;max-width:58.3333333333%}.flex.order-sm7{order:7}.flex.sm6{flex-basis:50%;flex-grow:0;max-width:50%}.flex.order-sm6{order:6}.flex.sm5{flex-basis:41.6666666667%;flex-grow:0;max-width:41.6666666667%}.flex.order-sm5{order:5}.flex.sm4{flex-basis:33.3333333333%;flex-grow:0;max-width:33.3333333333%}.flex.order-sm4{order:4}.flex.sm3{flex-basis:25%;flex-grow:0;max-width:25%}.flex.order-sm3{order:3}.flex.sm2{flex-basis:16.6666666667%;flex-grow:0;max-width:16.6666666667%}.flex.order-sm2{order:2}.flex.sm1{flex-basis:8.3333333333%;flex-grow:0;max-width:8.3333333333%}.flex.order-sm1{order:1}.v-application--is-ltr .flex.offset-sm12{margin-left:100%}.v-application--is-rtl .flex.offset-sm12{margin-right:100%}.v-application--is-ltr .flex.offset-sm11{margin-left:91.6666666667%}.v-application--is-rtl .flex.offset-sm11{margin-right:91.6666666667%}.v-application--is-ltr .flex.offset-sm10{margin-left:83.3333333333%}.v-application--is-rtl .flex.offset-sm10{margin-right:83.3333333333%}.v-application--is-ltr .flex.offset-sm9{margin-left:75%}.v-application--is-rtl .flex.offset-sm9{margin-right:75%}.v-application--is-ltr .flex.offset-sm8{margin-left:66.6666666667%}.v-application--is-rtl .flex.offset-sm8{margin-right:66.6666666667%}.v-application--is-ltr .flex.offset-sm7{margin-left:58.3333333333%}.v-application--is-rtl .flex.offset-sm7{margin-right:58.3333333333%}.v-application--is-ltr .flex.offset-sm6{margin-left:50%}.v-application--is-rtl .flex.offset-sm6{margin-right:50%}.v-application--is-ltr .flex.offset-sm5{margin-left:41.6666666667%}.v-application--is-rtl .flex.offset-sm5{margin-right:41.6666666667%}.v-application--is-ltr .flex.offset-sm4{margin-left:33.3333333333%}.v-application--is-rtl .flex.offset-sm4{margin-right:33.3333333333%}.v-application--is-ltr .flex.offset-sm3{margin-left:25%}.v-application--is-rtl .flex.offset-sm3{margin-right:25%}.v-application--is-ltr .flex.offset-sm2{margin-left:16.6666666667%}.v-application--is-rtl .flex.offset-sm2{margin-right:16.6666666667%}.v-application--is-ltr .flex.offset-sm1{margin-left:8.3333333333%}.v-application--is-rtl .flex.offset-sm1{margin-right:8.3333333333%}.v-application--is-ltr .flex.offset-sm0{margin-left:0}.v-application--is-rtl .flex.offset-sm0{margin-right:0}}@media (min-width:960px){.flex.md12{flex-basis:100%;flex-grow:0;max-width:100%}.flex.order-md12{order:12}.flex.md11{flex-basis:91.6666666667%;flex-grow:0;max-width:91.6666666667%}.flex.order-md11{order:11}.flex.md10{flex-basis:83.3333333333%;flex-grow:0;max-width:83.3333333333%}.flex.order-md10{order:10}.flex.md9{flex-basis:75%;flex-grow:0;max-width:75%}.flex.order-md9{order:9}.flex.md8{flex-basis:66.6666666667%;flex-grow:0;max-width:66.6666666667%}.flex.order-md8{order:8}.flex.md7{flex-basis:58.3333333333%;flex-grow:0;max-width:58.3333333333%}.flex.order-md7{order:7}.flex.md6{flex-basis:50%;flex-grow:0;max-width:50%}.flex.order-md6{order:6}.flex.md5{flex-basis:41.6666666667%;flex-grow:0;max-width:41.6666666667%}.flex.order-md5{order:5}.flex.md4{flex-basis:33.3333333333%;flex-grow:0;max-width:33.3333333333%}.flex.order-md4{order:4}.flex.md3{flex-basis:25%;flex-grow:0;max-width:25%}.flex.order-md3{order:3}.flex.md2{flex-basis:16.6666666667%;flex-grow:0;max-width:16.6666666667%}.flex.order-md2{order:2}.flex.md1{flex-basis:8.3333333333%;flex-grow:0;max-width:8.3333333333%}.flex.order-md1{order:1}.v-application--is-ltr .flex.offset-md12{margin-left:100%}.v-application--is-rtl .flex.offset-md12{margin-right:100%}.v-application--is-ltr .flex.offset-md11{margin-left:91.6666666667%}.v-application--is-rtl .flex.offset-md11{margin-right:91.6666666667%}.v-application--is-ltr .flex.offset-md10{margin-left:83.3333333333%}.v-application--is-rtl .flex.offset-md10{margin-right:83.3333333333%}.v-application--is-ltr .flex.offset-md9{margin-left:75%}.v-application--is-rtl .flex.offset-md9{margin-right:75%}.v-application--is-ltr .flex.offset-md8{margin-left:66.6666666667%}.v-application--is-rtl .flex.offset-md8{margin-right:66.6666666667%}.v-application--is-ltr .flex.offset-md7{margin-left:58.3333333333%}.v-application--is-rtl .flex.offset-md7{margin-right:58.3333333333%}.v-application--is-ltr .flex.offset-md6{margin-left:50%}.v-application--is-rtl .flex.offset-md6{margin-right:50%}.v-application--is-ltr .flex.offset-md5{margin-left:41.6666666667%}.v-application--is-rtl .flex.offset-md5{margin-right:41.6666666667%}.v-application--is-ltr .flex.offset-md4{margin-left:33.3333333333%}.v-application--is-rtl .flex.offset-md4{margin-right:33.3333333333%}.v-application--is-ltr .flex.offset-md3{margin-left:25%}.v-application--is-rtl .flex.offset-md3{margin-right:25%}.v-application--is-ltr .flex.offset-md2{margin-left:16.6666666667%}.v-application--is-rtl .flex.offset-md2{margin-right:16.6666666667%}.v-application--is-ltr .flex.offset-md1{margin-left:8.3333333333%}.v-application--is-rtl .flex.offset-md1{margin-right:8.3333333333%}.v-application--is-ltr .flex.offset-md0{margin-left:0}.v-application--is-rtl .flex.offset-md0{margin-right:0}}@media (min-width:1264px){.flex.lg12{flex-basis:100%;flex-grow:0;max-width:100%}.flex.order-lg12{order:12}.flex.lg11{flex-basis:91.6666666667%;flex-grow:0;max-width:91.6666666667%}.flex.order-lg11{order:11}.flex.lg10{flex-basis:83.3333333333%;flex-grow:0;max-width:83.3333333333%}.flex.order-lg10{order:10}.flex.lg9{flex-basis:75%;flex-grow:0;max-width:75%}.flex.order-lg9{order:9}.flex.lg8{flex-basis:66.6666666667%;flex-grow:0;max-width:66.6666666667%}.flex.order-lg8{order:8}.flex.lg7{flex-basis:58.3333333333%;flex-grow:0;max-width:58.3333333333%}.flex.order-lg7{order:7}.flex.lg6{flex-basis:50%;flex-grow:0;max-width:50%}.flex.order-lg6{order:6}.flex.lg5{flex-basis:41.6666666667%;flex-grow:0;max-width:41.6666666667%}.flex.order-lg5{order:5}.flex.lg4{flex-basis:33.3333333333%;flex-grow:0;max-width:33.3333333333%}.flex.order-lg4{order:4}.flex.lg3{flex-basis:25%;flex-grow:0;max-width:25%}.flex.order-lg3{order:3}.flex.lg2{flex-basis:16.6666666667%;flex-grow:0;max-width:16.6666666667%}.flex.order-lg2{order:2}.flex.lg1{flex-basis:8.3333333333%;flex-grow:0;max-width:8.3333333333%}.flex.order-lg1{order:1}.v-application--is-ltr .flex.offset-lg12{margin-left:100%}.v-application--is-rtl .flex.offset-lg12{margin-right:100%}.v-application--is-ltr .flex.offset-lg11{margin-left:91.6666666667%}.v-application--is-rtl .flex.offset-lg11{margin-right:91.6666666667%}.v-application--is-ltr .flex.offset-lg10{margin-left:83.3333333333%}.v-application--is-rtl .flex.offset-lg10{margin-right:83.3333333333%}.v-application--is-ltr .flex.offset-lg9{margin-left:75%}.v-application--is-rtl .flex.offset-lg9{margin-right:75%}.v-application--is-ltr .flex.offset-lg8{margin-left:66.6666666667%}.v-application--is-rtl .flex.offset-lg8{margin-right:66.6666666667%}.v-application--is-ltr .flex.offset-lg7{margin-left:58.3333333333%}.v-application--is-rtl .flex.offset-lg7{margin-right:58.3333333333%}.v-application--is-ltr .flex.offset-lg6{margin-left:50%}.v-application--is-rtl .flex.offset-lg6{margin-right:50%}.v-application--is-ltr .flex.offset-lg5{margin-left:41.6666666667%}.v-application--is-rtl .flex.offset-lg5{margin-right:41.6666666667%}.v-application--is-ltr .flex.offset-lg4{margin-left:33.3333333333%}.v-application--is-rtl .flex.offset-lg4{margin-right:33.3333333333%}.v-application--is-ltr .flex.offset-lg3{margin-left:25%}.v-application--is-rtl .flex.offset-lg3{margin-right:25%}.v-application--is-ltr .flex.offset-lg2{margin-left:16.6666666667%}.v-application--is-rtl .flex.offset-lg2{margin-right:16.6666666667%}.v-application--is-ltr .flex.offset-lg1{margin-left:8.3333333333%}.v-application--is-rtl .flex.offset-lg1{margin-right:8.3333333333%}.v-application--is-ltr .flex.offset-lg0{margin-left:0}.v-application--is-rtl .flex.offset-lg0{margin-right:0}}@media (min-width:1904px){.flex.xl12{flex-basis:100%;flex-grow:0;max-width:100%}.flex.order-xl12{order:12}.flex.xl11{flex-basis:91.6666666667%;flex-grow:0;max-width:91.6666666667%}.flex.order-xl11{order:11}.flex.xl10{flex-basis:83.3333333333%;flex-grow:0;max-width:83.3333333333%}.flex.order-xl10{order:10}.flex.xl9{flex-basis:75%;flex-grow:0;max-width:75%}.flex.order-xl9{order:9}.flex.xl8{flex-basis:66.6666666667%;flex-grow:0;max-width:66.6666666667%}.flex.order-xl8{order:8}.flex.xl7{flex-basis:58.3333333333%;flex-grow:0;max-width:58.3333333333%}.flex.order-xl7{order:7}.flex.xl6{flex-basis:50%;flex-grow:0;max-width:50%}.flex.order-xl6{order:6}.flex.xl5{flex-basis:41.6666666667%;flex-grow:0;max-width:41.6666666667%}.flex.order-xl5{order:5}.flex.xl4{flex-basis:33.3333333333%;flex-grow:0;max-width:33.3333333333%}.flex.order-xl4{order:4}.flex.xl3{flex-basis:25%;flex-grow:0;max-width:25%}.flex.order-xl3{order:3}.flex.xl2{flex-basis:16.6666666667%;flex-grow:0;max-width:16.6666666667%}.flex.order-xl2{order:2}.flex.xl1{flex-basis:8.3333333333%;flex-grow:0;max-width:8.3333333333%}.flex.order-xl1{order:1}.v-application--is-ltr .flex.offset-xl12{margin-left:100%}.v-application--is-rtl .flex.offset-xl12{margin-right:100%}.v-application--is-ltr .flex.offset-xl11{margin-left:91.6666666667%}.v-application--is-rtl .flex.offset-xl11{margin-right:91.6666666667%}.v-application--is-ltr .flex.offset-xl10{margin-left:83.3333333333%}.v-application--is-rtl .flex.offset-xl10{margin-right:83.3333333333%}.v-application--is-ltr .flex.offset-xl9{margin-left:75%}.v-application--is-rtl .flex.offset-xl9{margin-right:75%}.v-application--is-ltr .flex.offset-xl8{margin-left:66.6666666667%}.v-application--is-rtl .flex.offset-xl8{margin-right:66.6666666667%}.v-application--is-ltr .flex.offset-xl7{margin-left:58.3333333333%}.v-application--is-rtl .flex.offset-xl7{margin-right:58.3333333333%}.v-application--is-ltr .flex.offset-xl6{margin-left:50%}.v-application--is-rtl .flex.offset-xl6{margin-right:50%}.v-application--is-ltr .flex.offset-xl5{margin-left:41.6666666667%}.v-application--is-rtl .flex.offset-xl5{margin-right:41.6666666667%}.v-application--is-ltr .flex.offset-xl4{margin-left:33.3333333333%}.v-application--is-rtl .flex.offset-xl4{margin-right:33.3333333333%}.v-application--is-ltr .flex.offset-xl3{margin-left:25%}.v-application--is-rtl .flex.offset-xl3{margin-right:25%}.v-application--is-ltr .flex.offset-xl2{margin-left:16.6666666667%}.v-application--is-rtl .flex.offset-xl2{margin-right:16.6666666667%}.v-application--is-ltr .flex.offset-xl1{margin-left:8.3333333333%}.v-application--is-rtl .flex.offset-xl1{margin-right:8.3333333333%}.v-application--is-ltr .flex.offset-xl0{margin-left:0}.v-application--is-rtl .flex.offset-xl0{margin-right:0}}.child-flex>*,.flex{flex:1 1 auto;max-width:100%}.child-flex>.grow-shrink-0,.flex.grow-shrink-0{flex-grow:0;flex-shrink:0}.grow,.spacer{flex-grow:1!important}.grow{flex-shrink:0!important}.shrink{flex-grow:0!important;flex-shrink:1!important}.fill-height{height:100%}.theme--light.v-text-field>.v-input__control>.v-input__slot:before{border-color:rgba(0,0,0,.42)}.theme--light.v-text-field:not(.v-input--has-state):hover>.v-input__control>.v-input__slot:before{border-color:rgba(0,0,0,.87)}.theme--light.v-text-field.v-input--is-disabled .v-input__slot:before{-o-border-image:repeating-linear-gradient(90deg,rgba(0,0,0,.38) 0,rgba(0,0,0,.38) 2px,transparent 0,transparent 4px) 1 repeat;border-image:repeating-linear-gradient(90deg,rgba(0,0,0,.38) 0,rgba(0,0,0,.38) 2px,transparent 0,transparent 4px) 1 repeat}.theme--light.v-text-field--filled>.v-input__control>.v-input__slot{background:rgba(0,0,0,.06)}.theme--light.v-text-field--filled:not(.v-input--is-focused):not(.v-input--has-state)>.v-input__control>.v-input__slot:hover{background:rgba(0,0,0,.12)}.theme--light.v-text-field--solo>.v-input__control>.v-input__slot{background:#fff}.theme--light.v-text-field--solo-inverted>.v-input__control>.v-input__slot{background:rgba(0,0,0,.06)}.theme--light.v-text-field--solo-inverted.v-input--is-focused>.v-input__control>.v-input__slot{background:#424242}.theme--light.v-text-field--solo-inverted.v-input--is-focused>.v-input__control>.v-input__slot input{color:#fff}.theme--light.v-text-field--solo-inverted.v-input--is-focused>.v-input__control>.v-input__slot input::-moz-placeholder{color:hsla(0,0%,100%,.5)}.theme--light.v-text-field--solo-inverted.v-input--is-focused>.v-input__control>.v-input__slot input:-ms-input-placeholder{color:hsla(0,0%,100%,.5)}.theme--light.v-text-field--solo-inverted.v-input--is-focused>.v-input__control>.v-input__slot input::placeholder{color:hsla(0,0%,100%,.5)}.theme--light.v-text-field--solo-inverted.v-input--is-focused>.v-input__control>.v-input__slot .v-label{color:hsla(0,0%,100%,.7)}.theme--light.v-text-field--outlined:not(.v-input--is-focused):not(.v-input--has-state)>.v-input__control>.v-input__slot fieldset{color:rgba(0,0,0,.38)}.theme--light.v-text-field--outlined:not(.v-input--is-focused):not(.v-input--has-state):not(.v-input--is-disabled)>.v-input__control>.v-input__slot:hover fieldset{color:rgba(0,0,0,.86)}.theme--light.v-text-field--outlined:not(.v-input--is-focused).v-input--is-disabled>.v-input__control>.v-input__slot fieldset{color:rgba(0,0,0,.26)}.theme--dark.v-text-field>.v-input__control>.v-input__slot:before{border-color:hsla(0,0%,100%,.7)}.theme--dark.v-text-field:not(.v-input--has-state):hover>.v-input__control>.v-input__slot:before{border-color:#fff}.theme--dark.v-text-field.v-input--is-disabled .v-input__slot:before{-o-border-image:repeating-linear-gradient(90deg,hsla(0,0%,100%,.5) 0,hsla(0,0%,100%,.5) 2px,transparent 0,transparent 4px) 1 repeat;border-image:repeating-linear-gradient(90deg,hsla(0,0%,100%,.5) 0,hsla(0,0%,100%,.5) 2px,transparent 0,transparent 4px) 1 repeat}.theme--dark.v-text-field--filled>.v-input__control>.v-input__slot{background:hsla(0,0%,100%,.08)}.theme--dark.v-text-field--filled:not(.v-input--is-focused):not(.v-input--has-state)>.v-input__control>.v-input__slot:hover{background:hsla(0,0%,100%,.16)}.theme--dark.v-text-field--solo>.v-input__control>.v-input__slot{background:#1e1e1e}.theme--dark.v-text-field--solo-inverted>.v-input__control>.v-input__slot{background:hsla(0,0%,100%,.16)}.theme--dark.v-text-field--solo-inverted.v-input--is-focused>.v-input__control>.v-input__slot{background:#fff}.theme--dark.v-text-field--solo-inverted.v-input--is-focused>.v-input__control>.v-input__slot input{color:rgba(0,0,0,.87)}.theme--dark.v-text-field--solo-inverted.v-input--is-focused>.v-input__control>.v-input__slot input::-moz-placeholder{color:rgba(0,0,0,.38)}.theme--dark.v-text-field--solo-inverted.v-input--is-focused>.v-input__control>.v-input__slot input:-ms-input-placeholder{color:rgba(0,0,0,.38)}.theme--dark.v-text-field--solo-inverted.v-input--is-focused>.v-input__control>.v-input__slot input::placeholder{color:rgba(0,0,0,.38)}.theme--dark.v-text-field--solo-inverted.v-input--is-focused>.v-input__control>.v-input__slot .v-label{color:rgba(0,0,0,.6)}.theme--dark.v-text-field--outlined:not(.v-input--is-focused):not(.v-input--has-state)>.v-input__control>.v-input__slot fieldset{color:hsla(0,0%,100%,.24)}.theme--dark.v-text-field--outlined:not(.v-input--is-focused):not(.v-input--has-state):not(.v-input--is-disabled)>.v-input__control>.v-input__slot:hover fieldset{color:#fff}.theme--dark.v-text-field--outlined:not(.v-input--is-focused).v-input--is-disabled>.v-input__control>.v-input__slot fieldset{color:hsla(0,0%,100%,.16)}.v-text-field{padding-top:12px;margin-top:4px}.v-text-field__prefix,.v-text-field__suffix{line-height:20px}.v-text-field input{flex:1 1 auto;line-height:20px;padding:8px 0 8px;max-width:100%;min-width:0;width:100%}.v-text-field .v-input__control,.v-text-field .v-input__slot,.v-text-field fieldset{border-radius:inherit}.v-text-field.v-input--has-state .v-input__control>.v-text-field__details>.v-counter,.v-text-field.v-input--is-disabled .v-input__control>.v-text-field__details>.v-counter,.v-text-field.v-input--is-disabled .v-input__control>.v-text-field__details>.v-messages,.v-text-field .v-input__control,.v-text-field fieldset{color:inherit}.v-text-field.v-input--dense{padding-top:0}.v-text-field.v-input--dense .v-label{top:4px}.v-text-field.v-input--dense:not(.v-text-field--outlined) .v-text-field__prefix,.v-text-field.v-input--dense:not(.v-text-field--outlined) .v-text-field__suffix,.v-text-field.v-input--dense:not(.v-text-field--outlined) input{padding:4px 0 2px}.v-text-field.v-input--dense:not(.v-text-field--outlined) .v-text-field__prefix{padding-right:4px}.v-text-field.v-input--dense:not(.v-text-field--outlined) .v-text-field__suffix{padding-left:4px}.v-text-field.v-input--dense[type=text]::-ms-clear{display:none}.v-text-field.v-input--dense .v-input__append-inner,.v-text-field.v-input--dense .v-input__prepend-inner{margin-top:0}.v-text-field .v-input__append-inner,.v-text-field .v-input__prepend-inner{align-self:flex-start;display:inline-flex;margin-top:4px;line-height:1;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.v-application--is-ltr .v-text-field .v-input__prepend-inner{margin-right:auto;padding-right:4px}.v-application--is-ltr .v-text-field .v-input__append-inner,.v-application--is-rtl .v-text-field .v-input__prepend-inner{margin-left:auto;padding-left:4px}.v-application--is-rtl .v-text-field .v-input__append-inner{margin-right:auto;padding-right:4px}.v-text-field .v-counter{white-space:nowrap}.v-application--is-ltr .v-text-field .v-counter{margin-left:8px}.v-application--is-rtl .v-text-field .v-counter{margin-right:8px}.v-text-field .v-label{max-width:90%;overflow:hidden;text-overflow:ellipsis;top:6px;white-space:nowrap;pointer-events:none}.v-application--is-ltr .v-text-field .v-label{transform-origin:top left}.v-application--is-rtl .v-text-field .v-label{transform-origin:top right}.v-text-field .v-label--active{max-width:133%;transform:translateY(-18px) scale(.75);pointer-events:auto}.v-text-field>.v-input__control>.v-input__slot{cursor:text}.v-text-field>.v-input__control>.v-input__slot:after,.v-text-field>.v-input__control>.v-input__slot:before{bottom:-1px;content:"";left:0;position:absolute;transition:.3s cubic-bezier(.25,.8,.5,1);width:100%}.v-text-field>.v-input__control>.v-input__slot:before{border-color:inherit;border-style:solid;border-width:thin 0 0 0}.v-text-field>.v-input__control>.v-input__slot:after{background-color:currentColor;border-color:currentColor;border-style:solid;border-width:thin 0 thin 0;transform:scaleX(0)}.v-text-field__details{display:flex;flex:1 0 auto;max-width:100%;min-height:14px;overflow:hidden}.v-text-field__prefix,.v-text-field__suffix{align-self:center;cursor:default;transition:color .3s cubic-bezier(.25,.8,.5,1);white-space:nowrap}.v-application--is-ltr .v-text-field__prefix{text-align:right;padding-right:4px}.v-application--is-rtl .v-text-field__prefix{text-align:left;padding-left:4px}.v-text-field__suffix{white-space:nowrap}.v-application--is-ltr .v-text-field__suffix{padding-left:4px}.v-application--is-rtl .v-text-field__suffix{padding-right:4px}.v-application--is-ltr .v-text-field--reverse .v-text-field__prefix{text-align:left;padding-right:0;padding-left:4px}.v-application--is-rtl .v-text-field--reverse .v-text-field__prefix{text-align:right;padding-right:4px;padding-left:0}.v-application--is-ltr .v-text-field--reverse .v-text-field__suffix{padding-left:0;padding-right:4px}.v-application--is-rtl .v-text-field--reverse .v-text-field__suffix{padding-left:4px;padding-right:0}.v-text-field>.v-input__control>.v-input__slot>.v-text-field__slot{display:flex;flex:1 1 auto;position:relative}.v-text-field:not(.v-text-field--is-booted) .v-label,.v-text-field:not(.v-text-field--is-booted) legend{transition:none}.v-text-field--filled,.v-text-field--full-width,.v-text-field--outlined{position:relative}.v-text-field--filled>.v-input__control>.v-input__slot,.v-text-field--full-width>.v-input__control>.v-input__slot,.v-text-field--outlined>.v-input__control>.v-input__slot{align-items:stretch;min-height:56px}.v-text-field--filled.v-input--dense>.v-input__control>.v-input__slot,.v-text-field--full-width.v-input--dense>.v-input__control>.v-input__slot,.v-text-field--outlined.v-input--dense>.v-input__control>.v-input__slot{min-height:52px}.v-text-field--filled.v-input--dense.v-text-field--outlined.v-text-field--filled>.v-input__control>.v-input__slot,.v-text-field--filled.v-input--dense.v-text-field--outlined>.v-input__control>.v-input__slot,.v-text-field--filled.v-input--dense.v-text-field--single-line>.v-input__control>.v-input__slot,.v-text-field--full-width.v-input--dense.v-text-field--outlined.v-text-field--filled>.v-input__control>.v-input__slot,.v-text-field--full-width.v-input--dense.v-text-field--outlined>.v-input__control>.v-input__slot,.v-text-field--full-width.v-input--dense.v-text-field--single-line>.v-input__control>.v-input__slot,.v-text-field--outlined.v-input--dense.v-text-field--outlined.v-text-field--filled>.v-input__control>.v-input__slot,.v-text-field--outlined.v-input--dense.v-text-field--outlined>.v-input__control>.v-input__slot,.v-text-field--outlined.v-input--dense.v-text-field--single-line>.v-input__control>.v-input__slot{min-height:40px}.v-text-field--outlined{border-radius:4px}.v-text-field--enclosed .v-input__append-inner,.v-text-field--enclosed .v-input__append-outer,.v-text-field--enclosed .v-input__prepend-inner,.v-text-field--enclosed .v-input__prepend-outer,.v-text-field--full-width .v-input__append-inner,.v-text-field--full-width .v-input__append-outer,.v-text-field--full-width .v-input__prepend-inner,.v-text-field--full-width .v-input__prepend-outer{margin-top:17px}.v-text-field--enclosed.v-input--dense:not(.v-text-field--solo) .v-input__append-inner,.v-text-field--enclosed.v-input--dense:not(.v-text-field--solo) .v-input__append-outer,.v-text-field--enclosed.v-input--dense:not(.v-text-field--solo) .v-input__prepend-inner,.v-text-field--enclosed.v-input--dense:not(.v-text-field--solo) .v-input__prepend-outer,.v-text-field--full-width.v-input--dense:not(.v-text-field--solo) .v-input__append-inner,.v-text-field--full-width.v-input--dense:not(.v-text-field--solo) .v-input__append-outer,.v-text-field--full-width.v-input--dense:not(.v-text-field--solo) .v-input__prepend-inner,.v-text-field--full-width.v-input--dense:not(.v-text-field--solo) .v-input__prepend-outer{margin-top:14px}.v-text-field--enclosed.v-input--dense:not(.v-text-field--solo).v-text-field--single-line .v-input__append-inner,.v-text-field--enclosed.v-input--dense:not(.v-text-field--solo).v-text-field--single-line .v-input__append-outer,.v-text-field--enclosed.v-input--dense:not(.v-text-field--solo).v-text-field--single-line .v-input__prepend-inner,.v-text-field--enclosed.v-input--dense:not(.v-text-field--solo).v-text-field--single-line .v-input__prepend-outer,.v-text-field--full-width.v-input--dense:not(.v-text-field--solo).v-text-field--single-line .v-input__append-inner,.v-text-field--full-width.v-input--dense:not(.v-text-field--solo).v-text-field--single-line .v-input__append-outer,.v-text-field--full-width.v-input--dense:not(.v-text-field--solo).v-text-field--single-line .v-input__prepend-inner,.v-text-field--full-width.v-input--dense:not(.v-text-field--solo).v-text-field--single-line .v-input__prepend-outer{margin-top:9px}.v-text-field--enclosed.v-input--dense:not(.v-text-field--solo).v-text-field--outlined .v-input__append-inner,.v-text-field--enclosed.v-input--dense:not(.v-text-field--solo).v-text-field--outlined .v-input__append-outer,.v-text-field--enclosed.v-input--dense:not(.v-text-field--solo).v-text-field--outlined .v-input__prepend-inner,.v-text-field--enclosed.v-input--dense:not(.v-text-field--solo).v-text-field--outlined .v-input__prepend-outer,.v-text-field--full-width.v-input--dense:not(.v-text-field--solo).v-text-field--outlined .v-input__append-inner,.v-text-field--full-width.v-input--dense:not(.v-text-field--solo).v-text-field--outlined .v-input__append-outer,.v-text-field--full-width.v-input--dense:not(.v-text-field--solo).v-text-field--outlined .v-input__prepend-inner,.v-text-field--full-width.v-input--dense:not(.v-text-field--solo).v-text-field--outlined .v-input__prepend-outer{margin-top:8px}.v-text-field--filled .v-label,.v-text-field--full-width .v-label{top:18px}.v-text-field--filled .v-label--active,.v-text-field--full-width .v-label--active{transform:translateY(-6px) scale(.75)}.v-text-field--filled.v-input--dense .v-label,.v-text-field--full-width.v-input--dense .v-label{top:17px}.v-text-field--filled.v-input--dense .v-label--active,.v-text-field--full-width.v-input--dense .v-label--active{transform:translateY(-10px) scale(.75)}.v-text-field--filled.v-input--dense.v-text-field--single-line .v-label,.v-text-field--full-width.v-input--dense.v-text-field--single-line .v-label{top:11px}.v-text-field--filled{border-radius:4px 4px 0 0}.v-text-field--filled:not(.v-text-field--single-line) input{margin-top:22px}.v-text-field--filled.v-input--dense:not(.v-text-field--single-line).v-text-field--outlined input{margin-top:0}.v-text-field--filled .v-text-field__prefix,.v-text-field--filled .v-text-field__suffix{max-height:32px;margin-top:20px}.v-text-field--full-width{border-radius:0}.v-text-field--outlined .v-text-field__slot,.v-text-field--single-line .v-text-field__slot{align-items:center}.v-text-field.v-text-field--enclosed{margin:0;padding:0}.v-text-field.v-text-field--enclosed.v-text-field--single-line .v-text-field__prefix,.v-text-field.v-text-field--enclosed.v-text-field--single-line .v-text-field__suffix{margin-top:0}.v-text-field.v-text-field--enclosed:not(.v-text-field--filled) .v-progress-linear__background{display:none}.v-text-field.v-text-field--enclosed .v-text-field__details,.v-text-field.v-text-field--enclosed:not(.v-text-field--rounded)>.v-input__control>.v-input__slot{padding:0 12px}.v-text-field.v-text-field--enclosed .v-text-field__details{padding-top:0;margin-bottom:8px}.v-application--is-ltr .v-text-field--reverse input{text-align:right}.v-application--is-rtl .v-text-field--reverse input{text-align:left}.v-application--is-ltr .v-text-field--reverse .v-label{transform-origin:top right}.v-application--is-rtl .v-text-field--reverse .v-label{transform-origin:top left}.v-text-field--reverse .v-text-field__slot,.v-text-field--reverse>.v-input__control>.v-input__slot{flex-direction:row-reverse}.v-text-field--outlined>.v-input__control>.v-input__slot:after,.v-text-field--outlined>.v-input__control>.v-input__slot:before,.v-text-field--rounded>.v-input__control>.v-input__slot:after,.v-text-field--rounded>.v-input__control>.v-input__slot:before,.v-text-field--solo>.v-input__control>.v-input__slot:after,.v-text-field--solo>.v-input__control>.v-input__slot:before{display:none}.v-text-field--outlined,.v-text-field--solo{border-radius:4px}.v-text-field--outlined{margin-bottom:16px;transition:border .3s cubic-bezier(.25,.8,.5,1)}.v-text-field--outlined .v-label{top:18px}.v-text-field--outlined .v-label--active{transform:translateY(-24px) scale(.75)}.v-text-field--outlined.v-input--dense .v-label{top:10px}.v-text-field--outlined.v-input--dense .v-label--active{transform:translateY(-16px) scale(.75)}.v-text-field--outlined fieldset{border-collapse:collapse;border-color:currentColor;border-style:solid;border-width:1px;bottom:0;left:0;pointer-events:none;position:absolute;right:0;top:-5px;transition-duration:.15s;transition-property:color;transition-timing-function:cubic-bezier(.25,.8,.25,1)}.v-application--is-ltr .v-text-field--outlined fieldset{padding-left:8px}.v-application--is-ltr .v-text-field--outlined.v-text-field--reverse fieldset,.v-application--is-rtl .v-text-field--outlined fieldset{padding-right:8px}.v-application--is-rtl .v-text-field--outlined.v-text-field--reverse fieldset{padding-left:8px}.v-text-field--outlined legend{line-height:11px;padding:0;transition:width .3s cubic-bezier(.25,.8,.5,1)}.v-application--is-ltr .v-text-field--outlined legend{text-align:left}.v-application--is-rtl .v-text-field--outlined legend{text-align:right}.v-application--is-ltr .v-text-field--outlined.v-text-field--reverse legend{margin-left:auto}.v-application--is-rtl .v-text-field--outlined.v-text-field--reverse legend{margin-right:auto}.v-application--is-ltr .v-text-field--outlined.v-text-field--rounded legend{margin-left:12px}.v-application--is-rtl .v-text-field--outlined.v-text-field--rounded legend{margin-right:12px}.v-text-field--outlined>.v-input__control>.v-input__slot{background:transparent}.v-text-field--outlined .v-text-field__prefix{max-height:32px}.v-text-field--outlined .v-input__append-outer,.v-text-field--outlined .v-input__prepend-outer{margin-top:18px}.v-text-field--outlined.v-input--has-state fieldset,.v-text-field--outlined.v-input--is-focused fieldset{border:2px solid currentColor}.v-text-field--rounded{border-radius:28px}.v-text-field--rounded>.v-input__control>.v-input__slot{padding:0 24px}.v-text-field--shaped{border-radius:16px 16px 0 0}.v-text-field.v-text-field--solo .v-label{top:calc(50% - 9px)}.v-text-field.v-text-field--solo .v-input__control{min-height:48px;padding:0}.v-text-field.v-text-field--solo .v-input__control input{caret-color:auto}.v-text-field.v-text-field--solo.v-input--dense>.v-input__control{min-height:38px}.v-text-field.v-text-field--solo:not(.v-text-field--solo-flat)>.v-input__control>.v-input__slot{box-shadow:0 3px 1px -2px rgba(0,0,0,.2),0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12)}.v-text-field.v-text-field--solo .v-input__append-inner,.v-text-field.v-text-field--solo .v-input__prepend-inner{align-self:center;margin-top:0}.v-text-field.v-text-field--solo .v-input__append-outer,.v-text-field.v-text-field--solo .v-input__prepend-outer{margin-top:12px}.v-text-field.v-text-field--solo.v-input--dense .v-input__append-outer,.v-text-field.v-text-field--solo.v-input--dense .v-input__prepend-outer{margin-top:7px}.v-text-field.v-input--is-focused>.v-input__control>.v-input__slot:after{transform:scaleX(1)}.v-text-field.v-input--has-state>.v-input__control>.v-input__slot:before{border-color:currentColor}.theme--light.v-counter{color:rgba(0,0,0,.6)}.theme--dark.v-counter{color:hsla(0,0%,100%,.7)}.v-counter{flex:0 1 auto;font-size:12px;min-height:12px;line-height:12px}.theme--light.v-data-table{background-color:#fff;color:rgba(0,0,0,.87)}.theme--light.v-data-table .v-data-table__divider{border-right:thin solid rgba(0,0,0,.12)}.theme--light.v-data-table.v-data-table--fixed-header thead th{background:#fff;box-shadow:inset 0 -1px 0 rgba(0,0,0,.12)}.theme--light.v-data-table>.v-data-table__wrapper>table>thead>tr>th{color:rgba(0,0,0,.6)}.theme--light.v-data-table>.v-data-table__wrapper>table>tbody>tr:not(:last-child)>td:last-child,.theme--light.v-data-table>.v-data-table__wrapper>table>tbody>tr:not(:last-child)>td:not(.v-data-table__mobile-row),.theme--light.v-data-table>.v-data-table__wrapper>table>tbody>tr:not(:last-child)>th:last-child,.theme--light.v-data-table>.v-data-table__wrapper>table>tbody>tr:not(:last-child)>th:not(.v-data-table__mobile-row),.theme--light.v-data-table>.v-data-table__wrapper>table>thead>tr:last-child>th{border-bottom:thin solid rgba(0,0,0,.12)}.theme--light.v-data-table>.v-data-table__wrapper>table>tbody>tr.active{background:#f5f5f5}.theme--light.v-data-table>.v-data-table__wrapper>table>tbody>tr:hover:not(.v-data-table__expanded__content):not(.v-data-table__empty-wrapper){background:#eee}.theme--light.v-data-table>.v-data-table__wrapper>table>tfoot>tr>td:not(.v-data-table__mobile-row),.theme--light.v-data-table>.v-data-table__wrapper>table>tfoot>tr>th:not(.v-data-table__mobile-row){border-top:thin solid rgba(0,0,0,.12)}.theme--dark.v-data-table{background-color:#1e1e1e;color:#fff}.theme--dark.v-data-table .v-data-table__divider{border-right:thin solid hsla(0,0%,100%,.12)}.theme--dark.v-data-table.v-data-table--fixed-header thead th{background:#1e1e1e;box-shadow:inset 0 -1px 0 hsla(0,0%,100%,.12)}.theme--dark.v-data-table>.v-data-table__wrapper>table>thead>tr>th{color:hsla(0,0%,100%,.7)}.theme--dark.v-data-table>.v-data-table__wrapper>table>tbody>tr:not(:last-child)>td:last-child,.theme--dark.v-data-table>.v-data-table__wrapper>table>tbody>tr:not(:last-child)>td:not(.v-data-table__mobile-row),.theme--dark.v-data-table>.v-data-table__wrapper>table>tbody>tr:not(:last-child)>th:last-child,.theme--dark.v-data-table>.v-data-table__wrapper>table>tbody>tr:not(:last-child)>th:not(.v-data-table__mobile-row),.theme--dark.v-data-table>.v-data-table__wrapper>table>thead>tr:last-child>th{border-bottom:thin solid hsla(0,0%,100%,.12)}.theme--dark.v-data-table>.v-data-table__wrapper>table>tbody>tr.active{background:#505050}.theme--dark.v-data-table>.v-data-table__wrapper>table>tbody>tr:hover:not(.v-data-table__expanded__content):not(.v-data-table__empty-wrapper){background:#616161}.theme--dark.v-data-table>.v-data-table__wrapper>table>tfoot>tr>td:not(.v-data-table__mobile-row),.theme--dark.v-data-table>.v-data-table__wrapper>table>tfoot>tr>th:not(.v-data-table__mobile-row){border-top:thin solid hsla(0,0%,100%,.12)}.v-data-table{line-height:1.5;max-width:100%}.v-data-table>.v-data-table__wrapper>table{width:100%;border-spacing:0}.v-data-table>.v-data-table__wrapper>table>tbody>tr>td,.v-data-table>.v-data-table__wrapper>table>tbody>tr>th,.v-data-table>.v-data-table__wrapper>table>tfoot>tr>td,.v-data-table>.v-data-table__wrapper>table>tfoot>tr>th,.v-data-table>.v-data-table__wrapper>table>thead>tr>td,.v-data-table>.v-data-table__wrapper>table>thead>tr>th{padding:0 16px;transition:height .2s cubic-bezier(.4,0,.6,1)}.v-data-table>.v-data-table__wrapper>table>tbody>tr>th,.v-data-table>.v-data-table__wrapper>table>tfoot>tr>th,.v-data-table>.v-data-table__wrapper>table>thead>tr>th{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;font-size:.75rem;height:48px}.v-application--is-ltr .v-data-table>.v-data-table__wrapper>table>tbody>tr>th,.v-application--is-ltr .v-data-table>.v-data-table__wrapper>table>tfoot>tr>th,.v-application--is-ltr .v-data-table>.v-data-table__wrapper>table>thead>tr>th{text-align:left}.v-application--is-rtl .v-data-table>.v-data-table__wrapper>table>tbody>tr>th,.v-application--is-rtl .v-data-table>.v-data-table__wrapper>table>tfoot>tr>th,.v-application--is-rtl .v-data-table>.v-data-table__wrapper>table>thead>tr>th{text-align:right}.v-data-table>.v-data-table__wrapper>table>tbody>tr>td,.v-data-table>.v-data-table__wrapper>table>tfoot>tr>td,.v-data-table>.v-data-table__wrapper>table>thead>tr>td{font-size:.875rem;height:48px}.v-data-table__wrapper{overflow-x:auto;overflow-y:hidden}.v-data-table__progress{height:auto!important}.v-data-table__progress th{height:auto!important;border:none!important;padding:0;position:relative}.v-data-table--dense>.v-data-table__wrapper>table>tbody>tr>td,.v-data-table--dense>.v-data-table__wrapper>table>tbody>tr>th,.v-data-table--dense>.v-data-table__wrapper>table>tfoot>tr>td,.v-data-table--dense>.v-data-table__wrapper>table>tfoot>tr>th,.v-data-table--dense>.v-data-table__wrapper>table>thead>tr>td,.v-data-table--dense>.v-data-table__wrapper>table>thead>tr>th{height:32px}.v-data-table--has-top>.v-data-table__wrapper>table>tbody>tr:first-child:hover>td:first-child{border-top-left-radius:0}.v-data-table--has-top>.v-data-table__wrapper>table>tbody>tr:first-child:hover>td:last-child{border-top-right-radius:0}.v-data-table--has-bottom>.v-data-table__wrapper>table>tbody>tr:last-child:hover>td:first-child{border-bottom-left-radius:0}.v-data-table--has-bottom>.v-data-table__wrapper>table>tbody>tr:last-child:hover>td:last-child{border-bottom-right-radius:0}.v-data-table--fixed-header>.v-data-table__wrapper,.v-data-table--fixed-height .v-data-table__wrapper{overflow-y:auto}.v-data-table--fixed-header>.v-data-table__wrapper>table>thead>tr>th{border-bottom:0!important;position:sticky;top:0;z-index:2}.v-data-table--fixed-header>.v-data-table__wrapper>table>thead>tr:nth-child(2)>th{top:48px}.v-application--is-ltr .v-data-table--fixed-header .v-data-footer{margin-right:17px}.v-application--is-rtl .v-data-table--fixed-header .v-data-footer{margin-left:17px}.v-data-table--fixed-header.v-data-table--dense>.v-data-table__wrapper>table>thead>tr:nth-child(2)>th{top:32px}.theme--light.v-slider .v-slider__thumb,.theme--light.v-slider .v-slider__track-background,.theme--light.v-slider .v-slider__track-fill{background:rgba(0,0,0,.26)}.theme--dark.v-slider .v-slider__thumb,.theme--dark.v-slider .v-slider__track-background,.theme--dark.v-slider .v-slider__track-fill{background:hsla(0,0%,100%,.2)}.v-slider{cursor:default;display:flex;align-items:center;position:relative;flex:1;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.v-slider input{cursor:default;padding:0;width:100%;display:none}.v-slider__track-container{position:absolute;border-radius:0}.v-slider__thumb-container,.v-slider__track-background,.v-slider__track-fill{position:absolute;transition:.3s cubic-bezier(.25,.8,.5,1)}.v-slider__thumb-container{outline:none;top:50%}.v-slider__thumb-container:hover .v-slider__thumb:before{transform:scale(1)}.v-slider__thumb{width:12px;height:12px;left:-6px;top:50%;transform:translateY(-50%);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.v-slider__thumb,.v-slider__thumb:before{position:absolute;border-radius:50%;transition:.3s cubic-bezier(.25,.8,.5,1)}.v-slider__thumb:before{content:"";color:inherit;width:36px;height:36px;background:currentColor;opacity:.3;left:-12px;top:-12px;transform:scale(.1);pointer-events:none}.v-slider__thumb:after{content:"";width:42px;height:42px;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}.v-slider__tick,.v-slider__ticks-container{position:absolute}.v-slider__tick{opacity:0;background-color:rgba(0,0,0,.5);transition:.3s cubic-bezier(.25,.8,.5,1);border-radius:0}.v-slider__tick--filled{background-color:hsla(0,0%,100%,.5)}.v-application--is-ltr .v-slider__tick:first-child .v-slider__tick-label{transform:none}.v-application--is-rtl .v-slider__tick:first-child .v-slider__tick-label{transform:translateX(100%)}.v-application--is-ltr .v-slider__tick:last-child .v-slider__tick-label{transform:translateX(-100%)}.v-application--is-rtl .v-slider__tick:last-child .v-slider__tick-label{transform:none}.v-slider__tick-label{position:absolute;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;white-space:nowrap}.v-slider__thumb-label-container{top:0}.v-slider__thumb-label,.v-slider__thumb-label-container{position:absolute;left:0;transition:.3s cubic-bezier(.25,.8,.25,1)}.v-slider__thumb-label{display:flex;align-items:center;justify-content:center;font-size:.75rem;color:#fff;width:32px;height:32px;border-radius:50% 50% 0;bottom:100%;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.v-slider--horizontal{min-height:32px;margin-left:8px;margin-right:8px}.v-slider--horizontal .v-slider__track-container{width:100%;height:2px;left:0;top:50%;transform:translateY(-50%)}.v-slider--horizontal .v-slider__track-background,.v-slider--horizontal .v-slider__track-fill{height:100%}.v-slider--horizontal .v-slider__ticks-container{left:0;height:2px;width:100%}.v-application--is-ltr .v-slider--horizontal .v-slider__tick:first-child .v-slider__tick-label,.v-application--is-rtl .v-slider--horizontal .v-slider__tick:first-child .v-slider__tick-label{transform:translateX(0)}.v-application--is-ltr .v-slider--horizontal .v-slider__tick:last-child .v-slider__tick-label{transform:translateX(-100%)}.v-application--is-rtl .v-slider--horizontal .v-slider__tick:last-child .v-slider__tick-label{transform:translateX(100%)}.v-slider--horizontal .v-slider__tick .v-slider__tick-label{top:8px}.v-application--is-ltr .v-slider--horizontal .v-slider__tick .v-slider__tick-label{transform:translateX(-50%)}.v-application--is-rtl .v-slider--horizontal .v-slider__tick .v-slider__tick-label{transform:translateX(50%)}.v-slider--horizontal .v-slider__thumb-label{transform:translateY(-20%) translateY(-12px) translateX(-50%) rotate(45deg)}.v-slider--horizontal .v-slider__thumb-label>*{transform:rotate(-45deg)}.v-slider--vertical{min-height:150px;margin-top:12px;margin-bottom:12px}.v-slider--vertical .v-slider__track-container{height:100%;width:2px;left:50%;top:0;transform:translateX(-50%)}.v-slider--vertical .v-slider__track-background,.v-slider--vertical .v-slider__track-fill{width:100%}.v-slider--vertical .v-slider__thumb-container{left:50%}.v-slider--vertical .v-slider__ticks-container{top:0;width:2px;height:100%;left:50%;transform:translateX(-50%)}.v-application--is-ltr .v-slider--vertical .v-slider__tick .v-slider__tick-label,.v-application--is-ltr .v-slider--vertical .v-slider__tick:first-child .v-slider__tick-label,.v-application--is-ltr .v-slider--vertical .v-slider__tick:last-child .v-slider__tick-label{transform:translateY(-50%);left:12px}.v-application--is-rtl .v-slider--vertical .v-slider__tick .v-slider__tick-label,.v-application--is-rtl .v-slider--vertical .v-slider__tick:first-child .v-slider__tick-label,.v-application--is-rtl .v-slider--vertical .v-slider__tick:last-child .v-slider__tick-label{transform:translateY(-50%);right:12px}.v-slider--vertical .v-slider__thumb-label>*{transform:rotate(-135deg)}.v-slider__thumb-container--focused .v-slider__thumb:before{transform:scale(1)}.v-slider--active .v-slider__tick{opacity:1}.v-slider__thumb-container--active .v-slider__thumb:before{transform:scale(1.5)!important}.v-slider--disabled{pointer-events:none}.v-slider--disabled .v-slider__thumb{width:8px;height:8px;left:-4px}.v-slider--disabled .v-slider__thumb:before{display:none}.v-slider__ticks-container--always-show .v-slider__tick{opacity:1}.v-input__slider.v-input--is-readonly>.v-input__control{pointer-events:none}.v-application--is-ltr .v-input__slider .v-input__slot .v-label{margin-left:0;margin-right:12px}.v-application--is-ltr .v-input__slider--inverse-label .v-input__slot .v-label,.v-application--is-rtl .v-input__slider .v-input__slot .v-label{margin-right:0;margin-left:12px}.v-application--is-rtl .v-input__slider--inverse-label .v-input__slot .v-label{margin-left:0;margin-right:12px}.v-input__slider--vertical{align-items:center}.v-application--is-ltr .v-input__slider--vertical{flex-direction:column-reverse}.v-application--is-rtl .v-input__slider--vertical{flex-direction:column}.v-input__slider--vertical .v-input__append-outer,.v-input__slider--vertical .v-input__prepend-outer,.v-input__slider--vertical .v-input__slot{margin:0}.v-input__slider--vertical .v-messages{display:none}.v-input--has-state .v-slider__track-background{opacity:.4}.theme--light.v-select .v-select__selections{color:rgba(0,0,0,.87);min-height:10px}.theme--light.v-select.v-input--is-disabled .v-select__selections,.theme--light.v-select .v-select__selection--disabled{color:rgba(0,0,0,.38)}.theme--light.v-select.v-text-field--solo-inverted.v-input--is-focused .v-select__selections{color:#fff}.theme--dark.v-select .v-select__selections{color:#fff;min-height:10px}.theme--dark.v-select.v-input--is-disabled .v-select__selections,.theme--dark.v-select .v-select__selection--disabled{color:hsla(0,0%,100%,.5)}.theme--dark.v-select.v-text-field--solo-inverted.v-input--is-focused .v-select__selections{color:rgba(0,0,0,.87)}.v-select:not(.v-select--is-multi).v-text-field--single-line .v-select__selections{flex-wrap:nowrap}.v-select>.v-input__control>.v-input__slot{cursor:pointer}.v-select .v-chip{flex:0 1 auto;margin:4px}.v-select .v-chip--selected:after{opacity:.22}.v-select .fade-transition-leave-active{position:absolute;left:0}.v-select.v-input--is-dirty ::-moz-placeholder{color:transparent!important}.v-select.v-input--is-dirty :-ms-input-placeholder{color:transparent!important}.v-select.v-input--is-dirty ::placeholder{color:transparent!important}.v-select:not(.v-input--is-dirty):not(.v-input--is-focused) .v-text-field__prefix{line-height:20px;top:7px;transition:.3s cubic-bezier(.25,.8,.5,1)}.v-select.v-text-field--enclosed:not(.v-text-field--single-line):not(.v-text-field--outlined) .v-select__selections{padding-top:20px}.v-select.v-text-field--outlined:not(.v-text-field--single-line) .v-select__selections{padding:8px 0}.v-select.v-text-field--outlined:not(.v-text-field--single-line).v-input--dense .v-select__selections{padding:4px 0}.v-select.v-text-field input{flex:1 1;min-width:0;pointer-events:none;position:relative}.v-select.v-text-field:not(.v-text-field--single-line) input{margin-top:0}.v-select.v-select--is-menu-active .v-input__icon--append .v-icon{transform:rotate(180deg)}.v-select.v-select--chips input{margin:0}.v-select.v-select--chips .v-select__selections{min-height:42px}.v-select.v-select--chips.v-input--dense .v-select__selections{min-height:40px}.v-select.v-select--chips .v-chip--select.v-chip--active:before{opacity:.2}.v-select.v-select--chips.v-select--chips--small .v-select__selections{min-height:26px}.v-select.v-select--chips:not(.v-text-field--single-line).v-text-field--box .v-select__selections,.v-select.v-select--chips:not(.v-text-field--single-line).v-text-field--enclosed .v-select__selections{min-height:68px}.v-select.v-select--chips:not(.v-text-field--single-line).v-text-field--box.v-input--dense .v-select__selections,.v-select.v-select--chips:not(.v-text-field--single-line).v-text-field--enclosed.v-input--dense .v-select__selections{min-height:40px}.v-select.v-select--chips:not(.v-text-field--single-line).v-text-field--box.v-select--chips--small .v-select__selections,.v-select.v-select--chips:not(.v-text-field--single-line).v-text-field--enclosed.v-select--chips--small .v-select__selections{min-height:26px}.v-select.v-select--chips:not(.v-text-field--single-line).v-text-field--box.v-select--chips--small.v-input--dense .v-select__selections,.v-select.v-select--chips:not(.v-text-field--single-line).v-text-field--enclosed.v-select--chips--small.v-input--dense .v-select__selections{min-height:38px}.v-select.v-text-field--reverse .v-select__selections,.v-select.v-text-field--reverse .v-select__slot{flex-direction:row-reverse}.v-select__selections{align-items:center;display:flex;flex:1 1;flex-wrap:wrap;line-height:18px;max-width:100%;min-width:0}.v-select__selection{max-width:90%}.v-select__selection--comma{margin:7px 4px 7px 0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.v-select.v-input--dense .v-select__selection--comma{margin:5px 4px 3px 0}.v-select.v-input--dense .v-chip{margin:0 4px 0 4px}.v-select__slot{position:relative;align-items:center;display:flex;max-width:100%;min-width:0;width:100%}.v-select:not(.v-text-field--single-line):not(.v-text-field--outlined) .v-select__slot>input{align-self:flex-end}.theme--light.v-list-item--disabled{color:rgba(0,0,0,.38)}.theme--light.v-list-item:not(.v-list-item--active):not(.v-list-item--disabled){color:rgba(0,0,0,.87)}.theme--light.v-list-item .v-list-item__mask{color:rgba(0,0,0,.38);background:#eee}.theme--light.v-list-item .v-list-item__action-text,.theme--light.v-list-item .v-list-item__subtitle{color:rgba(0,0,0,.6)}.theme--light.v-list-item:hover:before{opacity:.04}.theme--light.v-list-item--active:before,.theme--light.v-list-item--active:hover:before,.theme--light.v-list-item:focus:before{opacity:.12}.theme--light.v-list-item--active:focus:before,.theme--light.v-list-item.v-list-item--highlighted:before{opacity:.16}.theme--dark.v-list-item--disabled{color:hsla(0,0%,100%,.5)}.theme--dark.v-list-item:not(.v-list-item--active):not(.v-list-item--disabled){color:#fff}.theme--dark.v-list-item .v-list-item__mask{color:hsla(0,0%,100%,.5);background:#494949}.theme--dark.v-list-item .v-list-item__action-text,.theme--dark.v-list-item .v-list-item__subtitle{color:hsla(0,0%,100%,.7)}.theme--dark.v-list-item:hover:before{opacity:.08}.theme--dark.v-list-item--active:before,.theme--dark.v-list-item--active:hover:before,.theme--dark.v-list-item:focus:before{opacity:.24}.theme--dark.v-list-item--active:focus:before,.theme--dark.v-list-item.v-list-item--highlighted:before{opacity:.32}.v-list-item{align-items:center;display:flex;flex:1 1 100%;letter-spacing:normal;min-height:48px;outline:none;padding:0 16px;position:relative;text-decoration:none}.v-list-item--disabled{pointer-events:none}.v-list-item--selectable{-webkit-user-select:auto;-moz-user-select:auto;-ms-user-select:auto;user-select:auto}.v-list-item:after{content:"";min-height:inherit;font-size:0}.v-list-item__action{align-self:center;margin:12px 0}.v-list-item__action .v-input,.v-list-item__action .v-input--selection-controls__input,.v-list-item__action .v-input__control,.v-list-item__action .v-input__slot{margin:0!important}.v-list-item__action .v-input{padding:0}.v-list-item__action .v-input .v-messages{display:none}.v-list-item__action-text{font-size:.75rem}.v-list-item__avatar{align-self:center;justify-content:flex-start}.v-list-item__avatar,.v-list-item__avatar.v-list-item__avatar--horizontal{margin-bottom:8px;margin-top:8px}.v-application--is-ltr .v-list-item__avatar.v-list-item__avatar--horizontal:first-child{margin-left:-16px}.v-application--is-rtl .v-list-item__avatar.v-list-item__avatar--horizontal:first-child{margin-right:-16px}.v-application--is-ltr .v-list-item__avatar.v-list-item__avatar--horizontal:last-child{margin-left:-16px}.v-application--is-rtl .v-list-item__avatar.v-list-item__avatar--horizontal:last-child{margin-right:-16px}.v-list-item__content{align-items:center;align-self:center;display:flex;flex-wrap:wrap;flex:1 1;overflow:hidden;padding:12px 0}.v-list-item__content>*{line-height:1.1;flex:1 0 100%}.v-list-item__content>:not(:last-child){margin-bottom:2px}.v-list-item__icon{align-self:flex-start;margin:16px 0}.v-application--is-ltr .v-list-item__action:last-of-type:not(:only-child),.v-application--is-ltr .v-list-item__avatar:last-of-type:not(:only-child),.v-application--is-ltr .v-list-item__icon:last-of-type:not(:only-child){margin-left:16px}.v-application--is-ltr .v-list-item__avatar:first-child,.v-application--is-rtl .v-list-item__action:last-of-type:not(:only-child),.v-application--is-rtl .v-list-item__avatar:last-of-type:not(:only-child),.v-application--is-rtl .v-list-item__icon:last-of-type:not(:only-child){margin-right:16px}.v-application--is-rtl .v-list-item__avatar:first-child{margin-left:16px}.v-application--is-ltr .v-list-item__action:first-child,.v-application--is-ltr .v-list-item__icon:first-child{margin-right:32px}.v-application--is-rtl .v-list-item__action:first-child,.v-application--is-rtl .v-list-item__icon:first-child{margin-left:32px}.v-list-item__action,.v-list-item__avatar,.v-list-item__icon{display:inline-flex;min-width:24px}.v-list-item .v-list-item__subtitle,.v-list-item .v-list-item__title{line-height:1.2}.v-list-item__subtitle,.v-list-item__title{flex:1 1 100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.v-list-item__title{align-self:center;font-size:1rem}.v-list-item__title>.v-badge{margin-top:16px}.v-list-item__subtitle{font-size:.875rem}.v-list--dense .v-list-item,.v-list-item--dense{min-height:40px}.v-list--dense .v-list-item .v-list-item__icon,.v-list-item--dense .v-list-item__icon{height:24px;margin-top:8px;margin-bottom:8px}.v-list--dense .v-list-item .v-list-item__content,.v-list-item--dense .v-list-item__content{padding:8px 0}.v-list--dense .v-list-item .v-list-item__subtitle,.v-list--dense .v-list-item .v-list-item__title,.v-list-item--dense .v-list-item__subtitle,.v-list-item--dense .v-list-item__title{font-size:.8125rem;font-weight:500;line-height:1rem}.v-list--dense .v-list-item.v-list-item--two-line,.v-list-item--dense.v-list-item--two-line{min-height:60px}.v-list--dense .v-list-item.v-list-item--three-line,.v-list-item--dense.v-list-item--three-line{min-height:76px}.v-list-item--link{cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.v-list-item--link:before{background-color:currentColor;bottom:0;content:"";left:0;opacity:0;pointer-events:none;position:absolute;right:0;top:0;transition:.3s cubic-bezier(.25,.8,.5,1)}.v-list .v-list-item--active,.v-list .v-list-item--active .v-icon{color:inherit}.v-list-item__action--stack{align-items:flex-end;align-self:stretch;justify-content:space-between;white-space:nowrap;flex-direction:column}.v-list--three-line .v-list-item .v-list-item__avatar:not(.v-list-item__avatar--horizontal),.v-list--three-line .v-list-item .v-list-item__icon,.v-list--two-line .v-list-item .v-list-item__avatar:not(.v-list-item__avatar--horizontal),.v-list--two-line .v-list-item .v-list-item__icon,.v-list-item--three-line .v-list-item__avatar:not(.v-list-item__avatar--horizontal),.v-list-item--three-line .v-list-item__icon,.v-list-item--two-line .v-list-item__avatar:not(.v-list-item__avatar--horizontal),.v-list-item--two-line .v-list-item__icon{margin-bottom:16px;margin-top:16px}.v-list--two-line .v-list-item,.v-list-item--two-line{min-height:64px}.v-list--two-line .v-list-item .v-list-item__icon,.v-list-item--two-line .v-list-item__icon{margin-bottom:32px}.v-list--three-line .v-list-item,.v-list-item--three-line{min-height:88px}.v-list--three-line .v-list-item .v-list-item__action,.v-list--three-line .v-list-item .v-list-item__avatar,.v-list-item--three-line .v-list-item__action,.v-list-item--three-line .v-list-item__avatar{align-self:flex-start;margin-top:16px;margin-bottom:16px}.v-list--three-line .v-list-item .v-list-item__content,.v-list-item--three-line .v-list-item__content{align-self:stretch}.v-list--three-line .v-list-item .v-list-item__subtitle,.v-list-item--three-line .v-list-item__subtitle{white-space:normal;-webkit-line-clamp:2;-webkit-box-orient:vertical;display:-webkit-box}.v-simple-checkbox{align-self:center;line-height:normal;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.v-simple-checkbox .v-icon{cursor:pointer}.v-simple-checkbox--disabled{cursor:default}.theme--light.v-subheader{color:rgba(0,0,0,.6)}.theme--dark.v-subheader{color:hsla(0,0%,100%,.7)}.v-subheader{align-items:center;display:flex;height:48px;font-size:.875rem;font-weight:400;padding:0 16px 0 16px}.v-subheader--inset{margin-left:56px}.v-list.accent>.v-list-item,.v-list.error>.v-list-item,.v-list.info>.v-list-item,.v-list.primary>.v-list-item,.v-list.secondary>.v-list-item,.v-list.success>.v-list-item,.v-list.warning>.v-list-item{color:#fff}.theme--light.v-list{background:#fff;color:rgba(0,0,0,.87)}.theme--light.v-list .v-list--disabled{color:rgba(0,0,0,.38)}.theme--light.v-list .v-list-group--active:after,.theme--light.v-list .v-list-group--active:before{background:rgba(0,0,0,.12)}.theme--dark.v-list{background:#1e1e1e;color:#fff}.theme--dark.v-list .v-list--disabled{color:hsla(0,0%,100%,.5)}.theme--dark.v-list .v-list-group--active:after,.theme--dark.v-list .v-list-group--active:before{background:hsla(0,0%,100%,.12)}.v-sheet.v-list{border-radius:0}.v-sheet.v-list:not(.v-sheet--outlined){box-shadow:0 0 0 0 rgba(0,0,0,.2),0 0 0 0 rgba(0,0,0,.14),0 0 0 0 rgba(0,0,0,.12)}.v-sheet.v-list.v-sheet--shaped{border-radius:0}.v-list{display:block;padding:8px 0;position:static;transition:box-shadow .28s cubic-bezier(.4,0,.2,1)}.v-list--disabled{pointer-events:none}.v-list--flat .v-list-item:before{display:none}.v-list--dense .v-subheader{font-size:.75rem;height:40px;padding:0 8px}.v-list--nav .v-list-item:not(:last-child):not(:only-child),.v-list--rounded .v-list-item:not(:last-child):not(:only-child){margin-bottom:8px}.v-list--nav.v-list--dense .v-list-item:not(:last-child):not(:only-child),.v-list--nav .v-list-item--dense:not(:last-child):not(:only-child),.v-list--rounded.v-list--dense .v-list-item:not(:last-child):not(:only-child),.v-list--rounded .v-list-item--dense:not(:last-child):not(:only-child){margin-bottom:4px}.v-list--nav{padding-left:8px;padding-right:8px}.v-list--nav .v-list-item{padding:0 8px}.v-list--nav .v-list-item,.v-list--nav .v-list-item:before{border-radius:4px}.v-application--is-ltr .v-list.v-sheet--shaped .v-list-item,.v-application--is-ltr .v-list.v-sheet--shaped .v-list-item:before,.v-application--is-ltr .v-list.v-sheet--shaped .v-list-item>.v-ripple__container{border-bottom-right-radius:32px!important;border-top-right-radius:32px!important}.v-application--is-rtl .v-list.v-sheet--shaped .v-list-item,.v-application--is-rtl .v-list.v-sheet--shaped .v-list-item:before,.v-application--is-rtl .v-list.v-sheet--shaped .v-list-item>.v-ripple__container{border-bottom-left-radius:32px!important;border-top-left-radius:32px!important}.v-application--is-ltr .v-list.v-sheet--shaped.v-list--two-line .v-list-item,.v-application--is-ltr .v-list.v-sheet--shaped.v-list--two-line .v-list-item:before,.v-application--is-ltr .v-list.v-sheet--shaped.v-list--two-line .v-list-item>.v-ripple__container{border-bottom-right-radius:42.6666666667px!important;border-top-right-radius:42.6666666667px!important}.v-application--is-rtl .v-list.v-sheet--shaped.v-list--two-line .v-list-item,.v-application--is-rtl .v-list.v-sheet--shaped.v-list--two-line .v-list-item:before,.v-application--is-rtl .v-list.v-sheet--shaped.v-list--two-line .v-list-item>.v-ripple__container{border-bottom-left-radius:42.6666666667px!important;border-top-left-radius:42.6666666667px!important}.v-application--is-ltr .v-list.v-sheet--shaped.v-list--three-line .v-list-item,.v-application--is-ltr .v-list.v-sheet--shaped.v-list--three-line .v-list-item:before,.v-application--is-ltr .v-list.v-sheet--shaped.v-list--three-line .v-list-item>.v-ripple__container{border-bottom-right-radius:58.6666666667px!important;border-top-right-radius:58.6666666667px!important}.v-application--is-rtl .v-list.v-sheet--shaped.v-list--three-line .v-list-item,.v-application--is-rtl .v-list.v-sheet--shaped.v-list--three-line .v-list-item:before,.v-application--is-rtl .v-list.v-sheet--shaped.v-list--three-line .v-list-item>.v-ripple__container{border-bottom-left-radius:58.6666666667px!important;border-top-left-radius:58.6666666667px!important}.v-application--is-ltr .v-list.v-sheet--shaped{padding-right:8px}.v-application--is-rtl .v-list.v-sheet--shaped{padding-left:8px}.v-list--rounded{padding:8px}.v-list--rounded .v-list-item,.v-list--rounded .v-list-item:before,.v-list--rounded .v-list-item>.v-ripple__container{border-radius:32px!important}.v-list--rounded.v-list--two-line .v-list-item,.v-list--rounded.v-list--two-line .v-list-item:before,.v-list--rounded.v-list--two-line .v-list-item>.v-ripple__container{border-radius:42.6666666667px!important}.v-list--rounded.v-list--three-line .v-list-item,.v-list--rounded.v-list--three-line .v-list-item:before,.v-list--rounded.v-list--three-line .v-list-item>.v-ripple__container{border-radius:58.6666666667px!important}.v-list--subheader{padding-top:0}.v-list-group .v-list-group__header .v-list-item__icon.v-list-group__header__append-icon{align-self:center;margin:0;min-width:48px;justify-content:flex-end}.v-list-group--sub-group{align-items:center;display:flex;flex-wrap:wrap}.v-list-group__header.v-list-item--active:not(:hover):not(:focus):before{opacity:0}.v-list-group__items{flex:1 1 auto}.v-list-group__items .v-list-group__items,.v-list-group__items .v-list-item{overflow:hidden}.v-list-group--active>.v-list-group__header.v-list-group__header--sub-group>.v-list-group__header__prepend-icon .v-icon,.v-list-group--active>.v-list-group__header>.v-list-group__header__append-icon .v-icon{transform:rotate(-180deg)}.v-list-group--active>.v-list-group__header .v-list-group__header__prepend-icon .v-icon,.v-list-group--active>.v-list-group__header .v-list-item,.v-list-group--active>.v-list-group__header .v-list-item__content{color:inherit}.v-application--is-ltr .v-list-group--sub-group .v-list-item__action:first-child,.v-application--is-ltr .v-list-group--sub-group .v-list-item__avatar:first-child,.v-application--is-ltr .v-list-group--sub-group .v-list-item__icon:first-child{margin-right:16px}.v-application--is-rtl .v-list-group--sub-group .v-list-item__action:first-child,.v-application--is-rtl .v-list-group--sub-group .v-list-item__avatar:first-child,.v-application--is-rtl .v-list-group--sub-group .v-list-item__icon:first-child{margin-left:16px}.v-application--is-ltr .v-list-group--sub-group .v-list-group__header{padding-left:32px}.v-application--is-rtl .v-list-group--sub-group .v-list-group__header{padding-right:32px}.v-application--is-ltr .v-list-group--sub-group .v-list-group__items .v-list-item{padding-left:40px}.v-application--is-rtl .v-list-group--sub-group .v-list-group__items .v-list-item{padding-right:40px}.v-list-group--sub-group.v-list-group--active .v-list-item__icon.v-list-group__header__prepend-icon .v-icon{transform:rotate(-180deg)}.v-application--is-ltr .v-list-group--no-action>.v-list-group__items>.v-list-item{padding-left:72px}.v-application--is-rtl .v-list-group--no-action>.v-list-group__items>.v-list-item{padding-right:72px}.v-application--is-ltr .v-list-group--no-action.v-list-group--sub-group>.v-list-group__items>.v-list-item{padding-left:88px}.v-application--is-rtl .v-list-group--no-action.v-list-group--sub-group>.v-list-group__items>.v-list-item{padding-right:88px}.v-application--is-ltr .v-list--dense .v-list-group--sub-group .v-list-group__header{padding-left:24px}.v-application--is-rtl .v-list--dense .v-list-group--sub-group .v-list-group__header{padding-right:24px}.v-application--is-ltr .v-list--dense.v-list--nav .v-list-group--no-action>.v-list-group__items>.v-list-item{padding-left:64px}.v-application--is-rtl .v-list--dense.v-list--nav .v-list-group--no-action>.v-list-group__items>.v-list-item{padding-right:64px}.v-application--is-ltr .v-list--dense.v-list--nav .v-list-group--no-action.v-list-group--sub-group>.v-list-group__items>.v-list-item{padding-left:80px}.v-application--is-rtl .v-list--dense.v-list--nav .v-list-group--no-action.v-list-group--sub-group>.v-list-group__items>.v-list-item{padding-right:80px}.v-avatar{align-items:center;border-radius:50%;display:inline-flex;justify-content:center;line-height:normal;position:relative;text-align:center;vertical-align:middle;overflow:hidden}.v-avatar .v-icon,.v-avatar .v-image,.v-avatar .v-responsive__content,.v-avatar img,.v-avatar svg{border-radius:inherit;display:inline-flex;height:inherit;width:inherit}.v-list-item-group .v-list-item--active{color:inherit}.v-item-group{flex:0 1 auto;position:relative;max-width:100%;transition:.3s cubic-bezier(.25,.8,.5,1)}.v-chip:not(.v-chip--outlined).accent,.v-chip:not(.v-chip--outlined).error,.v-chip:not(.v-chip--outlined).info,.v-chip:not(.v-chip--outlined).primary,.v-chip:not(.v-chip--outlined).secondary,.v-chip:not(.v-chip--outlined).success,.v-chip:not(.v-chip--outlined).warning{color:#fff}.theme--light.v-chip{border-color:rgba(0,0,0,.12);color:rgba(0,0,0,.87)}.theme--light.v-chip:not(.v-chip--active){background:#e0e0e0}.theme--light.v-chip:hover:before{opacity:.04}.theme--light.v-chip--active:before,.theme--light.v-chip--active:hover:before,.theme--light.v-chip:focus:before{opacity:.12}.theme--light.v-chip--active:focus:before{opacity:.16}.theme--dark.v-chip{border-color:hsla(0,0%,100%,.12);color:#fff}.theme--dark.v-chip:not(.v-chip--active){background:#555}.theme--dark.v-chip:hover:before{opacity:.08}.theme--dark.v-chip--active:before,.theme--dark.v-chip--active:hover:before,.theme--dark.v-chip:focus:before{opacity:.24}.theme--dark.v-chip--active:focus:before{opacity:.32}.v-chip{align-items:center;cursor:default;display:inline-flex;line-height:20px;max-width:100%;outline:none;overflow:hidden;padding:0 12px;position:relative;text-decoration:none;transition-duration:.28s;transition-property:box-shadow,opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);vertical-align:middle;white-space:nowrap}.v-chip:before{background-color:currentColor;bottom:0;border-radius:inherit;content:"";left:0;opacity:0;position:absolute;pointer-events:none;right:0;top:0}.v-chip .v-avatar{height:24px!important;min-width:24px!important;width:24px!important}.v-chip .v-icon{font-size:24px}.v-application--is-ltr .v-chip .v-avatar--left,.v-application--is-ltr .v-chip .v-icon--left{margin-left:-6px;margin-right:6px}.v-application--is-ltr .v-chip .v-avatar--right,.v-application--is-ltr .v-chip .v-icon--right,.v-application--is-rtl .v-chip .v-avatar--left,.v-application--is-rtl .v-chip .v-icon--left{margin-left:6px;margin-right:-6px}.v-application--is-rtl .v-chip .v-avatar--right,.v-application--is-rtl .v-chip .v-icon--right{margin-left:-6px;margin-right:6px}.v-chip:not(.v-chip--no-color) .v-icon{color:inherit}.v-chip .v-chip__close.v-icon{font-size:18px;max-height:18px;max-width:18px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.v-application--is-ltr .v-chip .v-chip__close.v-icon.v-icon--right{margin-right:-4px}.v-application--is-rtl .v-chip .v-chip__close.v-icon.v-icon--right{margin-left:-4px}.v-chip .v-chip__close.v-icon:active,.v-chip .v-chip__close.v-icon:focus,.v-chip .v-chip__close.v-icon:hover{opacity:.72}.v-chip .v-chip__content{align-items:center;display:inline-flex;height:100%;max-width:100%}.v-chip--active .v-icon{color:inherit}.v-chip--link:before{transition:opacity .3s cubic-bezier(.25,.8,.5,1)}.v-chip--link:focus:before{opacity:.32}.v-chip--clickable{cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.v-chip--clickable:active{box-shadow:0 3px 1px -2px rgba(0,0,0,.2),0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12)}.v-chip--disabled{opacity:.4;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.v-chip__filter{max-width:24px}.v-chip__filter.v-icon{color:inherit}.v-chip__filter.expand-x-transition-enter,.v-chip__filter.expand-x-transition-leave-active{margin:0}.v-chip--pill .v-chip__filter{margin-right:0 16px 0 0}.v-chip--pill .v-avatar{height:32px!important;width:32px!important}.v-application--is-ltr .v-chip--pill .v-avatar--left{margin-left:-12px}.v-application--is-ltr .v-chip--pill .v-avatar--right,.v-application--is-rtl .v-chip--pill .v-avatar--left{margin-right:-12px}.v-application--is-rtl .v-chip--pill .v-avatar--right{margin-left:-12px}.v-chip--label{border-radius:4px!important}.v-chip.v-chip--outlined{border-width:thin;border-style:solid}.v-chip.v-chip--outlined.v-chip--active:before{opacity:.08}.v-chip.v-chip--outlined .v-icon{color:inherit}.v-chip.v-chip--outlined.v-chip.v-chip{background-color:transparent!important}.v-chip.v-chip--selected{background:transparent}.v-chip.v-chip--selected:after{opacity:.28}.v-chip.v-size--x-small{border-radius:8px;font-size:10px;height:16px}.v-chip.v-size--x-small .v-icon{font-size:10px;height:10px;width:10px}.v-chip.v-size--small{border-radius:12px;font-size:12px;height:24px}.v-chip.v-size--small .v-icon{font-size:12px;height:12px;width:12px}.v-chip.v-size--default{border-radius:16px;font-size:14px;height:32px}.v-chip.v-size--default .v-icon{font-size:14px;height:14px;width:14px}.v-chip.v-size--large{border-radius:27px;font-size:16px;height:54px}.v-chip.v-size--large .v-icon{font-size:16px;height:16px;width:16px}.v-chip.v-size--x-large{border-radius:33px;font-size:18px;height:66px}.v-chip.v-size--x-large .v-icon{font-size:18px;height:18px;width:18px}.v-menu{display:none}.v-menu--attached{display:inline}.v-menu__content{position:absolute;display:inline-block;max-width:80%;overflow-y:auto;overflow-x:hidden;contain:content;box-shadow:0 5px 5px -3px rgba(0,0,0,.2),0 8px 10px 1px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12);border-radius:4px}.v-menu__content--active{pointer-events:none}.v-menu__content--auto .v-list-item{transition-property:transform,opacity;transition-duration:.3s;transition-timing-function:cubic-bezier(.25,.8,.25,1)}.v-menu__content--fixed{position:fixed}.v-menu__content>.card{contain:content;backface-visibility:hidden}.v-menu>.v-menu__content{max-width:none}.v-menu-transition-enter .v-list-item{min-width:0;pointer-events:none}.v-menu-transition-enter-to .v-list-item{transition-delay:.1s}.v-menu-transition-leave-active,.v-menu-transition-leave-to{pointer-events:none}.v-menu-transition-enter,.v-menu-transition-leave-to{opacity:0}.v-menu-transition-enter-active,.v-menu-transition-leave-active{transition:all .3s cubic-bezier(.25,.8,.25,1)}.v-menu-transition-enter.v-menu__content--auto{transition:none!important}.v-menu-transition-enter.v-menu__content--auto .v-list-item{opacity:0;transform:translateY(-15px)}.v-menu-transition-enter.v-menu__content--auto .v-list-item--active{opacity:1;transform:none!important;pointer-events:auto}.theme--light.v-btn-toggle:not(.v-btn-toggle--group){background:#fff;color:rgba(0,0,0,.87)}.theme--light.v-btn-toggle:not(.v-btn-toggle--group) .v-btn.v-btn{border-color:rgba(0,0,0,.12)!important}.theme--light.v-btn-toggle:not(.v-btn-toggle--group) .v-btn.v-btn:focus:not(:active){border-color:rgba(0,0,0,.26)}.theme--light.v-btn-toggle:not(.v-btn-toggle--group) .v-btn.v-btn .v-icon{color:#000}.theme--dark.v-btn-toggle:not(.v-btn-toggle--group){background:#1e1e1e;color:#fff}.theme--dark.v-btn-toggle:not(.v-btn-toggle--group) .v-btn.v-btn{border-color:hsla(0,0%,100%,.12)!important}.theme--dark.v-btn-toggle:not(.v-btn-toggle--group) .v-btn.v-btn:focus:not(:active){border-color:hsla(0,0%,100%,.3)}.theme--dark.v-btn-toggle:not(.v-btn-toggle--group) .v-btn.v-btn .v-icon{color:#fff}.v-btn-toggle{border-radius:4px;display:inline-flex;max-width:100%}.v-btn-toggle>.v-btn.v-btn{border-radius:0;border-style:solid;border-width:thin;box-shadow:none;opacity:.8;padding:0 12px}.v-application--is-ltr .v-btn-toggle>.v-btn.v-btn:first-child{border-top-left-radius:inherit;border-bottom-left-radius:inherit}.v-application--is-ltr .v-btn-toggle>.v-btn.v-btn:last-child,.v-application--is-rtl .v-btn-toggle>.v-btn.v-btn:first-child{border-top-right-radius:inherit;border-bottom-right-radius:inherit}.v-application--is-rtl .v-btn-toggle>.v-btn.v-btn:last-child{border-top-left-radius:inherit;border-bottom-left-radius:inherit}.v-btn-toggle>.v-btn.v-btn--active{color:inherit;opacity:1}.v-btn-toggle>.v-btn.v-btn:after{display:none}.v-application--is-ltr .v-btn-toggle>.v-btn.v-btn:not(:first-child),.v-application--is-rtl .v-btn-toggle>.v-btn.v-btn:not(:last-child){border-left-width:0}.v-btn-toggle .v-btn.v-btn.v-size--default{min-width:48px;min-height:0}.v-btn-toggle:not(.v-btn-toggle--dense) .v-btn.v-btn.v-size--default{height:48px}.v-btn-toggle--borderless>.v-btn.v-btn{border-width:0}.v-btn-toggle--dense>.v-btn.v-btn{padding:0 8px}.v-btn-toggle--group{border-radius:0}.v-btn-toggle--group>.v-btn.v-btn{background-color:transparent!important;border-color:transparent;margin:4px;min-width:auto}.v-btn-toggle--rounded{border-radius:24px}.v-btn-toggle--shaped{border-radius:24px 4px}.v-btn-toggle--tile{border-radius:0}.v-select{position:relative;font-family:inherit}.v-select,.v-select *{box-sizing:border-box}@keyframes vSelectSpinner{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.vs__fade-enter-active,.vs__fade-leave-active{pointer-events:none;transition:opacity .15s cubic-bezier(1,.5,.8,1)}.vs__fade-enter,.vs__fade-leave-to{opacity:0}.vs--disabled .vs__clear,.vs--disabled .vs__dropdown-toggle,.vs--disabled .vs__open-indicator,.vs--disabled .vs__search,.vs--disabled .vs__selected{cursor:not-allowed;background-color:#f8f8f8}.v-select[dir=rtl] .vs__actions{padding:0 3px 0 6px}.v-select[dir=rtl] .vs__clear{margin-left:6px;margin-right:0}.v-select[dir=rtl] .vs__deselect{margin-left:0;margin-right:2px}.v-select[dir=rtl] .vs__dropdown-menu{text-align:right}.vs__dropdown-toggle{-webkit-appearance:none;-moz-appearance:none;appearance:none;display:flex;padding:0 0 4px;background:none;border:1px solid rgba(60,60,60,.26);border-radius:4px;white-space:normal}.vs__selected-options{display:flex;flex-basis:100%;flex-grow:1;flex-wrap:wrap;padding:0 2px;position:relative}.vs__actions{display:flex;align-items:center;padding:4px 6px 0 3px}.vs--searchable .vs__dropdown-toggle{cursor:text}.vs--unsearchable .vs__dropdown-toggle{cursor:pointer}.vs--open .vs__dropdown-toggle{border-bottom-color:transparent;border-bottom-left-radius:0;border-bottom-right-radius:0}.vs__open-indicator{fill:rgba(60,60,60,.5);transform:scale(1);transition:transform .15s cubic-bezier(1,-.115,.975,.855);transition-timing-function:cubic-bezier(1,-.115,.975,.855)}.vs--open .vs__open-indicator{transform:rotate(180deg) scale(1)}.vs--loading .vs__open-indicator{opacity:0}.vs__clear{fill:rgba(60,60,60,.5);padding:0;border:0;background-color:transparent;cursor:pointer;margin-right:8px}.vs__dropdown-menu{display:block;box-sizing:border-box;position:absolute;top:calc(100% - 1px);left:0;z-index:1000;padding:5px 0;margin:0;width:100%;max-height:350px;min-width:160px;overflow-y:auto;box-shadow:0 3px 6px 0 rgba(0,0,0,.15);border:1px solid rgba(60,60,60,.26);border-top-style:none;border-radius:0 0 4px 4px;text-align:left;list-style:none;background:#fff}.vs__no-options{text-align:center}.vs__dropdown-option{line-height:1.42857143;display:block;padding:3px 20px;clear:both;color:#333;white-space:nowrap;cursor:pointer}.vs__dropdown-option--highlight{background:#5897fb;color:#fff}.vs__dropdown-option--disabled{background:inherit;color:rgba(60,60,60,.5);cursor:inherit}.vs__selected{display:flex;align-items:center;background-color:#f0f0f0;border:1px solid rgba(60,60,60,.26);border-radius:4px;color:#333;line-height:1.4;margin:4px 2px 0;padding:0 .25em;z-index:0}.vs__deselect{display:inline-flex;-webkit-appearance:none;-moz-appearance:none;appearance:none;margin-left:4px;padding:0;border:0;cursor:pointer;background:none;fill:rgba(60,60,60,.5);text-shadow:0 1px 0 #fff}.vs--single .vs__selected{background-color:transparent;border-color:transparent}.vs--single.vs--open .vs__selected{position:absolute;opacity:.4}.vs--single.vs--searching .vs__selected{display:none}.vs__search::-webkit-search-cancel-button{display:none}.vs__search::-ms-clear,.vs__search::-webkit-search-decoration,.vs__search::-webkit-search-results-button,.vs__search::-webkit-search-results-decoration{display:none}.vs__search,.vs__search:focus{-webkit-appearance:none;-moz-appearance:none;appearance:none;line-height:1.4;font-size:1em;border:1px solid transparent;border-left:none;outline:none;margin:4px 0 0;padding:0 7px;background:none;box-shadow:none;width:0;max-width:100%;flex-grow:1;z-index:1}.vs__search::-moz-placeholder{color:inherit}.vs__search:-ms-input-placeholder{color:inherit}.vs__search::placeholder{color:inherit}.vs--unsearchable .vs__search{opacity:1}.vs--unsearchable:not(.vs--disabled) .vs__search:hover{cursor:pointer}.vs--single.vs--searching:not(.vs--open):not(.vs--loading) .vs__search{opacity:.2}.vs__spinner{align-self:center;opacity:0;font-size:5px;text-indent:-9999em;overflow:hidden;border:.9em solid hsla(0,0%,39.2%,.1);border-left-color:rgba(60,60,60,.45);transform:translateZ(0);animation:vSelectSpinner 1.1s linear infinite;transition:opacity .1s}.vs__spinner,.vs__spinner:after{border-radius:50%;width:5em;height:5em}.vs--loading .vs__spinner{opacity:1}.theme--light.v-expansion-panels .v-expansion-panel{background-color:#fff;color:rgba(0,0,0,.87)}.theme--light.v-expansion-panels .v-expansion-panel--disabled{color:rgba(0,0,0,.38)}.theme--light.v-expansion-panels .v-expansion-panel:not(:first-child):after{border-color:rgba(0,0,0,.12)}.theme--light.v-expansion-panels .v-expansion-panel-header .v-expansion-panel-header__icon .v-icon{color:rgba(0,0,0,.54)}.theme--light.v-expansion-panels.v-expansion-panels--focusable .v-expansion-panel-header:hover:before{opacity:.04}.theme--light.v-expansion-panels.v-expansion-panels--focusable .v-expansion-panel-header--active:before,.theme--light.v-expansion-panels.v-expansion-panels--focusable .v-expansion-panel-header--active:hover:before,.theme--light.v-expansion-panels.v-expansion-panels--focusable .v-expansion-panel-header:focus:before{opacity:.12}.theme--light.v-expansion-panels.v-expansion-panels--focusable .v-expansion-panel-header--active:focus:before{opacity:.16}.theme--light.v-expansion-panels.v-expansion-panels--hover>.v-expansion-panel>.v-expansion-panel-header:hover:hover:before{opacity:.04}.theme--light.v-expansion-panels.v-expansion-panels--hover>.v-expansion-panel>.v-expansion-panel-header:hover--active:before,.theme--light.v-expansion-panels.v-expansion-panels--hover>.v-expansion-panel>.v-expansion-panel-header:hover--active:hover:before,.theme--light.v-expansion-panels.v-expansion-panels--hover>.v-expansion-panel>.v-expansion-panel-header:hover:focus:before{opacity:.12}.theme--light.v-expansion-panels.v-expansion-panels--hover>.v-expansion-panel>.v-expansion-panel-header:hover--active:focus:before{opacity:.16}.theme--dark.v-expansion-panels .v-expansion-panel{background-color:#1e1e1e;color:#fff}.theme--dark.v-expansion-panels .v-expansion-panel--disabled{color:hsla(0,0%,100%,.5)}.theme--dark.v-expansion-panels .v-expansion-panel:not(:first-child):after{border-color:hsla(0,0%,100%,.12)}.theme--dark.v-expansion-panels .v-expansion-panel-header .v-expansion-panel-header__icon .v-icon{color:#fff}.theme--dark.v-expansion-panels.v-expansion-panels--focusable .v-expansion-panel-header:hover:before{opacity:.08}.theme--dark.v-expansion-panels.v-expansion-panels--focusable .v-expansion-panel-header--active:before,.theme--dark.v-expansion-panels.v-expansion-panels--focusable .v-expansion-panel-header--active:hover:before,.theme--dark.v-expansion-panels.v-expansion-panels--focusable .v-expansion-panel-header:focus:before{opacity:.24}.theme--dark.v-expansion-panels.v-expansion-panels--focusable .v-expansion-panel-header--active:focus:before{opacity:.32}.theme--dark.v-expansion-panels.v-expansion-panels--hover>.v-expansion-panel>.v-expansion-panel-header:hover:hover:before{opacity:.08}.theme--dark.v-expansion-panels.v-expansion-panels--hover>.v-expansion-panel>.v-expansion-panel-header:hover--active:before,.theme--dark.v-expansion-panels.v-expansion-panels--hover>.v-expansion-panel>.v-expansion-panel-header:hover--active:hover:before,.theme--dark.v-expansion-panels.v-expansion-panels--hover>.v-expansion-panel>.v-expansion-panel-header:hover:focus:before{opacity:.24}.theme--dark.v-expansion-panels.v-expansion-panels--hover>.v-expansion-panel>.v-expansion-panel-header:hover--active:focus:before{opacity:.32}.v-expansion-panels{border-radius:4px;display:flex;flex-wrap:wrap;justify-content:center;list-style-type:none;padding:0;width:100%;z-index:1}.v-expansion-panels>*{cursor:auto}.v-expansion-panels>:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}.v-expansion-panels>:last-child{border-bottom-left-radius:inherit;border-bottom-right-radius:inherit}.v-expansion-panels:not(.v-expansion-panels--accordion):not(.v-expansion-panels--tile)>.v-expansion-panel--active{border-radius:4px}.v-expansion-panels:not(.v-expansion-panels--accordion):not(.v-expansion-panels--tile)>.v-expansion-panel--active+.v-expansion-panel{border-top-left-radius:4px;border-top-right-radius:4px}.v-expansion-panels:not(.v-expansion-panels--accordion):not(.v-expansion-panels--tile)>.v-expansion-panel--next-active{border-bottom-left-radius:4px;border-bottom-right-radius:4px}.v-expansion-panels:not(.v-expansion-panels--accordion):not(.v-expansion-panels--tile)>.v-expansion-panel--next-active .v-expansion-panel-header{border-bottom-left-radius:inherit;border-bottom-right-radius:inherit}.v-expansion-panel{flex:1 0 100%;max-width:100%;position:relative;transition:.3s cubic-bezier(.25,.8,.5,1)}.v-expansion-panel:before{border-radius:inherit;bottom:0;content:"";left:0;position:absolute;right:0;top:0;z-index:-1;transition:box-shadow .28s cubic-bezier(.4,0,.2,1);box-shadow:0 3px 1px -2px rgba(0,0,0,.2),0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12)}.v-expansion-panel:not(:first-child):after{border-top:thin solid;content:"";left:0;position:absolute;right:0;top:0;transition:border-color .2s cubic-bezier(.4,0,.2,1),opacity .2s cubic-bezier(.4,0,.2,1)}.v-expansion-panel--disabled .v-expansion-panel-header{pointer-events:none}.v-expansion-panel--active+.v-expansion-panel,.v-expansion-panel--active:not(:first-child){margin-top:16px}.v-expansion-panel--active+.v-expansion-panel:after,.v-expansion-panel--active:not(:first-child):after{opacity:0}.v-expansion-panel--active>.v-expansion-panel-header{min-height:64px}.v-expansion-panel--active>.v-expansion-panel-header--active .v-expansion-panel-header__icon:not(.v-expansion-panel-header__icon--disable-rotate) .v-icon{transform:rotate(-180deg)}.v-expansion-panel-header__icon{display:inline-flex;margin-bottom:-4px;margin-top:-4px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.v-application--is-ltr .v-expansion-panel-header__icon{margin-left:auto}.v-application--is-rtl .v-expansion-panel-header__icon{margin-right:auto}.v-expansion-panel-header{align-items:center;border-top-left-radius:inherit;border-top-right-radius:inherit;display:flex;font-size:.9375rem;line-height:1;min-height:48px;outline:none;padding:16px 24px;position:relative;transition:min-height .3s cubic-bezier(.25,.8,.5,1);width:100%}.v-application--is-ltr .v-expansion-panel-header{text-align:left}.v-application--is-rtl .v-expansion-panel-header{text-align:right}.v-expansion-panel-header:not(.v-expansion-panel-header--mousedown):focus:before{opacity:.12}.v-expansion-panel-header:before{background-color:currentColor;border-radius:inherit;bottom:0;content:"";left:0;opacity:0;pointer-events:none;position:absolute;right:0;top:0;transition:opacity .3s cubic-bezier(.25,.8,.5,1)}.v-expansion-panel-header>:not(.v-expansion-panel-header__icon){flex:1 1 auto}.v-expansion-panel-content{display:flex}.v-expansion-panel-content__wrap{padding:0 24px 16px;flex:1 1 auto;max-width:100%}.v-expansion-panels--accordion>.v-expansion-panel{margin-top:0}.v-expansion-panels--accordion>.v-expansion-panel:after{opacity:1}.v-expansion-panels--popout>.v-expansion-panel{max-width:calc(100% - 32px)}.v-expansion-panels--popout>.v-expansion-panel--active{max-width:calc(100% + 16px)}.v-expansion-panels--inset>.v-expansion-panel{max-width:100%}.v-expansion-panels--inset>.v-expansion-panel--active{max-width:calc(100% - 32px)}.v-expansion-panels--flat>.v-expansion-panel:after{border-top:none}.v-expansion-panels--flat>.v-expansion-panel:before{box-shadow:0 0 0 0 rgba(0,0,0,.2),0 0 0 0 rgba(0,0,0,.14),0 0 0 0 rgba(0,0,0,.12)}.v-expansion-panels--tile,.v-expansion-panels--tile>.v-expansion-panel:before{border-radius:0}.theme--light.v-image{color:rgba(0,0,0,.87)}.theme--dark.v-image{color:#fff}.v-image{z-index:0}.v-image__image,.v-image__placeholder{z-index:-1;position:absolute;top:0;left:0;width:100%;height:100%}.v-image__image{background-repeat:no-repeat}.v-image__image--preload{filter:blur(2px)}.v-image__image--contain{background-size:contain}.v-image__image--cover{background-size:cover}.v-responsive{position:relative;overflow:hidden;flex:1 0 auto;max-width:100%;display:flex}.v-responsive__content{flex:1 0 0px;max-width:100%}.v-application--is-ltr .v-responsive__sizer~.v-responsive__content{margin-left:-100%}.v-application--is-rtl .v-responsive__sizer~.v-responsive__content{margin-right:-100%}.v-responsive__sizer{transition:padding-bottom .2s cubic-bezier(.25,.8,.5,1);flex:1 0 0px}.theme--light.v-navigation-drawer{background-color:#fff}.theme--light.v-navigation-drawer:not(.v-navigation-drawer--floating) .v-navigation-drawer__border{background-color:rgba(0,0,0,.12)}.theme--light.v-navigation-drawer .v-divider{border-color:rgba(0,0,0,.12)}.theme--dark.v-navigation-drawer{background-color:#363636}.theme--dark.v-navigation-drawer:not(.v-navigation-drawer--floating) .v-navigation-drawer__border{background-color:hsla(0,0%,100%,.12)}.theme--dark.v-navigation-drawer .v-divider{border-color:hsla(0,0%,100%,.12)}.v-navigation-drawer{-webkit-overflow-scrolling:touch;display:flex;flex-direction:column;left:0;max-width:100%;overflow:hidden;pointer-events:auto;top:0;transition-duration:.2s;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-property:transform,visibility,width}.v-navigation-drawer:not([data-booted=true]){transition:none!important}.v-navigation-drawer.v-navigation-drawer--right:after{left:0;right:auto}.v-navigation-drawer .v-list:not(.v-select-list){background:inherit}.v-navigation-drawer__border{position:absolute;right:0;top:0;height:100%;width:1px}.v-navigation-drawer__content{height:100%;overflow-y:auto;overflow-x:hidden}.v-navigation-drawer__image{border-radius:inherit;height:100%;position:absolute;top:0;bottom:0;z-index:-1;contain:strict;width:100%}.v-navigation-drawer__image .v-image{border-radius:inherit}.v-navigation-drawer--bottom.v-navigation-drawer--is-mobile{max-height:50%;top:auto;bottom:0;min-width:100%}.v-navigation-drawer--right{left:auto;right:0}.v-navigation-drawer--right>.v-navigation-drawer__border{right:auto;left:0}.v-navigation-drawer--absolute{z-index:1}.v-navigation-drawer--fixed{z-index:6}.v-navigation-drawer--absolute{position:absolute}.v-navigation-drawer--clipped:not(.v-navigation-drawer--temporary):not(.v-navigation-drawer--is-mobile){z-index:4}.v-navigation-drawer--fixed{position:fixed}.v-navigation-drawer--floating:after{display:none}.v-navigation-drawer--mini-variant{overflow:hidden}.v-navigation-drawer--mini-variant .v-list-item>:first-child{margin-left:0;margin-right:0}.v-navigation-drawer--mini-variant .v-list-item>:not(:first-child){position:absolute!important;height:1px;width:1px;overflow:hidden;clip:rect(1px,1px,1px,1px);white-space:nowrap;display:initial}.v-navigation-drawer--mini-variant .v-list-group--no-action .v-list-group__items,.v-navigation-drawer--mini-variant .v-list-group--sub-group{display:none}.v-navigation-drawer--mini-variant.v-navigation-drawer--custom-mini-variant .v-list-item{justify-content:center}.v-navigation-drawer--temporary{z-index:7}.v-navigation-drawer--mobile{z-index:6}.v-navigation-drawer--close{visibility:hidden}.v-navigation-drawer--is-mobile:not(.v-navigation-drawer--close),.v-navigation-drawer--temporary:not(.v-navigation-drawer--close){box-shadow:0 8px 10px -5px rgba(0,0,0,.2),0 16px 24px 2px rgba(0,0,0,.14),0 6px 30px 5px rgba(0,0,0,.12)}.theme--light.v-application{background:#fff;color:rgba(0,0,0,.87)}.theme--light.v-application .text--primary{color:rgba(0,0,0,.87)!important}.theme--light.v-application .text--secondary{color:rgba(0,0,0,.6)!important}.theme--light.v-application .text--disabled{color:rgba(0,0,0,.38)!important}.theme--dark.v-application{background:#121212;color:#fff}.theme--dark.v-application .text--primary{color:#fff!important}.theme--dark.v-application .text--secondary{color:hsla(0,0%,100%,.7)!important}.theme--dark.v-application .text--disabled{color:hsla(0,0%,100%,.5)!important}.v-application{display:flex;position:relative}.v-application a{cursor:pointer}.v-application--is-rtl{direction:rtl}.v-application--wrap{flex:1 1 auto;backface-visibility:hidden;display:flex;flex-direction:column;min-height:100vh;max-width:100%;position:relative}@-moz-document url-prefix(){@media print{.v-application,.v-application--wrap{display:block}}}@font-face{font-family:Roboto;src:url(../fonts/Roboto-Thin.ad538a69.woff2) format("woff2"),url(../fonts/Roboto-Thin.d3b47375.woff) format("woff");font-weight:100;font-style:normal}@font-face{font-family:Roboto-Thin;src:url(../fonts/Roboto-Thin.ad538a69.woff2) format("woff2"),url(../fonts/Roboto-Thin.d3b47375.woff) format("woff")}@font-face{font-family:Roboto;src:url(../fonts/Roboto-ThinItalic.5b4a33e1.woff2) format("woff2"),url(../fonts/Roboto-ThinItalic.8a96edbb.woff) format("woff");font-weight:100;font-style:italic}@font-face{font-family:Roboto-ThinItalic;src:url(../fonts/Roboto-ThinItalic.5b4a33e1.woff2) format("woff2"),url(../fonts/Roboto-ThinItalic.8a96edbb.woff) format("woff")}@font-face{font-family:Roboto;src:url(../fonts/Roboto-Light.d26871e8.woff2) format("woff2"),url(../fonts/Roboto-Light.c73eb1ce.woff) format("woff");font-weight:300;font-style:normal}@font-face{font-family:Roboto-Light;src:url(../fonts/Roboto-Light.d26871e8.woff2) format("woff2"),url(../fonts/Roboto-Light.c73eb1ce.woff) format("woff")}@font-face{font-family:Roboto;src:url(../fonts/Roboto-LightItalic.e8eaae90.woff2) format("woff2"),url(../fonts/Roboto-LightItalic.13efe6cb.woff) format("woff");font-weight:300;font-style:italic}@font-face{font-family:Roboto-LightItalic;src:url(../fonts/Roboto-LightItalic.e8eaae90.woff2) format("woff2"),url(../fonts/Roboto-LightItalic.13efe6cb.woff) format("woff")}@font-face{font-family:Roboto;src:url(../fonts/Roboto-Regular.73f0a88b.woff2) format("woff2"),url(../fonts/Roboto-Regular.35b07eb2.woff) format("woff");font-weight:400;font-style:normal}@font-face{font-family:Roboto-Regular;src:url(../fonts/Roboto-Regular.73f0a88b.woff2) format("woff2"),url(../fonts/Roboto-Regular.35b07eb2.woff) format("woff")}@font-face{font-family:Roboto;src:url(../fonts/Roboto-RegularItalic.4357beb8.woff2) format("woff2"),url(../fonts/Roboto-RegularItalic.f5902d5e.woff) format("woff");font-weight:400;font-style:italic}@font-face{font-family:Roboto-RegularItalic;src:url(../fonts/Roboto-RegularItalic.4357beb8.woff2) format("woff2"),url(../fonts/Roboto-RegularItalic.f5902d5e.woff) format("woff")}@font-face{font-family:Roboto;src:url(../fonts/Roboto-Medium.90d16760.woff2) format("woff2"),url(../fonts/Roboto-Medium.1d659482.woff) format("woff");font-weight:500;font-style:normal}@font-face{font-family:Roboto-Medium;src:url(../fonts/Roboto-Medium.90d16760.woff2) format("woff2"),url(../fonts/Roboto-Medium.1d659482.woff) format("woff")}@font-face{font-family:Roboto;src:url(../fonts/Roboto-MediumItalic.13ec0eb5.woff2) format("woff2"),url(../fonts/Roboto-MediumItalic.83e114c3.woff) format("woff");font-weight:500;font-style:italic}@font-face{font-family:Roboto-MediumItalic;src:url(../fonts/Roboto-MediumItalic.13ec0eb5.woff2) format("woff2"),url(../fonts/Roboto-MediumItalic.83e114c3.woff) format("woff")}@font-face{font-family:Roboto;src:url(../fonts/Roboto-Bold.b52fac2b.woff2) format("woff2"),url(../fonts/Roboto-Bold.50d75e48.woff) format("woff");font-weight:700;font-style:normal}@font-face{font-family:Roboto-Bold;src:url(../fonts/Roboto-Bold.b52fac2b.woff2) format("woff2"),url(../fonts/Roboto-Bold.50d75e48.woff) format("woff")}@font-face{font-family:Roboto;src:url(../fonts/Roboto-BoldItalic.94008e69.woff2) format("woff2"),url(../fonts/Roboto-BoldItalic.4fe0f73c.woff) format("woff");font-weight:700;font-style:italic}@font-face{font-family:Roboto-BoldItalic;src:url(../fonts/Roboto-BoldItalic.94008e69.woff2) format("woff2"),url(../fonts/Roboto-BoldItalic.4fe0f73c.woff) format("woff")}@font-face{font-family:Roboto;src:url(../fonts/Roboto-Black.59eb3601.woff2) format("woff2"),url(../fonts/Roboto-Black.313a6563.woff) format("woff");font-weight:900;font-style:normal}@font-face{font-family:Roboto-Black;src:url(../fonts/Roboto-Black.59eb3601.woff2) format("woff2"),url(../fonts/Roboto-Black.313a6563.woff) format("woff")}@font-face{font-family:Roboto;src:url(../fonts/Roboto-BlackItalic.f75569f8.woff2) format("woff2"),url(../fonts/Roboto-BlackItalic.cc2fadc3.woff) format("woff");font-weight:900;font-style:italic}@font-face{font-family:Roboto-BlackItalic;src:url(../fonts/Roboto-BlackItalic.f75569f8.woff2) format("woff2"),url(../fonts/Roboto-BlackItalic.cc2fadc3.woff) format("woff")}
\ No newline at end of file
diff --git a/dist/demo.css b/dist/demo.css
new file mode 100644
index 00000000..a712e7bf
--- /dev/null
+++ b/dist/demo.css
@@ -0,0 +1,53 @@
+#canvas_block {
+ position: fixed;
+ padding: 0px;
+}
+
+#c {
+ width: 100%;
+ height: 100%;
+}
+
+#button_block {
+ display: block;
+ position: fixed;
+ left: 0;
+ width: 250px;
+ height: 100%;
+ background: #eee;
+ top: 0;
+}
+
+#param-slider-container {
+ padding: 15;
+}
+
+hr {
+ border: 0;
+ border-bottom: 1px dashed #ccc;
+ background: #999;
+}
+
+.slider-container {
+ margin-bottom: 10;
+}
+
+.btn-label:first-of-type {
+ margin-top: 0;
+}
+
+.btn-label {
+ width: 100%;
+ display: block;
+ background-color: #1c2b44;
+ height: auto;
+ padding: 10px;
+ font-size: 14px;
+ margin: 1em 0 1em 0;
+ color: #eee;
+ text-shadow: 0 -1px 0 #000;
+ letter-spacing: 0.1em;
+ text-transform: uppercase;
+ font-weight: normal;
+ box-shadow: 0 2px 0px #ccc;
+}
diff --git a/dist/favicon.ico b/dist/favicon.ico
new file mode 100644
index 00000000..9b5c5c98
Binary files /dev/null and b/dist/favicon.ico differ
diff --git a/dist/fonts/Roboto-Black.313a6563.woff b/dist/fonts/Roboto-Black.313a6563.woff
new file mode 100644
index 00000000..b1ddac3f
Binary files /dev/null and b/dist/fonts/Roboto-Black.313a6563.woff differ
diff --git a/dist/fonts/Roboto-Black.59eb3601.woff2 b/dist/fonts/Roboto-Black.59eb3601.woff2
new file mode 100644
index 00000000..41186d07
Binary files /dev/null and b/dist/fonts/Roboto-Black.59eb3601.woff2 differ
diff --git a/dist/fonts/Roboto-BlackItalic.cc2fadc3.woff b/dist/fonts/Roboto-BlackItalic.cc2fadc3.woff
new file mode 100644
index 00000000..b97efeaf
Binary files /dev/null and b/dist/fonts/Roboto-BlackItalic.cc2fadc3.woff differ
diff --git a/dist/fonts/Roboto-BlackItalic.f75569f8.woff2 b/dist/fonts/Roboto-BlackItalic.f75569f8.woff2
new file mode 100644
index 00000000..df3c3f44
Binary files /dev/null and b/dist/fonts/Roboto-BlackItalic.f75569f8.woff2 differ
diff --git a/dist/fonts/Roboto-Bold.50d75e48.woff b/dist/fonts/Roboto-Bold.50d75e48.woff
new file mode 100644
index 00000000..6e0f5626
Binary files /dev/null and b/dist/fonts/Roboto-Bold.50d75e48.woff differ
diff --git a/dist/fonts/Roboto-Bold.b52fac2b.woff2 b/dist/fonts/Roboto-Bold.b52fac2b.woff2
new file mode 100644
index 00000000..76817cc7
Binary files /dev/null and b/dist/fonts/Roboto-Bold.b52fac2b.woff2 differ
diff --git a/dist/fonts/Roboto-BoldItalic.4fe0f73c.woff b/dist/fonts/Roboto-BoldItalic.4fe0f73c.woff
new file mode 100644
index 00000000..ea90d717
Binary files /dev/null and b/dist/fonts/Roboto-BoldItalic.4fe0f73c.woff differ
diff --git a/dist/fonts/Roboto-BoldItalic.94008e69.woff2 b/dist/fonts/Roboto-BoldItalic.94008e69.woff2
new file mode 100644
index 00000000..45c9ef73
Binary files /dev/null and b/dist/fonts/Roboto-BoldItalic.94008e69.woff2 differ
diff --git a/dist/fonts/Roboto-Light.c73eb1ce.woff b/dist/fonts/Roboto-Light.c73eb1ce.woff
new file mode 100644
index 00000000..b9e99185
Binary files /dev/null and b/dist/fonts/Roboto-Light.c73eb1ce.woff differ
diff --git a/dist/fonts/Roboto-Light.d26871e8.woff2 b/dist/fonts/Roboto-Light.d26871e8.woff2
new file mode 100644
index 00000000..ddbf4a92
Binary files /dev/null and b/dist/fonts/Roboto-Light.d26871e8.woff2 differ
diff --git a/dist/fonts/Roboto-LightItalic.13efe6cb.woff b/dist/fonts/Roboto-LightItalic.13efe6cb.woff
new file mode 100644
index 00000000..329ec9b5
Binary files /dev/null and b/dist/fonts/Roboto-LightItalic.13efe6cb.woff differ
diff --git a/dist/fonts/Roboto-LightItalic.e8eaae90.woff2 b/dist/fonts/Roboto-LightItalic.e8eaae90.woff2
new file mode 100644
index 00000000..ba70c2a3
Binary files /dev/null and b/dist/fonts/Roboto-LightItalic.e8eaae90.woff2 differ
diff --git a/dist/fonts/Roboto-Medium.1d659482.woff b/dist/fonts/Roboto-Medium.1d659482.woff
new file mode 100644
index 00000000..005e9281
Binary files /dev/null and b/dist/fonts/Roboto-Medium.1d659482.woff differ
diff --git a/dist/fonts/Roboto-Medium.90d16760.woff2 b/dist/fonts/Roboto-Medium.90d16760.woff2
new file mode 100644
index 00000000..6a88805f
Binary files /dev/null and b/dist/fonts/Roboto-Medium.90d16760.woff2 differ
diff --git a/dist/fonts/Roboto-MediumItalic.13ec0eb5.woff2 b/dist/fonts/Roboto-MediumItalic.13ec0eb5.woff2
new file mode 100644
index 00000000..cf21729c
Binary files /dev/null and b/dist/fonts/Roboto-MediumItalic.13ec0eb5.woff2 differ
diff --git a/dist/fonts/Roboto-MediumItalic.83e114c3.woff b/dist/fonts/Roboto-MediumItalic.83e114c3.woff
new file mode 100644
index 00000000..01eba140
Binary files /dev/null and b/dist/fonts/Roboto-MediumItalic.83e114c3.woff differ
diff --git a/dist/fonts/Roboto-Regular.35b07eb2.woff b/dist/fonts/Roboto-Regular.35b07eb2.woff
new file mode 100644
index 00000000..96c1986f
Binary files /dev/null and b/dist/fonts/Roboto-Regular.35b07eb2.woff differ
diff --git a/dist/fonts/Roboto-Regular.73f0a88b.woff2 b/dist/fonts/Roboto-Regular.73f0a88b.woff2
new file mode 100644
index 00000000..9a0064ec
Binary files /dev/null and b/dist/fonts/Roboto-Regular.73f0a88b.woff2 differ
diff --git a/dist/fonts/Roboto-RegularItalic.4357beb8.woff2 b/dist/fonts/Roboto-RegularItalic.4357beb8.woff2
new file mode 100644
index 00000000..e7f173b7
Binary files /dev/null and b/dist/fonts/Roboto-RegularItalic.4357beb8.woff2 differ
diff --git a/dist/fonts/Roboto-RegularItalic.f5902d5e.woff b/dist/fonts/Roboto-RegularItalic.f5902d5e.woff
new file mode 100644
index 00000000..818233db
Binary files /dev/null and b/dist/fonts/Roboto-RegularItalic.f5902d5e.woff differ
diff --git a/dist/fonts/Roboto-Thin.ad538a69.woff2 b/dist/fonts/Roboto-Thin.ad538a69.woff2
new file mode 100644
index 00000000..2fb9b5f6
Binary files /dev/null and b/dist/fonts/Roboto-Thin.ad538a69.woff2 differ
diff --git a/dist/fonts/Roboto-Thin.d3b47375.woff b/dist/fonts/Roboto-Thin.d3b47375.woff
new file mode 100644
index 00000000..e1cee8f4
Binary files /dev/null and b/dist/fonts/Roboto-Thin.d3b47375.woff differ
diff --git a/dist/fonts/Roboto-ThinItalic.5b4a33e1.woff2 b/dist/fonts/Roboto-ThinItalic.5b4a33e1.woff2
new file mode 100644
index 00000000..67c42406
Binary files /dev/null and b/dist/fonts/Roboto-ThinItalic.5b4a33e1.woff2 differ
diff --git a/dist/fonts/Roboto-ThinItalic.8a96edbb.woff b/dist/fonts/Roboto-ThinItalic.8a96edbb.woff
new file mode 100644
index 00000000..d3373781
Binary files /dev/null and b/dist/fonts/Roboto-ThinItalic.8a96edbb.woff differ
diff --git a/dist/fonts/materialdesignicons-webfont.147e3378.woff b/dist/fonts/materialdesignicons-webfont.147e3378.woff
new file mode 100644
index 00000000..a5ee6239
Binary files /dev/null and b/dist/fonts/materialdesignicons-webfont.147e3378.woff differ
diff --git a/dist/fonts/materialdesignicons-webfont.174c02fc.ttf b/dist/fonts/materialdesignicons-webfont.174c02fc.ttf
new file mode 100644
index 00000000..55456295
Binary files /dev/null and b/dist/fonts/materialdesignicons-webfont.174c02fc.ttf differ
diff --git a/dist/fonts/materialdesignicons-webfont.64d4cf64.eot b/dist/fonts/materialdesignicons-webfont.64d4cf64.eot
new file mode 100644
index 00000000..253bb4a5
Binary files /dev/null and b/dist/fonts/materialdesignicons-webfont.64d4cf64.eot differ
diff --git a/dist/fonts/materialdesignicons-webfont.7a44ea19.woff2 b/dist/fonts/materialdesignicons-webfont.7a44ea19.woff2
new file mode 100644
index 00000000..384ae573
Binary files /dev/null and b/dist/fonts/materialdesignicons-webfont.7a44ea19.woff2 differ
diff --git a/dist/img/3DuF_favicon_large.svg b/dist/img/3DuF_favicon_large.svg
new file mode 100644
index 00000000..2395b8bc
--- /dev/null
+++ b/dist/img/3DuF_favicon_large.svg
@@ -0,0 +1,72 @@
+
+
+
+
diff --git a/dist/img/3DuF_placeholder_logo.png b/dist/img/3DuF_placeholder_logo.png
new file mode 100644
index 00000000..ca03f7b4
Binary files /dev/null and b/dist/img/3DuF_placeholder_logo.png differ
diff --git a/dist/img/3DuF_placeholder_png.png b/dist/img/3DuF_placeholder_png.png
new file mode 100644
index 00000000..30b3e980
Binary files /dev/null and b/dist/img/3DuF_placeholder_png.png differ
diff --git a/dist/img/3DuF_placeholder_svg.svg b/dist/img/3DuF_placeholder_svg.svg
new file mode 100644
index 00000000..c3a3479c
--- /dev/null
+++ b/dist/img/3DuF_placeholder_svg.svg
@@ -0,0 +1,75 @@
+
+
+
+
diff --git a/dist/img/CHANNEL.6ac8d4e3.png b/dist/img/CHANNEL.6ac8d4e3.png
new file mode 100644
index 00000000..baff7c31
Binary files /dev/null and b/dist/img/CHANNEL.6ac8d4e3.png differ
diff --git a/dist/img/cidar_logo.png b/dist/img/cidar_logo.png
new file mode 100644
index 00000000..3d11c8bd
Binary files /dev/null and b/dist/img/cidar_logo.png differ
diff --git a/dist/img/favicon_large.png b/dist/img/favicon_large.png
new file mode 100644
index 00000000..e30df0c9
Binary files /dev/null and b/dist/img/favicon_large.png differ
diff --git a/dist/img/logo.png b/dist/img/logo.png
new file mode 100644
index 00000000..2c50163a
Binary files /dev/null and b/dist/img/logo.png differ
diff --git a/dist/index.html b/dist/index.html
new file mode 100644
index 00000000..c6c1b2da
--- /dev/null
+++ b/dist/index.html
@@ -0,0 +1,10 @@
+
3DuF
\ No newline at end of file
diff --git a/dist/index2.html b/dist/index2.html
new file mode 100644
index 00000000..d17c2b08
--- /dev/null
+++ b/dist/index2.html
@@ -0,0 +1,829 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Specify Position
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Generate:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Input is not an integer !
+
+
+
+
+ Input is not an integer !
+
+
+
Spacing:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Grid Size :
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/dist/js/app.5e0ea8c0.js b/dist/js/app.5e0ea8c0.js
new file mode 100644
index 00000000..7b50bee2
--- /dev/null
+++ b/dist/js/app.5e0ea8c0.js
@@ -0,0 +1,2 @@
+(function(e){function t(t){for(var r,a,l=t[0],s=t[1],u=t[2],h=0,f=[];h0&&(v(e,t),setTimeout((function(){g(e,t)}),n))}function f(e){return Math.max(Math.min(e,100),0)}function d(e){return Array.isArray(e)?e:[e]}function p(e){e=String(e);var t=e.split(".");return t.length>1?t[1].length:0}function v(e,t){e.classList&&!/\s/.test(t)?e.classList.add(t):e.className+=" "+t}function g(e,t){e.classList&&!/\s/.test(t)?e.classList.remove(t):e.className=e.className.replace(new RegExp("(^|\\b)"+t.split(" ").join("|")+"(\\b|$)","gi")," ")}function y(e,t){return e.classList?e.classList.contains(t):new RegExp("\\b"+t+"\\b").test(e.className)}function m(e){var t=void 0!==window.pageXOffset,n="CSS1Compat"===(e.compatMode||""),r=t?window.pageXOffset:n?e.documentElement.scrollLeft:e.body.scrollLeft,o=t?window.pageYOffset:n?e.documentElement.scrollTop:e.body.scrollTop;return{x:r,y:o}}function w(){return window.navigator.pointerEnabled?{start:"pointerdown",move:"pointermove",end:"pointerup"}:window.navigator.msPointerEnabled?{start:"MSPointerDown",move:"MSPointerMove",end:"MSPointerUp"}:{start:"mousedown touchstart",move:"mousemove touchmove",end:"mouseup touchend"}}function b(){var e=!1;try{var t=Object.defineProperty({},"passive",{get:function(){e=!0}});window.addEventListener("test",null,t)}catch(n){}return e}function _(){return window.CSS&&CSS.supports&&CSS.supports("touch-action","none")}function P(e,t){return 100/(t-e)}function C(e,t,n){return 100*t/(e[n+1]-e[n])}function O(e,t){return C(e,e[0]<0?t+Math.abs(e[0]):t-e[0],0)}function S(e,t){return t*(e[1]-e[0])/100+e[0]}function R(e,t){var n=1;while(e>=t[n])n+=1;return n}function L(e,t,n){if(n>=e.slice(-1)[0])return 100;var r=R(n,e),o=e[r-1],i=e[r],a=t[r-1],l=t[r];return a+O([o,i],n)/P(a,l)}function k(e,t,n){if(n>=100)return e.slice(-1)[0];var r=R(n,t),o=e[r-1],i=e[r],a=t[r-1],l=t[r];return S([o,i],(n-a)*P(a,l))}function D(e,t,n,r){if(100===r)return r;var o=R(r,e),i=e[o-1],a=e[o];return n?r-i>(a-i)/2?a:i:t[o-1]?e[o-1]+s(r-e[o-1],t[o-1]):r}e.PipsMode=void 0,function(e){e["Range"]="range",e["Steps"]="steps",e["Positions"]="positions",e["Count"]="count",e["Values"]="values"}(e.PipsMode||(e.PipsMode={})),e.PipsType=void 0,function(e){e[e["None"]=-1]="None",e[e["NoValue"]=0]="NoValue",e[e["LargeValue"]=1]="LargeValue",e[e["SmallValue"]=2]="SmallValue"}(e.PipsType||(e.PipsType={}));var T=function(){function e(e,t,n){var r;this.xPct=[],this.xVal=[],this.xSteps=[],this.xNumSteps=[],this.xHighestCompleteStep=[],this.xSteps=[n||!1],this.xNumSteps=[!1],this.snap=t;var o=[];for(Object.keys(e).forEach((function(t){o.push([d(e[t]),t])})),o.sort((function(e,t){return e[0][0]-t[0][0]})),r=0;rthis.xPct[o+1])o++;else e===this.xPct[this.xPct.length-1]&&(o=this.xPct.length-2);n||e!==this.xPct[o+1]||o++,null===t&&(t=[]);var i=1,a=t[o],l=0,s=0,u=0,c=0;r=n?(e-this.xPct[o])/(this.xPct[o+1]-this.xPct[o]):(this.xPct[o+1]-e)/(this.xPct[o+1]-this.xPct[o]);while(a>0)l=this.xPct[o+1+c]-this.xPct[o+c],t[o+c]*i+100-100*r>100?(s=l*r,i=(a-100*r)/t[o+c],r=1):(s=t[o+c]*l/100*i,i=0),n?(u-=s,this.xPct.length+c>=1&&c--):(u+=s,this.xPct.length-c>=1&&c++),a=t[o+c]*i;return e+u},e.prototype.toStepping=function(e){return e=L(this.xVal,this.xPct,e),e},e.prototype.fromStepping=function(e){return k(this.xVal,this.xPct,e)},e.prototype.getStep=function(e){return e=D(this.xPct,this.xSteps,this.snap,e),e},e.prototype.getDefaultStep=function(e,t,n){var r=R(e,this.xPct);return(100===e||t&&e===this.xPct[r-1])&&(r=Math.max(r-1,1)),(this.xVal[r]-this.xVal[r-1])/n},e.prototype.getNearbySteps=function(e){var t=R(e,this.xPct);return{stepBefore:{startValue:this.xVal[t-2],step:this.xNumSteps[t-2],highestStep:this.xHighestCompleteStep[t-2]},thisStep:{startValue:this.xVal[t-1],step:this.xNumSteps[t-1],highestStep:this.xHighestCompleteStep[t-1]},stepAfter:{startValue:this.xVal[t],step:this.xNumSteps[t],highestStep:this.xHighestCompleteStep[t]}}},e.prototype.countStepDecimals=function(){var e=this.xNumSteps.map(p);return Math.max.apply(null,e)},e.prototype.hasNoSize=function(){return this.xVal[0]===this.xVal[this.xVal.length-1]},e.prototype.convert=function(e){return this.getStep(this.toStepping(e))},e.prototype.handleEntryPoint=function(e,t){var n;if(n="min"===e?0:"max"===e?100:parseFloat(e),!c(n)||!c(t[0]))throw new Error("noUiSlider: 'range' value isn't numeric.");this.xPct.push(n),this.xVal.push(t[0]);var r=Number(t[1]);n?this.xSteps.push(!isNaN(r)&&r):isNaN(r)||(this.xSteps[0]=r),this.xHighestCompleteStep.push(0)},e.prototype.handleStepPoint=function(e,t){if(t)if(this.xVal[e]!==this.xVal[e+1]){this.xSteps[e]=C([this.xVal[e],this.xVal[e+1]],t,0)/P(this.xPct[e],this.xPct[e+1]);var n=(this.xVal[e+1]-this.xVal[e])/this.xNumSteps[e],r=Math.ceil(Number(n.toFixed(3))-1),o=this.xVal[e]+this.xNumSteps[e]*r;this.xHighestCompleteStep[e]=o}else this.xSteps[e]=this.xHighestCompleteStep[e]=this.xVal[e]},e}(),F={to:function(e){return void 0===e?"":e.toFixed(2)},from:Number},E={target:"target",base:"base",origin:"origin",handle:"handle",handleLower:"handle-lower",handleUpper:"handle-upper",touchArea:"touch-area",horizontal:"horizontal",vertical:"vertical",background:"background",connect:"connect",connects:"connects",ltr:"ltr",rtl:"rtl",textDirectionLtr:"txt-dir-ltr",textDirectionRtl:"txt-dir-rtl",draggable:"draggable",drag:"state-drag",tap:"state-tap",active:"active",tooltip:"tooltip",pips:"pips",pipsHorizontal:"pips-horizontal",pipsVertical:"pips-vertical",marker:"marker",markerHorizontal:"marker-horizontal",markerVertical:"marker-vertical",markerNormal:"marker-normal",markerLarge:"marker-large",markerSub:"marker-sub",value:"value",valueHorizontal:"value-horizontal",valueVertical:"value-vertical",valueNormal:"value-normal",valueLarge:"value-large",valueSub:"value-sub"},W={tooltips:".__tooltips",aria:".__aria"};function x(e,t){if(!c(t))throw new Error("noUiSlider: 'step' is not numeric.");e.singleStep=t}function N(e,t){if(!c(t))throw new Error("noUiSlider: 'keyboardPageMultiplier' is not numeric.");e.keyboardPageMultiplier=t}function I(e,t){if(!c(t))throw new Error("noUiSlider: 'keyboardMultiplier' is not numeric.");e.keyboardMultiplier=t}function M(e,t){if(!c(t))throw new Error("noUiSlider: 'keyboardDefaultStep' is not numeric.");e.keyboardDefaultStep=t}function j(e,t){if("object"!==a(t)||Array.isArray(t))throw new Error("noUiSlider: 'range' is not an object.");if(void 0===t.min||void 0===t.max)throw new Error("noUiSlider: Missing 'min' or 'max' in 'range'.");e.spectrum=new T(t,e.snap||!1,e.singleStep)}function A(e,t){if(t=d(t),!Array.isArray(t)||!t.length)throw new Error("noUiSlider: 'start' option is incorrect.");e.handles=t.length,e.start=t}function V(e,t){if("boolean"!==typeof t)throw new Error("noUiSlider: 'snap' option must be a boolean.");e.snap=t}function B(e,t){if("boolean"!==typeof t)throw new Error("noUiSlider: 'animate' option must be a boolean.");e.animate=t}function G(e,t){if("number"!==typeof t)throw new Error("noUiSlider: 'animationDuration' option must be a number.");e.animationDuration=t}function z(e,t){var n,r=[!1];if("lower"===t?t=[!0,!1]:"upper"===t&&(t=[!1,!0]),!0===t||!1===t){for(n=1;n1)throw new Error("noUiSlider: 'padding' option must not exceed 100% of the range.")}}function X(e,t){switch(t){case"ltr":e.dir=0;break;case"rtl":e.dir=1;break;default:throw new Error("noUiSlider: 'direction' option was not recognized.")}}function q(e,t){if("string"!==typeof t)throw new Error("noUiSlider: 'behaviour' must be a string containing options.");var n=t.indexOf("tap")>=0,r=t.indexOf("drag")>=0,o=t.indexOf("fixed")>=0,i=t.indexOf("snap")>=0,a=t.indexOf("hover")>=0,l=t.indexOf("unconstrained")>=0,s=t.indexOf("drag-all")>=0,u=t.indexOf("smooth-steps")>=0;if(o){if(2!==e.handles)throw new Error("noUiSlider: 'fixed' behaviour must be used with 2 handles");K(e,e.start[1]-e.start[0])}if(l&&(e.margin||e.limit))throw new Error("noUiSlider: 'unconstrained' behaviour cannot be used with margin or limit");e.events={tap:n||i,drag:r,dragAll:s,smoothSteps:u,fixed:o,snap:i,hover:a,unconstrained:l}}function J(e,t){if(!1!==t)if(!0===t||n(t)){e.tooltips=[];for(var r=0;r= 2) required for mode 'count'.");var n=t.values-1,r=100/n,o=[];while(n--)o[n]=n*r;return o.push(100),$(o,t.stepped)}return t.mode===e.PipsMode.Positions?$(t.values,t.stepped):t.mode===e.PipsMode.Values?t.stepped?t.values.map((function(e){return k.fromStepping(k.getStep(k.toStepping(e)))})):t.values:[]}function $(e,t){return e.map((function(e){return k.fromStepping(t?k.getStep(e):e)}))}function Z(t){function n(e,t){return Number((e+t).toFixed(7))}var r=J(t),o={},i=k.xVal[0],a=k.xVal[k.xVal.length-1],s=!1,u=!1,c=0;return r=l(r.slice().sort((function(e,t){return e-t}))),r[0]!==i&&(r.unshift(i),s=!0),r[r.length-1]!==a&&(r.push(a),u=!0),r.forEach((function(i,a){var l,h,f,d,p,v,g,y,m,w,b=i,_=r[a+1],P=t.mode===e.PipsMode.Steps;for(P&&(l=k.xNumSteps[a]),l||(l=_-b),void 0===_&&(_=b),l=Math.max(l,1e-7),h=b;h<=_;h=n(h,l)){for(d=k.toStepping(h),p=d-c,y=p/(t.density||1),m=Math.round(y),w=p/m,f=1;f<=m;f+=1)v=c+f*w,o[v.toFixed(5)]=[k.fromStepping(v),0];g=r.indexOf(h)>-1?e.PipsType.LargeValue:P?e.PipsType.SmallValue:e.PipsType.NoValue,!a&&s&&h!==_&&(g=0),h===_&&u||(o[d.toFixed(5)]=[h,g]),c=d}})),o}function Q(t,r,o){var i,a,l=N.createElement("div"),s=(i={},i[e.PipsType.None]="",i[e.PipsType.NoValue]=n.cssClasses.valueNormal,i[e.PipsType.LargeValue]=n.cssClasses.valueLarge,i[e.PipsType.SmallValue]=n.cssClasses.valueSub,i),u=(a={},a[e.PipsType.None]="",a[e.PipsType.NoValue]=n.cssClasses.markerNormal,a[e.PipsType.LargeValue]=n.cssClasses.markerLarge,a[e.PipsType.SmallValue]=n.cssClasses.markerSub,a),c=[n.cssClasses.valueHorizontal,n.cssClasses.valueVertical],h=[n.cssClasses.markerHorizontal,n.cssClasses.markerVertical];function f(e,t){var r=t===n.cssClasses.value,o=r?c:h,i=r?s:u;return t+" "+o[n.ort]+" "+i[e]}function d(t,i,a){if(a=r?r(i,a):a,a!==e.PipsType.None){var s=A(l,!1);s.className=f(a,n.cssClasses.marker),s.style[n.style]=t+"%",a>e.PipsType.NoValue&&(s=A(l,!1),s.className=f(a,n.cssClasses.value),s.setAttribute("data-value",String(i)),s.style[n.style]=t+"%",s.innerHTML=String(o.to(i)))}}return v(l,n.cssClasses.pips),v(l,0===n.ort?n.cssClasses.pipsHorizontal:n.cssClasses.pipsVertical),Object.keys(t).forEach((function(e){d(e,t[e][0],t[e][1])})),l}function ee(){P&&(r(P),P=null)}function te(e){ee();var t=Z(e),n=e.filter,r=e.format||{to:function(e){return String(Math.round(e))}};return P=L.appendChild(Q(t,n,r)),P}function ne(){var e=s.getBoundingClientRect(),t="offset"+["Width","Height"][n.ort];return 0===n.ort?e.width||s[t]:e.height||s[t]}function re(e,t,r,o){var i=function(i){var a=ie(i,o.pageOffset,o.target||t);return!!a&&(!(K()&&!o.doNotReject)&&(!(y(L,n.cssClasses.tap)&&!o.doNotReject)&&(!(e===O.start&&void 0!==a.buttons&&a.buttons>1)&&((!o.hover||!a.buttons)&&(R||a.preventDefault(),a.calcPoint=a.points[n.ort],void r(a,o))))))},a=[];return e.split(" ").forEach((function(e){t.addEventListener(e,i,!!R&&{passive:!0}),a.push([e,i])})),a}function ie(e,t,n){var r=0===e.type.indexOf("touch"),o=0===e.type.indexOf("mouse"),i=0===e.type.indexOf("pointer"),a=0,l=0;if(0===e.type.indexOf("MSPointer")&&(i=!0),"mousedown"===e.type&&!e.buttons&&!e.touches)return!1;if(r){var s=function(t){var r=t.target;return r===n||n.contains(r)||e.composed&&e.composedPath().shift()===n};if("touchstart"===e.type){var u=Array.prototype.filter.call(e.touches,s);if(u.length>1)return!1;a=u[0].pageX,l=u[0].pageY}else{var c=Array.prototype.find.call(e.changedTouches,s);if(!c)return!1;a=c.pageX,l=c.pageY}}return t=t||m(N),(o||i)&&(a=e.clientX+t.x,l=e.clientY+t.y),e.pageOffset=t,e.points=[a,l],e.cursor=o||i,e}function ae(e){var t=e-u(s,n.ort),r=100*t/ne();return r=f(r),n.dir?100-r:r}function le(e){var t=100,n=!1;return c.forEach((function(r,o){if(!H(o)){var i=T[o],a=Math.abs(i-e),l=100===a&&100===t,s=ai;(s||u||l)&&(n=o,t=a)}})),n}function se(e,t){"mouseout"===e.type&&"HTML"===e.target.nodeName&&null===e.relatedTarget&&ce(e,t)}function ue(e,t){if(-1===navigator.appVersion.indexOf("MSIE 9")&&0===e.buttons&&0!==t.buttonsProperty)return ce(e,t);var r=(n.dir?-1:1)*(e.calcPoint-t.startCalcPoint),o=100*r/t.baseSize;Pe(r>0,o,t.locations,t.handleNumbers,t.connect)}function ce(e,t){t.handle&&(g(t.handle,n.cssClasses.active),E-=1),t.listeners.forEach((function(e){I.removeEventListener(e[0],e[1])})),0===E&&(g(L,n.cssClasses.drag),Se(),e.cursor&&(M.style.cursor="",M.removeEventListener("selectstart",i))),n.events.smoothSteps&&(t.handleNumbers.forEach((function(e){Re(e,T[e],!0,!0,!1,!1)})),t.handleNumbers.forEach((function(e){we("update",e)}))),t.handleNumbers.forEach((function(e){we("change",e),we("set",e),we("end",e)}))}function he(e,t){if(!t.handleNumbers.some(H)){var r;if(1===t.handleNumbers.length){var o=c[t.handleNumbers[0]];r=o.children[0],E+=1,v(r,n.cssClasses.active)}e.stopPropagation();var a=[],l=re(O.move,I,ue,{target:e.target,handle:r,connect:t.connect,listeners:a,startCalcPoint:e.calcPoint,baseSize:ne(),pageOffset:e.pageOffset,handleNumbers:t.handleNumbers,buttonsProperty:e.buttons,locations:T.slice()}),s=re(O.end,I,ce,{target:e.target,handle:r,listeners:a,doNotReject:!0,handleNumbers:t.handleNumbers}),u=re("mouseout",I,se,{target:e.target,handle:r,listeners:a,doNotReject:!0,handleNumbers:t.handleNumbers});a.push.apply(a,l.concat(s,u)),e.cursor&&(M.style.cursor=getComputedStyle(e.target).cursor,c.length>1&&v(L,n.cssClasses.drag),M.addEventListener("selectstart",i,!1)),t.handleNumbers.forEach((function(e){we("start",e)}))}}function fe(e){e.stopPropagation();var t=ae(e.calcPoint),r=le(t);!1!==r&&(n.events.snap||h(L,n.cssClasses.tap,n.animationDuration),Re(r,t,!0,!0),Se(),we("slide",r,!0),we("update",r,!0),n.events.snap?he(e,{handleNumbers:[r]}):(we("change",r,!0),we("set",r,!0)))}function de(e){var t=ae(e.calcPoint),n=k.getStep(t),r=k.fromStepping(n);Object.keys(x).forEach((function(e){"hover"===e.split(".")[0]&&x[e].forEach((function(e){e.call(je,r)}))}))}function pe(e,t){if(K()||H(t))return!1;var r=["Left","Right"],o=["Down","Up"],i=["PageDown","PageUp"],a=["Home","End"];n.dir&&!n.ort?r.reverse():n.ort&&!n.dir&&(o.reverse(),i.reverse());var l,s=e.key.replace("Arrow",""),u=s===i[0],c=s===i[1],h=s===o[0]||s===r[0]||u,f=s===o[1]||s===r[1]||c,d=s===a[0],p=s===a[1];if(!h&&!f&&!d&&!p)return!0;if(e.preventDefault(),f||h){var v=h?0:1,g=xe(t),y=g[v];if(null===y)return!1;!1===y&&(y=k.getDefaultStep(T[t],h,n.keyboardDefaultStep)),y*=c||u?n.keyboardPageMultiplier:n.keyboardMultiplier,y=Math.max(y,1e-7),y*=h?-1:1,l=D[t]+y}else l=p?n.spectrum.xVal[n.spectrum.xVal.length-1]:n.spectrum.xVal[0];return Re(t,k.toStepping(l),!0,!0),we("slide",t),we("update",t),we("change",t),we("set",t),!1}function ve(e){e.fixed||c.forEach((function(e,t){re(O.start,e.children[0],he,{handleNumbers:[t]})})),e.tap&&re(O.start,s,fe,{}),e.hover&&re(O.move,s,de,{hover:!0}),e.drag&&p.forEach((function(t,r){if(!1!==t&&0!==r&&r!==p.length-1){var o=c[r-1],i=c[r],a=[t],l=[o,i],s=[r-1,r];v(t,n.cssClasses.draggable),e.fixed&&(a.push(o.children[0]),a.push(i.children[0])),e.dragAll&&(l=c,s=F),a.forEach((function(e){re(O.start,e,he,{handles:l,handleNumbers:s,connect:t})}))}}))}function ge(e,t){x[e]=x[e]||[],x[e].push(t),"update"===e.split(".")[0]&&c.forEach((function(e,t){we("update",t)}))}function ye(e){return e===W.aria||e===W.tooltips}function me(e){var t=e&&e.split(".")[0],n=t?e.substring(t.length):e;Object.keys(x).forEach((function(e){var r=e.split(".")[0],o=e.substring(r.length);t&&t!==r||n&&n!==o||ye(o)&&n!==o||delete x[e]}))}function we(e,t,r){Object.keys(x).forEach((function(o){var i=o.split(".")[0];e===i&&x[o].forEach((function(e){e.call(je,D.map(n.format.to),t,D.slice(),r||!1,T.slice(),je)}))}))}function be(e,t,r,o,i,a,l){var s;return c.length>1&&!n.events.unconstrained&&(o&&t>0&&(s=k.getAbsoluteDistance(e[t-1],n.margin,!1),r=Math.max(r,s)),i&&t1&&n.limit&&(o&&t>0&&(s=k.getAbsoluteDistance(e[t-1],n.limit,!1),r=Math.min(r,s)),i&&t1?o.forEach((function(e,n){var r=be(a,e,a[e]+t,u[n],c[n],!1,s);!1===r?t=0:(t=r-a[e],a[e]=r)})):u=c=[!0];var h=!1;o.forEach((function(e,n){h=Re(e,r[e]+t,u[n],c[n],!1,s)||h})),h&&(o.forEach((function(e){we("update",e),we("slide",e)})),void 0!=i&&we("drag",l))}function Ce(e,t){return n.dir?100-e-t:e}function Oe(e,t){T[e]=t,D[e]=k.fromStepping(t);var r=Ce(t,0)-j,o="translate("+_e(r+"%","0")+")";c[e].style[n.transformRule]=o,Le(e),Le(e+1)}function Se(){F.forEach((function(e){var t=T[e]>50?-1:1,n=3+(c.length+t*e);c[e].style.zIndex=String(n)}))}function Re(e,t,n,r,o,i){return o||(t=be(T,e,t,n,r,!1,i)),!1!==t&&(Oe(e,t),!0)}function Le(e){if(p[e]){var t=0,r=100;0!==e&&(t=T[e-1]),e!==p.length-1&&(r=T[e]);var o=r-t,i="translate("+_e(Ce(t,o)+"%","0")+")",a="scale("+_e(o/100,"1")+")";p[e].style[n.transformRule]=i+" "+a}}function ke(e,t){return null===e||!1===e||void 0===e?T[t]:("number"===typeof e&&(e=String(e)),e=n.format.from(e),!1!==e&&(e=k.toStepping(e)),!1===e||isNaN(e)?T[t]:e)}function De(e,t,r){var o=d(e),i=void 0===T[0];t=void 0===t||t,n.animate&&!i&&h(L,n.cssClasses.tap,n.animationDuration),F.forEach((function(e){Re(e,ke(o[e],e),!0,!1,r)}));var a=1===F.length?0:1;if(i&&k.hasNoSize()&&(r=!0,T[0]=0,F.length>1)){var l=100/(F.length-1);F.forEach((function(e){T[e]=e*l}))}for(;a=0&&er.stepAfter.startValue&&(i=r.stepAfter.startValue-o),a=o>r.thisStep.startValue?r.thisStep.step:!1!==r.stepBefore.step&&o-r.stepBefore.highestStep,100===t?i=null:0===t&&(a=null);var l=k.countStepDecimals();return null!==i&&!1!==i&&(i=Number(i.toFixed(l))),null!==a&&!1!==a&&(a=Number(a.toFixed(l))),[a,i]}function Ne(){return F.map(xe)}function Ie(e,t){var r=Ee(),i=["margin","limit","padding","range","animate","snap","step","format","pips","tooltips"];i.forEach((function(t){void 0!==e[t]&&(a[t]=e[t])}));var l=oe(a);i.forEach((function(t){void 0!==e[t]&&(n[t]=l[t])})),k=l.spectrum,n.margin=l.margin,n.limit=l.limit,n.padding=l.padding,n.pips?te(n.pips):ee(),n.tooltips?X():Y(),T=[],De(o(e.start)?e.start:r,t)}function Me(){s=z(L),G(n.connect,s),ve(n.events),De(n.start),n.pips&&te(n.pips),n.tooltips&&X(),q()}Me();var je={destroy:We,steps:Ne,on:ge,off:me,get:Ee,set:De,setHandle:Fe,reset:Te,__moveHandles:function(e,t,n){Pe(e,t,T,n)},options:a,updateOptions:Ie,target:L,removePips:ee,removeTooltips:Y,getPositions:function(){return T.slice()},getTooltips:function(){return C},getOrigins:function(){return c},pips:te};return je}function ae(e,t){if(!e||!e.nodeName)throw new Error("noUiSlider: create requires a single element, got: "+e);if(e.noUiSlider)throw new Error("noUiSlider: Slider was already initialized.");var n=oe(t),r=ie(e,n,t);return e.noUiSlider=r,r}var le={__spectrum:T,cssClasses:E,create:ae};e.create=ae,e.cssClasses=E,e["default"]=le,Object.defineProperty(e,"__esModule",{value:!0})}))},1:function(e,t){},10:function(e,t){},11:function(e,t){},12:function(e,t){},13:function(e,t){},"13cb":function(e,t,n){},14:function(e,t){},15:function(e,t){},16:function(e,t){},"1b8a":function(e,t,n){"use strict";n("a9a9")},2:function(e,t){},2367:function(e,t,n){"use strict";n("63ec")},"239a":function(e,t,n){},2480:function(e,t,n){"use strict";n("805c")},"24a5":function(e,t,n){"use strict";n("13cb")},"2a51":function(e,t,n){"use strict";n("b883")},"2db3":function(e,t,n){},3:function(e,t){},"336b":function(e,t,n){},3665:function(e,t,n){"use strict";n("e0e8")},3833:function(e,t,n){"use strict";n("4a9e")},"384c":function(e,t,n){e.exports=n.p+"img/CHANNEL.6ac8d4e3.png"},"3d73":function(e,t,n){},4:function(e,t){},"4a9e":function(e,t,n){},"4d3d":function(e,t,n){"use strict";n("2db3")},5:function(e,t){},6:function(e,t){},"62f3":function(e,t,n){"use strict";n("71c3")},"63ec":function(e,t,n){},6651:function(e,t,n){"use strict";n("239a")},"6aa7":function(e,t,n){"use strict";n("c016")},"6c33":function(e,t,n){"use strict";n("f108")},"6d1a":function(e,t,n){"use strict";n("7009")},7:function(e,t){},7009:function(e,t,n){},"71c3":function(e,t,n){},"7d0b":function(e,t,n){"use strict";n("9633")},8:function(e,t){},"805c":function(e,t,n){},"85ec":function(e,t,n){},9:function(e,t){},9633:function(e,t,n){},a78d:function(e,t,n){"use strict";n("336b")},a9a9:function(e,t,n){},b883:function(e,t,n){},c016:function(e,t,n){},c3ec:function(e,t,n){"use strict";n("0022")},cd49:function(e,t,n){"use strict";n.r(t);var r={};n.r(r),n.d(r,"example3",(function(){return Iw})),n.d(r,"example1",(function(){return Mw})),n.d(r,"UpdatedExample",(function(){return jw})),n.d(r,"dafdtemplate",(function(){return Aw})),n.d(r,"default",(function(){return Bw}));var o,i,a,l=n("2b0e"),s=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("v-app",{attrs:{id:"3duf"}},[n("LayoutSidebar")],1)},u=[],c=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[n("div",{attrs:{id:"view-container"}},[n("div",{attrs:{id:"canvas_block"}},[n("canvas",{ref:"rendingcanvas",attrs:{id:"c",tabindex:"0",resize:""}}),e._t("default",(function(){return[n("ComponentContextMenu",{ref:"contextMenu",attrs:{id:"contextMenu"}})]})),e._t("default",(function(){return[n("ConnectionContextMenu",{ref:"contextMenu",attrs:{id:"contextMenu"}})]}))],2),n("div",{attrs:{id:"renderContainer"}})]),n("ResolutionToolbar"),n("ZoomSlider")],1)},h=[],f=n("7ecf"),d=n.n(f),p=n("2222"),v=n.n(p);function g(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function y(e,t){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:"FLOW";if("FLOW"===t)return this.__drawFlow(e);if("CELL"===t)return this.__drawCell(e);var n=this.__drawFlow(e),r=this.__drawCell(e),o=new v.a.CompoundPath("");return o.addChild(n),o.addChild(r),o}},{key:"render2DTarget",value:function(e,t){var n=this.__drawFlow(t);return n.addChild(this.__drawCell(t)),n.fillColor.alpha=.5,n}},{key:"__drawFlow",value:function(e){var t,n,r=e.rotation,o=e.position,i=e.chamberLength,a=e.numberOfChambers,l=e.chamberWidth,s=e.feedingChannelWidth,u=e.chamberSpacing,c=e.color,h=o[0],f=o[1],d=new v.a.CompoundPath("");d.fillColor=c;var p=new v.a.Point(h,f+i);return n=new v.a.Path.Rectangle({point:p,size:[a/2*(l+u)+u,s],fillColor:c,strokeWidth:0}),d.addChild(n),t=new v.a.CompoundPath(d),t.fillColor=c,t.rotate(r,new v.a.Point(h,f)),t}},{key:"__drawCell",value:function(e){for(var t,n=e.rotation,r=e.position,o=e.chamberLength,i=e.numberOfChambers,a=e.chamberWidth,l=e.feedingChannelWidth,s=e.chamberSpacing,u=e.color,c=r[0],h=r[1],f=new v.a.CompoundPath(""),d=0;d8&&void 0!==arguments[8]&&arguments[8],u=i/2,c=t-.5*i,h=n+r+o,f=t+.5*i,d=n+r+o;a===l&&(s=!0),this.__drawmuxtwig(e,t,n,r,o,i,s),s||(this.__generateMuxTwig(e,c,h,r,o,u,a+1,l),this.__generateMuxTwig(e,f,d,r,o,u,a+1,l))}},{key:"__drawmuxtwig",value:function(e,t,n,r,o,i){var a=arguments.length>6&&void 0!==arguments[6]&&arguments[6],l=new v.a.Point(t-r/2,n),s=new v.a.Point(t+r/2,n+o),u=new v.a.Path.Rectangle({from:l,to:s,radius:0,strokeWidth:0});e.addChild(u);var c=t-.5*(r+i),h=c+r,f=n+o+r,d=f+o,p=t+.5*(i-r),g=p+r,y=n+o+r,m=y+o;a&&(l=new v.a.Point(c,f),s=new v.a.Point(h,d),u=new v.a.Path.Rectangle({from:l,to:s,radius:0,strokeWidth:0}),e.addChild(u),l=new v.a.Point(p,y),s=new v.a.Point(g,m),u=new v.a.Path.Rectangle({from:l,to:s,radius:0,strokeWidth:0}),e.addChild(u));var w=t-.5*(r+i),b=g,_=n+o,P=_+r;return l=new v.a.Point(w,_),s=new v.a.Point(b,P),u=new v.a.Path.Rectangle({from:l,to:s,radius:0,strokeWidth:0}),e.addChild(u),e}},{key:"__generateMuxControlTwig",value:function(e,t,n,r,o,i,a,l,s,u,c,h,f){var d=arguments.length>13&&void 0!==arguments[13]&&arguments[13],p=a/2,v=t-.5*a,g=n+r+i,y=t+.5*a,m=n+r+i;l===s&&(d=!0),this.__drawmuxcontroltwig(e,t,n,r,o,i,a,u,c,h,f,d),d||(this.__generateMuxControlTwig(e,v,g,r,o,i,p,l+1,s,u,c,h,f),this.__generateMuxControlTwig(e,y,m,r,o,i,p,l+1,s,u,c,h,f))}},{key:"__drawmuxcontroltwig",value:function(e,t,n,r,o,i,a,l,s,u,c){var h=t-.5*(r+a),f=h+r,d=n+i+r,p=d+i,g=(h+f)/2,y=d+Math.abs(d-p)/4,m=t+.5*(a-r),w=m+r,b=n+i+r,_=b+i,P=(m+w)/2,C=b+3*Math.abs(b-_)/4,O=new v.a.Point(g-l/2,y-s/2),S=new v.a.Point(g+l/2,y+l/2),R=new v.a.Path.Rectangle({from:O,to:S,radius:0,strokeWidth:0});e.addChild(R);var L=new v.a.Point(O.x,y-o/2),k=new v.a.Point(u,y+o/2),D=new v.a.Path.Rectangle({from:L,to:k,radius:0,strokeWidth:0});e.addChild(D),O=new v.a.Point(P-l/2,C-s/2),S=new v.a.Point(P+l/2,C+l/2),R=new v.a.Path.Rectangle({from:O,to:S,radius:0,strokeWidth:0}),e.addChild(R);var T=new v.a.Point(S.x,C-o/2),F=new v.a.Point(c,C+o/2),E=new v.a.Path.Rectangle({from:T,to:F,radius:0,strokeWidth:0});return e.addChild(E),e}}]),n}(O);function pr(e){return pr="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},pr(e)}function vr(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function gr(e,t){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:"FLOW";if("FLOW"===t)return this.__drawFlow(e);if("CONTROL"===t)return this.__drawControl(e);throw new Error("Unknown key: "+t)}},{key:"render2DTarget",value:function(e,t){var n=new v.a.CompoundPath(""),r=this.render2D(t,"FLOW"),o=this.render2D(t,"CONTROL");return n.addChild(o),n.addChild(r),n.fillColor=t.color,n.fillColor.alpha=.5,n}}]),n}(O);function Rr(e){return Rr="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},Rr(e)}function Lr(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function kr(e,t){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:"FLOW";if("FLOW"===t)return this.__drawFlow(e);if("CONTROL"===t)return this.__drawControl(e);if("INVERSE"===t)return this.__drawInverse(e);throw new Error("Unknown key: "+t)}},{key:"render2DTarget",value:function(e,t){var n=new v.a.CompoundPath(""),r=this.render2D(t,"FLOW"),o=this.render2D(t,"CONTROL");return n.addChild(o),n.addChild(r),n.fillColor=t.color,n.fillColor.alpha=.5,n}},{key:"__drawFlow",value:function(e){var t,n,r,o,i=new v.a.CompoundPath(""),a=e.position,l=e.gap,s=e.valveRadius,u=e.color,c=e.rotation,h=e.spacing,f=e.flowChannelWidth;o=new v.a.Point(a[0],a[1]),r=new v.a.Path.Circle(o,s),n=new v.a.Path.Rectangle({from:new v.a.Point(a[0]-s,a[1]-l/2),to:new v.a.Point(a[0]+s,a[1]+l/2)}),t=r.subtract(n),i.addChild(t);var d=new v.a.Point(a[0],a[1]+h);r=new v.a.Path.Circle(d,s),n=new v.a.Path.Rectangle({from:new v.a.Point(d.x-s,d.y-l/2),to:new v.a.Point(d.x+s,d.y+l/2)}),t=r.subtract(n),i.addChild(t);var p=new v.a.Point(a[0],a[1]-h);r=new v.a.Path.Circle(p,s),n=new v.a.Path.Rectangle({from:new v.a.Point(p.x-s,p.y-l/2),to:new v.a.Point(p.x+s,p.y+l/2)}),t=r.subtract(n),i.addChild(t);var g=new v.a.Path.Rectangle({from:new v.a.Point(d.x-f/2,d.y-l/2),to:new v.a.Point(o.x+f/2,o.y+l/2)});i.addChild(g);var y=new v.a.Path.Rectangle({from:new v.a.Point(p.x-f/2,p.y+l/2),to:new v.a.Point(o.x+f/2,o.y-l/2)});return i.addChild(y),i.rotate(c,o),i.fillColor=u,i}},{key:"__drawControl",value:function(e){var t,n=e.position,r=e.valveRadius,o=e.color,i=e.rotation,a=e.spacing,l=new v.a.CompoundPath(""),s=new v.a.Point(n[0],n[1]);t=new v.a.Path.Circle(s,r),l.addChild(t);var u=new v.a.Point(n[0],n[1]-a);t=new v.a.Path.Circle(u,r),l.addChild(t);var c=new v.a.Point(n[0],n[1]+a);return t=new v.a.Path.Circle(c,r),l.addChild(t),l.rotate(i,s),l.fillColor=o,l}},{key:"__drawInverse",value:function(e){var t,n=e.position,r=e.valveRadius,o=e.color,i=e.rotation,a=e.spacing,l=new v.a.CompoundPath(""),s=new v.a.Point(n[0],n[1]);t=new v.a.Path.Circle(s,r),l.addChild(t);var u=new v.a.Point(n[0],n[1]-a);t=new v.a.Path.Circle(u,r),l.addChild(t);var c=new v.a.Point(n[0],n[1]+a);return t=new v.a.Path.Circle(c,r),l.addChild(t),l.rotate(i,s),l.fillColor=o,l}}]),n}(O);function jr(e){return jr="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},jr(e)}function Ar(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function Vr(e,t){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:"FLOW";if("FLOW"===t)return this.__drawFlow(e);if("CONTROL"===t)return this.__drawControl(e);throw new Error("Unknown key: "+t)}},{key:"render2DTarget",value:function(e,t){var n=new v.a.CompoundPath(""),r=this.render2D(t,"FLOW"),o=this.render2D(t,"CONTROL");return n.addChild(o),n.addChild(r),n.fillColor=t.color,n.fillColor.alpha=.5,n}},{key:"__drawFlow",value:function(e){var t=e.position,n=e.valveGap,r=e.valveRadius,o=e.color,i=e.rotation,a=e.flowChannelWidth,l=e.valveSpacing,s=new v.a.CompoundPath(""),u=t[0],c=t[1],h=new v.a.Point(u,c-a/2),f=new v.a.Point(u+4*l+2*r+2*a,c+a/2),d=new v.a.Path.Rectangle(h,f);return s.addChild(d),this.__createTransposerValve(s,f.x+r,h.y+a/2,n,r,"H",a),h=new v.a.Point(u+4*l+4*r+2*a,c-a/2),f=new v.a.Point(u+6*l+4*r+3*a,c+a/2),d=new v.a.Path.Rectangle(h,f),s.addChild(d),h=new v.a.Point(u+3*l+a+2*r,c+a/2),f=new v.a.Point(h.x+a,h.y+l),d=new v.a.Path.Rectangle(h,f),s.addChild(d),this.__createTransposerValve(s,h.x+a/2,f.y+r,n,r,"V",a),h=new v.a.Point(h.x,f.y+2*r),f=new v.a.Point(h.x+a,h.y+2*l+a),d=new v.a.Path.Rectangle(h,f),s.addChild(d),this.__createTransposerValve(s,h.x+a/2,f.y+r,n,r,"V",a),h=new v.a.Point(h.x,f.y+2*r),f=new v.a.Point(h.x+a,h.y+l),d=new v.a.Path.Rectangle(h,f),s.addChild(d),h=new v.a.Point(u,c+1.5*a+4*l+4*r),f=new v.a.Point(h.x+2*l+a,h.y+a),d=new v.a.Path.Rectangle(h,f),s.addChild(d),this.__createTransposerValve(s,f.x+r,h.y+a/2,n,r,"H",a),h=new v.a.Point(f.x+2*r,h.y),f=new v.a.Point(h.x+4*l+2*a+2*r,h.y+a),d=new v.a.Path.Rectangle(h,f),s.addChild(d),h=new v.a.Point(u+5*l+2*a+4*r,c+a/2),f=new v.a.Point(h.x+a,h.y+l),d=new v.a.Path.Rectangle(h,f),s.addChild(d),this.__createTransposerValve(s,h.x+a/2,f.y+r,n,r,"V",a),h=new v.a.Point(h.x,f.y+2*r),f=new v.a.Point(h.x+a,h.y+l+a),d=new v.a.Path.Rectangle(h,f),s.addChild(d),s.fillColor=o,h=new v.a.Point(u+l,c+1.5*a+2*l+2*r),f=new v.a.Point(h.x+a,h.y+l),d=new v.a.Path.Rectangle(h,f),s.addChild(d),this.__createTransposerValve(s,h.x+a/2,f.y+r,n,r,"V",a),h=new v.a.Point(h.x,f.y+2*r),f=new v.a.Point(h.x+a,h.y+l+a),d=new v.a.Path.Rectangle(h,f),s.addChild(d),s.fillColor=o,s.rotate(i,new v.a.Point(u+3*l+1.5*a+2*r,c+a+2*l+2*r)),s}},{key:"__createTransposerValve",value:function(e,t,n,r,o,i,a){var l=new v.a.Point(t,n),s=new v.a.Path.Circle(l,o),u=new v.a.Path.Rectangle({point:new v.a.Point(t-a/2,n-o),size:[a,o],stokeWidth:0});s=s.unite(u),u=new v.a.Path.Rectangle({point:new v.a.Point(t-a/2,n),size:[a,o],stokeWidth:0}),s=s.unite(u);var c=new v.a.Path.Rectangle({from:new v.a.Point(t-o,n-r/2),to:new v.a.Point(t+o,n+r/2)}),h=s.subtract(c);"H"===i&&h.rotate(90,l),e.addChild(h)}},{key:"__drawControl",value:function(e){var t=e.position,n=(e.valveGap,e.valveRadius),r=e.color,o=e.rotation,i=e.controlChannelWidth,a=e.valveSpacing,l=new v.a.CompoundPath(""),s=t[0],u=t[1],c=new v.a.Point(s+4*a+2*i+2*n+n,u),h=new v.a.Path.Circle(c,n);l.addChild(h);var f=new v.a.Point(s+4*a+2*i+2*n+n-i/2,u-2*n),d=new v.a.Point(s+4*a+2*i+2*n+n+i/2,u);l.addChild(new v.a.Path.Rectangle(f,d)),f=new v.a.Point(s-2*n,u-2*n-i/2),d=new v.a.Point(s+4*a+2*i+2*n+n+i/2,u-2*n+i/2),l.addChild(new v.a.Path.Rectangle(f,d)),c=new v.a.Point(s+1.5*i+3*a+2*n,u+i/2+a+n),h=new v.a.Path.Circle(c,n),l.addChild(h);var p=c;c=new v.a.Point(c.x+2*a+2*n+i,u+i/2+a+n),h=new v.a.Path.Circle(c,n),l.addChild(h);var g=c,y=new v.a.Path.Rectangle({from:new v.a.Point(p.x,p.y-i/2),to:new v.a.Point(g.x,p.y+i/2)});l.addChild(y),f=new v.a.Point(g.x,p.y-i/2),d=new v.a.Point(g.x+2*n,p.y+i/2),l.addChild(new v.a.Path.Rectangle(f,d)),f=new v.a.Point(g.x+2*n-i/2,p.y-i/2),d=new v.a.Point(g.x+2*n+i/2,u+1.5*i+3*a+2*n+n),l.addChild(new v.a.Path.Rectangle(f,d)),c=new v.a.Point(s+.5*i+a,u+1.5*i+3*a+2*n+n),h=new v.a.Path.Circle(c,n),l.addChild(h),p=c,c=new v.a.Point(c.x+2*a+2*n+i,c.y),h=new v.a.Path.Circle(c,n),l.addChild(h),g=c,y=new v.a.Path.Rectangle({from:new v.a.Point(p.x,p.y-i/2),to:new v.a.Point(g.x,p.y+i/2)}),l.addChild(y),f=new v.a.Point(g.x,p.y-i/2),d=new v.a.Point(c.x+2*a+4*n+i+i/2,p.y+i/2),l.addChild(new v.a.Path.Rectangle(f,d)),c=new v.a.Point(s+i+2*a+n,u+4*a+4*n+2*i),h=new v.a.Path.Circle(c,n),l.addChild(h),f=new v.a.Point(s-2*n-i/2,u-2*n-i/2),d=new v.a.Point(s-2*n+i/2,u+4*a+6*n+2*i),l.addChild(new v.a.Path.Rectangle(f,d)),f=new v.a.Point(s-2*n-i/2,u+4*a+6*n+2*i-i/2),d=new v.a.Point(s+i+2*a+n,u+4*a+6*n+2*i+i/2),l.addChild(new v.a.Path.Rectangle(f,d)),f=new v.a.Point(s+i+2*a+n-i/2,u+4*a+4*n+2*i),d=new v.a.Point(s+i+2*a+n+i/2,u+4*a+6*n+2*i+i/2),l.addChild(new v.a.Path.Rectangle(f,d));var m=new v.a.Point(s+a,u+i/2+2*n+2*a),w=new v.a.Point(m.x+4*a+3*i+4*n,m.y+i),b=new v.a.Path.Rectangle(m,w);return l.addChild(b),l.rotate(o,new v.a.Point(s+3*a+1.5*i+2*n,u+i+2*a+2*n)),l.fillColor=r,l}}]),n}(O);function Wo(e){return Wo="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},Wo(e)}function xo(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function No(e,t){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:"FLOW";if("FLOW"===t)return this.__drawFlow(e);if("CONTROL"===t)return this.__drawControl(e);if("INVERSE"===t)return this.__drawInverseFlow(e);throw new Error("No render procedure defined for component:"+this.__mint+", key: "+t)}},{key:"render2DTarget",value:function(e,t){var n=this.render2D(t,"FLOW");return n.fillColor.alpha=.5,n}},{key:"__drawInverseFlow",value:function(e){var t=e.position,n=(e.gap,e.valveRadius),r=e.color;console.log("Color:",r);var o=e.rotation,i=new v.a.Point(t[0],t[1]),a=new v.a.Path.Circle(i,n);return a.fillColor=r,a.rotate(o,i)}}]),n}(Uo);function vi(e){return vi="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},vi(e)}function gi(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function yi(e,t){for(var n=0;n8&&void 0!==arguments[8]&&arguments[8],u=i/2,c=t-.5*i,h=n+r+o,f=t+.5*i,d=n+r+o;a===l&&(s=!0),this.__drawtwig(e,t,n,r,o,i,s),s||(this.__generateTwig(e,c,h,r,o,u,a+1,l),this.__generateTwig(e,f,d,r,o,u,a+1,l))}},{key:"__drawtwig",value:function(e,t,n,r,o,i){var a=arguments.length>6&&void 0!==arguments[6]&&arguments[6],l=new v.a.Point(t-r/2,n),s=new v.a.Point(t+r/2,n+o),u=new v.a.Path.Rectangle({from:l,to:s,radius:0,strokeWidth:0});e.addChild(u);var c=t-.5*(r+i),h=c+r,f=n+o+r,d=f+o,p=t+.5*(i-r),g=p+r,y=n+o+r,m=y+o;a&&(l=new v.a.Point(c,f),s=new v.a.Point(h,d),u=new v.a.Path.Rectangle({from:l,to:s,radius:0,strokeWidth:0}),e.addChild(u),l=new v.a.Point(p,y),s=new v.a.Point(g,m),u=new v.a.Path.Rectangle({from:l,to:s,radius:0,strokeWidth:0}),e.addChild(u));var w=t-.5*(r+i),b=g,_=n+o,P=_+r;return l=new v.a.Point(w,_),s=new v.a.Point(b,P),u=new v.a.Path.Rectangle({from:l,to:s,radius:0,strokeWidth:0}),e.addChild(u),e}},{key:"render2DTarget",value:function(e,t){null===e&&(e=this.__renderKeys[0]);var n=this.render2D(t,e);return n.fillColor.alpha=.5,n}}]),n}(O);function Li(e){return Li="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},Li(e)}function ki(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function Di(e,t){for(var n=0;n8&&void 0!==arguments[8]&&arguments[8],u=i/2,c=t-.5*i,h=n+o,f=t+.5*i,d=n+o;a===l&&(s=!0),this.__drawYtwig(e,t,n,r,o,i,s),s||(this.__generateYTwig(e,c,h,r,o,u,a+1,l),this.__generateYTwig(e,f,d,r,o,u,a+1,l))}},{key:"__drawYtwig",value:function(e,t,n,r,o,i){var a=new v.a.Point(t,n),l=new v.a.Point(t-r/2,n-r/2),s=Math.atan(i/2/o),u=i/2/Math.sin(s)+r,c=new v.a.Path.Rectangle({size:[r,u],point:l,radius:r/2,stokeWidth:0});return c.rotate(180*s/Math.PI,a),e.addChild(c),c=new v.a.Path.Rectangle({size:[r,u],point:l,radius:r/2,stokeWidth:0}),c.rotate(180*-s/Math.PI,a),e.addChild(c),e}}]),n}(O);function Ai(e){return Ai="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},Ai(e)}function Vi(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function Bi(e,t){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:"FLOW";if("FLOW"===t)return this.__renderFlow(e);if("CONTROL"===t)return this.__renderControl(e);throw new Error("Unknown render key found in LLCHAMBER: "+t)}},{key:"render2DTarget",value:function(e,t){var n=new v.a.CompoundPath(""),r=this.render2D(t,"FLOW"),o=this.render2D(t,"CONTROL");return n.addChild(o),n.addChild(r),n.fillColor=t.color,n.fillColor.alpha=.5,n}}]),n}(O);function $i(e){return $i="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},$i(e)}function Zi(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function Qi(e,t){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:"FLOW";if("FLOW"===t)return this.__renderFlow(e);if("INTEGRATION"===t)return this.__renderIntegrate(e);throw new Error("Unknown render key found in DROPLET MERGER: "+t)}},{key:"render2DTarget",value:function(e,t){var n=new v.a.CompoundPath(""),r=this.render2D(t,"FLOW"),o=this.render2D(t,"INTEGRATION");return n.addChild(o),n.addChild(r),n.fillColor=t.color,n.fillColor.alpha=.5,n}}]),n}(O);function Al(e){return Al="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},Al(e)}function Vl(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function Bl(e,t){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:"FLOW";if("FLOW"===t)return this.__renderFlow(e);if("INTEGRATION"===t)return this.__renderIntegrate(e);throw new Error("Unknown render key found in PICOINJECTOR: "+t)}},{key:"render2DTarget",value:function(e,t){var n=new v.a.CompoundPath(""),r=this.render2D(t,"FLOW"),o=this.render2D(t,"INTEGRATION");return n.addChild(o),n.addChild(r),n.fillColor=t.color,n.fillColor.alpha=.5,n}}]),n}(O);function $l(e){return $l="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},$l(e)}function Zl(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function Ql(e,t){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:"FLOW";if("FLOW"===t)return this.__renderFlow(e);if("INTEGRATION"===t)return this.__renderIntegrate(e);throw new Error("Unknown render key found in DROPLET SORTER: "+t)}},{key:"render2DTarget",value:function(e,t){var n=new v.a.CompoundPath(""),r=this.render2D(t,"FLOW"),o=this.render2D(t,"INTEGRATION");return n.addChild(o),n.addChild(r),n.fillColor=t.color,n.fillColor.alpha=.5,n}}]),n}(O);function us(e){return us="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},us(e)}function cs(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function hs(e,t){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:"FLOW";if("FLOW"===t)return this.__renderFlow(e);if("INTEGRATION"===t)return this.__renderIntegrate(e);throw new Error("Unknown render key found in DROPLET CAPACITANCE SENSOR: "+t)}},{key:"render2DTarget",value:function(e,t){var n=new v.a.CompoundPath(""),r=this.render2D(t,"FLOW"),o=this.render2D(t,"INTEGRATION");return n.addChild(o),n.addChild(r),n.fillColor=t.color,n.fillColor.alpha=.5,n}}]),n}(O);function _s(e){return _s="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},_s(e)}function Ps(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function Cs(e,t){for(var n=0;n0)return n;throw new Error("No render type found for mint type: "+t)}},{key:"getComponentPorts",value:function(t,n){var r=e.getTypeForMINT(n);null===r&&(console.error("Component Ports of: "+r+" not found in library. Using default Template"),r="Template");var o=e.library[r].object,i={};t.forEach((function(e,t){i[t]=e}));var a=o.getPorts(i);return a}},{key:"hasInverseRenderLayer",value:function(t){var n=e.library[t].object,r=n.renderKeys;return r.includes("INVERSE")}},{key:"getDefaultsForType",value:function(t){if(Object.prototype.hasOwnProperty.call(e.library,t))return e.library[t].object.defaults;throw new Error("Component Type definition: "+t+" not found in library")}},{key:"getHeritableForType",value:function(t){if(Object.prototype.hasOwnProperty.call(e.library,t))return e.library[t].object.heritable;throw new Error("Component Type definition: "+t+" not found in library")}},{key:"getUniqueForType",value:function(t){if(Object.prototype.hasOwnProperty.call(e.library,t))return e.library[t].object.unique;throw new Error("Component Type definition: "+t+" not found in library")}},{key:"isCustomType",value:function(t){return t in e.customTypes.keys()}},{key:"generateID",value:function(){return d.a.v1()}},{key:"getRenderer",value:function(t){if(Object.prototype.hasOwnProperty.call(e.library,t))return e.library[t].object;throw new Error("Component Type definition: "+t+" not found in library")}},{key:"getRendererForMINT",value:function(t){for(var n in e.library)if(e.library[n].object.mint===t)return console.log("Renderer: ",e.library[n].object),e.library[n].object;throw new Error("Component Type definition: "+t+" not found in library")}},{key:"getRendererInfo",value:function(t){if(Object.prototype.hasOwnProperty.call(e.library,t))return e.library[t];throw new Error("Component Type definition: "+t+" not found in library")}},{key:"getAllRenderKeys",value:function(t){return e.library[t].object.renderKeys}},{key:"getConnectionTypes",value:function(){var t=[];for(var n in e.connectionLibrary){var r=e.connectionLibrary[n];t.push(r.object.mint)}return t}}]),e}();function Fc(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function Ec(e,t){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:"New Layer",r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:o.FLOW,i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"0",a=arguments.length>4?arguments[4]:void 0;Uc(this,e),this.__type=o.FLOW,this.params=new zc(t,e.getUniqueParameters(),e.getHeritableParameters()),this.name=n,this.features={},this.featureCount=0,this.device=a,this.__id=Tc.generateID(),this.__type=r,this.__group=i}return Hc(e,[{key:"type",get:function(){return this.__type}},{key:"id",get:function(){return this.__id},set:function(e){this.__id=e}},{key:"group",get:function(){return this.__group}},{key:"addFeature",value:function(e){this.__ensureIsAFeature(e),this.features[e.ID]=e,this.featureCount+=1,e.layer=this,e.setManufacturingInfoLayer()}},{key:"getIndex",value:function(){if(this.device)return this.device.layers.indexOf(this);throw new Error("No device referenced on this layer")}},{key:"__ensureIsAFeature",value:function(e){if(!(e instanceof Bd)&&!(e instanceof Qd))throw new Error("Provided value"+e+" is not a Feature! Did you pass an ID by mistake?")}},{key:"__ensureFeatureExists",value:function(e){if(!this.containsFeature(e))throw new Error("Layer does not contain the specified feature!")}},{key:"__ensureFeatureIDExists",value:function(e){if(!this.containsFeatureID(e))throw new Error("Layer does not contain a feature with the specified ID!")}},{key:"getFeature",value:function(e){return this.__ensureFeatureIDExists(e),this.features[e]}},{key:"removeFeature",value:function(e){var t;(this.removeFeatureByID(e.ID),console.log("Device: ",this.device),null!==this.device||void 0!==this.device)&&(null===(t=this.device)||void 0===t||t.removeFeature(e))}},{key:"removeFeatureByID",value:function(e){this.__ensureFeatureIDExists(e);this.features[e];this.featureCount-=1,delete this.features[e]}},{key:"containsFeature",value:function(e){return this.__ensureIsAFeature(e),this.features.hasOwnProperty(e.ID)}},{key:"containsFeatureID",value:function(e){return this.features.hasOwnProperty(e)}},{key:"getAllFeaturesFromLayer",value:function(){return this.features}},{key:"__featuresToJSON",value:function(){var e={};for(var t in this.features)e[t]=this.features[t].toJSON();return e}},{key:"__featuresInterchangeV1",value:function(){var e=[];for(var t in this.features)e.push(this.features[t].toInterchangeV1());return e}},{key:"__loadFeaturesFromJSON",value:function(e){for(var t in e)this.addFeature(Bd.fromJSON(e[t]))}},{key:"__loadFeaturesFromInterchangeV1",value:function(e){for(var t in e)this.addFeature(Bd.fromInterchangeV1(e[t]))}},{key:"toJSON",value:function(){var e={};return e.name=this.name,e.params=this.params.toJSON(),e.features=this.__featuresToJSON(),e}},{key:"toInterchangeV1",value:function(){var e="FLOW";if(this.type===o.FLOW)e="FLOW";else if(this.type===o.CONTROL)e="CONTROL";else{if(this.type!==o.INTEGRATION)throw new Error("Unknown layer type: "+this.type);e="INTEGRATION"}var t={id:this.__id,name:this.name,type:e,group:this.__group,params:this.params.toJSON(),features:this.__featuresInterchangeV1()};return t}},{key:"toFeatureLayerJSON",value:function(){var e={};return e.name=this.name,e.params=this.params.toJSON(),e.features=this.__featuresInterchangeV1(),e}}],[{key:"getUniqueParameters",value:function(){var e=new Map;return e.set("z_offset","Float"),e.set("flip","Boolean"),e}},{key:"getHeritableParameters",value:function(){return new Map}},{key:"fromInterchangeV1",value:function(t,n){var r=o.FLOW;if(Object.prototype.hasOwnProperty.call(t,"type"))if("FLOW"===t.type)r=o.FLOW;else if("CONTROL"===t.type)r=o.CONTROL;else{if("INTEGRATION"!==t.type)throw new Error("Unknown layer type: "+t.type);r=o.INTEGRATION}var i=new e(t.params,t.name,r,t.group,n);return i.__loadFeaturesFromInterchangeV1(t.features),i}}]),e}();function Xc(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function qc(e,t){for(var n=0;n=e.length?{done:!0}:{done:!1,value:e[r++]}},e:function(e){throw e},f:o}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var i,a=!0,l=!1;return{s:function(){n=n.call(e)},n:function(){var e=n.next();return a=e.done,e},e:function(e){l=!0,i=e},f:function(){try{a||null==n.return||n.return()}finally{if(l)throw i}}}}function ah(e,t){if(e){if("string"===typeof e)return lh(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?lh(e,t):void 0}}function lh(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n=e.length?{done:!0}:{done:!1,value:e[r++]}},e:function(e){throw e},f:o}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var i,a=!0,l=!1;return{s:function(){n=n.call(e)},n:function(){var e=n.next();return a=e.done,e},e:function(e){l=!0,i=e},f:function(){try{a||null==n.return||n.return()}finally{if(l)throw i}}}}function $h(e,t){if(e){if("string"===typeof e)return Zh(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?Zh(e,t):void 0}}function Zh(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n1&&(r=1),console.log("feature Object:",e),console.log("feature layer:",e.layer),console.log("feature layer type:",e.layer.type),!e.layer)throw new Error("Feature layer is null");var o=jh(e.layer.type);return Mh(r,o,Th)},ef=function(e){var t=0;if(!e.layer)throw new Error("Feature layer is null");var n=jh(e.layer.type);return Mh(t,n,Th)};function tf(e,t){return Tc.getDefaultsForType(e)[t]}function nf(e,t){var n,r,o,i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null;if(null===(null===(n=zh.viewManager)||void 0===n?void 0:n.currentLayer)||void 0===(null===(r=zh.viewManager)||void 0===r?void 0:r.currentLayer))throw console.error("No current layer"),new Error("No current layer");var a=Tc.getRendererInfo(e),l=a.object,s=l.targetParams,u={};if(null!==i){var c,h=Jh(i);try{for(h.s();!(c=h.n()).done;){var f=c.value;u[f.name]=f.value}}catch(g){h.e(g)}finally{h.f()}}else for(var d in s)u[d]=tf(e,s[d]);u["position"]=t,u["color"]=new v.a.Color(Ah(e,null===(o=zh.viewManager)||void 0===o?void 0:o.currentLayer));var p=l.render2DTarget(null,u);return p}function rf(e,t){if(null===zh.viewManager)throw console.error("Registry.viewManager is null"),new Error("Registry.viewManager is null");var n=new v.a.PointText(new v.a.Point(t[0],t[1]));return n.justification="center",n.fillColor=new v.a.Color(Ch),n.content=zh.viewManager.tools.InsertTextTool.text,n.fontSize=1e4,n}function of(e){Uh(e)}function af(e){var t=e.getValue("position"),n=new v.a.PointText(new v.a.Point(t[0],t[1]));if(n.justification="center",void 0!=e.getParams().color){var r=e.getParams().color.value;if("white"==r||"White"==r||"WHITE"==r)n.fillColor=new v.a.Color(Dh);else if("black"==r||"Black"==r||"BLACK"==r)n.fillColor=new v.a.Color(kh);else if("blue"==r||"Blue"==r||"BLUE"==r)n.fillColor=new v.a.Color(Rh);else{if("red"!=r&&"Red"!=r&&"RED"!=r)throw new Error("Color choice "+r+" not enabled");n.fillColor=new v.a.Color(Ph)}}else n.fillColor=new v.a.Color(Qh(e));n.content=e.getValue("text"),n.fontSize=e.getValue("fontSize");var o=n;return o["featureID"]=e.ID,o}function lf(e,t){var n,r,o=e.getType();if(Tc.isCustomType(o)){"Custom",n=fh(e,ef(e));var i=n;return i["featureID"]=e.ID,i}if("EDGE"===o)return of(e);if("Text"===o)return af(e);var a=Tc.getRendererInfo(o),l=Tc.getRenderer(o);t&&null!==t||(t=a.key),l?r=l.featureParams:console.error("Could not find renderer method for feature:",e);var s={};for(var u in r)s[u]=e.getValue(r[u]);s.color=Qh(e),s.baseColor=ef(e),n=l.render2D(s,t);var c=n;return c["featureID"]=e.ID,c}function sf(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function uf(e,t){for(var n=0;n=e.length?{done:!0}:{done:!1,value:e[r++]}},e:function(e){throw e},f:o}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var i,a=!0,l=!1;return{s:function(){n=n.call(e)},n:function(){var e=n.next();return a=e.done,e},e:function(e){l=!0,i=e},f:function(){try{a||null==n.return||n.return()}finally{if(l)throw i}}}}function yf(e,t){if(e){if("string"===typeof e)return mf(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?mf(e,t):void 0}}function mf(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n3&&void 0!==arguments[3]?arguments[3]:Tc.generateID();wf(this,e),this._params=t,this._name=n,this._id=o,this._entity=r,this._featureIDs=[],this._bounds=null,this._placed=!1,this._ports=new Map,this._componentPortTRenders=new Map,this._xspan=0,this._yspan=0,this._renderOffset=[0,0];var i=this._params.toMap();if(""!==r&&"TEXT"!==r||null===r){var a=Tc.getComponentPorts(i,r);if(void 0!=a&&a.length>=0&&null!==a){var l,s=gf(a);try{for(s.s();!(l=s.n()).done;){var u=l.value;this.setPort(u.label,u)}}catch(c){s.e(c)}finally{s.f()}}}else console.warn("Component mint is empty")}return _f(e,[{key:"mint",get:function(){return this._entity}},{key:"offset",get:function(){return this._renderOffset}},{key:"ports",get:function(){return this._ports},set:function(e){this._ports=e}},{key:"placed",get:function(){return this._placed},set:function(e){this._placed=e}},{key:"featureIDs",get:function(){return this._featureIDs}},{key:"setBounds",value:function(e){this._bounds=e;var t=e.topLeft;this._params.updateParameter("position",[t.x,t.y]),this._params.updateParameter("xspan",e.width),this._params.updateParameter("yspan",e.height)}},{key:"updateParameter",value:function(e,t){"position"==e&&console.error("Use updateComponentPosition instead of updateParameter when changing position"),this._params.updateParameter(e,t);var n,r=gf(this._featureIDs);try{for(r.s();!(n=r.n()).done;){var o=n.value,i=hf.getFeatureFromID(o);i.updateParameter(e,t)}}catch(a){r.e(a)}finally{r.f()}hf.getFeatureFromID(this._featureIDs[0]).getValue("position");this.setPosition(),this.setOffset(),this.updateComponentPorts()}},{key:"toInterchangeV1",value:function(){this.getBoundingRectangle();var e=[],t=this.ports;if(null!==t){var n,r=gf(t.keys());try{for(r.s();!(n=r.n()).done;){var o=n.value,i=t.get(o);if(void 0!=i){var a=i.toInterchangeV1();e.push(a)}}}catch(s){r.e(s)}finally{r.f()}}var l={id:this._id,name:this._name,entity:this._entity,params:this._params.toJSON(),"x-span":this._xspan,"y-span":this._yspan,ports:e,layers:this.findLayerReferences()};return l}},{key:"findLayerReferences",value:function(){var e,t=hf.getDeviceLayers(),n=[],r=gf(t);try{for(r.s();!(e=r.n()).done;){var o=e.value,i=void 0;for(var a in o.features)i=o.features[a],i.referenceID==this.id&&n.push(o.id)}}catch(l){r.e(l)}finally{r.f()}return n}},{key:"id",get:function(){return this._id}},{key:"name",get:function(){return this._name},set:function(e){this._name=e}},{key:"getPosition",value:function(){return this._params.getValue("position")}},{key:"getValue",value:function(e){try{return this._params.getValue(e)}catch(t){throw new Error("Unable to get value for key: "+e)}}},{key:"addFeatureID",value:function(e){this._featureIDs.push(e)}},{key:"updateBounds",value:function(){var e,t=null,n=null,r=null,o=gf(this._featureIDs);try{for(o.s();!(e=o.n()).done;){var i=e.value;n=hf.getFeatureFromID(i),r=lf(n,null),t=null===t?r.bounds:t.unite(r.bounds)}}catch(a){o.e(a)}finally{o.f()}this._bounds=t}},{key:"params",get:function(){return this._params}},{key:"getBoundingRectangle",value:function(){0!=this._featureIDs.length&&null!==this._featureIDs&&void 0!=this._featureIDs||console.error("No features associated with the component");var e,t=null,n=gf(this._featureIDs);try{for(n.s();!(e=n.n()).done;){var r=e.value,o=hf.getRenderedFeature(r);t=t&&o?t.unite(o.bounds):o.bounds}}catch(i){n.e(i)}finally{n.f()}if(null!==t)return t;throw new Error("Component "+this._name+" "+this._id+" cannot have bounds of null")}},{key:"updateComponentPosition",value:function(e){console.log("input position: ",e),this._params.updateParameter("position",[e[0]+this._renderOffset[0],e[1]+this._renderOffset[1]]);var t,n=gf(this._featureIDs);try{for(n.s();!(t=n.n()).done;){var r=t.value,o=hf.getFeatureFromID(r);o.updateParameter("position",e)}}catch(i){n.e(i)}finally{n.f()}this.updateComponentPorts()}},{key:"setInitialOffset",value:function(){var e=this.getBoundingRectangle();this._renderOffset=[e.x,e.y]}},{key:"setOffset",value:function(){var e=this.getBoundingRectangle(),t=hf.getFeatureFromID(this._featureIDs[0]).getValue("position");this._renderOffset=[e.x-t[0],e.y-t[1]]}},{key:"setPosition",value:function(){this._params.updateParameter("position",this.getTopLeftPosition())}},{key:"replicate",value:function(t,n){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:hf.generateDeviceName(this._entity),o=Tc.getDefinitionForMINT(this._entity);if(null===o)throw new Error("Unable to find definition for component type: "+this._entity);var i=this._params.parameters,a=vf.toMap(o.unique),l=vf.toMap(o.heritable),s=new zc(i,a,l),u=new e(s,r,this._entity);console.log("Checking what the new component params are:",u._params);var c,h=gf(this._featureIDs);try{for(h.s();!(c=h.n()).done;){var f=c.value,d=hf.getFeatureFromID(f),p=d.replicate(this.getPosition()[0],this.getPosition()[1]);p.referenceID=u.id,u.featureIDs.push(p.ID);var v=hf.getDeviceLayerFromID(f);v.addFeature(p)}}catch(g){h.e(g)}finally{h.f()}return console.warn("TODO: Generate renders for the new Features for this new component"),u.updateComponentPosition([t,n]),u}},{key:"getCenterPosition",value:function(){var e=this.getBoundingRectangle();return[e.center.x,e.center.y]}},{key:"getTopLeftPosition",value:function(){var e=this.getBoundingRectangle();return[e.topLeft.x,e.topLeft.y]}},{key:"setPort",value:function(e,t){this._ports.set(e,t)}},{key:"getRotation",value:function(){if(this._params.hasParam("rotation"))return this.getValue("rotation");if(this._params.hasParam("orientation")){var e=this.getValue("orientation");return"V"===e?0:270}return console.warn("Returning rotation = 0 since no rotation was found for component: ",this),0}},{key:"attachComponentPortRender",value:function(e,t){this._componentPortTRenders.set(e,t)}},{key:"updateComponentPorts",value:function(){var e=this.params.toMap(),t=e.get("position");e.set("position",[t[0]-this._renderOffset[0],t[1]-this._renderOffset[1]]);var n,r=Tc.getComponentPorts(e,this._entity),o=gf(r);try{for(o.s();!(n=o.n()).done;){var i=n.value;this.setPort(i.label,i)}}catch(a){o.e(a)}finally{o.f()}}}],[{key:"fromInterchangeV1",value:function(t){var n,r,o,i=!1,a=t.name,l=t.id,s=t.entity,u=(t["x-span"],t["y-span"],t.params);if(n=i?md.defaultParameterDefinitions():Tc.getDefinitionForMINT(s),null===n)throw Error("Could not find definition for type: "+s);for(var c in t.params)Object.prototype.hasOwnProperty.call(n.heritable,c)?r=n.heritable[c]:Object.prototype.hasOwnProperty.call(n.unique,c)&&(r=n.unique[c]),o=t.params[c],"Float"===r&&"string"===typeof o&&(o=parseFloat(o)),u[c]=o;Object.prototype.hasOwnProperty.call(u,"position")||(u.position=[0,0]);var h,f=vf.toMap(n.unique),d=vf.toMap(n.heritable),p=new zc(u,f,d),v=new e(p,a,s,l),g=new Map,y=gf(t.ports);try{for(y.s();!(h=y.n()).done;){var m=h.value,w=b.fromInterchangeV1(m);g.set(w.label,w)}}catch(_){y.e(_)}finally{y.f()}return v.ports=g,v}}]),e}();function Cf(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function Of(e,t){for(var n=0;n=e.length?{done:!0}:{done:!1,value:e[r++]}},e:function(e){throw e},f:o}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var i,a=!0,l=!1;return{s:function(){n=n.call(e)},n:function(){var e=n.next();return a=e.done,e},e:function(e){l=!0,i=e},f:function(){try{a||null==n.return||n.return()}finally{if(l)throw i}}}}function Mf(e,t){if(e){if("string"===typeof e)return jf(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?jf(e,t):void 0}}function jf(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n5&&void 0!==arguments[5]?arguments[5]:Tc.generateID();Af(this,e),this.features=[],this._params=n,this._name=r,this._id=a,this._type=t,this._entity=o,this._featureIDs=[],this._nodes=[],this._bounds=null,this._source=null,this._sinks=[],this._paths=[],this._objects=[],this._routed=!1,this._layer=i}return Bf(e,[{key:"layer",get:function(){return this._layer},set:function(e){this._layer=e}},{key:"sinks",get:function(){return this._sinks}},{key:"source",get:function(){return this._source}},{key:"routed",get:function(){return this._routed},set:function(e){this._routed=e}},{key:"featureIDs",get:function(){return this._featureIDs}},{key:"params",get:function(){return this._params},set:function(e){for(var t in this._params=e,e){var n,r=e.getValue(t),o=If(this._featureIDs);try{for(o.s();!(n=o.n()).done;){var i=n.value,a=Tf.getFeatureFromID(i);a.updateParameter(t,r.getValue())}}catch(l){o.e(l)}finally{o.f()}}}},{key:"setBounds",value:function(e){this._bounds=e;var t=e.topLeft;this._params.updateParameter("position",[t.x,t.y]),this._params.updateParameter("xspan",e.width),this._params.updateParameter("yspan",e.height)}},{key:"updateParameter",value:function(e,t){if(this._params.updateParameter(e,t),console.log("Key: ",e," Val: ",t),"segments"!=e){var n,r=If(this._featureIDs);try{for(r.s();!(n=r.n()).done;){var o=n.value,i=Tf.getFeatureFromID(o);i.updateParameter(e,t)}}catch(a){r.e(a)}finally{r.f()}}}},{key:"toInterchangeV1",value:function(){if(null===this._source)throw new Error("Source is null, cannot convert connection to interchange format:"+this._id);for(var e=[],t=0;tt?this._sinks[t].toJSON():null,wayPoints:n,features:this.features.map((function(e){return e.id}))};e.push(r)}var o={id:this._id,name:this._name,entity:this._entity,source:this._source.toJSON(),sinks:[],paths:e,params:this._params.toJSON(),layer:this._layer.id};if(null!==this._source&&(o.source=this._source.toJSON()),null!==this._sinks&&this._sinks.length>0){var i,a=[],l=If(this._sinks);try{for(l.s();!(i=l.n()).done;){var s=i.value;a.push(s.toJSON())}}catch(u){l.e(u)}finally{l.f()}o.sinks=this._sinks.map((function(e){return Nf.toConnectionTargetInterchangeV1(e)}))}return o}},{key:"id",get:function(){return this._id}},{key:"name",get:function(){return this._name},set:function(e){this._name=e}},{key:"type",get:function(){return this._type}},{key:"getValue",value:function(e){try{return this._params.getValue(e)}catch(t){throw new Error("Unable to get value for key: "+e)}}},{key:"addFeatureID",value:function(e){this._featureIDs.push(e)}},{key:"updateBounds",value:function(){console.log("test");var e,t=null,n=null,r=null,o=If(this._featureIDs);try{for(o.s();!(e=o.n()).done;){var i=e.value;n=Tf.getFeatureFromID(i),console.log(n),r=lf(n,null),console.log("rendered:"),console.log(r),t=null===t?r.bounds:t.unite(r.bounds)}}catch(a){o.e(a)}finally{o.f()}this._bounds=t}},{key:"getPaths",value:function(){return this._paths}},{key:"updateSegments",value:function(e){this.updateParameter("segments",new jc("SegmentArray",e));var t,n=If(this._featureIDs);try{for(n.s();!(t=n.n()).done;){var r=t.value,o=Tf.getFeatureFromID(r);o.updateParameter("segments",e)}}catch(i){n.e(i)}finally{n.f()}}},{key:"insertFeatureGap",value:function(e){var t=!1;console.log(e,e.width,e.height),e=new v.a.Path.Rectangle(e);var n=this.getValue("segments");for(var r in n){var o=n[r],i=new v.a.Path.Line(new v.a.Point(o[0]),new v.a.Point(o[1])),a=i.getIntersections(e);if(2===a.length){var l=a[0].point,s=a[1].point,u=this.breakSegment(o,l,s);if(console.log("breaking:",o,u),2!==u.length)throw new Error("Could not break the segments correctly");n.splice(r,1,u[0],u[1]),t=!0}else 1===a.length?(console.error("Only found 1 intersection point so going to use a different method"),console.log("Found Intersection:",a),console.log("Segments:",n),console.log("line:",i),console.log("Bounding Box:",e)):(console.error("No intersections found so going to use a different method"),console.log("Found Intersection:",a),console.log("Segments:",n),console.log("line:",i),console.log("Bounding Box:",e))}if(!t)throw console.error("There's something funky going on with the intersection,no intersections found"),console.log("Segments:",n),console.log("Bounding Box:",e),new Error("Could not find 2 intersection points, hence aborting the whole thing");return this.updateSegments(n),t}},{key:"breakSegment",value:function(e,t,n){var r,o,i=new v.a.Point(e[0]),a=new v.a.Point(e[1]),l=i.getDistance(t),s=a.getDistance(t),u=i.getDistance(n),c=a.getDistance(n);return l+c=e.length?{done:!0}:{done:!1,value:e[r++]}},e:function(e){throw e},f:o}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var i,a=!0,l=!1;return{s:function(){n=n.call(e)},n:function(){var e=n.next();return a=e.done,e},e:function(e){l=!0,i=e},f:function(){try{a||null==n.return||n.return()}finally{if(l)throw i}}}}function td(e,t){if(e){if("string"===typeof e)return nd(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?nd(e,t):void 0}}function nd(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n1&&void 0!==arguments[1]?arguments[1]:"New Device";rd(this,e),this.__layers=[],this.__textLayers=[],this.__groups=[],this.__params=new zc(t,e.getUniqueParameters(),e.getHeritableParameters()),this.__name=n,this.__components=[],this.__nameMap=new Map,this.__connections=[],this.__valveMap=new Map,this.__valveTypeMap=new Map,this.__parchmintFeatures=[]}return id(e,[{key:"addValve",value:function(e,t,n){this.__valveMap.set(e,t),this.__valveTypeMap.set(e,n)}},{key:"name",get:function(){return this.__name},set:function(e){this.__name=e}},{key:"nameMap",set:function(e){this.__nameMap=e}},{key:"layers",get:function(){return this.__layers}},{key:"parchmintFeatures",get:function(){return this.__parchmintFeatures}},{key:"addConnection",value:function(e){this.__connections.push(e)}},{key:"removeConnection",value:function(e){var t=this.__connections.indexOf(e);-1!=t&&this.__connections.splice(t,1)}},{key:"addComponent",value:function(e){if(!(e instanceof Pf))throw new Error("Tried to add a component that isn't a component to the device");this.__components.push(e)}},{key:"removeComponent",value:function(e){var t,n,r=e.id,o=null,i=ed(this.__connections);try{for(i.s();!(n=i.n()).done;){var a=n.value;try{t=a.tryDeleteConnectionTarget(r),t&&console.log("Removed Component from Connection : ",a.id)}catch(u){console.error(u)}}}catch(c){i.e(c)}finally{i.f()}var l=this.__valveMap.get(r);void 0!=l&&(o=this.getConnectionByID(l),this.__valveMap.delete(r));var s=this.__components.indexOf(e);return-1!=s&&this.__components.splice(s,1),o}},{key:"components",get:function(){return this.__components}},{key:"updateParameter",value:function(e,t){this.__params.updateParameter(e,t)}},{key:"getLayer",value:function(e){for(var t in this.__layers){var n=this.__layers[t];if(n.id==e)return n}return null}},{key:"getLayerFromFeatureID",value:function(e){for(var t=0;t2&&void 0!==arguments[2]?arguments[2]:i.NORMALLY_OPEN;this.__valveMap.set(e.id,t.id),this.__valveTypeMap.set(e.id,n)}},{key:"connections",get:function(){return this.__connections}},{key:"getValvesForConnection",value:function(e){var t,n=e.id,r=[],o=ed(this.__valveMap);try{for(o.s();!(t=o.n()).done;){var i=Jf(t.value,2),a=i[0],l=i[1];if(n===l){var s=this.getComponentByID(a);null!==s&&r.push(s)}}}catch(u){o.e(u)}finally{o.f()}return r}},{key:"getValveType",value:function(e){var t=e.id,n=this.__valveTypeMap.get(t);if(void 0===n)throw new Error("Valve not found");return n}},{key:"getComponentByID",value:function(e){for(var t in this.__components){var n=this.__components[t];if(n.id===e)return n}return null}},{key:"getConnectionByID",value:function(e){for(var t in this.__connections){var n=this.__connections[t];if(n.id===e)return n}return null}},{key:"getComponentByName",value:function(e){var t,n=this.__components,r=ed(n);try{for(r.s();!(t=r.n()).done;){var o=t.value;if(e==o.name)return o}}catch(i){r.e(i)}finally{r.f()}throw new Error("Component with name "+e+"does not exist")}},{key:"getUnroutedConnections",value:function(){var e,t=[],n=this.__connections,r=ed(n);try{for(r.s();!(e=r.n()).done;){var o=e.value;o.routed||t.push(o)}}catch(i){r.e(i)}finally{r.f()}return t}},{key:"getPositionOfComponentPort",value:function(e){var t,n=this.__components,r=ed(n);try{for(r.s();!(t=r.n()).done;){var o,i=t.value,a=ed(i.ports.keys());try{for(a.s();!(o=a.n()).done;){var l=o.value,s=i.ports.get(l);if(void 0!=s&&e.id==s.id)return b.calculateAbsolutePosition(e,i)}}catch(u){a.e(u)}finally{a.f()}}}catch(u){r.e(u)}finally{r.f()}}},{key:"textLayers",get:function(){return this.__textLayers}}],[{key:"getUniqueParameters",value:function(){var e=new Map;return e.set("x-span","Float"),e.set("y-span","Float"),e}},{key:"getHeritableParameters",value:function(){return new Map}},{key:"fromInterchangeV1",value:function(t){var n;if(Object.prototype.hasOwnProperty.call(t,"params")?n=Object.prototype.hasOwnProperty.call(t.params,"width")&&Object.prototype.hasOwnProperty.call(t.params,"length")?new e({width:t.params.width,length:t.params.length},t.name):new e({width:135e3,length:85e3},t.name):(console.warn("Could not find device params, using some default values for device size"),n=new e({width:135e3,length:85e3},t.name)),n.__loadComponentsFromInterchangeV1(t.components),n.__loadConnectionsFromInterchangeV1(t.connections),Object.prototype.hasOwnProperty.call(t,"layers"))n.__loadLayersFromInterchangeV1(t.layers);else{var r=new Yc({},"flow",o.FLOW,"0",n);n.addLayer(r),r=new Yc({},"control",o.CONTROL,"0",n),n.addLayer(r)}var i,a=n.getAllFeaturesFromDevice();for(var l in a)i=a[l],null!==i.referenceID&&n.updateObjectReference(i.referenceID,i.ID);return n}},{key:"fromInterchangeV1_1",value:function(t){var n,r,a;if(Kf(t),Object.prototype.hasOwnProperty.call(t,"params")?n=Object.prototype.hasOwnProperty.call(t.params,"xspan")&&Object.prototype.hasOwnProperty.call(t.params,"yspan")?new e({width:t.params.xspan,length:t.params.yspan},t.name):new e({width:135e3,length:85e3},t.name):(console.warn("Could not find device params, using some default values for device size"),n=new e({width:135e3,length:85e3},t.name)),n.__loadComponentsFromInterchangeV1(t.components),n.__loadConnectionsFromInterchangeV1(t.connections),Object.prototype.hasOwnProperty.call(t.params,"valveMap")&&Object.prototype.hasOwnProperty.call(t.params,"valveTypeMap")){r=zf(t.params.valveMap),console.log("Imported valvemap",r),console.log("Loaded valvetypemap",t.params.valveTypeMap),a=zf(t.params.valveTypeMap),console.log(t.params.valveTypeMap,a);var l,s=ed(r);try{for(s.s();!(l=s.n()).done;){var u=Jf(l.value,2),c=u[0],h=u[1],f=n.getComponentByID(c);if(null===f)throw console.error("Could not find valve with id:",c),new Error("Could not find valve with id: "+c);var d=n.getConnectionByID(h);if(null===d)throw console.error("Could not find connection with id:",h),new Error("Could not find connection with id: "+h);var p=a.get(c);i.NORMALLY_OPEN;if("NORMALLY_OPEN"===p)i.NORMALLY_OPEN;else{if("NORMALLY_CLOSED"!==p)throw console.warn("Could not find valve type for valve with id:",c),new Error("Could not find valve type for valve with id: "+c);i.NORMALLY_CLOSED}n.insertValve(f,d,a.get(c))}}catch(w){s.e(w)}finally{s.f()}}if(Object.prototype.hasOwnProperty.call(t,"features"))n.__loadLayersFromInterchangeV1(t.layers);else{var v=new Yc({},"flow",o.FLOW,"0",n);n.addLayer(v),v=new Yc({},"control",o.CONTROL,"0",n),n.addLayer(v)}var g,y=n.getAllFeaturesFromDevice();for(var m in y)g=y[m],null!==g.referenceID&&n.updateObjectReference(g.referenceID,g.ID);return n}},{key:"makeFeature",value:function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"New Feature",r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:void 0,o=arguments.length>4?arguments[4]:void 0,i=arguments.length>5?arguments[5]:void 0,a=new zc(new Map,new Map,new Map);if("EDGE"===e)return new Qd(o,a,r);var l=Tc.getDefinition(e);if(t&&l)Bd.checkDefaults(t,l.heritable,Tc.getDefaultsForType(e)),a=new zc(t,vf.toMap(l.unique),vf.toMap(l.heritable));else{var s=new Map;a=new zc(t,s.set("position","Point"),new Map)}var u=new Bd(e,a,n,r);if(i)for(var c=0;c2&&void 0!==arguments[2]?arguments[2]:e.toUpperCase();return sd(this,n),o=t.call(this),o.dxfData=null,o._type="",o._entity="",o._renderData=null,o._params=new zc({},new Map,new Map),o._type=e,o._entity=i,o.dxfData=r,o}return cd(n,[{key:"entity",get:function(){return this._entity}},{key:"type",get:function(){return this._type}},{key:"renderData",set:function(e){this._renderData=e}},{key:"generateComponent",value:function(){var e={},t=ad.makeFeature(this.type,e,qf.generateNewName(this.type),Tc.generateID(),"XY",this.dxfData);return t}},{key:"toJSON",value:function(){var e=[];for(var t in this.dxfData)e.push(this.dxfData[t].getData());var n={type:this.type,entity:this.entity,params:this._params.toJSON(),dxfData:e};return n}}],[{key:"fromInterchangeV1",value:function(e){var t=[];for(var r in e.dxfData)t.push(new xc(e.dxfData[r]));var o=new n(e.type,t,e.entity);return o}},{key:"defaultParameterDefinitions",value:function(){var e={unique:{position:"Point"},heritable:{rotation:"Float",height:"Float"},units:{rotation:"°",height:"μm"},defaults:{rotation:0,height:100},minimum:{rotation:0,height:1},maximum:{rotation:359,height:1200},mint:""};return e}}]),n}(O),wd=n("ba10"),bd=n.n(wd);function _d(e){return _d="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},_d(e)}function Pd(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function Cd(e,t){for(var n=0;n3&&void 0!==arguments[3]?arguments[3]:Tc.generateID(),i=arguments.length>4&&void 0!==arguments[4]?arguments[4]:Dc.XY;jd(this,e),this._type=t,this._params=n,this._name=r,this._id=o,this._type=t,this._fabtype=i,this._dxfObjects=[],this._referenceID=null,this.layer=null;var a,l=this.deriveRenderName();a="Port"==this.type?"PORT":"COMPONENT",console.log("rendName: ",l),console.log("z-offset-key: ",Tc.library[this.type].object.zOffsetKey(l)),this._manufacturingInfo={fabtype:i,layertype:null,rendername:l,z_offset_key:Tc.library[this.type].object.zOffsetKey(l),depth:this.getValue(Tc.library[this.type].object.zOffsetKey(l)),substrate_offset:Tc.library[this.type].object.substrateOffset(l),substrate:null,modifier:a}}return Vd(e,[{key:"id",get:function(){return this._id}},{key:"type",get:function(){return this._type}},{key:"referenceID",get:function(){return this._referenceID},set:function(e){this._referenceID=e}},{key:"dxfObjects",get:function(){return this._dxfObjects},set:function(e){this._dxfObjects=e}},{key:"fabType",get:function(){return this._fabtype}},{key:"manufacturingInfo",get:function(){return this.setManufacturingInfoLayer(),this._manufacturingInfo}},{key:"setManufacturingInfoLayer",value:function(){if(this._manufacturingInfo.depth=this.getValue(Tc.library[this.type].object.zOffsetKey(this.deriveRenderName())),null===this.layer)throw new Error("Layer not set in feature "+this.ID+" so manufacturingInfo cannot be set");this._manufacturingInfo.layertype=this.layer.type,this._manufacturingInfo.substrate=Md.setSubstrate(this,this._manufacturingInfo.substrate_offset)}},{key:"updateParameter",value:function(e,t){this._params.updateParameter(e,t),Wd.get().emit(Wd.UPDATE_RENDERS,this)}},{key:"toJSON",value:function(){var e={id:this._id,name:this._name,type:this._type,params:this._params.toJSON()};return e}},{key:"toInterchangeV1",value:function(){var e,t,n={id:this._id,name:this._name,macro:this._type,params:this._params.toJSON(),type:this._fabtype,referenceID:this._referenceID,dxfData:this._dxfObjects.map((function(e){return e.toJSON()})),layerID:null!==(e=null===(t=this.layer)||void 0===t?void 0:t.id)&&void 0!==e?e:""};return n}},{key:"ID",get:function(){return this._id}},{key:"setName",value:function(e){this._name=e}},{key:"getName",value:function(){return this._name}},{key:"getType",value:function(){return this._type}},{key:"getValue",value:function(e){try{return this._params.getValue(e)}catch(t){if(this.hasDefaultParam(e))return this.getDefaults()[e];throw new Error("Unable to get value for key: "+e)}}},{key:"hasDefaultParam",value:function(e){return!!this.getDefaults().hasOwnProperty(e)}},{key:"hasUniqueParam",value:function(e){return this._params.isUnique(e)}},{key:"hasHeritableParam",value:function(e){return this._params.isHeritable(e)}},{key:"getHeritableParams",value:function(){return Tc.getHeritableForType(this.getType())}},{key:"getUniqueParams",value:function(){return Tc.getUniqueForType(this.getType())}},{key:"getDefaults",value:function(){return Tc.getDefaultsForType(this.getType())}},{key:"getParams",value:function(){return this._params.parameters}},{key:"setParams",value:function(e){this._params.loadParameters(e)}},{key:"replicate",value:function(e,t){this._params;var n={position:[e,t]};for(var r in this._params.parameters)n[r]=this.getValue(r);var o=ad.makeFeature(this._type,n,this._name,Tc.generateID(),"XY",this._dxfObjects.map((function(e){return e.toJSON()})));return o}},{key:"deriveRenderName",value:function(){return Tc.library[this.type]||(console.error("Type unrecognized, defaulting to template."),this._type="Template"),Tc.library[this.type].key}},{key:"getDXFObjects",value:function(){return this._dxfObjects}},{key:"addDXFObject",value:function(e){this._dxfObjects.push(e)}}],[{key:"checkDefaults",value:function(e,t,n){for(var r in t)Object.prototype.hasOwnProperty.call(e,r)||(e[r]=n[r]);return e}},{key:"fromJSON",value:function(e){return ad.makeFeature(e.type,e.params,e.name,e.id,"XY",[])}},{key:"fromInterchangeV1",value:function(e){var t;return t=ad.makeFeature(e.macro,e.params,e.name,e.id,e.type,e.dxfData),Object.prototype.hasOwnProperty.call(e,"referenceID")&&(t.referenceID=e.referenceID),t}},{key:"makeCustomComponentFeature",value:function(t,n,r){var o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"New Feature",i=arguments.length>4&&void 0!==arguments[4]?arguments[4]:void 0,a=md.defaultParameterDefinitions();e.checkDefaults(r,a.heritable,Tc.getDefaultsForType(t.type));var l=new zc(r,vf.toMap(a.unique),vf.toMap(a.heritable)),s=new e(t.type,l,o,i,Dc.XY);return s.dxfObjects=t.dxfData,s}}]),e}();function Gd(e){return Gd="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},Gd(e)}function zd(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function Ud(e,t){for(var n=0;n2&&void 0!==arguments[2]?arguments[2]:Tc.generateID();return zd(this,n),o=t.call(this,"EDGE",r,i,i,Dc.EDGE),o._edgeObjects=e||[],o}return Kd(n,[{key:"generateRectEdge",value:function(e,t){e/=1e3,t/=1e3;var n=new xc({type:"POLYLINE",vertices:[{x:0,y:0,z:0},{x:e,y:0,z:0},{x:e,y:t,z:0},{x:0,y:t,z:0},{x:0,y:0,z:0}]});this.addDXFObject(n)}}]),n}(Bd);function ep(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function tp(e,t){for(var n=0;n=a.x;f-=n){var d=new v.a.Point(f,i.y+l/2);e.isThick(f,t.origin.x,n,t.thickCount)?s.addChild(o.place(d)):s.addChild(r.place(d))}return s}},{key:"makeHorizontalLines",value:function(t){for(var n=t.getSpacing(),r=e.horizLineSymbol(t.getThinWidth(),t.color),o=e.horizLineSymbol(t.getThickWidth(),t.color),i=v.a.view.bounds.topLeft,a=v.a.view.bounds.bottomLeft,l=v.a.view.bounds.width,s=new v.a.Group,u=Math.floor((i.y-t.origin.y)/n)*n+t.origin.y,c=u;c=a.y;f-=n){var d=new v.a.Point(i.x+l/2,f);e.isThick(f,t.origin.y,n,t.thickCount)?s.addChild(o.place(d)):s.addChild(r.place(d))}return s}}]),e}();function op(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function ip(e,t){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:lp,n=new v.a.Path.Rectangle({from:v.a.view.bounds.topLeft.subtract(new v.a.Point(v.a.view.size)),to:v.a.view.bounds.bottomRight.add(new v.a.Point(v.a.view.size)),fillColor:new v.a.Color(Oh),strokeColor:null}),r=sp/v.a.view.zoom,o=e.getXSpan(),i=e.getYSpan(),a=new v.a.Path.Rectangle({from:new v.a.Point(0,0),to:new v.a.Point(o,i),fillColor:Dh,strokeColor:t,strokeWidth:r}),l=new v.a.Group([n,a]);return l}}]),e}();function cp(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function hp(e,t){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:1.177827941003;return e<0?this.view.getZoom()*t:e>0?this.view.getZoom()/t:this.view.getZoom()}},{key:"moveCenter",value:function(e){this.view.setCenter(this.calcCenter(e))}},{key:"calcCenter",value:function(e){return this.view.getCenter().subtract(e)}}]),e}();function pp(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function vp(e,t){for(var n=0;n1&&void 0!==arguments[1]&&arguments[1];pp(this,e),this.__features=[],this.__name=t,this.__paperGroup=new v.a.Group,this.__flip=n}return gp(e,[{key:"name",get:function(){return this.__name}},{key:"flip",get:function(){return this.__flip}},{key:"addFeature",value:function(e){if(null===e||void 0===e)return!1;var t=e.clone();return console.log("Copied feature",t),this.__features.push(t),this.__paperGroup.addChild(t),!0}},{key:"generateFeatureRender",value:function(e,t){console.log("Generating Render for invisible feature",e);var n=lf(e,t);return this.__features.push(n),this.__paperGroup.addChild(n),!0}},{key:"flipX",value:function(){var e=zh.currentDevice;if(null!==e){var t=e.getYSpan(),n=e.getXSpan();console.log("Flipping stuff:",n,t);var r=new v.a.Point(n/2,t/2);this.__paperGroup.scale(-1,1,r)}}},{key:"exportToSVG",value:function(){var t=zh.currentDevice;if(null!==t){var n=t.getYSpan(),r=t.getXSpan(),o=this.__paperGroup.exportSVG({asString:!0});return o=e.generateSVGTextPrepend(r,n)+o+e.generateSVGTextAppend(),o}throw new Error("Registry.currentDevice is null")}},{key:"flushData",value:function(){this.__paperGroup.removeChildren()}}],[{key:"generateSVGTextPrepend",value:function(e,t){var n='"}}]),e}();function mp(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function wp(e,t){for(var n=0;n=e.length?{done:!0}:{done:!1,value:e[r++]}},e:function(e){throw e},f:o}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var i,a=!0,l=!1;return{s:function(){n=n.call(e)},n:function(){var e=n.next();return a=e.done,e},e:function(e){l=!0,i=e},f:function(){try{a||null==n.return||n.return()}finally{if(l)throw i}}}}function Cp(e,t){if(e){if("string"===typeof e)return Op(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?Op(e,t):void 0}}function Op(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n3&&void 0!==arguments[3]?arguments[3]:500,o=t[0],i=t[1],a=new v.a.Point(o+e.x,i+e.y),l=new v.a.Path.Circle(a,r);return l.rotate(n,new v.a.Point(t[0],t[1])),l.fillColor=new v.a.Color(kh),l}},{key:"getSizeforZoomLevel",value:function(){var e=v.a.view.zoom,t=5/e;return t>500&&(t=500),t}},{key:"renderComponentPorts",value:function(t){var n=e.getSizeforZoomLevel(),r=t.ports,o=[],i=t.getRotation(),a=t.getValue("position");t.setOffset();var l,s=[a[0]-t.offset[0],a[1]-t.offset[1]],u=Pp(r.keys());try{for(u.s();!(l=u.n()).done;){var c=l.value,h=r.get(c);if(void 0!==h){var f=e.renderComponentPort(h,s,i,n);t.attachComponentPortRender(c,f),o.push(f)}else console.error("component ".concat(t.id," has no port ").concat(c))}}catch(d){u.e(d)}finally{u.f()}return o}}]),e}();function Dp(e,t){var n="undefined"!==typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(!n){if(Array.isArray(e)||(n=Tp(e))||t&&e&&"number"===typeof e.length){n&&(e=n);var r=0,o=function(){};return{s:o,n:function(){return r>=e.length?{done:!0}:{done:!1,value:e[r++]}},e:function(e){throw e},f:o}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var i,a=!0,l=!1;return{s:function(){n=n.call(e)},n:function(){var e=n.next();return a=e.done,e},e:function(e){l=!0,i=e},f:function(){try{a||null==n.return||n.return()}finally{if(l)throw i}}}}function Tp(e,t){if(e){if("string"===typeof e)return Fp(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?Fp(e,t):void 0}}function Fp(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n0&&void 0!==arguments[0]?arguments[0]:Tc.generateID();Ip(this,e),this.__position=[0,0],this.__height=0,this.__type="BlankUIElement",this.__featureIDs=[],this.__id=t}return jp(e,[{key:"type",get:function(){return this.__type}},{key:"featureIDs",get:function(){return this.__featureIDs}},{key:"position",get:function(){return this.__position}},{key:"id",get:function(){return this.__id}},{key:"hasFeatureID",value:function(e){return!!this.__featureIDs.includes(e)}},{key:"draw",value:function(){console.log("Drawing at ".concat(this.__position[0],", ").concat(this.__position[1]))}}]),e}();function Vp(e){return Vp="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},Vp(e)}function Bp(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function Gp(e,t){if("function"!==typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),t&&zp(e,t)}function zp(e,t){return zp=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e},zp(e,t)}function Up(e){var t=Yp();return function(){var n,r=Xp(e);if(t){var o=Xp(this).constructor;n=Reflect.construct(r,arguments,o)}else n=r.apply(this,arguments);return Kp(this,n)}}function Kp(e,t){if(t&&("object"===Vp(t)||"function"===typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined");return Hp(e)}function Hp(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function Yp(){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(e){return!1}}function Xp(e){return Xp=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)},Xp(e)}var qp=function(e){Gp(n,e);var t=Up(n);function n(e,r,o){var i,a=arguments.length>3&&void 0!==arguments[3]?arguments[3]:Tc.generateID();return Bp(this,n),i=t.call(this,a),i.__position=r.position.value,i.__height=r.height.value,i.__type=e,i.__featureIDs=o,i}return n}(Ap);function Jp(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function $p(e,t){for(var n=0;n0){for(var t=0;t=0&&this.showActiveLayer()}},{key:"showActiveLayer",value:function(){this.featureLayer.remove(),this.featureLayer=new v.a.Group;for(var e=0;e4&&void 0!==arguments[4]?arguments[4]:this.activeLayer,i=ad.makeFeature("Text",{position:t,height:20,text:e,fontSize:n,color:r},"TEXT_"+e,d.a.v1(),"XY",null);this.__viewManagerDelegate.addFeature(i,o,!1);var a=this.addUIElement("Text",i.getParams(),[i.ID]);i.referenceID=a.id,this.__viewManagerDelegate.saveDeviceState()}},{key:"addUIElement",value:function(e,t,n){if(void 0===zh.viewManager||null===zh.viewManager)throw console.log("ViewManager is not defined"),new Error("ViewManager is not defined");var r;return r="Text"==e?new qp(e,t,n):new Ap,zh.viewManager.nonphysElements.push(r),r}},{key:"insertUIFeature",value:function(e){this.uiLayer.insertChild(0,e)}},{key:"addComponent",value:function(e,t,n,r){if(void 0===zh.viewManager||null===zh.viewManager)throw console.error("ViewManager is not defined"),new Error("ViewManager is not defined");if(void 0===zh.currentDevice||null===zh.currentDevice)throw console.error("Current Device is not defined"),new Error("Current Device is not defined");var o=Tc.getDefinition(e);if(void 0===o||null===o)throw new Error("Component definition not found");var i={};for(var a in t)i[a]=t[a].value;var l,s=new zc(i,vf.toMap(o.unique),vf.toMap(o.heritable)),u=Tc.generateID(),c=zh.currentDevice.generateNewName(e),h=new Pf(s,c,o.mint,u);for(var f in n)h.addFeatureID(n[f]),l=this.__viewManagerDelegate.getFeatureByID(n[f]),l.referenceID=u;return zh.currentDevice.addComponent(h),h}},{key:"comparePaperFeatureHeights",value:function(e,t){var n,r,o=this.__viewManagerDelegate.getFeatureByID(e.featureID),i=this.__viewManagerDelegate.getFeatureByID(t.featureID);try{r=o.getValue("height")}catch(a){r=9999}try{n=i.getValue("height")}catch(a){n=9999}return r-n}},{key:"insertChildByHeight",value:function(e,t){var n;n=e.children.length>0?this.getIndexByHeight(e.children,t):0,e.insertChild(n,t)}},{key:"getIndexByHeight",value:function(e,t){for(var n=0;n=0)return n}return e.length}},{key:"updateFeature",value:function(e){var t,n,r=this.paperFeatures[e.ID];if(t=!!r&&r.selected,this.removeFeature(e),e instanceof Qd)return n=Uh(e),n.selected=t,this.paperFeatures[n.featureID]=n,void this.insertEdgeFeatures(n);n=lf(e,null),n.selected=t,this.paperFeatures[n.featureID]=n;var o=this.__viewManagerDelegate.renderLayers.indexOf(this.__viewManagerDelegate.getRenderLayerByID(e.ID)),i=this.paperLayers[o];this.insertChildByHeight(i,n),this.featureRegistry.set(n.featureID,i.id)}},{key:"removeTarget",value:function(){this.currentTarget&&this.currentTarget.remove(),this.currentTarget=null}},{key:"addTarget",value:function(e,t,n,r){this.removeTarget(),this.lastTargetParameters=r,this.lastTargetType=e,this.lastTargetPosition=n,this.lastTargetSet=t,this.updateTarget()}},{key:"updateTarget",value:function(){if(null===this.__viewManagerDelegate.currentLayer)throw console.error("No layer selected"),new Error("No layer selected");if(this.removeTarget(),this.lastTargetType&&this.lastTargetPosition)if("TEXT"===this.lastTargetType)this.currentTarget=rf(this.lastTargetType,this.lastTargetPosition),this.uiLayer.addChild(this.currentTarget);else if("Custom"===this.lastTargetSet){var e=this.__viewManagerDelegate.customComponentManager.getCustomComponent(this.lastTargetType),t=zh.featureDefaults[this.lastTargetSet][this.lastTargetType];t.position=this.lastTargetPosition,t.color=Ah(this.lastTargetType,this.__viewManagerDelegate.currentLayer),this.currentTarget=dh(e,t),this.uiLayer.addChild(this.currentTarget)}else this.currentTarget=nf(this.lastTargetType,this.lastTargetPosition,this.lastTargetParameters),this.uiLayer.addChild(this.currentTarget)}},{key:"removeFeature",value:function(e){var t=this.paperFeatures[e.ID];t&&t.remove(),this.paperFeatures[e.ID]=null,this.featureRegistry.delete(e.ID)}},{key:"removeGrid",value:function(){this.paperGrid&&this.paperGrid.remove(),this.paperGrid=null}},{key:"updateGrid",value:function(e){this.removeGrid();var t=rp.renderGrid(e);this.paperGrid=t,this.gridLayer.addChild(t)}},{key:"updateAlignmentMarks",value:function(){}},{key:"removeAlignmentMarks",value:function(){this.alignmentMarks&&this.alignmentMarks.removeChildren(),this.alignmentMarks=null}},{key:"updateRatsNest",value:function(){this.removeRatsNest();var e=this.__viewManagerDelegate.currentDevice.getUnroutedConnections(),t=_p.renderRatsNest(e,this.__viewManagerDelegate.currentDevice);this.__ratsNestRender=t,this.ratsNestLayer.addChild(this.__ratsNestRender)}},{key:"removeRatsNest",value:function(){this.__ratsNestRender&&this.__ratsNestRender.remove(),this.__ratsNestRender=null}},{key:"moveCenter",value:function(e){this.panAndZoom.moveCenter(e)}},{key:"adjustZoom",value:function(e,t){this.panAndZoom.adjustZoom(e,t)}},{key:"getFeaturesByViewElements",value:function(e){for(var t=[],n=0;ns?1/l:1/s}},{key:"hitFeature",value:function(e){var t,n=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],r=arguments.length>2&&void 0!==arguments[2]&&arguments[2],o={fill:!0,tolerance:5,guides:!1};if(n&&null!==this.activeLayer&&!r){t=this.paperLayers[this.activeLayer];var i=t.hitTest(e,o);if(i)return i.item}else if(n&&r){t=this.getNonphysText();var a=t.hitTest(e,o);if(a)return a.item}else for(var l=this.paperLayers.length-1;l>=0;l--){t=this.paperLayers[l];var s=t.hitTest(e,o);if(s)return s.item}return null}},{key:"hitFeaturesWithViewElement",value:function(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],n=[];if(t&&null!==this.activeLayer)for(var r=this.paperLayers[this.activeLayer],o=0;o1&&void 0!==arguments[1]?arguments[1]:5,r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:100,o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:10,i=arguments.length>4&&void 0!==arguments[4]?arguments[4]:[0,0],a=arguments.length>5&&void 0!==arguments[5]?arguments[5]:1,l=arguments.length>6&&void 0!==arguments[6]?arguments[6]:3,s=arguments.length>7&&void 0!==arguments[7]?arguments[7]:Sh;ev(this,e),this.__viewManagerDelegate=t,this.origin=new v.a.Point(i[0],i[1]),this.thinWidth=a,this.thickWidth=l,this.minSpacing=n,this.maxSpacing=r,this.thickCount=o,this.__spacing=500,this.__isAutomaticEnabled=!0,this.color=new v.a.Color(s)}return nv(e,[{key:"spacing",get:function(){return this.__spacing},set:function(t){console.log(e.isValidZoom(t)),this.__spacing=t}},{key:"enableAdaptiveGrid",value:function(){this.__isAutomaticEnabled=!0}},{key:"disableAdaptiveGrid",value:function(){this.__isAutomaticEnabled=!1}},{key:"getClosestGridPoint",value:function(e){var t=Math.round((e.x-this.origin.x)/this.__spacing)*this.__spacing+this.origin.x,n=Math.round((e.y-this.origin.y)/this.__spacing)*this.__spacing+this.origin.y;return new v.a.Point(t,n)}},{key:"setOrigin",value:function(e){this.origin=new v.a.Point(e[0],e[1]),this.notifyViewManagerToUpdateView()}},{key:"setThinWidth",value:function(e){this.thinWidth=e,this.notifyViewManagerToUpdateView()}},{key:"setThickWidth",value:function(e){this.thickWidth=e,this.notifyViewManagerToUpdateView()}},{key:"setMinSpacing",value:function(e){this.__spacing=e,this.notifyViewManagerToUpdateView()}},{key:"setMaxSpacing",value:function(e){this.maxSpacing=e,this.notifyViewManagerToUpdateView()}},{key:"setColor",value:function(e){this.color=new v.a.Color(e),this.notifyViewManagerToUpdateView()}},{key:"getSpacing",value:function(){if(this.__isAutomaticEnabled){var e=v.a.view.zoom;return this.__spacing=e<=.02?1e3:e<=.05?500:e<=.1?100:e<=.6?50:5,this.__spacing}return this.__spacing}},{key:"updateGridSpacing",value:function(t){return e.isValidZoom(t)?(console.log("New spacing value:",t),this.__spacing=t,!0):(console.error("Inavlid Grid Spacing"),!1)}},{key:"getThinWidth",value:function(){return this.thinWidth/v.a.view.zoom}},{key:"getThickWidth",value:function(){return this.thickWidth/v.a.view.zoom}},{key:"notifyViewManagerToUpdateView",value:function(){this.__viewManagerDelegate?this.__viewManagerDelegate.updateGrid():console.error("Could not find view manager to send update grid signal")}}],[{key:"isValidZoom",value:function(e){return!0}}]),e}(),ov=n("21a6");function iv(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function av(e,t){for(var n=0;n2&&void 0!==arguments[2]&&arguments[2];uv(this,e),this.timeout=n,this.func=t,this.waiting=!1,this.queued=!0,this.counter=0,this.report=r}return hv(e,[{key:"run",value:function(){this.waiting?(this.counter++,this.queued||(this.queued=!0)):(this.report&&console.log("Waited "+this.counter+" times."),this.func(),this.startTimer(),this.counter=0)}},{key:"endTimer",value:function(){this.waiting=!1,this.queued&&(this.queued=!1,this.run())}},{key:"startTimer",value:function(){var e=this;this.waiting=!0,window.setTimeout((function(){e.endTimer()}),this.timeout)}}]),e}();function dv(e){return dv="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},dv(e)}function pv(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function vv(e,t){for(var n=0;n0){for(var e=0;e2&&void 0!==arguments[2]?arguments[2]:null;Rv(this,n),o=t.call(this,e),o.lastPoint=[0,0],o.viewManagerDelegate=e,o.typeString=r,o.setString="Basic",o.currentFeatureID=null,o.currentParameters=i;var a=Wv(o);return o.lastPoint=[0,0],o.showQueue=new fv((function(){a.showTarget()}),20,!1),o.up=function(e){},o.move=function(e){var t=sv.getEventPosition(e);null!==t&&(a.lastPoint=[t.x,t.y],a.showQueue.run())},o.down=function(e){a.viewManagerDelegate.killParamsWindow(),v.a.project.deselectAll(),a.createNewFeature(sv.getEventPosition(e))},o}return kv(n,[{key:"createNewFeature",value:function(e){var t,r=null===(t=this.viewManagerDelegate.currentDevice)||void 0===t?void 0:t.generateNewName(this.typeString),o=ad.makeFeature(this.typeString,{position:n.getTarget([e.x,e.y])},r);this.currentFeatureID=o.ID,this.viewManagerDelegate.addFeature(o)}},{key:"showTarget",value:function(){if(null!==this.lastPoint){var e=n.getTarget(this.lastPoint);this.viewManagerDelegate.updateTarget(this.typeString,this.setString,e,this.currentParameters)}}},{key:"createNewComponent",value:function(e,t,n){var r=Tc.getDefinition(e),o={};for(var i in t)o[i]=t[i].value;o["position"]=[0,0];var a,l=new zc(o,vf.toMap(r.unique),vf.toMap(r.heritable)),s=Tc.generateID(),u=zh.currentDevice.generateNewName(e),c=new Pf(l,u,r.mint,s);for(var h in n)c.addFeatureID(n[h]),a=zh.currentDevice.getFeatureByID(n[h]),a.referenceID=s;return c.setInitialOffset(),c.updateComponentPosition(t["position"].value),this.viewManagerDelegate.currentDevice.addComponent(c),c}},{key:"deactivate",value:function(){}},{key:"getCreationParameters",value:function(e){if(null===this.currentParameters)throw new Error("No parameters to create a new feature");var t={position:n.getTarget([e.x,e.y])};for(var r in this.currentParameters){var o=this.currentParameters[r],i=o.name,a=o.value;t[i]=a}return t}}],[{key:"getTarget",value:function(e){if(null===zh.viewManager)throw new Error("View Manager is null");var t=zh.viewManager.snapToGrid(e);return t}},{key:"getMinTarget",value:function(e){var t=[Math.round(e[0]),Math.round(e[1])];return t}}]),n}(sv);function Mv(e){return Mv="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},Mv(e)}function jv(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function Av(e,t){for(var n=0;n0){for(var e=0;e0&&(e.pasteboard[0]=o[0]),e.saveDeviceState(),e.view.deleteSelectedFeatures()}if((t.ctrlKey||t.metaKey)&&86===r){var i=e.pasteboard;i.length>0&&(e.updateDefaultsFromFeature(i[0]),e.activateTool(i[0].getType()))}if(90===t.keyCode&&(t.metaKey||t.ctrlKey)&&(console.log("Undo executed"),e.undo()),37===r&&(n=t.shiftKey?10:t.ctrlKey?.1:1,e.view.moveCenter(new v.a.Point(1e3*n,0)),e.updateGrid(),e.view.updateAlignmentMarks()),38===r&&(n=t.shiftKey?10:t.ctrlKey?.1:1,e.view.moveCenter(new v.a.Point(0,1e3*n)),e.updateGrid(),e.view.updateAlignmentMarks()),39===r&&(n=t.shiftKey?10:t.ctrlKey?.1:1,e.view.moveCenter(new v.a.Point(-1e3*n,0)),e.updateGrid(),e.view.updateAlignmentMarks()),40===r&&(n=t.shiftKey?10:t.ctrlKey?.1:1,e.view.moveCenter(new v.a.Point(0,-1e3*n)),e.updateGrid(),e.view.updateAlignmentMarks()),(t.ctrlKey||t.metaKey)&&65===r)return e.view.selectAllActive(),!1}))}},{key:"updateViewMouseEvents",value:function(){this.viewManagerDelegate.view.setMouseDownFunction(this.constructMouseDownEvent(this.__leftMouseTool,this.__middleMouseTool,this.__leftMouseTool)),this.viewManagerDelegate.view.setMouseUpFunction(this.constructMouseUpEvent(this.__leftMouseTool,this.__middleMouseTool,this.__leftMouseTool)),this.viewManagerDelegate.view.setMouseMoveFunction(this.constructMouseMoveEvent(this.__leftMouseTool,this.__middleMouseTool,this.__leftMouseTool))}},{key:"__mouseDownCallback",value:function(e){console.log("testing down callback",e)}},{key:"__mouseUpCallback",value:function(e){console.log("testing up callback",e)}},{key:"__mouseMoveCallback",value:function(e){console.log("testing move callback",e)}},{key:"constructMouseDownEvent",value:function(e,t,n){return console.log("Tool1: ",e,"Tool2: ",t,"Tool3: ",n),e===n?(console.log("Both right and left tool is the same"),this.constructMouseEvent(e.down,t.down,n.rightdown,this.__mouseDownCallback)):this.constructMouseEvent(e.down,t.down,n.down)}},{key:"constructMouseMoveEvent",value:function(e,t,n){return this.constructMouseEvent(e.move,t.move,n.move,this.__mouseUpCallback)}},{key:"constructMouseUpEvent",value:function(e,t,n){return this.constructMouseEvent(e.up,t.up,n.up,this.__mouseMoveCallback)}},{key:"constructMouseEvent",value:function(t,n,r,o){return console.log("construct mouse event!"),function(i){var a;i.buttons?(o(i),a=e.__eventButtonsToWhich(i.buttons)):a=i.which,2===a?n(i):3===a?r(i):1!==a&&0!==a||t(i)}}}],[{key:"__eventButtonsToWhich",value:function(e){return 1===e?1:2===e?3:4===e||3===e?2:void 0}}]),e}(),Rg=n("6821"),Lg=n.n(Rg);function kg(e){return kg="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},kg(e)}function Dg(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function Tg(e,t){for(var n=0;nEg&&this.deviceData.splice(0,1),this.deviceData.push(e),this.__mostRecentMD5=t,console.log("Saved new state:",t))}},{key:"popDesign",value:function(){if(this.deviceData.length>0){var e=this.deviceData.pop();return e}return null}},{key:"__cloneObject",value:function(e){var t={};for(var n in e)null!==e[n]&&"object"===kg(e[n])?t[n]=this.__cloneObject(e[n]):t[n]=e[n];return t}}]),e}();function xg(e){return xg="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},xg(e)}function Ng(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function Ig(e,t){for(var n=0;n3&&void 0!==arguments[3]?arguments[3]:null;return Yg(this,n),t.call(this,e,r,i)}return qg(n,[{key:"createNewFeature",value:function(e){var t,r=[],o=this.getCreationParameters(new v.a.Point(0,0)),i=ad.makeFeature(this.typeString,o);this.currentFeatureID=i.ID,this.viewManagerDelegate.addFeature(i),r.push(i.ID);var a=Iv.getTarget([e.x,e.y]),l=i.getParams();l["position"]=new jc("position",a),Jg(oy(n.prototype),"createNewComponent",this).call(this,this.typeString,l,r),null===(t=zh.viewManager)||void 0===t||t.saveDeviceState()}}]),n}(Iv);function ay(e){return ay="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},ay(e)}function ly(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function sy(e,t){for(var n=0;n3&&void 0!==arguments[3]?arguments[3]:null;return ly(this,n),t.call(this,e,r,i)}return uy(n,[{key:"createNewFeature",value:function(e){var t,r=[],o=Math.floor(zh.viewManager.renderLayers.indexOf(this.viewManagerDelegate.currentLayer)/3),i=3*o,a=3*o+1,l=3*o+2,s=this.getCreationParameters(new v.a.Point(0,0)),u=ad.makeFeature(this.typeString,s);this.currentFeatureID=u.ID,this.viewManagerDelegate.addFeature(u,i);var c,h=u.getParams();r.push(u.ID),Tc.library[this.typeString+"_control"]&&(c=this.typeString+"_control",u=ad.makeFeature(c,s),this.currentFeatureID=u.ID,this.viewManagerDelegate.addFeature(u,a),r.push(u.ID)),Tc.library[this.typeString+"_integration"]&&(c=this.typeString+"_integration",u=ad.makeFeature(c,s),this.currentFeatureID=u.ID,this.viewManagerDelegate.addFeature(u,l),r.push(u.ID)),h["position"]=new jc("position",[e.x,e.y]),cy(my(n.prototype),"createNewComponent",this).call(this,this.typeString,h,r),null===(t=zh.viewManager)||void 0===t||t.saveDeviceState()}},{key:"showTarget",value:function(){if(null!==this.lastPoint){var e=Iv.getTarget(this.lastPoint);this.viewManagerDelegate.updateTarget(this.typeString,this.setString,e,this.currentParameters)}}}]),n}(Iv);function by(e){return by="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},by(e)}function _y(e,t){return Ry(e)||Sy(e,t)||Cy(e,t)||Py()}function Py(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function Cy(e,t){if(e){if("string"===typeof e)return Oy(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?Oy(e,t):void 0}}function Oy(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n3&&void 0!==arguments[3]?arguments[3]:null;Ly(this,n),i=t.call(this,e,r,a);var l=i.viewManagerDelegate.getCurrentLevelRenderLayers(),s=_y(l,3),u=s[0],c=s[1],h=s[2];if(null===u)throw new Error("Flow layer is null");if(i.flowlayer=u,null===c)throw new Error("Control layer is null");if(null===h)throw new Error("Integration layer is null");return i.controllayer=c,i.intlayer=h,i}return Dy(n,[{key:"createNewFeature",value:function(e){var t=[],r=this.getCreationParameters(e),o=ad.makeFeature(this.typeString,r);this.currentFeatureID=o.ID,null!==this.flowlayer&&this.viewManagerDelegate.addFeature(o,this.viewManagerDelegate.renderLayers.indexOf(this.flowlayer)),t.push(o.ID);var i,a=o.getParams(),l=o.getParams();Tc.library[this.typeString+"_control"]&&(o.setParams(l),this.currentFeatureID=o.ID,null!==this.controllayer&&this.viewManagerDelegate.addFeature(o,this.viewManagerDelegate.renderLayers.indexOf(this.controllayer)),t.push(o.ID)),Tc.library[this.typeString+"_integration"]&&(i=this.typeString+"_integration",o=ad.makeFeature(i,r),o.setParams(l),this.currentFeatureID=o.ID,null!==this.intlayer&&this.viewManagerDelegate.addFeature(o,this.viewManagerDelegate.renderLayers.indexOf(this.intlayer)),t.push(o.ID)),Ty(jy(n.prototype),"createNewComponent",this).call(this,this.typeString,a,t),this.viewManagerDelegate.saveDeviceState()}},{key:"showTarget",value:function(){if(null!==this.lastPoint){if(null===this.currentParameters)throw new Error("No parameters set");var e=Iv.getTarget(this.lastPoint);this.viewManagerDelegate.updateTarget(this.typeString,this.setString,e,this.currentParameters)}}}]),n}(Iv);function Vy(e){return Vy="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},Vy(e)}function By(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function Gy(e,t){for(var n=0;n3&&void 0!==arguments[3]?arguments[3]:null;return By(this,n),t.call(this,e,r,i)}return zy(n,[{key:"createNewFeature",value:function(e){var t=[],r=Math.floor(zh.viewManager.renderLayers.indexOf(this.viewManagerDelegate.currentLayer)/3),o=3*r,i=3*r,a=this.getCreationParameters(new v.a.Point(0,0)),l=ad.makeFeature(this.typeString,a);this.currentFeatureID=l.ID,this.viewManagerDelegate.addFeature(l,o),t.push(l.ID);var s=l.getParams(),u=Iv.getTarget([e.x,e.y]),c=this.typeString+"_cell",h=l.getParams();h["position"]=new jc("position",u),l=ad.makeFeature(c,a),l.setParams(h),this.currentFeatureID=l.ID,this.viewManagerDelegate.addFeature(l,i),t.push(l.ID),Uy(Zy(n.prototype),"createNewComponent",this).call(this,this.typeString,s,t),zh.viewManager.saveDeviceState()}},{key:"showTarget",value:function(){if(null!==this.lastPoint){if(null===this.currentParameters)throw new Error("No parameters set");var e=Iv.getTarget(this.lastPoint);this.viewManagerDelegate.updateTarget(this.typeString,this.setString,e,this.currentParameters)}}}]),n}(Iv);function em(e){return em="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},em(e)}function tm(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function nm(e,t){for(var n=0;n4&&void 0!==arguments[4]?arguments[4]:i.NORMALLY_OPEN;tm(this,n);var u=Tc.getTypeForMINT(r);if(!u)throw new Error("Could not find type for MINT type "+r);l=t.call(this,e,u,o,a),l.valveType=s;var c=cm(l);return l.down=function(e){console.log(e);var t=sv.getEventPosition(e);if(null!==t){var n=Iv.getTarget([t.x,t.y]),r=c.checkIfConnectionExistsAt(new v.a.Point(n[0],n[1]));r?c.insertValve(t,r):e.ctrlKey||e.metaKey?(console.warn("Forcing placement of valve, a lot of things will not work correct if done this way"),c.forceInsertValve(t)):console.log("Could not find connection at this location")}},l}return rm(n,[{key:"createNewFeature",value:function(e){var t,r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null,o=[];t=r?{position:Iv.getTarget([e.x,e.y]),rotation:r}:{position:Iv.getTarget([e.x,e.y])};var i=Math.floor(this.viewManagerDelegate.renderLayers.indexOf(this.viewManagerDelegate.currentLayer)/3),a=3*i+1,l=ad.makeFeature(this.typeString,t);this.currentFeatureID=l.ID,this.viewManagerDelegate.addFeature(l,a),o.push(l.ID);var s=l.getParams(),u=om(fm(n.prototype),"createNewComponent",this).call(this,this.typeString,s,o);return u}},{key:"createNewMultiLayerFeature",value:function(e){var t,r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null,o=[];t=r?{position:Iv.getTarget([e.x,e.y]),rotation:r}:{position:Iv.getTarget([e.x,e.y])};var i=Math.floor(zh.viewManager.renderLayers.indexOf(this.viewManagerDelegate.currentLayer)/3),a=3*i,l=3*i+1,s=ad.makeFeature(this.typeString,t);this.currentFeatureID=s.ID,this.viewManagerDelegate.addFeature(s,a),o.push(s.ID);var u=s.getParams(),c=this.typeString+"_control",h=s.getParams();s=ad.makeFeature(c,t),s.setParams(h),this.currentFeatureID=s.ID,this.viewManagerDelegate.addFeature(s,l),o.push(s.ID);var f=om(fm(n.prototype),"createNewComponent",this).call(this,this.typeString,u,o);return f}},{key:"showTarget",value:function(){if(null!==this.lastPoint){var e=Iv.getTarget(this.lastPoint);this.viewManagerDelegate.updateTarget(this.typeString,this.setString,e,this.currentParameters)}}},{key:"checkIfConnectionExistsAt",value:function(e){var t=zh.viewManager.view.hitFeature(e,!1);if(t){var n=zh.currentDevice.getConnectionForFeatureID(t.featureID);return n}return null}},{key:"insertValve",value:function(e,t){var n,r=this.__getRotation(e,t);r<0&&(r+=180),this.valveType===i.NORMALLY_OPEN?(n=this.createNewFeature(e,r),this.viewManagerDelegate.currentDevice.insertValve(n,t,this.valveType)):this.valveType===i.NORMALLY_CLOSED&&(r+=90,n=this.createNewMultiLayerFeature(e,r),this.viewManagerDelegate.currentDevice.insertValve(n,t,this.valveType)),zh.viewManager.saveDeviceState()}},{key:"forceInsertValve",value:function(e){"Valve3D"==this.typeString?this.createNewMultiLayerFeature(e):this.createNewFeature(e),zh.viewManager.saveDeviceState()}},{key:"__getRotation",value:function(e,t){var n,r,o,i,a=1e21,l=t.getPaths(),s=[];for(var u in l){n=l[u];for(var c=0;c=e.length?{done:!0}:{done:!1,value:e[r++]}},e:function(e){throw e},f:o}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var i,a=!0,l=!1;return{s:function(){n=n.call(e)},n:function(){var e=n.next();return a=e.done,e},e:function(e){l=!0,i=e},f:function(){try{a||null==n.return||n.return()}finally{if(l)throw i}}}}function ym(e,t){if(e){if("string"===typeof e)return mm(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?mm(e,t):void 0}}function mm(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n0&&(r=a.wayPoints[a.wayPoints.length-1]),null===r)throw new Error("Last waypoint is null");var o=a.getNextOrthogonalPoint(r,n);a.lastPoint=[o[0],o[1]]}else a.lastPoint=[n[0],n[1]];a.dragging&&a.updateQueue.run(),a.showQueue.run()}},i}return _m(n,[{key:"state",get:function(){return this.__STATE}},{key:"showTarget",value:function(e){var t,n=Iv.getTarget([e.x,e.y]);null===(t=zh.viewManager)||void 0===t||t.updateTarget(this.typeString,this.setString,n)}},{key:"initChannel",value:function(){if(null===this.lastPoint)throw new Error("No last point to init channel");var e=this.__isPointOnComponent(new v.a.Point(this.lastPoint)),t=this.__isPointOnConnection(new v.a.Point(this.lastPoint));if(this.startPoint=Iv.getTarget(this.lastPoint),this.lastPoint=this.startPoint,e){var n=this.__getClosestComponentPort(e,this.startPoint);if(null!==n){var r=b.calculateAbsolutePosition(n,e);this.source=new Rf(e,n.label),this.startPoint=r,this.lastPoint=this.startPoint,this.wayPoints.push(r)}else this.source=new Rf(e,""),this.wayPoints.push(this.startPoint)}else t?(console.warn("Implement method to make the connection connections"),this.__currentConnectionObject=t,this.wayPoints.push(this.startPoint)):this.wayPoints.push(this.startPoint)}},{key:"updateChannel",value:function(){if(this.lastPoint&&this.startPoint)if(this.currentChannelID){var e,t=Iv.getTarget(this.lastPoint),n=null===(e=this.viewManagerDelegate.currentLayer)||void 0===e?void 0:e.getFeature(this.currentChannelID);null===n||void 0===n||n.updateParameter("end",t),null===n||void 0===n||n.updateParameter("wayPoints",this.wayPoints),null===n||void 0===n||n.updateParameter("segments",this.generateSegments())}else{var r;if(null===this.startPoint)throw new Error("No start point to update the channel");var o=this.createChannel(new v.a.Point(this.startPoint),new v.a.Point(this.startPoint));this.currentChannelID=o.ID,null===(r=zh.viewManager)||void 0===r||r.addFeature(o)}}},{key:"finishChannel",value:function(){var e;if(this.currentChannelID){var t;this.wayPoints.push(this.lastPoint);var n=this.viewManagerDelegate.currentLayer.getFeature(this.currentChannelID);null===n||void 0===n||n.updateParameter("end",this.lastPoint),null===n||void 0===n||n.updateParameter("segments",this.generateSegments());var r=null===n||void 0===n?void 0:n.getParams(),o={};for(var i in r)o[i]=r[i].value;var a=Tc.getDefinition("Connection"),l=new zc(o,vf.toMap(a.unique),vf.toMap(a.heritable));if(null===this.__currentConnectionObject||void 0===this.__currentConnectionObject){var s;if(null===this.viewManagerDelegate.currentLayer.physicalLayer)throw new Error("Error: Attempting to add connection on non-physical layer");var u=new Gf("Connection",l,zh.currentDevice.generateNewName("CHANNEL"),"CHANNEL",this.viewManagerDelegate.currentLayer.physicalLayer);u.routed=!0,u.addFeatureID(n.ID),u.addWayPoints(this.wayPoints),n.referenceID=u.id,this.__addConnectionTargets(u),null===(s=zh.currentDevice)||void 0===s||s.addConnection(u)}else this.__currentConnectionObject.addFeatureID(n.ID),n.referenceID=this.__currentConnectionObject.id,this.__currentConnectionObject.addWayPoints(this.wayPoints),n.referenceID=this.__currentConnectionObject.id,this.__addConnectionTargets(this.__currentConnectionObject);this.currentChannelID=null,this.wayPoints=[],this.source=null,this.sinks=[],this.__currentConnectionObject=null,null===(t=zh.viewManager)||void 0===t||t.saveDeviceState()}else console.error("Something is wrong here, unable to finish the connection");null===(e=zh.viewManager)||void 0===e||e.saveDeviceState()}},{key:"cleanup",value:function(){switch(console.log("Running Cleanup for the Connection Tool"),this.__STATE){case dm.PLACE_FIRST_POINT:console.log("Doing nothing");break;case dm.PLACE_WAYPOINT:console.warn("Paused connection placement midway");break;case dm.TARGET_PLACED_START_AGAIN:this.__STATE=dm.PLACE_FIRST_POINT,this.dragging=!1;break}}},{key:"addWayPoint",value:function(e,t){var n,r=sv.getEventPosition(e),o=this.__isPointOnComponent(r),i=this.__isPointOnConnection(r);if(null!==r){var a=Iv.getTarget([r.x,r.y]);if(t&&a){var l=this.startPoint;if(this.wayPoints.length>0&&(l=this.wayPoints[this.wayPoints.length-1]),null===l)throw new Error("Target is null");a=this.getNextOrthogonalPoint(l,a)}if(2==a.length&&this.wayPoints.push(a),o){if(null===this.startPoint)throw new Error("No start point to update the channel");var s=this.__getClosestComponentPort(o,this.startPoint,a);if(null!==s){var u=b.calculateAbsolutePosition(s,o);n=new Rf(o,s.label),this.wayPoints.pop(),this.lastPoint=u}else n=new Rf(o,""),this.lastPoint=this.wayPoints.pop();null===this.source?this.source=n:this.sinks.push(n),this.__STATE=dm.TARGET_PLACED_START_AGAIN,this.dragging=!1,this.finishChannel()}else i&&(console.log("There is connection at the waypoint path"),null===this.__currentConnectionObject?this.__currentConnectionObject=i:this.__currentConnectionObject.mergeConnection(i),this.__STATE=dm.TARGET_PLACED_START_AGAIN,this.dragging=!1,this.lastPoint=this.wayPoints.pop(),this.finishChannel())}}},{key:"__isPointOnConnection",value:function(e){var t,n=null===(t=zh.viewManager)||void 0===t?void 0:t.hitFeature(e);if(!1!==n&&null!==n&&void 0!==n){var r,o,i,a=null===(r=zh.viewManager)||void 0===r?void 0:r.getFeatureByID(n.featureID);return null!==a.referenceID&&(o=null===(i=zh.currentDevice)||void 0===i?void 0:i.getConnectionByID(a.referenceID),o)}return!1}},{key:"__isPointOnComponent",value:function(e){var t,n=null===(t=zh.viewManager)||void 0===t?void 0:t.hitFeature(e);if(!1!==n&&null!==n&&void 0!==n){var r,o,i,a=null===(r=zh.viewManager)||void 0===r?void 0:r.getFeatureByID(n.featureID);return null!==a.referenceID&&(o=null===(i=zh.currentDevice)||void 0===i?void 0:i.getComponentByID(a.referenceID),(null!==o||void 0!==o)&&o)}return!1}},{key:"createChannel",value:function(e,t){return ad.makeFeature(this.typeString,{start:e,end:t,wayPoints:this.wayPoints,segments:this.generateSegments()})}},{key:"getNextOrthogonalPoint",value:function(e,t){if(t[0]===e[0]||t[1]===e[1])return t;var n=[t[0],t[1]],r=Math.abs(t[0]-e[0]),o=Math.abs(t[1]-e[1]);return r2&&void 0!==arguments[2]?arguments[2]:null,l=null,s=null===(n=zh.currentGrid)||void 0===n?void 0:n.getSpacing();console.log("Grid Size: ",s),this.viewManagerDelegate.currentLayer.type===o.CONTROL?l="CONTROL":this.viewManagerDelegate.currentLayer.type===o.FLOW?l="FLOW":this.viewManagerDelegate.currentLayer.type===o.INTEGRATION&&(l="INTEGRATION"),console.log("This layer: ",l);var u=e.ports;if(null===l&&console.warn("Could not find the current layer type, searching through all the component ports without filtering"),null!==a){var c,h=gm(u.keys());try{for(h.s();!(c=h.n()).done;){var f=c.value,d=u.get(f);if(d.layer===l){var p=b.calculateAbsolutePosition(d,e),v=Math.abs(a[0]-p[0])+Math.abs(a[1]-p[1]);if(v<=3*s)return d}}}catch(C){h.e(C)}finally{h.f()}}i=1e15,r=null;var g,y=gm(u.keys());try{for(y.s();!(g=y.n()).done;){var m=g.value,w=u.get(m);if(w.layer===l){var _=b.calculateAbsolutePosition(w,e),P=Math.abs(t[0]-_[0])+Math.abs(t[1]-_[1]);P2&&void 0!==arguments[2]?arguments[2]:null;return ad.makeFeature(n,{start:e,end:t})}},{key:"getTarget",value:function(e){if(null===zh.viewManager)throw new Error("ViewManager not initialized");var t=zh.viewManager.snapToGrid(e);return t}}]),n}(sv);function fw(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function dw(e,t){for(var n=0;n0&&void 0!==arguments[0]?arguments[0]:"New Layer",n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null,r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:o.FLOW;gw(this,e),this.__type=r,this.features={},this.featureCount=0,this.name=t,this.params=n?n.params:new zc([],Yc.getUniqueParameters(),new Map),this._physicalLayer=n,r==o.FLOW?this.color="indigo":r==o.CONTROL?this.color="red":r==o.INTEGRATION?this.color="green":this.color=void 0,this.__id=Tc.generateID()}return mw(e,[{key:"physicalLayer",get:function(){return this._physicalLayer},set:function(e){this._physicalLayer=e}},{key:"type",get:function(){return this.__type}},{key:"id",get:function(){return this.__id}},{key:"addFeature",value:function(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];this.__ensureIsAFeature(e),this.features[e.ID]=e,this.featureCount+=1,null!==this.physicalLayer&&1==t?(this.physicalLayer.addFeature(e),e.layer=this.physicalLayer):e.layer=this.physicalLayer,e.setManufacturingInfoLayer()}},{key:"__ensureIsAFeature",value:function(e){if(!(e instanceof Bd)&&!(e instanceof Qd))throw new Error("Provided value"+e+" is not a Feature! Did you pass an ID by mistake?")}},{key:"__ensureFeatureExists",value:function(e){if(!this.containsFeature(e))throw new Error("Layer does not contain the specified feature!")}},{key:"__ensureFeatureIDExists",value:function(e){if(!this.containsFeatureID(e))throw new Error("Layer does not contain a feature with the specified ID!")}},{key:"getFeature",value:function(e){return this.__ensureFeatureIDExists(e),this.features[e]}},{key:"removeFeature",value:function(e){this.removeFeatureByID(e.ID)}},{key:"removeFeatureByID",value:function(e){this.__ensureFeatureIDExists(e),this.featureCount-=1;var t=this._physicalLayer;null!==t&&t.containsFeatureID(e)&&t.removeFeatureByID(e),delete this.features[e]}},{key:"containsFeature",value:function(e){return this.__ensureIsAFeature(e),this.features.hasOwnProperty(e.ID)}},{key:"containsFeatureID",value:function(e){return this.features.hasOwnProperty(e)}},{key:"getAllFeaturesFromLayer",value:function(){return this.features}},{key:"__featuresToJSON",value:function(){var e={};for(var t in this.features)e[t]=this.features[t].toJSON();return e}},{key:"__featuresInterchangeV1",value:function(){var e=[];for(var t in this.features)e.push(this.features[t].toInterchangeV1());return e}},{key:"__loadFeaturesFromJSON",value:function(e){for(var t in e)this.addFeature(Bd.fromJSON(e[t]))}},{key:"__loadFeaturesFromInterchangeV1",value:function(e){for(var t in e)this.addFeature(Bd.fromInterchangeV1(e[t]))}},{key:"__layerToInterchangeV1",value:function(){return null!==this._physicalLayer?this._physicalLayer.toInterchangeV1():null}},{key:"toInterchangeV1",value:function(){var e;e=this.physicalLayer?this.physicalLayer.id:null;var t={id:this.__id,name:this.name,modellayer:e,type:this.__type,features:this.__featuresInterchangeV1(),color:this.color};return t}}],[{key:"fromJSON",value:function(t){if(!Object.prototype.hasOwnProperty.call(t,"features"))throw new Error("JSON layer has no features!");var n=new e(t.name,null,t.type);return n.__loadFeaturesFromJSON(t.features),t.color&&(n.color=t.color),n}},{key:"fromInterchangeV1",value:function(t){var n;if(Object.prototype.hasOwnProperty.call(t,"type"))if("FLOW"===t.type)n=o.FLOW;else if("CONTROL"===t.type)n=o.CONTROL;else{if("INTEGRATION"!==t.type)throw new Error("Unknown layer type: "+t.type);n=o.INTEGRATION}var r=new e(t.name,null,n);return r.__loadFeaturesFromInterchangeV1(t.features),t.color&&(r.color=t.color),r}}]),e}();function bw(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function _w(e,t){for(var n=0;n=e.length?{done:!0}:{done:!1,value:e[r++]}},e:function(e){throw e},f:o}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var i,a=!0,l=!1;return{s:function(){n=n.call(e)},n:function(){var e=n.next();return a=e.done,e},e:function(e){l=!0,i=e},f:function(){try{a||null==n.return||n.return()}finally{if(l)throw i}}}}function Rw(e,t){return Fw(e)||Tw(e,t)||kw(e,t)||Lw()}function Lw(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function kw(e,t){if(e){if("string"===typeof e)return Dw(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?Dw(e,t):void 0}}function Dw(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n1&&void 0!==arguments[1])||arguments[1];r.ensureFeatureExists(e)&&(r.view.updateFeature(e),r.refresh(t))})),this.__grid.setColor(Rh),this.threeD=!1,this.renderer=zh.threeRenderer,this.currentLayer=this.renderLayers[0],this.activeRenderLayerIndex=0}return xw(e,[{key:"currentDevice",get:function(){return this.__currentDevice}},{key:"initiateCopy",value:function(){var e=this.view.getSelectedFeatures();e.length>0&&(this.pasteboard[0]=e[0])}},{key:"setupToolBars",value:function(){this.resetToDefaultTool()}},{key:"setNameMap",value:function(){for(var e=new Map,t=0;t1&&void 0!==arguments[1])||arguments[1];this.view.addDevice(e),this.__addAllDeviceLayers(e,!1),this.refresh(t)}},{key:"__addAllDeviceLayers",value:function(e){for(var t=0;t1&&void 0!==arguments[1])||arguments[1];this.view.removeDevice(),this.__removeAllDeviceLayers(e,!1),this.refresh(t)}},{key:"updateDevice",value:function(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];this.view.updateDevice(e),this.refresh(t)}},{key:"addFeature",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.activeRenderLayerIndex,n=!(arguments.length>2&&void 0!==arguments[2])||arguments[2],r=!(arguments.length>3&&void 0!==arguments[3])||arguments[3];this.renderLayers[t].addFeature(e,n),this.ensureFeatureExists(e)&&(this.view.addFeature(e),this.refresh(r))}},{key:"getNonphysElementFromFeatureID",value:function(e){for(var t in this.nonphysElements){var n=this.nonphysElements[t];for(var r in n.featureIDs)if(n.featureIDs[r]===e)return n}return null}},{key:"updateFeature",value:function(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];this.ensureFeatureExists(e)&&(this.view.updateFeature(e),this.refresh(t))}},{key:"removeFeature",value:function(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],n=this.getRenderLayerByID(e.ID);this.ensureFeatureExists(e)&&(this.view.removeFeature(e),this.refresh(t)),n.removeFeatureByID(e.ID)}},{key:"removeFeatureByID",value:function(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],n=this.getRenderLayerByID(e),r=n.getFeature(e);this.ensureFeatureExists(r)&&(this.view.removeFeature(r),this.refresh(t)),n.removeFeatureByID(e)}},{key:"addLayer",value:function(e,t){var n=!(arguments.length>2&&void 0!==arguments[2])||arguments[2];this.__isLayerInCurrentDevice(e)&&(this.view.addLayer(e,t),this.__addAllLayerFeatures(e,t,!1),this.refresh(n))}},{key:"createNewLayerBlock",value:function(){var e,t,n,r,i,a,l;if(null===this.__currentDevice)throw new Error("No device set on ViewManager");var s=this.__currentDevice.layers.length;0!=s&&(s/=3);var u=[];u[0]=new Yc({z_offset:0,flip:!1},null===(e=this.currentDevice)||void 0===e?void 0:e.generateNewName("LayerFlow"),o.FLOW,s.toString()),u[1]=new Yc({z_offset:0,flip:!1},null===(t=this.currentDevice)||void 0===t?void 0:t.generateNewName("LayerControl"),o.CONTROL,s.toString()),u[2]=new Yc({z_offset:0,flip:!1},null===(n=this.currentDevice)||void 0===n?void 0:n.generateNewName("LayerIntegration"),o.INTEGRATION,s.toString()),this.__currentDevice.createNewLayerBlock(u);var c,h=[],f=null===(r=zh.currentDevice)||void 0===r?void 0:r.layers[0].features;for(var d in f)c=f[d],"EDGE"===c.fabType&&h.push(c);for(var p in u)for(var v in h)u[p].addFeature(h[v]);for(var g in u){var y=u[g],m=this.view.paperLayers.length;this.addLayer(y,m,!0)}for(var w in this.renderLayers[this.renderLayers.length]=new ww(null===(i=this.currentDevice)||void 0===i?void 0:i.generateNewName("RenderLayerFlow"),u[0],o.FLOW),this.renderLayers[this.renderLayers.length]=new ww(null===(a=this.currentDevice)||void 0===a?void 0:a.generateNewName("RenderLayerControl"),u[1],o.CONTROL),this.renderLayers[this.renderLayers.length]=new ww(null===(l=this.currentDevice)||void 0===l?void 0:l.generateNewName("RenderLayerIntegration"),u[2],o.INTEGRATION),h)this.renderLayers[this.renderLayers.length-3].addFeature(h[w]),this.renderLayers[this.renderLayers.length-2].addFeature(h[w]),this.renderLayers[this.renderLayers.length-1].addFeature(h[w]);console.log("Active Layer",this.activeRenderLayerIndex),this.setActiveRenderLayer(this.renderLayers.length-3)}},{key:"deleteLayerBlock",value:function(e){var t,n,r;null===(t=zh.currentDevice)||void 0===t||t.deleteLayer(3*e),null===(n=zh.currentDevice)||void 0===n||n.deleteLayer(3*e),null===(r=zh.currentDevice)||void 0===r||r.deleteLayer(3*e),this.renderLayers.splice(3*e,3),this.activeRenderLayerIndex>3*e+2?this.setActiveRenderLayer(this.activeRenderLayerIndex-3):this.activeRenderLayerIndex<3*e?console.log("No change"):0==e?0==this.renderLayers.length?this.setActiveRenderLayer(e):this.setActiveRenderLayer(0):this.setActiveRenderLayer(3*(e-1)),this.view.removeLayer(3*e),this.view.removeLayer(3*e),this.view.removeLayer(3*e),this.updateActiveLayer(),this.refresh()}},{key:"setActiveRenderLayer",value:function(e){this.activeRenderLayerIndex=e,this.currentLayer=this.renderLayers[e],this.updateActiveLayer()}},{key:"removeLayer",value:function(e,t){var n=!(arguments.length>2&&void 0!==arguments[2])||arguments[2];this.__isLayerInCurrentDevice(e)&&(this.view.removeLayer(t),this.__removeAllLayerFeatures(e),this.refresh(n))}},{key:"layersToSVGStrings",value:function(){return this.view.layersToSVGStrings()}},{key:"__addAllLayerFeatures",value:function(e,t){var n=!(arguments.length>2&&void 0!==arguments[2])||arguments[2];for(var r in e.features){var o=e.features[r];this.addFeature(o,t,!1),this.refresh(n)}}},{key:"__updateAllLayerFeatures",value:function(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];for(var n in e.features){var r=e.features[n];this.updateFeature(r,!1),this.refresh(t)}}},{key:"__removeAllLayerFeatures",value:function(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];for(var n in e.features){var r=e.features[n];this.removeFeature(r,!1),this.refresh(t)}}},{key:"updateLayer",value:function(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];this.__isLayerInCurrentDevice(e)&&this.refresh(t)}},{key:"updateActiveLayer",value:function(){var e=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];null!==this.activeRenderLayerIndex?(this.view.setActiveLayer(this.activeRenderLayerIndex),this.refresh(e)):console.warn("Attempting update active layer in view manager with no active layer value")}},{key:"removeGrid",value:function(){var e=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];this.__hasCurrentGrid()&&(this.view.removeGrid(),this.refresh(e))}},{key:"updateGrid",value:function(){var e=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];this.__hasCurrentGrid()&&(this.view.updateGrid(zh.currentGrid),this.refresh(e),Wd.get().emit(Wd.UPDATE_GRID_SIZE))}},{key:"updateAlignmentMarks",value:function(){this.view.updateAlignmentMarks()}},{key:"clear",value:function(){this.view.clear()}},{key:"setZoom",value:function(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];e>this.maxZoom?e=this.maxZoom:e3&&void 0!==arguments[3]?arguments[3]:null,o=!(arguments.length>4&&void 0!==arguments[4])||arguments[4];this.view.addTarget(e,t,n,r),this.view.updateAlignmentMarks(),this.view.updateRatsNest(),this.refresh(o)}},{key:"__updateViewTarget",value:function(){var e=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];this.view.updateTarget(),this.updateAlignmentMarks(),this.view.updateRatsNest(),this.view.updateComponentPortsRender(),this.refresh(e)}},{key:"adjustZoom",value:function(e,t){var n=!(arguments.length>2&&void 0!==arguments[2])||arguments[2],r=this.view.getZoom()>=this.maxZoom&&e<0,o=this.view.getZoom()<=this.minZoom&&e>0;o||r||(this.view.adjustZoom(e,new v.a.Point(t)),this.updateGrid(!1),this.view.updateRatsNest(),this.view.updateComponentPortsRender(),this.updateDevice(zh.currentDevice,!1),this.__updateViewTarget(!1)),this.refresh(n)}},{key:"setCenter",value:function(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];this.view.setCenter(e),this.updateGrid(!1),this.updateDevice(zh.currentDevice,!1),this.refresh(t)}},{key:"moveCenter",value:function(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];this.view.moveCenter(e),this.updateGrid(!1),this.view.updateRatsNest(),this.view.updateComponentPortsRender(),this.updateDevice(zh.currentDevice,!1),this.refresh(t)}},{key:"saveToStorage",value:function(){if(zh.viewManager)try{localStorage.setItem("currentDevice",JSON.stringify(zh.viewManager.generateExportJSON()))}catch(e){}}},{key:"refresh",value:function(){var e;this.updateQueue.run();null===(e=zh.currentGrid)||void 0===e||e.getSpacing()}},{key:"getEventPosition",value:function(e){return this.view.getProjectPosition(e.clientX,e.clientY)}},{key:"__hasCurrentGrid",value:function(){return!!zh.currentGrid}},{key:"__isLayerInCurrentDevice",value:function(e){return!(!zh.currentDevice||e.device!==zh.currentDevice)}},{key:"isFeatureInCurrentDevice",value:function(e){return!(!zh.currentDevice||!this.__isLayerInCurrentDevice(e.layer))}},{key:"ensureFeatureExists",value:function(e){for(var t=0;t0){for(var t=0;t0){var o=this.getFeaturesOfType(e,r);for(var i in o.length>0&&this.adjustAllFeatureParams(t,n,o),this.view.selectedComponents)this.view.selectedComponents[i].updateParameter(t,n);for(var a in this.view.selectedConnections)this.view.selectedConnections[a].updateParameter(t,n)}else this.updateDefault(e,t,n)}},{key:"updateDefault",value:function(e,t,n){var r=Tc.getDefaultsForType(e);r[t]=n}},{key:"updateDefaultsFromFeature",value:function(e){var t=e.getHeritableParams();for(var n in t)this.updateDefault(e.getType(),n,e.getValue(n))}},{key:"revertFieldToDefault",value:function(e,t){t.updateParameter(e,Tc.getDefaultsForType(t.getType())[e])}},{key:"revertFeatureToDefaults",value:function(e){var t=e.getHeritableParams();for(var n in t)this.revertFieldToDefault(n,e)}},{key:"revertFeaturesToDefaults",value:function(e){var t,n=Sw(e);try{for(n.s();!(t=n.n()).done;){var r=t.value;this.revertFeatureToDefaults(r)}}catch(o){n.e(o)}finally{n.f()}}},{key:"hitFeature",value:function(e){return this.view.hitFeature(e)}},{key:"getFeatureByID",value:function(e){var t=this.getRenderLayerByID(e);return t.getFeature(e)}},{key:"getRenderLayerByID",value:function(e){for(var t=0;t1&&void 0!==arguments[1]?arguments[1]:"SelectTool";if(null===this.tools[e])throw new Error("Could not find tool with the matching string");this.view.clearSelectedItems(),this.mouseAndKeyboardHandler.leftMouseTool=this.tools[e],this.mouseAndKeyboardHandler.rightMouseTool=this.tools[t],this.mouseAndKeyboardHandler.updateViewMouseEvents()}},{key:"switchTo2D",value:function(){if(null===zh.currentDevice)throw new Error("No device selected");if(this.threeD){this.threeD=!1;var e=this.renderer.getCameraCenterInMicrometers(),t=this.renderer.getZoom(),n=e[0];n<0?n=0:n>zh.currentDevice.getXSpan()&&(n=zh.currentDevice.getXSpan());var r=v.a.view.center.y-e[1];r<0?r=0:r>zh.currentDevice.getYSpan()&&(r=zh.currentDevice.getYSpan()),zh.viewManager.setCenter(new v.a.Point(n,r)),zh.viewManager.setZoom(t)}}},{key:"switchTo3D",value:function(){if(!this.threeD){this.threeD=!0,this.renderer.loadJSON(zh.currentDevice.toJSON());var e=this.view.getViewCenterInMillimeters(),t=zh.currentDevice.params.getValue("height")/1e3,n=this.view.getDeviceHeightInPixels();this.renderer.setupCamera(e[0],e[1],t,n,v.a.view.zoom),this.renderer.showMockup(),lg(this.__renderBlock,"hidden-block"),sg(this.__canvasBlock,"hidden-block"),sg(this.__renderBlock,"shown-block"),lg(this.__canvasBlock,"shown-block")}}},{key:"setupDragAndDropLoad",value:function(e){ug(e,(function(e){var t=e[0],n=new FileReader;n.onloadend=function(e){var t,n=this.result,r=JSON.parse(n);null===(t=zh.viewManager)||void 0===t||t.loadDeviceFromJSON(r)};try{n.readAsText(t)}catch(r){console.log("unable to load JSON: "+t)}}))}},{key:"killParamsWindow",value:function(){var e,t=document.getElementById("parameter_menu");t&&(null===(e=t.parentElement)||void 0===e||e.removeChild(t))}},{key:"saveDeviceState",value:function(){var e;console.log("Saving to stack");var t=JSON.stringify(null===(e=zh.currentDevice)||void 0===e?void 0:e.toInterchangeV1([]));this.undoStack.pushDesign(t)}},{key:"undo",value:function(){var e=this.undoStack.popDesign();if(console.log(e),e){var t=JSON.parse(e);this.loadDeviceFromJSON(t)}}},{key:"resetToDefaultTool",value:function(){this.cleanupActiveTools(),this.activateTool("MouseSelectTool")}},{key:"cleanupActiveTools",value:function(){this.mouseAndKeyboardHandler.leftMouseTool&&this.mouseAndKeyboardHandler.leftMouseTool.cleanup(),this.mouseAndKeyboardHandler.rightMouseTool&&this.mouseAndKeyboardHandler.rightMouseTool.cleanup()}},{key:"updatesConnectionRender",value:function(e){var t;e.regenerateSegments();var n=null===(t=zh.currentDevice)||void 0===t?void 0:t.getValvesForConnection(e);if(void 0===n||null===n)throw new Error("Valves are undefined or null when updating connection: "+e.id);for(var r in n){var o,i=n[r],a=null===(o=zh.currentDevice)||void 0===o?void 0:o.getValveType(i);if(a){var l=i.getBoundingRectangle();e.insertFeatureGap(l)}}}},{key:"showUIMessage",value:function(e){this.messageBox.MaterialSnackbar.showSnackbar({message:e})}},{key:"setupTools",value:function(){this.tools.MouseSelectTool=new ag(this,this.view),this.tools.InsertTextTool=new Xv(this),this.tools.Connection=new Dm(this,"Connection","Basic"),this.tools.MoveTool=new Kg(this),this.tools.GenerateArrayTool=new Bm(this)}},{key:"addCustomComponentTool",value:function(e){var t,n=null===(t=this.customComponentManager)||void 0===t?void 0:t.getCustomComponent(e);this.tools[e]=new Qm(this,n,"Custom")}},{key:"__initializeRatsNest",value:function(){var e,t=null===(e=this.currentDevice)||void 0===e?void 0:e.components,n=1e4,r=1e4;for(var o in t){var i=t[parseInt(o)],a=i.getPosition();0===a[0]&&0===a[1]?i.placed||this.__generateDefaultPlacementForComponent(i,n*(parseInt(o)+1),r*(Math.floor(parseInt(o)/5)+1)):i.placed||this.__generateDefaultPlacementForComponent(i,a[0],a[1])}this.view.updateRatsNest(),this.view.updateComponentPortsRender()}},{key:"__generateDefaultPlacementForComponent",value:function(e,t,n){var r=e.params.toJSON();r.position=[t,n];for(var o=Tc.getRenderTypeKeysForMINT(e.mint),i=0;i<(null===o||void 0===o?void 0:o.length);i++){var a=o[i],l=ad.makeFeature(a,r);e.addFeatureID(l.ID),this.currentLayer.addFeature(l)}e.updateComponentPosition([t,n])}},{key:"generateExportJSON",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],t=Nf.toInterchangeV1_2(this,e);return t}},{key:"loadCustomComponents",value:function(e){var t;Object.prototype.hasOwnProperty.call(e,"customComponents")&&(null===(t=this.customComponentManager)||void 0===t||t.loadFromJSON(e.customComponents))}},{key:"activateDAFDPlugin",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null;this.loadDeviceFromJSON(JSON.parse(r.dafdtemplate)),null===e&&(e={orificeSize:750,orificeLength:200,oilInputWidth:800,waterInputWidth:900,outputWidth:900,outputLength:500,height:100}),vw.fixLayout(e)}},{key:"createValveMapFromSelection",value:function(){var e,t=this.tools.MouseSelectTool.currentSelection,n=[],r=null,o=Sw(t);try{for(o.s();!(e=o.n()).done;){var a=e.value,l=this.currentDevice.getComponentForFeatureID(a.featureID);if(null!==l){console.log("Component Type:",l.mint);var s=l.getType();"VALVE3D"!==s&&"VALVE"!==s||n.push(l)}r=this.currentDevice.getConnectionForFeatureID(a.featureID)}}catch(d){o.e(d)}finally{o.f()}for(var u=0,c=n;u0){var n,r="",o=Sw(e);try{for(o.s();!(n=o.n()).done;){var i=n.value;r+=i.toText()+"\n\n"}}catch(l){o.e(l)}finally{o.f()}var a=new Blob([r],{type:"text/plain"});Object(ov["saveAs"])(a,this.currentDevice.name+"_errors.txt")}}},{key:"createNewDevice",value:function(e){var t=new ad({"x-span":135e3,"y-span":85e3},e);console.log("Created new device: ",t.getXSpan(),t.getYSpan()),this.clear(),this.__currentDevice=t,this.activeRenderLayerIndex=0,this.createNewLayerBlock(),Ow(this.__currentDevice),this.setNameMap(),zh.currentDevice=t,this.activeRenderLayerIndex=0,this.addDevice(t),this.__initializeRatsNest(),this.view.initializeView(),this.updateGrid(),this.updateDevice(zh.currentDevice),this.refresh(!0),this.currentLayer=this.renderLayers[0],this.updateActiveLayer()}},{key:"getCurrentLevelRenderLayers",value:function(){var e=this.activeRenderLayerIndex%3,t=3*e+0,n=3*e+1,r=3*e+2;return[this.renderLayers[t],this.renderLayers[n],this.renderLayers[r]]}}]),e}(),Iw='{"name":"My Device","params":{"width":75800,"length":51000},"layers":[{"name":"flow","color":"indigo","params":{"z_offset":0,"flip":false},"features":{"97f1fd20-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f1fd20-3ea6-11e5-8298-1b576ed4eb08","name":"New Port","type":"Port","params":{"position":[30000,40000],"radius1":700,"radius2":700,"height":100}},"97f1fd21-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f1fd21-3ea6-11e5-8298-1b576ed4eb08","name":"New Port","type":"Port","params":{"position":[40000,40000],"radius1":700,"radius2":700,"height":100}},"97f22430-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f22430-3ea6-11e5-8298-1b576ed4eb08","name":"New Port","type":"Port","params":{"position":[50000,40000],"radius1":700,"radius2":700,"height":100}},"97f22431-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f22431-3ea6-11e5-8298-1b576ed4eb08","name":"New Port","type":"Port","params":{"position":[20000,40000],"radius1":700,"radius2":700,"height":100}},"97f22432-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f22432-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[20000,40000],"end":[20000,35000],"width":400,"height":100}},"97f22433-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f22433-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[20000,38000],"end":[17000,38000],"width":400,"height":100}},"97f22434-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f22434-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[17000,38000],"end":[17000,35000],"width":400,"height":100}},"97f22435-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f22435-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[20000,35000],"end":[20000,20000],"width":400,"height":100}},"97f22436-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f22436-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[20000,20000],"end":[10000,10000],"width":400,"height":100}},"97f22437-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f22437-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[17000,35000],"end":[15000,30000],"width":400,"height":100}},"97f22438-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f22438-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[15000,30000],"end":[10000,30000],"width":400,"height":100}},"97f22439-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f22439-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[10000,30000],"end":[10000,28000],"width":400,"height":100}},"97f2243a-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f2243a-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[10000,28000],"end":[15000,28000],"width":400,"height":100}},"97f2243b-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f2243b-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[15000,28000],"end":[15000,25000],"width":400,"height":100}},"97f2243c-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f2243c-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[15000,25000],"end":[8000,25000],"width":400,"height":100}},"97f2243d-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f2243d-3ea6-11e5-8298-1b576ed4eb08","name":"New Port","type":"Port","params":{"position":[8000,25000],"radius1":700,"radius2":700,"height":100}},"97f2243e-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f2243e-3ea6-11e5-8298-1b576ed4eb08","name":"New Port","type":"Port","params":{"position":[10000,10000],"radius1":700,"radius2":700,"height":100}},"97f2243f-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f2243f-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[30000,40000],"end":[30000,20000],"width":400,"height":100}},"97f22440-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f22440-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[30000,20000],"end":[20000,10000],"width":400,"height":100}},"97f22441-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f22441-3ea6-11e5-8298-1b576ed4eb08","name":"New Port","type":"Port","params":{"position":[20000,10000],"radius1":700,"radius2":700,"height":100}},"97f22442-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f22442-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[30000,38000],"end":[27000,38000],"width":400,"height":100}},"97f22443-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f22443-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[27000,38000],"end":[27000,30000],"width":400,"height":100}},"97f22444-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f22444-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[27000,30000],"end":[22000,30000],"width":400,"height":100}},"97f22445-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f22445-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[22000,30000],"end":[22000,28000],"width":400,"height":100}},"97f22446-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f22446-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[22000,28000],"end":[27000,28000],"width":400,"height":100}},"97f24b40-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f24b40-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[27000,28000],"end":[27000,26000],"width":400,"height":100}},"97f24b41-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f24b41-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[27000,26000],"end":[22000,26000],"width":400,"height":100}},"97f24b42-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f24b42-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[22000,26000],"end":[22000,24000],"width":400,"height":100}},"97f24b43-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f24b43-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[22000,24000],"end":[27000,24000],"width":400,"height":100}},"97f24b44-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f24b44-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[27000,24000],"end":[27000,22000],"width":400,"height":100}},"97f24b45-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f24b45-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[27000,22000],"end":[22000,22000],"width":400,"height":100}},"97f24b46-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f24b46-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[22000,22000],"end":[22000,20000],"width":400,"height":100}},"97f24b47-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f24b47-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[22000,20000],"end":[25000,20000],"width":400,"height":100}},"97f24b48-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f24b48-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[25000,20000],"end":[25000,17000],"width":400,"height":100}},"97f24b49-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f24b49-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[25000,17000],"end":[21000,17000],"width":400,"height":100}},"97f24b4a-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f24b4a-3ea6-11e5-8298-1b576ed4eb08","name":"New Port","type":"Port","params":{"position":[21000,17000],"radius1":700,"radius2":700,"height":100}},"97f24b4b-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f24b4b-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[40000,40000],"end":[40000,20000],"width":400,"height":100}},"97f24b4c-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f24b4c-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[40000,20000],"end":[50000,10000],"width":400,"height":100}},"97f24b4d-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f24b4d-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[40000,38000],"end":[43000,38000],"width":400,"height":100}},"97f24b4e-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f24b4e-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[43000,38000],"end":[43000,30000],"width":400,"height":100}},"97f24b4f-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f24b4f-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[43000,30000],"end":[48000,30000],"width":400,"height":100}},"97f24b50-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f24b50-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[48000,30000],"end":[48000,28000],"width":400,"height":100}},"97f24b51-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f24b51-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[48000,28000],"end":[43000,28000],"width":400,"height":100}},"97f24b52-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f24b52-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[43000,28000],"end":[43000,26000],"width":400,"height":100}},"97f24b53-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f24b53-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[43000,26000],"end":[48000,26000],"width":400,"height":100}},"97f24b54-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f24b54-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[48000,26000],"end":[48000,24000],"width":400,"height":100}},"97f24b55-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f24b55-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[48000,24000],"end":[43000,24000],"width":400,"height":100}},"97f24b56-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f24b56-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[43000,24000],"end":[43000,22000],"width":400,"height":100}},"97f24b57-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f24b57-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[43000,22000],"end":[48000,22000],"width":400,"height":100}},"97f24b58-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f24b58-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[48000,22000],"end":[48000,20000],"width":400,"height":100}},"97f24b59-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f24b59-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[48000,20000],"end":[45000,20000],"width":400,"height":100}},"97f24b5a-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f24b5a-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[45000,20000],"end":[45000,17000],"width":400,"height":100}},"97f24b5b-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f24b5b-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[45000,17000],"end":[49000,17000],"width":400,"height":100}},"97f24b5c-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f24b5c-3ea6-11e5-8298-1b576ed4eb08","name":"New Port","type":"Port","params":{"position":[50000,10000],"radius1":700,"radius2":700,"height":100}},"97f24b5d-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f24b5d-3ea6-11e5-8298-1b576ed4eb08","name":"New Port","type":"Port","params":{"position":[49000,17000],"radius1":700,"radius2":700,"height":100}},"97f24b5e-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f24b5e-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[50000,40000],"end":[50000,20000],"width":400,"height":100}},"97f24b5f-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f24b5f-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[50000,20000],"end":[60000,10000],"width":400,"height":100}},"97f24b60-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f24b60-3ea6-11e5-8298-1b576ed4eb08","name":"New Port","type":"Port","params":{"position":[60000,10000],"radius1":700,"radius2":700,"height":100}},"97f27250-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f27250-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[50000,38000],"end":[53000,38000],"width":400,"height":100}},"97f27251-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f27251-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[53000,38000],"end":[53000,35000],"width":400,"height":100}},"97f27252-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f27252-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[53000,35000],"end":[55000,30000],"width":400,"height":100}},"97f27253-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f27253-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[55000,30000],"end":[60000,30000],"width":400,"height":100}},"97f27254-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f27254-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[60000,30000],"end":[60000,28000],"width":400,"height":100}},"97f27255-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f27255-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[60000,28000],"end":[55000,28000],"width":400,"height":100}},"97f27256-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f27256-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[55000,28000],"end":[55000,25000],"width":400,"height":100}},"97f27257-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f27257-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[55000,25000],"end":[62000,25000],"width":400,"height":100}},"97f27258-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f27258-3ea6-11e5-8298-1b576ed4eb08","name":"New Port","type":"Port","params":{"position":[62000,25000],"radius1":700,"radius2":700,"height":100}},"97f27259-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f27259-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[15000,15000],"end":[15000,12000],"width":400,"height":100}},"97f2725a-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f2725a-3ea6-11e5-8298-1b576ed4eb08","name":"New Via","type":"Via","params":{"position":[15000,12000],"radius1":800,"radius2":700,"height":1100}},"97f2725b-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f2725b-3ea6-11e5-8298-1b576ed4eb08","name":"New Via","type":"Via","params":{"position":[26000,12000],"radius1":800,"radius2":700,"height":1100}},"97f2725c-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f2725c-3ea6-11e5-8298-1b576ed4eb08","name":"New Via","type":"Via","params":{"position":[44000,12000],"radius1":800,"radius2":700,"height":1100}},"97f2725d-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f2725d-3ea6-11e5-8298-1b576ed4eb08","name":"New Via","type":"Via","params":{"position":[55000,12000],"radius1":800,"radius2":700,"height":1100}},"97f2725e-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f2725e-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[55000,12000],"end":[55000,15000],"width":400,"height":100}},"97f2725f-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f2725f-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[26000,12000],"end":[30000,10000],"width":400,"height":100}},"97f27260-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f27260-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[44000,12000],"end":[40000,10000],"width":400,"height":100}},"97f27261-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f27261-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[40000,10000],"end":[38000,7000],"width":400,"height":100}},"97f27262-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f27262-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[30000,10000],"end":[32000,7000],"width":400,"height":100}},"97f27263-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f27263-3ea6-11e5-8298-1b576ed4eb08","name":"New Port","type":"Port","params":{"position":[32000,7000],"radius1":700,"radius2":700,"height":100}},"97f27264-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f27264-3ea6-11e5-8298-1b576ed4eb08","name":"New Port","type":"Port","params":{"position":[38000,7000],"radius1":700,"radius2":700,"height":100}},"97f27265-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f27265-3ea6-11e5-8298-1b576ed4eb08","name":"New CircleValve","type":"CircleValve","params":{"position":[35000,10000],"radius1":1400,"radius2":1200,"height":800}},"97f27266-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f27266-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[35000,10000],"end":[35000,30000],"width":400,"height":100}},"97f27267-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f27267-3ea6-11e5-8298-1b576ed4eb08","name":"New Port","type":"Port","params":{"position":[35000,30000],"radius1":700,"radius2":700,"height":100}},"97f27268-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f27268-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[35000,17000],"end":[38000,23000],"width":400,"height":100}},"97f27269-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f27269-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[38000,23000],"end":[36000,25000],"width":400,"height":100}},"97f2726a-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f2726a-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[36000,25000],"end":[35000,30000],"width":400,"height":100}},"97f2726b-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f2726b-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[35000,17000],"end":[32000,23000],"width":400,"height":100}},"97f2726c-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f2726c-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[32000,23000],"end":[34000,25000],"width":400,"height":100}},"97f2726d-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f2726d-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[34000,25000],"end":[35000,30000],"width":400,"height":100}},"97f2726e-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f2726e-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[32000,23000],"end":[35000,24000],"width":400,"height":100}},"97f2726f-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f2726f-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[38000,23000],"end":[35000,24000],"width":400,"height":100}},"97f27270-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f27270-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[25000,20000],"end":[28000,20000],"width":400,"height":100}},"97f27271-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f27271-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[28000,20000],"end":[28000,22000],"width":400,"height":100}},"97f27272-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f27272-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[28000,22000],"end":[27000,22000],"width":400,"height":100}},"97f27273-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f27273-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[45000,20000],"end":[42000,20000],"width":400,"height":100}},"97f27274-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f27274-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[42000,20000],"end":[42000,22000],"width":400,"height":100}},"97f27275-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f27275-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[42000,22000],"end":[44000,22000],"width":400,"height":100}},"97f27276-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f27276-3ea6-11e5-8298-1b576ed4eb08","name":"New Via","type":"Via","params":{"position":[35000,30000],"radius1":800,"radius2":700,"height":1100}},"97f27277-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f27277-3ea6-11e5-8298-1b576ed4eb08","name":"New Via","type":"Via","params":{"position":[32000,20000],"radius1":800,"radius2":700,"height":1100}},"97f27278-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f27278-3ea6-11e5-8298-1b576ed4eb08","name":"New Via","type":"Via","params":{"position":[38000,20000],"radius1":800,"radius2":700,"height":1100}},"a2de7790-3ea6-11e5-8298-1b576ed4eb08":{"id":"a2de7790-3ea6-11e5-8298-1b576ed4eb08","name":"New CircleValve","type":"CircleValve","params":{"position":[10000,20000],"radius1":1400,"radius2":1200,"height":800}},"a3d819d0-3ea6-11e5-8298-1b576ed4eb08":{"id":"a3d819d0-3ea6-11e5-8298-1b576ed4eb08","name":"New CircleValve","type":"CircleValve","params":{"position":[60000,20000],"radius1":1400,"radius2":1200,"height":800}}}},{"name":"control","color":"red","params":{"z_offset":1200,"flip":true},"features":{"97f27279-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f27279-3ea6-11e5-8298-1b576ed4eb08","name":"New CircleValve","type":"CircleValve","params":{"position":[20000,34000],"radius1":1400,"radius2":1200,"height":800}},"97f2727a-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f2727a-3ea6-11e5-8298-1b576ed4eb08","name":"New CircleValve","type":"CircleValve","params":{"position":[30000,34000],"radius1":1400,"radius2":1200,"height":800}},"97f2727b-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f2727b-3ea6-11e5-8298-1b576ed4eb08","name":"New CircleValve","type":"CircleValve","params":{"position":[40000,34000],"radius1":1400,"radius2":1200,"height":800}},"97f2727c-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f2727c-3ea6-11e5-8298-1b576ed4eb08","name":"New CircleValve","type":"CircleValve","params":{"position":[50000,34000],"radius1":1400,"radius2":1200,"height":800}},"97f2727d-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f2727d-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[20000,34000],"end":[24000,34000],"width":400,"height":100}},"97f2727e-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f2727e-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[24000,34000],"end":[24000,47000],"width":400,"height":100}},"97f29960-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f29960-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[30000,34000],"end":[34000,34000],"width":400,"height":100}},"97f29961-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f29961-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[34000,34000],"end":[34000,47000],"width":400,"height":100}},"97f29962-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f29962-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[40000,34000],"end":[37000,34000],"width":400,"height":100}},"97f29963-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f29963-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[37000,34000],"end":[36000,34000],"width":400,"height":100}},"97f29964-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f29964-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[36000,34000],"end":[36000,47000],"width":400,"height":100}},"97f29965-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f29965-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[50000,34000],"end":[46000,34000],"width":400,"height":100}},"97f29966-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f29966-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[46000,34000],"end":[46000,47000],"width":400,"height":100}},"97f29967-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f29967-3ea6-11e5-8298-1b576ed4eb08","name":"New Port","type":"Port","params":{"position":[24000,47000],"radius1":700,"radius2":700,"height":100}},"97f29968-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f29968-3ea6-11e5-8298-1b576ed4eb08","name":"New Port","type":"Port","params":{"position":[34000,47000],"radius1":700,"radius2":700,"height":100}},"97f29969-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f29969-3ea6-11e5-8298-1b576ed4eb08","name":"New Port","type":"Port","params":{"position":[36000,47000],"radius1":700,"radius2":700,"height":100}},"97f2996a-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f2996a-3ea6-11e5-8298-1b576ed4eb08","name":"New Port","type":"Port","params":{"position":[46000,47000],"radius1":700,"radius2":700,"height":100}},"97f2996b-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f2996b-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[15000,12000],"end":[26000,12000],"width":400,"height":100}},"97f2996c-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f2996c-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[44000,12000],"end":[55000,12000],"width":400,"height":100}},"97f2996d-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f2996d-3ea6-11e5-8298-1b576ed4eb08","name":"New Port","type":"Port","params":{"position":[15000,12000],"radius1":700,"radius2":700,"height":100}},"97f2996e-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f2996e-3ea6-11e5-8298-1b576ed4eb08","name":"New Port","type":"Port","params":{"position":[26000,12000],"radius1":700,"radius2":700,"height":100}},"97f2996f-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f2996f-3ea6-11e5-8298-1b576ed4eb08","name":"New Port","type":"Port","params":{"position":[44000,12000],"radius1":700,"radius2":700,"height":100}},"97f29970-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f29970-3ea6-11e5-8298-1b576ed4eb08","name":"New Port","type":"Port","params":{"position":[55000,12000],"radius1":700,"radius2":700,"height":100}},"97f29971-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f29971-3ea6-11e5-8298-1b576ed4eb08","name":"New Port","type":"Port","params":{"position":[25000,21000],"radius1":700,"radius2":700,"height":100}},"97f29972-3ea6-11e5-8298-1b576ed4eb08":{"id":"97f29972-3ea6-11e5-8298-1b576ed4eb08","name":"New Port","type":"Port","params":{"position":[45000,21000],"radius1":700,"radius2":700,"height":100}},"a54e6620-3ea6-11e5-8298-1b576ed4eb08":{"id":"a54e6620-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[10000,20000],"end":[15000,12000],"width":400,"height":100}},"a63ff210-3ea6-11e5-8298-1b576ed4eb08":{"id":"a63ff210-3ea6-11e5-8298-1b576ed4eb08","name":"New Channel","type":"Channel","params":{"start":[55000,12000],"end":[60000,20000],"width":400,"height":100}},"a7efc4f0-3ea6-11e5-8298-1b576ed4eb08":{"id":"a7efc4f0-3ea6-11e5-8298-1b576ed4eb08","name":"New Port","type":"Port","params":{"position":[10000,20000],"radius1":700,"radius2":700,"height":100}},"a8879820-3ea6-11e5-8298-1b576ed4eb08":{"id":"a8879820-3ea6-11e5-8298-1b576ed4eb08","name":"New Port","type":"Port","params":{"position":[60000,20000],"radius1":700,"radius2":700,"height":100}}}}],"groups":[],"defaults":{}}',Mw='{"name":"My Other Device","params":{"width":135000,"length":85000},"layers":[{"name":"flow","color":"indigo","params":{"z_offset":0,"flip":false},"features":{"7d4dce00-4f92-11e7-b516-0963e7d642b6":{"id":"7d4dce00-4f92-11e7-b516-0963e7d642b6","name":"New Feature","type":"Channel","set":"Basic","params":{"start":[0,0],"end":[135000,0],"channelWidth":800,"height":100}},"802dbc70-4f92-11e7-b516-0963e7d642b6":{"id":"802dbc70-4f92-11e7-b516-0963e7d642b6","name":"New Feature","type":"Channel","set":"Basic","params":{"start":[135000,0],"end":[135000,85000],"channelWidth":800,"height":100}},"84122290-4f92-11e7-b516-0963e7d642b6":{"id":"84122290-4f92-11e7-b516-0963e7d642b6","name":"New Feature","type":"Channel","set":"Basic","params":{"start":[135000,85000],"end":[0,85000],"channelWidth":800,"height":100}},"8791ac60-4f92-11e7-b516-0963e7d642b6":{"id":"8791ac60-4f92-11e7-b516-0963e7d642b6","name":"New Feature","type":"Channel","set":"Basic","params":{"start":[0,85000],"end":[0,0],"channelWidth":800,"height":100}}}},{"name":"control","color":"red","params":{"z_offset":1200,"flip":true},"features":{"a937dec0-4f92-11e7-b516-0963e7d642b6":{"id":"a937dec0-4f92-11e7-b516-0963e7d642b6","name":"New Feature","type":"Channel","set":"Basic","params":{"start":[0,0],"end":[0,85000],"channelWidth":800,"height":100}},"ab87e940-4f92-11e7-b516-0963e7d642b6":{"id":"ab87e940-4f92-11e7-b516-0963e7d642b6","name":"New Feature","type":"Channel","set":"Basic","params":{"start":[0,85000],"end":[135000,85000],"channelWidth":800,"height":100}},"ad94f750-4f92-11e7-b516-0963e7d642b6":{"id":"ad94f750-4f92-11e7-b516-0963e7d642b6","name":"New Feature","type":"Channel","set":"Basic","params":{"start":[135000,85000],"end":[135000,0],"channelWidth":800,"height":100}},"af694220-4f92-11e7-b516-0963e7d642b6":{"id":"af694220-4f92-11e7-b516-0963e7d642b6","name":"New Feature","type":"Channel","set":"Basic","params":{"start":[135000,0],"end":[0,0],"channelWidth":800,"height":100}}}}],"groups":[]}',jw='{"name":"My Other Device","params":{"width":135000,"length":85000},"renderLayers":[{"id":"d51fc900-e923-11ec-baa7-bf96f82ad573","name":"RenderLayerFlow_1","modellayer":"4952d7a0-f16c-11eb-8c04-ff751cb31c4c","type":"FLOW","features":[],"color":"indigo"},{"id":"d51fc901-e923-11ec-baa7-bf96f82ad573","name":"RenderLayerControl_1","modellayer":"4952feb0-f16c-11eb-8c04-ff751cb31c4c","type":"CONTROL","features":[],"color":"red"},{"id":"d51fc902-e923-11ec-baa7-bf96f82ad573","name":"RenderLayerIntegration_1","modellayer":"4952feb1-f16c-11eb-8c04-ff751cb31c4c","type":"INTEGRATION","features":[],"color":"green"}],"layers":[{"id":"4952d7a0-f16c-11eb-8c04-ff751cb31c4c","name":"LayerFlow_1","type":"FLOW","group":"0","params":{"z_offset":0,"flip":false},"features":[]},{"id":"4952feb0-f16c-11eb-8c04-ff751cb31c4c","name":"LayerControl_1","type":"CONTROL","group":"0","params":{"z_offset":0,"flip":false},"features":[]},{"id":"4952feb1-f16c-11eb-8c04-ff751cb31c4c","name":"LayerIntegration_1","type":"INTEGRATION","group":"0","params":{"z_offset":0,"flip":false},"features":[]}],"groups":[],"components":[],"connections":[],"valves":[],"version":"1.2"}',Aw='{"name":"DAFD Template","params":{"width":70000,"length":70000},"components":[{"id":"e958b4d0-6155-11e9-89ad-d58be75aeb6f","name":"Port_in","entity":"PORT","params":{"position":[10000,35000],"portRadius":1998,"height":1100},"xspan":3996,"yspan":3996,"ports":[]},{"id":"eadf7be0-6155-11e9-89ad-d58be75aeb6f","name":"Port_out","entity":"PORT","params":{"position":[60000,35000],"portRadius":1998,"height":1100},"xspan":3996,"yspan":3996,"ports":[]},{"id":"ec125690-6155-11e9-89ad-d58be75aeb6f","name":"Port_oil1","entity":"PORT","params":{"position":[35075,10000],"portRadius":1998,"height":1100},"xspan":3996,"yspan":3996,"ports":[]},{"id":"f0839360-6155-11e9-89ad-d58be75aeb6f","name":"Port_oil2","entity":"PORT","params":{"position":[35075,60000],"portRadius":1998,"height":1100},"xspan":3996,"yspan":3996,"ports":[]},{"id":"b6d5c690-d628-11e9-9185-859b5727feb8","name":"DropletGen_1","entity":"NOZZLE DROPLET GENERATOR","params":{"position":[40000,35000],"orificeSize":75,"orificeLength":75,"oilInputWidth":150,"waterInputWidth":150,"outputWidth":150,"outputLength":5000,"height":75},"xspan":5225,"yspan":150,"ports":[{"x":75,"y":-75,"layer":"FLOW","label":"1"},{"x":5225,"y":0,"layer":"FLOW","label":"2"},{"x":75,"y":75,"layer":"FLOW","label":"3"},{"x":0,"y":0,"layer":"FLOW","label":"4"}]}],"connections":[],"features":[{"name":"flow","color":"indigo","params":{"z_offset":0,"flip":false},"features":{"e957f180-6155-11e9-89ad-d58be75aeb6f":{"id":"e957f180-6155-11e9-89ad-d58be75aeb6f","name":"New Feature","macro":"Port","set":"Basic","referenceID":"e958b4d0-6155-11e9-89ad-d58be75aeb6f","params":{"position":[10000,35000],"portRadius":1998,"height":1100},"dxfData":[],"type":"XY"},"eadf06b0-6155-11e9-89ad-d58be75aeb6f":{"id":"eadf06b0-6155-11e9-89ad-d58be75aeb6f","name":"New Feature","macro":"Port","set":"Basic","referenceID":"eadf7be0-6155-11e9-89ad-d58be75aeb6f","params":{"position":[60000,35000],"portRadius":1998,"height":1100},"dxfData":[],"type":"XY"},"ec119340-6155-11e9-89ad-d58be75aeb6f":{"id":"ec119340-6155-11e9-89ad-d58be75aeb6f","name":"New Feature","macro":"Port","set":"Basic","referenceID":"ec125690-6155-11e9-89ad-d58be75aeb6f","params":{"position":[35075,10000],"portRadius":1998,"height":1100},"dxfData":[],"type":"XY"},"f082f720-6155-11e9-89ad-d58be75aeb6f":{"id":"f082f720-6155-11e9-89ad-d58be75aeb6f","name":"New Feature","macro":"Port","set":"Basic","referenceID":"f0839360-6155-11e9-89ad-d58be75aeb6f","params":{"position":[35075,60000],"portRadius":1998,"height":1100},"dxfData":[],"type":"XY"},"1643a8b0-d3f2-11e9-ad52-c581dcc5e148":{"id":"1643a8b0-d3f2-11e9-ad52-c581dcc5e148","name":"Transition_3","macro":"Transition","set":"Basic","params":{"position":[10000,35000],"cw1":2000,"cw2":150,"length":10000,"rotation":270,"height":250},"dxfData":[],"type":"XY"},"2e07a4b0-d3f2-11e9-ad52-c581dcc5e148":{"id":"2e07a4b0-d3f2-11e9-ad52-c581dcc5e148","name":"Transition_4","macro":"Transition","set":"Basic","params":{"position":[60000,35000],"cw1":2000,"cw2":150,"length":10000,"rotation":90,"height":250},"dxfData":[],"type":"XY"},"313eb3d0-d3f2-11e9-ad52-c581dcc5e148":{"id":"313eb3d0-d3f2-11e9-ad52-c581dcc5e148","name":"Transition_5","macro":"Transition","set":"Basic","params":{"position":[35075,60000],"cw1":2000,"cw2":150,"length":10000,"rotation":180,"height":250},"dxfData":[],"type":"XY"},"336b57d0-d3f2-11e9-ad52-c581dcc5e148":{"id":"336b57d0-d3f2-11e9-ad52-c581dcc5e148","name":"Transition_6","macro":"Transition","set":"Basic","params":{"position":[35075,10000],"cw1":2000,"cw2":150,"length":10000,"height":250},"dxfData":[],"type":"XY"},"b6d50340-d628-11e9-9185-859b5727feb8":{"id":"b6d50340-d628-11e9-9185-859b5727feb8","name":"New Feature","macro":"DropletGen","set":"Basic","referenceID":"b6d5c690-d628-11e9-9185-859b5727feb8","params":{"position":[40000,35000],"orificeSize":75,"orificeLength":75,"oilInputWidth":150,"waterInputWidth":150,"outputWidth":150,"outputLength":5000,"height":75},"dxfData":[],"type":"XY"},"e1a50cd0-f506-11e9-b6c5-c5f0545f0b4a":{"id":"e1a50cd0-f506-11e9-b6c5-c5f0545f0b4a","name":"e1a50cd0-f506-11e9-b6c5-c5f0545f0b4a","macro":"EDGE","set":"Basic","dxfData":[],"type":"EDGE"},"48225b40-f50a-11e9-a170-c3e417364f96":{"id":"48225b40-f50a-11e9-a170-c3e417364f96","name":"48225b40-f50a-11e9-a170-c3e417364f96","macro":"EDGE","set":"Basic","dxfData":[],"type":"EDGE"}}},{"name":"control","color":"red","params":{"z_offset":1200,"flip":true},"features":{"e1a50cd0-f506-11e9-b6c5-c5f0545f0b4a":{"id":"e1a50cd0-f506-11e9-b6c5-c5f0545f0b4a","name":"e1a50cd0-f506-11e9-b6c5-c5f0545f0b4a","macro":"EDGE","set":"Basic","dxfData":[],"type":"EDGE"},"48225b40-f50a-11e9-a170-c3e417364f96":{"id":"48225b40-f50a-11e9-a170-c3e417364f96","name":"48225b40-f50a-11e9-a170-c3e417364f96","macro":"EDGE","set":"Basic","dxfData":[],"type":"EDGE"}}},{"name":"cells","color":"indigo","params":{"z_offset":2000,"flip":false},"features":{"e1a50cd0-f506-11e9-b6c5-c5f0545f0b4a":{"id":"e1a50cd0-f506-11e9-b6c5-c5f0545f0b4a","name":"e1a50cd0-f506-11e9-b6c5-c5f0545f0b4a","macro":"EDGE","set":"Basic","dxfData":[],"type":"EDGE"},"48225b40-f50a-11e9-a170-c3e417364f96":{"id":"48225b40-f50a-11e9-a170-c3e417364f96","name":"48225b40-f50a-11e9-a170-c3e417364f96","macro":"EDGE","set":"Basic","dxfData":[],"type":"EDGE"}}}],"version":"1.2","groups":[],"customComponents":{}}',Vw={example1:Mw,example2:jw,example3:Iw},Bw=Vw,Gw=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[n("v-tooltip",{attrs:{left:""},scopedSlots:e._u([{key:"activator",fn:function(t){var r=t.on,o=t.attrs;return[n("v-btn",e._g(e._b({staticClass:"pink white--text",attrs:{id:"grid-button",fab:""},on:{click:function(t){return e.showProperties()}},nativeOn:{mouseenter:function(t){e.hover=!0},mouseleave:function(t){e.hover=!1}}},"v-btn",o,!1),r),[n("span",{staticClass:"material-icons"},[e._v("grid_on")])])]}}])},[n("span",[e._v("Grid Settings")])]),n("v-card",{directives:[{name:"show",rawName:"v-show",value:e.activated,expression:"activated"}],attrs:{id:"resolution-toolbar"}},[n("v-card-text",[n("v-switch",{attrs:{color:"#304FFE","hide-details":""},on:{change:e.clickedGrid},scopedSlots:e._u([{key:"label",fn:function(){return[e._v("Enable Automatic Grid")]},proxy:!0}]),model:{value:e.isAdaptiveGridEnabled,callback:function(t){e.isAdaptiveGridEnabled=t},expression:"isAdaptiveGridEnabled"}}),n("v-switch",{attrs:{color:"#304FFE"},on:{change:e.clickedSnap},scopedSlots:e._u([{key:"label",fn:function(){return[e._v("Render Snap Points")]},proxy:!0}]),model:{value:e.renderSnap,callback:function(t){e.renderSnap=t},expression:"renderSnap"}}),n("br"),n("div",{ref:"gridslider",attrs:{disabled:e.isAdaptiveGridEnabled}})],1)],1),n("div",{attrs:{id:"bottom-info-bar"}},[e._v("Grid Size: "+e._s(e.gridSizeValue)+" μm")])],1)},zw=[],Uw=(n("0c4f"),n("0f2b")),Kw=n.n(Uw),Hw=n("5070"),Yw=n.n(Hw),Xw={name:"ResolutionToolbar",components:{},data:function(){return{suffix:Yw()({suffix:"μm"}),activated:!1,hover:!1,isAdaptiveGridEnabled:!0,renderSnap:!0,isUserGeneratedEvent:!1,ignoreUpdate:!1,gridSizeValue:0}},computed:{directGridSpacingRead:function(){return null===zh.viewManager?0:zh.viewManager.getGridSize()}},mounted:function(){var e=this;Kw.a.create(this.$refs.gridslider,{start:[500],connect:"lower",range:{min:[1,1],"10%":[10,10],"30%":[100,100],"90%":[1e3,1e3],max:[5e3]},pips:{mode:"range",density:5,format:Yw()({suffix:"μm"})},tooltips:[!0]}),setTimeout((function(){zh.currentGrid.spacing,e.$refs.gridslider.noUiSlider.on("change",(function(t){var n=parseFloat(t[0]);console.log("grid size: "+n),e.ignoreUpdate||zh.viewManager.updateGridSpacing(n)}));var t=zh.viewManager.getGridSize();e.ignoreUpdate=!0,e.$refs.gridslider.noUiSlider.set(t),e.ignoreUpdate=!1,e.gridSizeValue=t,Wd.get().on(Wd.UPDATE_GRID_SIZE,(function(){var t=zh.viewManager.getGridSize();e.gridSizeValue=t,e.ignoreUpdate=!0,e.$refs.gridslider.noUiSlider.set(t),e.ignoreUpdate=!1}))}),100)},methods:{showProperties:function(){this.activated=!this.activated,console.log("grid clicked")},clickedGrid:function(){console.log(this.isAdaptiveGridEnabled),this.isAdaptiveGridEnabled?zh.currentGrid.enableAdaptiveGrid():zh.currentGrid.disableAdaptiveGrid()},clickedSnap:function(){this.renderSnap?zh.viewManager.view.enableSnapRender():zh.viewManager.view.disableSnapRender()}}},qw=Xw,Jw=(n("2480"),n("2877")),$w=n("6544"),Zw=n.n($w),Qw=n("8336"),eb=n("b0af"),tb=n("99d9"),nb=n("b73d"),rb=n("3a2f"),ob=Object(Jw["a"])(qw,Gw,zw,!1,null,"17cb0ead",null),ib=ob.exports;Zw()(ob,{VBtn:Qw["a"],VCard:eb["a"],VCardText:tb["b"],VSwitch:nb["a"],VTooltip:rb["a"]});var ab=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"zoomsliderbase"},[n("div",{ref:"zoomslider",staticClass:"zslidermain",attrs:{height:"300px"}})])},lb=[],sb=n("f528"),ub=n.n(sb),cb={name:"ZoomSlider",components:{},data:function(){return{zoomOptimal:[.1],ignoreUpdate:!1,currentGridSpacing:500,currentZoom:-3.5}},mounted:function(){var e=this;ub.a.create(this.$refs.zoomslider,{start:40,orientation:"vertical",connect:[!1,!0],range:{min:-3.61,max:.6545}}),this.$refs.zoomslider.noUiSlider.updateOptions({range:{min:-3.61,max:.6545}},!1);var t=0;setTimeout((function(){e.$refs.zoomslider.noUiSlider.on("update",(function(t){var n=parseFloat(t[0]);e.ignoreUpdate||e.updateViewManagerZoom(n)})),t=Math.log10(zh.viewManager.view.computeOptimalZoom()),e.$refs.zoomslider.noUiSlider.set(t)}),100),Wd.get().on(Wd.UPDATE_ZOOM,(function(){var t=e.convertZoomtoLinearScale(zh.viewManager.view.getZoom());e.ignoreUpdate=!0,e.$refs.zoomslider.noUiSlider.set(t),e.ignoreUpdate=!1}))},methods:{convertLinearToZoomScale:function(e){return Math.pow(10,e)},updateViewManagerZoom:function(e){zh.viewManager.setZoom(this.convertLinearToZoomScale(e))},convertZoomtoLinearScale:function(e){return Math.log10(e)}}},hb=cb,fb=(n("feac"),Object(Jw["a"])(hb,ab,lb,!1,null,"1a7b3dea",null)),db=fb.exports,pb=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("v-card",{directives:[{name:"show",rawName:"v-show",value:e.activeMenu,expression:"activeMenu"}],ref:"RightClickMenu",style:{width:550,height:100,top:e.marginTop+"px",left:e.marginLeft+"px"},attrs:{scrollable:""}},[n("div",[n("thead",{directives:[{name:"show",rawName:"v-show",value:e.showRename,expression:"showRename"}]},[n("v-col",[n("v-row",{attrs:{"align-start":""}},[n("v-text-field",{attrs:{label:"Name",type:"input"},model:{value:e.componentName,callback:function(t){e.componentName=t},expression:"componentName"}}),n("v-btn",{attrs:{"x-small":"",depressed:""},on:{click:e.cancelRename}},[n("span",{staticClass:"material-icons"},[e._v("close")])]),n("v-btn",{attrs:{"x-small":"",depressed:""},on:{click:e.saveName}},[n("span",{staticClass:"material-icons"},[e._v("check")])])],1)],1)],1),n("v-row",{attrs:{dense:""}},[n("div",{staticClass:"buttonClass",attrs:{id:"buttonClass"}},[n("v-btn",{attrs:{id:"context_button_copy",color:"white indigo--text",depressed:""},on:{click:function(t){return e.copyButton()}}},[n("span",{staticClass:"material-icons"},[e._v("file_copy")])]),n("v-btn",{attrs:{id:"context_button_delete",color:"white indigo--text",depressed:""},on:{click:function(t){return e.deleteButton()}}},[n("span",{staticClass:"material-icons"},[e._v("delete")])]),n("MoveDialog",{attrs:{component:e.currentComponent},on:{close:function(t){e.activeMenu=!1}}}),n("v-btn",{attrs:{id:"context_button_revert",color:"white indigo--text",depressed:""},on:{click:function(t){return e.revertToDefaults()}}},[n("span",{staticClass:"material-icons"},[e._v("settings_backup_restore")])]),n("ChangeAllDialog",{attrs:{component:e.currentComponent},on:{close:function(t){e.activeMenu=!1}}}),n("v-btn",{attrs:{id:"context_button_showRename",color:"white indigo--text",depressed:""},on:{click:function(t){e.showRename=!0}}},[n("span",{staticClass:"material-icons"},[e._v("title")])]),n("GenerateArrayDialog",{attrs:{component:e.currentComponent},on:{close:function(t){e.activeMenu=!1}}})],1)]),n("v-row",[n("v-card-text",[n("PropertyBlock",{attrs:{title:e.mint,spec:e.spec},on:{update:e.updateParameter}})],1)],1)],1)])},vb=[],gb=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("v-dialog",{attrs:{"content-class":"draggable-dialog topleft-dialog","hide-overlay":"",persistent:"","no-click-animation":"",width:"500"},scopedSlots:e._u([{key:"activator",fn:function(t){var r=t.on,o=t.attrs;return[n("v-btn",e._g(e._b({attrs:{id:"context_button_move",color:"white indigo--text",depressed:""}},"v-btn",o,!1),r),[n("span",{staticClass:"material-icons"},[e._v("open_with")])])]}}]),model:{value:e.dialog,callback:function(t){e.dialog=t},expression:"dialog"}},[n("v-card",[n("v-card-title",{staticClass:"text-h5 lighten-2"},[e._v(" Move Component: ")]),n("v-card-text",[n("v-row",[n("v-col",[n("v-row",[n("v-col",{attrs:{id:"left-col",cols:"3"}},[n("v-row",[n("v-card-text",[e._v(e._s(e.topLeft.x)+", "+e._s(e.topLeft.y))])],1),n("v-row",[n("v-card-text",{staticClass:"bottom-xy"},[e._v(e._s(e.bottomLeft.x)+", "+e._s(e.bottomLeft.y))])],1)],1),n("v-col",{attrs:{id:"box"}}),n("v-col",{attrs:{cols:"3"}},[n("v-row",[n("v-card-text",[e._v(e._s(e.topRight.x)+", "+e._s(e.topRight.y))])],1),n("v-row",[n("v-card-text",{staticClass:"bottom-xy"},[e._v(e._s(e.bottomRight.x)+", "+e._s(e.bottomRight.y))])],1)],1)],1)],1),n("v-col",{attrs:{id:"right-col"}},[n("tr",[n("td",[n("v-card-text",[e._v("X (mm):")])],1),n("td",{attrs:{width:"125px"}},[n("v-text-field",{attrs:{placeholder:"0",step:1,type:"number"},on:{change:e.updateComponent},model:{value:e.posX,callback:function(t){e.posX=t},expression:"posX"}})],1)]),n("tr",[n("td",[n("v-card-text",[e._v("Y (mm):")])],1),n("td",{attrs:{width:"125px"}},[n("v-text-field",{attrs:{placeholder:"0",step:1,type:"number"},on:{change:e.updateComponent},model:{value:e.posY,callback:function(t){e.posY=t},expression:"posY"}})],1)])])],1)],1),n("v-divider"),n("v-card-actions",[n("v-spacer"),n("v-btn",{staticClass:"white--text",attrs:{color:"green"},on:{click:function(t){e.dialog=!1}}},[e._v(" Save ")]),n("v-btn",{staticClass:"white--text ml-9",attrs:{color:"red"},on:{click:e.cancelMove}},[e._v(" Cancel ")])],1)],1)],1)},yb=[],mb=(n("5363"),{name:"MoveDialog",props:{component:{type:Pf,required:!0,default:null}},data:function(){return{dialog:!1,activated:!1,callbacks:{},posX:0,posY:0}},computed:{buttonClasses:function(){return[this.activated?this.activatedColor:"white",this.activated?this.activatedTextColor:"blue--text","ml-4","mb-2","btn"]},topLeft:function(){return{x:0,y:0}},topRight:function(){return{x:0,y:0}},bottomLeft:function(){return{x:0,y:0}},bottomRight:function(){return{x:0,y:0}}},watch:{dialog:function(e){e?(this.$emit("close"),zh.viewManager.activateTool("MoveTool"),zh.viewManager.tools.MoveTool.activate(this.component,this.toolCallback)):zh.viewManager.tools.MoveTool.deactivate()}},mounted:function(){var e=this;Wd.get().on(Wd.NAVBAR_SCROLL_EVENT,this.setDrawerPosition),l["default"].set(this.callbacks,"close",(function(t){t&&t(),e.activated=!1})),function(){var e={};document.addEventListener("mousedown",(function(t){var n=t.target.closest(".draggable-dialog");0===t.button&&null!==n&&t.target.classList.contains("v-card__title")&&(e.el=n,e.mouseStartX=t.clientX,e.mouseStartY=t.clientY,e.elStartX=e.el.getBoundingClientRect().left,e.elStartY=e.el.getBoundingClientRect().top,e.el.style.position="fixed",e.el.style.margin=0,e.oldTransition=e.el.style.transition,e.el.style.transition="none")})),document.addEventListener("mousemove",(function(t){void 0!==e.el&&(e.el.style.left=Math.min(Math.max(e.elStartX+t.clientX-e.mouseStartX,0),window.innerWidth-e.el.getBoundingClientRect().width)+"px",e.el.style.top=Math.min(Math.max(e.elStartY+t.clientY-e.mouseStartY,0),window.innerHeight-e.el.getBoundingClientRect().height)+"px")})),document.addEventListener("mouseup",(function(){void 0!==e.el&&(e.el.style.transition=e.oldTransition,e.el=void 0)})),setInterval((function(){var e=document.querySelector(".draggable-dialog");null!==e&&(e.style.left=Math.min(parseInt(e.style.left),window.innerWidth-e.getBoundingClientRect().width)+"px",e.style.top=Math.min(parseInt(e.style.top),window.innerHeight-e.getBoundingClientRect().height)+"px")}),100)}()},methods:{cancelMove:function(){zh.viewManager.tools.MoveTool.revertToOriginalPosition(),this.dialog=!1},toolCallback:function(e,t){this.posX=e,this.posY=t},handleScroll:function(){this.setDrawerPosition()},setDrawerPosition:function(){if(this.activated){var e=this.$refs.activator.$el.getBoundingClientRect();this.$refs.drawer.style.top=e.bottom-e.height+"px"}},onSave:function(){console.log("Saved data for Move")},updateComponent:function(){this.component.updateComponentPosition([parseInt(this.posX),parseInt(this.posY)])}}}),wb=mb,bb=(n("6d1a"),n("62ad")),_b=n("169a"),Pb=n("ce7e"),Cb=n("0fd9"),Ob=n("2fa4"),Sb=n("8654"),Rb=Object(Jw["a"])(wb,gb,yb,!1,null,"151188cb",null),Lb=Rb.exports;Zw()(Rb,{VBtn:Qw["a"],VCard:eb["a"],VCardActions:tb["a"],VCardText:tb["b"],VCardTitle:tb["c"],VCol:bb["a"],VDialog:_b["a"],VDivider:Pb["a"],VRow:Cb["a"],VSpacer:Ob["a"],VTextField:Sb["a"]});var kb=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("v-dialog",{attrs:{width:"500"},scopedSlots:e._u([{key:"activator",fn:function(t){var r=t.on,o=t.attrs;return[n("v-btn",e._g(e._b({attrs:{id:"context_button_copytoall",color:"white indigo--text",depressed:""}},"v-btn",o,!1),r),[n("span",{staticClass:"material-icons"},[e._v("select_all")])])]}}]),model:{value:e.dialog,callback:function(t){e.dialog=t},expression:"dialog"}},[n("v-card",[n("v-card-title",{staticClass:"text-h5 lighten-2"},[e._v(" Change All Components: ")]),n("v-card-text"),n("table",[n("tr",[n("th",{staticClass:"font-weight-bold pl-10 pt-4 pb-2"},[n("input",{directives:[{name:"model",rawName:"v-model",value:e.selectAll,expression:"selectAll"}],attrs:{type:"checkbox"},domProps:{checked:Array.isArray(e.selectAll)?e._i(e.selectAll,null)>-1:e.selectAll},on:{change:function(t){var n=e.selectAll,r=t.target,o=!!r.checked;if(Array.isArray(n)){var i=null,a=e._i(n,i);r.checked?a<0&&(e.selectAll=n.concat([i])):a>-1&&(e.selectAll=n.slice(0,a).concat(n.slice(a+1)))}else e.selectAll=o}}}),n("span",{staticClass:"pl-1"},[e._v("Select")])]),n("th",{staticClass:"font-weight-bold pl-15 pt-4 pb-2"},[e._v("Name")])]),e._l(e.components,(function(t){return n("tr",{key:t.id},[n("td",{staticClass:"pl-15 pb-2"},[n("input",{directives:[{name:"model",rawName:"v-model",value:e.selected,expression:"selected"}],attrs:{type:"checkbox"},domProps:{value:t.id,checked:Array.isArray(e.selected)?e._i(e.selected,t.id)>-1:e.selected},on:{change:function(n){var r=e.selected,o=n.target,i=!!o.checked;if(Array.isArray(r)){var a=t.id,l=e._i(r,a);o.checked?l<0&&(e.selected=r.concat([a])):l>-1&&(e.selected=r.slice(0,l).concat(r.slice(l+1)))}else e.selected=i}}})]),n("td",{staticClass:"pl-15 pb-2"},[e._v(e._s(t.name))])])}))],2),n("v-divider"),n("v-card-actions",[n("v-spacer"),n("v-btn",{staticClass:"white--text",attrs:{color:"green"},on:{click:e.onSave}},[e._v(" Change ")]),n("v-btn",{staticClass:"white--text ml-9",attrs:{color:"red"},on:{click:function(t){e.dialog=!1}}},[e._v(" Cancel ")])],1)],1)],1)},Db=[];function Tb(e,t){var n="undefined"!==typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(!n){if(Array.isArray(e)||(n=Fb(e))||t&&e&&"number"===typeof e.length){n&&(e=n);var r=0,o=function(){};return{s:o,n:function(){return r>=e.length?{done:!0}:{done:!1,value:e[r++]}},e:function(e){throw e},f:o}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var i,a=!0,l=!1;return{s:function(){n=n.call(e)},n:function(){var e=n.next();return a=e.done,e},e:function(e){l=!0,i=e},f:function(){try{a||null==n.return||n.return()}finally{if(l)throw i}}}}function Fb(e,t){if(e){if("string"===typeof e)return Eb(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?Eb(e,t):void 0}}function Eb(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);nwindow.innerWidth/2?this.marginLeft=e.clientX-800:this.marginLeft=e.clientX-180,window.innerHeight/1.2>=e.clientY&&e.clientY>=window.innerHeight/6?this.marginTop=0:e.clientY+0>window.innerHeight/2?this.marginTop=e.clientY-750:this.marginTop=e.clientY+0;var r=this.computeSpec(t.mint,t.params);this.mint=t.mint,console.log(r),this.spec=r},onSave:function(){var e=this.getComponentName();this.$refs.input.value=e,console.log("Saved data for showRename")},revertToDefaults:function(){this.revertToDefaultParams(this.$refs.table,this.typestring,this.__setString)},deleteButton:function(){zh.viewManager.view.deleteSelectedFeatures()},copyButton:function(){zh.viewManager.initiateCopy()},copyToAllButton:function(){this.activeCopy=!this.activeCopy,console.log("Change all the component parameters")},generateArrayButton:function(){zh.viewManager.activateTool("GenerateArrayTool");var e=zh.currentDevice.getComponentForFeatureID(this.featureRef.getID());zh.viewManager.tools.GenerateArrayTool.activate(e)},handleScroll:function(){this.setDrawerPosition()},setDrawerPosition:function(){if(this.activated){var e=this.$refs.activator.$el.getBoundingClientRect();this.$refs.drawer.style.top=e.bottom-e.height+"px"}},saveName:function(){this.currentComponent.name=this.componentName,this.showRename=!1},closeDialog:function(){this.activeMenu=!1},cancelRename:function(){this.showRename=!1,this.componentName=this.currentComponent.name}}},Zb=$b,Qb=(n("6c33"),Object(Jw["a"])(Zb,pb,vb,!1,null,"94aacf7a",null)),e_=Qb.exports;Zw()(Qb,{VBtn:Qw["a"],VCard:eb["a"],VCardText:tb["b"],VCol:bb["a"],VRow:Cb["a"],VTextField:Sb["a"]});var t_=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("v-card",{directives:[{name:"show",rawName:"v-show",value:e.activeMenu,expression:"activeMenu"}],ref:"RightClickMenu",style:{width:550,height:100,top:e.marginTop+"px",left:e.marginLeft+"px"},attrs:{scrollable:""}},[n("div",[n("thead",{directives:[{name:"show",rawName:"v-show",value:e.showRename,expression:"showRename"}]},[n("v-col",[n("v-row",{attrs:{"align-start":""}},[n("v-text-field",{attrs:{label:"Name",type:"input"},model:{value:e.connectionName,callback:function(t){e.connectionName=t},expression:"connectionName"}}),n("v-btn",{attrs:{"x-small":"",depressed:""},on:{click:e.cancelRename}},[n("span",{staticClass:"material-icons"},[e._v("close")])]),n("v-btn",{attrs:{"x-small":"",depressed:""},on:{click:e.saveName}},[n("span",{staticClass:"material-icons"},[e._v("check")])])],1)],1)],1),n("v-row",{attrs:{dense:""}},[n("div",{staticClass:"buttonClass",attrs:{id:"buttonClass"}},[n("v-btn",{attrs:{id:"context_button_delete",color:"white indigo--text",depressed:""},on:{click:function(t){return e.deleteButton()}}},[n("span",{staticClass:"material-icons"},[e._v("delete")])]),n("v-btn",{attrs:{id:"context_button_showRename",color:"white indigo--text",depressed:""},on:{click:function(t){e.showRename=!0}}},[n("span",{staticClass:"material-icons"},[e._v("title")])])],1)]),n("v-row",[n("v-card-text",[n("PropertyBlock",{attrs:{title:e.mint,spec:e.spec},on:{update:e.updateParameter}})],1)],1)],1)])},n_=[],r_={name:"ConnectionContextMenu",components:{PropertyBlock:Ub},data:function(){return{mint:"CHANNEL",spec:[{min:0,max:110,units:"",value:0}],activeMenu:!1,activeChange:!1,activeMove:!1,activeCopy:!1,showRename:!1,connectionName:"",featureRef:null,typeString:"",marginLeft:500,marginTop:100,currentConnection:new Gf("",new zc({},new Map,new Map),"","",new Yc({},zh.currentDevice))}},mounted:function(){var e=this;Wd.get().on(Wd.CLOSE_ALL_WINDOWS,(function(){e.activeMenu=!1})),Wd.get().on(Wd.DBL_CLICK_CONNECTION,this.activateMenu)},methods:{updateParameter:function(e,t){this.currentConnection.updateParameter(t,e)},computeSpec:function(e,t){var n=[],r=Tc.getDefinitionForMINT(e);for(var o in t.heritable){var i=t.heritable[o],a={min:r.minimum[i],max:r.maximum[i],value:t.getValue(i),units:r.units[i],steps:(r.maximum[i]-r.minimum[i])/10,name:i};n.push(a)}return console.log("Spec: ",n),n},activateMenu:function(e,t){console.log("clienwidth/height",this.$el,this.$el.clientWidth,this.$el.clientHeight),this.currentConnection=t,this.featureRef=t,this.typeString="CHANNEL";var n=t.name;this.connectionName=n,console.log(e,t),this.activeMenu=!this.activeMenu,e.clientX-150>window.innerWidth/2?this.marginLeft=e.clientX-800:this.marginLeft=e.clientX-180,window.innerHeight/1.2>=e.clientY&&e.clientY>=window.innerHeight/6?this.marginTop=0:e.clientY+0>window.innerHeight/2?this.marginTop=e.clientY-750:this.marginTop=e.clientY+0;var r=this.computeSpec("CHANNEL",t.params);console.log(r),this.spec=r},onSave:function(){var e=this.getconnectionName();this.$refs.input.value=e,console.log("Saved data for showRename")},revertToDefaults:function(){this.revertToDefaultParams(this.$refs.table,this.typestring,this.__setString)},revertToDefaultParams:function(e,t,n){var r=Tc.getDefinition(t),o=r.heritable,i=r.defaults;for(var a in o)zh.viewManager.adjustParams(t,n,a,i[a])},deleteButton:function(){zh.viewManager.view.deleteSelectedFeatures()},copyButton:function(){zh.viewManager.initiateCopy()},copyToAllButton:function(){this.activeCopy=!this.activeCopy,console.log("Change all the connection parameters")},generateArrayButton:function(){zh.viewManager.activateTool("GenerateArrayTool");var e=zh.currentDevice.getConnectionForFeatureID(this.featureRef.getID());zh.viewManager.tools.GenerateArrayTool.activate(e)},handleScroll:function(){this.setDrawerPosition()},setDrawerPosition:function(){if(this.activated){var e=this.$refs.activator.$el.getBoundingClientRect();this.$refs.drawer.style.top=e.bottom-e.height+"px"}},saveName:function(){this.currentConnection.name=this.connectionName,this.showRename=!1},closeDialog:function(){this.activeMenu=!1},cancelRename:function(){this.showRename=!1,this.connectionName=this.currentConnection.name}}},o_=r_,i_=(n("c3ec"),Object(Jw["a"])(o_,t_,n_,!1,null,"7fd25946",null)),a_=i_.exports;Zw()(i_,{VBtn:Qw["a"],VCard:eb["a"],VCardText:tb["b"],VCol:bb["a"],VRow:Cb["a"],VTextField:Sb["a"]});var l_={components:{ResolutionToolbar:ib,ComponentContextMenu:e_,ConnectionContextMenu:a_,ZoomSlider:db},data:function(){return{}},computed:{},mounted:function(){var e=new Nw;zh.viewManager=e,e.loadDeviceFromJSON(JSON.parse(r.UpdatedExample)),e.updateGrid(),e.refresh(),window.dev=zh.currentDevice,window.Registry=zh,window.view=zh.viewManager.view,zh.viewManager.setupToolBars(),this.setupDragAndDropOnCanvas()},methods:{setupDragAndDropOnCanvas:function(){function e(e,t){var n=function(t){t.stopPropagation(),t.preventDefault(),e.classList.add("dropping")},r=function(e){e.stopPropagation(),e.preventDefault()},o=function(e){e.stopPropagation(),e.preventDefault()},i=function(n){n.stopPropagation(),n.preventDefault(),e.classList.remove("dropping"),t(n.dataTransfer.files,n)};e.addEventListener("dragenter",n,!1),e.addEventListener("dragover",r,!1),e.addEventListener("dragleave",o,!1),e.addEventListener("drop",i,!1)}e(this.$refs.rendingcanvas,(function(e){var t=e[0],n=new FileReader;n.onloadend=function(e){var t=this.result,n=JSON.parse(t);zh.viewManager.loadDeviceFromJSON(n)};try{n.readAsText(t)}catch(r){console.log("unable to load JSON: "+t)}}))}}},s_=l_,u_=(n("4d3d"),Object(Jw["a"])(s_,c,h,!1,null,"c5eef416",null)),c_=u_.exports,h_=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("v-row",[n("v-col",[n("v-navigation-drawer",{staticClass:"pt-4",attrs:{app:"",permanent:"",color:"grey lighten-3"}},[n("div",{staticClass:"d-flex flex-column mx-2"},[n("v-img",{staticClass:"mx-auto",staticStyle:{width:"90%"},attrs:{src:"img/logo.png",alt:"3DuF Logo"}}),n("v-divider",{staticClass:"mb-1"}),n("IntroHelpDialog"),n("v-divider"),n("EditDeviceDialog"),n("EditBorderDialog"),n("InsertTextDialog"),n("ImportDXFDialog"),n("v-divider"),n("LayerToolbar"),n("ComponentToolbar"),n("ManufacturingPanel"),n("v-divider"),n("HelpDialog"),n("v-divider"),n("br")],1)])],1),n("v-col",[n("div",[n("Visualiser")],1)])],1)},f_=[],d_=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("v-dialog",{attrs:{persistent:"","max-width":"400"},scopedSlots:e._u([{key:"activator",fn:function(t){var r=t.on,o=t.attrs;return[n("v-btn",e._g(e._b({attrs:{text:"",color:"pink darken-1"}},"v-btn",o,!1),r),[e._v(" About/Help ")])]}}]),model:{value:e.dialog,callback:function(t){e.dialog=t},expression:"dialog"}},[n("v-card",[n("v-card-title",{staticClass:"headline"},[e._v(" 3DuF v1.1 ")]),n("v-card-text",[n("img",{attrs:{src:"img/cidar_logo.png",width:"100%"}}),e._v(" 3DuF is microfluidic design environment developed by "),n("a",{attrs:{href:"http://cidarlab.org",target:"_blank",rel:"noopener noreferrer"}},[e._v("CIDAR")]),e._v(". For any help or queries, please send an email to "),n("a",{attrs:{href:"mailto: 3dufhelp@gmail.com"}},[e._v("3dufhelp@gmail.com")]),e._v(". Source code, issue tracking and feature requests are available at "),n("a",{attrs:{href:"https://github.com/CIDARLAB/3DuF/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github")]),e._v(". "),n("hr"),e._v(" Developed by: Aaron Heuckroth, Joshua Lippai and Radhakrishna Sanka. "),n("hr"),e._v(" Error Tracking powered by "),n("a",{attrs:{href:"https://trackjs.com"}},[e._v("https://trackjs.com")]),e._v(". ")]),n("v-card-actions",[n("v-spacer"),n("v-btn",{attrs:{color:"green darken-1",text:""},on:{click:function(t){e.dialog=!1}}},[e._v(" Close ")])],1)],1)],1)},p_=[],v_={data:function(){return{dialog:!1}}},g_=v_,y_=(n("3833"),Object(Jw["a"])(g_,d_,p_,!1,null,"20543ec0",null)),m_=y_.exports;Zw()(y_,{VBtn:Qw["a"],VCard:eb["a"],VCardActions:tb["a"],VCardText:tb["b"],VCardTitle:tb["c"],VDialog:_b["a"],VSpacer:Ob["a"]});var w_=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("v-dialog",{attrs:{persistent:"","max-width":"600"},scopedSlots:e._u([{key:"activator",fn:function(t){var r=t.on,o=t.attrs;return[n("v-btn",e._g(e._b({attrs:{text:"",color:"pink darken-1"}},"v-btn",o,!1),r),[e._v(" Getting Started ")])]}}]),model:{value:e.dialog,callback:function(t){e.dialog=t},expression:"dialog"}},[n("v-card",[n("v-card-title",{staticClass:"headline"},[e._v(" Getting Started ")]),n("v-card-text",[n("h5",[e._v("Academic Publications:")]),n("p",[e._v(" Sanka, Radhakrishna, Joshua Lippai, Dinithi Samarasekera, Sarah Nemsick, and Douglas Densmore. "),n("br"),e._v("“3DμF - Interactive Design Environment for Continuous Flow Microfluidic Devices.” "),n("br"),e._v("Scientific Reports 9, no. 1 (December 2019). ")]),n("a",{attrs:{href:"https://doi.org/10.1038/s41598-019-45623-z"}},[e._v("https://doi.org/10.1038/s41598-019-45623-z")]),n("h5",[e._v("Videos")]),n("table",[n("tr",[n("iframe",{attrs:{width:"355",height:"200",src:"https://www.youtube.com/embed/05nU8eQ73U8",frameborder:"0",allow:"accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture",allowfullscreen:""}})]),n("tr",[n("td",{staticStyle:{"text-align":"center"}},[e._v("Introduction")])]),n("tr",[n("iframe",{attrs:{width:"355",height:"200",src:"https://www.youtube.com/embed/YOrnnZjma28",frameborder:"0",allow:"accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture",allowfullscreen:""}})]),n("tr",[n("td",{staticStyle:{"text-align":"center"}},[e._v("Long Tutorial")])])]),n("br"),n("p",[n("b",[e._v("Send in comments, suggestions and issues to")]),n("a",{attrs:{href:"mailto: 3dufhelp@gmail.com"}},[e._v("3dufhelp@gmail.com")]),e._v(". ")]),n("h5",[e._v("Designs From Literature")]),e._v(" Check the various designs from microfluidic literature recreated in 3DµF can be found "),n("a",{attrs:{href:"https://cidarlab.github.io/3DuF-Paper-Designs/",target:"_blank",rel:"noopener noreferrer"}},[e._v("here")]),e._v(". "),n("h5",[e._v("Usage")]),n("table",{staticClass:"tg"},[n("tr",[n("td",{staticClass:"tg-yw4l"},[n("pre",[e._v("del")])]),n("td",{staticClass:"tg-yw4l"},[e._v("- Delete Feature")])]),n("tr",[n("td",{staticClass:"tg-yw4l"},[n("pre",[e._v("F")])]),n("td",{staticClass:"tg-yw4l"},[e._v("- Reset Canvas")])]),n("tr",[n("td",{staticClass:"tg-yw4l"},[n("pre",[e._v("Esc")])]),n("td",{staticClass:"tg-yw4l"},[e._v("- Activate Select Tool/ Deselect Selected Components")])]),n("tr",[n("td",{staticClass:"tg-yw4l"},[n("pre",[e._v("ctrl+C , ctrl+V")])]),n("td",{staticClass:"tg-yw4l"},[e._v("- Activate Component Copy Mode")])]),n("tr",[n("td",{staticClass:"tg-yw4l"},[n("pre",[e._v("ctrl+Z")])]),n("td",{staticClass:"tg-yw4l"},[e._v("- Undo Last Edit")])]),n("tr",[n("td",{staticClass:"tg-yw4l"},[n("pre",[e._v("ctrl+A")])]),n("td",{staticClass:"tg-yw4l"},[e._v("- Select All")])]),n("tr",[n("td",{staticClass:"tg-yw4l"},[n("pre",[e._v("ctrl+S")])]),n("td",{staticClass:"tg-yw4l"},[e._v("- Save JSON file")])]),n("tr",[n("td",{staticClass:"tg-yw4l"},[n("pre",[e._v("left click")])]),n("td",{staticClass:"tg-yw4l"},[e._v("- Place Feature")])]),n("tr",[n("td",{staticClass:"tg-yw4l"},[n("pre",[e._v("right click")])]),n("td",{staticClass:"tg-yw4l"},[e._v("- Select Feature")])]),n("tr",[n("td",{staticClass:"tg-yw4l"},[n("pre",[e._v("mouse scroll")])]),n("td",{staticClass:"tg-yw4l"},[e._v("- Zoom")])]),n("tr",[n("td",{staticClass:"tg-yw4l"},[n("pre",[e._v("arrow keys")])]),n("td",{staticClass:"tg-yw4l"},[e._v("- Pan")])])])]),n("v-card-actions",[n("v-spacer"),n("v-btn",{attrs:{color:"green darken-1",text:""},on:{click:function(t){e.dialog=!1}}},[e._v(" Close ")])],1)],1)],1)},b_=[],__={data:function(){return{dialog:!1}}},P_=__,C_=Object(Jw["a"])(P_,w_,b_,!1,null,"1f13a03b",null),O_=C_.exports;Zw()(C_,{VBtn:Qw["a"],VCard:eb["a"],VCardActions:tb["a"],VCardText:tb["b"],VCardTitle:tb["c"],VDialog:_b["a"],VSpacer:Ob["a"]});var S_=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("Dialog",{attrs:{title:"Edit Device"},scopedSlots:e._u([{key:"content",fn:function(){return[n("tr",[n("h4",{staticClass:"text--primary subtitle-1"},[e._v("Rename:")]),n("td",[n("form",{attrs:{action:"#"}},[n("div",{staticClass:"mdl-textfield mdl-js-textfield mdl-textfield--floating-label"},[n("td",[n("v-text-field",{attrs:{type:"text",label:"Device Name"},model:{value:e.deviceName,callback:function(t){e.deviceName=t},expression:"deviceName"}})],1)])])])]),n("tr",[n("h4",{staticClass:"text--primary subtitle-1"},[e._v("Resize:")]),n("td",[n("form",{attrs:{action:"#"}},[n("div",{staticClass:"mdl-textfield mdl-js-textfield mdl-textfield--floating-label"},[n("v-text-field",{attrs:{pattern:"-?[0-9]*(\\.[0-9]+)?",label:"X-Span (mm)"},model:{value:e.xspan,callback:function(t){e.xspan=t},expression:"xspan"}})],1),n("div",{staticClass:"mdl-textfield mdl-js-textfield mdl-textfield--floating-label"},[n("v-text-field",{attrs:{pattern:"-?[0-9]*(\\.[0-9]+)?",label:"Y-Span (mm)"},model:{value:e.yspan,callback:function(t){e.yspan=t},expression:"yspan"}})],1)])])])]},proxy:!0},{key:"actions",fn:function(t){var r=t.callbacks;return[n("v-btn",{attrs:{dark:"",color:"green dark",elevation:"2"},on:{click:function(t){return r.close(e.onSave)}}},[e._v(" Save ")]),n("v-btn",{attrs:{dark:"",color:"red dark",elevation:"2"},on:{click:function(e){return r.close()}}},[e._v(" Cancel ")])]}}])})},R_=[],L_=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("v-dialog",{attrs:{persistent:"","max-width":"600"},scopedSlots:e._u([{key:"activator",fn:function(t){var r=t.on,o=t.attrs;return[n("v-btn",e._g(e._b({class:e.buttonClasses,attrs:{id:e.buttonID}},"v-btn",o,!1),r),[e._v(" "+e._s(e.title)+" ")])]}}]),model:{value:e.dialog,callback:function(t){e.dialog=t},expression:"dialog"}},[n("v-card",[n("v-card-title",{staticClass:"headline"},[e._v(" "+e._s(e.title)+" ")]),n("v-card-text",[e._t("content",(function(){return[e._v(" Dialog content goes here ")]}))],2),n("v-card-actions",[n("v-spacer"),e._t("actions",(function(){return[n("v-btn",{attrs:{color:"green darken-1",text:""},on:{click:function(t){return e.callbacks.close()}}},[e._v(" Close ")])]}),{callbacks:e.callbacks})],2)],1)],1)},k_=[],D_={name:"Dialog",props:{title:{type:String,required:!0},color:{type:String,required:!1,default:""},textColor:{type:String,required:!1,default:""}},data:function(){return{dialog:!1,callbacks:{}}},computed:{buttonID:function(){return this.title.toLowerCase().replace(" ","_")+"_dialog_button"},buttonClasses:function(){return[this.color&&this.color.length>0?this.color:"white",this.textColor&&this.textColor.length>0?this.textColor:"blue--text","mb-2","feature-button","button-row"]}},mounted:function(){var e=this,t=this;Wd.get().on(Wd.CLOSE_ALL_WINDOWS,(function(){t.dialog=!1})),l["default"].set(this.callbacks,"close",(function(t){t&&t(),e.dialog=!1}))}},T_=D_,F_=Object(Jw["a"])(T_,L_,k_,!1,null,"342e2370",null),E_=F_.exports;Zw()(F_,{VBtn:Qw["a"],VCard:eb["a"],VCardActions:tb["a"],VCardText:tb["b"],VCardTitle:tb["c"],VDialog:_b["a"],VSpacer:Ob["a"]});var W_={components:{Dialog:E_},data:function(){return{dialog:!1,deviceName:"",xspan:"",yspan:""}},mounted:function(){var e=this;setTimeout((function(){e.deviceName=zh.currentDevice.name,e.xspan=zh.currentDevice.getXSpan()/1e3,e.yspan=zh.currentDevice.getYSpan()/1e3}),100)},methods:{onSave:function(){zh.currentDevice.name=this.deviceName,zh.currentDevice.setXSpan(1e3*this.xspan),zh.currentDevice.setYSpan(1e3*this.yspan),zh.viewManager.view.showActiveLayer(),zh.viewManager.updateDevice(zh.currentDevice,!1)}}},x_=W_,N_=Object(Jw["a"])(x_,S_,R_,!1,null,"6f048958",null),I_=N_.exports;Zw()(N_,{VBtn:Qw["a"],VTextField:Sb["a"]});var M_=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("Dialog",{attrs:{title:"Edit Border"},scopedSlots:e._u([{key:"content",fn:function(){return[n("h4",[e._v("Drag Drop the DXF Border File:")]),n("div",{staticClass:"mdl-dialog__content"},[n("v-card",{staticClass:"mx-auto",attrs:{id:"border_import_panel",tile:"",outlined:"",width:"400",color:"grey lighten-2",height:"200"}}),n("br"),n("input",{ref:"file",staticClass:"upload",attrs:{id:"file_input",type:"file"},on:{change:function(t){return e.addFile()}}})],1)]},proxy:!0},{key:"actions",fn:function(t){var r=t.callbacks;return[n("v-btn",{attrs:{dark:"",color:"green dark"},on:{click:function(t){return e.importBorderButton()}}},[e._v(" Import Border ")]),n("v-btn",{attrs:{dark:"",color:"red dark"},on:{click:function(t){return e.deleteBorderButton()}}},[e._v(" Delete Border ")]),n("v-btn",{attrs:{color:"white"},on:{click:function(t){return r.close(e.onSave)}}},[e._v(" Okay ")])]}}])})},j_=[],A_=n("0d37"),V_=n.n(A_),B_={components:{Dialog:E_},data:function(){return{dialog:!1,dxfObject:[]}},mounted:function(){},methods:{onSave:function(){console.log("Saved data for Edit Border")},deleteBorderButton:function(){zh.viewManager.deleteBorder(),console.log("Delete border clicked"),zh.viewManager.generateBorder()},dragover:function(e){e.preventDefault(),e.currentTarget.classList.contains("bg-gray-300")||(e.currentTarget.classList.remove("bg-gray-100"),e.currentTarget.classList.add("bg-gray-300"))},dragleave:function(e){e.currentTarget.classList.add("bg-gray-100"),e.currentTarget.classList.remove("bg-gray-300")},drop:function(e){e.preventDefault(),this.$refs.file.files=e.dataTransfer.files,this.addFile(),e.currentTarget.classList.add("bg-gray-100"),e.currentTarget.classList.remove("bg-gray-300")},addFile:function(){var e=this,t=new FileReader;t.onload=function(n){e.loadDXFText(t.result)};var n=this.$refs.file.files[0];console.log(n.name),console.log(n.size),t.readAsText(n)},importBorderButton:function(){console.log("import button clicked"),zh.viewManager.deleteBorder(),zh.viewManager.importBorder(this.getDXFfile())},getDXFfile:function(){return this.$refs.dxfObject},loadDXFText:function(e){var t=new V_.a;try{this.$refs.dxfObject=t.parseSync(e),console.log("parsed dxf object",this.$refs.dxfObject)}catch(n){console.error(n.stack)}}}},G_=B_,z_=(n("62f3"),Object(Jw["a"])(G_,M_,j_,!1,null,"180b9f39",null)),U_=z_.exports;Zw()(z_,{VBtn:Qw["a"],VCard:eb["a"]});var K_=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("Dialog",{attrs:{title:"Import",color:"primary","text-color":"white--text"},scopedSlots:e._u([{key:"content",fn:function(){return[n("h4",[e._v("Drag and Drop the DXF File:")]),n("div",{staticClass:"mdl-dialog__content"},[n("v-card",{staticClass:"mx-auto",attrs:{id:"drop_box",tile:"",outlined:"",width:"400",color:"grey lighten-2",height:"200"}}),n("input",{ref:"file",staticClass:"upload",attrs:{id:"dxf_input",type:"file"}})],1)]},proxy:!0},{key:"actions",fn:function(t){var r=t.callbacks;return[n("v-btn",{staticClass:"white--text",attrs:{color:"green dark"},on:{click:function(e){return r.close()}}},[e._v(" Import ")]),n("v-btn",{staticClass:"white--text",attrs:{color:"red dark"},on:{click:function(e){return r.close()}}},[e._v(" Cancel ")])]}}])})},H_=[],Y_={components:{Dialog:E_},data:function(){return{dialog:!1}},methods:{onSave:function(){console.log("Saved data for Edit Device")}}},X_=Y_,q_=(n("3665"),Object(Jw["a"])(X_,K_,H_,!1,null,"89ff16ba",null)),J_=q_.exports;Zw()(q_,{VBtn:Qw["a"],VCard:eb["a"]});var $_=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("Dialog",{attrs:{title:"Insert Text"},scopedSlots:e._u([{key:"content",fn:function(){return[n("form",{attrs:{action:"#"}},[n("tr",[n("td",[n("v-card-text",[n("p",{staticClass:"text--primary subtitle-1"},[e._v("Text:")])])],1),n("td",{attrs:{width:"125px"}},[n("v-text-field",{model:{value:e.text,callback:function(t){e.text=t},expression:"text"}})],1),n("td",[n("v-card-text",[n("p",{staticClass:"text--primary subtitle-1"},[e._v("Font Size:")])])],1),n("td",{attrs:{width:"125px"}},[n("v-text-field",{attrs:{step:1,type:"number"},model:{value:e.fontSize,callback:function(t){e.fontSize=t},expression:"fontSize"}})],1)]),n("tr",[n("td",{attrs:{width:"100px"}},[n("v-card-text")],1),n("td",[n("v-card-text")],1),n("td",[n("v-card-text",[n("p",{staticClass:"text--primary subtitle-1"},[e._v("Select Layer:")])])],1),n("td",[n("v-select",{attrs:{items:e.displayLayers,label:"Dropdown"}})],1)])])]},proxy:!0},{key:"actions",fn:function(t){var r=t.callbacks;return[n("v-spacer"),n("v-col",[n("v-btn",{staticClass:"pa-2",style:{right:"75%",transform:"translateX(-100%)"},attrs:{color:"red darken-1",dark:""},on:{click:function(e){return r.close()}}},[e._v(" Cancel ")]),n("v-spacer")],1),n("v-btn",{staticClass:"pa-2",style:{right:"30%",transform:"translateX(-30%)"},attrs:{color:"green darken-1",dark:""},on:{click:function(t){return r.close(e.insertText)}}},[e._v(" Insert ")])]}}])},[n("v-card-title",{staticClass:"h6"},[e._v("Insert")])],1)},Z_=[],Q_={components:{Dialog:E_},data:function(){return{text:"",fontSize:"12",layers:[]}},computed:{displayLayers:function(){var e=this.layers.map((function(e,t){var n="Layer ".concat(Math.floor(t/3)+1," - ").concat(e.name);return n}));return e}},mounted:function(){var e=this;setTimeout((function(){e.layers=zh.currentDevice.layers,e.fontSize=zh.viewManager.tools.InsertTextTool.fontSize}),1e3)},methods:{insertText:function(){zh.viewManager.tools.InsertTextTool.text=this.text,zh.viewManager.tools.fontSize=parseInt(this.fontSize),zh.viewManager.activateTool("InsertTextTool")}}},eP=Q_,tP=n("b974"),nP=Object(Jw["a"])(eP,$_,Z_,!1,null,null,null),rP=nP.exports;Zw()(nP,{VBtn:Qw["a"],VCardText:tb["b"],VCardTitle:tb["c"],VCol:bb["a"],VSelect:tP["a"],VSpacer:Ob["a"],VTextField:Sb["a"]});var oP=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("v-card",{attrs:{elevation:"0"}},[n("v-card-title",{staticClass:"py-2"},[n("span",[e._v("Levels")]),n("v-btn",{attrs:{icon:"",small:"",fab:"",color:"primary"},on:{click:e.addLevel}},[n("v-icon",[e._v("mdi-plus")])],1)],1),n("v-card-text",{staticClass:"px-1"},e._l(e.levels,(function(t){return n("div",{key:t.id,staticClass:"my-1 mx-3"},[n("v-btn",{attrs:{disabled:0===t.id,icon:"",small:""},on:{click:function(n){return e.deleteLevel(t)}}},[n("v-icon",[e._v("mdi-delete")])],1),n("v-btn-toggle",{attrs:{"v-model":t.mode,tile:"",borderless:""}},[n("v-btn",{attrs:{small:"",color:e.getButtonColor(t,0)},on:{click:function(n){return e.layerModeClicked(t,0)}}},[n("span",[e._v("Flow")])]),n("v-btn",{attrs:{small:"",color:e.getButtonColor(t,1)},on:{click:function(n){return e.layerModeClicked(t,1)}}},[n("span",[e._v("Ctrl")])]),n("v-btn",{attrs:{small:"",color:e.getButtonColor(t,2)},on:{click:function(n){return e.layerModeClicked(t,2)}}},[n("span",[e._v("Int")])])],1)],1)})),0)],1)},iP=[],aP={name:"LayerToolbar",data:function(){return{selectedMode:0,disabled:!1,renderLayers:[],layers:[],levels:[],toggleMode:[0]}},computed:{selectedLevel:function(){var e=zh.viewManager.activeRenderLayer,t=e%3;return e-=t,e/3}},watch:{layers:{handler:function(e){console.log("layers changed",e);var t=[];for(var n in e)n%3==0&&t.push({id:n/3,mode:0});this.levels=t}}},mounted:function(){var e=this;setTimeout((function(){e.layers=zh.currentDevice.layers}),1e3)},methods:{addLevel:function(){zh.viewManager.createNewLayerBlock()},layerModeClicked:function(e,t){for(var n in this.levels)this.levels[n].id==e.id?this.levels[n].mode=t:this.levels[n].mode=null;this.levels[e.id].mode=t,zh.viewManager.setActiveRenderLayer(3*e.id+t)},deleteLevel:function(e){zh.viewManager.deleteLayerBlock(e.id)},getButtonColor:function(e,t){return e.id!=this.selectedLevel?"":e.id==this.selectedLevel&&e.mode==t?0==t?"blue white--text":1==t?"red white--text":"green white--text":""}}},lP=aP,sP=(n("2a51"),n("a609")),uP=n("132d"),cP=Object(Jw["a"])(lP,oP,iP,!1,null,"088f6ffc",null),hP=cP.exports;Zw()(cP,{VBtn:Qw["a"],VBtnToggle:sP["a"],VCard:eb["a"],VCardText:tb["b"],VCardTitle:tb["c"],VIcon:uP["a"]});var fP=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[n("v-divider"),n("v-card",{attrs:{elevation:"0"}},[n("v-card-text",{staticClass:"px-1"},[n("ConnectionPropertyDrawer")],1),n("v-card-title",{staticClass:"py-2"},[n("span",[e._v("Features")])]),n("v-card-text",{staticClass:"px-1"},[n("PropertyDrawer",{attrs:{mint:"CHANNEL",spec:e.channelSpec}}),n("PropertyDrawer",{attrs:{mint:"ROUNDED CHANNEL",spec:e.roundedChannelSpec}}),n("PropertyDrawer",{attrs:{mint:"TRANSITION",spec:e.transitionSpec}}),n("PropertyDrawer",{attrs:{mint:"ALIGNMENT MARKS",spec:e.alignmentMarksSpec}})],1)],1),e._l(Object.keys(e.toolTree),(function(t){return n("v-card",{key:t,attrs:{elevation:"0"}},[n("v-card-title",{staticClass:"py-2"},[n("span",[e._v(e._s(t))])]),n("v-card-text",{staticClass:"px-1"},e._l(e.toolTree[t],(function(e){return n("PropertyDrawer",{key:e,attrs:{mint:e}})})),1),n("v-divider")],1)}))],2)},dP=[],pP=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"property-drawer-parent"},[n("v-btn",{ref:"activator",class:e.buttonClasses,attrs:{medium:""},on:{click:function(t){return e.activateTool()}}},[e._v(e._s(e.shortenedMINT)+" "),n("v-btn",{staticClass:"setting-icon-button",attrs:{icon:"",color:"blue",right:"",small:""},on:{click:function(t){return t.stopPropagation(),e.showProperties()}}},[n("v-icon",[e._v("mdi-cog")])],1)],1),n("div",{ref:"drawer",staticClass:"property-drawer"},[e.showDrawer?n("v-card",[n("v-card-title",{staticClass:"subtitle-1 pb-0"},[e._v(e._s(e.title))]),n("v-card-text",[n("PropertyBlock",{attrs:{title:e.mint,spec:e.storedSpec},on:{update:e.updateParameter}})],1)],1):e._e()],1)],1)},vP=[],gP={name:"PropertyDrawer",components:{PropertyBlock:Ub},props:{mint:{type:String,required:!0},spec:{type:Array,required:!1,default:function(){return[{min:0,max:110,units:"",value:0}]}},activatedColor:{type:String,required:!1,default:"primary"},activatedTextColor:{type:String,required:!1,default:"white--text"}},data:function(){return{storedSpec:[{min:0,max:110,units:"",value:0}],activated:!1,activeTool:null,title:"",showDrawer:!1}},computed:{specClone:function(){var e=JSON.parse(JSON.stringify(this.storedSpec));return e},buttonClasses:function(){return[this.activated?this.activatedColor:"white",this.activated?this.activatedTextColor:"blue--text","mx-auto","my-1","btn"]},shortenedMINT:function(){return this.mint.substring(0,15)}},mounted:function(){Wd.get().on(Wd.CLOSE_ALL_WINDOWS,(function(){this.dialog=!1})),Wd.get().on(Wd.NAVBAR_SCROLL_EVENT,this.setDrawerPosition)},methods:{showProperties:function(){this.showDrawer=!this.showDrawer;var e=document.querySelector("[data-app]");e||console.error("Could not find [data-app] element"),this.setDrawerPosition(),e.appendChild(this.$refs.drawer)},activateTool:function(){this.activated=!this.activated,this.activated?(this.storedSpec=this.spec,this.storedSpec=this.computedSpecForMINT(this.mint),this.activeTool=zh.viewManager.activateComponentPlacementTool(this.mint,this.storedSpec),this.showProperties()):(zh.viewManager.deactivateComponentPlacementTool(),this.activeTool=null,this.showDrawer=!1)},handleScroll:function(){this.setDrawerPosition()},setDrawerPosition:function(){if(this.activated){var e=this.$refs.activator.$el.getBoundingClientRect();this.$refs.drawer.style.top=e.bottom-e.height+"px"}},updateParameter:function(e,t){console.log("activeTool",this.activeTool,e,t)},computedSpecForMINT:function(e){var t=Tc.getDefinitionForMINT(e),n=[];for(var r in t.heritable){var o={min:t.minimum[r],max:t.maximum[r],value:t.defaults[r],units:t.units[r],steps:(t.maximum[r]-t.minimum[r])/10,name:r};n.push(o)}return n}}},yP=gP,mP=(n("6aa7"),Object(Jw["a"])(yP,pP,vP,!1,null,"420c4732",null)),wP=mP.exports;Zw()(mP,{VBtn:Qw["a"],VCard:eb["a"],VCardText:tb["b"],VCardTitle:tb["c"],VIcon:uP["a"]});var bP=function(){var e=this,t=e.$createElement,r=e._self._c||t;return r("div",{staticClass:"property-drawer-parent"},[r("v-btn",{ref:"activator",class:e.buttonClasses,on:{click:function(t){return e.showProperties()}}},[e._v("Connection ")]),r("div",{ref:"drawer",staticClass:"connection-property-drawer"},[e.activated?r("v-card",[r("v-card-text",[r("v-row",{attrs:{justify:"center"}},[r("v-expansion-panels",{attrs:{accordion:""}},[r("v-expansion-panel",[r("v-expansion-panel-header",[e._v(e._s(e.current_connection_suggestion))]),r("v-expansion-panel-content",[r("v-row",[r("v-col",[r("v-card-text",[r("v-row",{attrs:{cols:"2"}},[r("PropertyBlock",{attrs:{title:"Connection",spec:e.spec},on:{update:e.updateParameter}})],1)],1)],1),r("v-divider",{attrs:{vertical:"",inset:""}}),r("v-col",[r("v-card-text",[r("v-row",[r("v-text-field",{staticClass:"special",attrs:{disabled:!e.connectionRenameMode,label:"Connection Name"},scopedSlots:e._u([{key:"append",fn:function(){return[e.connectionRenameMode?e._e():r("v-btn",{staticClass:"ma-0",attrs:{disabled:e.connectionRenameMode,color:"primary",icon:"","x-small":"",depressed:"",tile:""},on:{click:function(t){e.connectionRenameMode=!0}}},[r("v-icon",[e._v("mdi-pencil")])],1),e.connectionRenameMode?r("v-btn",{staticClass:"ma-0",attrs:{disabled:!e.connectionRenameMode,icon:"","x-small":"",depressed:"",tile:"",color:"green"},on:{click:e.renameConnection}},[r("v-icon",[e._v("mdi-check")])],1):e._e(),e.connectionRenameMode?r("v-btn",{staticClass:"ma-0",attrs:{disabled:!e.connectionRenameMode,color:"red",icon:"",tile:"","x-small":"",depressed:""},on:{click:e.renameConnectionCancel}},[r("v-icon",[e._v("mdi-cancel")])],1):e._e()]},proxy:!0}],null,!1,2922280259),model:{value:e.connectionName,callback:function(t){e.connectionName=t},expression:"connectionName"}})],1),r("v-row",{attrs:{"no-gutters":""}},[e._v(" Source: "),e._l(e.sources,(function(t){return r("v-col",{key:t.name,attrs:{cols:"4"}},[e.chip1?r("v-chip",{attrs:{small:"",close:"",color:"green","text-color":"white",closable:""},on:{"click:close":function(t){e.chip1=!1}}},[e._v(e._s(t.name))]):e._e()],1)}))],2),r("v-row",{attrs:{"no-gutters":""}},[e._v(" Sinks: ")]),r("v-row",{attrs:{"no-gutters":""}},e._l(e.sinks,(function(t){return r("v-col",{key:t.name,attrs:{cols:"4"}},[e.chip2?r("v-chip",{attrs:{small:"",close:"",color:"green","text-color":"white"},on:{"click:close":function(t){e.chip2=!1}}},[e._v(e._s(t.name))]):e._e()],1)})),1)],1)],1),r("v-divider",{attrs:{vertical:"",inset:""}}),r("v-col",{attrs:{cols:"3"}},[r("v-row",{attrs:{"no-gutters":""}},[e._v(" Connection Profile ")]),r("v-row",{attrs:{"no-gutters":""}},[r("v-select",{attrs:{items:e.connectionProfiles},model:{value:e.selectedProfile,callback:function(t){e.selectedProfile=t},expression:"selectedProfile"}})],1),r("v-row",[r("v-img",{staticClass:"image-placeholder",attrs:{"max-height":"150","max-width":"150",src:n("384c")}})],1)],1)],1)],1)],1)],1)],1)],1)],1):e._e()],1)],1)},_P=[],PP=(n("6dfc"),n("4a7a")),CP=n.n(PP);l["default"].component("v-select",CP.a);var OP={name:"ConnectionPropertyDrawer",components:{PropertyBlock:Ub},icons:{iconfont:"mdi"},data:function(){return{connectionName:"NewConnection",connectionRenameMode:!1,spec:this.computedSpec("Connection"),chip1:!0,chip2:!0,activated:!1,isEditing:!1,connectionProfiles:[],selectedProfile:"",previews:{CHANNEL:"@/assets/technology/CHANNEL.png"},activeTool:null}},computed:{buttonClasses:function(){return[this.activated?this.activatedColor:"white",this.activated?this.activatedTextColor:"blue--text","mx-auto","my-1","btn"]},sinks:function(){if(null===this.activeTool)return[];console.log("sinks",this.activeTool.sinks);for(var e=[],t=0;t=e.length?{done:!0}:{done:!1,value:e[r++]}},e:function(e){throw e},f:o}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var i,a=!0,l=!1;return{s:function(){n=n.call(e)},n:function(){var e=n.next();return a=e.done,e},e:function(e){l=!0,i=e},f:function(){try{a||null==n.return||n.return()}finally{if(l)throw i}}}}function $P(e,t){if(e){if("string"===typeof e)return ZP(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?ZP(e,t):void 0}}function ZP(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n 0) {\n addClass(element, className);\n setTimeout(function () {\n removeClass(element, className);\n }, duration);\n }\n }\n // Limits a value to 0 - 100\n function limit(a) {\n return Math.max(Math.min(a, 100), 0);\n }\n // Wraps a variable as an array, if it isn't one yet.\n // Note that an input array is returned by reference!\n function asArray(a) {\n return Array.isArray(a) ? a : [a];\n }\n // Counts decimals\n function countDecimals(numStr) {\n numStr = String(numStr);\n var pieces = numStr.split(\".\");\n return pieces.length > 1 ? pieces[1].length : 0;\n }\n // http://youmightnotneedjquery.com/#add_class\n function addClass(el, className) {\n if (el.classList && !/\\s/.test(className)) {\n el.classList.add(className);\n }\n else {\n el.className += \" \" + className;\n }\n }\n // http://youmightnotneedjquery.com/#remove_class\n function removeClass(el, className) {\n if (el.classList && !/\\s/.test(className)) {\n el.classList.remove(className);\n }\n else {\n el.className = el.className.replace(new RegExp(\"(^|\\\\b)\" + className.split(\" \").join(\"|\") + \"(\\\\b|$)\", \"gi\"), \" \");\n }\n }\n // https://plainjs.com/javascript/attributes/adding-removing-and-testing-for-classes-9/\n function hasClass(el, className) {\n return el.classList ? el.classList.contains(className) : new RegExp(\"\\\\b\" + className + \"\\\\b\").test(el.className);\n }\n // https://developer.mozilla.org/en-US/docs/Web/API/Window/scrollY#Notes\n function getPageOffset(doc) {\n var supportPageOffset = window.pageXOffset !== undefined;\n var isCSS1Compat = (doc.compatMode || \"\") === \"CSS1Compat\";\n var x = supportPageOffset\n ? window.pageXOffset\n : isCSS1Compat\n ? doc.documentElement.scrollLeft\n : doc.body.scrollLeft;\n var y = supportPageOffset\n ? window.pageYOffset\n : isCSS1Compat\n ? doc.documentElement.scrollTop\n : doc.body.scrollTop;\n return {\n x: x,\n y: y,\n };\n }\n // we provide a function to compute constants instead\n // of accessing window.* as soon as the module needs it\n // so that we do not compute anything if not needed\n function getActions() {\n // Determine the events to bind. IE11 implements pointerEvents without\n // a prefix, which breaks compatibility with the IE10 implementation.\n return window.navigator.pointerEnabled\n ? {\n start: \"pointerdown\",\n move: \"pointermove\",\n end: \"pointerup\",\n }\n : window.navigator.msPointerEnabled\n ? {\n start: \"MSPointerDown\",\n move: \"MSPointerMove\",\n end: \"MSPointerUp\",\n }\n : {\n start: \"mousedown touchstart\",\n move: \"mousemove touchmove\",\n end: \"mouseup touchend\",\n };\n }\n // https://github.com/WICG/EventListenerOptions/blob/gh-pages/explainer.md\n // Issue #785\n function getSupportsPassive() {\n var supportsPassive = false;\n /* eslint-disable */\n try {\n var opts = Object.defineProperty({}, \"passive\", {\n get: function () {\n supportsPassive = true;\n },\n });\n // @ts-ignore\n window.addEventListener(\"test\", null, opts);\n }\n catch (e) { }\n /* eslint-enable */\n return supportsPassive;\n }\n function getSupportsTouchActionNone() {\n return window.CSS && CSS.supports && CSS.supports(\"touch-action\", \"none\");\n }\n //endregion\n //region Range Calculation\n // Determine the size of a sub-range in relation to a full range.\n function subRangeRatio(pa, pb) {\n return 100 / (pb - pa);\n }\n // (percentage) How many percent is this value of this range?\n function fromPercentage(range, value, startRange) {\n return (value * 100) / (range[startRange + 1] - range[startRange]);\n }\n // (percentage) Where is this value on this range?\n function toPercentage(range, value) {\n return fromPercentage(range, range[0] < 0 ? value + Math.abs(range[0]) : value - range[0], 0);\n }\n // (value) How much is this percentage on this range?\n function isPercentage(range, value) {\n return (value * (range[1] - range[0])) / 100 + range[0];\n }\n function getJ(value, arr) {\n var j = 1;\n while (value >= arr[j]) {\n j += 1;\n }\n return j;\n }\n // (percentage) Input a value, find where, on a scale of 0-100, it applies.\n function toStepping(xVal, xPct, value) {\n if (value >= xVal.slice(-1)[0]) {\n return 100;\n }\n var j = getJ(value, xVal);\n var va = xVal[j - 1];\n var vb = xVal[j];\n var pa = xPct[j - 1];\n var pb = xPct[j];\n return pa + toPercentage([va, vb], value) / subRangeRatio(pa, pb);\n }\n // (value) Input a percentage, find where it is on the specified range.\n function fromStepping(xVal, xPct, value) {\n // There is no range group that fits 100\n if (value >= 100) {\n return xVal.slice(-1)[0];\n }\n var j = getJ(value, xPct);\n var va = xVal[j - 1];\n var vb = xVal[j];\n var pa = xPct[j - 1];\n var pb = xPct[j];\n return isPercentage([va, vb], (value - pa) * subRangeRatio(pa, pb));\n }\n // (percentage) Get the step that applies at a certain value.\n function getStep(xPct, xSteps, snap, value) {\n if (value === 100) {\n return value;\n }\n var j = getJ(value, xPct);\n var a = xPct[j - 1];\n var b = xPct[j];\n // If 'snap' is set, steps are used as fixed points on the slider.\n if (snap) {\n // Find the closest position, a or b.\n if (value - a > (b - a) / 2) {\n return b;\n }\n return a;\n }\n if (!xSteps[j - 1]) {\n return value;\n }\n return xPct[j - 1] + closest(value - xPct[j - 1], xSteps[j - 1]);\n }\n //endregion\n //region Spectrum\n var Spectrum = /** @class */ (function () {\n function Spectrum(entry, snap, singleStep) {\n this.xPct = [];\n this.xVal = [];\n this.xSteps = [];\n this.xNumSteps = [];\n this.xHighestCompleteStep = [];\n this.xSteps = [singleStep || false];\n this.xNumSteps = [false];\n this.snap = snap;\n var index;\n var ordered = [];\n // Map the object keys to an array.\n Object.keys(entry).forEach(function (index) {\n ordered.push([asArray(entry[index]), index]);\n });\n // Sort all entries by value (numeric sort).\n ordered.sort(function (a, b) {\n return a[0][0] - b[0][0];\n });\n // Convert all entries to subranges.\n for (index = 0; index < ordered.length; index++) {\n this.handleEntryPoint(ordered[index][1], ordered[index][0]);\n }\n // Store the actual step values.\n // xSteps is sorted in the same order as xPct and xVal.\n this.xNumSteps = this.xSteps.slice(0);\n // Convert all numeric steps to the percentage of the subrange they represent.\n for (index = 0; index < this.xNumSteps.length; index++) {\n this.handleStepPoint(index, this.xNumSteps[index]);\n }\n }\n Spectrum.prototype.getDistance = function (value) {\n var distances = [];\n for (var index = 0; index < this.xNumSteps.length - 1; index++) {\n distances[index] = fromPercentage(this.xVal, value, index);\n }\n return distances;\n };\n // Calculate the percentual distance over the whole scale of ranges.\n // direction: 0 = backwards / 1 = forwards\n Spectrum.prototype.getAbsoluteDistance = function (value, distances, direction) {\n var xPct_index = 0;\n // Calculate range where to start calculation\n if (value < this.xPct[this.xPct.length - 1]) {\n while (value > this.xPct[xPct_index + 1]) {\n xPct_index++;\n }\n }\n else if (value === this.xPct[this.xPct.length - 1]) {\n xPct_index = this.xPct.length - 2;\n }\n // If looking backwards and the value is exactly at a range separator then look one range further\n if (!direction && value === this.xPct[xPct_index + 1]) {\n xPct_index++;\n }\n if (distances === null) {\n distances = [];\n }\n var start_factor;\n var rest_factor = 1;\n var rest_rel_distance = distances[xPct_index];\n var range_pct = 0;\n var rel_range_distance = 0;\n var abs_distance_counter = 0;\n var range_counter = 0;\n // Calculate what part of the start range the value is\n if (direction) {\n start_factor = (value - this.xPct[xPct_index]) / (this.xPct[xPct_index + 1] - this.xPct[xPct_index]);\n }\n else {\n start_factor = (this.xPct[xPct_index + 1] - value) / (this.xPct[xPct_index + 1] - this.xPct[xPct_index]);\n }\n // Do until the complete distance across ranges is calculated\n while (rest_rel_distance > 0) {\n // Calculate the percentage of total range\n range_pct = this.xPct[xPct_index + 1 + range_counter] - this.xPct[xPct_index + range_counter];\n // Detect if the margin, padding or limit is larger then the current range and calculate\n if (distances[xPct_index + range_counter] * rest_factor + 100 - start_factor * 100 > 100) {\n // If larger then take the percentual distance of the whole range\n rel_range_distance = range_pct * start_factor;\n // Rest factor of relative percentual distance still to be calculated\n rest_factor = (rest_rel_distance - 100 * start_factor) / distances[xPct_index + range_counter];\n // Set start factor to 1 as for next range it does not apply.\n start_factor = 1;\n }\n else {\n // If smaller or equal then take the percentual distance of the calculate percentual part of that range\n rel_range_distance = ((distances[xPct_index + range_counter] * range_pct) / 100) * rest_factor;\n // No rest left as the rest fits in current range\n rest_factor = 0;\n }\n if (direction) {\n abs_distance_counter = abs_distance_counter - rel_range_distance;\n // Limit range to first range when distance becomes outside of minimum range\n if (this.xPct.length + range_counter >= 1) {\n range_counter--;\n }\n }\n else {\n abs_distance_counter = abs_distance_counter + rel_range_distance;\n // Limit range to last range when distance becomes outside of maximum range\n if (this.xPct.length - range_counter >= 1) {\n range_counter++;\n }\n }\n // Rest of relative percentual distance still to be calculated\n rest_rel_distance = distances[xPct_index + range_counter] * rest_factor;\n }\n return value + abs_distance_counter;\n };\n Spectrum.prototype.toStepping = function (value) {\n value = toStepping(this.xVal, this.xPct, value);\n return value;\n };\n Spectrum.prototype.fromStepping = function (value) {\n return fromStepping(this.xVal, this.xPct, value);\n };\n Spectrum.prototype.getStep = function (value) {\n value = getStep(this.xPct, this.xSteps, this.snap, value);\n return value;\n };\n Spectrum.prototype.getDefaultStep = function (value, isDown, size) {\n var j = getJ(value, this.xPct);\n // When at the top or stepping down, look at the previous sub-range\n if (value === 100 || (isDown && value === this.xPct[j - 1])) {\n j = Math.max(j - 1, 1);\n }\n return (this.xVal[j] - this.xVal[j - 1]) / size;\n };\n Spectrum.prototype.getNearbySteps = function (value) {\n var j = getJ(value, this.xPct);\n return {\n stepBefore: {\n startValue: this.xVal[j - 2],\n step: this.xNumSteps[j - 2],\n highestStep: this.xHighestCompleteStep[j - 2],\n },\n thisStep: {\n startValue: this.xVal[j - 1],\n step: this.xNumSteps[j - 1],\n highestStep: this.xHighestCompleteStep[j - 1],\n },\n stepAfter: {\n startValue: this.xVal[j],\n step: this.xNumSteps[j],\n highestStep: this.xHighestCompleteStep[j],\n },\n };\n };\n Spectrum.prototype.countStepDecimals = function () {\n var stepDecimals = this.xNumSteps.map(countDecimals);\n return Math.max.apply(null, stepDecimals);\n };\n Spectrum.prototype.hasNoSize = function () {\n return this.xVal[0] === this.xVal[this.xVal.length - 1];\n };\n // Outside testing\n Spectrum.prototype.convert = function (value) {\n return this.getStep(this.toStepping(value));\n };\n Spectrum.prototype.handleEntryPoint = function (index, value) {\n var percentage;\n // Covert min/max syntax to 0 and 100.\n if (index === \"min\") {\n percentage = 0;\n }\n else if (index === \"max\") {\n percentage = 100;\n }\n else {\n percentage = parseFloat(index);\n }\n // Check for correct input.\n if (!isNumeric(percentage) || !isNumeric(value[0])) {\n throw new Error(\"noUiSlider: 'range' value isn't numeric.\");\n }\n // Store values.\n this.xPct.push(percentage);\n this.xVal.push(value[0]);\n var value1 = Number(value[1]);\n // NaN will evaluate to false too, but to keep\n // logging clear, set step explicitly. Make sure\n // not to override the 'step' setting with false.\n if (!percentage) {\n if (!isNaN(value1)) {\n this.xSteps[0] = value1;\n }\n }\n else {\n this.xSteps.push(isNaN(value1) ? false : value1);\n }\n this.xHighestCompleteStep.push(0);\n };\n Spectrum.prototype.handleStepPoint = function (i, n) {\n // Ignore 'false' stepping.\n if (!n) {\n return;\n }\n // Step over zero-length ranges (#948);\n if (this.xVal[i] === this.xVal[i + 1]) {\n this.xSteps[i] = this.xHighestCompleteStep[i] = this.xVal[i];\n return;\n }\n // Factor to range ratio\n this.xSteps[i] =\n fromPercentage([this.xVal[i], this.xVal[i + 1]], n, 0) / subRangeRatio(this.xPct[i], this.xPct[i + 1]);\n var totalSteps = (this.xVal[i + 1] - this.xVal[i]) / this.xNumSteps[i];\n var highestStep = Math.ceil(Number(totalSteps.toFixed(3)) - 1);\n var step = this.xVal[i] + this.xNumSteps[i] * highestStep;\n this.xHighestCompleteStep[i] = step;\n };\n return Spectrum;\n }());\n //endregion\n //region Options\n /*\tEvery input option is tested and parsed. This will prevent\n endless validation in internal methods. These tests are\n structured with an item for every option available. An\n option can be marked as required by setting the 'r' flag.\n The testing function is provided with three arguments:\n - The provided value for the option;\n - A reference to the options object;\n - The name for the option;\n\n The testing function returns false when an error is detected,\n or true when everything is OK. It can also modify the option\n object, to make sure all values can be correctly looped elsewhere. */\n //region Defaults\n var defaultFormatter = {\n to: function (value) {\n return value === undefined ? \"\" : value.toFixed(2);\n },\n from: Number,\n };\n var cssClasses = {\n target: \"target\",\n base: \"base\",\n origin: \"origin\",\n handle: \"handle\",\n handleLower: \"handle-lower\",\n handleUpper: \"handle-upper\",\n touchArea: \"touch-area\",\n horizontal: \"horizontal\",\n vertical: \"vertical\",\n background: \"background\",\n connect: \"connect\",\n connects: \"connects\",\n ltr: \"ltr\",\n rtl: \"rtl\",\n textDirectionLtr: \"txt-dir-ltr\",\n textDirectionRtl: \"txt-dir-rtl\",\n draggable: \"draggable\",\n drag: \"state-drag\",\n tap: \"state-tap\",\n active: \"active\",\n tooltip: \"tooltip\",\n pips: \"pips\",\n pipsHorizontal: \"pips-horizontal\",\n pipsVertical: \"pips-vertical\",\n marker: \"marker\",\n markerHorizontal: \"marker-horizontal\",\n markerVertical: \"marker-vertical\",\n markerNormal: \"marker-normal\",\n markerLarge: \"marker-large\",\n markerSub: \"marker-sub\",\n value: \"value\",\n valueHorizontal: \"value-horizontal\",\n valueVertical: \"value-vertical\",\n valueNormal: \"value-normal\",\n valueLarge: \"value-large\",\n valueSub: \"value-sub\",\n };\n // Namespaces of internal event listeners\n var INTERNAL_EVENT_NS = {\n tooltips: \".__tooltips\",\n aria: \".__aria\",\n };\n //endregion\n function testStep(parsed, entry) {\n if (!isNumeric(entry)) {\n throw new Error(\"noUiSlider: 'step' is not numeric.\");\n }\n // The step option can still be used to set stepping\n // for linear sliders. Overwritten if set in 'range'.\n parsed.singleStep = entry;\n }\n function testKeyboardPageMultiplier(parsed, entry) {\n if (!isNumeric(entry)) {\n throw new Error(\"noUiSlider: 'keyboardPageMultiplier' is not numeric.\");\n }\n parsed.keyboardPageMultiplier = entry;\n }\n function testKeyboardMultiplier(parsed, entry) {\n if (!isNumeric(entry)) {\n throw new Error(\"noUiSlider: 'keyboardMultiplier' is not numeric.\");\n }\n parsed.keyboardMultiplier = entry;\n }\n function testKeyboardDefaultStep(parsed, entry) {\n if (!isNumeric(entry)) {\n throw new Error(\"noUiSlider: 'keyboardDefaultStep' is not numeric.\");\n }\n parsed.keyboardDefaultStep = entry;\n }\n function testRange(parsed, entry) {\n // Filter incorrect input.\n if (typeof entry !== \"object\" || Array.isArray(entry)) {\n throw new Error(\"noUiSlider: 'range' is not an object.\");\n }\n // Catch missing start or end.\n if (entry.min === undefined || entry.max === undefined) {\n throw new Error(\"noUiSlider: Missing 'min' or 'max' in 'range'.\");\n }\n parsed.spectrum = new Spectrum(entry, parsed.snap || false, parsed.singleStep);\n }\n function testStart(parsed, entry) {\n entry = asArray(entry);\n // Validate input. Values aren't tested, as the public .val method\n // will always provide a valid location.\n if (!Array.isArray(entry) || !entry.length) {\n throw new Error(\"noUiSlider: 'start' option is incorrect.\");\n }\n // Store the number of handles.\n parsed.handles = entry.length;\n // When the slider is initialized, the .val method will\n // be called with the start options.\n parsed.start = entry;\n }\n function testSnap(parsed, entry) {\n if (typeof entry !== \"boolean\") {\n throw new Error(\"noUiSlider: 'snap' option must be a boolean.\");\n }\n // Enforce 100% stepping within subranges.\n parsed.snap = entry;\n }\n function testAnimate(parsed, entry) {\n if (typeof entry !== \"boolean\") {\n throw new Error(\"noUiSlider: 'animate' option must be a boolean.\");\n }\n // Enforce 100% stepping within subranges.\n parsed.animate = entry;\n }\n function testAnimationDuration(parsed, entry) {\n if (typeof entry !== \"number\") {\n throw new Error(\"noUiSlider: 'animationDuration' option must be a number.\");\n }\n parsed.animationDuration = entry;\n }\n function testConnect(parsed, entry) {\n var connect = [false];\n var i;\n // Map legacy options\n if (entry === \"lower\") {\n entry = [true, false];\n }\n else if (entry === \"upper\") {\n entry = [false, true];\n }\n // Handle boolean options\n if (entry === true || entry === false) {\n for (i = 1; i < parsed.handles; i++) {\n connect.push(entry);\n }\n connect.push(false);\n }\n // Reject invalid input\n else if (!Array.isArray(entry) || !entry.length || entry.length !== parsed.handles + 1) {\n throw new Error(\"noUiSlider: 'connect' option doesn't match handle count.\");\n }\n else {\n connect = entry;\n }\n parsed.connect = connect;\n }\n function testOrientation(parsed, entry) {\n // Set orientation to an a numerical value for easy\n // array selection.\n switch (entry) {\n case \"horizontal\":\n parsed.ort = 0;\n break;\n case \"vertical\":\n parsed.ort = 1;\n break;\n default:\n throw new Error(\"noUiSlider: 'orientation' option is invalid.\");\n }\n }\n function testMargin(parsed, entry) {\n if (!isNumeric(entry)) {\n throw new Error(\"noUiSlider: 'margin' option must be numeric.\");\n }\n // Issue #582\n if (entry === 0) {\n return;\n }\n parsed.margin = parsed.spectrum.getDistance(entry);\n }\n function testLimit(parsed, entry) {\n if (!isNumeric(entry)) {\n throw new Error(\"noUiSlider: 'limit' option must be numeric.\");\n }\n parsed.limit = parsed.spectrum.getDistance(entry);\n if (!parsed.limit || parsed.handles < 2) {\n throw new Error(\"noUiSlider: 'limit' option is only supported on linear sliders with 2 or more handles.\");\n }\n }\n function testPadding(parsed, entry) {\n var index;\n if (!isNumeric(entry) && !Array.isArray(entry)) {\n throw new Error(\"noUiSlider: 'padding' option must be numeric or array of exactly 2 numbers.\");\n }\n if (Array.isArray(entry) && !(entry.length === 2 || isNumeric(entry[0]) || isNumeric(entry[1]))) {\n throw new Error(\"noUiSlider: 'padding' option must be numeric or array of exactly 2 numbers.\");\n }\n if (entry === 0) {\n return;\n }\n if (!Array.isArray(entry)) {\n entry = [entry, entry];\n }\n // 'getDistance' returns false for invalid values.\n parsed.padding = [parsed.spectrum.getDistance(entry[0]), parsed.spectrum.getDistance(entry[1])];\n for (index = 0; index < parsed.spectrum.xNumSteps.length - 1; index++) {\n // last \"range\" can't contain step size as it is purely an endpoint.\n if (parsed.padding[0][index] < 0 || parsed.padding[1][index] < 0) {\n throw new Error(\"noUiSlider: 'padding' option must be a positive number(s).\");\n }\n }\n var totalPadding = entry[0] + entry[1];\n var firstValue = parsed.spectrum.xVal[0];\n var lastValue = parsed.spectrum.xVal[parsed.spectrum.xVal.length - 1];\n if (totalPadding / (lastValue - firstValue) > 1) {\n throw new Error(\"noUiSlider: 'padding' option must not exceed 100% of the range.\");\n }\n }\n function testDirection(parsed, entry) {\n // Set direction as a numerical value for easy parsing.\n // Invert connection for RTL sliders, so that the proper\n // handles get the connect/background classes.\n switch (entry) {\n case \"ltr\":\n parsed.dir = 0;\n break;\n case \"rtl\":\n parsed.dir = 1;\n break;\n default:\n throw new Error(\"noUiSlider: 'direction' option was not recognized.\");\n }\n }\n function testBehaviour(parsed, entry) {\n // Make sure the input is a string.\n if (typeof entry !== \"string\") {\n throw new Error(\"noUiSlider: 'behaviour' must be a string containing options.\");\n }\n // Check if the string contains any keywords.\n // None are required.\n var tap = entry.indexOf(\"tap\") >= 0;\n var drag = entry.indexOf(\"drag\") >= 0;\n var fixed = entry.indexOf(\"fixed\") >= 0;\n var snap = entry.indexOf(\"snap\") >= 0;\n var hover = entry.indexOf(\"hover\") >= 0;\n var unconstrained = entry.indexOf(\"unconstrained\") >= 0;\n var dragAll = entry.indexOf(\"drag-all\") >= 0;\n var smoothSteps = entry.indexOf(\"smooth-steps\") >= 0;\n if (fixed) {\n if (parsed.handles !== 2) {\n throw new Error(\"noUiSlider: 'fixed' behaviour must be used with 2 handles\");\n }\n // Use margin to enforce fixed state\n testMargin(parsed, parsed.start[1] - parsed.start[0]);\n }\n if (unconstrained && (parsed.margin || parsed.limit)) {\n throw new Error(\"noUiSlider: 'unconstrained' behaviour cannot be used with margin or limit\");\n }\n parsed.events = {\n tap: tap || snap,\n drag: drag,\n dragAll: dragAll,\n smoothSteps: smoothSteps,\n fixed: fixed,\n snap: snap,\n hover: hover,\n unconstrained: unconstrained,\n };\n }\n function testTooltips(parsed, entry) {\n if (entry === false) {\n return;\n }\n if (entry === true || isValidPartialFormatter(entry)) {\n parsed.tooltips = [];\n for (var i = 0; i < parsed.handles; i++) {\n parsed.tooltips.push(entry);\n }\n }\n else {\n entry = asArray(entry);\n if (entry.length !== parsed.handles) {\n throw new Error(\"noUiSlider: must pass a formatter for all handles.\");\n }\n entry.forEach(function (formatter) {\n if (typeof formatter !== \"boolean\" && !isValidPartialFormatter(formatter)) {\n throw new Error(\"noUiSlider: 'tooltips' must be passed a formatter or 'false'.\");\n }\n });\n parsed.tooltips = entry;\n }\n }\n function testHandleAttributes(parsed, entry) {\n if (entry.length !== parsed.handles) {\n throw new Error(\"noUiSlider: must pass a attributes for all handles.\");\n }\n parsed.handleAttributes = entry;\n }\n function testAriaFormat(parsed, entry) {\n if (!isValidPartialFormatter(entry)) {\n throw new Error(\"noUiSlider: 'ariaFormat' requires 'to' method.\");\n }\n parsed.ariaFormat = entry;\n }\n function testFormat(parsed, entry) {\n if (!isValidFormatter(entry)) {\n throw new Error(\"noUiSlider: 'format' requires 'to' and 'from' methods.\");\n }\n parsed.format = entry;\n }\n function testKeyboardSupport(parsed, entry) {\n if (typeof entry !== \"boolean\") {\n throw new Error(\"noUiSlider: 'keyboardSupport' option must be a boolean.\");\n }\n parsed.keyboardSupport = entry;\n }\n function testDocumentElement(parsed, entry) {\n // This is an advanced option. Passed values are used without validation.\n parsed.documentElement = entry;\n }\n function testCssPrefix(parsed, entry) {\n if (typeof entry !== \"string\" && entry !== false) {\n throw new Error(\"noUiSlider: 'cssPrefix' must be a string or `false`.\");\n }\n parsed.cssPrefix = entry;\n }\n function testCssClasses(parsed, entry) {\n if (typeof entry !== \"object\") {\n throw new Error(\"noUiSlider: 'cssClasses' must be an object.\");\n }\n if (typeof parsed.cssPrefix === \"string\") {\n parsed.cssClasses = {};\n Object.keys(entry).forEach(function (key) {\n parsed.cssClasses[key] = parsed.cssPrefix + entry[key];\n });\n }\n else {\n parsed.cssClasses = entry;\n }\n }\n // Test all developer settings and parse to assumption-safe values.\n function testOptions(options) {\n // To prove a fix for #537, freeze options here.\n // If the object is modified, an error will be thrown.\n // Object.freeze(options);\n var parsed = {\n margin: null,\n limit: null,\n padding: null,\n animate: true,\n animationDuration: 300,\n ariaFormat: defaultFormatter,\n format: defaultFormatter,\n };\n // Tests are executed in the order they are presented here.\n var tests = {\n step: { r: false, t: testStep },\n keyboardPageMultiplier: { r: false, t: testKeyboardPageMultiplier },\n keyboardMultiplier: { r: false, t: testKeyboardMultiplier },\n keyboardDefaultStep: { r: false, t: testKeyboardDefaultStep },\n start: { r: true, t: testStart },\n connect: { r: true, t: testConnect },\n direction: { r: true, t: testDirection },\n snap: { r: false, t: testSnap },\n animate: { r: false, t: testAnimate },\n animationDuration: { r: false, t: testAnimationDuration },\n range: { r: true, t: testRange },\n orientation: { r: false, t: testOrientation },\n margin: { r: false, t: testMargin },\n limit: { r: false, t: testLimit },\n padding: { r: false, t: testPadding },\n behaviour: { r: true, t: testBehaviour },\n ariaFormat: { r: false, t: testAriaFormat },\n format: { r: false, t: testFormat },\n tooltips: { r: false, t: testTooltips },\n keyboardSupport: { r: true, t: testKeyboardSupport },\n documentElement: { r: false, t: testDocumentElement },\n cssPrefix: { r: true, t: testCssPrefix },\n cssClasses: { r: true, t: testCssClasses },\n handleAttributes: { r: false, t: testHandleAttributes },\n };\n var defaults = {\n connect: false,\n direction: \"ltr\",\n behaviour: \"tap\",\n orientation: \"horizontal\",\n keyboardSupport: true,\n cssPrefix: \"noUi-\",\n cssClasses: cssClasses,\n keyboardPageMultiplier: 5,\n keyboardMultiplier: 1,\n keyboardDefaultStep: 10,\n };\n // AriaFormat defaults to regular format, if any.\n if (options.format && !options.ariaFormat) {\n options.ariaFormat = options.format;\n }\n // Run all options through a testing mechanism to ensure correct\n // input. It should be noted that options might get modified to\n // be handled properly. E.g. wrapping integers in arrays.\n Object.keys(tests).forEach(function (name) {\n // If the option isn't set, but it is required, throw an error.\n if (!isSet(options[name]) && defaults[name] === undefined) {\n if (tests[name].r) {\n throw new Error(\"noUiSlider: '\" + name + \"' is required.\");\n }\n return;\n }\n tests[name].t(parsed, !isSet(options[name]) ? defaults[name] : options[name]);\n });\n // Forward pips options\n parsed.pips = options.pips;\n // All recent browsers accept unprefixed transform.\n // We need -ms- for IE9 and -webkit- for older Android;\n // Assume use of -webkit- if unprefixed and -ms- are not supported.\n // https://caniuse.com/#feat=transforms2d\n var d = document.createElement(\"div\");\n var msPrefix = d.style.msTransform !== undefined;\n var noPrefix = d.style.transform !== undefined;\n parsed.transformRule = noPrefix ? \"transform\" : msPrefix ? \"msTransform\" : \"webkitTransform\";\n // Pips don't move, so we can place them using left/top.\n var styles = [\n [\"left\", \"top\"],\n [\"right\", \"bottom\"],\n ];\n parsed.style = styles[parsed.dir][parsed.ort];\n return parsed;\n }\n //endregion\n function scope(target, options, originalOptions) {\n var actions = getActions();\n var supportsTouchActionNone = getSupportsTouchActionNone();\n var supportsPassive = supportsTouchActionNone && getSupportsPassive();\n // All variables local to 'scope' are prefixed with 'scope_'\n // Slider DOM Nodes\n var scope_Target = target;\n var scope_Base;\n var scope_Handles;\n var scope_Connects;\n var scope_Pips;\n var scope_Tooltips;\n // Slider state values\n var scope_Spectrum = options.spectrum;\n var scope_Values = [];\n var scope_Locations = [];\n var scope_HandleNumbers = [];\n var scope_ActiveHandlesCount = 0;\n var scope_Events = {};\n // Document Nodes\n var scope_Document = target.ownerDocument;\n var scope_DocumentElement = options.documentElement || scope_Document.documentElement;\n var scope_Body = scope_Document.body;\n // For horizontal sliders in standard ltr documents,\n // make .noUi-origin overflow to the left so the document doesn't scroll.\n var scope_DirOffset = scope_Document.dir === \"rtl\" || options.ort === 1 ? 0 : 100;\n // Creates a node, adds it to target, returns the new node.\n function addNodeTo(addTarget, className) {\n var div = scope_Document.createElement(\"div\");\n if (className) {\n addClass(div, className);\n }\n addTarget.appendChild(div);\n return div;\n }\n // Append a origin to the base\n function addOrigin(base, handleNumber) {\n var origin = addNodeTo(base, options.cssClasses.origin);\n var handle = addNodeTo(origin, options.cssClasses.handle);\n addNodeTo(handle, options.cssClasses.touchArea);\n handle.setAttribute(\"data-handle\", String(handleNumber));\n if (options.keyboardSupport) {\n // https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/tabindex\n // 0 = focusable and reachable\n handle.setAttribute(\"tabindex\", \"0\");\n handle.addEventListener(\"keydown\", function (event) {\n return eventKeydown(event, handleNumber);\n });\n }\n if (options.handleAttributes !== undefined) {\n var attributes_1 = options.handleAttributes[handleNumber];\n Object.keys(attributes_1).forEach(function (attribute) {\n handle.setAttribute(attribute, attributes_1[attribute]);\n });\n }\n handle.setAttribute(\"role\", \"slider\");\n handle.setAttribute(\"aria-orientation\", options.ort ? \"vertical\" : \"horizontal\");\n if (handleNumber === 0) {\n addClass(handle, options.cssClasses.handleLower);\n }\n else if (handleNumber === options.handles - 1) {\n addClass(handle, options.cssClasses.handleUpper);\n }\n return origin;\n }\n // Insert nodes for connect elements\n function addConnect(base, add) {\n if (!add) {\n return false;\n }\n return addNodeTo(base, options.cssClasses.connect);\n }\n // Add handles to the slider base.\n function addElements(connectOptions, base) {\n var connectBase = addNodeTo(base, options.cssClasses.connects);\n scope_Handles = [];\n scope_Connects = [];\n scope_Connects.push(addConnect(connectBase, connectOptions[0]));\n // [::::O====O====O====]\n // connectOptions = [0, 1, 1, 1]\n for (var i = 0; i < options.handles; i++) {\n // Keep a list of all added handles.\n scope_Handles.push(addOrigin(base, i));\n scope_HandleNumbers[i] = i;\n scope_Connects.push(addConnect(connectBase, connectOptions[i + 1]));\n }\n }\n // Initialize a single slider.\n function addSlider(addTarget) {\n // Apply classes and data to the target.\n addClass(addTarget, options.cssClasses.target);\n if (options.dir === 0) {\n addClass(addTarget, options.cssClasses.ltr);\n }\n else {\n addClass(addTarget, options.cssClasses.rtl);\n }\n if (options.ort === 0) {\n addClass(addTarget, options.cssClasses.horizontal);\n }\n else {\n addClass(addTarget, options.cssClasses.vertical);\n }\n var textDirection = getComputedStyle(addTarget).direction;\n if (textDirection === \"rtl\") {\n addClass(addTarget, options.cssClasses.textDirectionRtl);\n }\n else {\n addClass(addTarget, options.cssClasses.textDirectionLtr);\n }\n return addNodeTo(addTarget, options.cssClasses.base);\n }\n function addTooltip(handle, handleNumber) {\n if (!options.tooltips || !options.tooltips[handleNumber]) {\n return false;\n }\n return addNodeTo(handle.firstChild, options.cssClasses.tooltip);\n }\n function isSliderDisabled() {\n return scope_Target.hasAttribute(\"disabled\");\n }\n // Disable the slider dragging if any handle is disabled\n function isHandleDisabled(handleNumber) {\n var handleOrigin = scope_Handles[handleNumber];\n return handleOrigin.hasAttribute(\"disabled\");\n }\n function removeTooltips() {\n if (scope_Tooltips) {\n removeEvent(\"update\" + INTERNAL_EVENT_NS.tooltips);\n scope_Tooltips.forEach(function (tooltip) {\n if (tooltip) {\n removeElement(tooltip);\n }\n });\n scope_Tooltips = null;\n }\n }\n // The tooltips option is a shorthand for using the 'update' event.\n function tooltips() {\n removeTooltips();\n // Tooltips are added with options.tooltips in original order.\n scope_Tooltips = scope_Handles.map(addTooltip);\n bindEvent(\"update\" + INTERNAL_EVENT_NS.tooltips, function (values, handleNumber, unencoded) {\n if (!scope_Tooltips || !options.tooltips) {\n return;\n }\n if (scope_Tooltips[handleNumber] === false) {\n return;\n }\n var formattedValue = values[handleNumber];\n if (options.tooltips[handleNumber] !== true) {\n formattedValue = options.tooltips[handleNumber].to(unencoded[handleNumber]);\n }\n scope_Tooltips[handleNumber].innerHTML = formattedValue;\n });\n }\n function aria() {\n removeEvent(\"update\" + INTERNAL_EVENT_NS.aria);\n bindEvent(\"update\" + INTERNAL_EVENT_NS.aria, function (values, handleNumber, unencoded, tap, positions) {\n // Update Aria Values for all handles, as a change in one changes min and max values for the next.\n scope_HandleNumbers.forEach(function (index) {\n var handle = scope_Handles[index];\n var min = checkHandlePosition(scope_Locations, index, 0, true, true, true);\n var max = checkHandlePosition(scope_Locations, index, 100, true, true, true);\n var now = positions[index];\n // Formatted value for display\n var text = String(options.ariaFormat.to(unencoded[index]));\n // Map to slider range values\n min = scope_Spectrum.fromStepping(min).toFixed(1);\n max = scope_Spectrum.fromStepping(max).toFixed(1);\n now = scope_Spectrum.fromStepping(now).toFixed(1);\n handle.children[0].setAttribute(\"aria-valuemin\", min);\n handle.children[0].setAttribute(\"aria-valuemax\", max);\n handle.children[0].setAttribute(\"aria-valuenow\", now);\n handle.children[0].setAttribute(\"aria-valuetext\", text);\n });\n });\n }\n function getGroup(pips) {\n // Use the range.\n if (pips.mode === exports.PipsMode.Range || pips.mode === exports.PipsMode.Steps) {\n return scope_Spectrum.xVal;\n }\n if (pips.mode === exports.PipsMode.Count) {\n if (pips.values < 2) {\n throw new Error(\"noUiSlider: 'values' (>= 2) required for mode 'count'.\");\n }\n // Divide 0 - 100 in 'count' parts.\n var interval = pips.values - 1;\n var spread = 100 / interval;\n var values = [];\n // List these parts and have them handled as 'positions'.\n while (interval--) {\n values[interval] = interval * spread;\n }\n values.push(100);\n return mapToRange(values, pips.stepped);\n }\n if (pips.mode === exports.PipsMode.Positions) {\n // Map all percentages to on-range values.\n return mapToRange(pips.values, pips.stepped);\n }\n if (pips.mode === exports.PipsMode.Values) {\n // If the value must be stepped, it needs to be converted to a percentage first.\n if (pips.stepped) {\n return pips.values.map(function (value) {\n // Convert to percentage, apply step, return to value.\n return scope_Spectrum.fromStepping(scope_Spectrum.getStep(scope_Spectrum.toStepping(value)));\n });\n }\n // Otherwise, we can simply use the values.\n return pips.values;\n }\n return []; // pips.mode = never\n }\n function mapToRange(values, stepped) {\n return values.map(function (value) {\n return scope_Spectrum.fromStepping(stepped ? scope_Spectrum.getStep(value) : value);\n });\n }\n function generateSpread(pips) {\n function safeIncrement(value, increment) {\n // Avoid floating point variance by dropping the smallest decimal places.\n return Number((value + increment).toFixed(7));\n }\n var group = getGroup(pips);\n var indexes = {};\n var firstInRange = scope_Spectrum.xVal[0];\n var lastInRange = scope_Spectrum.xVal[scope_Spectrum.xVal.length - 1];\n var ignoreFirst = false;\n var ignoreLast = false;\n var prevPct = 0;\n // Create a copy of the group, sort it and filter away all duplicates.\n group = unique(group.slice().sort(function (a, b) {\n return a - b;\n }));\n // Make sure the range starts with the first element.\n if (group[0] !== firstInRange) {\n group.unshift(firstInRange);\n ignoreFirst = true;\n }\n // Likewise for the last one.\n if (group[group.length - 1] !== lastInRange) {\n group.push(lastInRange);\n ignoreLast = true;\n }\n group.forEach(function (current, index) {\n // Get the current step and the lower + upper positions.\n var step;\n var i;\n var q;\n var low = current;\n var high = group[index + 1];\n var newPct;\n var pctDifference;\n var pctPos;\n var type;\n var steps;\n var realSteps;\n var stepSize;\n var isSteps = pips.mode === exports.PipsMode.Steps;\n // When using 'steps' mode, use the provided steps.\n // Otherwise, we'll step on to the next subrange.\n if (isSteps) {\n step = scope_Spectrum.xNumSteps[index];\n }\n // Default to a 'full' step.\n if (!step) {\n step = high - low;\n }\n // If high is undefined we are at the last subrange. Make sure it iterates once (#1088)\n if (high === undefined) {\n high = low;\n }\n // Make sure step isn't 0, which would cause an infinite loop (#654)\n step = Math.max(step, 0.0000001);\n // Find all steps in the subrange.\n for (i = low; i <= high; i = safeIncrement(i, step)) {\n // Get the percentage value for the current step,\n // calculate the size for the subrange.\n newPct = scope_Spectrum.toStepping(i);\n pctDifference = newPct - prevPct;\n steps = pctDifference / (pips.density || 1);\n realSteps = Math.round(steps);\n // This ratio represents the amount of percentage-space a point indicates.\n // For a density 1 the points/percentage = 1. For density 2, that percentage needs to be re-divided.\n // Round the percentage offset to an even number, then divide by two\n // to spread the offset on both sides of the range.\n stepSize = pctDifference / realSteps;\n // Divide all points evenly, adding the correct number to this subrange.\n // Run up to <= so that 100% gets a point, event if ignoreLast is set.\n for (q = 1; q <= realSteps; q += 1) {\n // The ratio between the rounded value and the actual size might be ~1% off.\n // Correct the percentage offset by the number of points\n // per subrange. density = 1 will result in 100 points on the\n // full range, 2 for 50, 4 for 25, etc.\n pctPos = prevPct + q * stepSize;\n indexes[pctPos.toFixed(5)] = [scope_Spectrum.fromStepping(pctPos), 0];\n }\n // Determine the point type.\n type = group.indexOf(i) > -1 ? exports.PipsType.LargeValue : isSteps ? exports.PipsType.SmallValue : exports.PipsType.NoValue;\n // Enforce the 'ignoreFirst' option by overwriting the type for 0.\n if (!index && ignoreFirst && i !== high) {\n type = 0;\n }\n if (!(i === high && ignoreLast)) {\n // Mark the 'type' of this point. 0 = plain, 1 = real value, 2 = step value.\n indexes[newPct.toFixed(5)] = [i, type];\n }\n // Update the percentage count.\n prevPct = newPct;\n }\n });\n return indexes;\n }\n function addMarking(spread, filterFunc, formatter) {\n var _a, _b;\n var element = scope_Document.createElement(\"div\");\n var valueSizeClasses = (_a = {},\n _a[exports.PipsType.None] = \"\",\n _a[exports.PipsType.NoValue] = options.cssClasses.valueNormal,\n _a[exports.PipsType.LargeValue] = options.cssClasses.valueLarge,\n _a[exports.PipsType.SmallValue] = options.cssClasses.valueSub,\n _a);\n var markerSizeClasses = (_b = {},\n _b[exports.PipsType.None] = \"\",\n _b[exports.PipsType.NoValue] = options.cssClasses.markerNormal,\n _b[exports.PipsType.LargeValue] = options.cssClasses.markerLarge,\n _b[exports.PipsType.SmallValue] = options.cssClasses.markerSub,\n _b);\n var valueOrientationClasses = [options.cssClasses.valueHorizontal, options.cssClasses.valueVertical];\n var markerOrientationClasses = [options.cssClasses.markerHorizontal, options.cssClasses.markerVertical];\n addClass(element, options.cssClasses.pips);\n addClass(element, options.ort === 0 ? options.cssClasses.pipsHorizontal : options.cssClasses.pipsVertical);\n function getClasses(type, source) {\n var a = source === options.cssClasses.value;\n var orientationClasses = a ? valueOrientationClasses : markerOrientationClasses;\n var sizeClasses = a ? valueSizeClasses : markerSizeClasses;\n return source + \" \" + orientationClasses[options.ort] + \" \" + sizeClasses[type];\n }\n function addSpread(offset, value, type) {\n // Apply the filter function, if it is set.\n type = filterFunc ? filterFunc(value, type) : type;\n if (type === exports.PipsType.None) {\n return;\n }\n // Add a marker for every point\n var node = addNodeTo(element, false);\n node.className = getClasses(type, options.cssClasses.marker);\n node.style[options.style] = offset + \"%\";\n // Values are only appended for points marked '1' or '2'.\n if (type > exports.PipsType.NoValue) {\n node = addNodeTo(element, false);\n node.className = getClasses(type, options.cssClasses.value);\n node.setAttribute(\"data-value\", String(value));\n node.style[options.style] = offset + \"%\";\n node.innerHTML = String(formatter.to(value));\n }\n }\n // Append all points.\n Object.keys(spread).forEach(function (offset) {\n addSpread(offset, spread[offset][0], spread[offset][1]);\n });\n return element;\n }\n function removePips() {\n if (scope_Pips) {\n removeElement(scope_Pips);\n scope_Pips = null;\n }\n }\n function pips(pips) {\n // Fix #669\n removePips();\n var spread = generateSpread(pips);\n var filter = pips.filter;\n var format = pips.format || {\n to: function (value) {\n return String(Math.round(value));\n },\n };\n scope_Pips = scope_Target.appendChild(addMarking(spread, filter, format));\n return scope_Pips;\n }\n // Shorthand for base dimensions.\n function baseSize() {\n var rect = scope_Base.getBoundingClientRect();\n var alt = (\"offset\" + [\"Width\", \"Height\"][options.ort]);\n return options.ort === 0 ? rect.width || scope_Base[alt] : rect.height || scope_Base[alt];\n }\n // Handler for attaching events trough a proxy.\n function attachEvent(events, element, callback, data) {\n // This function can be used to 'filter' events to the slider.\n // element is a node, not a nodeList\n var method = function (event) {\n var e = fixEvent(event, data.pageOffset, data.target || element);\n // fixEvent returns false if this event has a different target\n // when handling (multi-) touch events;\n if (!e) {\n return false;\n }\n // doNotReject is passed by all end events to make sure released touches\n // are not rejected, leaving the slider \"stuck\" to the cursor;\n if (isSliderDisabled() && !data.doNotReject) {\n return false;\n }\n // Stop if an active 'tap' transition is taking place.\n if (hasClass(scope_Target, options.cssClasses.tap) && !data.doNotReject) {\n return false;\n }\n // Ignore right or middle clicks on start #454\n if (events === actions.start && e.buttons !== undefined && e.buttons > 1) {\n return false;\n }\n // Ignore right or middle clicks on start #454\n if (data.hover && e.buttons) {\n return false;\n }\n // 'supportsPassive' is only true if a browser also supports touch-action: none in CSS.\n // iOS safari does not, so it doesn't get to benefit from passive scrolling. iOS does support\n // touch-action: manipulation, but that allows panning, which breaks\n // sliders after zooming/on non-responsive pages.\n // See: https://bugs.webkit.org/show_bug.cgi?id=133112\n if (!supportsPassive) {\n e.preventDefault();\n }\n e.calcPoint = e.points[options.ort];\n // Call the event handler with the event [ and additional data ].\n callback(e, data);\n return;\n };\n var methods = [];\n // Bind a closure on the target for every event type.\n events.split(\" \").forEach(function (eventName) {\n element.addEventListener(eventName, method, supportsPassive ? { passive: true } : false);\n methods.push([eventName, method]);\n });\n return methods;\n }\n // Provide a clean event with standardized offset values.\n function fixEvent(e, pageOffset, eventTarget) {\n // Filter the event to register the type, which can be\n // touch, mouse or pointer. Offset changes need to be\n // made on an event specific basis.\n var touch = e.type.indexOf(\"touch\") === 0;\n var mouse = e.type.indexOf(\"mouse\") === 0;\n var pointer = e.type.indexOf(\"pointer\") === 0;\n var x = 0;\n var y = 0;\n // IE10 implemented pointer events with a prefix;\n if (e.type.indexOf(\"MSPointer\") === 0) {\n pointer = true;\n }\n // Erroneous events seem to be passed in occasionally on iOS/iPadOS after user finishes interacting with\n // the slider. They appear to be of type MouseEvent, yet they don't have usual properties set. Ignore\n // events that have no touches or buttons associated with them. (#1057, #1079, #1095)\n if (e.type === \"mousedown\" && !e.buttons && !e.touches) {\n return false;\n }\n // The only thing one handle should be concerned about is the touches that originated on top of it.\n if (touch) {\n // Returns true if a touch originated on the target.\n var isTouchOnTarget = function (checkTouch) {\n var target = checkTouch.target;\n return (target === eventTarget ||\n eventTarget.contains(target) ||\n (e.composed && e.composedPath().shift() === eventTarget));\n };\n // In the case of touchstart events, we need to make sure there is still no more than one\n // touch on the target so we look amongst all touches.\n if (e.type === \"touchstart\") {\n var targetTouches = Array.prototype.filter.call(e.touches, isTouchOnTarget);\n // Do not support more than one touch per handle.\n if (targetTouches.length > 1) {\n return false;\n }\n x = targetTouches[0].pageX;\n y = targetTouches[0].pageY;\n }\n else {\n // In the other cases, find on changedTouches is enough.\n var targetTouch = Array.prototype.find.call(e.changedTouches, isTouchOnTarget);\n // Cancel if the target touch has not moved.\n if (!targetTouch) {\n return false;\n }\n x = targetTouch.pageX;\n y = targetTouch.pageY;\n }\n }\n pageOffset = pageOffset || getPageOffset(scope_Document);\n if (mouse || pointer) {\n x = e.clientX + pageOffset.x;\n y = e.clientY + pageOffset.y;\n }\n e.pageOffset = pageOffset;\n e.points = [x, y];\n e.cursor = mouse || pointer; // Fix #435\n return e;\n }\n // Translate a coordinate in the document to a percentage on the slider\n function calcPointToPercentage(calcPoint) {\n var location = calcPoint - offset(scope_Base, options.ort);\n var proposal = (location * 100) / baseSize();\n // Clamp proposal between 0% and 100%\n // Out-of-bound coordinates may occur when .noUi-base pseudo-elements\n // are used (e.g. contained handles feature)\n proposal = limit(proposal);\n return options.dir ? 100 - proposal : proposal;\n }\n // Find handle closest to a certain percentage on the slider\n function getClosestHandle(clickedPosition) {\n var smallestDifference = 100;\n var handleNumber = false;\n scope_Handles.forEach(function (handle, index) {\n // Disabled handles are ignored\n if (isHandleDisabled(index)) {\n return;\n }\n var handlePosition = scope_Locations[index];\n var differenceWithThisHandle = Math.abs(handlePosition - clickedPosition);\n // Initial state\n var clickAtEdge = differenceWithThisHandle === 100 && smallestDifference === 100;\n // Difference with this handle is smaller than the previously checked handle\n var isCloser = differenceWithThisHandle < smallestDifference;\n var isCloserAfter = differenceWithThisHandle <= smallestDifference && clickedPosition > handlePosition;\n if (isCloser || isCloserAfter || clickAtEdge) {\n handleNumber = index;\n smallestDifference = differenceWithThisHandle;\n }\n });\n return handleNumber;\n }\n // Fire 'end' when a mouse or pen leaves the document.\n function documentLeave(event, data) {\n if (event.type === \"mouseout\" &&\n event.target.nodeName === \"HTML\" &&\n event.relatedTarget === null) {\n eventEnd(event, data);\n }\n }\n // Handle movement on document for handle and range drag.\n function eventMove(event, data) {\n // Fix #498\n // Check value of .buttons in 'start' to work around a bug in IE10 mobile (data.buttonsProperty).\n // https://connect.microsoft.com/IE/feedback/details/927005/mobile-ie10-windows-phone-buttons-property-of-pointermove-event-always-zero\n // IE9 has .buttons and .which zero on mousemove.\n // Firefox breaks the spec MDN defines.\n if (navigator.appVersion.indexOf(\"MSIE 9\") === -1 && event.buttons === 0 && data.buttonsProperty !== 0) {\n return eventEnd(event, data);\n }\n // Check if we are moving up or down\n var movement = (options.dir ? -1 : 1) * (event.calcPoint - data.startCalcPoint);\n // Convert the movement into a percentage of the slider width/height\n var proposal = (movement * 100) / data.baseSize;\n moveHandles(movement > 0, proposal, data.locations, data.handleNumbers, data.connect);\n }\n // Unbind move events on document, call callbacks.\n function eventEnd(event, data) {\n // The handle is no longer active, so remove the class.\n if (data.handle) {\n removeClass(data.handle, options.cssClasses.active);\n scope_ActiveHandlesCount -= 1;\n }\n // Unbind the move and end events, which are added on 'start'.\n data.listeners.forEach(function (c) {\n scope_DocumentElement.removeEventListener(c[0], c[1]);\n });\n if (scope_ActiveHandlesCount === 0) {\n // Remove dragging class.\n removeClass(scope_Target, options.cssClasses.drag);\n setZindex();\n // Remove cursor styles and text-selection events bound to the body.\n if (event.cursor) {\n scope_Body.style.cursor = \"\";\n scope_Body.removeEventListener(\"selectstart\", preventDefault);\n }\n }\n if (options.events.smoothSteps) {\n data.handleNumbers.forEach(function (handleNumber) {\n setHandle(handleNumber, scope_Locations[handleNumber], true, true, false, false);\n });\n data.handleNumbers.forEach(function (handleNumber) {\n fireEvent(\"update\", handleNumber);\n });\n }\n data.handleNumbers.forEach(function (handleNumber) {\n fireEvent(\"change\", handleNumber);\n fireEvent(\"set\", handleNumber);\n fireEvent(\"end\", handleNumber);\n });\n }\n // Bind move events on document.\n function eventStart(event, data) {\n // Ignore event if any handle is disabled\n if (data.handleNumbers.some(isHandleDisabled)) {\n return;\n }\n var handle;\n if (data.handleNumbers.length === 1) {\n var handleOrigin = scope_Handles[data.handleNumbers[0]];\n handle = handleOrigin.children[0];\n scope_ActiveHandlesCount += 1;\n // Mark the handle as 'active' so it can be styled.\n addClass(handle, options.cssClasses.active);\n }\n // A drag should never propagate up to the 'tap' event.\n event.stopPropagation();\n // Record the event listeners.\n var listeners = [];\n // Attach the move and end events.\n var moveEvent = attachEvent(actions.move, scope_DocumentElement, eventMove, {\n // The event target has changed so we need to propagate the original one so that we keep\n // relying on it to extract target touches.\n target: event.target,\n handle: handle,\n connect: data.connect,\n listeners: listeners,\n startCalcPoint: event.calcPoint,\n baseSize: baseSize(),\n pageOffset: event.pageOffset,\n handleNumbers: data.handleNumbers,\n buttonsProperty: event.buttons,\n locations: scope_Locations.slice(),\n });\n var endEvent = attachEvent(actions.end, scope_DocumentElement, eventEnd, {\n target: event.target,\n handle: handle,\n listeners: listeners,\n doNotReject: true,\n handleNumbers: data.handleNumbers,\n });\n var outEvent = attachEvent(\"mouseout\", scope_DocumentElement, documentLeave, {\n target: event.target,\n handle: handle,\n listeners: listeners,\n doNotReject: true,\n handleNumbers: data.handleNumbers,\n });\n // We want to make sure we pushed the listeners in the listener list rather than creating\n // a new one as it has already been passed to the event handlers.\n listeners.push.apply(listeners, moveEvent.concat(endEvent, outEvent));\n // Text selection isn't an issue on touch devices,\n // so adding cursor styles can be skipped.\n if (event.cursor) {\n // Prevent the 'I' cursor and extend the range-drag cursor.\n scope_Body.style.cursor = getComputedStyle(event.target).cursor;\n // Mark the target with a dragging state.\n if (scope_Handles.length > 1) {\n addClass(scope_Target, options.cssClasses.drag);\n }\n // Prevent text selection when dragging the handles.\n // In noUiSlider <= 9.2.0, this was handled by calling preventDefault on mouse/touch start/move,\n // which is scroll blocking. The selectstart event is supported by FireFox starting from version 52,\n // meaning the only holdout is iOS Safari. This doesn't matter: text selection isn't triggered there.\n // The 'cursor' flag is false.\n // See: http://caniuse.com/#search=selectstart\n scope_Body.addEventListener(\"selectstart\", preventDefault, false);\n }\n data.handleNumbers.forEach(function (handleNumber) {\n fireEvent(\"start\", handleNumber);\n });\n }\n // Move closest handle to tapped location.\n function eventTap(event) {\n // The tap event shouldn't propagate up\n event.stopPropagation();\n var proposal = calcPointToPercentage(event.calcPoint);\n var handleNumber = getClosestHandle(proposal);\n // Tackle the case that all handles are 'disabled'.\n if (handleNumber === false) {\n return;\n }\n // Flag the slider as it is now in a transitional state.\n // Transition takes a configurable amount of ms (default 300). Re-enable the slider after that.\n if (!options.events.snap) {\n addClassFor(scope_Target, options.cssClasses.tap, options.animationDuration);\n }\n setHandle(handleNumber, proposal, true, true);\n setZindex();\n fireEvent(\"slide\", handleNumber, true);\n fireEvent(\"update\", handleNumber, true);\n if (!options.events.snap) {\n fireEvent(\"change\", handleNumber, true);\n fireEvent(\"set\", handleNumber, true);\n }\n else {\n eventStart(event, { handleNumbers: [handleNumber] });\n }\n }\n // Fires a 'hover' event for a hovered mouse/pen position.\n function eventHover(event) {\n var proposal = calcPointToPercentage(event.calcPoint);\n var to = scope_Spectrum.getStep(proposal);\n var value = scope_Spectrum.fromStepping(to);\n Object.keys(scope_Events).forEach(function (targetEvent) {\n if (\"hover\" === targetEvent.split(\".\")[0]) {\n scope_Events[targetEvent].forEach(function (callback) {\n callback.call(scope_Self, value);\n });\n }\n });\n }\n // Handles keydown on focused handles\n // Don't move the document when pressing arrow keys on focused handles\n function eventKeydown(event, handleNumber) {\n if (isSliderDisabled() || isHandleDisabled(handleNumber)) {\n return false;\n }\n var horizontalKeys = [\"Left\", \"Right\"];\n var verticalKeys = [\"Down\", \"Up\"];\n var largeStepKeys = [\"PageDown\", \"PageUp\"];\n var edgeKeys = [\"Home\", \"End\"];\n if (options.dir && !options.ort) {\n // On an right-to-left slider, the left and right keys act inverted\n horizontalKeys.reverse();\n }\n else if (options.ort && !options.dir) {\n // On a top-to-bottom slider, the up and down keys act inverted\n verticalKeys.reverse();\n largeStepKeys.reverse();\n }\n // Strip \"Arrow\" for IE compatibility. https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/key\n var key = event.key.replace(\"Arrow\", \"\");\n var isLargeDown = key === largeStepKeys[0];\n var isLargeUp = key === largeStepKeys[1];\n var isDown = key === verticalKeys[0] || key === horizontalKeys[0] || isLargeDown;\n var isUp = key === verticalKeys[1] || key === horizontalKeys[1] || isLargeUp;\n var isMin = key === edgeKeys[0];\n var isMax = key === edgeKeys[1];\n if (!isDown && !isUp && !isMin && !isMax) {\n return true;\n }\n event.preventDefault();\n var to;\n if (isUp || isDown) {\n var direction = isDown ? 0 : 1;\n var steps = getNextStepsForHandle(handleNumber);\n var step = steps[direction];\n // At the edge of a slider, do nothing\n if (step === null) {\n return false;\n }\n // No step set, use the default of 10% of the sub-range\n if (step === false) {\n step = scope_Spectrum.getDefaultStep(scope_Locations[handleNumber], isDown, options.keyboardDefaultStep);\n }\n if (isLargeUp || isLargeDown) {\n step *= options.keyboardPageMultiplier;\n }\n else {\n step *= options.keyboardMultiplier;\n }\n // Step over zero-length ranges (#948);\n step = Math.max(step, 0.0000001);\n // Decrement for down steps\n step = (isDown ? -1 : 1) * step;\n to = scope_Values[handleNumber] + step;\n }\n else if (isMax) {\n // End key\n to = options.spectrum.xVal[options.spectrum.xVal.length - 1];\n }\n else {\n // Home key\n to = options.spectrum.xVal[0];\n }\n setHandle(handleNumber, scope_Spectrum.toStepping(to), true, true);\n fireEvent(\"slide\", handleNumber);\n fireEvent(\"update\", handleNumber);\n fireEvent(\"change\", handleNumber);\n fireEvent(\"set\", handleNumber);\n return false;\n }\n // Attach events to several slider parts.\n function bindSliderEvents(behaviour) {\n // Attach the standard drag event to the handles.\n if (!behaviour.fixed) {\n scope_Handles.forEach(function (handle, index) {\n // These events are only bound to the visual handle\n // element, not the 'real' origin element.\n attachEvent(actions.start, handle.children[0], eventStart, {\n handleNumbers: [index],\n });\n });\n }\n // Attach the tap event to the slider base.\n if (behaviour.tap) {\n attachEvent(actions.start, scope_Base, eventTap, {});\n }\n // Fire hover events\n if (behaviour.hover) {\n attachEvent(actions.move, scope_Base, eventHover, {\n hover: true,\n });\n }\n // Make the range draggable.\n if (behaviour.drag) {\n scope_Connects.forEach(function (connect, index) {\n if (connect === false || index === 0 || index === scope_Connects.length - 1) {\n return;\n }\n var handleBefore = scope_Handles[index - 1];\n var handleAfter = scope_Handles[index];\n var eventHolders = [connect];\n var handlesToDrag = [handleBefore, handleAfter];\n var handleNumbersToDrag = [index - 1, index];\n addClass(connect, options.cssClasses.draggable);\n // When the range is fixed, the entire range can\n // be dragged by the handles. The handle in the first\n // origin will propagate the start event upward,\n // but it needs to be bound manually on the other.\n if (behaviour.fixed) {\n eventHolders.push(handleBefore.children[0]);\n eventHolders.push(handleAfter.children[0]);\n }\n if (behaviour.dragAll) {\n handlesToDrag = scope_Handles;\n handleNumbersToDrag = scope_HandleNumbers;\n }\n eventHolders.forEach(function (eventHolder) {\n attachEvent(actions.start, eventHolder, eventStart, {\n handles: handlesToDrag,\n handleNumbers: handleNumbersToDrag,\n connect: connect,\n });\n });\n });\n }\n }\n // Attach an event to this slider, possibly including a namespace\n function bindEvent(namespacedEvent, callback) {\n scope_Events[namespacedEvent] = scope_Events[namespacedEvent] || [];\n scope_Events[namespacedEvent].push(callback);\n // If the event bound is 'update,' fire it immediately for all handles.\n if (namespacedEvent.split(\".\")[0] === \"update\") {\n scope_Handles.forEach(function (a, index) {\n fireEvent(\"update\", index);\n });\n }\n }\n function isInternalNamespace(namespace) {\n return namespace === INTERNAL_EVENT_NS.aria || namespace === INTERNAL_EVENT_NS.tooltips;\n }\n // Undo attachment of event\n function removeEvent(namespacedEvent) {\n var event = namespacedEvent && namespacedEvent.split(\".\")[0];\n var namespace = event ? namespacedEvent.substring(event.length) : namespacedEvent;\n Object.keys(scope_Events).forEach(function (bind) {\n var tEvent = bind.split(\".\")[0];\n var tNamespace = bind.substring(tEvent.length);\n if ((!event || event === tEvent) && (!namespace || namespace === tNamespace)) {\n // only delete protected internal event if intentional\n if (!isInternalNamespace(tNamespace) || namespace === tNamespace) {\n delete scope_Events[bind];\n }\n }\n });\n }\n // External event handling\n function fireEvent(eventName, handleNumber, tap) {\n Object.keys(scope_Events).forEach(function (targetEvent) {\n var eventType = targetEvent.split(\".\")[0];\n if (eventName === eventType) {\n scope_Events[targetEvent].forEach(function (callback) {\n callback.call(\n // Use the slider public API as the scope ('this')\n scope_Self, \n // Return values as array, so arg_1[arg_2] is always valid.\n scope_Values.map(options.format.to), \n // Handle index, 0 or 1\n handleNumber, \n // Un-formatted slider values\n scope_Values.slice(), \n // Event is fired by tap, true or false\n tap || false, \n // Left offset of the handle, in relation to the slider\n scope_Locations.slice(), \n // add the slider public API to an accessible parameter when this is unavailable\n scope_Self);\n });\n }\n });\n }\n // Split out the handle positioning logic so the Move event can use it, too\n function checkHandlePosition(reference, handleNumber, to, lookBackward, lookForward, getValue, smoothSteps) {\n var distance;\n // For sliders with multiple handles, limit movement to the other handle.\n // Apply the margin option by adding it to the handle positions.\n if (scope_Handles.length > 1 && !options.events.unconstrained) {\n if (lookBackward && handleNumber > 0) {\n distance = scope_Spectrum.getAbsoluteDistance(reference[handleNumber - 1], options.margin, false);\n to = Math.max(to, distance);\n }\n if (lookForward && handleNumber < scope_Handles.length - 1) {\n distance = scope_Spectrum.getAbsoluteDistance(reference[handleNumber + 1], options.margin, true);\n to = Math.min(to, distance);\n }\n }\n // The limit option has the opposite effect, limiting handles to a\n // maximum distance from another. Limit must be > 0, as otherwise\n // handles would be unmovable.\n if (scope_Handles.length > 1 && options.limit) {\n if (lookBackward && handleNumber > 0) {\n distance = scope_Spectrum.getAbsoluteDistance(reference[handleNumber - 1], options.limit, false);\n to = Math.min(to, distance);\n }\n if (lookForward && handleNumber < scope_Handles.length - 1) {\n distance = scope_Spectrum.getAbsoluteDistance(reference[handleNumber + 1], options.limit, true);\n to = Math.max(to, distance);\n }\n }\n // The padding option keeps the handles a certain distance from the\n // edges of the slider. Padding must be > 0.\n if (options.padding) {\n if (handleNumber === 0) {\n distance = scope_Spectrum.getAbsoluteDistance(0, options.padding[0], false);\n to = Math.max(to, distance);\n }\n if (handleNumber === scope_Handles.length - 1) {\n distance = scope_Spectrum.getAbsoluteDistance(100, options.padding[1], true);\n to = Math.min(to, distance);\n }\n }\n if (!smoothSteps) {\n to = scope_Spectrum.getStep(to);\n }\n // Limit percentage to the 0 - 100 range\n to = limit(to);\n // Return false if handle can't move\n if (to === reference[handleNumber] && !getValue) {\n return false;\n }\n return to;\n }\n // Uses slider orientation to create CSS rules. a = base value;\n function inRuleOrder(v, a) {\n var o = options.ort;\n return (o ? a : v) + \", \" + (o ? v : a);\n }\n // Moves handle(s) by a percentage\n // (bool, % to move, [% where handle started, ...], [index in scope_Handles, ...])\n function moveHandles(upward, proposal, locations, handleNumbers, connect) {\n var proposals = locations.slice();\n // Store first handle now, so we still have it in case handleNumbers is reversed\n var firstHandle = handleNumbers[0];\n var smoothSteps = options.events.smoothSteps;\n var b = [!upward, upward];\n var f = [upward, !upward];\n // Copy handleNumbers so we don't change the dataset\n handleNumbers = handleNumbers.slice();\n // Check to see which handle is 'leading'.\n // If that one can't move the second can't either.\n if (upward) {\n handleNumbers.reverse();\n }\n // Step 1: get the maximum percentage that any of the handles can move\n if (handleNumbers.length > 1) {\n handleNumbers.forEach(function (handleNumber, o) {\n var to = checkHandlePosition(proposals, handleNumber, proposals[handleNumber] + proposal, b[o], f[o], false, smoothSteps);\n // Stop if one of the handles can't move.\n if (to === false) {\n proposal = 0;\n }\n else {\n proposal = to - proposals[handleNumber];\n proposals[handleNumber] = to;\n }\n });\n }\n // If using one handle, check backward AND forward\n else {\n b = f = [true];\n }\n var state = false;\n // Step 2: Try to set the handles with the found percentage\n handleNumbers.forEach(function (handleNumber, o) {\n state =\n setHandle(handleNumber, locations[handleNumber] + proposal, b[o], f[o], false, smoothSteps) || state;\n });\n // Step 3: If a handle moved, fire events\n if (state) {\n handleNumbers.forEach(function (handleNumber) {\n fireEvent(\"update\", handleNumber);\n fireEvent(\"slide\", handleNumber);\n });\n // If target is a connect, then fire drag event\n if (connect != undefined) {\n fireEvent(\"drag\", firstHandle);\n }\n }\n }\n // Takes a base value and an offset. This offset is used for the connect bar size.\n // In the initial design for this feature, the origin element was 1% wide.\n // Unfortunately, a rounding bug in Chrome makes it impossible to implement this feature\n // in this manner: https://bugs.chromium.org/p/chromium/issues/detail?id=798223\n function transformDirection(a, b) {\n return options.dir ? 100 - a - b : a;\n }\n // Updates scope_Locations and scope_Values, updates visual state\n function updateHandlePosition(handleNumber, to) {\n // Update locations.\n scope_Locations[handleNumber] = to;\n // Convert the value to the slider stepping/range.\n scope_Values[handleNumber] = scope_Spectrum.fromStepping(to);\n var translation = transformDirection(to, 0) - scope_DirOffset;\n var translateRule = \"translate(\" + inRuleOrder(translation + \"%\", \"0\") + \")\";\n scope_Handles[handleNumber].style[options.transformRule] = translateRule;\n updateConnect(handleNumber);\n updateConnect(handleNumber + 1);\n }\n // Handles before the slider middle are stacked later = higher,\n // Handles after the middle later is lower\n // [[7] [8] .......... | .......... [5] [4]\n function setZindex() {\n scope_HandleNumbers.forEach(function (handleNumber) {\n var dir = scope_Locations[handleNumber] > 50 ? -1 : 1;\n var zIndex = 3 + (scope_Handles.length + dir * handleNumber);\n scope_Handles[handleNumber].style.zIndex = String(zIndex);\n });\n }\n // Test suggested values and apply margin, step.\n // if exactInput is true, don't run checkHandlePosition, then the handle can be placed in between steps (#436)\n function setHandle(handleNumber, to, lookBackward, lookForward, exactInput, smoothSteps) {\n if (!exactInput) {\n to = checkHandlePosition(scope_Locations, handleNumber, to, lookBackward, lookForward, false, smoothSteps);\n }\n if (to === false) {\n return false;\n }\n updateHandlePosition(handleNumber, to);\n return true;\n }\n // Updates style attribute for connect nodes\n function updateConnect(index) {\n // Skip connects set to false\n if (!scope_Connects[index]) {\n return;\n }\n var l = 0;\n var h = 100;\n if (index !== 0) {\n l = scope_Locations[index - 1];\n }\n if (index !== scope_Connects.length - 1) {\n h = scope_Locations[index];\n }\n // We use two rules:\n // 'translate' to change the left/top offset;\n // 'scale' to change the width of the element;\n // As the element has a width of 100%, a translation of 100% is equal to 100% of the parent (.noUi-base)\n var connectWidth = h - l;\n var translateRule = \"translate(\" + inRuleOrder(transformDirection(l, connectWidth) + \"%\", \"0\") + \")\";\n var scaleRule = \"scale(\" + inRuleOrder(connectWidth / 100, \"1\") + \")\";\n scope_Connects[index].style[options.transformRule] =\n translateRule + \" \" + scaleRule;\n }\n // Parses value passed to .set method. Returns current value if not parse-able.\n function resolveToValue(to, handleNumber) {\n // Setting with null indicates an 'ignore'.\n // Inputting 'false' is invalid.\n if (to === null || to === false || to === undefined) {\n return scope_Locations[handleNumber];\n }\n // If a formatted number was passed, attempt to decode it.\n if (typeof to === \"number\") {\n to = String(to);\n }\n to = options.format.from(to);\n if (to !== false) {\n to = scope_Spectrum.toStepping(to);\n }\n // If parsing the number failed, use the current value.\n if (to === false || isNaN(to)) {\n return scope_Locations[handleNumber];\n }\n return to;\n }\n // Set the slider value.\n function valueSet(input, fireSetEvent, exactInput) {\n var values = asArray(input);\n var isInit = scope_Locations[0] === undefined;\n // Event fires by default\n fireSetEvent = fireSetEvent === undefined ? true : fireSetEvent;\n // Animation is optional.\n // Make sure the initial values were set before using animated placement.\n if (options.animate && !isInit) {\n addClassFor(scope_Target, options.cssClasses.tap, options.animationDuration);\n }\n // First pass, without lookAhead but with lookBackward. Values are set from left to right.\n scope_HandleNumbers.forEach(function (handleNumber) {\n setHandle(handleNumber, resolveToValue(values[handleNumber], handleNumber), true, false, exactInput);\n });\n var i = scope_HandleNumbers.length === 1 ? 0 : 1;\n // Spread handles evenly across the slider if the range has no size (min=max)\n if (isInit && scope_Spectrum.hasNoSize()) {\n exactInput = true;\n scope_Locations[0] = 0;\n if (scope_HandleNumbers.length > 1) {\n var space_1 = 100 / (scope_HandleNumbers.length - 1);\n scope_HandleNumbers.forEach(function (handleNumber) {\n scope_Locations[handleNumber] = handleNumber * space_1;\n });\n }\n }\n // Secondary passes. Now that all base values are set, apply constraints.\n // Iterate all handles to ensure constraints are applied for the entire slider (Issue #1009)\n for (; i < scope_HandleNumbers.length; ++i) {\n scope_HandleNumbers.forEach(function (handleNumber) {\n setHandle(handleNumber, scope_Locations[handleNumber], true, true, exactInput);\n });\n }\n setZindex();\n scope_HandleNumbers.forEach(function (handleNumber) {\n fireEvent(\"update\", handleNumber);\n // Fire the event only for handles that received a new value, as per #579\n if (values[handleNumber] !== null && fireSetEvent) {\n fireEvent(\"set\", handleNumber);\n }\n });\n }\n // Reset slider to initial values\n function valueReset(fireSetEvent) {\n valueSet(options.start, fireSetEvent);\n }\n // Set value for a single handle\n function valueSetHandle(handleNumber, value, fireSetEvent, exactInput) {\n // Ensure numeric input\n handleNumber = Number(handleNumber);\n if (!(handleNumber >= 0 && handleNumber < scope_HandleNumbers.length)) {\n throw new Error(\"noUiSlider: invalid handle number, got: \" + handleNumber);\n }\n // Look both backward and forward, since we don't want this handle to \"push\" other handles (#960);\n // The exactInput argument can be used to ignore slider stepping (#436)\n setHandle(handleNumber, resolveToValue(value, handleNumber), true, true, exactInput);\n fireEvent(\"update\", handleNumber);\n if (fireSetEvent) {\n fireEvent(\"set\", handleNumber);\n }\n }\n // Get the slider value.\n function valueGet(unencoded) {\n if (unencoded === void 0) { unencoded = false; }\n if (unencoded) {\n // return a copy of the raw values\n return scope_Values.length === 1 ? scope_Values[0] : scope_Values.slice(0);\n }\n var values = scope_Values.map(options.format.to);\n // If only one handle is used, return a single value.\n if (values.length === 1) {\n return values[0];\n }\n return values;\n }\n // Removes classes from the root and empties it.\n function destroy() {\n // remove protected internal listeners\n removeEvent(INTERNAL_EVENT_NS.aria);\n removeEvent(INTERNAL_EVENT_NS.tooltips);\n Object.keys(options.cssClasses).forEach(function (key) {\n removeClass(scope_Target, options.cssClasses[key]);\n });\n while (scope_Target.firstChild) {\n scope_Target.removeChild(scope_Target.firstChild);\n }\n delete scope_Target.noUiSlider;\n }\n function getNextStepsForHandle(handleNumber) {\n var location = scope_Locations[handleNumber];\n var nearbySteps = scope_Spectrum.getNearbySteps(location);\n var value = scope_Values[handleNumber];\n var increment = nearbySteps.thisStep.step;\n var decrement = null;\n // If snapped, directly use defined step value\n if (options.snap) {\n return [\n value - nearbySteps.stepBefore.startValue || null,\n nearbySteps.stepAfter.startValue - value || null,\n ];\n }\n // If the next value in this step moves into the next step,\n // the increment is the start of the next step - the current value\n if (increment !== false) {\n if (value + increment > nearbySteps.stepAfter.startValue) {\n increment = nearbySteps.stepAfter.startValue - value;\n }\n }\n // If the value is beyond the starting point\n if (value > nearbySteps.thisStep.startValue) {\n decrement = nearbySteps.thisStep.step;\n }\n else if (nearbySteps.stepBefore.step === false) {\n decrement = false;\n }\n // If a handle is at the start of a step, it always steps back into the previous step first\n else {\n decrement = value - nearbySteps.stepBefore.highestStep;\n }\n // Now, if at the slider edges, there is no in/decrement\n if (location === 100) {\n increment = null;\n }\n else if (location === 0) {\n decrement = null;\n }\n // As per #391, the comparison for the decrement step can have some rounding issues.\n var stepDecimals = scope_Spectrum.countStepDecimals();\n // Round per #391\n if (increment !== null && increment !== false) {\n increment = Number(increment.toFixed(stepDecimals));\n }\n if (decrement !== null && decrement !== false) {\n decrement = Number(decrement.toFixed(stepDecimals));\n }\n return [decrement, increment];\n }\n // Get the current step size for the slider.\n function getNextSteps() {\n return scope_HandleNumbers.map(getNextStepsForHandle);\n }\n // Updatable: margin, limit, padding, step, range, animate, snap\n function updateOptions(optionsToUpdate, fireSetEvent) {\n // Spectrum is created using the range, snap, direction and step options.\n // 'snap' and 'step' can be updated.\n // If 'snap' and 'step' are not passed, they should remain unchanged.\n var v = valueGet();\n var updateAble = [\n \"margin\",\n \"limit\",\n \"padding\",\n \"range\",\n \"animate\",\n \"snap\",\n \"step\",\n \"format\",\n \"pips\",\n \"tooltips\",\n ];\n // Only change options that we're actually passed to update.\n updateAble.forEach(function (name) {\n // Check for undefined. null removes the value.\n if (optionsToUpdate[name] !== undefined) {\n originalOptions[name] = optionsToUpdate[name];\n }\n });\n var newOptions = testOptions(originalOptions);\n // Load new options into the slider state\n updateAble.forEach(function (name) {\n if (optionsToUpdate[name] !== undefined) {\n options[name] = newOptions[name];\n }\n });\n scope_Spectrum = newOptions.spectrum;\n // Limit, margin and padding depend on the spectrum but are stored outside of it. (#677)\n options.margin = newOptions.margin;\n options.limit = newOptions.limit;\n options.padding = newOptions.padding;\n // Update pips, removes existing.\n if (options.pips) {\n pips(options.pips);\n }\n else {\n removePips();\n }\n // Update tooltips, removes existing.\n if (options.tooltips) {\n tooltips();\n }\n else {\n removeTooltips();\n }\n // Invalidate the current positioning so valueSet forces an update.\n scope_Locations = [];\n valueSet(isSet(optionsToUpdate.start) ? optionsToUpdate.start : v, fireSetEvent);\n }\n // Initialization steps\n function setupSlider() {\n // Create the base element, initialize HTML and set classes.\n // Add handles and connect elements.\n scope_Base = addSlider(scope_Target);\n addElements(options.connect, scope_Base);\n // Attach user events.\n bindSliderEvents(options.events);\n // Use the public value method to set the start values.\n valueSet(options.start);\n if (options.pips) {\n pips(options.pips);\n }\n if (options.tooltips) {\n tooltips();\n }\n aria();\n }\n setupSlider();\n var scope_Self = {\n destroy: destroy,\n steps: getNextSteps,\n on: bindEvent,\n off: removeEvent,\n get: valueGet,\n set: valueSet,\n setHandle: valueSetHandle,\n reset: valueReset,\n // Exposed for unit testing, don't use this in your application.\n __moveHandles: function (upward, proposal, handleNumbers) {\n moveHandles(upward, proposal, scope_Locations, handleNumbers);\n },\n options: originalOptions,\n updateOptions: updateOptions,\n target: scope_Target,\n removePips: removePips,\n removeTooltips: removeTooltips,\n getPositions: function () {\n return scope_Locations.slice();\n },\n getTooltips: function () {\n return scope_Tooltips;\n },\n getOrigins: function () {\n return scope_Handles;\n },\n pips: pips, // Issue #594\n };\n return scope_Self;\n }\n // Run the standard initializer\n function initialize(target, originalOptions) {\n if (!target || !target.nodeName) {\n throw new Error(\"noUiSlider: create requires a single element, got: \" + target);\n }\n // Throw an error if the slider was already initialized.\n if (target.noUiSlider) {\n throw new Error(\"noUiSlider: Slider was already initialized.\");\n }\n // Test the options and create the slider environment;\n var options = testOptions(originalOptions);\n var api = scope(target, options, originalOptions);\n target.noUiSlider = api;\n return api;\n }\n var nouislider = {\n // Exposed for unit testing, don't use this in your application.\n __spectrum: Spectrum,\n // A reference to the default classes, allows global changes.\n // Use the cssClasses option for changes to one slider.\n cssClasses: cssClasses,\n create: initialize,\n };\n\n exports.create = initialize;\n exports.cssClasses = cssClasses;\n exports[\"default\"] = nouislider;\n\n Object.defineProperty(exports, '__esModule', { value: true });\n\n}));\n","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--6-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SplitLayout.vue?vue&type=style&index=0&id=2254ac6c&scoped=true&lang=css&\"","export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./GenerateArrayDialog.vue?vue&type=style&index=0&id=c6cad3e2&lang=scss&scoped=true&\"","export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ResolutionToolbar.vue?vue&type=style&index=0&id=17cb0ead&lang=scss&scoped=true&\"","export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ConnectionPropertyDrawer.vue?vue&type=style&index=0&id=ad2fe0a0&lang=scss&scoped=true&\"","export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./LayerToolbar.vue?vue&type=style&index=0&id=088f6ffc&lang=scss&scoped=true&\"","export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ImportDXFDialog.vue?vue&type=style&index=0&id=89ff16ba&lang=scss&scoped=true&\"","export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./HelpDialog.vue?vue&type=style&index=0&id=20543ec0&lang=scss&scoped=true&\"","module.exports = __webpack_public_path__ + \"img/CHANNEL.6ac8d4e3.png\";","export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--6-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Visualiser.vue?vue&type=style&index=0&id=c5eef416&lang=css&scoped=true&\"","export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./EditBorderDialog.vue?vue&type=style&index=0&id=180b9f39&lang=scss&scoped=true&\"","export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ChangeAllDialog.vue?vue&type=style&index=0&id=41dfe81a&lang=scss&scoped=true&\"","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./PropertyDrawer.vue?vue&type=style&index=0&id=420c4732&lang=scss&scoped=true&\"","export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ComponentContextMenu.vue?vue&type=style&index=0&id=94aacf7a&lang=scss&scoped=true&\"","export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./MoveDialog.vue?vue&type=style&index=0&id=151188cb&lang=scss&scoped=true&\"","export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ManufacturingPanel.vue?vue&type=style&index=0&id=58399cfc&lang=scss&scoped=true&\"","export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ComponentToolBar.vue?vue&type=style&index=0&id=690cc93d&lang=scss&scoped=true&\"","export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ConnectionContextMenu.vue?vue&type=style&index=0&id=7fd25946&lang=scss&scoped=true&\"","export type Point = [number, number];\n\nexport type Segment = [Point, Point];\n\nexport type ParamsInterchangeType = {[key: string]: any};\n\nexport type ToolPaperObject = paper.CompoundPath | paper.Path | paper.PointText | paper.PathItem;\n\nexport type InterchangeV1_2 = {\n name: string;\n params: ParamsInterchangeType;\n layers: Array;\n groups: Array;\n components: Array;\n connections: Array;\n valves: Array;\n version: string;\n renderLayers: Array;\n features: Array;\n};\n\nexport enum LogicalLayerType {\n FLOW = \"FLOW\",\n CONTROL = \"CONTROL\",\n INTEGRATION = \"INTEGRATION\"\n}\n\nexport enum ValveType {\n NORMALLY_OPEN = \"NORMALLY_OPEN\",\n NORMALLY_CLOSED = \"NORMALLY_CLOSED\",\n}\n\nexport enum GeometricOperationType{\n UNION = \"UNION\",\n INTERSECTION = \"INTERSECTION\",\n DIFFERENCE = \"SUBTRACTION\",\n XOR = \"XOR\",\n}\n\nexport type DeviceInterchangeV1 = {\n name: string;\n params: ParamsInterchangeType;\n layers: Array;\n groups: Array;\n components: Array;\n connections: Array;\n valves: Array;\n version: string;\n};\n\nexport type DeviceInterchangeV1_1 = {\n name: string;\n params: ParamsInterchangeType;\n layers: Array;\n groups: Array;\n components: Array;\n connections: Array;\n version: string;\n};\n\nexport type ComponentInterchangeV1 = {\n id: string;\n name: string;\n entity: string;\n params: ParamsInterchangeType;\n \"x-span\": number;\n \"y-span\": number;\n ports: Array;\n layers: Array;\n};\n\nexport type ConnectionInterchangeV1_2 = {\n id: string;\n name: string;\n entity: string;\n source: ConnectionTargetInterchangeV1;\n sinks: Array;\n paths: Array;\n params: ParamsInterchangeType;\n layer: string;\n};\n\nexport type ValveInterchangeV1_2 = {\n componentid: string;\n connectionid: string;\n type: ValveType;\n params: ParamsInterchangeType;\n}\n\nexport type LayerInterchangeV1 = {\n id: string;\n name: string;\n params: ParamsInterchangeType;\n group: string;\n type: string;\n features: Array;\n};\n\nexport type RenderLayerInterchangeV1_2 = {\n id: string;\n features: Array;\n modellayer: string | null;\n color: string | undefined;\n name: string;\n type: string;\n};\n\nexport type FeatureInterchangeV1_2 = {\n id: string;\n name: string;\n macro: string;\n layerID: string | null;\n referenceID: string | null; // Delete this in the future\n params: ParamsInterchangeType;\n dxfData: any; // 3DuF specific data for raw import/export of DXF objects\n type: string;\n};\n\nexport type GeometryElementInterchangeV1_2 = {\n id: string;\n macro: string;\n params: ParamsInterchangeType;\n geometricOperation: string;\n mgflayerID: string;\n}\n\nexport type ComponentPortInterchangeV1 = {\n x: number;\n y: number;\n label: string;\n layer: string;\n};\n\nexport type ConnectionTargetInterchangeV1 = {\n component: string;\n port: string;\n};\n\nexport type ConnectionPathInterchangeV1_2 = {\n wayPoints: Array;\n source: ConnectionTargetInterchangeV1 | null;\n sink: ConnectionTargetInterchangeV1 | null;\n features: Array;\n};\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('v-app',{attrs:{\"id\":\"3duf\"}},[_c('LayoutSidebar')],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',[_c('div',{attrs:{\"id\":\"view-container\"}},[_c('div',{attrs:{\"id\":\"canvas_block\"}},[_c('canvas',{ref:\"rendingcanvas\",attrs:{\"id\":\"c\",\"tabindex\":\"0\",\"resize\":\"\"}}),_vm._t(\"default\",function(){return [_c('ComponentContextMenu',{ref:\"contextMenu\",attrs:{\"id\":\"contextMenu\"}})]}),_vm._t(\"default\",function(){return [_c('ConnectionContextMenu',{ref:\"contextMenu\",attrs:{\"id\":\"contextMenu\"}})]})],2),_c('div',{attrs:{\"id\":\"renderContainer\"}})]),_c('ResolutionToolbar'),_c('ZoomSlider')],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import ComponentPort from \"../core/componentPort\";\nimport { ToolPaperObject } from \"../core/init\";\nimport paper from \"paper\";\n//import { ManufacturingInfo } from \"../manufacturing/ManufacturingInfo\";\nimport { LogicalLayerType } from \"../core/init\";\nimport {PRIMITIVES_SERVER} from \"../../componentAPI\";\nexport enum PositionToolType {\n FEATURE_POSITION_TOOL = \"positionTool\",\n COMPONENT_POSITION_TOOL = \"componentPositionTool\",\n MULTILAYER_POSITION_TOOL = \"multilayerPositionTool\",\n VALVE_INSERTION_TOOL = \"valveInsertionTool\"\n}\n\nexport default class Template {\n protected __unique: { [key: string]: string } | null = null;\n protected __heritable: { [key: string]: string } | null = null;\n protected __defaults: { [key: string]: number } | null = null;\n protected __minimum: { [key: string]: number } | null = null;\n protected __maximum: { [key: string]: number } | null = null;\n protected __units: { [key: string]: string } | null = null;\n protected __placementTool: string | null = null;\n protected __toolParams: { [key: string]: string } | null = null; // { position: \"position\" };\n protected __featureParams: { [key: string]: string } | null = null;\n protected __targetParams: { [key: string]: string } | null = null;\n protected __mint: string | null = null;\n protected __renderKeys: Array = [\"FLOW\"];\n protected _previewImage: string = \"\";\n protected __zOffsetKeys: { [key: string]: string } | null = null;\n protected __substrateOffset: { [key: string]: string } | null = null;\n protected __childFeatureMacros: Array = []; // Store all the macro names\n \n /**\n *Creates an instance of Template.\n * @memberof Template\n */\n constructor() {\n this.__setupDefinitions();\n }\n\n /**\n * Returns the mint definition for the component definition\n *\n * @readonly\n * @type {string}\n * @memberof Template\n */\n get mint(): string {\n if (this.__mint === null) {\n throw new Error(\"User needs to provide unique MINT string for component type\");\n }\n return this.__mint;\n }\n\n /**\n * Returns the z-offset-key for the given layer type\n *\n * @param {string}\n * @memberof Template\n */\n zOffsetKey(key: string): string {\n if (this.__zOffsetKeys === null) {\n throw new Error(\"zOffsetKey cannot be null instantiate in the __setupDefinitions\");\n } else if (this.__zOffsetKeys.hasOwnProperty(key)) {\n return this.__zOffsetKeys[key];\n } else {\n throw new Error(\"zOffsetKey does not contain key \" + key);\n }\n }\n\n /**\n * Returns the z-offset-key for the given layer type\n *\n * @param {string}\n * @memberof Template\n */\n substrateOffset(key: string): string {\n if (this.__substrateOffset === null) {\n throw new Error(\"substrateOffset cannot be null instantiate in the __setupDefinitions\");\n } else if (this.__substrateOffset.hasOwnProperty(key)) {\n return this.__substrateOffset[key];\n } else {\n throw new Error(\"substrateOffset does not contain key \" + key);\n }\n }\n\n /**\n * TODO - Remove this thing's dependency\n */\n get featureParams(): { [key: string]: string } {\n if (this.__featureParams === null) {\n throw new Error(\"featureParams cannot be null instantiate in the __setupDefinitions\");\n }\n\n return this.__featureParams;\n }\n\n /**\n * TODO - Remove this thing's dependency\n */\n get targetParams(): { [key: string]: string } {\n if (this.__targetParams === null) {\n throw new Error(\"targetParams cannot be null instantiate in the __setupDefinitions\");\n }\n\n return this.__targetParams;\n }\n\n /**\n * Returns the placement tool for the component/feature\n *\n * @readonly\n * @type {string}\n * @memberof Template\n */\n get placementTool(): string {\n if (this.__placementTool === null) {\n throw new Error(\"placementtool cannot be null instantiate in the __setupDefinitions\");\n }\n\n return this.__placementTool;\n }\n\n /**\n * Returns the tool params for the component\n *\n * @readonly\n * @type {{ [key: string]: string }}\n * @memberof Template\n */\n get toolParams(): { [key: string]: string } {\n if (this.__toolParams === null) {\n throw new Error(\"toolparams cannot be null instantiate in the __setupDefinitions\");\n }\n\n return this.__toolParams;\n }\n\n /**\n * Returns the default value for the component params\n *\n * @readonly\n * @type {{ [key: string]: number }}\n * @memberof Template\n */\n get defaults(): { [key: string]: number } {\n if (this.__defaults === null) {\n throw new Error(\"defaults cannot be null instantiate in the __setupDefinitions\");\n }\n\n return this.__defaults;\n }\n\n /**\n * Returns the min value for the component params\n *\n * @readonly\n * @type {{ [key: string]: number }}\n * @memberof Template\n */\n get minimum(): { [key: string]: number } {\n if (this.__minimum === null) {\n throw new Error(\"minimum cannot be null instantiate in the __setupDefinitions\");\n }\n\n return this.__minimum;\n }\n\n /**\n * Returns the max value for the component params\n *\n * @readonly\n * @type {{ [key: string]: number }}\n * @memberof Template\n */\n get maximum(): { [key: string]: number } {\n if (this.__maximum === null) {\n throw new Error(\"maximum cannot be null instantiate in the __setupDefinitions\");\n }\n\n return this.__maximum;\n }\n\n /**\n * Returns the units for the component params\n *\n * @readonly\n * @type {{ [key: string]: string }}\n * @memberof Template\n */\n get units(): { [key: string]: string } {\n if (this.__units === null) {\n throw new Error(\"units cannot be null instantiate in the __setupDefinitions\");\n }\n\n return this.__units;\n }\n\n /**\n * Returns the unique params for the component definition\n *\n * @readonly\n * @type {{ [key: string]: string }}\n * @memberof Template\n */\n get unique(): { [key: string]: string } {\n if (this.__unique === null) {\n throw new Error(\"unique cannot be null instantiate in the __setupDefinitions\");\n }\n\n return this.__unique;\n }\n\n /**\n * Returns the heritable properties for the component definition\n *\n * @readonly\n * @type {{ [key: string]: string }}\n * @memberof Template\n */\n get heritable(): { [key: string]: string } {\n if (this.__heritable === null) {\n throw new Error(\"Heritable cannot be null instantiate in the __setupDefinitions\");\n }\n return this.__heritable;\n }\n\n /**\n * Returns the renderkeys for the component definition\n *\n * @readonly\n * @type {Array}\n * @memberof Template\n */\n get renderKeys(): Array {\n if (this.__renderKeys === null) {\n throw new Error(\"renderKeys cannot be null instantiate in the __setupDefinitions\");\n }\n\n return this.__renderKeys;\n }\n\n /**\n * Returns the preview link for the component\n *\n * @readonly\n * @type {string}\n * @memberof Template\n */\n get previewImage(): string {\n return this._previewImage;\n }\n get childFeatureMacros(): Array {\n return this.__childFeatureMacros;\n }\n \n\n /**\n * Override this method to setup the definitions for the component\n *\n * @memberof Template\n */\n __setupDefinitions(): void {\n this.__unique = {\n position: \"Point\"\n };\n\n this.__heritable = {\n componentSpacing: \"Float\",\n height: \"Float\"\n };\n\n this.__defaults = {\n componentSpacing: 1000,\n height: 250\n };\n\n this.__units = {\n componentSpacing: \"μm\",\n height: \"μm\"\n };\n\n this.__minimum = {\n componentSpacing: 0,\n height: 10\n };\n\n this.__maximum = {\n componentSpacing: 10000,\n height: 1200\n };\n\n this.__featureParams = {\n componentSpacing: \"componentSpacing\",\n position: \"position\"\n };\n\n this.__targetParams = {\n };\n\n this.__placementTool = \"componentPositionTool\";\n\n this.__toolParams = {\n position: \"position\"\n };\n\n this.__renderKeys = [\"FLOW\"];\n\n this.__mint = \"TEMPLATE\";\n\n this.__zOffsetKeys = {\n FLOW: \"height\"\n };\n\n this.__substrateOffset = {\n FLOW: \"0\"\n };\n\n /*\n Check https://github.com/CIDARLAB/3DuF/wiki/Adding-new-components-v2 for more example data\n */\n //throw new Error(\"User needs to provide method for component definition, look at examples\");\n }\n\n /*\n * Replacing /src/app/view/render2D/primitiveSets2D/basic2D\n */\n\n /**\n * Returns the paperjs render for a given key (can be control/flow or anything user defined key that for future\n * compatibility.\n * @param key\n */\n render2D(params: { [key: string]: any }, key: string): ToolPaperObject {\n console.error(\"Default component template being used. User needs to provide method for component definition, look at examples\");\n const x = params.position[0];\n const y = params.position[1];\n\n const rect = new paper.Path.Rectangle(new paper.Point(x - 100, y - 100), new paper.Size(5000, 5000));\n rect.fillColor = params.color;\n return rect;\n }\n\n \n /**\n * Returns the render target for the component\n *\n * @param {string} key\n * @param {{ [key: string]: any }} params\n * @returns {ToolPaperObject}\n * @memberof Template\n */\n render2DTarget(key: string | null, params: { [key: string]: any }): ToolPaperObject {\n throw new Error(\"User needs to provide method for component definition, look at examples\");\n }\n\n /**\n * Returns the ports for the component definition\n * @param params\n */\n getPorts(params: { [key: string]: any }): Array {\n console.error(\"User needs to provide method for component definition, look at examples\");\n const ports = [];\n ports.push(new ComponentPort(0, 0, \"1\", LogicalLayerType.FLOW));\n return ports;\n }\n\n /**\n * Returns the bounds for component for given params. This assummes that the mint definiton, \n * render2D is implemented for the given defintion.\n *\n * @param {{ [key: string]: any }} params\n * @returns {paper.Rectangle}\n * @memberof Template\n */\n getBounds(params: { [key: string]: any }): paper.Rectangle{\n const renderkeys = this.renderKeys;\n const features: Array = [];\n for (let i = 0; i < renderkeys.length; i++) {\n const feature = this.render2D(params, renderkeys[i]);\n if(feature instanceof paper.PointText){\n continue;\n }\n features.push(feature.bounds);\n }\n\n const unitedBounds = features.reduce((bbox, item): paper.Rectangle => {\n if (item === null || item instanceof paper.PointText) {\n return bbox;\n }else{\n return !bbox ? item : bbox.unite(item);\n }\n });\n if (unitedBounds) {\n return unitedBounds;\n } else {\n return new paper.Rectangle(0, 0, 0, 0);\n }\n }\n\n /**\n * Returns the dimensions for the component for given params.\n *\n * @param {{ [key: string]: any }} params\n * @returns {{ xspan: any; yspan: any }}\n * @memberof Template\n */\n getDimensions(params: { [key: string]: any }): { xspan: any; yspan: any } {\n // TODO - Figure out a workaround for this\n if (PRIMITIVES_SERVER) {\n paper.setup(new paper.Size([64000, 48000]));\n }\n\n params.position = [0, 0];\n\n const unitedBounds = this.getBounds(params);\n if (unitedBounds === null) {\n throw new Error(\"No bounds found for component\");\n } \n const xspan = unitedBounds.width;\n const yspan = unitedBounds.height;\n // console.log(\"Dimensions:\",xspan, yspan);\n return { xspan: xspan, yspan: yspan };\n }\n\n /**\n * Returns the drawing offset for the component for given params. This assummes\n * that the mint definiton, and the getBounds methd works correctly\n *\n * @param {{ [key: string]: any }} params\n * @returns\n * @memberof Template\n */\n getDrawOffset(params: { [key: string]: any }) {\n params.position = [0, 0];\n params.rotation = 0;\n const position = params.position;\n const positionUnitedBounds = this.getBounds(params);\n // console.log(positionUnitedBounds.topLeft, position);\n if (positionUnitedBounds === null) {\n throw new Error(\"unitedBounds is null\");\n }\n const x_new = position[0] - positionUnitedBounds.topLeft.x;\n const y_new = position[1] - positionUnitedBounds.topLeft.y;\n return [x_new, y_new];\n }\n}\n","import uuid from \"node-uuid\";\nimport paper from \"paper\";\nimport Component from \"./component\";\nimport { ComponentPortInterchangeV1, LogicalLayerType, Point } from \"./init\";\n\nexport default class ComponentPort {\n protected _id: string;\n protected _x: number;\n protected _y: number;\n protected _label: string;\n protected _layer: LogicalLayerType;\n\n /**\n * Default constructor for ComponentPorts\n * @param {Number} x X coordinate\n * @param {Number} y Y coordinate\n * @param {String} label Name of the component\n * @param {string} layer\n */\n constructor(x: number, y: number, label: string, layer: LogicalLayerType) {\n this._id = uuid.v1();\n this._x = x;\n this._y = y;\n this._label = label;\n this._layer = layer;\n }\n\n /**\n * Gets the layer of the component port\n * @returns {string} Returns layer\n * @memberof ComponentPort\n */\n get layer() {\n return this._layer;\n }\n\n /**\n * Sets the layer\n * @param {string} value Value of the layer\n * @memberof ComponentPort\n * @returns {void}\n */\n set layer(value) {\n this._layer = value;\n }\n\n /**\n * Gets the label\n * @returns {string} Returns the label of the component port\n * @memberof ComponentPort\n */\n get label() {\n return this._label;\n }\n\n /**\n * Sets the label of the component port\n * @param {string} value Label\n * @memberof ComponentPort\n * @returns {void}\n */\n set label(value) {\n this._label = value;\n }\n\n /**\n * Gets the Y coordinate of the component port\n * @returns {number} Returns the y coordinate\n * @memberof ComponentPort\n */\n get y() {\n return this._y;\n }\n\n /**\n * Sets the Y coordinate of the component port\n * @param {number} y Value of the Y coordinate\n * @memberof ComponentPort\n * @returns {void}\n */\n set y(value) {\n this._y = value;\n }\n\n /**\n * Gets the X coordinate of the component port\n * @returns {number} Returns the X coordinate\n * @memberof ComponentPort\n */\n get x() {\n return this._x;\n }\n\n /**\n * Sets the X coordinate of the component port\n * @param {number} value Value of the X coordinate\n * @returns {void}\n * @memberof ComponentPort\n */\n set x(value) {\n this._x = value;\n }\n\n /**\n * Gets the ID of the component port\n * @returns {string} Returns the ID\n * @memberof ComponentPort\n */\n get id() {\n return this._id;\n }\n\n /**\n * Set the ID of the component port\n * @param {string} value ID\n * @memberof ComponentPort\n * @returns {void}\n */\n set id(value) {\n this._id = value;\n }\n\n /**\n * Converts to Interchange V1 format\n * @returns {Object} Returns a object with Interchange V1 format\n * @memberof ComponentPort\n */\n toInterchangeV1(): ComponentPortInterchangeV1 {\n return {\n x: this._x,\n y: this._y,\n layer: this._layer,\n label: this._label\n };\n }\n\n /**\n * Returns the absolute postition of the component\n * @param {Object} componentport Component port object\n * @param {Object} component Component object\n * @returns {Array} Returns an array which contains the X absolute coordinate and the y absolute coordinate\n * @memberof ComponentPort\n */\n static calculateAbsolutePosition(componentport: ComponentPort, component: Component): Point {\n const topleftposition = component.getValue(\"position\");\n const point = new paper.Point(topleftposition[0] - component.offset[0] + componentport.x, topleftposition[1] - component.offset[1] + componentport.y);\n const featpoint = new paper.Point(topleftposition[0] - component.offset[0], topleftposition[1] - component.offset[1]);\n const rotatedpoint = point.rotate(component.getRotation(), featpoint);\n return [rotatedpoint.x, rotatedpoint.y];\n }\n\n /**\n * Creates a new Component Port from an Interchange V1 format\n * @param {} json\n * @returns {ComponentPort} Returns a component port object\n * @memberof ComponentPort\n */\n static fromInterchangeV1(json: ComponentPortInterchangeV1): ComponentPort {\n let layer = LogicalLayerType.FLOW;\n if(json.layer === \"FLOW\"){\n layer = LogicalLayerType.FLOW;\n } else if (json.layer === \"CONTROL\"){\n layer = LogicalLayerType.CONTROL;\n } else if (json.layer === \"INTEGRATION\"){\n layer = LogicalLayerType.INTEGRATION;\n }\n return new ComponentPort(json.x, json.y, json.label, layer);\n }\n}\n","import Template from \"./template\";\nimport paper from \"paper\";\n\nexport default class Text extends Template {\n constructor() {\n super();\n }\n\n __setupDefinitions(): void {\n this.__unique = {\n position: \"Point\"\n };\n\n this.__heritable = {\n text: \"String\",\n height: \"Float\",\n fontSize: \"Float\"\n };\n\n this.__defaults = {\n fontSize: 10000 / 3,\n height: 250\n };\n\n this.__units = {\n fontSize: \"μm\",\n height: \"μm\"\n };\n\n this.__minimum = {\n fontSize: 10000 / 3,\n height: 1\n };\n\n this.__maximum = {\n fontSize: 10000 / 3,\n height: 10000\n };\n\n this.__toolParams = {\n position: \"position\"\n };\n\n this.__featureParams = {\n position: \"position\",\n text: \"text\",\n fontSize: \"fontSize\",\n height: \"height\"\n };\n\n this.__targetParams = {\n text: \"text\",\n fontSize: \"fontSize\",\n height: \"height\"\n };\n\n this.__placementTool = \"PositionTool\";\n\n this.__renderKeys = [\"FLOW\"];\n\n this.__mint = \"TEXT\";\n\n this.__zOffsetKeys = {\n FLOW: \"height\"\n };\n\n this.__substrateOffset = {\n FLOW: \"0\"\n };\n }\n\n render2D(params: { [k: string]: any }, key: string) {\n // Regardless of the key...\n const position = params.position;\n const text = params.text;\n const color = params.color;\n const rendered = new paper.PointText(new paper.Point(position[0], position[1]));\n rendered.justification = \"center\";\n rendered.fillColor = color;\n /// rendered.content = feature.getText();\n rendered.content = text;\n rendered.fontSize = 10000 / 3;\n return rendered;\n }\n\n render2DTarget(key: string | null, params: { [k: string]: any }) {\n if (key === null) {\n key = this.__renderKeys[0];\n }\n const render = this.render2D(params, key);\n render.fillColor!.alpha = 0.5;\n return render;\n }\n}\n","import Template from \"./template\";\nimport paper from \"paper\";\nimport ComponentPort from \"../core/componentPort\";\nimport { LogicalLayerType } from \"../core/init\";\n\nexport default class Port extends Template {\n constructor() {\n super();\n }\n\n __setupDefinitions(): void {\n this.__unique = {\n position: \"Point\"\n };\n\n this.__heritable = {\n componentSpacing: \"Float\",\n portRadius: \"Float\",\n height: \"Float\"\n };\n\n this.__defaults = {\n componentSpacing: 1000,\n portRadius: 0.7 * 1000,\n height: 1.1 * 1000\n };\n\n this.__units = {\n componentSpacing: \"μm\",\n portRadius: \"μm\",\n height: \"μm\"\n };\n\n this.__minimum = {\n componentSpacing: 0,\n portRadius: 0.8 * 10,\n height: 10\n };\n\n this.__maximum = {\n componentSpacing: 10000,\n portRadius: 3000,\n height: 1200\n };\n\n this.__placementTool = \"componentPositionTool\";\n\n this.__toolParams = {\n position: \"position\"\n };\n\n this.__featureParams = {\n componentSpacing: \"componentSpacing\",\n position: \"position\",\n portRadius: \"portRadius\"\n };\n\n this.__targetParams = {\n componentSpacing: \"componentSpacing\",\n portRadius: \"portRadius\"\n };\n\n this.__renderKeys = [\"FLOW\"];\n\n this.__mint = \"PORT\";\n\n this.__zOffsetKeys = {\n FLOW: \"height\"\n };\n\n this.__substrateOffset = {\n FLOW: \"0\"\n };\n }\n\n render2D(params: { [k: string]: any }, key: string) {\n // Regardless of the key...\n const position = params.position;\n const radius = params.portRadius;\n const color1 = params.color;\n const pos = new paper.Point(position[0], position[1]);\n const outerCircle = new paper.Path.Circle(pos, radius);\n outerCircle.fillColor = color1;\n return outerCircle;\n }\n\n render2DTarget(key: string | null, params: { [k: string]: any }) {\n if (key === null) {\n key = this.__renderKeys[0];\n }\n const render = this.render2D(params, key);\n render.fillColor!.alpha = 0.5;\n return render;\n }\n\n getPorts(params: { [k: string]: any }) {\n const radius = params.portRadius;\n\n const ports = [];\n\n ports.push(new ComponentPort(0, 0, \"1\", LogicalLayerType.FLOW));\n\n return ports;\n }\n}\n","import Template from \"./template\";\nimport paper from \"paper\";\nimport ComponentPort from \"../core/componentPort\";\nimport { LogicalLayerType } from \"../core/init\";\n\nexport default class Anode extends Template {\n constructor() {\n super();\n }\n\n __setupDefinitions(): void {\n this.__unique = {\n position: \"Point\"\n };\n\n this.__heritable = {\n componentSpacing: \"Float\",\n anodeRadius: \"Float\",\n pegHeight: \"Float\",\n pegWidth: \"Float\",\n height: \"Float\",\n rotation: \"Float\"\n };\n\n this.__defaults = {\n componentSpacing: 1000,\n anodeRadius: 0.9 * 1000,\n pegHeight: 0.2 * 1000,\n pegWidth: 0.7 * 1000,\n height: 1.1 * 1000,\n rotation: 0\n };\n\n this.__units = {\n componentSpacing: \"μm\",\n anodeRadius: \"μm\",\n pegHeight: \"μm\",\n pegWidth: \"μm\",\n height: \"μm\",\n rotation: \"°\"\n };\n\n this.__minimum = {\n componentSpacing: 0,\n anodeRadius: 0.4 * 10,\n pegHeight: 0.1 * 1000,\n pegWidth: 0.1 * 1000,\n height: 10,\n rotation: 0\n };\n\n this.__maximum = {\n componentSpacing: 10000,\n anodeRadius: 2000,\n pegHeight: 2 * 1000,\n pegWidth: 2 * 1000,\n height: 1200,\n rotation: 90\n };\n\n this.__placementTool = \"componentPositionTool\";\n\n this.__toolParams = {\n position: \"position\"\n };\n\n this.__featureParams = {\n componentSpacing: \"componentSpacing\",\n position: \"position\",\n anodeRadius: \"anodeRadius\",\n pegHeight: \"pegHeight\",\n pegWidth: \"pegWidth\",\n rotation: \"rotation\"\n };\n\n this.__targetParams = {\n componentSpacing: \"componentSpacing\",\n anodeRadius: \"anodeRadius\",\n pegHeight: \"pegHeight\",\n pegWidth: \"pegWidth\",\n rotation: \"rotation\"\n };\n\n this.__renderKeys = [\"FLOW\"];\n\n this.__mint = \"ANODE\";\n }\n\n render2D(params: { [k: string]: any }, key: string): paper.PathItem {\n // Regardless of the key...\n const position = params.position;\n const radius = params.anodeRadius;\n const pegheight = params.pegHeight;\n const pegwidth = params.pegWidth;\n const rotation = params.rotation;\n const color1 = params.color;\n const pos = new paper.Point(position[0], position[1]);\n const outerCircle = new paper.Path.Circle(pos, radius);\n outerCircle.fillColor = color1;\n\n const peg = new paper.Path.Rectangle(new paper.Rectangle(position[0] - pegwidth / 2, position[1] - pegheight / 2, pegwidth, pegheight));\n const finalCircle = outerCircle.subtract(peg);\n finalCircle.fillColor = color1;\n outerCircle.remove();\n peg.remove();\n return (finalCircle.rotate(rotation, pos) as unknown) as paper.PathItem;\n }\n\n render2DTarget(key: string | null, params: { [k: string]: any }): paper.PathItem {\n const render = this.render2D(params, key!);\n render.fillColor!.alpha = 0.5;\n return render;\n }\n\n getPorts(params: any) {\n const ports = [];\n\n ports.push(new ComponentPort(0, 0, \"1\", LogicalLayerType.FLOW));\n\n return ports;\n }\n}\n","import Template from \"./template\";\nimport paper from \"paper\";\nimport ComponentPort from \"../core/componentPort\";\nimport { LogicalLayerType } from \"../core/init\";\n\nexport default class Cahode extends Template {\n constructor() {\n super();\n }\n\n __setupDefinitions(): void {\n this.__unique = {\n position: \"Point\"\n };\n\n this.__heritable = {\n componentSpacing: \"Float\",\n cathodeRadius: \"Float\",\n pegRadius: \"Float\",\n pegThickness: \"Float\",\n height: \"Float\",\n rotation: \"Float\"\n };\n\n this.__defaults = {\n componentSpacing: 1000,\n cathodeRadius: 0.9 * 1000,\n pegRadius: 0.7 * 1000,\n pegThickness: 0.3 * 1000,\n height: 1.1 * 1000,\n rotation: 0\n };\n\n this.__units = {\n componentSpacing: \"μm\",\n cathodeRadius: \"μm\",\n pegRadius: \"μm\",\n pegThickness: \"μm\",\n height: \"μm\",\n rotation: \"°\"\n };\n\n this.__minimum = {\n componentSpacing: 0,\n cathodeRadius: 0.4 * 10,\n pegRadius: 0.1 * 1000,\n pegThickness: 0.1 * 1000,\n height: 10,\n rotation: 0\n };\n\n this.__maximum = {\n componentSpacing: 10000,\n cathodeRadius: 2000,\n pegRadius: 2 * 1000,\n pegThickness: 2 * 1000,\n height: 1200,\n rotation: 90\n };\n\n this.__placementTool = \"componentPositionTool\";\n\n this.__toolParams = {\n position: \"position\"\n };\n\n this.__featureParams = {\n componentSpacing: \"componentSpacing\",\n position: \"position\",\n cathodeRadius: \"cathodeRadius\",\n pegRadius: \"pegRadius\",\n pegThickness: \"pegThickness\",\n rotation: \"rotation\"\n };\n\n this.__targetParams = {\n componentSpacing: \"componentSpacing\",\n cathodeRadius: \"cathodeRadius\",\n pegRadius: \"pegRadius\",\n pegThickness: \"pegThickness\",\n rotation: \"rotation\"\n };\n\n this.__renderKeys = [\"FLOW\"];\n\n this.__mint = \"CATHODE\";\n }\n\n render2D(params: { [k: string]: any }, key: string): paper.PathItem {\n // Regardless of the key...\n const position = params.position;\n const radius = params.cathodeRadius;\n const pegradius = params.pegRadius;\n const pegthickness = params.pegThickness;\n const rotation = params.rotation;\n const color1 = params.color;\n const pos = new paper.Point(position[0], position[1]);\n const outerCircle = new paper.Path.Circle(pos, radius);\n outerCircle.fillColor = color1;\n\n const peg1 = new paper.Path.Rectangle(new paper.Rectangle(position[0] - pegradius / 2, position[1] - pegthickness / 2, pegradius, pegthickness));\n const peg2 = new paper.Path.Rectangle(new paper.Rectangle(position[0] - pegthickness / 2, position[1] - pegradius / 2, pegthickness, pegradius));\n const finalCircle = outerCircle.subtract(peg1.unite(peg2));\n finalCircle.fillColor = color1;\n outerCircle.remove();\n peg1.remove();\n peg2.remove();\n return (finalCircle.rotate(rotation, pos) as unknown) as paper.PathItem;\n }\n\n render2DTarget(key: string | null, params: { [k: string]: any }): paper.PathItem {\n if (key === null) {\n key = this.__renderKeys[0];\n }\n const render = this.render2D(params, key);\n render.fillColor!.alpha = 0.5;\n return render;\n }\n\n getPorts(params: { [k: string]: any }) {\n const ports = [];\n\n ports.push(new ComponentPort(0, 0, \"1\", LogicalLayerType.FLOW));\n\n return ports;\n }\n}\n","import Template from \"./template\";\nimport paper from \"paper\";\n\nexport default class Channel extends Template {\n constructor() {\n super();\n }\n\n __setupDefinitions(): void {\n this.__unique = {\n start: \"Point\",\n end: \"Point\"\n };\n\n this.__defaults = {\n channelWidth: 0.8 * 1000,\n height: 250\n };\n\n this.__heritable = {\n channelWidth: \"Float\",\n height: \"Float\"\n };\n\n this.__units = {\n channelWidth: \"μm\",\n height: \"μm\"\n };\n\n this.__minimum = {\n channelWidth: 3,\n height: 10\n };\n\n this.__maximum = {\n channelWidth: 12000,\n height: 1200\n };\n\n this.__placementTool = \"DragTool\";\n\n this.__toolParams = {\n start: \"start\",\n end: \"end\"\n };\n\n this.__featureParams = {\n start: \"start\",\n end: \"end\",\n width: \"channelWidth\"\n };\n\n this.__targetParams = {\n diameter: \"channelWidth\",\n channelWidth: \"channelWidth\"\n };\n\n this.__renderKeys = [\"FLOW\"];\n\n this.__mint = \"CHANNEL\";\n\n this.__zOffsetKeys = {\n FLOW: \"height\"\n };\n\n this.__substrateOffset = {\n FLOW: \"0\"\n };\n }\n\n render2D(params: { [k: string]: any }, key: string) {\n // Regardless of the key...\n const start = params.start;\n const end = params.end;\n const color = params.color;\n const width = params.width;\n const baseColor = params.baseColor;\n const startPoint = new paper.Point(start[0], start[1]);\n const endPoint = new paper.Point(end[0], end[1]);\n const vec = endPoint.subtract(startPoint);\n const rec = new paper.Path.Rectangle({\n size: [vec.length, width],\n point: start,\n // radius: width/2,\n fillColor: color,\n strokeWidth: 0\n });\n rec.translate(new paper.Point(0, -width / 2));\n rec.rotate(vec.angle, start);\n return rec;\n }\n\n render2DTarget(key: string | null, params: { [k: string]: any }) {\n const thickness = params.channelWidth / 5;\n const length = params.channelWidth;\n const x = params.position[0];\n const y = params.position[1];\n const color = params.color;\n let chair = new paper.Path.Rectangle(new paper.Rectangle(x - length / 2, y - thickness / 2, length, thickness));\n let chairtarget = chair.unite(new paper.Path.Rectangle(new paper.Rectangle(x - thickness / 2, y - length / 2, thickness, length)));\n chairtarget.fillColor = color;\n chairtarget.fillColor!.alpha = 0.5;\n return chair;\n }\n}\n","import Template from \"./template\";\nimport paper from \"paper\";\nimport ComponentPort from \"../core/componentPort\";\nimport { LogicalLayerType } from \"../core/init\";\n\nexport default class BetterMixer extends Template {\n constructor() {\n super();\n }\n\n __setupDefinitions(): void {\n this.__unique = {\n position: \"Point\"\n };\n\n this.__heritable = {\n componentSpacing: \"Float\",\n bendSpacing: \"Float\",\n numberOfBends: \"Float\",\n channelWidth: \"Float\",\n bendLength: \"Float\",\n rotation: \"Float\",\n height: \"Float\"\n };\n\n this.__defaults = {\n componentSpacing: 1000,\n channelWidth: 0.8 * 1000,\n bendSpacing: 1.23 * 1000,\n numberOfBends: 1,\n rotation: 0,\n bendLength: 2.46 * 1000,\n height: 250\n };\n\n this.__units = {\n componentSpacing: \"μm\",\n bendSpacing: \"μm\",\n numberOfBends: \"\",\n channelWidth: \"μm\",\n bendLength: \"μm\",\n rotation: \"°\",\n height: \"μm\"\n };\n\n this.__minimum = {\n componentSpacing: 0,\n channelWidth: 10,\n bendSpacing: 10,\n numberOfBends: 1,\n rotation: 0,\n bendLength: 10,\n height: 10\n };\n\n this.__maximum = {\n componentSpacing: 10000,\n channelWidth: 2000,\n bendSpacing: 6000,\n numberOfBends: 20,\n rotation: 360,\n bendLength: 12 * 1000,\n height: 1200\n };\n\n this.__placementTool = \"componentPositionTool\";\n\n this.__toolParams = {\n cursorPosition: \"position\"\n };\n\n this.__featureParams = {\n componentSpacing: \"componentSpacing\",\n position: \"position\",\n channelWidth: \"channelWidth\",\n bendSpacing: \"bendSpacing\",\n numberOfBends: \"numberOfBends\",\n rotation: \"rotation\",\n bendLength: \"bendLength\"\n };\n\n this.__targetParams = {\n componentSpacing: \"componentSpacing\",\n channelWidth: \"channelWidth\",\n bendSpacing: \"bendSpacing\",\n numberOfBends: \"numberOfBends\",\n rotation: \"rotation\",\n bendLength: \"bendLength\"\n };\n\n this.__renderKeys = [\"FLOW\"];\n\n this.__mint = \"MIXER\";\n\n this.__zOffsetKeys = {\n FLOW: \"height\"\n };\n\n this.__substrateOffset = {\n FLOW: \"0\"\n };\n }\n\n getPorts(params: { [k: string]: any }) {\n const channelWidth = params.channelWidth;\n const bendLength = params.bendLength;\n const bendSpacing = params.bendSpacing;\n const rotation = params.rotation;\n const numberOfBends = params.numberOfBends;\n\n const ports = [];\n\n ports.push(new ComponentPort(bendLength / 2 + channelWidth, 0, \"1\", LogicalLayerType.FLOW));\n\n ports.push(new ComponentPort(bendLength / 2 + channelWidth, (2 * numberOfBends + 1) * channelWidth + 2 * numberOfBends * bendSpacing, \"2\", LogicalLayerType.FLOW));\n\n return ports;\n }\n\n render2D(params: { [k: string]: any }, key: string): paper.CompoundPath {\n const channelWidth = params.channelWidth;\n const bendLength = params.bendLength;\n const bendSpacing = params.bendSpacing;\n const rotation = params.rotation;\n const numBends = params.numberOfBends;\n const x = params.position[0];\n const y = params.position[1];\n const color = params.color;\n const segHalf = bendLength / 2 + channelWidth;\n const segLength = bendLength + 2 * channelWidth;\n const segBend = bendSpacing + 2 * channelWidth;\n const vRepeat = 2 * bendSpacing + 2 * channelWidth;\n const vOffset = bendSpacing + channelWidth;\n const hOffset = bendLength / 2 + channelWidth / 2;\n const serp = new paper.CompoundPath(\"\");\n // draw first segment\n serp.addChild(new paper.Path.Rectangle(new paper.Rectangle(x, y, segHalf + channelWidth / 2, channelWidth)));\n for (let i = 0; i < numBends; i++) {\n serp.addChild(new paper.Path.Rectangle(new paper.Rectangle(x, y + vRepeat * i, channelWidth, segBend)));\n serp.addChild(new paper.Path.Rectangle(new paper.Rectangle(x, y + vOffset + vRepeat * i, segLength, channelWidth)));\n serp.addChild(new paper.Path.Rectangle(new paper.Rectangle(x + channelWidth + bendLength, y + vOffset + vRepeat * i, channelWidth, segBend)));\n if (i === numBends - 1) {\n // draw half segment to close\n serp.addChild(new paper.Path.Rectangle(new paper.Rectangle(x + hOffset, y + vRepeat * (i + 1), segHalf, channelWidth)));\n } else {\n // draw full segment\n serp.addChild(new paper.Path.Rectangle(new paper.Rectangle(x, y + vRepeat * (i + 1), segLength, channelWidth)));\n }\n }\n\n serp.fillColor = color;\n return (serp.rotate(rotation, new paper.Point(x, y)) as unknown) as paper.CompoundPath;\n }\n\n render2DTarget(key: string | null, params: { [k: string]: any }): paper.CompoundPath {\n if (key === null) {\n key = this.__renderKeys[0];\n }\n const serp = this.render2D(params, key);\n serp.fillColor!.alpha = 0.5;\n return serp;\n }\n}\n","import Template from \"./template\";\nimport paper from \"paper\";\nimport ComponentPort from \"../core/componentPort\";\nimport { LogicalLayerType } from \"../core/init\";\n\nexport default class RotaryMixer extends Template {\n constructor() {\n super();\n }\n\n __setupDefinitions(): void {\n this.__unique = {\n position: \"Point\"\n };\n\n this.__heritable = {\n componentSpacing: \"Float\",\n rotation: \"Float\",\n radius: \"Float\",\n flowChannelWidth: \"Float\",\n controlChannelWidth: \"Float\",\n valveWidth: \"Float\",\n valveLength: \"Float\",\n valveSpacing: \"Float\",\n height: \"Float\"\n };\n\n this.__defaults = {\n componentSpacing: 1000,\n rotation: 0,\n radius: 2000,\n flowChannelWidth: 1000,\n controlChannelWidth: 500,\n valveWidth: 2.4 * 1000,\n valveLength: 1 * 1000,\n valveSpacing: 300,\n valveRadius: 1.2 * 1000,\n height: 250\n };\n\n this.__units = {\n componentSpacing: \"μm\",\n rotation: \"°\",\n radius: \"μm\",\n flowChannelWidth: \"μm\",\n controlChannelWidth: \"μm\",\n valveWidth: \"μm\",\n valveLength: \"μm\",\n valveSpacing: \"μm\",\n height: \"μm\"\n };\n\n this.__minimum = {\n componentSpacing: 0,\n radius: 0.1 * 5000,\n flowChannelWidth: 0.1 * 1000,\n controlChannelWidth: 0.1 * 1000,\n valveWidth: 0.1 * 2.4 * 1000,\n valveLength: 0.1 * 2.4 * 1000,\n valveSpacing: 0.1 * 300,\n valveRadius: 0.1 * 1.2 * 1000,\n height: 0.1 * 200,\n rotation: 0\n };\n\n this.__maximum = {\n componentSpacing: 10000,\n radius: 10 * 5000,\n flowChannelWidth: 10 * 1000,\n controlChannelWidth: 10 * 1000,\n valveWidth: 10 * 2.4 * 1000,\n valveLength: 10 * 2.4 * 1000,\n valveSpacing: 10 * 300,\n valveRadius: 10 * 1.2 * 1000,\n height: 10 * 200,\n rotation: 360\n };\n\n this.__placementTool = \"multilayerPositionTool\";\n\n this.__toolParams = {\n position: \"position\"\n };\n\n this.__featureParams = {\n componentSpacing: \"componentSpacing\",\n position: \"position\",\n rotation: \"rotation\",\n flowChannelWidth: \"flowChannelWidth\",\n controlChannelWidth: \"controlChannelWidth\",\n radius: \"radius\",\n valveWidth: \"valveWidth\",\n valveLength: \"valveLength\",\n valveSpacing: \"valveSpacing\",\n height: \"height\"\n };\n\n this.__targetParams = {\n componentSpacing: \"componentSpacing\",\n position: \"position\",\n rotation: \"rotation\",\n flowChannelWidth: \"flowChannelWidth\",\n controlChannelWidth: \"controlChannelWidth\",\n radius: \"radius\",\n valveWidth: \"valveWidth\",\n valveLength: \"valveLength\",\n valveSpacing: \"valveSpacing\",\n height: \"height\"\n };\n\n this.__renderKeys = [\"FLOW\", \"CONTROL\"];\n\n this.__mint = \"ROTARY MIXER\";\n\n this.__zOffsetKeys = {\n FLOW: \"height\",\n CONTROL: \"height\"\n };\n\n this.__substrateOffset = {\n FLOW: \"0\",\n CONTROL: \"+1\"\n };\n }\n\n getPorts(params: { [k: string]: any }) {\n const radius = params.radius;\n const valvespacing = params.valveSpacing;\n const valvelength = params.valveLength;\n const valvewidth = params.valveWidth;\n const flowChannelWidth = params.flowChannelWidth; // params[\"flowChannelWidth\"];\n const channellength = radius + valvelength + 2 * valvespacing + flowChannelWidth; // This needs to be a real expression\n\n const ports = [];\n\n ports.push(new ComponentPort(channellength, -radius - flowChannelWidth / 2, \"1\", LogicalLayerType.FLOW));\n ports.push(new ComponentPort(-channellength, radius + flowChannelWidth / 2, \"2\", LogicalLayerType.FLOW));\n\n // top right\n ports.push(\n new ComponentPort(radius + flowChannelWidth + valvespacing + valvelength / 2, -radius - flowChannelWidth / 2 - valvewidth, \"3\", LogicalLayerType.CONTROL)\n );\n // top bottom\n ports.push(new ComponentPort(0, -radius - flowChannelWidth / 2 - valvewidth, \"4\", LogicalLayerType.CONTROL));\n // middle right\n ports.push(new ComponentPort(flowChannelWidth / 2 + radius + valvewidth, 0, \"5\", LogicalLayerType.CONTROL));\n // bottom middle\n ports.push(new ComponentPort(0, radius + flowChannelWidth / 2 + valvewidth, \"6\", LogicalLayerType.CONTROL));\n // bottom left\n ports.push(\n new ComponentPort(-radius - valvespacing - valvelength - flowChannelWidth / 2, radius + flowChannelWidth / 2 + valvewidth, \"7\", LogicalLayerType.CONTROL)\n );\n\n return ports;\n }\n\n render2D(params: { [k: string]: any }, key: string) {\n if (key === \"FLOW\") {\n return this.__renderFlow(params);\n } else if (key === \"CONTROL\") {\n return this.__renderControl(params);\n } \n throw new Error(\"No valid key found\");\n }\n\n render2DTarget(key: string | null, params: { [k: string]: any }) {\n const rotarymixer_flow = this.__renderFlow(params);\n const rotarymixer_control = this.__renderControl(params);\n const ret = new paper.CompoundPath(\"\");\n ret.addChild(rotarymixer_flow);\n ret.addChild(rotarymixer_control);\n ret.fillColor = params.color;\n ret.fillColor!.alpha = 0.5;\n\n return ret;\n }\n\n __renderFlow(params: { [k: string]: any }) {\n const position = params.position;\n const radius = params.radius;\n const color = params.color;\n const rotation = params.rotation;\n const valvespacing = params.valveSpacing;\n const valvelength = params.valveLength;\n const valvewidth = params.valveWidth;\n const flowChannelWidth = params.flowChannelWidth; // params[\"flowChannelWidth\"];\n const px = position[0];\n const py = position[1];\n const center = new paper.Point(px, py);\n const channellength = radius + valvelength + 2 * valvespacing + flowChannelWidth; // This needs to be a real expression\n\n const rotarymixer = new paper.CompoundPath(\"\");\n\n const innercirc = new paper.Path.Circle(center, radius);\n const outercirc = new paper.Path.Circle(center, radius + flowChannelWidth);\n\n let rotary = outercirc.subtract(innercirc);\n\n let topleft = new paper.Point(px - valvelength / 2, py - radius - flowChannelWidth / 2 - valvewidth / 2);\n const topmiddlerectangle = new paper.Path.Rectangle(topleft, new paper.Size(valvelength, valvewidth));\n rotary = rotary.subtract(topmiddlerectangle);\n\n topleft = new paper.Point(px + radius + flowChannelWidth / 2 - valvewidth / 2, py - valvelength / 2);\n const middlerightrectangle = new paper.Path.Rectangle(topleft, new paper.Size(valvewidth, valvelength));\n rotary = rotary.subtract(middlerightrectangle);\n\n topleft = new paper.Point(px - valvelength / 2, py + radius + flowChannelWidth / 2 - valvewidth / 2);\n const bottommiddlerectangle = new paper.Path.Rectangle(topleft, new paper.Size(valvelength, valvewidth));\n rotary = rotary.subtract(bottommiddlerectangle);\n\n rotarymixer.addChild(rotary);\n\n const point1 = new paper.Point(px, py - radius - flowChannelWidth);\n const point2 = new paper.Point(px + channellength, py - radius);\n let rectangle: paper.Path.Rectangle | paper.PathItem = new paper.Path.Rectangle(point1, point2);\n\n topleft = new paper.Point(px + radius + flowChannelWidth + valvespacing, py - radius - flowChannelWidth / 2 - valvewidth / 2);\n const topleftrectangle = new paper.Path.Rectangle(topleft, new paper.Size(valvelength, valvewidth));\n rectangle = rectangle.subtract(topleftrectangle);\n\n rectangle = rectangle.subtract(topmiddlerectangle);\n\n rotarymixer.addChild(rectangle);\n\n const point3 = new paper.Point(px - channellength, py + radius);\n const point4 = new paper.Point(px, py + radius + flowChannelWidth);\n let rectangle2: paper.Path.Rectangle | paper.PathItem = new paper.Path.Rectangle(point3, point4);\n\n topleft = new paper.Point(px - radius - valvespacing - valvelength - flowChannelWidth, py + radius + flowChannelWidth / 2 - valvewidth / 2);\n const bottomleftrectangle = new paper.Path.Rectangle(topleft, new paper.Size(valvelength, valvewidth));\n rectangle2 = rectangle2.subtract(bottomleftrectangle);\n\n rectangle2 = rectangle2.subtract(bottommiddlerectangle);\n\n rotarymixer.addChild(rectangle2);\n\n rotarymixer.fillColor = color;\n rotarymixer.rotate(rotation, new paper.Point(px, py));\n return rotarymixer;\n }\n\n __renderControl(params: { [k: string]: any }) {\n const position = params.position;\n const radius = params.radius;\n const color = params.color;\n const rotation = params.rotation;\n const valvespacing = params.valveSpacing;\n const valvelength = params.valveLength;\n const valvewidth = params.valveWidth;\n const flowChannelWidth = params.flowChannelWidth;\n const controlChannelWidth = params.controlChannelWidth; // params[\"flowChannelWidth\"];\n const px = position[0];\n const py = position[1];\n\n const rotarymixer = new paper.CompoundPath(\"\");\n let topleft = null;\n const bottomright = null;\n\n // Draw top right valve\n topleft = new paper.Point(px + radius + flowChannelWidth + valvespacing, py - radius - flowChannelWidth / 2 - valvewidth / 2);\n const topleftrectangle = new paper.Path.Rectangle(topleft, new paper.Size(valvelength, valvewidth));\n rotarymixer.addChild(topleftrectangle);\n\n let topLeft = new paper.Point(px + radius + flowChannelWidth + valvespacing + valvelength / 2 - controlChannelWidth / 2, py - radius - flowChannelWidth / 2 - valvewidth);\n let bottomRight = new paper.Point(px + radius + flowChannelWidth + valvespacing + valvelength / 2 + controlChannelWidth / 2, py - radius);\n rotarymixer.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n // Draw top middle valve\n topleft = new paper.Point(px - valvelength / 2, py - radius - flowChannelWidth / 2 - valvewidth / 2);\n const topmiddlerectangle = new paper.Path.Rectangle(topleft, new paper.Size(valvelength, valvewidth));\n rotarymixer.addChild(topmiddlerectangle);\n\n topLeft = new paper.Point(px - controlChannelWidth / 2, py - radius - flowChannelWidth / 2 - valvewidth);\n bottomRight = new paper.Point(px + controlChannelWidth / 2, py - radius);\n rotarymixer.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n // Draw middle right valve\n topleft = new paper.Point(px + radius + flowChannelWidth / 2 - valvewidth / 2, py - valvelength / 2);\n const middlerightrectangle = new paper.Path.Rectangle(topleft, new paper.Size(valvewidth, valvelength));\n rotarymixer.addChild(middlerightrectangle);\n\n topLeft = new paper.Point(px + flowChannelWidth / 2 + radius, py - controlChannelWidth / 2);\n bottomRight = new paper.Point(px + flowChannelWidth / 2 + radius + valvewidth, py + controlChannelWidth / 2);\n rotarymixer.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n // Draw Bottom middle valve\n topleft = new paper.Point(px - valvelength / 2, py + radius + flowChannelWidth / 2 - valvewidth / 2);\n const bottommiddlerectangle = new paper.Path.Rectangle(topleft, new paper.Size(valvelength, valvewidth));\n rotarymixer.addChild(bottommiddlerectangle);\n\n topLeft = new paper.Point(px - controlChannelWidth / 2, py + radius + flowChannelWidth / 2);\n bottomRight = new paper.Point(px + controlChannelWidth / 2, py + radius + flowChannelWidth / 2 + valvewidth);\n rotarymixer.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n // Draw bottom left valve\n topleft = new paper.Point(px - radius - valvespacing - valvelength - flowChannelWidth, py + radius + flowChannelWidth / 2 - valvewidth / 2);\n const bottomleftrectangle = new paper.Path.Rectangle(topleft, new paper.Size(valvelength, valvewidth));\n rotarymixer.addChild(bottomleftrectangle);\n\n topLeft = new paper.Point(px - radius - valvespacing - valvelength - flowChannelWidth / 2 - controlChannelWidth / 2, py + radius + flowChannelWidth / 2);\n bottomRight = new paper.Point(px - radius - valvespacing - valvelength - flowChannelWidth / 2 + controlChannelWidth / 2, py + radius + flowChannelWidth / 2 + valvewidth);\n rotarymixer.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n rotarymixer.fillColor = color;\n rotarymixer.rotate(rotation, new paper.Point(px, py));\n return rotarymixer;\n }\n}\n","import Template from \"./template\";\nimport paper from \"paper\";\nimport { ToolPaperObject } from \"../core/init\";\n\ninterface ParamsIF {\n position: number[];\n width: number;\n length: number;\n color: paper.Color;\n}\n\nexport default class AlignmentMarks extends Template {\n constructor() {\n super();\n }\n\n __setupDefinitions(): void {\n this.__unique = {\n position: \"Point\"\n };\n\n this.__heritable = {\n componentSpacing: \"Float\",\n width: \"Float\",\n length: \"Float\",\n height: \"Float\"\n };\n\n this.__defaults = {\n width: 4000,\n length: 4000,\n height: 250\n };\n\n this.__units = {\n width: \"μm\",\n length: \"μm\",\n height: \"μm\"\n };\n\n this.__minimum = {\n width: 10,\n length: 10,\n height: 10\n };\n\n this.__maximum = {\n width: 200000,\n length: 200000,\n height: 1200\n };\n\n this.__placementTool = \"multilayerPositionTool\";\n\n this.__toolParams = {\n position: \"position\"\n };\n\n this.__featureParams = {\n position: \"position\",\n width: \"width\",\n length: \"length\"\n };\n\n this.__targetParams = {\n width: \"width\",\n length: \"length\"\n };\n\n this.__renderKeys = [\"FLOW\", \"CONTROL\"];\n\n this.__mint = \"ALIGNMENT MARKS\";\n\n this.__zOffsetKeys = {\n FLOW: \"height\",\n CONTROL: \"height\"\n };\n\n this.__substrateOffset = {\n FLOW: \"0\",\n CONTROL: \"+1\"\n };\n }\n\n render2D(params: ParamsIF, key: string) {\n if (key === \"FLOW\") {\n return this.__drawFlow(params);\n } else if (key === \"CONTROL\") {\n return this.__drawControl(params);\n }\n\n throw new Error(\"Unknown key: \" + key);\n }\n\n render2DTarget(key: string | null, params: ParamsIF): paper.CompoundPath {\n const position = params.position;\n const width = params.width;\n const length = params.length;\n const color = params.color;\n const center = new paper.Point(position[0], position[1]);\n const ret = new paper.CompoundPath(\"\");\n const topleftpoint = new paper.Point(position[0] - width, position[1] - length);\n const bottomrightpoint = new paper.Point(position[0] + width, position[1] + length);\n\n const topleftrect = new paper.Path.Rectangle(topleftpoint, center);\n\n ret.addChild(topleftrect);\n\n const bottomrightrect = new paper.Path.Rectangle((position as unknown) as paper.Rectangle, (bottomrightpoint as unknown) as paper.Size);\n\n ret.addChild(bottomrightrect);\n\n const topmiddlepoint = new paper.Point(position[0], position[1] - length);\n const middlerightpoint = new paper.Point(position[0] + width, position[1]);\n const middleleftpoint = new paper.Point(position[0] - width, position[1]);\n const bottommiddlepoint = new paper.Point(position[0], position[1] + length);\n\n const toprightrect = new paper.Path.Rectangle(topmiddlepoint, middlerightpoint);\n\n ret.addChild(toprightrect);\n\n const bottomleftrect = new paper.Path.Rectangle(middleleftpoint, bottommiddlepoint);\n\n ret.addChild(bottomleftrect);\n\n ret.fillColor = color;\n\n ret.fillColor.alpha = 0.5;\n\n return ret;\n }\n\n __drawFlow(params: ParamsIF) {\n const position = params.position;\n const width = params.width;\n const length = params.length;\n const color = params.color;\n const center = new paper.Point(position[0], position[1]);\n const ret = new paper.CompoundPath(\"\");\n const topleftpoint = new paper.Point(position[0] - width, position[1] - length);\n const bottomrightpoint = new paper.Point(position[0] + width, position[1] + length);\n\n const topleftrect = new paper.Path.Rectangle(topleftpoint, center);\n\n ret.addChild(topleftrect);\n\n const bottomrightrect = new paper.Path.Rectangle((position as unknown) as paper.Rectangle, (bottomrightpoint as unknown) as paper.Size);\n\n ret.addChild(bottomrightrect);\n\n ret.fillColor = color;\n return ret;\n }\n\n __drawControl(params: ParamsIF) {\n const position = params.position;\n const width = params.width;\n const length = params.length;\n const color = params.color;\n const here = new paper.Point(position[0], position[1]);\n const ret = new paper.CompoundPath(\"\");\n const topmiddlepoint = new paper.Point(position[0], position[1] - length);\n const middlerightpoint = new paper.Point(position[0] + width, position[1]);\n const middleleftpoint = new paper.Point(position[0] - width, position[1]);\n const bottommiddlepoint = new paper.Point(position[0], position[1] + length);\n\n const toprightrect = new paper.Path.Rectangle(topmiddlepoint, middlerightpoint);\n\n ret.addChild(toprightrect);\n\n const bottomleftrect = new paper.Path.Rectangle(middleleftpoint, bottommiddlepoint);\n\n ret.addChild(bottomleftrect);\n\n ret.fillColor = color;\n return ret;\n }\n}\n","import Template from \"./template\";\nimport paper from \"paper\";\nimport ComponentPort from \"../core/componentPort\";\nimport { LogicalLayerType } from \"../core/init\";\n\nexport default class CellTrapL extends Template {\n constructor() {\n super();\n }\n\n __setupDefinitions(): void {\n this.__unique = {\n position: \"Point\"\n };\n\n this.__heritable = {\n componentSpacing: \"Float\",\n chamberLength: \"Float\",\n feedingChannelWidth: \"Float\",\n rotation: \"Float\",\n chamberWidth: \"Float\",\n numberOfChambers: \"Float\",\n chamberSpacing: \"Float\",\n height: \"Float\"\n };\n\n this.__defaults = {\n componentSpacing: 1000,\n chamberLength: 1.2 * 1000,\n feedingChannelWidth: 0.41 * 1000,\n rotation: 270,\n chamberWidth: 1.23 * 1000,\n numberOfChambers: 6,\n chamberSpacing: 2.46 * 1000,\n height: 250\n };\n\n this.__units = {\n componentSpacing: \"μm\",\n chamberLength: \"μm\",\n feedingChannelWidth: \"μm\",\n rotation: \"°\",\n chamberWidth: \"μm\",\n numberOfChambers: \"\",\n chamberSpacing: \"μm\",\n height: \"μm\"\n };\n\n this.__minimum = {\n componentSpacing: 0,\n chamberLength: 30,\n feedingChannelWidth: 10,\n chamberWidth: 30,\n numberOfChambers: 1,\n chamberSpacing: 30,\n height: 10,\n rotation: 0\n };\n\n this.__maximum = {\n componentSpacing: 10000,\n chamberLength: 6000,\n feedingChannelWidth: 2000,\n chamberWidth: 6000,\n numberOfChambers: 100,\n chamberSpacing: 12 * 1000,\n height: 1200,\n rotation: 360\n };\n\n this.__featureParams = {\n componentSpacing: \"componentSpacing\",\n position: \"position\",\n rotation: \"rotation\",\n chamberWidth: \"chamberWidth\",\n chamberLength: \"chamberLength\",\n numberOfChambers: \"numberOfChambers\",\n chamberSpacing: \"chamberSpacing\",\n feedingChannelWidth: \"feedingChannelWidth\",\n height: \"height\"\n };\n\n this.__targetParams = {\n componentSpacing: \"componentSpacing\",\n rotation: \"rotation\",\n chamberWidth: \"chamberWidth\",\n chamberLength: \"chamberLength\",\n numberOfChambers: \"numberOfChambers\",\n chamberSpacing: \"chamberSpacing\",\n feedingChannelWidth: \"feedingChannelWidth\",\n height: \"height\"\n };\n\n this.__placementTool = \"CellPositionTool\";\n\n this.__toolParams = {\n position: \"position\"\n };\n\n this.__renderKeys = [\"FLOW\", \"CELL\"];\n\n this.__mint = \"LONG CELL TRAP\";\n\n this.__zOffsetKeys = {\n FLOW: \"height\",\n CELL: \"height\"\n };\n\n this.__substrateOffset = {\n FLOW: \"0\",\n CELL: \"0\"\n };\n }\n\n getPorts(params: { [k: string]: any }) {\n const chamberLength = params.chamberLength;\n const numChambers = params.numberOfChambers;\n const chamberWidth = params.chamberWidth;\n const feedingChannelWidth = params.feedingChannelWidth;\n const chamberSpacing = params.chamberSpacing;\n\n const ports = [];\n\n ports.push(new ComponentPort(0, chamberLength + feedingChannelWidth / 2, \"1\", LogicalLayerType.FLOW));\n\n ports.push(new ComponentPort((numChambers / 2) * (chamberWidth + chamberSpacing) + chamberSpacing, chamberLength + feedingChannelWidth / 2, \"2\", LogicalLayerType.FLOW));\n\n return ports;\n }\n\n render2D(params: { [k: string]: any }, key = \"FLOW\") {\n if (key === \"FLOW\") {\n return this.__drawFlow(params);\n } else if (key === \"CELL\") {\n return this.__drawCell(params);\n } else {\n const flow = this.__drawFlow(params);\n const control = this.__drawCell(params);\n const ret = new paper.CompoundPath(\"\");\n ret.addChild(flow);\n ret.addChild(control);\n return ret;\n }\n\n throw new Error(\"Unknown key: \" + key);\n\n }\n\n render2DTarget(key: string | null, params: { [k: string]: any }) {\n const traps = this.__drawFlow(params);\n traps.addChild(this.__drawCell(params));\n traps.fillColor!.alpha = 0.5;\n return traps;\n }\n\n __drawFlow(params: { [k: string]: any }) {\n const rotation = params.rotation;\n const position = params.position;\n const chamberLength = params.chamberLength;\n const numChambers = params.numberOfChambers;\n const chamberWidth = params.chamberWidth;\n const feedingChannelWidth = params.feedingChannelWidth;\n const chamberSpacing = params.chamberSpacing;\n\n const color = params.color;\n const x = position[0];\n const y = position[1];\n const chamberList = new paper.CompoundPath(\"\");\n chamberList.fillColor = color;\n let rec;\n let traps;\n let channels;\n\n const startPoint = new paper.Point(x, y + chamberLength);\n channels = new paper.Path.Rectangle({\n point: startPoint,\n size: [(numChambers / 2) * (chamberWidth + chamberSpacing) + chamberSpacing, feedingChannelWidth],\n fillColor: color,\n strokeWidth: 0\n });\n chamberList.addChild(channels);\n\n traps = new paper.CompoundPath(chamberList);\n traps.fillColor = color;\n traps.rotate(rotation, new paper.Point(x, y));\n return traps;\n }\n\n __drawCell(params: { [k: string]: any }) {\n const rotation = params.rotation;\n const position = params.position;\n const chamberLength = params.chamberLength;\n const numChambers = params.numberOfChambers;\n const chamberWidth = params.chamberWidth;\n const feedingChannelWidth = params.feedingChannelWidth;\n const chamberSpacing = params.chamberSpacing;\n const color = params.color;\n const x = position[0];\n const y = position[1];\n const chamberList = new paper.CompoundPath(\"\");\n let rec;\n\n for (let i = 0; i < numChambers / 2; i++) {\n const startPoint = new paper.Point(x + i * (chamberWidth + chamberSpacing) + chamberSpacing, y);\n rec = new paper.Path.Rectangle({\n size: [chamberWidth, 2 * chamberLength + feedingChannelWidth],\n point: startPoint,\n fillColor: color,\n strokeWidth: 0\n });\n chamberList.addChild(rec);\n }\n\n chamberList.fillColor = color;\n chamberList.rotate(rotation, new paper.Point(x, y));\n return chamberList;\n }\n}\n","import Template from \"./template\";\nimport paper from \"paper\";\nimport ComponentPort from \"../core/componentPort\";\nimport { LogicalLayerType } from \"../core/init\";\n\nexport default class Gelchannel extends Template {\n constructor() {\n super();\n }\n\n __setupDefinitions(): void {\n this.__unique = {\n position: \"Point\"\n };\n\n this.__heritable = {\n componentSpacing: \"Float\",\n sideWidth: \"Float\",\n mainWidth: \"Float\",\n rotation: \"Float\",\n length: \"Float\",\n height: \"Float\",\n sideheight: \"Float\"\n };\n\n this.__defaults = {\n componentSpacing: 1000,\n sideWidth: 200,\n mainWidth: 500,\n rotation: 0,\n length: 3000,\n height: 250,\n sideheight: 50\n };\n\n this.__units = {\n componentSpacing: \"μm\",\n sideWidth: \"μm\",\n mainWidth: \"μm\",\n rotation: \"°\",\n length: \"μm\",\n height: \"μm\",\n sideheight: \"μm\"\n };\n\n this.__minimum = {\n componentSpacing: 0,\n sideWidth: 20,\n mainWidth: 10,\n length: 1000,\n height: 10,\n sideheight: 10,\n rotation: 0\n };\n\n this.__maximum = {\n componentSpacing: 10000,\n sideWidth: 500,\n mainWidth: 500,\n length: 100 * 1000,\n height: 1200,\n sideheight: 1200,\n rotation: 360\n };\n\n this.__featureParams = {\n componentSpacing: \"componentSpacing\",\n position: \"position\",\n rotation: \"rotation\",\n length: \"length\",\n sideWidth: \"sideWidth\",\n mainWidth: \"mainWidth\",\n height: \"height\",\n sideheight: \"sideheight\"\n };\n\n this.__targetParams = {\n componentSpacing: \"componentSpacing\",\n rotation: \"rotation\",\n length: \"length\",\n sideWidth: \"sideWidth\",\n mainWidth: \"mainWidth\",\n height: \"height\",\n sideheight: \"sideheight\"\n };\n\n this.__placementTool = \"CellPositionTool\";\n\n this.__toolParams = {\n position: \"position\"\n };\n\n this.__renderKeys = [\"FLOW\", \"CELL\"];\n\n this.__mint = \"GEL CHANNEL\";\n\n this.__zOffsetKeys = {\n FLOW: \"height\",\n CELL: \"sideHeight\"\n };\n\n this.__substrateOffset = {\n FLOW: \"0\",\n CELL: \"0\"\n };\n }\n\n getPorts(params: { [k: string]: any }) {\n const ports = [];\n const sideWidth = params.sideWidth;\n const numChambers = 2;\n const length = params.length;\n const mainWidth = params.mainWidth;\n\n ports.push(new ComponentPort(0, sideWidth + mainWidth / 2, \"1\", LogicalLayerType.FLOW));\n ports.push(new ComponentPort((numChambers / 2) * (length + 60) + 60, sideWidth + mainWidth / 2, \"2\", LogicalLayerType.FLOW));\n\n return ports;\n }\n\n render2D(params: { [k: string]: any }, key: string) {\n if (key === \"FLOW\") {\n return this.__drawFlow(params);\n } else if (key === \"CELL\") {\n return this.__drawCell(params);\n }\n\n throw new Error(\"Unknown key: \" + key);\n\n }\n\n render2DTarget(key: string | null, params: { [k: string]: any }) {\n const traps = this.__drawFlow(params);\n traps.addChild(this.__drawCell(params));\n traps.fillColor!.alpha = 0.5;\n return traps;\n }\n\n __drawFlow(params: { [k: string]: any }) {\n const rotation = params.rotation;\n const position = params.position;\n const sideWidth = params.sideWidth;\n const numChambers = 2;\n const length = params.length;\n const mainWidth = params.mainWidth;\n\n console.log(rotation, position, sideWidth, numChambers, length, mainWidth, 60);\n const color = params.color;\n const x = position[0];\n const y = position[1];\n const chamberList = new paper.CompoundPath(\"\");\n chamberList.fillColor = color;\n let traps;\n let channels;\n\n const startPoint = new paper.Point(x, y + sideWidth);\n channels = new paper.Path.Rectangle({\n point: startPoint,\n size: [(numChambers / 2) * (length + 60) + 60, mainWidth],\n fillColor: color,\n strokeWidth: 0\n });\n chamberList.addChild(channels);\n\n traps = new paper.CompoundPath(chamberList);\n traps.fillColor = color;\n const center = new paper.Point(position[0], position[1]);\n traps.rotate(rotation, center);\n return traps;\n }\n\n __drawCell(params: { [k: string]: any }) {\n const rotation = params.rotation;\n const position = params.position;\n const sideWidth = params.sideWidth;\n const numChambers = 2;\n const length = params.length;\n const mainWidth = params.mainWidth;\n const color = params.color;\n const x = position[0];\n const y = position[1];\n const chamberList = new paper.CompoundPath(\"\");\n let rec;\n\n for (let i = 0; i < numChambers / 2; i++) {\n const startPoint = new paper.Point(x + i * (length + 60) + 60, y);\n rec = new paper.Path.Rectangle({\n size: [length, 2 * sideWidth + mainWidth],\n point: startPoint,\n fillColor: color,\n strokeWidth: 0\n });\n chamberList.addChild(rec);\n }\n\n chamberList.fillColor = color;\n const center = new paper.Point(x, y);\n chamberList.rotate(rotation, center);\n return chamberList;\n }\n}\n","import Template from \"./template\";\nimport paper from \"paper\";\nimport ComponentPort from \"../core/componentPort\";\nimport { LogicalLayerType } from \"../core/init\";\n\nexport default class Chamber extends Template {\n constructor() {\n super();\n }\n\n __setupDefinitions(): void {\n this.__unique = {\n position: \"Point\"\n };\n\n this.__heritable = {\n componentSpacing: \"Float\",\n width: \"Float\",\n length: \"Float\",\n height: \"Float\",\n cornerRadius: \"Float\",\n rotation: \"Float\"\n };\n\n this.__defaults = {\n componentSpacing: 1000,\n width: 5000,\n length: 5000,\n height: 250,\n cornerRadius: 200,\n rotation: 0\n };\n\n this.__units = {\n componentSpacing: \"μm\",\n width: \"μm\",\n length: \"μm\",\n height: \"μm\",\n cornerRadius: \"μm\",\n rotation: \"°\"\n };\n\n this.__minimum = {\n componentSpacing: 0,\n width: 5,\n length: 5,\n height: 1,\n cornerRadius: 1,\n rotation: 0\n };\n\n this.__maximum = {\n componentSpacing: 10000,\n width: 50000,\n length: 50000,\n height: 50000,\n cornerRadius: 1000,\n rotation: 360\n };\n\n this.__featureParams = {\n componentSpacing: \"componentSpacing\",\n position: \"position\",\n width: \"width\",\n length: \"length\",\n height: \"height\",\n cornerRadius: \"cornerRadius\",\n rotation: \"rotation\"\n };\n\n this.__targetParams = {\n componentSpacing: \"componentSpacing\",\n position: \"position\",\n width: \"width\",\n length: \"length\",\n height: \"height\",\n cornerRadius: \"cornerRadius\",\n rotation: \"rotation\"\n };\n\n this.__placementTool = \"componentPositionTool\";\n\n this.__toolParams = {\n position: \"position\"\n };\n\n this.__renderKeys = [\"FLOW\"];\n\n this.__mint = \"REACTION CHAMBER\";\n\n this.__zOffsetKeys = {\n FLOW: \"height\"\n };\n\n this.__substrateOffset = {\n FLOW: \"0\"\n };\n }\n\n getPorts(params: { [k: string]: any }) {\n const l = params.length;\n const w = params.width;\n\n const ports = [];\n\n ports.push(new ComponentPort(0, -l / 2, \"1\", LogicalLayerType.FLOW));\n\n ports.push(new ComponentPort(w / 2, 0, \"2\", LogicalLayerType.FLOW));\n\n ports.push(new ComponentPort(0, l / 2, \"3\", LogicalLayerType.FLOW));\n\n ports.push(new ComponentPort(-w / 2, 0, \"4\", LogicalLayerType.FLOW));\n\n return ports;\n }\n\n render2D(params: { [k: string]: any }, key: string) {\n const position = params.position;\n const px = position[0];\n const py = position[1];\n const l = params.length;\n const w = params.width;\n const rotation = params.rotation;\n const color = params.color;\n const radius = params.cornerRadius;\n\n const rendered = new paper.CompoundPath(\"\");\n\n const rec = new paper.Path.Rectangle({\n point: new paper.Point(px - w / 2, py - l / 2),\n size: [w, l],\n radius: radius\n });\n\n rendered.addChild(rec);\n\n rendered.fillColor = color;\n rendered.rotate(rotation, new paper.Point(px, py));\n return rendered;\n }\n\n render2DTarget(key: string | null, params: { [k: string]: any }) {\n if (key === null) {\n key = this.__renderKeys[0];\n }\n const render = this.render2D(params, key);\n render.fillColor!.alpha = 0.5;\n return render;\n }\n}\n","import Template from \"./template\";\nimport paper from \"paper\";\n\nexport default class Connection extends Template {\n constructor() {\n super();\n }\n\n __setupDefinitions(): void {\n this.__unique = {\n start: \"Point\",\n end: \"Point\",\n wayPoints: \"PointArray\",\n segments: \"SegmentArray\"\n };\n\n this.__heritable = {\n connectionSpacing: \"Float\",\n channelWidth: \"Float\",\n height: \"Float\"\n };\n\n this.__defaults = {\n connectionSpacing: 1600,\n channelWidth: 0.8 * 1000,\n height: 250\n };\n\n this.__units = {\n connectionSpacing: \"μm\",\n channelWidth: \"μm\",\n height: \"μm\"\n };\n\n this.__minimum = {\n connectionSpacing: 0,\n channelWidth: 3,\n height: 10\n };\n\n this.__maximum = {\n connectionSpacing: 10000,\n channelWidth: 12000,\n height: 1200\n };\n\n this.__featureParams = {\n connectionSpacing: \"connectionSpacing\",\n start: \"start\",\n end: \"end\",\n wayPoints: \"wayPoints\",\n channelWidth: \"channelWidth\",\n segments: \"segments\",\n height: \"height\"\n };\n\n this.__targetParams = {\n connectionSpacing: \"connectionSpacing\",\n wayPoints: \"wayPoints\",\n channelWidth: \"channelWidth\",\n segments: \"segments\",\n height: \"height\"\n };\n\n this.__placementTool = \"ConnectionTool\";\n\n this.__toolParams = {\n start: \"start\",\n end: \"end\"\n };\n\n this.__renderKeys = [\"FLOW\"];\n\n this.__mint = \"CHANNEL\";\n\n this.__zOffsetKeys = {\n FLOW: \"height\"\n };\n\n this.__substrateOffset = {\n FLOW: \"0\"\n };\n }\n\n render2D(params: { [k: string]: any }, key: string) {\n const start = params.start;\n const end = params.end;\n const color = params.color;\n const width = params.width;\n const wayPoints = params.wayPoints;\n const channelWidth = params.channelWidth;\n const segments = params.segments;\n const connectionpath = new paper.CompoundPath(\"\");\n let startpoint, endpoint;\n\n let p1, p2;\n\n for (const i in segments) {\n const segment = segments[i];\n p1 = segment[0];\n p2 = segment[1];\n startpoint = new paper.Point(p1[0], p1[1]);\n endpoint = new paper.Point(p2[0], p2[1]);\n this.__drawStraightConnection(connectionpath, startpoint, endpoint, channelWidth);\n }\n\n connectionpath.fillColor = color;\n return connectionpath;\n }\n\n __drawStraightConnection(compoundpath: paper.CompoundPath, startpoint: paper.Point, endpoint: paper.Point, channelWidth: number): void {\n // edit the points\n const vec = endpoint.subtract(startpoint);\n const rec = new paper.Path.Rectangle({\n point: startpoint,\n radius: channelWidth / 2,\n size: [vec.length + channelWidth, channelWidth]\n });\n rec.translate(([-channelWidth / 2, -channelWidth / 2] as unknown) as paper.Point);\n rec.rotate(vec.angle, startpoint);\n\n compoundpath.addChild(rec);\n }\n\n render2DTarget(key: string | null, params: { [k: string]: any }) {\n const thickness = params.channelWidth / 5;\n const length = params.channelWidth;\n const x = params.position[0];\n const y = params.position[1];\n const color = params.color;\n let chair = new paper.Path.Rectangle(new paper.Rectangle(x - length / 2, y - thickness / 2, length, thickness));\n let chairtarget = chair.unite(new paper.Path.Rectangle(new paper.Rectangle(x - thickness / 2, y - length / 2, thickness, length)));\n chairtarget.fillColor = color;\n chairtarget.fillColor!.alpha = 0.5;\n return chairtarget;\n }\n}\n","import Template from \"./template\";\nimport paper from \"paper\";\nimport ComponentPort from \"../core/componentPort\";\nimport { LogicalLayerType } from \"../core/init\";\n\nexport default class CurvedMixer extends Template {\n constructor() {\n super();\n }\n\n __setupDefinitions(): void {\n this.__unique = {\n position: \"Point\"\n };\n\n this.__heritable = {\n componentSpacing: \"Float\",\n bendSpacing: \"Float\",\n numberOfBends: \"Float\",\n channelWidth: \"Float\",\n bendLength: \"Float\",\n rotation: \"Float\",\n height: \"Float\"\n };\n\n this.__defaults = {\n componentSpacing: 1000,\n rotation: 0,\n channelWidth: 0.8 * 1000,\n bendSpacing: 1.23 * 1000,\n numberOfBends: 1,\n bendLength: 2.46 * 1000,\n height: 250\n };\n\n this.__units = {\n componentSpacing: \"μm\",\n rotation: \"°\",\n bendSpacing: \"μm\",\n numberOfBends: \"\",\n channelWidth: \"μm\",\n bendLength: \"μm\",\n height: \"μm\"\n };\n\n this.__minimum = {\n componentSpacing: 0,\n rotation: 0,\n channelWidth: 10,\n bendSpacing: 10,\n numberOfBends: 1,\n bendLength: 10,\n height: 10\n };\n\n this.__maximum = {\n componentSpacing: 10000,\n rotation: 360,\n channelWidth: 2000,\n bendSpacing: 6000,\n numberOfBends: 20,\n bendLength: 12 * 1000,\n height: 1200\n };\n\n this.__featureParams = {\n componentSpacing: \"componentSpacing\",\n position: \"position\",\n channelWidth: \"channelWidth\",\n bendSpacing: \"bendSpacing\",\n numberOfBends: \"numberOfBends\",\n rotation: \"rotation\",\n bendLength: \"bendLength\"\n };\n\n this.__targetParams = {\n componentSpacing: \"componentSpacing\",\n channelWidth: \"channelWidth\",\n bendSpacing: \"bendSpacing\",\n numberOfBends: \"numberOfBends\",\n rotation: \"rotation\",\n bendLength: \"bendLength\"\n };\n\n this.__placementTool = \"componentPositionTool\";\n\n this.__toolParams = {\n position: \"position\"\n };\n\n this.__renderKeys = [\"FLOW\"];\n\n this.__mint = \"CURVED MIXER\";\n\n this.__zOffsetKeys = {\n FLOW: \"height\"\n };\n\n this.__substrateOffset = {\n FLOW: \"0\"\n };\n }\n\n getPorts(params: { [k: string]: any }) {\n const channelWidth = params.channelWidth;\n const bendLength = params.bendLength;\n const bendSpacing = params.bendSpacing;\n const numberOfBends = params.numberOfBends;\n\n const ports = [];\n\n ports.push(new ComponentPort(bendLength / 2 + channelWidth, 0, \"1\", LogicalLayerType.FLOW));\n\n ports.push(new ComponentPort(bendLength / 2 + channelWidth, (2 * numberOfBends + 1) * channelWidth + 2 * numberOfBends * bendSpacing, \"2\", LogicalLayerType.FLOW));\n\n return ports;\n }\n\n render2D(params: { [k: string]: any }, key: string) {\n const channelWidth = params.channelWidth;\n const bendLength = params.bendLength;\n const bendSpacing = params.bendSpacing;\n const rotation = params.rotation;\n const numBends = params.numberOfBends;\n const x = params.position[0];\n const y = params.position[1];\n const color = params.color;\n const segHalf = bendLength / 2 + channelWidth;\n const segLength = bendLength + 2 * channelWidth;\n const segBend = bendSpacing + 2 * channelWidth;\n const vRepeat = 2 * bendSpacing + 2 * channelWidth;\n const vOffset = bendSpacing + channelWidth;\n const hOffset = bendLength / 2 + channelWidth / 2;\n const serp = new paper.CompoundPath(\"\");\n\n // draw first segment\n let toprect: paper.Rectangle | paper.PathItem = new paper.Path.Rectangle(new paper.Rectangle(x + channelWidth - 1, y, bendLength / 2 + channelWidth / 2 + 1, channelWidth));\n (toprect as any).closed = true;\n for (let i = 0; i < numBends; i++) {\n // draw left curved segment\n let leftCurve: paper.Path.Arc | paper.PathItem = new paper.Path.Arc({\n from: [x + channelWidth, y + vRepeat * i],\n through: [x + channelWidth - (channelWidth + bendSpacing / 2), y + vRepeat * i + bendSpacing / 2 + channelWidth],\n to: [x + channelWidth, y + vRepeat * i + bendSpacing + 2 * channelWidth]\n });\n (leftCurve as any).closed = true;\n const leftCurveSmall = new paper.Path.Arc({\n from: [x + channelWidth, y + vRepeat * i + bendSpacing + channelWidth],\n through: [x + channelWidth - bendSpacing / 2, y + vRepeat * i + bendSpacing / 2 + channelWidth],\n to: [x + channelWidth, y + vRepeat * i + channelWidth]\n });\n leftCurveSmall.closed = true;\n leftCurve = leftCurve.subtract(leftCurveSmall);\n toprect = toprect.unite(leftCurve);\n // serp.addChild(leftCurve);\n // draw horizontal segment\n let hseg = new paper.Path.Rectangle(new paper.Rectangle(x + channelWidth - 1, y + vOffset + vRepeat * i, bendLength + 2, channelWidth));\n toprect = toprect.unite(hseg);\n // draw right curved segment\n let rightCurve: paper.Path.Arc | paper.PathItem = new paper.Path.Arc({\n from: [x + channelWidth + bendLength, y + vOffset + vRepeat * i],\n through: [x + channelWidth + bendLength + (channelWidth + bendSpacing / 2), y + vOffset + vRepeat * i + bendSpacing / 2 + channelWidth],\n to: [x + channelWidth + bendLength, y + vOffset + vRepeat * i + bendSpacing + 2 * channelWidth]\n });\n (rightCurve as any).closed = true;\n const rightCurveSmall = new paper.Path.Arc({\n from: [x + channelWidth + bendLength, y + vOffset + vRepeat * i + bendSpacing + channelWidth],\n through: [x + channelWidth + bendLength + bendSpacing / 2, y + vOffset + vRepeat * i + bendSpacing / 2 + channelWidth],\n to: [x + channelWidth + bendLength, y + vOffset + vRepeat * i + channelWidth]\n });\n rightCurveSmall.closed = true;\n rightCurve = rightCurve.subtract(rightCurveSmall);\n toprect = toprect.unite(rightCurve);\n\n if (i === numBends - 1) {\n // draw half segment to close\n hseg = new paper.Path.Rectangle(new paper.Rectangle(x + channelWidth / 2 + bendLength / 2, y + vRepeat * (i + 1), (bendLength + channelWidth) / 2 + 1, channelWidth));\n toprect = toprect.unite(hseg);\n } else {\n // draw full segment\n hseg = new paper.Path.Rectangle(new paper.Rectangle(x + channelWidth - 1, y + vRepeat * (i + 1), bendLength + 2, channelWidth));\n toprect = toprect.unite(hseg);\n }\n toprect = toprect.unite(hseg);\n }\n serp.addChild(toprect);\n\n serp.fillColor = color;\n serp.rotate(rotation, new paper.Point(x, y));\n return serp;\n }\n\n render2DTarget(key: string | null, params: { [k: string]: any }) {\n if (key === null) {\n key = this.__renderKeys[0];\n }\n const render = this.render2D(params, key);\n render.fillColor!.alpha = 0.5;\n return render;\n }\n}\n","import Template from \"./template\";\nimport paper from \"paper\";\nimport ComponentPort from \"../core/componentPort\";\nimport { LogicalLayerType } from \"../core/init\";\n\nexport default class DiamondReactionChamber extends Template {\n constructor() {\n super();\n }\n\n __setupDefinitions(): void {\n this.__unique = {\n position: \"Point\"\n };\n\n this.__heritable = {\n componentSpacing: \"Float\",\n rotation: \"Float\",\n channelWidth: \"Float\",\n length: \"Float\",\n width: \"Float\",\n height: \"Float\"\n };\n\n this.__defaults = {\n componentSpacing: 1000,\n rotation: 0,\n channelWidth: 0.8 * 1000,\n width: 1.23 * 1000,\n length: 4.92 * 1000,\n height: 250\n };\n\n this.__units = {\n componentSpacing: \"μm\",\n rotation: \"°\",\n channelWidth: \"μm\",\n length: \"μm\",\n width: \"μm\",\n height: \"μm\"\n };\n\n this.__minimum = {\n componentSpacing: 0,\n channelWidth: 10,\n width: 30,\n length: 120,\n height: 10,\n rotation: 0\n };\n\n this.__maximum = {\n componentSpacing: 10000,\n channelWidth: 2000,\n width: 6000,\n length: 24 * 1000,\n height: 1200,\n rotation: 360\n };\n\n this.__featureParams = {\n componentSpacing: \"componentSpacing\",\n position: \"position\",\n rotation: \"rotation\",\n channelWidth: \"channelWidth\",\n length: \"length\",\n width: \"width\"\n };\n\n this.__targetParams = {\n componentSpacing: \"componentSpacing\",\n channelWidth: \"channelWidth\",\n length: \"length\",\n width: \"width\",\n rotation: \"rotation\"\n };\n\n this.__placementTool = \"componentPositionTool\";\n\n this.__toolParams = {\n position: \"position\"\n };\n\n this.__renderKeys = [\"FLOW\"];\n\n this.__mint = \"DIAMOND REACTION CHAMBER\";\n\n this.__zOffsetKeys = {\n FLOW: \"height\"\n };\n\n this.__substrateOffset = {\n FLOW: \"0\"\n };\n }\n\n getPorts(params: { [k: string]: any }) {\n const channelWidth = params.channelWidth;\n const l = params.length;\n const w = params.width;\n\n const ports = [];\n\n ports.push(new ComponentPort(-l / 2, 0, \"1\", LogicalLayerType.FLOW));\n\n ports.push(new ComponentPort(l / 2, 0, \"2\", LogicalLayerType.FLOW));\n\n return ports;\n }\n\n render2D(params: { [k: string]: any }, key: string) {\n const position = params.position;\n const px = position[0];\n const py = position[1];\n const cw = params.channelWidth;\n const l = params.length;\n const w = params.width;\n const rotation = params.rotation;\n console.log(\"Rotation\", rotation);\n const color = params.color;\n let p0, p1, p2, p3, p4, p5;\n p0 = [px - l / 2, py - cw / 2];\n p1 = [px - l / 2, py + cw / 2];\n p2 = [px, py + w + cw / 2];\n p3 = [px + l / 2, py + cw / 2];\n p4 = [px + l / 2, py - cw / 2];\n p5 = [px, py - cw / 2 - w];\n const hex = new paper.Path();\n hex.add(new paper.Point(p0));\n hex.add(new paper.Point(p1));\n hex.add(new paper.Point(p2));\n hex.add(new paper.Point(p3));\n hex.add(new paper.Point(p4));\n hex.add(new paper.Point(p5));\n hex.closed = true;\n hex.rotate(rotation, new paper.Point(px, py));\n hex.fillColor = color;\n return hex;\n }\n\n render2DTarget(key: string | null, params: { [k: string]: any }) {\n if (key === null) {\n key = this.__renderKeys[0];\n }\n const render = this.render2D(params, key);\n render.fillColor!.alpha = 0.5;\n return render;\n }\n}\n","import Template from \"./template\";\nimport paper from \"paper\";\nimport ComponentPort from \"../core/componentPort\";\nimport { LogicalLayerType } from \"../core/init\";\n\nexport default class DropletGenerator extends Template {\n constructor() {\n super();\n }\n\n __setupDefinitions(): void {\n this.__unique = {\n position: \"Point\"\n };\n\n this.__heritable = {\n componentSpacing: \"Float\",\n orificeSize: \"Float\",\n orificeLength: \"Float\",\n oilInputWidth: \"Float\",\n waterInputWidth: \"Float\",\n outputWidth: \"Float\",\n outputLength: \"Float\",\n height: \"Float\",\n rotation: \"Float\"\n };\n\n this.__defaults = {\n componentSpacing: 1000,\n orificeSize: 0.2 * 1000,\n orificeLength: 0.4 * 1000,\n oilInputWidth: 0.8 * 1000,\n waterInputWidth: 0.6 * 1000,\n outputWidth: 0.6 * 1000,\n outputLength: 0.6 * 1000,\n height: 250,\n rotation: 0\n };\n\n this.__units = {\n componentSpacing: \"μm\",\n orificeSize: \"μm\",\n height: \"μm\",\n orificeLength: \"μm\",\n oilInputWidth: \"μm\",\n waterInputWidth: \"μm\",\n outputWidth: \"μm\",\n outputLength: \"μm\",\n rotation: \"°\"\n };\n\n this.__minimum = {\n componentSpacing: 0,\n orificeSize: 10,\n orificeLength: 10,\n oilInputWidth: 10,\n waterInputWidth: 10,\n outputWidth: 10,\n outputLength: 10,\n height: 10,\n rotation: 0\n };\n\n this.__maximum = {\n componentSpacing: 10000,\n orificeSize: 2000,\n orificeLength: 2000,\n oilInputWidth: 2000,\n waterInputWidth: 2000,\n outputWidth: 2000,\n outputLength: 2000,\n height: 1200,\n rotation: 360\n };\n\n this.__featureParams = {\n componentSpacing: \"componentSpacing\",\n position: \"position\",\n orificeSize: \"orificeSize\",\n orificeLength: \"orificeLength\",\n oilInputWidth: \"oilInputWidth\",\n waterInputWidth: \"waterInputWidth\",\n outputWidth: \"outputWidth\",\n outputLength: \"outputLength\",\n height: \"height\",\n rotation: \"rotation\"\n };\n\n this.__targetParams = {\n componentSpacing: \"componentSpacing\",\n orificeSize: \"orificeSize\",\n orificeLength: \"orificeLength\",\n oilInputWidth: \"oilInputWidth\",\n waterInputWidth: \"waterInputWidth\",\n outputWidth: \"outputWidth\",\n outputLength: \"outputLength\",\n height: \"height\",\n rotation: \"rotation\"\n };\n\n this.__placementTool = \"componentPositionTool\";\n\n this.__toolParams = {\n position: \"position\"\n };\n\n this.__renderKeys = [\"FLOW\"];\n\n this.__mint = \"NOZZLE DROPLET GENERATOR\";\n\n this.__zOffsetKeys = {\n FLOW: \"height\"\n };\n\n this.__substrateOffset = {\n FLOW: \"0\"\n };\n }\n\n getPorts(params: { [k: string]: any }) {\n const orificeSize = params.orificeSize;\n const orificeLength = params.orificeLength;\n const oilInputWidth = params.oilInputWidth;\n const waterInputWidth = params.waterInputWidth;\n const outputWidth = params.outputWidth;\n const outputLength = params.outputLength;\n\n const ports = [];\n\n // Oil Top\n ports.push(new ComponentPort(oilInputWidth / 2, -waterInputWidth / 2, \"1\", LogicalLayerType.FLOW));\n\n // Out\n ports.push(new ComponentPort(oilInputWidth + orificeLength + outputLength, 0, \"2\", LogicalLayerType.FLOW));\n\n // Oil Bottom\n ports.push(new ComponentPort(oilInputWidth / 2, waterInputWidth / 2, \"3\", LogicalLayerType.FLOW));\n\n // Input\n ports.push(new ComponentPort(0, 0, \"4\", LogicalLayerType.FLOW));\n\n return ports;\n }\n\n render2D(params: { [k: string]: any }, key = \"FLOW\") {\n const pos = params.position;\n const x = pos[0];\n const y = pos[1];\n const color = params.color;\n const orificeSize = params.orificeSize;\n const orificeLength = params.orificeLength;\n const oilInputWidth = params.oilInputWidth;\n const waterInputWidth = params.waterInputWidth;\n const outputWidth = params.outputWidth;\n const outputLength = params.outputLength;\n const rotation = params.rotation;\n\n const ret = new paper.Path();\n\n const p1 = new paper.Point(x, y - waterInputWidth / 2);\n\n const p2 = new paper.Point(p1.x + oilInputWidth, p1.y);\n\n const p3 = new paper.Point(p2.x, p2.y + (waterInputWidth / 2 - orificeSize / 2));\n\n const p4 = new paper.Point(p3.x + orificeLength, p3.y);\n\n const p5 = new paper.Point(p4.x, p4.y - (outputWidth / 2 - orificeSize / 2));\n\n const p6 = new paper.Point(p5.x + outputLength, p5.y);\n\n const p7 = new paper.Point(p6.x, p6.y + outputWidth);\n\n const p8 = new paper.Point(p7.x - outputLength, p7.y);\n\n const p9 = new paper.Point(p8.x, p8.y - (outputWidth / 2 - orificeSize / 2));\n\n const p10 = new paper.Point(p9.x - orificeLength, p9.y);\n\n const p11 = new paper.Point(p10.x, p10.y + (waterInputWidth / 2 - orificeSize / 2));\n\n const p12 = new paper.Point(p11.x - oilInputWidth, p11.y);\n\n ret.add(p1);\n ret.add(p2);\n ret.add(p3);\n ret.add(p4);\n ret.add(p5);\n ret.add(p6);\n ret.add(p7);\n ret.add(p8);\n ret.add(p9);\n ret.add(p10);\n ret.add(p11);\n ret.add(p12);\n\n // Rotate the geometry\n ret.rotate(rotation, new paper.Point(pos[0], pos[1]));\n\n ret.closed = true;\n ret.fillColor = color;\n return ret;\n }\n\n render2DTarget(key: string | null, params: { [k: string]: any }) {\n if (key === null) {\n key = this.__renderKeys[0];\n }\n const render = this.render2D(params, key);\n render.fillColor!.alpha = 0.5;\n return render;\n }\n}\n","import Template from \"./template\";\nimport paper from \"paper\";\nimport ComponentPort from \"../core/componentPort\";\nimport { LogicalLayerType } from \"../core/init\";\n\nexport default class GradientGenerator extends Template {\n constructor() {\n super();\n }\n\n __setupDefinitions(): void {\n this.__unique = {\n position: \"Point\"\n };\n\n this.__heritable = {\n componentSpacing: \"Float\",\n bendSpacing: \"Float\",\n numberOfBends: \"Float\",\n channelWidth: \"Float\",\n bendLength: \"Float\",\n in: \"Float\",\n out: \"Float\",\n spacing: \"Float\",\n height: \"Float\",\n rotation: \"Float\"\n };\n\n this.__defaults = {\n componentSpacing: 1000,\n channelWidth: 0.8 * 1000,\n bendSpacing: 1.23 * 1000,\n numberOfBends: 1,\n bendLength: 2.46 * 1000,\n in: 1,\n out: 3,\n spacing: 10000,\n height: 250,\n rotation: 0\n };\n\n this.__units = {\n componentSpacing: \"μm\",\n bendSpacing: \"μm\",\n numberOfBends: \"\",\n channelWidth: \"μm\",\n bendLength: \"μm\",\n in: \"\",\n out: \"\",\n spacing: \"μm\",\n height: \"μm\",\n rotation: \"°\"\n };\n\n this.__minimum = {\n componentSpacing: 0,\n channelWidth: 10,\n bendSpacing: 10,\n numberOfBends: 1,\n bendLength: 10,\n in: 1,\n out: 3,\n spacing: 10,\n height: 10,\n rotation: 0\n };\n\n this.__maximum = {\n componentSpacing: 10000,\n channelWidth: 2000,\n bendSpacing: 6000,\n numberOfBends: 20,\n bendLength: 12 * 1000,\n in: 30,\n out: 90,\n spacing: 90000,\n height: 1200,\n rotation: 360\n };\n\n this.__featureParams = {\n componentSpacing: \"componentSpacing\",\n position: \"position\",\n channelWidth: \"channelWidth\",\n bendSpacing: \"bendSpacing\",\n numberOfBends: \"numberOfBends\",\n rotation: \"rotation\",\n bendLength: \"bendLength\",\n in: \"in\",\n out: \"out\",\n spacing: \"spacing\"\n };\n\n this.__targetParams = {\n componentSpacing: \"componentSpacing\",\n channelWidth: \"channelWidth\",\n bendSpacing: \"bendSpacing\",\n numberOfBends: \"numberOfBends\",\n rotation: \"rotation\",\n bendLength: \"bendLength\",\n in: \"in\",\n out: \"out\",\n spacing: \"spacing\"\n };\n\n this.__placementTool = \"componentPositionTool\";\n\n this.__toolParams = {\n position: \"position\"\n };\n\n this.__renderKeys = [\"FLOW\"];\n\n this.__mint = \"GRADIENT GENERATOR\";\n\n this.__zOffsetKeys = {\n FLOW: \"height\"\n };\n\n this.__substrateOffset = {\n FLOW: \"0\"\n };\n }\n\n getPorts(params: { [k: string]: any }) {\n const bendSpacing = params.bendSpacing;\n const numBends = params.numberOfBends;\n const channelWidth = params.channelWidth;\n const invalue = params.in;\n const outvalue = params.out;\n const spacing = params.spacing; // Center to Center\n\n const ports = [];\n\n const maxstagewidth = (outvalue - 1) * spacing;\n const posx = maxstagewidth / 2;\n\n const stagelength = channelWidth * (2 * numBends + 1) + (2 * numBends + 2) * bendSpacing + channelWidth;\n\n const segBend = bendSpacing + 2 * channelWidth;\n\n const fullLength = (outvalue - 1) * (4 * segBend - 3.5 * channelWidth) + stagelength;\n\n let stagevalue = invalue;\n let totalstagewidth = (stagevalue - 1) * spacing;\n\n let xref = -totalstagewidth / 2;\n let yref = stagelength * (stagevalue - invalue);\n\n const vRepeat = 2 * bendSpacing + 2 * channelWidth;\n\n for (let i = 0; i < invalue; i++) {\n // Generate the ports for each of the inputs\n const x = xref + spacing * i + channelWidth / 2;\n ports.push(new ComponentPort(x, 0, (i + 1).toString(), LogicalLayerType.FLOW));\n }\n\n stagevalue = outvalue;\n totalstagewidth = (stagevalue - 1) * spacing;\n\n xref = -totalstagewidth / 2;\n yref = stagelength * (stagevalue - invalue + 1);\n\n for (let i = 0; i < outvalue; i++) {\n // Generate the ports for each of the outputs\n const x = xref + spacing * i + channelWidth / 2;\n ports.push(new ComponentPort(x, yref + channelWidth, (invalue + 1 + i).toString(), LogicalLayerType.FLOW));\n }\n\n return ports;\n }\n\n render2D(params: { [k: string]: any }, key: string) {\n const position = params.position;\n const bendSpacing = params.bendSpacing;\n const numBends = params.numberOfBends;\n const channelWidth = params.channelWidth;\n const bendLength = params.bendLength;\n const rotation = params.rotation;\n const invalue = params.in;\n const outvalue = params.out;\n const spacing = params.spacing; // Center to Center\n const color = params.color;\n\n const posx = position[0];\n const posy = position[1];\n const stagelength = channelWidth * (2 * numBends + 1) + (2 * numBends + 2) * bendSpacing + channelWidth;\n const gradientgenerator = new paper.CompoundPath(\"\");\n // insertMixer(gradientgenerator, bendSpacing, numBends, channelWidth, bendLength, posx, posy, color);\n // Iterate through each of the stages\n\n // Draw the first stage which is just channels\n const totalstagewidth = (invalue - 1) * spacing;\n let xref = posx - totalstagewidth / 2;\n let yref = posy;\n // Draw straight channels for each of the input lines\n for (let i = 0; i < invalue; i++) {\n const x = xref + spacing * i;\n const y = yref;\n\n // Insert Straight channel\n gradientgenerator.addChild(\n new paper.Path.Rectangle({\n point: new paper.Point(x, y),\n size: [channelWidth, stagelength + channelWidth]\n })\n );\n }\n\n for (let stagevalue = invalue + 1; stagevalue <= outvalue; stagevalue++) {\n // For each stage : do the following\n /*\n Check if each stagevalue is odd or even\n\n if (not last stage) place horizontal bar connecting eveything\n */\n\n // Calculate the total width and start placing mixers\n const totalstagewidth = (stagevalue - 1) * spacing;\n\n xref = posx - totalstagewidth / 2;\n yref = posy + stagelength * (stagevalue - invalue);\n\n // Start from the left\n for (let i = 0; i < stagevalue; i++) {\n const x = xref + spacing * i;\n\n const y = yref;\n // insert the mixer\n this.__insertMixer(gradientgenerator as paper.Path, bendSpacing, numBends, channelWidth, bendLength, x, y, color);\n }\n\n // Insert horizontal bar\n const hbar = new paper.Path.Rectangle({\n point: new paper.Point(xref, yref),\n size: [totalstagewidth, channelWidth],\n fillColor: color,\n strokeWidth: 0\n });\n\n gradientgenerator.addChild(hbar);\n }\n\n gradientgenerator.fillColor = color;\n // console.log(\"testing\");\n\n gradientgenerator.rotate(rotation, new paper.Point(posx, posy));\n\n return gradientgenerator;\n }\n\n __insertMixer(serpentine: paper.Path, bendSpacing: number, numBends: number, channelWidth: number, bendLength: number, x: number, y: number, color: paper.Color): paper.Path {\n const segHalf = bendLength / 2 + channelWidth;\n const segLength = bendLength + 2 * channelWidth;\n const segBend = bendSpacing + 2 * channelWidth;\n const vRepeat = 2 * bendSpacing + 2 * channelWidth;\n const vOffset = bendSpacing + channelWidth;\n const hOffset = bendLength / 2 + channelWidth / 2;\n\n x -= hOffset;\n // TopRectangle\n serpentine.addChild(new paper.Path.Rectangle(new paper.Rectangle(x + hOffset, y, channelWidth, 2 * channelWidth + bendSpacing)));\n y += channelWidth + bendSpacing;\n serpentine.addChild(new paper.Path.Rectangle(new paper.Rectangle(x, y, segHalf + channelWidth / 2, channelWidth)));\n for (let i = 0; i < numBends; i++) {\n serpentine.addChild(new paper.Path.Rectangle(new paper.Rectangle(x, y + vRepeat * i, channelWidth, segBend)));\n serpentine.addChild(new paper.Path.Rectangle(new paper.Rectangle(x, y + vOffset + vRepeat * i, segLength, channelWidth)));\n serpentine.addChild(new paper.Path.Rectangle(new paper.Rectangle(x + channelWidth + bendLength, y + vOffset + vRepeat * i, channelWidth, segBend)));\n if (i === numBends - 1) {\n // draw half segment to close\n serpentine.addChild(new paper.Path.Rectangle(new paper.Rectangle(x + hOffset, y + vRepeat * (i + 1), segHalf, channelWidth)));\n } else {\n // draw full segment\n serpentine.addChild(new paper.Path.Rectangle(new paper.Rectangle(x, y + vRepeat * (i + 1), segLength, channelWidth)));\n }\n }\n\n // Bottom rectabvke\n serpentine.addChild(new paper.Path.Rectangle(new paper.Rectangle(x + hOffset, y + vRepeat * numBends, channelWidth, 2 * channelWidth + bendSpacing)));\n\n return serpentine;\n }\n\n render2DTarget(key: string | null, params: { [k: string]: any }) {\n const render = this.render2D(params, (key = \"FLOW\"));\n render.fillColor!.alpha = 0.5;\n return render;\n }\n}\n","import Template from \"./template\";\nimport paper from \"paper\";\nimport ComponentPort from \"../core/componentPort\";\nimport { LogicalLayerType } from \"../core/init\";\n\nexport default class Mux extends Template {\n constructor() {\n super();\n }\n\n __setupDefinitions(): void {\n this.__unique = {\n position: \"Point\"\n };\n\n this.__heritable = {\n componentSpacing: \"Float\",\n flowChannelWidth: \"Float\",\n rotation: \"Float\",\n spacing: \"Float\",\n in: \"Integer\",\n out: \"Integer\",\n width: \"Float\",\n length: \"Float\",\n height: \"Float\",\n stageLength: \"Float\",\n controlChannelWidth: \"Float\"\n };\n\n this.__defaults = {\n componentSpacing: 1000,\n flowChannelWidth: 0.8 * 1000,\n rotation: 0,\n spacing: 4 * 1000,\n in: 1,\n out: 8,\n width: 1.6 * 1000,\n length: 1.6 * 1000,\n height: 250,\n stageLength: 4000,\n controlChannelWidth: 0.4 * 1000\n };\n\n this.__units = {\n componentSpacing: \"μm\",\n flowChannelWidth: \"μm\",\n rotation: \"°\",\n spacing: \"μm\",\n in: \"\",\n out: \"\",\n width: \"μm\",\n length: \"μm\",\n height: \"μm\",\n stageLength: \"μm\",\n controlChannelWidth: \"μm\"\n };\n\n this.__minimum = {\n componentSpacing: 0,\n flowChannelWidth: 10,\n spacing: 30,\n in: 1,\n out: 2,\n width: 60,\n length: 60,\n height: 10,\n stageLength: 100,\n controlChannelWidth: 10,\n rotation: 0\n };\n\n this.__maximum = {\n componentSpacing: 10000,\n flowChannelWidth: 2000,\n spacing: 12000,\n in: 1,\n out: 128,\n width: 12 * 1000,\n length: 12 * 1000,\n height: 1200,\n stageLength: 6000,\n controlChannelWidth: 2000,\n rotation: 360\n };\n\n this.__featureParams = {\n componentSpacing: \"componentSpacing\",\n position: \"position\",\n flowChannelWidth: \"flowChannelWidth\",\n controlChannelWidth: \"controlChannelWidth\",\n rotation: \"rotation\",\n spacing: \"spacing\",\n width: \"width\",\n length: \"length\",\n in: \"in\",\n out: \"out\",\n stageLength: \"stageLength\"\n };\n\n this.__targetParams = {\n componentSpacing: \"componentSpacing\",\n position: \"position\",\n flowChannelWidth: \"flowChannelWidth\",\n controlChannelWidth: \"controlChannelWidth\",\n rotation: \"rotation\",\n spacing: \"spacing\",\n width: \"width\",\n length: \"length\",\n in: \"in\",\n out: \"out\",\n stageLength: \"stageLength\"\n };\n\n this.__placementTool = \"multilayerPositionTool\";\n\n this.__toolParams = {\n position: \"position\"\n };\n\n this.__renderKeys = [\"FLOW\", \"CONTROL\"];\n\n this.__mint = \"MUX\";\n\n this.__zOffsetKeys = {\n FLOW: \"height\",\n CONTROL: \"height\"\n };\n\n this.__substrateOffset = {\n FLOW: \"0\",\n CONTROL: \"+1\"\n };\n }\n\n __drawFlow(params: { [k: string]: any }): paper.CompoundPath {\n const position = params.position;\n const cw = params.flowChannelWidth;\n let rotation = params.rotation;\n const spacing = params.spacing;\n const ins = params.in;\n const outs = params.out;\n let leafs;\n if (ins < outs) {\n leafs = outs;\n } else {\n leafs = ins;\n rotation += 180;\n }\n const color = params.color;\n const stagelength = params.stageLength;\n const px = position[0];\n const py = position[1];\n\n const levels = Math.ceil(Math.log2(leafs));\n let isodd = false; // This is used to figure out how many lines have to be made\n if (leafs % 2 === 0) {\n isodd = false;\n } else {\n isodd = true;\n }\n const w = spacing * (leafs / 2 + 1);\n const l = (levels + 1) * stagelength;\n\n // console.log(\"CW: \" + cw + \" levels: \"+ levels + \" width: \" + w + \" length: \" + l)\n\n const treepath = new paper.CompoundPath(\"\");\n\n this.__generateMuxTwig(treepath, px, py, cw, stagelength, w, 1, levels);\n\n // Draw the tree\n\n treepath.fillColor = color;\n return (treepath.rotate(rotation, new paper.Point(px, py)) as unknown) as paper.CompoundPath;\n }\n\n __drawControl(params: { [k: string]: any }): paper.CompoundPath {\n const position = params.position;\n const cw = params.flowChannelWidth;\n const ctlcw = params.controlChannelWidth;\n let rotation = params.rotation;\n const spacing = params.spacing;\n const ins = params.in;\n const outs = params.out;\n let leafs;\n if (ins < outs) {\n leafs = outs;\n } else {\n leafs = ins;\n rotation += 180;\n }\n const color = params.color;\n const stagelength = params.stageLength;\n const valvelength = params.length;\n const valvewidth = params.width;\n const px = position[0];\n const py = position[1];\n\n const treeWidth = (leafs - 1) * spacing + leafs * cw + leafs * valvewidth;\n const leftEdge = px - treeWidth / 2;\n const rightEdge = px + treeWidth / 2;\n\n const levels = Math.ceil(Math.log2(leafs));\n\n const isodd = !(leafs % 2);\n const w = spacing * (leafs / 2 + 1);\n const l = (levels + 1) * stagelength;\n\n // console.log(\"CW: \" + cw + \" levels: \"+ levels + \" width: \" + w + \" length: \" + l)\n\n const treepath = new paper.CompoundPath(\"\");\n\n this.__generateMuxControlTwig(treepath, px, py, cw, ctlcw, stagelength, w, 1, levels, valvewidth, valvelength, leftEdge, rightEdge);\n\n // Draw the tree\n\n treepath.fillColor = color;\n return (treepath.rotate(rotation, new paper.Point(px, py)) as unknown) as paper.CompoundPath;\n }\n\n getPorts(params: { [k: string]: any }) {\n const ports = [];\n const cw = params.flowChannelWidth;\n const spacing = params.spacing;\n const ins = params.in;\n const outs = params.out;\n let leafs;\n if (ins < outs) {\n leafs = outs;\n } else {\n leafs = ins;\n }\n const stagelength = params.stageLength;\n\n const levels = Math.ceil(Math.log2(leafs));\n const w = spacing * (leafs / 2 + 1);\n\n const length = levels * (cw + stagelength) + stagelength;\n const width = 2 * 0.5 * w * 2 * Math.pow(0.5, levels);\n\n ports.push(new ComponentPort(0, 0, \"1\", LogicalLayerType.FLOW));\n\n for (let i = 0; i < leafs; i++) {\n ports.push(new ComponentPort(((leafs - 1) * width) / 2 - i * width, length, (2 + i).toString(), LogicalLayerType.FLOW));\n }\n\n let count = 2 + leafs;\n const lstartx = -0.5 * (cw + spacing);\n const lendx = lstartx + cw;\n const lstarty = stagelength + cw;\n const lendy = lstarty + stagelength;\n\n const lcenterx = (lstartx + lendx) / 2;\n const lcentery = lstarty + Math.abs(lstarty - lendy) / 4;\n const valvewidth = params.width;\n\n const treeWidth = (leafs - 1) * spacing + leafs * cw + valvewidth;\n\n const leftEdge = -treeWidth / 2;\n const rightEdge = treeWidth / 2;\n\n const rstartx = 0.5 * (spacing - cw);\n const rendx = rstartx + cw;\n const rstarty = stagelength + cw;\n const rendy = rstarty + stagelength;\n\n const rcenterx = (rstartx + rendx) / 2;\n const rcentery = rstarty + (Math.abs(rstarty - rendy) * 3) / 4;\n\n for (let i = 0; i < Math.log2(leafs); i++) {\n ports.push(new ComponentPort(leftEdge, i * (cw + stagelength) + lcentery, count.toString(), LogicalLayerType.CONTROL));\n count++;\n ports.push(new ComponentPort(rightEdge, i * (cw + stagelength) + rcentery, count.toString(), LogicalLayerType.CONTROL));\n count++;\n }\n\n return ports;\n }\n\n render2D(params: { [k: string]: any }, key: string): paper.CompoundPath {\n if (key === \"FLOW\") {\n return this.__drawFlow(params);\n } else if (key === \"CONTROL\") {\n return this.__drawControl(params);\n }\n throw new Error(\"Unknown key: \" + key);\n }\n\n render2DTarget(key: string | null, params: { [k: string]: any }): paper.CompoundPath {\n const render = this.render2D(params, \"FLOW\");\n render?.addChild(this.render2D(params, \"CONTROL\") as paper.Item);\n render!.fillColor!.alpha = 0.5;\n return render;\n }\n\n __generateMuxTwig(treepath: paper.CompoundPath, px: number, py: number, cw: number, stagelength: number, newspacing: number, level: number, maxlevel: number, islast = false): void {\n // var newspacing = 2 * (spacing + cw);\n const hspacing = newspacing / 2;\n const lex = px - 0.5 * newspacing;\n const ley = py + cw + stagelength;\n const rex = px + 0.5 * newspacing;\n const rey = py + cw + stagelength;\n\n if (level === maxlevel) {\n islast = true;\n // console.log(\"Final Spacing: \" + newspacing)\n }\n\n this.__drawmuxtwig(treepath, px, py, cw, stagelength, newspacing, islast);\n\n if (!islast) {\n this.__generateMuxTwig(treepath, lex, ley, cw, stagelength, hspacing, level + 1, maxlevel);\n this.__generateMuxTwig(treepath, rex, rey, cw, stagelength, hspacing, level + 1, maxlevel);\n }\n }\n\n __drawmuxtwig(treepath: paper.CompoundPath, px: number, py: number, cw: number, stagelength: number, spacing: number, drawleafs = false): paper.CompoundPath {\n // stem\n let startPoint = new paper.Point(px - cw / 2, py);\n let endPoint = new paper.Point(px + cw / 2, py + stagelength);\n let rec = new paper.Path.Rectangle({\n from: startPoint,\n to: endPoint,\n radius: 0,\n strokeWidth: 0\n });\n\n treepath.addChild(rec);\n\n // Draw 2 leafs\n // left leaf\n const lstartx = px - 0.5 * (cw + spacing);\n const lendx = lstartx + cw;\n const lstarty = py + stagelength + cw;\n const lendy = lstarty + stagelength;\n\n // //right leaf\n const rstartx = px + 0.5 * (spacing - cw);\n const rendx = rstartx + cw;\n const rstarty = py + stagelength + cw;\n const rendy = rstarty + stagelength;\n\n if (drawleafs) {\n startPoint = new paper.Point(lstartx, lstarty);\n endPoint = new paper.Point(lendx, lendy);\n rec = new paper.Path.Rectangle({\n from: startPoint,\n to: endPoint,\n radius: 0,\n strokeWidth: 0\n });\n treepath.addChild(rec);\n\n startPoint = new paper.Point(rstartx, rstarty);\n endPoint = new paper.Point(rendx, rendy);\n rec = new paper.Path.Rectangle({\n from: startPoint,\n to: endPoint,\n radius: 0,\n strokeWidth: 0\n });\n treepath.addChild(rec);\n }\n\n // Horizontal bar\n const hstartx = px - 0.5 * (cw + spacing);\n const hendx = rendx;\n const hstarty = py + stagelength;\n const hendy = hstarty + cw;\n startPoint = new paper.Point(hstartx, hstarty);\n endPoint = new paper.Point(hendx, hendy);\n rec = new paper.Path.Rectangle({\n from: startPoint,\n to: endPoint,\n radius: 0,\n strokeWidth: 0\n });\n treepath.addChild(rec);\n return treepath;\n }\n\n __generateMuxControlTwig(\n treepath: paper.CompoundPath,\n px: number,\n py: number,\n cw: number,\n ctlcw: number,\n stagelength: number,\n newspacing: number,\n level: number,\n maxlevel: number,\n valvewidth: number,\n valvelength: number,\n leftEdge: number,\n rightEdge: number,\n islast = false\n ): void {\n // var newspacing = 2 * (spacing + cw);\n const hspacing = newspacing / 2;\n const lex = px - 0.5 * newspacing;\n const ley = py + cw + stagelength;\n const rex = px + 0.5 * newspacing;\n const rey = py + cw + stagelength;\n\n if (level === maxlevel) {\n islast = true;\n // console.log(\"Final Spacing: \" + newspacing)\n }\n\n this.__drawmuxcontroltwig(treepath, px, py, cw, ctlcw, stagelength, newspacing, valvewidth, valvelength, leftEdge, rightEdge, islast);\n\n if (!islast) {\n this.__generateMuxControlTwig(treepath, lex, ley, cw, ctlcw, stagelength, hspacing, level + 1, maxlevel, valvewidth, valvelength, leftEdge, rightEdge);\n this.__generateMuxControlTwig(treepath, rex, rey, cw, ctlcw, stagelength, hspacing, level + 1, maxlevel, valvewidth, valvelength, leftEdge, rightEdge);\n }\n }\n\n __drawmuxcontroltwig(\n treepath: paper.CompoundPath,\n px: number,\n py: number,\n cw: number,\n ctlcw: number,\n stagelength: number,\n spacing: number,\n valvewidth: number,\n valvelength: number,\n leftEdge: number,\n rightEdge: number,\n drawleafs = false\n ): paper.CompoundPath {\n // stem - don't bother with valves\n\n // Draw 2 valves\n // left leaf\n const lstartx = px - 0.5 * (cw + spacing);\n const lendx = lstartx + cw;\n const lstarty = py + stagelength + cw;\n const lendy = lstarty + stagelength;\n\n const lcenterx = (lstartx + lendx) / 2;\n const lcentery = lstarty + Math.abs(lstarty - lendy) / 4;\n\n // //right leaf\n const rstartx = px + 0.5 * (spacing - cw);\n const rendx = rstartx + cw;\n const rstarty = py + stagelength + cw;\n const rendy = rstarty + stagelength;\n\n const rcenterx = (rstartx + rendx) / 2;\n const rcentery = rstarty + (Math.abs(rstarty - rendy) * 3) / 4;\n\n let startPoint = new paper.Point(lcenterx - valvewidth / 2, lcentery - valvelength / 2);\n let endPoint = new paper.Point(lcenterx + valvewidth / 2, lcentery + valvewidth / 2);\n let rec = new paper.Path.Rectangle({\n from: startPoint,\n to: endPoint,\n radius: 0,\n strokeWidth: 0\n });\n treepath.addChild(rec);\n\n const leftChannelStart = new paper.Point(startPoint.x, lcentery - ctlcw / 2);\n const leftChannelEnd = new paper.Point(leftEdge, lcentery + ctlcw / 2);\n\n const leftChannel = new paper.Path.Rectangle({\n from: leftChannelStart,\n to: leftChannelEnd,\n radius: 0,\n strokeWidth: 0\n });\n treepath.addChild(leftChannel);\n\n startPoint = new paper.Point(rcenterx - valvewidth / 2, rcentery - valvelength / 2);\n endPoint = new paper.Point(rcenterx + valvewidth / 2, rcentery + valvewidth / 2);\n rec = new paper.Path.Rectangle({\n from: startPoint,\n to: endPoint,\n radius: 0,\n strokeWidth: 0\n });\n\n treepath.addChild(rec);\n const rightChannelStart = new paper.Point(endPoint.x, rcentery - ctlcw / 2);\n const rightChannelEnd = new paper.Point(rightEdge, rcentery + ctlcw / 2);\n\n const rightChannel = new paper.Path.Rectangle({\n from: rightChannelStart,\n to: rightChannelEnd,\n radius: 0,\n strokeWidth: 0\n });\n treepath.addChild(rightChannel);\n\n return treepath;\n }\n}\n","import Template from \"./template\";\nimport paper from \"paper\";\nimport ComponentPort from \"../core/componentPort\";\nimport { LogicalLayerType } from \"../core/init\";\n\nexport default class Pump extends Template {\n constructor() {\n super();\n }\n\n __setupDefinitions(): void {\n this.__unique = {\n position: \"Point\"\n };\n\n this.__heritable = {\n componentSpacing: \"Float\",\n rotation: \"Float\",\n length: \"Float\",\n width: \"Float\",\n height: \"Float\",\n spacing: \"Float\",\n flowChannelWidth: \"Float\"\n };\n\n this.__defaults = {\n componentSpacing: 1000,\n rotation: 0,\n width: 600,\n length: 300,\n height: 250,\n spacing: 1000,\n flowChannelWidth: 300\n };\n\n this.__units = {\n componentSpacing: \"μm\",\n rotation: \"°\",\n length: \"μm\",\n width: \"μm\",\n height: \"μm\",\n spacing: \"μm\",\n flowChannelWidth: \"μm\"\n };\n\n this.__minimum = {\n componentSpacing: 0,\n rotation: 0,\n width: 30,\n length: 120,\n height: 10,\n spacing: 10,\n flowChannelWidth: 1\n };\n\n this.__maximum = {\n componentSpacing: 10000,\n rotation: 360,\n width: 6000,\n length: 24 * 1000,\n height: 1200,\n spacing: 10000,\n flowChannelWidth: 10000\n };\n\n this.__featureParams = {\n componentSpacing: \"componentSpacing\",\n position: \"position\",\n length: \"length\",\n width: \"width\",\n rotation: \"rotation\",\n spacing: \"spacing\",\n flowChannelWidth: \"flowChannelWidth\"\n };\n\n this.__targetParams = {\n componentSpacing: \"componentSpacing\",\n length: \"length\",\n width: \"width\",\n rotation: \"rotation\",\n spacing: \"spacing\",\n flowChannelWidth: \"flowChannelWidth\"\n };\n\n this.__placementTool = \"multilayerPositionTool\";\n\n this.__toolParams = {\n position: \"position\"\n };\n\n this.__renderKeys = [\"FLOW\", \"CONTROL\"];\n\n this.__mint = \"PUMP\";\n\n this.__zOffsetKeys = {\n FLOW: \"height\",\n CONTROL: \"height\"\n };\n\n this.__substrateOffset = {\n FLOW: \"0\",\n CONTROL: \"+1\"\n };\n }\n\n getPorts(params: { [k: string]: any }) {\n const l = params.length;\n const w = params.width;\n const spacing = params.spacing;\n\n const ports = [];\n ports.push(new ComponentPort(0, -l / 2 - spacing, \"1\", LogicalLayerType.FLOW));\n ports.push(new ComponentPort(0, l / 2 + spacing, \"2\", LogicalLayerType.FLOW));\n ports.push(new ComponentPort(0, -spacing, \"3\", LogicalLayerType.CONTROL));\n ports.push(new ComponentPort(0, 0, \"4\", LogicalLayerType.CONTROL));\n ports.push(new ComponentPort(0, spacing, \"5\", LogicalLayerType.CONTROL));\n\n return ports;\n }\n\n __drawFlow(params: { [k: string]: any }) {\n let rec;\n const position = params.position;\n const px = position[0];\n const py = position[1];\n const l = params.length;\n const w = params.width;\n const color = params.color;\n const rotation = params.rotation;\n const spacing = params.spacing;\n const channelwidth = params.flowChannelWidth;\n\n const startX = px - w / 2;\n const startY = py - l / 2;\n const endX = px + w / 2;\n const endY = py + l / 2;\n\n const ret = new paper.CompoundPath(\"\");\n\n const startPoint = new paper.Point(startX, startY);\n const endPoint = new paper.Point(endX, endY);\n\n rec = new paper.Path.Rectangle({\n from: new paper.Point(px - channelwidth / 2, py - spacing - l / 2),\n to: new paper.Point(px + channelwidth / 2, py + spacing + l / 2)\n });\n\n ret.addChild(rec);\n\n ret.fillColor = color;\n ret.rotate(rotation, new paper.Point(px, py));\n return ret;\n }\n\n __drawControl(params: { [k: string]: any }) {\n let rec;\n const position = params.position;\n const px = position[0];\n const py = position[1];\n const l = params.length;\n const w = params.width;\n const color = params.color;\n const rotation = params.rotation;\n const spacing = params.spacing;\n\n const startX = px - w / 2;\n const startY = py - l / 2;\n const endX = px + w / 2;\n const endY = py + l / 2;\n\n const ret = new paper.CompoundPath(\"\");\n\n const startPoint = new paper.Point(startX, startY);\n const endPoint = new paper.Point(endX, endY);\n\n rec = new paper.Path.Rectangle({\n from: startPoint,\n to: endPoint,\n radius: 0,\n fillColor: color,\n strokeWidth: 0\n });\n\n ret.addChild(rec);\n\n const topcenter = new paper.Point(px, py - spacing);\n\n rec = new paper.Path.Rectangle({\n from: new paper.Point(topcenter.x - w / 2, topcenter.y - l / 2),\n to: new paper.Point(topcenter.x + w / 2, topcenter.y + l / 2)\n });\n\n ret.addChild(rec);\n\n const bottomcenter = new paper.Point(px, py + spacing);\n rec = new paper.Path.Rectangle({\n from: new paper.Point(bottomcenter.x - w / 2, bottomcenter.y - l / 2),\n to: new paper.Point(bottomcenter.x + w / 2, bottomcenter.y + l / 2)\n });\n\n ret.addChild(rec);\n\n ret.fillColor = color;\n ret.rotate(rotation, new paper.Point(px, py));\n return ret;\n }\n\n render2D(params: { [k: string]: any }, key = \"FLOW\") {\n if (key === \"FLOW\") {\n return this.__drawFlow(params);\n } else if (key === \"CONTROL\") {\n return this.__drawControl(params);\n }\n\n throw new Error(\"Unknown key: \" + key);\n }\n\n render2DTarget(key: string | null, params: { [k: string]: any }) {\n const ret = new paper.CompoundPath(\"\");\n const flow = this.render2D(params, \"FLOW\");\n const control = this.render2D(params, \"CONTROL\");\n ret.addChild(control as paper.Item);\n ret.addChild(flow as paper.Item);\n ret.fillColor = params.color;\n ret.fillColor!.alpha = 0.5;\n return ret;\n }\n}\n","import Template from \"./template\";\nimport paper from \"paper\";\nimport ComponentPort from \"../core/componentPort\";\nimport { LogicalLayerType } from \"../core/init\";\n\nexport default class Pump3D extends Template {\n constructor() {\n super();\n }\n\n __setupDefinitions(): void {\n this.__unique = {\n position: \"Point\"\n };\n\n this.__heritable = {\n componentSpacing: \"Float\",\n valveRadius: \"Float\",\n height: \"Float\",\n gap: \"Float\",\n rotation: \"Float\",\n spacing: \"Float\",\n flowChannelWidth: \"Float\"\n };\n\n this.__defaults = {\n componentSpacing: 1000,\n valveRadius: 1.2 * 1000,\n height: 250,\n gap: 0.6 * 1000,\n width: 2.4 * 1000,\n length: 2.4 * 1000,\n rotation: 90,\n spacing: 5000,\n flowChannelWidth: 300\n };\n\n this.__units = {\n componentSpacing: \"μm\",\n valveRadius: \"μm\",\n height: \"μm\",\n gap: \"μm\",\n width: \"μm\",\n length: \"μm\",\n rotation: \"°\",\n spacing: \"μm\",\n flowChannelWidth: \"μm\"\n };\n\n this.__minimum = {\n componentSpacing: 0,\n valveRadius: 0.1 * 100,\n height: 0.1 * 100,\n gap: 0.5 * 10,\n rotation: 0,\n spacing: 10,\n flowChannelWidth: 1\n };\n\n this.__maximum = {\n componentSpacing: 10000,\n valveRadius: 0.2 * 10000,\n height: 1.2 * 1000,\n gap: 0.1 * 10000,\n rotation: 360,\n spacing: 10000,\n flowChannelWidth: 10000\n };\n\n this.__featureParams = {\n componentSpacing: \"componentSpacing\",\n position: \"position\",\n rotation: \"rotation\",\n valveRadius: \"valveRadius\",\n flowChannelWidth: \"flowChannelWidth\",\n spacing: \"spacing\",\n gap: \"gap\"\n };\n\n this.__targetParams = {\n componentSpacing: \"componentSpacing\",\n rotation: \"rotation\",\n valveRadius: \"valveRadius\",\n flowChannelWidth: \"flowChannelWidth\",\n spacing: \"spacing\",\n gap: \"gap\"\n };\n\n this.__placementTool = \"multilayerPositionTool\";\n\n this.__toolParams = {\n position: \"position\"\n };\n\n this.__renderKeys = [\"FLOW\", \"CONTROL\", \"INVERSE\"];\n\n this.__mint = \"PUMP3D\";\n\n this.__zOffsetKeys = {\n FLOW: \"height\",\n CONTROL: \"height\",\n INVERSE: \"height\"\n };\n\n this.__substrateOffset = {\n FLOW: \"0\",\n CONTROL: \"+1\",\n INVERSE: \"0\"\n };\n }\n\n getPorts(params: { [k: string]: any }) {\n const radius = params.valveRadius;\n const spacing = params.spacing;\n\n const ports = [];\n\n ports.push(new ComponentPort(0, -spacing - radius, \"1\", LogicalLayerType.FLOW));\n ports.push(new ComponentPort(0, spacing + radius, \"2\", LogicalLayerType.FLOW));\n\n ports.push(new ComponentPort(0, -spacing, \"3\", LogicalLayerType.CONTROL));\n\n ports.push(new ComponentPort(0, 0, \"4\", LogicalLayerType.CONTROL));\n\n ports.push(new ComponentPort(0, spacing, \"5\", LogicalLayerType.CONTROL));\n return ports;\n }\n\n render2D(params: { [k: string]: any }, key = \"FLOW\") {\n if (key === \"FLOW\") {\n return this.__drawFlow(params);\n } else if (key === \"CONTROL\") {\n return this.__drawControl(params);\n } else if (key === \"INVERSE\") {\n return this.__drawInverse(params);\n }\n throw new Error(\"Unknown key: \" + key);\n\n }\n\n render2DTarget(key: string | null, params: { [k: string]: any }) {\n const ret = new paper.CompoundPath(\"\");\n const flow = this.render2D(params, \"FLOW\");\n const control = this.render2D(params, \"CONTROL\");\n ret.addChild(control as paper.Item);\n ret.addChild(flow as paper.Item);\n ret.fillColor = params.color;\n ret.fillColor!.alpha = 0.5;\n return ret;\n }\n\n __drawFlow(params: { [k: string]: any }) {\n let valve;\n let cutout;\n let circ;\n let center;\n const ret = new paper.CompoundPath(\"\");\n\n const position = params.position;\n const gap = params.gap;\n const radius = params.valveRadius;\n const color = params.color;\n const rotation = params.rotation;\n const spacing = params.spacing;\n const channelwidth = params.flowChannelWidth;\n\n center = new paper.Point(position[0], position[1]);\n // let h0p0, h0p1, h0p2, h1p0, h1p1, h1p2;\n circ = new paper.Path.Circle(center, radius);\n // circ.fillColor = color;\n // if (String(color) === \"3F51B5\") {\n cutout = new paper.Path.Rectangle({\n from: new paper.Point(position[0] - radius, position[1] - gap / 2),\n to: new paper.Point(position[0] + radius, position[1] + gap / 2)\n });\n // cutout.fillColor = \"white\";\n valve = circ.subtract(cutout);\n ret.addChild(valve);\n\n const bottomcenter = new paper.Point(position[0], position[1] + spacing);\n circ = new paper.Path.Circle(bottomcenter, radius);\n // circ.fillColor = color;\n // if (String(color) === \"3F51B5\") {\n cutout = new paper.Path.Rectangle({\n from: new paper.Point(bottomcenter.x - radius, bottomcenter.y - gap / 2),\n to: new paper.Point(bottomcenter.x + radius, bottomcenter.y + gap / 2)\n });\n // cutout.fillColor = \"white\";\n valve = circ.subtract(cutout);\n ret.addChild(valve);\n\n const topcenter = new paper.Point(position[0], position[1] - spacing);\n\n circ = new paper.Path.Circle(topcenter, radius);\n // circ.fillColor = color;\n // if (String(color) === \"3F51B5\") {\n cutout = new paper.Path.Rectangle({\n from: new paper.Point(topcenter.x - radius, topcenter.y - gap / 2),\n to: new paper.Point(topcenter.x + radius, topcenter.y + gap / 2)\n });\n // cutout.fillColor = \"white\";\n valve = circ.subtract(cutout);\n ret.addChild(valve);\n\n // Create the channels that go through\n const bottomchannel = new paper.Path.Rectangle({\n from: new paper.Point(bottomcenter.x - channelwidth / 2, bottomcenter.y - gap / 2),\n to: new paper.Point(center.x + channelwidth / 2, center.y + gap / 2)\n });\n\n ret.addChild(bottomchannel);\n\n const topchannel = new paper.Path.Rectangle({\n from: new paper.Point(topcenter.x - channelwidth / 2, topcenter.y + gap / 2),\n to: new paper.Point(center.x + channelwidth / 2, center.y - gap / 2)\n });\n\n ret.addChild(topchannel);\n\n ret.rotate(rotation, center);\n ret.fillColor = color;\n\n return ret;\n }\n\n __drawControl(params: { [k: string]: any }) {\n let circ;\n const position = params.position;\n const radius = params.valveRadius;\n const color = params.color;\n const rotation = params.rotation;\n const spacing = params.spacing;\n\n const ret = new paper.CompoundPath(\"\");\n\n const center = new paper.Point(position[0], position[1]);\n\n circ = new paper.Path.Circle(center, radius);\n ret.addChild(circ);\n\n const topcenter = new paper.Point(position[0], position[1] - spacing);\n circ = new paper.Path.Circle(topcenter, radius);\n ret.addChild(circ);\n\n const bottomcenter = new paper.Point(position[0], position[1] + spacing);\n circ = new paper.Path.Circle(bottomcenter, radius);\n ret.addChild(circ);\n\n ret.rotate(rotation, center);\n ret.fillColor = color;\n return ret;\n }\n\n __drawInverse(params: { [k: string]: any }) {\n let circ;\n const position = params.position;\n const radius = params.valveRadius;\n const color = params.color;\n const rotation = params.rotation;\n const spacing = params.spacing;\n\n const ret = new paper.CompoundPath(\"\");\n\n const center = new paper.Point(position[0], position[1]);\n\n circ = new paper.Path.Circle(center, radius);\n ret.addChild(circ);\n\n const topcenter = new paper.Point(position[0], position[1] - spacing);\n circ = new paper.Path.Circle(topcenter, radius);\n ret.addChild(circ);\n\n const bottomcenter = new paper.Point(position[0], position[1] + spacing);\n circ = new paper.Path.Circle(bottomcenter, radius);\n ret.addChild(circ);\n\n ret.rotate(rotation, center);\n ret.fillColor = color;\n return ret;\n }\n}\n","import Template from \"./template\";\nimport paper from \"paper\";\n\nexport default class RoundedChannel extends Template {\n constructor() {\n super();\n }\n\n __setupDefinitions(): void {\n this.__unique = {\n start: \"Point\",\n end: \"Point\"\n };\n\n this.__heritable = {\n channelWidth: \"Float\",\n height: \"Float\"\n };\n\n this.__defaults = {\n channelWidth: 0.8 * 1000,\n height: 250\n };\n\n this.__units = {\n channelWidth: \"μm\",\n height: \"μm\"\n };\n\n this.__minimum = {\n channelWidth: 3,\n height: 10\n };\n\n this.__maximum = {\n channelWidth: 2000,\n height: 1200\n };\n\n this.__featureParams = {\n start: \"start\",\n end: \"end\",\n width: \"channelWidth\"\n };\n\n this.__targetParams = {\n diameter: \"channelWidth\"\n };\n\n this.__placementTool = \"DragTool\";\n\n this.__toolParams = {\n start: \"start\",\n end: \"end\"\n };\n\n this.__renderKeys = [\"FLOW\"];\n\n this.__mint = \"ROUNDED CHANNEL\";\n\n this.__zOffsetKeys = {\n FLOW: \"height\"\n };\n\n this.__substrateOffset = {\n FLOW: \"0\"\n };\n }\n\n render2D(params: { [k: string]: any }, key: string) {\n const start = params.start;\n const end = params.end;\n const color = params.color;\n const width = params.width;\n const baseColor = params.baseColor;\n const startPoint = new paper.Point(start[0], start[1]);\n const endPoint = new paper.Point(end[0], end[1]);\n const vec = endPoint.subtract(startPoint);\n const rec = new paper.Path.Rectangle({\n size: [vec.length + width, width],\n point: start,\n radius: width / 2,\n fillColor: color,\n strokeWidth: 0\n });\n rec.translate(([-width / 2, -width / 2] as unknown) as paper.Point);\n rec.rotate(vec.angle, start);\n return rec;\n }\n\n render2DTarget(key: string | null, params: { [k: string]: any }) {\n const position = params.position;\n const radius = params.diameter;\n const color1 = params.color;\n const pos = new paper.Point(position[0], position[1]);\n const outerCircle = new paper.Path.Circle(pos, radius);\n outerCircle.fillColor = color1;\n return outerCircle;\n }\n}\n","import Template from \"./template\";\nimport paper from \"paper\";\nimport ComponentPort from \"../core/componentPort\";\nimport { LogicalLayerType } from \"../core/init\";\n\nexport default class thermoCycler extends Template {\n constructor() {\n super();\n }\n\n __setupDefinitions(): void {\n this.__unique = {\n position: \"Point\"\n };\n this.__heritable = {\n componentSpacing: \"Float\",\n rotation: \"Float\",\n width: \"Float\",\n length: \"Float\",\n height: \"Float\",\n temperature: \"Float\"\n };\n this.__defaults = {\n componentSpacing: 1000,\n rotation: 0,\n width: 20 * 1000,\n length: 40 * 1000,\n height: 5 * 1000,\n temperature: 0.03 * 1000\n };\n this.__units = {\n componentSpacing: \"μm\",\n rotation: \"°\",\n width: \"μm\",\n length: \"μm\",\n height: \"μm\",\n temperature: \"°C\"\n };\n this.__minimum = {\n componentSpacing: 0,\n rotation: 0,\n width: 10 * 1000,\n length: 10 * 1000,\n height: 1.25 * 1000,\n temperature: 0 * 1000\n };\n this.__maximum = {\n componentSpacing: 10000,\n rotation: 90,\n width: 60 * 1000,\n length: 60 * 1000,\n height: 10 * 1000,\n temperature: 0.1 * 1000\n };\n this.__placementTool = \"multilayerPositionTool\";\n this.__toolParams = {\n position: \"position\"\n };\n\n this.__featureParams = {\n componentSpacing: \"componentSpacing\",\n position: \"position\",\n rotation: \"rotation\",\n length: \"length\",\n width: \"width\",\n temperature: \"temperature\"\n };\n\n this.__targetParams = {\n componentSpacing: \"componentSpacing\",\n rotation: \"rotation\",\n length: \"length\",\n width: \"width\",\n temperature: \"temperature\"\n };\n\n this.__renderKeys = [\"FLOW\"];\n\n this.__mint = \"THERMO CYCLER\";\n\n this.__zOffsetKeys = {\n FLOW: \"height\"\n };\n\n this.__substrateOffset = {\n FLOW: \"0\"\n };\n }\n\n render2D(params: { [k: string]: any }, key: string) {\n const position = params.position;\n const rotation = params.rotation;\n const px = position[0];\n const py = position[1];\n const l = params.length;\n const w = params.width;\n const color = params.color;\n const startX = px - w / 2;\n const startY = py - l / 2;\n const endX = px + w / 2;\n const endY = py + l / 2;\n const startPoint = new paper.Point(startX, startY);\n const endPoint = new paper.Point(endX, endY);\n const rendered = new paper.CompoundPath(\"\");\n const cirrad = l / 4;\n const centerr = new paper.Point(px - w, py - l);\n\n const rec = new paper.Path.Rectangle({\n from: startPoint,\n to: endPoint,\n radius: 0,\n fillColor: color,\n strokeWidth: 0\n });\n rendered.addChild(rec);\n\n // let cir = new paper.Path.Circle({\n // center: centerr,\n // radius: cirrad,\n // fillColor: 'black'\n // })\n // rendered.addChild(cir);\n\n rendered.fillColor = color;\n // cir.fillColor = 'black';\n // rec.addChild(cir)\n rendered.rotate(rotation, new paper.Point(px, py)); \n return rendered;\n }\n\n render2DTarget(key: string | null, params: { [k: string]: any }) {\n if (key === null) {\n key = this.__renderKeys[0];\n }\n const render = this.render2D(params, key);\n render.fillColor!.alpha = 0.5;\n return render;\n }\n\n getPorts(params: { [k: string]: any }) {\n const l = params.length;\n const w = params.width;\n\n const ports = [];\n\n ports.push(new ComponentPort(-w / 2, -l / 6, \"1\", LogicalLayerType.CONTROL));\n ports.push(new ComponentPort(-w / 2, l / 6, \"2\", LogicalLayerType.CONTROL));\n\n return ports;\n }\n}\n","import Template from \"./template\";\nimport paper from \"paper\";\n\nexport default class Transition extends Template {\n constructor() {\n super();\n }\n\n __setupDefinitions(): void {\n this.__unique = {\n position: \"Point\"\n };\n\n this.__heritable = {\n cw1: \"Float\",\n cw2: \"Float\",\n length: \"Float\",\n rotation: \"Float\",\n height: \"Float\"\n };\n\n this.__defaults = {\n cw1: 0.8 * 1000,\n cw2: 0.9 * 1000,\n length: 1.0 * 1000,\n rotation: 0,\n height: 250\n };\n\n this.__units = {\n cw1: \"μm\",\n cw2: \"μm\",\n length: \"μm\",\n rotation: \"°\",\n height: \"μm\"\n };\n\n this.__minimum = {\n cw1: 3,\n cw2: 3,\n length: 10,\n height: 10,\n rotation: 0\n };\n\n this.__maximum = {\n rotation: 180,\n cw1: 2000,\n cw2: 2000,\n length: 1200,\n height: 1200\n };\n\n this.__featureParams = {\n position: \"position\",\n cw1: \"cw1\",\n cw2: \"cw2\",\n length: \"length\",\n rotation: \"rotation\"\n };\n\n this.__targetParams = {\n cw1: \"cw1\",\n cw2: \"cw2\",\n length: \"length\",\n rotation: \"rotation\"\n };\n\n this.__placementTool = \"PositionTool\";\n\n this.__toolParams = {\n position: \"position\"\n };\n\n this.__renderKeys = [\"FLOW\"];\n\n this.__mint = \"TRANSITION\";\n\n this.__zOffsetKeys = {\n FLOW: \"height\"\n };\n\n this.__substrateOffset = {\n FLOW: \"0\"\n };\n }\n\n render2D(params: { [k: string]: any }, key: string): paper.Path {\n const position = params.position;\n const cw1 = params.cw1;\n const cw2 = params.cw2;\n const length = params.length;\n const rotation = params.rotation;\n const color = params.color;\n const trap = new paper.Path();\n\n trap.add(new paper.Point(position[0] - cw1 / 2, position[1]));\n trap.add(new paper.Point(position[0] + cw1 / 2, position[1]));\n trap.add(new paper.Point(position[0] + cw2 / 2, position[1] + length));\n trap.add(new paper.Point(position[0] - cw2 / 2, position[1] + length));\n // trap.add(new paper.Point(position[0] - cw1/2, position[1]));\n\n trap.closed = true;\n trap.fillColor = color;\n return (trap.rotate(rotation, new paper.Point(position[0], position[1])) as unknown) as paper.Path;\n }\n\n render2DTarget(key: string | null, params: { [k: string]: any }): paper.Path {\n if (key === null) {\n key = this.__renderKeys[0];\n }\n const render = this.render2D(params, key);\n render.fillColor!.alpha = 0.5;\n return render;\n }\n}\n","import Template from \"./template\";\nimport paper from \"paper\";\nimport ComponentPort from \"../core/componentPort\";\nimport { LogicalLayerType } from \"../core/init\";\n\nexport default class Transposer extends Template {\n constructor() {\n super();\n }\n\n __setupDefinitions(): void {\n this.__unique = {\n position: \"Point\"\n };\n\n this.__heritable = {\n componentSpacing: \"Float\",\n rotation: \"Float\",\n valveRadius: \"Float\",\n height: \"Float\",\n valveGap: \"Float\",\n valveSpacing: \"Float\",\n flowChannelWidth: \"Float\",\n controlChannelWidth: \"Float\"\n };\n\n this.__defaults = {\n componentSpacing: 1000,\n rotation: 0,\n valveRadius: 1.2 * 1000,\n height: 250,\n valveGap: 0.6 * 1000,\n valveSpacing: 0.6 * 1000,\n flowChannelWidth: 500,\n controlChannelWidth: 500\n };\n\n this.__units = {\n componentSpacing: \"μm\",\n rotation: \"°\",\n valveRadius: \"μm\",\n height: \"μm\",\n valveGap: \"μm\",\n valveSpacing: \"μm\",\n flowChannelWidth: \"μm\",\n controlChannelWidth: \"μm\"\n };\n\n this.__minimum = {\n componentSpacing: 0,\n valveRadius: 0.1 * 100,\n height: 0.1 * 100,\n valveGap: 0.5 * 10,\n valveSpacing: 0.1 * 1000,\n flowChannelWidth: 0.1,\n controlChannelWidth: 0.1,\n rotation: 0\n };\n\n this.__maximum = {\n componentSpacing: 10000,\n valveRadius: 0.2 * 10000,\n height: 1.2 * 1000,\n valveGap: 0.1 * 10000,\n valveSpacing: 0.1 * 10000,\n flowChannelWidth: 0.1 * 10000,\n controlChannelWidth: 0.1 * 10000,\n rotation: 360\n };\n\n this.__featureParams = {\n componentSpacing: \"componentSpacing\",\n position: \"position\",\n rotation: \"rotation\",\n valveRadius: \"valveRadius\",\n valveGap: \"valveGap\",\n valveSpacing: \"valveSpacing\",\n flowChannelWidth: \"flowChannelWidth\",\n controlChannelWidth: \"controlChannelWidth\"\n };\n\n this.__targetParams = {\n componentSpacing: \"componentSpacing\",\n position: \"position\",\n rotation: \"rotation\",\n valveRadius: \"valveRadius\",\n valveGap: \"valveGap\",\n valveSpacing: \"valveSpacing\",\n flowChannelWidth: \"flowChannelWidth\",\n controlChannelWidth: \"controlChannelWidth\"\n };\n\n this.__placementTool = \"multilayerPositionTool\";\n\n this.__toolParams = {\n position: \"position\"\n };\n\n this.__renderKeys = [\"FLOW\", \"CONTROL\", \"INVERSE\"];\n\n this.__mint = \"TRANSPOSER\";\n\n this.__zOffsetKeys = {\n FLOW: \"height\",\n CONTROL: \"height\",\n INVERSE: \"height\"\n };\n\n this.__substrateOffset = {\n FLOW: \"0\",\n CONTROL: \"+1\",\n INVERSE: \"0\"\n };\n }\n\n getPorts(params: { [k: string]: any }) {\n const ports = [];\n\n const radius = params.valveRadius;\n const channelWidth = params.flowChannelWidth;\n const valvespacing = params.valveSpacing;\n\n ports.push(new ComponentPort(0, 0, \"1\", LogicalLayerType.FLOW));\n ports.push(new ComponentPort(6 * valvespacing + 4 * radius + 3 * channelWidth, 0, \"2\", LogicalLayerType.FLOW));\n ports.push(new ComponentPort(0, 2 * channelWidth + 4 * valvespacing + 2 * 2 * radius, \"3\", LogicalLayerType.FLOW));\n ports.push(new ComponentPort(6 * valvespacing + 4 * radius + 3 * channelWidth, 2 * channelWidth + 4 * valvespacing + 2 * 2 * radius, \"4\", LogicalLayerType.FLOW));\n\n ports.push(new ComponentPort(-2 * radius - channelWidth / 2, channelWidth + 2 * valvespacing + 2 * radius, \"5\", LogicalLayerType.CONTROL));\n ports.push(new ComponentPort(5 * valvespacing + 6 * radius + 3 * channelWidth, channelWidth + 2 * valvespacing + 2 * radius, \"6\", LogicalLayerType.CONTROL));\n\n return ports;\n }\n\n render2D(params: { [k: string]: any }, key = \"FLOW\") {\n if (key === \"FLOW\") {\n return this.__drawFlow(params);\n } else if (key === \"CONTROL\") {\n return this.__drawControl(params);\n }\n\n throw new Error(\"Unknown key: \" + key);\n\n }\n\n render2DTarget(key: string | null, params: { [k: string]: any }) {\n const ret = new paper.CompoundPath(\"\");\n const flow = this.render2D(params, \"FLOW\");\n const control = this.render2D(params, \"CONTROL\");\n ret.addChild(control as paper.CompoundPath);\n ret.addChild(flow as paper.CompoundPath);\n ret.fillColor = params.color;\n ret.fillColor!.alpha = 0.5;\n return ret;\n }\n\n __drawFlow(params: { [k: string]: any }) {\n const position = params.position;\n const valveGap = params.valveGap;\n const radius = params.valveRadius;\n const color = params.color;\n const rotation = params.rotation;\n const channelWidth = params.flowChannelWidth;\n const valvespacing = params.valveSpacing;\n const transposer_flow = new paper.CompoundPath(\"\");\n\n const px = position[0];\n const py = position[1];\n\n // Draw top left channel\n let topleftpoint = new paper.Point(px, py - channelWidth / 2);\n let bottomrightpoint = new paper.Point(px + 4 * valvespacing + 2 * radius + 2 * channelWidth, py + channelWidth / 2);\n let channel = new paper.Path.Rectangle(topleftpoint, bottomrightpoint);\n\n transposer_flow.addChild(channel);\n\n // Draw Valve\n this.__createTransposerValve(transposer_flow, bottomrightpoint.x + radius, topleftpoint.y + channelWidth / 2, valveGap, radius, \"H\", channelWidth);\n\n // Draw top right channel\n topleftpoint = new paper.Point(px + 4 * valvespacing + 4 * radius + 2 * channelWidth, py - channelWidth / 2);\n bottomrightpoint = new paper.Point(px + 6 * valvespacing + 4 * radius + 3 * channelWidth, py + channelWidth / 2);\n channel = new paper.Path.Rectangle(topleftpoint, bottomrightpoint);\n\n transposer_flow.addChild(channel);\n\n // Draw middle channels\n topleftpoint = new paper.Point(px + 3 * valvespacing + channelWidth + 2 * radius, py + channelWidth / 2);\n bottomrightpoint = new paper.Point(topleftpoint.x + channelWidth, topleftpoint.y + valvespacing);\n channel = new paper.Path.Rectangle(topleftpoint, bottomrightpoint);\n\n transposer_flow.addChild(channel);\n this.__createTransposerValve(transposer_flow, topleftpoint.x + channelWidth / 2, bottomrightpoint.y + radius, valveGap, radius, \"V\", channelWidth);\n\n // 2\n topleftpoint = new paper.Point(topleftpoint.x, bottomrightpoint.y + 2 * radius);\n bottomrightpoint = new paper.Point(topleftpoint.x + channelWidth, topleftpoint.y + 2 * valvespacing + channelWidth);\n channel = new paper.Path.Rectangle(topleftpoint, bottomrightpoint);\n\n transposer_flow.addChild(channel);\n\n this.__createTransposerValve(transposer_flow, topleftpoint.x + channelWidth / 2, bottomrightpoint.y + radius, valveGap, radius, \"V\", channelWidth);\n\n // 3\n topleftpoint = new paper.Point(topleftpoint.x, bottomrightpoint.y + 2 * radius);\n bottomrightpoint = new paper.Point(topleftpoint.x + channelWidth, topleftpoint.y + valvespacing);\n channel = new paper.Path.Rectangle(topleftpoint, bottomrightpoint);\n\n transposer_flow.addChild(channel);\n\n // Bottom Channels\n topleftpoint = new paper.Point(px, py + 1.5 * channelWidth + 4 * valvespacing + 2 * 2 * radius);\n bottomrightpoint = new paper.Point(topleftpoint.x + 2 * valvespacing + channelWidth, topleftpoint.y + channelWidth);\n channel = new paper.Path.Rectangle(topleftpoint, bottomrightpoint);\n\n transposer_flow.addChild(channel);\n\n this.__createTransposerValve(transposer_flow, bottomrightpoint.x + radius, topleftpoint.y + channelWidth / 2, valveGap, radius, \"H\", channelWidth);\n\n // 2\n topleftpoint = new paper.Point(bottomrightpoint.x + 2 * radius, topleftpoint.y);\n bottomrightpoint = new paper.Point(topleftpoint.x + 4 * valvespacing + 2 * channelWidth + 2 * radius, topleftpoint.y + channelWidth);\n channel = new paper.Path.Rectangle(topleftpoint, bottomrightpoint);\n\n transposer_flow.addChild(channel);\n\n // Draw the right channels\n topleftpoint = new paper.Point(px + 5 * valvespacing + 2 * channelWidth + 4 * radius, py + channelWidth / 2);\n bottomrightpoint = new paper.Point(topleftpoint.x + channelWidth, topleftpoint.y + valvespacing);\n channel = new paper.Path.Rectangle(topleftpoint, bottomrightpoint);\n\n transposer_flow.addChild(channel);\n\n this.__createTransposerValve(transposer_flow, topleftpoint.x + channelWidth / 2, bottomrightpoint.y + radius, valveGap, radius, \"V\", channelWidth);\n\n // 2\n topleftpoint = new paper.Point(topleftpoint.x, bottomrightpoint.y + 2 * radius);\n bottomrightpoint = new paper.Point(topleftpoint.x + channelWidth, topleftpoint.y + valvespacing + channelWidth);\n channel = new paper.Path.Rectangle(topleftpoint, bottomrightpoint);\n\n transposer_flow.addChild(channel);\n\n transposer_flow.fillColor = color;\n\n // Draw the left channels\n topleftpoint = new paper.Point(px + valvespacing, py + 1.5 * channelWidth + 2 * valvespacing + 2 * radius);\n bottomrightpoint = new paper.Point(topleftpoint.x + channelWidth, topleftpoint.y + valvespacing);\n channel = new paper.Path.Rectangle(topleftpoint, bottomrightpoint);\n\n transposer_flow.addChild(channel);\n\n this.__createTransposerValve(transposer_flow, topleftpoint.x + channelWidth / 2, bottomrightpoint.y + radius, valveGap, radius, \"V\", channelWidth);\n\n // 2\n topleftpoint = new paper.Point(topleftpoint.x, bottomrightpoint.y + 2 * radius);\n bottomrightpoint = new paper.Point(topleftpoint.x + channelWidth, topleftpoint.y + valvespacing + channelWidth);\n channel = new paper.Path.Rectangle(topleftpoint, bottomrightpoint);\n\n transposer_flow.addChild(channel);\n\n transposer_flow.fillColor = color;\n\n transposer_flow.rotate(rotation, new paper.Point(px + 3 * valvespacing + 1.5 * channelWidth + 2 * radius, py + channelWidth + 2 * valvespacing + 2 * radius));\n\n return transposer_flow;\n }\n\n __createTransposerValve(compound_path: paper.CompoundPath, xpos: number, ypos: number, valveGap: number, radius: number, orientation: string, channel_width: number): void {\n const center = new paper.Point(xpos, ypos);\n\n // Create the basic circle\n let circ: paper.Path.Circle | paper.PathItem = new paper.Path.Circle(center, radius);\n\n // Add the tiny channel pieces that jut out\n let rec = new paper.Path.Rectangle({\n point: new paper.Point(xpos - channel_width / 2, ypos - radius),\n size: [channel_width, radius],\n stokeWidth: 0\n });\n\n circ = circ.unite(rec);\n\n rec = new paper.Path.Rectangle({\n point: new paper.Point(xpos - channel_width / 2, ypos),\n size: [channel_width, radius],\n stokeWidth: 0\n });\n\n circ = circ.unite(rec);\n\n const cutout = new paper.Path.Rectangle({\n from: new paper.Point(xpos - radius, ypos - valveGap / 2),\n to: new paper.Point(xpos + radius, ypos + valveGap / 2)\n });\n\n // cutout.fillColor = \"white\";\n const valve = circ.subtract(cutout);\n\n // TODO Rotate\n if (orientation === \"H\") {\n valve.rotate(90, center);\n }\n\n compound_path.addChild(valve);\n }\n\n __drawControl(params: { [k: string]: any }) {\n const position = params.position;\n const valveGap = params.valveGap;\n const radius = params.valveRadius;\n const color = params.color;\n const rotation = params.rotation;\n const channelWidth = params.controlChannelWidth;\n const valvespacing = params.valveSpacing;\n const transposer_control = new paper.CompoundPath(\"\");\n\n const px = position[0];\n const py = position[1];\n\n // Top right valve\n let center = new paper.Point(px + 4 * valvespacing + 2 * channelWidth + 2 * radius + radius, py);\n let circle = new paper.Path.Circle(center, radius);\n transposer_control.addChild(circle);\n\n let topLeft = new paper.Point(px + 4 * valvespacing + 2 * channelWidth + 2 * radius + radius - channelWidth / 2, py - 2 * radius);\n let bottomRight = new paper.Point(px + 4 * valvespacing + 2 * channelWidth + 2 * radius + radius + channelWidth / 2, py);\n transposer_control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n topLeft = new paper.Point(px - 2 * radius, py - 2 * radius - channelWidth / 2);\n bottomRight = new paper.Point(px + 4 * valvespacing + 2 * channelWidth + 2 * radius + radius + channelWidth / 2, py - 2 * radius + channelWidth / 2);\n transposer_control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n // 2nd row valves\n\n center = new paper.Point(px + 1.5 * channelWidth + 3 * valvespacing + 2 * radius, py + channelWidth / 2 + valvespacing + radius);\n circle = new paper.Path.Circle(center, radius);\n transposer_control.addChild(circle);\n\n let crosschannelstart = center;\n\n center = new paper.Point(center.x + 2 * valvespacing + 2 * radius + channelWidth, py + channelWidth / 2 + valvespacing + radius);\n circle = new paper.Path.Circle(center, radius);\n transposer_control.addChild(circle);\n\n let crosschannelend = center;\n\n // Draw the cross channel connecting the 2nd row valves\n let rect = new paper.Path.Rectangle({\n from: new paper.Point(crosschannelstart.x, crosschannelstart.y - channelWidth / 2),\n to: new paper.Point(crosschannelend.x, crosschannelstart.y + channelWidth / 2)\n });\n\n transposer_control.addChild(rect);\n\n topLeft = new paper.Point(crosschannelend.x, crosschannelstart.y - channelWidth / 2);\n bottomRight = new paper.Point(crosschannelend.x + 2 * radius, crosschannelstart.y + channelWidth / 2);\n transposer_control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n topLeft = new paper.Point(crosschannelend.x + 2 * radius - channelWidth / 2, crosschannelstart.y - channelWidth / 2);\n bottomRight = new paper.Point(crosschannelend.x + 2 * radius + channelWidth / 2, py + 1.5 * channelWidth + 3 * valvespacing + 2 * radius + radius);\n transposer_control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n // 3rd Row valves\n\n center = new paper.Point(px + 0.5 * channelWidth + valvespacing, py + 1.5 * channelWidth + 3 * valvespacing + 2 * radius + radius);\n circle = new paper.Path.Circle(center, radius);\n transposer_control.addChild(circle);\n\n crosschannelstart = center;\n\n center = new paper.Point(center.x + 2 * valvespacing + 2 * radius + channelWidth, center.y);\n circle = new paper.Path.Circle(center, radius);\n transposer_control.addChild(circle);\n\n crosschannelend = center;\n\n // Draw the cross channel connecting the 3nd row valves\n rect = new paper.Path.Rectangle({\n from: new paper.Point(crosschannelstart.x, crosschannelstart.y - channelWidth / 2),\n to: new paper.Point(crosschannelend.x, crosschannelstart.y + channelWidth / 2)\n });\n\n transposer_control.addChild(rect);\n\n topLeft = new paper.Point(crosschannelend.x, crosschannelstart.y - channelWidth / 2);\n bottomRight = new paper.Point(center.x + 2 * valvespacing + 4 * radius + channelWidth + channelWidth / 2, crosschannelstart.y + channelWidth / 2);\n transposer_control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n // Bottom Row valve\n center = new paper.Point(px + channelWidth + 2 * valvespacing + radius, py + 4 * valvespacing + 4 * radius + 2 * channelWidth);\n circle = new paper.Path.Circle(center, radius);\n transposer_control.addChild(circle);\n\n topLeft = new paper.Point(px - 2 * radius - channelWidth / 2, py - 2 * radius - channelWidth / 2);\n bottomRight = new paper.Point(px - 2 * radius + channelWidth / 2, py + 4 * valvespacing + 6 * radius + 2 * channelWidth);\n transposer_control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n topLeft = new paper.Point(px - 2 * radius - channelWidth / 2, py + 4 * valvespacing + 6 * radius + 2 * channelWidth - channelWidth / 2);\n bottomRight = new paper.Point(px + channelWidth + 2 * valvespacing + radius, py + 4 * valvespacing + 6 * radius + 2 * channelWidth + channelWidth / 2);\n transposer_control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n topLeft = new paper.Point(px + channelWidth + 2 * valvespacing + radius - channelWidth / 2, py + 4 * valvespacing + 4 * radius + 2 * channelWidth);\n bottomRight = new paper.Point(px + channelWidth + 2 * valvespacing + radius + channelWidth / 2, py + 4 * valvespacing + 6 * radius + 2 * channelWidth + channelWidth / 2);\n transposer_control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n // Finally we draw the cross channel\n const topleftpoint = new paper.Point(px + valvespacing, py + channelWidth / 2 + 2 * radius + 2 * valvespacing);\n const bottomleftpoint = new paper.Point(topleftpoint.x + +4 * valvespacing + 3 * channelWidth + 4 * radius, topleftpoint.y + channelWidth);\n const rectangle = new paper.Path.Rectangle(topleftpoint, bottomleftpoint);\n transposer_control.addChild(rectangle);\n\n transposer_control.rotate(rotation, new paper.Point(px + 3 * valvespacing + 1.5 * channelWidth + 2 * radius, py + channelWidth + 2 * valvespacing + 2 * radius));\n\n transposer_control.fillColor = color;\n return transposer_control;\n }\n}\n","import { extend } from \"vue/types/umd\";\nimport Template from \"./template\";\nimport { ValveType } from \"../core/init\";\n\nexport default class ValveTemplate extends Template{\n protected _valveType: ValveType = ValveType.NORMALLY_OPEN;\n constructor(valveType: ValveType) {\n super();\n this._valveType = valveType;\n }\n\n get valveType(): ValveType {\n return this._valveType;\n }\n \n}","import Template from \"./template\";\nimport paper from \"paper\";\nimport ComponentPort from \"../core/componentPort\";\nimport { LogicalLayerType, ValveType } from \"../core/init\";\nimport ValveTemplate from \"./valveTemplate\";\n\nexport default class Valve extends ValveTemplate {\n constructor(valveType: ValveType) {\n super(valveType);\n }\n\n __setupDefinitions(): void {\n this.__unique = {\n position: \"Point\"\n };\n\n this.__heritable = {\n componentSpacing: \"Float\",\n rotation: \"Float\",\n length: \"Float\",\n width: \"Float\",\n height: \"Float\"\n };\n\n this.__defaults = {\n componentSpacing: 1000,\n rotation: 0,\n width: 1.23 * 1000,\n length: 4.92 * 1000,\n height: 250\n };\n\n this.__units = {\n componentSpacing: \"μm\",\n rotation: \"°\",\n length: \"μm\",\n width: \"μm\",\n height: \"μm\"\n };\n\n this.__minimum = {\n componentSpacing: 0,\n rotation: 0,\n width: 30,\n length: 120,\n height: 10\n };\n\n this.__maximum = {\n componentSpacing: 10000,\n rotation: 180,\n width: 6000,\n length: 24 * 1000,\n height: 1200\n };\n\n this.__featureParams = {\n componentSpacing: \"componentSpacing\",\n position: \"position\",\n length: \"length\",\n width: \"width\",\n rotation: \"rotation\"\n };\n\n this.__targetParams = {\n componentSpacing: \"componentSpacing\",\n length: \"length\",\n width: \"width\",\n rotation: \"rotation\"\n };\n\n this.__placementTool = \"valveInsertionTool\";\n\n this.__toolParams = {\n position: \"position\"\n };\n\n this.__renderKeys = [\"CONTROL\"];\n\n this.__mint = \"VALVE\";\n\n this.__zOffsetKeys = {\n CONTROL: \"height\"\n };\n\n this.__substrateOffset = {\n CONTROL: \"+1\"\n };\n }\n\n getPorts(params: { [k: string]: any }) {\n const l = params.length;\n const w = params.width;\n\n const ports = [];\n\n ports.push(new ComponentPort(0, 0, \"1\", LogicalLayerType.CONTROL));\n\n return ports;\n }\n\n render2D(params: { [k: string]: any }, key = \"CONTROL\") {\n const position = params.position;\n const px = position[0];\n const py = position[1];\n const l = params.length;\n const w = params.width;\n const color = params.color;\n const rotation = params.rotation;\n const startX = px - w / 2;\n const startY = py - l / 2;\n const endX = px + w / 2;\n const endY = py + l / 2;\n const startPoint = new paper.Point(startX, startY);\n const endPoint = new paper.Point(endX, endY);\n const rec = new paper.Path.Rectangle({\n from: startPoint,\n to: endPoint,\n radius: 0,\n fillColor: color,\n strokeWidth: 0\n });\n rec.rotate(rotation, new paper.Point(px, py));\n let compoundPath = new paper.CompoundPath(rec);\n compoundPath.fillColor = color;\n return (compoundPath);\n }\n\n render2DTarget(key: string | null, params: { [k: string]: any }) {\n const render = this.render2D(params, \"CONTROL\");\n render.fillColor = params.color;\n render.fillColor!.alpha = 0.5;\n return render;\n }\n}\n","import Template from \"./template\";\nimport paper from \"paper\";\nimport ComponentPort from \"../core/componentPort\";\nimport { LogicalLayerType, ValveType } from \"../core/init\";\nimport ValveTemplate from \"./valveTemplate\";\n\nexport default class Valve3D extends ValveTemplate {\n constructor(valveType: ValveType) {\n super(valveType);\n }\n\n __setupDefinitions(): void {\n this.__unique = {\n position: \"Point\"\n };\n\n this.__heritable = {\n componentSpacing: \"Float\",\n rotation: \"Float\",\n valveRadius: \"Float\",\n height: \"Float\",\n gap: \"Float\",\n width: \"Float\",\n length: \"Float\"\n };\n\n this.__defaults = {\n componentSpacing: 1000,\n rotation: 0,\n valveRadius: 1.2 * 1000,\n height: 250,\n gap: 0.6 * 1000,\n width: 2.4 * 1000,\n length: 2.4 * 1000\n };\n\n this.__units = {\n componentSpacing: \"μm\",\n valveRadius: \"μm\",\n height: \"μm\",\n gap: \"μm\",\n width: \"μm\",\n length: \"μm\",\n rotation: \"°\"\n };\n\n this.__minimum = {\n componentSpacing: 0,\n valveRadius: 0.1 * 100,\n height: 0.1 * 100,\n gap: 0.5 * 10,\n rotation: 0,\n width: 10,\n length: 10\n\n };\n\n this.__maximum = {\n componentSpacing: 10000,\n valveRadius: 0.3 * 10000,\n height: 1.2 * 1000,\n gap: 0.1 * 10000,\n rotation: 180,\n width: 3 * 1000,\n length: 3 * 1000\n };\n\n this.__featureParams = {\n componentSpacing: \"componentSpacing\",\n position: \"position\",\n rotation: \"rotation\",\n radius1: \"valveRadius\",\n radius2: \"valveRadius\",\n valveRadius: \"valveRadius\",\n gap: \"gap\"\n };\n\n this.__targetParams = {\n componentSpacing: \"componentSpacing\",\n position: \"position\",\n rotation: \"rotation\",\n radius1: \"valveRadius\",\n radius2: \"valveRadius\",\n valveRadius: \"valveRadius\",\n gap: \"gap\"\n };\n\n this.__placementTool = \"valveInsertionTool\";\n\n this.__toolParams = {\n position: \"position\"\n };\n\n this.__renderKeys = [\"FLOW\", \"CONTROL\", \"INVERSE\"];\n\n this.__mint = \"VALVE3D\";\n\n this.__zOffsetKeys = {\n FLOW: \"height\",\n CONTROL: \"height\",\n INVERSE: \"height\"\n };\n\n this.__substrateOffset = {\n FLOW: \"0\",\n CONTROL: \"+1\",\n INVERSE: \"0\"\n };\n\n this.__childFeatureMacros = [\n \"VALVE3D GAP\",\n \"VALVE3D FLOW\",\n ];\n }\n\n getPorts(params: { [k: string]: any }) {\n const ports = [];\n\n ports.push(new ComponentPort(0, 0, \"1\", LogicalLayerType.CONTROL));\n\n return ports;\n }\n\n __drawFlow(params: { [k: string]: any }) {\n const position = params.position;\n const gap = params.gap;\n const radius = params.valveRadius;\n const color = params.color;\n const rotation = params.rotation;\n\n const center = new paper.Point(position[0], position[1]);\n // let h0p0, h0p1, h0p2, h1p0, h1p1, h1p2;\n const circ = new paper.Path.Circle(center, radius);\n // circ.fillColor = color;\n // if (String(color) === \"3F51B5\") {\n const cutout = new paper.Path.Rectangle({\n from: new paper.Point(position[0] - radius, position[1] - gap / 2),\n to: new paper.Point(position[0] + radius, position[1] + gap / 2)\n });\n // cutout.fillColor = \"white\";\n const valve = circ.subtract(cutout);\n valve.rotate(rotation, center);\n valve.fillColor = color;\n return valve;\n }\n\n __drawControl(params: { [k: string]: any }) {\n const position = params.position;\n const gap = params.gap;\n const radius = params.valveRadius;\n const color = params.color;\n const rotation = params.rotation;\n const center = new paper.Point(position[0], position[1]);\n // let h0p0, h0p1, h0p2, h1p0, h1p1, h1p2;\n const circ = new paper.Path.Circle(center, radius);\n circ.fillColor = color;\n return circ;\n }\n\n render2D(params: { [k: string]: any }, key = \"FLOW\") {\n if (key === \"FLOW\") {\n return this.__drawFlow(params);\n } else if (key === \"CONTROL\") {\n return this.__drawControl(params);\n } else if (key === \"INVERSE\") {\n return this.__drawInverseFlow(params);\n } else {\n throw new Error(\"No render procedure defined for component:\" + this.__mint + \", key: \" + key);\n }\n }\n\n render2DTarget(key: string | null, params: { [k: string]: any }) {\n const render = this.render2D(params, \"FLOW\");\n render.fillColor!.alpha = 0.5;\n return render;\n }\n\n __drawInverseFlow(params: { [k: string]: any }): paper.PathItem {\n const position = params.position;\n const gap = params.gap;\n const radius = params.valveRadius;\n const color = params.color;\n console.log(\"Color:\", color);\n const rotation = params.rotation;\n const center = new paper.Point(position[0], position[1]);\n // let h0p0, h0p1, h0p2, h1p0, h1p1, h1p2;\n const circ = new paper.Path.Circle(center, radius);\n circ.fillColor = color;\n return (circ.rotate(rotation, center) as unknown) as paper.Path.Circle;\n }\n}\n","import Template from \"./template\";\nimport paper from \"paper\";\nimport ComponentPort from \"../core/componentPort\";\nimport { LogicalLayerType } from \"../core/init\";\n\nexport default class Tree extends Template {\n constructor() {\n super();\n }\n\n __setupDefinitions(): void {\n this.__unique = {\n position: \"Point\"\n };\n\n this.__heritable = {\n componentSpacing: \"Float\",\n flowChannelWidth: \"Float\",\n rotation: \"Float\",\n spacing: \"Float\",\n in: \"Integer\",\n out: \"Integer\",\n width: \"Float\",\n height: \"Float\",\n stageLength: \"Float\"\n };\n\n this.__defaults = {\n componentSpacing: 1000,\n flowChannelWidth: 0.8 * 1000,\n rotation: 0,\n spacing: 4 * 1000,\n in: 1,\n out: 8,\n width: 2.46 * 1000,\n height: 250,\n stageLength: 4000\n };\n\n this.__units = {\n componentSpacing: \"μm\",\n flowChannelWidth: \"μm\",\n rotation: \"°\",\n spacing: \"μm\",\n in: \"\",\n out: \"\",\n width: \"μm\",\n height: \"μm\",\n stageLength: \"μm\"\n };\n\n this.__minimum = {\n componentSpacing: 0,\n flowChannelWidth: 10,\n spacing: 30,\n in: 1,\n out: 2,\n width: 60,\n height: 10,\n stageLength: 100,\n rotation: 0\n };\n\n this.__maximum = {\n componentSpacing: 10000,\n flowChannelWidth: 2000,\n spacing: 12000,\n in: 1,\n out: 128,\n width: 12 * 1000,\n height: 1200,\n stageLength: 6000,\n rotation: 360\n };\n\n this.__featureParams = {\n componentSpacing: \"componentSpacing\",\n position: \"position\",\n flowChannelWidth: \"flowChannelWidth\",\n rotation: \"rotation\",\n spacing: \"spacing\",\n width: \"width\",\n in: \"in\",\n out: \"out\",\n stageLength: \"stageLength\"\n };\n\n this.__targetParams = {\n componentSpacing: \"componentSpacing\",\n flowChannelWidth: \"flowChannelWidth\",\n rotation: \"rotation\",\n spacing: \"spacing\",\n width: \"width\",\n in: \"in\",\n out: \"out\",\n stageLength: \"stageLength\"\n };\n\n this.__placementTool = \"componentPositionTool\";\n\n this.__toolParams = {\n position: \"position\"\n };\n\n this.__renderKeys = [\"FLOW\"];\n\n this.__mint = \"TREE\";\n\n this.__zOffsetKeys = {\n FLOW: \"height\"\n };\n\n this.__substrateOffset = {\n FLOW: \"0\"\n };\n }\n\n getPorts(params: { [k: string]: any }) {\n const ports = [];\n const cw = params.flowChannelWidth;\n const spacing = params.spacing;\n const ins = params.in;\n const outs = params.out;\n let leafs;\n if (ins < outs) {\n leafs = outs;\n } else {\n leafs = ins;\n }\n const stagelength = params.stageLength;\n\n const levels = Math.ceil(Math.log2(leafs));\n const w = spacing * (leafs / 2 + 1);\n\n const length = levels * (cw + stagelength) + stagelength;\n const width = 2 * 0.5 * w * 2 * Math.pow(0.5, levels);\n\n ports.push(new ComponentPort(0, 0, \"1\", LogicalLayerType.FLOW));\n\n for (let i = 0; i < leafs; i++) {\n ports.push(new ComponentPort(((leafs - 1) * width) / 2 - i * width, length, (2 + i).toString(), LogicalLayerType.FLOW));\n }\n\n return ports;\n }\n\n render2D(params: { [k: string]: any }, key: string): paper.CompoundPath {\n const position = params.position;\n const cw = params.flowChannelWidth;\n const rotation = params.rotation;\n const spacing = params.spacing;\n const ins = params.in;\n const outs = params.out;\n let leafs;\n if (ins < outs) {\n leafs = outs;\n } else {\n leafs = ins;\n }\n const color = params.color;\n const stagelength = params.stageLength;\n const px = position[0];\n const py = position[1];\n\n const levels = Math.ceil(Math.log2(leafs));\n let isodd = false; // This is used to figure out how many lines have to be made\n if (leafs % 2 === 0) {\n isodd = false;\n } else {\n isodd = true;\n }\n const w = spacing * (leafs / 2 + 1);\n const l = (levels + 1) * stagelength;\n\n // console.log(\"CW: \" + cw + \" levels: \"+ levels + \" width: \" + w + \" length: \" + l)\n\n const treepath = new paper.CompoundPath(\"\");\n\n this.__generateTwig(treepath, px, py, cw, stagelength, w, 1, levels);\n\n // Draw the tree\n\n treepath.fillColor = color;\n return (treepath.rotate(rotation, new paper.Point(px, py)) as unknown) as paper.CompoundPath;\n }\n\n __generateTwig(treepath: paper.CompoundPath, px: number, py: number, cw: number, stagelength: number, newspacing: number, level: number, maxlevel: number, islast = false): void {\n // var newspacing = 2 * (spacing + cw);\n const hspacing = newspacing / 2;\n const lex = px - 0.5 * newspacing;\n const ley = py + cw + stagelength;\n const rex = px + 0.5 * newspacing;\n const rey = py + cw + stagelength;\n\n if (level === maxlevel) {\n islast = true;\n // console.log(\"Final Spacing: \" + newspacing)\n }\n\n this.__drawtwig(treepath, px, py, cw, stagelength, newspacing, islast);\n // drawtwig(treepath, lex, ley, cw, stagelength, hspacing, islast);\n // drawtwig(treepath, rex, rey, cw, stagelength, hspacing, islast);\n\n if (!islast) {\n this.__generateTwig(treepath, lex, ley, cw, stagelength, hspacing, level + 1, maxlevel);\n this.__generateTwig(treepath, rex, rey, cw, stagelength, hspacing, level + 1, maxlevel);\n }\n }\n\n __drawtwig(treepath: paper.CompoundPath, px: number, py: number, cw: number, stagelength: number, spacing: number, drawleafs = false): paper.CompoundPath {\n // stem\n let startPoint = new paper.Point(px - cw / 2, py);\n let endPoint = new paper.Point(px + cw / 2, py + stagelength);\n let rec = new paper.Path.Rectangle({\n from: startPoint,\n to: endPoint,\n radius: 0,\n strokeWidth: 0\n });\n\n treepath.addChild(rec);\n\n // Draw 2 leafs\n // left leaf\n const lstartx = px - 0.5 * (cw + spacing);\n const lendx = lstartx + cw;\n const lstarty = py + stagelength + cw;\n const lendy = lstarty + stagelength;\n\n // //right leaf\n const rstartx = px + 0.5 * (spacing - cw);\n const rendx = rstartx + cw;\n const rstarty = py + stagelength + cw;\n const rendy = rstarty + stagelength;\n\n if (drawleafs) {\n startPoint = new paper.Point(lstartx, lstarty);\n endPoint = new paper.Point(lendx, lendy);\n rec = new paper.Path.Rectangle({\n from: startPoint,\n to: endPoint,\n radius: 0,\n strokeWidth: 0\n });\n treepath.addChild(rec);\n\n startPoint = new paper.Point(rstartx, rstarty);\n endPoint = new paper.Point(rendx, rendy);\n rec = new paper.Path.Rectangle({\n from: startPoint,\n to: endPoint,\n radius: 0,\n strokeWidth: 0\n });\n treepath.addChild(rec);\n }\n\n // Horizontal bar\n const hstartx = px - 0.5 * (cw + spacing);\n const hendx = rendx;\n const hstarty = py + stagelength;\n const hendy = hstarty + cw;\n startPoint = new paper.Point(hstartx, hstarty);\n endPoint = new paper.Point(hendx, hendy);\n rec = new paper.Path.Rectangle({\n from: startPoint,\n to: endPoint,\n radius: 0,\n strokeWidth: 0\n });\n treepath.addChild(rec);\n return treepath;\n }\n\n render2DTarget(key: string | null, params: { [k: string]: any }): paper.CompoundPath {\n if (key === null) {\n key = this.__renderKeys[0];\n }\n const render = this.render2D(params, key);\n render.fillColor!.alpha = 0.5;\n return render;\n }\n}\n","import Template from \"./template\";\nimport paper from \"paper\";\nimport ComponentPort from \"../core/componentPort\";\nimport { LogicalLayerType } from \"../core/init\";\nimport { CompoundPath } from \"paper/dist/paper-core\";\n\nexport default class YTree extends Template {\n constructor() {\n super();\n }\n\n __setupDefinitions(): void {\n this.__unique = {\n position: \"Point\"\n };\n\n this.__heritable = {\n componentSpacing: \"Float\",\n flowChannelWidth: \"Float\",\n rotation: \"Float\",\n spacing: \"Float\",\n in: \"Integer\",\n out: \"Integer\",\n width: \"Float\",\n height: \"Float\",\n stageLength: \"Float\"\n };\n\n this.__defaults = {\n componentSpacing: 1000,\n flowChannelWidth: 0.8 * 1000,\n rotation: 0,\n spacing: 4 * 1000,\n in: 1,\n out: 8,\n width: 2.46 * 1000,\n height: 250,\n stageLength: 4000\n };\n\n this.__units = {\n componentSpacing: \"μm\",\n flowChannelWidth: \"μm\",\n rotation: \"°\",\n spacing: \"μm\",\n in: \"\",\n out: \"\",\n width: \"μm\",\n height: \"μm\",\n stageLength: \"μm\"\n };\n\n this.__minimum = {\n componentSpacing: 0,\n flowChannelWidth: 10,\n spacing: 30,\n in: 1,\n out: 2,\n width: 60,\n height: 10,\n stageLength: 100,\n rotation: 0\n };\n\n this.__maximum = {\n componentSpacing: 10000,\n flowChannelWidth: 2000,\n spacing: 12000,\n in: 1,\n out: 128,\n width: 12 * 1000,\n height: 1200,\n stageLength: 6000,\n rotation: 360\n };\n\n this.__featureParams = {\n componentSpacing: \"componentSpacing\",\n position: \"position\",\n flowChannelWidth: \"flowChannelWidth\",\n rotation: \"rotation\",\n spacing: \"spacing\",\n width: \"width\",\n in: \"in\",\n out: \"out\",\n stageLength: \"stageLength\"\n };\n\n this.__targetParams = {\n componentSpacing: \"componentSpacing\",\n flowChannelWidth: \"flowChannelWidth\",\n rotation: \"rotation\",\n spacing: \"spacing\",\n in: \"in\",\n out: \"out\",\n stageLength: \"stageLength\"\n };\n\n this.__placementTool = \"componentPositionTool\";\n\n this.__toolParams = {\n position: \"position\"\n };\n\n this.__renderKeys = [\"FLOW\"];\n\n this.__mint = \"YTREE\";\n\n this.__zOffsetKeys = {\n FLOW: \"height\"\n };\n\n this.__substrateOffset = {\n FLOW: \"0\"\n };\n }\n\n getPorts(params: { [k: string]: any }) {\n const ports = [];\n const cw = params.flowChannelWidth;\n const spacing = params.spacing;\n const ins = params.in;\n const outs = params.out;\n let rotation = params.rotation;\n let leafs;\n if (ins < outs) {\n leafs = outs;\n } else {\n leafs = ins;\n rotation += 180;\n }\n const stagelength = params.stageLength;\n\n const levels = Math.ceil(Math.log2(leafs));\n const w = spacing * (leafs / 2 + 1);\n\n const length = levels * stagelength;\n const width = 2 * 0.5 * w * 2 * Math.pow(0.5, levels);\n\n ports.push(new ComponentPort(0, -cw / 2, \"1\", LogicalLayerType.FLOW));\n\n for (let i = 0; i < leafs; i++) {\n ports.push(new ComponentPort(((leafs - 1) * width) / 2 - i * width, length + cw / 2, (2 + i).toString(), LogicalLayerType.FLOW));\n }\n\n return ports;\n }\n\n render2D(params: { [k: string]: any }, key: string) {\n const position = params.position;\n const cw = params.flowChannelWidth;\n let rotation = params.rotation;\n const spacing = params.spacing;\n const ins = params.in;\n const outs = params.out;\n let leafs;\n if (ins < outs) {\n leafs = outs;\n } else {\n leafs = ins;\n rotation += 180;\n }\n const color = params.color;\n const stagelength = params.stageLength;\n const px = position[0];\n const py = position[1];\n\n const levels = Math.ceil(Math.log2(leafs));\n let isodd = false; // This is used to figure out how many lines have to be made\n if (leafs % 2 === 0) {\n isodd = false;\n } else {\n isodd = true;\n }\n const w = spacing * (leafs / 2 + 1);\n const l = (levels + 1) * stagelength;\n\n const treepath = new paper.CompoundPath(\"\");\n\n this.__generateYTwig(treepath, px, py, cw, stagelength, w, 1, levels);\n\n // Draw the tree\n\n treepath.fillColor = color;\n treepath.rotate(rotation, new paper.Point(px, py));\n \n return treepath;\n }\n\n render2DTarget(key: string | null, params: { [k: string]: any }) {\n if (key === null) {\n key = this.__renderKeys[0];\n }\n const render = this.render2D(params, key);\n render.fillColor!.alpha = 0.5;\n return render;\n }\n\n __generateYTwig(treepath: paper.CompoundPath, px: number, py: number, cw: number, stagelength: number, newspacing: number, level: number, maxlevel: number, islast = false): void {\n const hspacing = newspacing / 2;\n const lex = px - 0.5 * newspacing;\n const ley = py + stagelength;\n const rex = px + 0.5 * newspacing;\n const rey = py + stagelength;\n\n if (level === maxlevel) {\n islast = true;\n }\n\n this.__drawYtwig(treepath, px, py, cw, stagelength, newspacing, islast);\n\n if (!islast) {\n this.__generateYTwig(treepath, lex, ley, cw, stagelength, hspacing, level + 1, maxlevel);\n this.__generateYTwig(treepath, rex, rey, cw, stagelength, hspacing, level + 1, maxlevel);\n }\n }\n\n __drawYtwig(treepath: paper.CompoundPath, px: number, py: number, cw: number, stagelength: number, spacing: number, drawleafs = false): paper.CompoundPath {\n const pivotpoint = new paper.Point(px, py);\n\n // stem\n const startPoint = new paper.Point(px - cw / 2, py - cw / 2);\n\n const angle = Math.atan(spacing / 2 / stagelength);\n\n const h = spacing / 2 / Math.sin(angle) + cw;\n\n // left leaf\n let rec = new paper.Path.Rectangle({\n size: [cw, h],\n point: startPoint,\n radius: cw / 2,\n stokeWidth: 0\n });\n rec.rotate((angle * 180) / Math.PI, pivotpoint);\n treepath.addChild(rec);\n\n // right leaf\n rec = new paper.Path.Rectangle({\n size: [cw, h],\n point: startPoint,\n radius: cw / 2,\n stokeWidth: 0\n });\n rec.rotate((-angle * 180) / Math.PI, pivotpoint);\n treepath.addChild(rec);\n\n return treepath;\n }\n}\n","import Template from \"./template\";\nimport paper from \"paper\";\nimport ComponentPort from \"../core/componentPort\";\nimport { LogicalLayerType } from \"../core/init\";\n\nexport default class LLChamber extends Template {\n constructor() {\n super();\n }\n\n __setupDefinitions(): void {\n this.__unique = {\n position: \"Point\"\n };\n\n this.__heritable = {\n componentSpacing: \"Float\",\n width: \"Float\",\n length: \"Float\",\n height: \"Float\",\n rotation: \"Float\",\n spacing: \"Float\",\n numberOfChambers: \"Integer\"\n };\n\n this.__defaults = {\n componentSpacing: 1000,\n width: 400,\n length: 5000,\n height: 250,\n spacing: 2000,\n numberOfChambers: 4,\n rotation: 0\n };\n\n this.__units = {\n componentSpacing: \"μm\",\n width: \"μm\",\n length: \"μm\",\n height: \"μm\",\n spacing: \"μm\",\n numberOfChambers: \"10\",\n rotation: \"°\"\n };\n\n this.__minimum = {\n componentSpacing: 0,\n width: 5,\n length: 5,\n height: 1,\n spacing: 1,\n numberOfChambers: 1,\n rotation: 0\n };\n\n this.__maximum = {\n componentSpacing: 10000,\n width: 50000,\n length: 50000,\n height: 50000,\n numberOfChambers: 1000,\n spacing: 50000,\n rotation: 360\n };\n\n this.__featureParams = {\n componentSpacing: \"componentSpacing\",\n position: \"position\",\n width: \"width\",\n length: \"length\",\n height: \"height\",\n numberOfChambers: \"numberOfChambers\",\n spacing: \"spacing\",\n rotation: \"rotation\"\n };\n\n this.__targetParams = {\n componentSpacing: \"componentSpacing\",\n position: \"position\",\n width: \"width\",\n length: \"length\",\n height: \"height\",\n numberOfChambers: \"numberOfChambers\",\n spacing: \"spacing\",\n rotation: \"rotation\"\n };\n\n this.__placementTool = \"multilayerPositionTool\";\n\n this.__toolParams = {\n position: \"position\"\n };\n\n this.__mint = \"LL CHAMBER\";\n\n this.__zOffsetKeys = {\n FLOW: \"height\",\n CONTROL: \"height\"\n };\n\n this.__substrateOffset = {\n FLOW: \"0\",\n CONTROL: \"+1\"\n };\n }\n\n getPorts(params: { [k: string]: any }) {\n const position = params.position;\n const px = position[0];\n const py = position[1];\n const l = params.length;\n const w = params.width;\n const rotation = params.rotation;\n const color = params.color;\n // let radius = params[\"cornerRadius\"];\n\n const numArray = params.numberOfChambers;\n const spacing = params.spacing;\n\n const ports = [];\n\n ports.push(new ComponentPort(w / 2, -w, \"1\", LogicalLayerType.FLOW));\n\n ports.push(new ComponentPort(numArray * w + (numArray + 1) * spacing - w / 2, -w, \"2\", LogicalLayerType.FLOW));\n\n ports.push(new ComponentPort(w / 2, l + w, \"3\", LogicalLayerType.FLOW));\n\n ports.push(new ComponentPort(numArray * w + (numArray + 1) * spacing - w / 2, l + w, \"4\", LogicalLayerType.FLOW));\n\n // //Control Ports - Left\n ports.push(new ComponentPort(0, 0.2 * l, \"10\", LogicalLayerType.CONTROL));\n\n ports.push(new ComponentPort(0, 0.5 * l, \"9\", LogicalLayerType.CONTROL));\n\n ports.push(new ComponentPort(0, 0.8 * l, \"8\", LogicalLayerType.CONTROL));\n\n // Control Ports - Right\n ports.push(new ComponentPort(numArray * w + (numArray + 1) * spacing, 0.2 * l, \"5\", LogicalLayerType.CONTROL));\n\n ports.push(new ComponentPort(numArray * w + (numArray + 1) * spacing, 0.5 * l, \"6\", LogicalLayerType.CONTROL));\n\n ports.push(new ComponentPort(numArray * w + (numArray + 1) * spacing, 0.8 * l, \"7\", LogicalLayerType.CONTROL));\n\n return ports;\n }\n\n __renderFlow(params: { [k: string]: any }) {\n const position = params.position;\n const px = position[0];\n const py = position[1];\n const l = params.length;\n const w = params.width;\n const rotation = params.rotation;\n const color = params.color;\n // let radius = params[\"cornerRadius\"];\n\n const numArray = params.numberOfChambers;\n const spacing = params.spacing;\n\n const rendered = new paper.CompoundPath(\"\");\n\n let rec;\n\n for (let i = 0; i < numArray; i++) {\n rec = new paper.Path.Rectangle({\n point: new paper.Point(px + (i + 1) * spacing + i * w, py - 1),\n size: [w, l + 2],\n radius: 0\n });\n\n rendered.addChild(rec);\n }\n\n const topchannel = new paper.Path.Rectangle({\n point: new paper.Point(px, py - w),\n size: [numArray * w + (numArray + 1) * spacing, w]\n });\n\n rendered.addChild(topchannel);\n\n const bottomchannel = new paper.Path.Rectangle({\n point: new paper.Point(px, py + l),\n size: [numArray * w + (numArray + 1) * spacing, w]\n });\n\n rendered.addChild(bottomchannel);\n\n rendered.fillColor = color;\n rendered.rotate(rotation, new paper.Point(px, py)); \n return rendered;\n }\n\n __renderControl(params: { [k: string]: any }) {\n const rendered = new paper.CompoundPath(\"\");\n const position = params.position;\n const px = position[0];\n const py = position[1];\n const l = params.length;\n const w = params.width;\n const rotation = params.rotation;\n const color = params.color;\n // let radius = params[\"cornerRadius\"];\n\n const numArray = params.numberOfChambers;\n const spacing = params.spacing;\n\n const topchannel = new paper.Path.Rectangle({\n point: new paper.Point(px, py + 0.2 * l - w / 2),\n size: [numArray * w + (numArray + 1) * spacing, w]\n });\n\n rendered.addChild(topchannel);\n\n const middlechannel = new paper.Path.Rectangle({\n point: new paper.Point(px, py + 0.5 * l - w / 2),\n size: [numArray * w + (numArray + 1) * spacing, w]\n });\n\n rendered.addChild(middlechannel);\n\n const bottomchannel = new paper.Path.Rectangle({\n point: new paper.Point(px, py + 0.8 * l - w / 2),\n size: [numArray * w + (numArray + 1) * spacing, w]\n });\n\n rendered.addChild(bottomchannel);\n\n rendered.fillColor = color;\n rendered.rotate(rotation, new paper.Point(px, py));\n return rendered;\n }\n\n render2D(params: { [k: string]: any }, key = \"FLOW\") {\n if (key === \"FLOW\") {\n return this.__renderFlow(params);\n } else if (key === \"CONTROL\") {\n return this.__renderControl(params);\n }\n throw new Error(\"Unknown render key found in LLCHAMBER: \" + key);\n }\n\n render2DTarget(key: string | null, params: { [k: string]: any }) {\n const ret = new paper.CompoundPath(\"\");\n const flow = this.render2D(params, \"FLOW\");\n const control = this.render2D(params, \"CONTROL\");\n ret.addChild(control);\n ret.addChild(flow);\n ret.fillColor = params.color;\n ret.fillColor!.alpha = 0.5;\n return ret;\n }\n}\n","import Template from \"./template\";\nimport paper from \"paper\";\nimport ComponentPort from \"../core/componentPort\";\nimport { LogicalLayerType } from \"../core/init\";\n\nexport default class ThreeDMixer extends Template {\n constructor() {\n super();\n }\n\n __setupDefinitions(): void {\n this.__unique = {\n position: \"Point\"\n };\n\n this.__heritable = {\n componentSpacing: \"Float\",\n bendSpacing: \"Float\",\n numberOfBends: \"Float\",\n channelWidth: \"Float\",\n bendLength: \"Float\",\n rotation: \"Float\",\n height: \"Float\"\n };\n\n this.__defaults = {\n componentSpacing: 1000,\n channelWidth: 0.8 * 1000,\n bendSpacing: 1.23 * 1000,\n numberOfBends: 1,\n rotation: 0,\n bendLength: 2.46 * 1000,\n height: 250\n };\n\n this.__units = {\n componentSpacing: \"μm\",\n bendSpacing: \"μm\",\n numberOfBends: \"\",\n channelWidth: \"μm\",\n bendLength: \"μm\",\n rotation: \"°\",\n height: \"μm\"\n };\n\n this.__minimum = {\n componentSpacing: 0,\n channelWidth: 10,\n bendSpacing: 10,\n numberOfBends: 1,\n rotation: 0,\n bendLength: 10,\n height: 10\n };\n\n this.__maximum = {\n componentSpacing: 10000,\n channelWidth: 2000,\n bendSpacing: 6000,\n numberOfBends: 20,\n rotation: 360,\n bendLength: 12 * 1000,\n height: 1200\n };\n\n this.__placementTool = \"multilayerPositionTool\";\n\n this.__toolParams = {\n cursorPosition: \"position\"\n };\n\n this.__featureParams = {\n componentSpacing: \"componentSpacing\",\n position: \"position\",\n channelWidth: \"channelWidth\",\n bendSpacing: \"bendSpacing\",\n numberOfBends: \"numberOfBends\",\n rotation: \"rotation\",\n bendLength: \"bendLength\"\n };\n\n this.__targetParams = {\n componentSpacing: \"componentSpacing\",\n channelWidth: \"channelWidth\",\n bendSpacing: \"bendSpacing\",\n numberOfBends: \"numberOfBends\",\n rotation: \"rotation\",\n bendLength: \"bendLength\"\n };\n\n this.__renderKeys = [\"FLOW\", \"CONTROL\"];\n\n this.__mint = \"MIXER3D\";\n\n this.__zOffsetKeys = {\n FLOW: \"height\",\n CONTROL: \"height\"\n };\n\n this.__substrateOffset = {\n FLOW: \"0\",\n CONTROL: \"+1\"\n };\n }\n\n getPorts(params: { [k: string]: any }) {\n const channelWidth = params.channelWidth;\n const bendLength = params.bendLength;\n const bendSpacing = params.bendSpacing;\n const rotation = params.rotation;\n const numberOfBends = params.numberOfBends;\n\n const ports = [];\n\n ports.push(new ComponentPort(bendLength / 2 + channelWidth, 0, \"1\", LogicalLayerType.FLOW));\n\n ports.push(new ComponentPort(bendLength / 2 + channelWidth, (2 * numberOfBends + 1) * channelWidth + 2 * numberOfBends * bendSpacing, \"2\", LogicalLayerType.FLOW));\n\n return ports;\n }\n\n render2D(params: { [k: string]: any }, key: string) {\n const channelWidth = params.channelWidth;\n const bendLength = params.bendLength;\n const bendSpacing = params.bendSpacing;\n const rotation = params.rotation;\n const numBends = params.numberOfBends;\n const x = params.position[0];\n const y = params.position[1];\n const color = params.color;\n const segHalf = bendLength / 2 + channelWidth;\n const segLength = bendLength + 2 * channelWidth;\n const segBend = bendSpacing + 2 * channelWidth;\n const vRepeat = 2 * bendSpacing + 2 * channelWidth;\n const vOffset = bendSpacing + channelWidth;\n const hOffset = bendLength / 2 + channelWidth / 2;\n const serp = new paper.CompoundPath(\"\");\n\n if (key === \"FLOW\") {\n // draw first segment\n serp.addChild(new paper.Path.Rectangle(new paper.Rectangle(x, y, segHalf + channelWidth / 2, channelWidth)));\n for (let i = 0; i < numBends; i++) {\n serp.addChild(new paper.Path.Rectangle(new paper.Rectangle(x, y + vRepeat * i, channelWidth, segBend)));\n // serp.addChild(new paper.Path.Rectangle(x, y + vOffset + vRepeat * i, segLength, channelWidth));\n serp.addChild(new paper.Path.Rectangle(new paper.Rectangle(x + channelWidth + bendLength, y + vOffset + vRepeat * i, channelWidth, segBend)));\n if (i === numBends - 1) {\n // draw half segment to close\n serp.addChild(new paper.Path.Rectangle(new paper.Rectangle(x + hOffset, y + vRepeat * (i + 1), segHalf, channelWidth)));\n } else {\n // draw full segment\n serp.addChild(new paper.Path.Rectangle(new paper.Rectangle(x, y + vRepeat * (i + 1), segLength, channelWidth)));\n }\n }\n } else {\n // draw first segment\n // serp.addChild(new paper.Path.Rectangle(x, y, segHalf + channelWidth / 2, channelWidth));\n for (let i = 0; i < numBends; i++) {\n // serp.addChild(new paper.Path.Rectangle(x, y + vRepeat * i, channelWidth, segBend));\n serp.addChild(new paper.Path.Rectangle(new paper.Rectangle(x, y + vOffset + vRepeat * i, segLength, channelWidth)));\n // serp.addChild(new paper.Path.Rectangle(x + channelWidth + bendLength, y + vOffset + vRepeat * i, channelWidth, segBend));\n // if (i === numBends - 1) {//draw half segment to close\n // serp.addChild(new paper.Path.Rectangle(x + hOffset, y + vRepeat * (i + 1), segHalf, channelWidth));\n // } else {//draw full segment\n // serp.addChild(new paper.Path.Rectangle(x, y + vRepeat * (i + 1), segLength, channelWidth));\n // }\n }\n }\n\n serp.fillColor = color;\n serp.rotate(rotation, new paper.Point(x, y));\n return serp;\n }\n\n render2DTarget(key: string | null, params: { [k: string]: any }) {\n if (key === null) {\n key = this.__renderKeys[0];\n }\n const serp = this.render2D(params, key);\n serp.fillColor = params.color;\n serp.fillColor!.alpha = 0.5;\n return serp;\n }\n}\n","import Template from \"./template\";\nimport paper from \"paper\";\nimport ComponentPort from \"../core/componentPort\";\nimport { LogicalLayerType } from \"../core/init\";\n\nexport default class Via extends Template {\n constructor() {\n super();\n }\n\n __setupDefinitions(): void {\n this.__unique = {\n position: \"Point\"\n };\n\n this.__heritable = {\n componentSpacing: \"Float\",\n radius: \"Float\",\n height: \"Float\"\n };\n\n this.__defaults = {\n componentSpacing: 1000,\n radius: 0.7 * 1000,\n height: 0\n };\n\n this.__units = {\n componentSpacing: \"μm\",\n radius: \"μm\",\n height: \"μm\"\n };\n\n this.__minimum = {\n componentSpacing: 0,\n radius: 0.8 * 10,\n height: 0\n };\n\n this.__maximum = {\n componentSpacing: 10000,\n radius: 2000,\n height: 0\n };\n\n this.__placementTool = \"componentPositionTool\";\n\n this.__toolParams = {\n position: \"position\"\n };\n\n this.__featureParams = {\n componentSpacing: \"componentSpacing\",\n position: \"position\",\n radius: \"radius\"\n };\n\n this.__targetParams = {\n componentSpacing: \"componentSpacing\",\n radius: \"radius\"\n };\n\n this.__renderKeys = [\"FLOW\"];\n\n this.__mint = \"VIA\";\n\n this.__zOffsetKeys = {\n FLOW: \"height\"\n };\n\n this.__substrateOffset = {\n FLOW: \"0\"\n };\n }\n\n getPorts(params: { [k: string]: any }) {\n const radius = params.radius;\n\n const ports = [];\n\n ports.push(new ComponentPort(0, 0, \"1\", LogicalLayerType.FLOW));\n\n return ports;\n }\n\n render2D(params: { [k: string]: any }, key: string) {\n // Regardless of the key...\n const position = params.position;\n const radius = params.radius;\n const color1 = params.color;\n const pos = new paper.Point(position[0], position[1]);\n const outerCircle = new paper.Path.Circle(pos, radius);\n outerCircle.fillColor = color1;\n return outerCircle;\n }\n\n render2DTarget(key: string | null, params: { [k: string]: any }) {\n if (key === null) {\n key = this.__renderKeys[0];\n }\n const render = this.render2D(params, key);\n render.fillColor!.alpha = 0.5;\n return render;\n }\n}\n","import Template from \"./template\";\nimport paper, { Path } from \"paper\";\nimport ComponentPort from \"../core/componentPort\";\nimport { LogicalLayerType } from \"../core/init\";\n\nexport default class Filter extends Template {\n constructor() {\n super();\n }\n\n __setupDefinitions(): void {\n this.__unique = {\n position: \"Point\"\n };\n\n this.__heritable = {\n componentSpacing: \"Float\",\n rotation: \"Float\",\n height: \"Float\",\n pillarDiameter: \"Float\",\n filterWidth: \"Float\",\n barrierWidth: \"Float\",\n filterLength: \"Float\",\n filterNumber: \"Float\",\n levelNumber: \"Float\",\n inletWidth: \"Float\",\n inletLength: \"Float\",\n outletWidth: \"Float\",\n outletLength: \"Float\"\n };\n\n this.__defaults = {\n componentSpacing: 1000,\n rotation: 0,\n height: 250,\n pillarDiameter: 2 * 1000,\n filterWidth: 1 * 1000,\n barrierWidth: 1 * 1000,\n filterLength: 3 * 1000,\n filterNumber: 5,\n levelNumber: 2,\n inletWidth: 1 * 1000,\n inletLength: 3 * 1000,\n outletWidth: 1 * 1000,\n outletLength: 3 * 1000\n };\n\n this.__units = {\n componentSpacing: \"μm\",\n rotation: \"°\",\n height: \"μm\",\n pillarDiameter: \"μm\",\n filterWidth: \"μm\",\n barrierWidth: \"μm\",\n filterLength: \"μm\",\n filterNumber: \"\",\n levelNumber: \"\",\n inletWidth: \"μm\",\n inletLength: \"μm\",\n outletWidth: \"μm\",\n outletLength: \"μm\"\n };\n\n this.__minimum = {\n componentSpacing: 0,\n rotation: 0,\n height: 10,\n pillarDiameter: 1 * 1000,\n filterWidth: 0.5 * 1000,\n barrierWidth: 0.5 * 1000,\n filterLength: 2 * 1000,\n filterNumber: 2,\n levelNumber: 1,\n inletWidth: 0.5 * 1000,\n inletLength: 1 * 1000,\n outletWidth: 0.5 * 1000,\n outletLength: 1 * 1000\n };\n\n this.__maximum = {\n componentSpacing: 10000,\n rotation: 360,\n height: 1200,\n pillarDiameter: 4 * 1000,\n filterWidth: 4 * 1000,\n barrierWidth: 6 * 1000,\n filterLength: 9 * 1000,\n filterNumber: 5,\n levelNumber: 10,\n inletWidth: 4 * 1000,\n inletLength: 8 * 1000,\n outletWidth: 4 * 1000,\n outletLength: 8 * 1000\n };\n\n this.__placementTool = \"componentPositionTool\";\n\n this.__toolParams = {\n cursorPosition: \"position\"\n };\n\n this.__featureParams = {\n componentSpacing: \"componentSpacing\",\n position: \"position\",\n rotation: \"rotation\",\n pillarDiameter: \"pillarDiameter\",\n filterWidth: \"filterWidth\",\n barrierWidth: \"barrierWidth\",\n filterLength: \"filterLength\",\n filterNumber: \"filterNumber\",\n levelNumber: \"levelNumber\",\n inletWidth: \"inletWidth\",\n inletLength: \"inletLength\",\n outletWidth: \"outletWidth\",\n outletLength: \"outletLength\"\n };\n\n this.__targetParams = {\n componentSpacing: \"componentSpacing\",\n rotation: \"rotation\",\n pillarDiameter: \"pillarDiameter\",\n filterWidth: \"filterWidth\",\n barrierWidth: \"barrierWidth\",\n filterLength: \"filterLength\",\n filterNumber: \"filterNumber\",\n levelNumber: \"levelNumber\",\n inletWidth: \"inletWidth\",\n inletLength: \"inletLength\",\n outletWidth: \"outletWidth\",\n outletLength: \"outletLength\"\n };\n\n this.__renderKeys = [\"FLOW\"];\n\n this.__mint = \"FILTER\";\n\n this.__zOffsetKeys = {\n FLOW: \"height\"\n };\n\n this.__substrateOffset = {\n FLOW: \"0\"\n };\n }\n\n getPorts(params: { [k: string]: any }) {\n const inletLength = params.inletLength;\n const filterLength = params.filterLength;\n const outletLength = params.outletLength;\n const levelNumber = params.levelNumber;\n const pillarDiameter = params.pillarDiameter;\n\n const ports = [];\n\n ports.push(new ComponentPort(0, 0, \"1\", LogicalLayerType.FLOW));\n\n ports.push(new ComponentPort(inletLength + 5 * pillarDiameter + 1.3 * levelNumber * filterLength + outletLength, 0, \"2\", LogicalLayerType.FLOW));\n\n return ports;\n }\n\n render2D(params: { [k: string]: any }, key: string) {\n const rotation = params.rotation;\n const x = params.position[0];\n const y = params.position[1];\n const color = params.color;\n const pillarDiameter = params.pillarDiameter;\n const filterWidth = params.filterWidth;\n const barrierWidth = params.barrierWidth;\n const filterLength = params.filterLength;\n const filterNumber = params.filterNumber;\n const levelNumber = params.levelNumber;\n const inletWidth = params.inletWidth;\n const inletLength = params.inletLength;\n const outletWidth = params.outletWidth;\n const outletLength = params.outletLength;\n\n const serp = new paper.CompoundPath(\"\");\n\n const bodyWidth = filterNumber * filterWidth + (filterNumber - 1) * barrierWidth;\n\n // inlet\n let topLeft = new paper.Point(x, y - inletWidth / 2);\n let bottomRight = new paper.Point(x + inletLength, y + inletWidth / 2);\n\n serp.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n // left pillar\n topLeft = new paper.Point(x + inletLength, y - inletWidth / 2);\n let topRight = new paper.Point(x + inletLength + 2.5 * pillarDiameter, y - bodyWidth / 2);\n let bottomLeft = new paper.Point(x + inletLength, y + inletWidth / 2);\n bottomRight = new paper.Point(x + inletLength + 2.5 * pillarDiameter, y + bodyWidth / 2);\n\n let pillarPath: paper.Path | paper.PathItem = new paper.Path();\n (pillarPath as paper.Path).add(topLeft);\n (pillarPath as paper.Path).add(topRight);\n (pillarPath as paper.Path).add(bottomRight);\n (pillarPath as paper.Path).add(bottomLeft);\n\n let circ = new paper.Path.Circle(new paper.Point(x + inletLength + 1.5 * pillarDiameter, y), pillarDiameter / 2);\n\n pillarPath = pillarPath.subtract(circ);\n\n serp.addChild(pillarPath);\n\n // body tube\n let startBody = inletLength + 2.5 * pillarDiameter;\n const extraSpace = 0.3 * filterLength;\n\n for (let i = 0; i < levelNumber; i++) {\n topLeft = new paper.Point(x + startBody, y - bodyWidth / 2);\n bottomRight = new paper.Point(x + startBody + filterLength + extraSpace, y + bodyWidth / 2);\n\n let rec: paper.PathItem | paper.Rectangle = new paper.Path.Rectangle(topLeft, bottomRight);\n\n if (i % 2 === 0) {\n const division = (bodyWidth - (filterNumber - 1) * barrierWidth) / filterNumber;\n let heightAccum = division;\n\n for (let j = 0; j < filterNumber - 1; j++) {\n topLeft = new paper.Point(x + startBody + extraSpace / 2, y - bodyWidth / 2 + heightAccum);\n heightAccum += barrierWidth;\n bottomRight = new paper.Point(x + startBody + filterLength, y - bodyWidth / 2 + heightAccum);\n\n const cutrec = new paper.Path.Rectangle(topLeft, bottomRight);\n\n rec = rec.subtract(cutrec);\n\n heightAccum += division;\n }\n } else {\n const division = (bodyWidth - (filterNumber - 2) * barrierWidth) / (filterNumber - 1);\n let heightAccum = division;\n\n for (let j = 0; j < filterNumber - 2; j++) {\n topLeft = new paper.Point(x + startBody + extraSpace / 2, y - bodyWidth / 2 + heightAccum);\n heightAccum += barrierWidth;\n bottomRight = new paper.Point(x + startBody + filterLength, y - bodyWidth / 2 + heightAccum);\n\n const cutrec = new paper.Path.Rectangle(topLeft, bottomRight);\n\n rec = rec.subtract(cutrec);\n\n heightAccum += division;\n }\n }\n\n serp.addChild(rec);\n\n startBody += filterLength + extraSpace;\n }\n\n // right pillar\n topLeft = new paper.Point(x + startBody, y - bodyWidth / 2);\n topRight = new paper.Point(x + startBody + 2.5 * pillarDiameter, y - outletWidth / 2);\n bottomRight = new paper.Point(x + startBody + 2.5 * pillarDiameter, y + outletWidth / 2);\n bottomLeft = new paper.Point(x + startBody, y + bodyWidth / 2);\n\n pillarPath = new paper.Path();\n\n (pillarPath as paper.Path).add(topLeft);\n (pillarPath as paper.Path).add(topRight);\n (pillarPath as paper.Path).add(bottomRight);\n (pillarPath as paper.Path).add(bottomLeft);\n\n startBody += 2.5 * pillarDiameter;\n\n circ = new paper.Path.Circle(new paper.Point(x + startBody - 1.5 * pillarDiameter, y), pillarDiameter / 2);\n\n pillarPath = pillarPath.subtract(circ);\n\n serp.addChild(pillarPath);\n\n // outlet\n topLeft = new paper.Point(x + startBody, y - outletWidth / 2);\n bottomRight = new paper.Point(x + startBody + outletLength, y + outletWidth / 2);\n\n serp.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n serp.rotate(rotation, new paper.Point(x, y));\n\n serp.fillColor = color;\n return serp;\n }\n\n render2DTarget(key: string | null, params: { [k: string]: any }) {\n if (key === null) {\n key = this.__renderKeys[0];\n }\n const serp = this.render2D(params, key);\n serp.fillColor!.alpha = 0.5;\n return serp;\n }\n}\n","import Template from \"./template\";\nimport paper from \"paper\";\nimport ComponentPort from \"../core/componentPort\";\nimport { LogicalLayerType } from \"../core/init\";\n\nexport default class CellTrapS extends Template {\n constructor() {\n super();\n }\n\n __setupDefinitions(): void {\n this.__unique = {\n position: \"Point\"\n };\n\n this.__heritable = {\n componentSpacing: \"Float\",\n rotation: \"Float\",\n height: \"Float\",\n channelWidth: \"Float\",\n channelLength: \"Float\",\n chamberWidth: \"Float\",\n chamberLength: \"Float\",\n chamberHeight: \"Float\"\n };\n\n this.__defaults = {\n componentSpacing: 1000,\n rotation: 0,\n height: 250,\n channelWidth: 1 * 1000,\n channelLength: 4 * 1000,\n chamberWidth: 2.5 * 1000,\n chamberLength: 2.5 * 1000,\n chamberHeight: 250\n };\n\n this.__units = {\n componentSpacing: \"μm\",\n rotation: \"°\",\n height: \"μm\",\n channelWidth: \"μm\",\n channelLength: \"μm\",\n chamberWidth: \"μm\",\n chamberLength: \"μm\",\n chamberHeight: \"μm\"\n };\n\n this.__minimum = {\n componentSpacing: 0,\n rotation: 0,\n height: 10,\n channelWidth: 0.5 * 1000,\n channelLength: 2.5 * 1000,\n chamberWidth: 1.5 * 1000,\n chamberLength: 1.5 * 1000,\n chamberHeight: 10\n };\n\n this.__maximum = {\n componentSpacing: 10000,\n rotation: 360,\n height: 1200,\n channelWidth: 2 * 1000,\n channelLength: 6 * 1000,\n chamberWidth: 4 * 1000,\n chamberLength: 4 * 1000,\n chamberHeight: 1200\n };\n\n this.__featureParams = {\n componentSpacing: \"componentSpacing\",\n position: \"position\",\n rotation: \"rotation\",\n height: \"height\",\n channelWidth: \"channelWidth\",\n channelLength: \"channelLength\",\n chamberWidth: \"chamberWidth\",\n chamberLength: \"chamberLength\",\n chamberHeight: \"chamberHeight\"\n };\n\n this.__targetParams = {\n componentSpacing: \"componentSpacing\",\n rotation: \"rotation\",\n height: \"height\",\n channelWidth: \"channelWidth\",\n channelLength: \"channelLength\",\n chamberWidth: \"chamberWidth\",\n chamberLength: \"chamberLength\",\n chamberHeight: \"chamberHeight\"\n };\n\n this.__placementTool = \"CellPositionTool\";\n\n this.__toolParams = {\n position: \"position\"\n };\n\n this.__renderKeys = [\"FLOW\", \"CELL\"];\n\n this.__mint = \"SQUARE CELL TRAP\";\n\n this.__zOffsetKeys = {\n FLOW: \"height\",\n CELL: \"chamberHeight\"\n };\n\n this.__substrateOffset = {\n FLOW: \"0\",\n CELL: \"0\"\n };\n }\n\n getPorts(params: { [k: string]: any }) {\n const channelLength = params.channelLength;\n\n const ports = [];\n\n ports.push(new ComponentPort(-channelLength / 2, 0, \"1\", LogicalLayerType.FLOW));\n\n ports.push(new ComponentPort(channelLength / 2, 0, \"2\", LogicalLayerType.FLOW));\n\n ports.push(new ComponentPort(0, -channelLength / 2, \"3\", LogicalLayerType.FLOW));\n\n ports.push(new ComponentPort(0, channelLength / 2, \"4\", LogicalLayerType.FLOW));\n\n return ports;\n }\n\n render2D(params: { [k: string]: any }, key: string) {\n if (key === \"FLOW\") {\n return this.__drawFlow(params);\n } else if (key === \"CELL\") {\n return this.__drawCell(params);\n }else{\n throw new Error(\"Unknown key for celltrapS: \" + key);\n }\n }\n\n render2DTarget(key: string | null, params: { [k: string]: any }) {\n const traps = this.__drawFlow(params);\n traps.addChild(this.__drawCell(params));\n\n traps.fillColor!.alpha = 0.5;\n\n return traps;\n }\n\n __drawFlow(params: { [k: string]: any }) {\n const rotation = params.rotation;\n const position = params.position;\n const color = params.color;\n const x = position[0];\n const y = position[1];\n const channelWidth = params.channelWidth;\n const channelLength = params.channelLength;\n\n const traps = new paper.CompoundPath(\"\");\n\n // horizontal channel\n let topLeft = new paper.Point(x - channelLength / 2, y - channelWidth / 2);\n let bottomRight = new paper.Point(x + channelLength / 2, y + channelWidth / 2);\n\n traps.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n // vertical channel\n topLeft = new paper.Point(x - channelWidth / 2, y - channelLength / 2);\n bottomRight = new paper.Point(x + channelWidth / 2, y + channelLength / 2);\n\n traps.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n traps.fillColor = color;\n\n traps.rotate(rotation, new paper.Point(x, y));\n\n return traps;\n }\n\n __drawCell(params: { [k: string]: any }) {\n const rotation = params.rotation;\n const color = params.color;\n const position = params.position;\n const x = position[0];\n const y = position[1];\n const chamberWidth = params.chamberWidth;\n const chamberLength = params.chamberLength;\n\n const chamberList = new paper.CompoundPath(\"\");\n\n // chamber\n const topLeft = new paper.Point(x - chamberWidth / 2, y - chamberLength / 2);\n const bottomRight = new paper.Point(x + chamberWidth / 2, y + chamberLength / 2);\n\n chamberList.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n chamberList.fillColor = color;\n chamberList.rotate(rotation, new paper.Point(x, y));\n\n return chamberList;\n }\n}\n","import Template from \"./template\";\nimport paper, { CompoundPath } from \"paper\";\nimport ComponentPort from \"../core/componentPort\";\nimport { LogicalLayerType } from \"../core/init\";\n\nexport default class ThreeDMux extends Template {\n constructor() {\n super();\n }\n\n __setupDefinitions(): void {\n this.__unique = {\n position: \"Point\"\n };\n\n this.__heritable = {\n componentSpacing: \"Float\",\n in: \"Integer\",\n out: \"Integer\",\n rotation: \"Float\",\n valveRadius: \"Float\",\n height: \"Float\",\n gap: \"Float\",\n width: \"Float\",\n length: \"Float\",\n valveSpacing: \"Float\",\n channelWidth: \"Float\",\n controlChannelWidth: \"Float\"\n };\n\n this.__defaults = {\n componentSpacing: 1000,\n in: 1,\n out: 8,\n rotation: 0,\n valveRadius: 1.2 * 1000,\n height: 0.8 * 1000,\n gap: 0.6 * 1000,\n width: 100,\n length: 100,\n valveSpacing: 0.6 * 1000,\n channelWidth: 500,\n controlChannelWidth: 0.6 * 1000\n };\n\n this.__units = {\n componentSpacing: \"μm\",\n in: \"\",\n out: \"\",\n rotation: \"°\",\n valveRadius: \"μm\",\n height: \"μm\",\n gap: \"μm\",\n width: \"μm\",\n length: \"μm\",\n valveSpacing: \"μm\",\n channelWidth: \"μm\",\n controlChannelWidth: \"μm\"\n };\n\n this.__minimum = {\n componentSpacing: 0,\n in: 1,\n out: 2,\n rotation: 0,\n valveRadius: 0.1 * 100,\n height: 0.1 * 100,\n gap: 0.5 * 10,\n width: 100,\n length: 100,\n valveSpacing: 0.1 * 1000,\n channelWidth: 25,\n controlChannelWidth: 10\n };\n\n this.__maximum = {\n componentSpacing: 10000,\n in: 1,\n out: 128,\n rotation: 360,\n valveRadius: 0.2 * 10000,\n height: 1.2 * 1000,\n gap: 0.1 * 10000,\n width: 100,\n length: 100,\n valveSpacing: 0.1 * 10000,\n channelWidth: 25e3,\n controlChannelWidth: 1000\n };\n\n this.__featureParams = {\n componentSpacing: \"componentSpacing\",\n in: \"in\",\n out: \"out\",\n position: \"position\",\n rotation: \"rotation\",\n radius1: \"valveRadius\",\n radius2: \"valveRadius\",\n valveRadius: \"valveRadius\",\n gap: \"gap\",\n width: \"width\",\n length: \"length\",\n valveSpacing: \"valveSpacing\",\n channelWidth: \"channelWidth\",\n controlChannelWidth: \"controlChannelWidth\"\n };\n\n this.__targetParams = {\n componentSpacing: \"componentSpacing\",\n in: \"in\",\n out: \"out\",\n position: \"position\",\n rotation: \"rotation\",\n radius1: \"valveRadius\",\n radius2: \"valveRadius\",\n valveRadius: \"valveRadius\",\n gap: \"gap\",\n width: \"width\",\n length: \"length\",\n valveSpacing: \"valveSpacing\",\n channelWidth: \"channelWidth\",\n controlChannelWidth: \"controlChannelWidth\"\n };\n\n this.__placementTool = \"multilayerPositionTool\";\n\n this.__toolParams = {\n position: \"position\"\n };\n\n this.__renderKeys = [\"FLOW\", \"CONTROL\", \"INVERSE\"];\n\n this.__mint = \"MUX3D\";\n\n this.__zOffsetKeys = {\n FLOW: \"height\",\n CONTROL: \"height\",\n INVERSE: \"height\"\n };\n\n this.__substrateOffset = {\n FLOW: \"0\",\n CONTROL: \"+1\",\n INVERSE: \"0\"\n };\n }\n\n render2D(params: { [k: string]: any }, key: string) {\n if (key === \"FLOW\") {\n return this.__drawFlow(params);\n } else if (key === \"CONTROL\") {\n return this.__drawControl(params);\n } else if (key === \"INVERSE\") {\n return this.__drawInverse(params);\n }else{\n throw new Error(\"Unknown key threedmux: \" + key);\n }\n }\n\n render2DTarget(key: string | null, params: { [k: string]: any }) {\n const ret = new paper.CompoundPath(\"\");\n const flow = this.render2D(params, \"FLOW\");\n const control = this.render2D(params, \"CONTROL\");\n ret.addChild((control as unknown) as paper.CompoundPath);\n ret.addChild((flow as unknown) as paper.CompoundPath);\n ret.fillColor = params.color;\n ret.fillColor!.alpha = 0.5;\n return ret;\n }\n\n getPorts(params: { [k: string]: any }) {\n const ins = params.in;\n const outs = params.out;\n let N;\n const channelWidth = params.channelWidth;\n let rotation = params.rotation;\n\n if (ins < outs) {\n N = outs;\n } else {\n N = ins;\n rotation += 180;\n }\n\n const horizontal_length = N * 4000;\n const vertical_length = N * 3000;\n const ports = [];\n\n for (let i = 0; i < N; i++) {\n const xpos = i * (horizontal_length / (N - 1));\n ports.push(new ComponentPort(xpos, 0, (i + 1).toString(), LogicalLayerType.FLOW));\n }\n\n ports.push(new ComponentPort(horizontal_length / 2, vertical_length + N * 1000, (N + 1).toString(), LogicalLayerType.FLOW));\n const bottomlinelength = N * 4000; // modify, so it depends on the input N\n const vertlinelength = N * 3000; // same as above\n\n const leftInput = -N * 1000;\n const rightInput = bottomlinelength + N * 1000;\n let indexN = N;\n const valvenum = Math.log(N) / Math.log(2);\n const vertholder = vertlinelength / (2 * valvenum);\n\n let count = N + 2;\n\n for (let i = 0; i < 2 * valvenum; i++) {\n // left side\n if (i % 2 === 0) {\n indexN /= 2;\n const cur_ind = N - indexN - 1;\n // let leftsideLeft = new paper.Point(leftInput, vertholder + (i) * vertlinelength/(2*valvenum + 2) - channelWidth/2);\n ports.push(new ComponentPort(leftInput, vertholder + (i * vertlinelength) / (2 * valvenum + 2), count.toString(), LogicalLayerType.CONTROL));\n console.log(count);\n count++;\n }\n // right side\n else {\n ports.push(new ComponentPort(rightInput, vertholder + (i * vertlinelength) / (2 * valvenum + 2), count.toString(), LogicalLayerType.CONTROL));\n console.log(count);\n count++;\n }\n }\n\n return ports;\n }\n\n __drawFlow(params: { [k: string]: any }) {\n const position = params.position;\n const gap = params.gap;\n const radius = params.valveRadius;\n const color = params.color;\n let rotation = params.rotation;\n const channelWidth = params.channelWidth;\n const threedmux_flow = new paper.CompoundPath(\"\");\n\n const px = position[0];\n const py = position[1];\n const ins = params.in;\n const outs = params.out;\n let N;\n if (ins < outs) {\n N = outs;\n } else {\n N = ins;\n rotation += 180;\n }\n const bottomlinelength = N * 4000; // modify, so it depends on the input N\n const vertlinelength = N * 3000; // same as above\n\n const bottomlineleft = new paper.Point(px - channelWidth / 2, py - channelWidth / 2 + vertlinelength);\n const bottomlineright = new paper.Point(px + bottomlinelength + channelWidth / 2, py + channelWidth / 2 + vertlinelength);\n const channel = new paper.Path.Rectangle(bottomlineleft, bottomlineright);\n\n threedmux_flow.addChild(channel);\n\n const valvenum = Math.log(N) / Math.log(2);\n const valveselect = vertlinelength / (2 * valvenum);\n const branchArray = new Array(N);\n const centerArray = new Array(N);\n\n // create base flow\n for (let i = 0; i < N; i++) {\n const xposbranch = i * (bottomlinelength / (N - 1));\n\n const vertlinebottom = new paper.Point(px + xposbranch - channelWidth / 2, py + vertlinelength);\n const vertlinetop = new paper.Point(px + xposbranch + channelWidth / 2, py);\n branchArray[i] = new paper.Path.Rectangle(vertlinebottom, vertlinetop);\n }\n\n // create output port\n const portCon = new paper.Point(px + bottomlinelength / 2 - channelWidth / 2, py + vertlinelength);\n const portOut = new paper.Point(px + bottomlinelength / 2 + channelWidth / 2, py + vertlinelength + N * 1000);\n\n const portRec = new paper.Path.Rectangle(portCon, portOut);\n\n threedmux_flow.addChild(portRec);\n\n // add valves and remove parts of channels\n let cur_N = N;\n const xpos = px;\n let ypos = py + valveselect;\n\n for (let j = 0; j < valvenum; j++) {\n // left side\n let count1 = 0;\n const increment1 = cur_N / 2;\n while (count1 < N) {\n for (let w = 0; w < cur_N / 2; w++) {\n const current_xpos = xpos + ((count1 + w) * bottomlinelength) / (N - 1);\n\n const cutrec = new paper.Path.Rectangle({\n from: new paper.Point(current_xpos - channelWidth / 2, ypos - gap / 2),\n to: new paper.Point(current_xpos + channelWidth / 2, ypos + gap / 2)\n });\n\n this.__createthreedmuxValve(threedmux_flow, current_xpos, ypos, gap, radius, rotation, channelWidth);\n branchArray[count1 + w] = branchArray[count1 + w].subtract(cutrec); // remove a portion from the selected channel\n }\n\n count1 += 2 * increment1;\n }\n\n // right side\n const ypos_adjust = vertlinelength / (2 * valvenum + 2);\n let count2 = 0;\n const increment2 = cur_N / 2;\n ypos += ypos_adjust;\n\n while (count2 < N) {\n for (let w = 0; w < cur_N / 2; w++) {\n const current_xpos = xpos + bottomlinelength - ((count2 + w) * bottomlinelength) / (N - 1);\n\n const cutrec = new paper.Path.Rectangle({\n from: new paper.Point(current_xpos - channelWidth / 2, ypos - gap / 2),\n to: new paper.Point(current_xpos + channelWidth / 2, ypos + gap / 2)\n });\n\n branchArray[N - 1 - w - count2] = branchArray[N - 1 - w - count2].subtract(cutrec);\n this.__createthreedmuxValve(threedmux_flow, current_xpos, ypos, gap, radius, rotation, channelWidth);\n }\n count2 += increment2 + cur_N / 2;\n }\n ypos += ypos_adjust;\n cur_N = cur_N / 2;\n }\n\n for (let i = 0; i < N; i++) {\n threedmux_flow.addChild(branchArray[i]);\n // threedmux_flow.addChild(centerArray[i]);\n }\n\n threedmux_flow.fillColor = color;\n\n threedmux_flow.rotate(rotation, new paper.Point(px, py));\n\n return threedmux_flow;\n }\n\n __createthreedmuxValve(compound_path: paper.CompoundPath, xpos: number, ypos: number, gap: number, radius: number, rotation: number, channel_width: number): void {\n const center = new paper.Point(xpos, ypos);\n\n // Create the basic circle\n let circ: paper.Path.Circle | paper.PathItem = new paper.Path.Circle(center, radius);\n\n // Add the tiny channel pieces that jut out\n let rec = new paper.Path.Rectangle({\n point: new paper.Point(xpos - channel_width / 2, ypos - radius),\n size: [channel_width, radius],\n stokeWidth: 0\n });\n\n circ = circ.unite(rec);\n\n rec = new paper.Path.Rectangle({\n point: new paper.Point(xpos - channel_width / 2, ypos),\n size: [channel_width, radius],\n stokeWidth: 0\n });\n\n circ = circ.unite(rec);\n\n const cutout = new paper.Path.Rectangle({\n from: new paper.Point(xpos - radius, ypos - gap / 2),\n to: new paper.Point(xpos + radius, ypos + gap / 2)\n });\n\n const valve = circ.subtract(cutout);\n\n compound_path.addChild(valve);\n }\n\n __drawControl(params: { [k: string]: any }) {\n const position = params.position;\n const radius = params.valveRadius;\n const color = params.color;\n let rotation = params.rotation;\n const channelWidth = params.controlChannelWidth;\n const threedmux_control = new paper.CompoundPath(\"\");\n\n const px = position[0];\n const py = position[1];\n\n const ins = params.in;\n const outs = params.out;\n\n let N;\n if (ins < outs) {\n N = outs;\n } else {\n N = ins;\n rotation += 180;\n }\n\n const bottomlinelength = N * 4000; // modify, so it depends on the input N\n const vertlinelength = N * 3000; // same as above\n\n const leftInput = px - N * 1000;\n const rightInput = px + bottomlinelength + N * 1000;\n let indexN = N;\n const valvenum = Math.log(N) / Math.log(2);\n const vertholder = vertlinelength / (2 * valvenum);\n const valveselect = vertlinelength / (2 * valvenum);\n\n for (let i = 0; i < 2 * valvenum; i++) {\n // left side\n if (i % 2 === 0) {\n indexN /= 2;\n const cur_ind = N - indexN - 1;\n const leftsideLeft = new paper.Point(leftInput, py + vertholder + (i * vertlinelength) / (2 * valvenum + 2) - channelWidth / 2);\n const leftsideRight = new paper.Point(px + cur_ind * (bottomlinelength / (N - 1)), py + vertholder + (i * vertlinelength) / (2 * valvenum + 2) + channelWidth / 2);\n const leftcontrol = new paper.Path.Rectangle(leftsideLeft, leftsideRight);\n\n threedmux_control.addChild(leftcontrol);\n }\n // right side\n else {\n const cur_ind = indexN;\n const rightsideLeft = new paper.Point(px + cur_ind * (bottomlinelength / (N - 1)), py + vertholder + (i * vertlinelength) / (2 * valvenum + 2) - channelWidth / 2);\n const rightsideRight = new paper.Point(rightInput, py + vertholder + (i * vertlinelength) / (2 * valvenum + 2) + channelWidth / 2);\n const rightcontrol = new paper.Path.Rectangle(rightsideLeft, rightsideRight);\n\n threedmux_control.addChild(rightcontrol);\n }\n }\n\n let cur_N = N;\n const xpos = px;\n let ypos = py + valveselect;\n\n for (let j = 0; j < valvenum; j++) {\n // left side\n let count1 = 0;\n const increment1 = cur_N / 2;\n while (count1 < N) {\n for (let w = 0; w < cur_N / 2; w++) {\n const current_xpos = xpos + ((count1 + w) * bottomlinelength) / (N - 1);\n const center = new paper.Point(current_xpos, ypos);\n const circle = new paper.Path.Circle(center, radius);\n threedmux_control.addChild(circle);\n }\n\n count1 += 2 * increment1;\n }\n\n // right side\n const ypos_adjust = vertlinelength / (2 * valvenum + 2);\n let count2 = 0;\n const increment2 = cur_N / 2;\n ypos += ypos_adjust;\n\n while (count2 < N) {\n for (let w = 0; w < cur_N / 2; w++) {\n const current_xpos = xpos + bottomlinelength - ((count2 + w) * bottomlinelength) / (N - 1);\n const center = new paper.Point(current_xpos, ypos);\n const circle = new paper.Path.Circle(center, radius);\n threedmux_control.addChild(circle);\n }\n count2 += increment2 + cur_N / 2;\n }\n ypos += ypos_adjust;\n cur_N = cur_N / 2;\n }\n\n threedmux_control.fillColor = color;\n threedmux_control.rotate(rotation, new paper.Point(px, py));\n\n return threedmux_control;\n }\n\n __drawInverse(params: { [k: string]: any }) {\n const position = params.position;\n const radius = params.valveRadius;\n const color = params.color;\n let rotation = params.rotation;\n const threedmux_control = new paper.CompoundPath(\"\");\n\n const px = position[0];\n const py = position[1];\n\n const ins = params.in;\n const outs = params.out;\n\n let N;\n if (ins < outs) {\n N = outs;\n } else {\n N = ins;\n rotation += 180;\n }\n\n const bottomlinelength = N * 4000; // modify, so it depends on the input N\n const vertlinelength = N * 3000; // same as above\n\n const leftInput = px - N * 1000;\n const rightInput = px + bottomlinelength + N * 1000;\n let indexN = N;\n const valvenum = Math.log(N) / Math.log(2);\n const vertholder = vertlinelength / (2 * valvenum);\n const valveselect = vertlinelength / (2 * valvenum);\n\n let cur_N = N;\n const xpos = px;\n let ypos = py + valveselect;\n\n for (let j = 0; j < valvenum; j++) {\n // left side\n let count1 = 0;\n const increment1 = cur_N / 2;\n while (count1 < N) {\n for (let w = 0; w < cur_N / 2; w++) {\n const current_xpos = xpos + ((count1 + w) * bottomlinelength) / (N - 1);\n const center = new paper.Point(current_xpos, ypos);\n const circle = new paper.Path.Circle(center, radius);\n threedmux_control.addChild(circle);\n }\n\n count1 += 2 * increment1;\n }\n\n // right side\n const ypos_adjust = vertlinelength / (2 * valvenum + 2);\n let count2 = 0;\n const increment2 = cur_N / 2;\n ypos += ypos_adjust;\n\n while (count2 < N) {\n for (let w = 0; w < cur_N / 2; w++) {\n const current_xpos = xpos + bottomlinelength - ((count2 + w) * bottomlinelength) / (N - 1);\n const center = new paper.Point(current_xpos, ypos);\n const circle = new paper.Path.Circle(center, radius);\n threedmux_control.addChild(circle);\n }\n count2 += increment2 + cur_N / 2;\n }\n ypos += ypos_adjust;\n cur_N = cur_N / 2;\n }\n\n threedmux_control.fillColor = color;\n threedmux_control.rotate(rotation, new paper.Point(px, py));\n\n return threedmux_control;\n }\n}","import Template from \"./template\";\nimport paper, { CompoundPath } from \"paper\";\nimport ComponentPort from \"../core/componentPort\";\nimport { LogicalLayerType } from \"../core/init\";\n\nexport default class ChemostatRing extends Template {\n constructor() {\n super();\n }\n\n __setupDefinitions(): void {\n this.__unique = {\n position: \"Point\"\n };\n\n this.__heritable = {\n componentSpacing: \"Float\",\n flowChannelWidth: \"Float\",\n controlChannelWidth: \"Float\",\n chemostatChannelWidth: \"Float\",\n radius: \"Float\",\n rotation: \"Float\",\n volume: \"Float\",\n height: \"Float\"\n };\n\n this.__defaults = {\n componentSpacing: 1000,\n flowChannelWidth: 100,\n controlChannelWidth: 50,\n chemostatChannelWidth: 100,\n radius: 400,\n rotation: 0,\n volume: 30000000,\n height: 20\n };\n\n this.__units = {\n bendSpacing: \"μm\",\n numberOfBends: \"\",\n channelWidth: \"μm\",\n bendLength: \"μm\",\n componentSpacing: \"μm\",\n flowChannelWidth: \"μm\",\n controlChannelWidth: \"μm\",\n chemostatChannelWidth: \"μm\",\n radius: \"μm\",\n rotation: \"°\",\n volume: \"μm3\",\n height: \"μm\"\n };\n\n this.__minimum = {\n componentSpacing: 0,\n flowChannelWidth: 0.1 * 1000,\n controlChannelWidth: 0.1 * 1000,\n chemostatChannelWidth: 0.2 * 1000,\n radius: 0.2 * 1000,\n rotation: 0,\n volume: 0.1 * 1000 * 1 * 1000 * 4 * 0.2 * 1000,\n height: 0.2 * 1000\n };\n\n this.__maximum = {\n componentSpacing: 10000,\n flowChannelWidth: 0.3 * 10000,\n controlChannelWidth: 0.15 * 10000,\n chemostatChannelWidth: 0.5 * 10000,\n radius: 10000,\n rotation: 260,\n volume: 0.5 * 10000 * 10 * 1000 * 4 * 1 * 10000,\n height: 1 * 10000\n };\n\n this.__placementTool = \"multilayerPositionTool\";\n\n this.__toolParams = {\n cursorPosition: \"position\"\n };\n\n this.__featureParams = {\n position: \"position\",\n componentSpacing: \"componentSpacing\",\n flowChannelWidth: \"flowChannelWidth\",\n controlChannelWidth: \"controlChannelWidth\",\n chemostatChannelWidth: \"chemostatChannelWidth\",\n radius: \"radius\",\n rotation: \"rotation\",\n volume: \"volume\",\n height: \"height\"\n };\n\n this.__targetParams = {\n componentSpacing: \"componentSpacing\",\n flowChannelWidth: \"flowChannelWidth\",\n controlChannelWidth: \"controlChannelWidth\",\n chemostatChannelWidth: \"chemostatChannelWidth\",\n radius: \"radius\",\n rotation: \"rotation\",\n volume: \"volume\",\n height: \"height\"\n };\n\n this.__renderKeys = [\"FLOW\", \"CONTROL\"];\n\n this.__mint = \"CHEMOSTAT RING\";\n\n this.__zOffsetKeys = {\n FLOW: \"height\",\n CONTROL: \"height\"\n };\n\n this.__substrateOffset = {\n FLOW: \"0\",\n CONTROL: \"+1\"\n };\n }\n\n getPorts(params: { [k: string]: any }) {\n const flowChannelWidth = params.flowChannelWidth;\n const controlChannelWidth = params.controlChannelWidth;\n const chemostatChannelWidth = params.chemostatChannelWidth;\n const volume = params.volume;\n const height = params.height;\n const radius = params.radius;\n\n const area = volume / height;\n const chemostatLength = area / (4 * chemostatChannelWidth);\n\n const controlSpacing = chemostatLength / 10;\n const controlendpoint = (-7 * chemostatLength) / 8;\n const bendDist = chemostatLength / 15;\n\n const ports = [];\n\n // flow\n ports.push(new ComponentPort(-chemostatLength / 3 - chemostatLength / 2, -chemostatLength / 3, \"1\", LogicalLayerType.FLOW));\n ports.push(new ComponentPort(-chemostatLength / 3 - chemostatLength / 5, -chemostatLength / 3 - chemostatLength / 3, \"2\", LogicalLayerType.FLOW));\n ports.push(new ComponentPort(-chemostatLength / 3 + chemostatLength / 5, -chemostatLength / 3 - chemostatLength / 3, \"3\", LogicalLayerType.FLOW));\n ports.push(new ComponentPort(-chemostatLength / 3 + chemostatLength / 2, -chemostatLength / 3, \"4\", LogicalLayerType.FLOW));\n // ports.push(new ComponentPort(chemostatChannelWidth + chemostatLength + 2 * chemostatLength/5, chemostatChannelWidth/2 + 7 * chemostatLength/11, \"5\", \"FLOW\"));\n\n // control\n // 1\n ports.push(new ComponentPort(-chemostatLength / 3 - chemostatLength / 5 - controlSpacing - radius, controlendpoint, \"5\", LogicalLayerType.CONTROL));\n // 2\n ports.push(new ComponentPort(-chemostatLength / 3 - chemostatLength / 5 + 1.3 * radius, controlendpoint, \"6\", LogicalLayerType.CONTROL));\n // 3\n ports.push(new ComponentPort(-chemostatLength / 3 - chemostatLength / 5 + 1.7 * radius, controlendpoint, \"7\", LogicalLayerType.CONTROL));\n // 4\n ports.push(new ComponentPort(-chemostatLength / 3 + chemostatLength / 5 - controlSpacing - radius, controlendpoint, \"8\", LogicalLayerType.CONTROL));\n // 5\n ports.push(new ComponentPort(-chemostatLength / 3 + chemostatLength / 5 + 1.3 * radius, controlendpoint, \"9\", LogicalLayerType.CONTROL));\n // 6\n ports.push(new ComponentPort(-chemostatLength / 3 + chemostatLength / 5 + 1.7 * radius, controlendpoint, \"10\", LogicalLayerType.CONTROL));\n\n let originx = chemostatChannelWidth / 2 + (3 * chemostatLength) / 7;\n let originy = chemostatChannelWidth / 2;\n\n // 7\n ports.push(new ComponentPort(originx - controlSpacing - 0.5 * radius, controlendpoint, \"11\", LogicalLayerType.CONTROL));\n // 8\n ports.push(new ComponentPort(originx + 1.3 * radius, controlendpoint, \"12\", LogicalLayerType.CONTROL));\n // 9\n ports.push(new ComponentPort(originx + 1.7 * radius, controlendpoint, \"13\", LogicalLayerType.CONTROL));\n\n originx = (5 * chemostatLength) / 6;\n originy = chemostatChannelWidth / 2;\n\n // 10\n ports.push(new ComponentPort(originx - controlSpacing - 0.5 * radius, controlendpoint, \"14\", LogicalLayerType.CONTROL));\n // 11\n ports.push(new ComponentPort(originx + 1.3 * radius, controlendpoint, \"15\", LogicalLayerType.CONTROL));\n // 12\n ports.push(new ComponentPort(originx + 1.7 * radius, controlendpoint, \"16\", LogicalLayerType.CONTROL));\n\n originx = chemostatChannelWidth / 2;\n originy = chemostatLength / 5;\n\n // 13\n ports.push(new ComponentPort(controlendpoint, originy - controlSpacing - 0.5 * radius, \"17\", LogicalLayerType.CONTROL));\n // 14\n ports.push(new ComponentPort(controlendpoint, originy + 1.3 * radius, \"18\", LogicalLayerType.CONTROL));\n // 15\n ports.push(new ComponentPort(controlendpoint, originy + 1.7 * radius, \"19\", LogicalLayerType.CONTROL));\n\n originx = chemostatChannelWidth / 2;\n originy = chemostatLength / 5 + chemostatLength / 2;\n\n // 16\n ports.push(new ComponentPort(controlendpoint, originy - controlSpacing - 0.5 * radius, \"20\", LogicalLayerType.CONTROL));\n // 17\n ports.push(new ComponentPort(controlendpoint, originy + 1.3 * radius, \"21\", LogicalLayerType.CONTROL));\n // 18\n ports.push(new ComponentPort(controlendpoint, originy + 1.7 * radius, \"22\", LogicalLayerType.CONTROL));\n\n originx = chemostatChannelWidth / 2 + chemostatLength;\n originy = chemostatChannelWidth / 2 + (2 * chemostatLength) / 5;\n\n // 19\n ports.push(new ComponentPort(2 * chemostatLength, originy - controlSpacing - 0.5 * radius, \"23\", LogicalLayerType.CONTROL));\n // 20\n ports.push(new ComponentPort(2 * chemostatLength, originy + 1.3 * radius, \"24\", LogicalLayerType.CONTROL));\n // 21\n ports.push(new ComponentPort(2 * chemostatLength, originy + 1.7 * radius, \"25\", LogicalLayerType.CONTROL));\n\n originx = chemostatChannelWidth / 2 + chemostatLength;\n originy = chemostatChannelWidth / 2 + (4 * chemostatLength) / 5;\n\n // 22\n ports.push(new ComponentPort(2 * chemostatLength, originy - controlSpacing - 0.5 * radius, \"26\", LogicalLayerType.CONTROL));\n // 23\n ports.push(new ComponentPort(2 * chemostatLength, originy + 1.3 * radius, \"27\", LogicalLayerType.CONTROL));\n // 24\n ports.push(new ComponentPort(2 * chemostatLength, originy + 1.7 * radius, \"28\", LogicalLayerType.CONTROL));\n\n originx = chemostatChannelWidth / 2 + chemostatLength / 4;\n originy = chemostatLength + chemostatChannelWidth / 2;\n\n // 25\n ports.push(new ComponentPort(originx - 0.3 * controlSpacing, 2 * chemostatLength, \"29\", LogicalLayerType.CONTROL));\n // 26\n ports.push(new ComponentPort(originx + 0.5 * controlSpacing, 2 * chemostatLength, \"30\", LogicalLayerType.CONTROL));\n // 27\n ports.push(new ComponentPort(originx + 0.4 * controlSpacing + 0.3 * controlSpacing, 2 * chemostatLength, \"31\", LogicalLayerType.CONTROL));\n\n originx = chemostatChannelWidth / 2 + (3 * chemostatLength) / 7;\n originy = chemostatLength + chemostatChannelWidth / 2;\n\n // 28\n ports.push(new ComponentPort(originx - 0.3 * controlSpacing, 2 * chemostatLength, \"32\", LogicalLayerType.CONTROL));\n // 29\n ports.push(new ComponentPort(originx - 0.5 * controlSpacing, 2 * chemostatLength, \"33\", LogicalLayerType.CONTROL));\n // 30\n ports.push(new ComponentPort(originx + 0.3 * controlSpacing, 2 * chemostatLength, \"34\", LogicalLayerType.CONTROL));\n\n // 31\n ports.push(new ComponentPort(originx + 0.55 * controlSpacing, 2 * chemostatLength, \"35\", LogicalLayerType.CONTROL));\n // 32\n ports.push(new ComponentPort(originx + 0.85 * controlSpacing, 2 * chemostatLength, \"36\", LogicalLayerType.CONTROL));\n // 33\n ports.push(new ComponentPort(originx + 1.15 * controlSpacing, 2 * chemostatLength, \"37\", LogicalLayerType.CONTROL));\n\n originx = chemostatChannelWidth / 2 + (3 * chemostatLength) / 5;\n originy = chemostatLength + chemostatChannelWidth / 2;\n\n // 34\n ports.push(new ComponentPort(originx - 0.3 * controlSpacing, 2 * chemostatLength, \"38\", LogicalLayerType.CONTROL));\n // 35\n ports.push(new ComponentPort(originx + 0.5 * controlSpacing, 2 * chemostatLength, \"49\", LogicalLayerType.CONTROL));\n // 36\n ports.push(new ComponentPort(originx + 0.4 * controlSpacing + 0.3 * controlSpacing, 2 * chemostatLength, \"40\", LogicalLayerType.CONTROL));\n return ports;\n }\n\n render2D(params: { [k: string]: any }, key: string) {\n if (key === \"FLOW\") {\n return this.__drawFlow(params);\n } else if (key === \"CONTROL\") {\n return this.__drawControl(params);\n }\n else{\n throw new Error(\"Unknown key for computing chemostat ring: \" + key);\n }\n }\n\n __drawFlow(params: { [k: string]: any }) {\n const x = params.position[0];\n const y = params.position[1];\n const flowChannelWidth = params.flowChannelWidth;\n const controlChannelWidth = params.controlChannelWidth;\n const chemostatChannelWidth = params.chemostatChannelWidth;\n const volume = params.volume;\n const height = params.height;\n const radius = params.radius;\n const rotation = params.rotation;\n const color = params.color;\n const serp = new paper.CompoundPath(\"\");\n\n const area = volume / height;\n const chemostatLength = area / (4 * chemostatChannelWidth);\n\n /// / chemostat ring\n\n // chemostat ring top\n let topLeft = new paper.Point(x + chemostatChannelWidth, y);\n let bottomRight = new paper.Point(x + chemostatChannelWidth + chemostatLength, y + chemostatChannelWidth);\n serp.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n // chemostat ring right\n topLeft = new paper.Point(x + chemostatLength, y + chemostatChannelWidth);\n bottomRight = new paper.Point(x + chemostatChannelWidth + chemostatLength, y + chemostatChannelWidth + chemostatLength);\n serp.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n // chemostat ring bottom\n topLeft = new paper.Point(x, y + chemostatLength);\n bottomRight = new paper.Point(x + chemostatLength, y + chemostatLength + chemostatChannelWidth);\n serp.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n // chemostat ring left\n topLeft = new paper.Point(x, y);\n bottomRight = new paper.Point(x + chemostatChannelWidth, y + chemostatLength);\n serp.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n // in top left vert\n topLeft = new paper.Point(x + chemostatChannelWidth / 2 + chemostatLength / 4 - flowChannelWidth / 2, y + chemostatChannelWidth / 2);\n bottomRight = new paper.Point(x + chemostatChannelWidth / 2 + chemostatLength / 4 + flowChannelWidth / 2, y + chemostatChannelWidth / 2 + (2 * chemostatLength) / 5);\n serp.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n // in top right vert\n topLeft = new paper.Point(x + chemostatChannelWidth / 2 + (3 * chemostatLength) / 5 - flowChannelWidth / 2, y + chemostatChannelWidth / 2);\n bottomRight = new paper.Point(x + chemostatChannelWidth / 2 + (3 * chemostatLength) / 5 + flowChannelWidth / 2, y + chemostatChannelWidth / 2 + (2 * chemostatLength) / 5);\n serp.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n // in top right hori\n topLeft = new paper.Point(x + chemostatChannelWidth / 2 + (3 * chemostatLength) / 5, y + chemostatChannelWidth / 2 + chemostatLength / 5 - flowChannelWidth / 2);\n bottomRight = new paper.Point(x + chemostatChannelWidth / 2 + chemostatLength, y + chemostatChannelWidth / 2 + chemostatLength / 5 + flowChannelWidth / 2);\n serp.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n // in top bottom hori\n topLeft = new paper.Point(x + chemostatChannelWidth / 2, y + chemostatChannelWidth / 2 + (2 * chemostatLength) / 5 - flowChannelWidth / 2);\n bottomRight = new paper.Point(x + chemostatChannelWidth / 2 + (3 * chemostatLength) / 5, y + chemostatChannelWidth / 2 + (2 * chemostatLength) / 5 + flowChannelWidth / 2);\n serp.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n // in middle left hori\n topLeft = new paper.Point(x + chemostatChannelWidth / 2, y + chemostatChannelWidth / 2 + (4 * chemostatLength) / 5 - flowChannelWidth / 2);\n bottomRight = new paper.Point(x + chemostatChannelWidth / 2 + chemostatLength / 4, y + chemostatChannelWidth / 2 + (4 * chemostatLength) / 5 + flowChannelWidth / 2);\n serp.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n // in middle middle vert\n topLeft = new paper.Point(x + chemostatChannelWidth / 2 + chemostatLength / 4 - flowChannelWidth / 2, y + chemostatChannelWidth / 2 + chemostatLength / 2);\n bottomRight = new paper.Point(\n x + chemostatChannelWidth / 2 + chemostatLength / 4 + flowChannelWidth / 2,\n y + chemostatChannelWidth / 2 + (4 * chemostatLength) / 5 + flowChannelWidth / 2\n );\n serp.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n // in middle middle hori\n topLeft = new paper.Point(\n x + chemostatChannelWidth / 2 + chemostatLength / 4 - flowChannelWidth / 2,\n y + chemostatChannelWidth / 2 + chemostatLength / 2 - flowChannelWidth / 2\n );\n bottomRight = new paper.Point(x + chemostatChannelWidth / 2 + (5 * chemostatLength) / 7, y + chemostatChannelWidth / 2 + chemostatLength / 2 + flowChannelWidth / 2);\n serp.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n // in top circle\n let center = new paper.Point(x + chemostatChannelWidth / 2 + (5 * chemostatLength) / 7, y + chemostatChannelWidth / 2 + chemostatLength / 2);\n const circ = new paper.Path.Circle(center, radius);\n serp.addChild(circ);\n\n // calc H\n const xval = Math.abs((5 * chemostatLength) / 7 - (3 * chemostatLength) / 5);\n const yval = Math.abs(chemostatChannelWidth / 2 + chemostatLength / 2 - (chemostatChannelWidth / 2 + (2 * chemostatLength) / 5));\n const hval = Math.sqrt(Math.pow(xval, 2) + Math.pow(yval, 2));\n const angt = (Math.asin(yval / hval) * 180) / Math.PI;\n\n // in tilt\n topLeft = new paper.Point(\n x + chemostatChannelWidth / 2 + (3 * chemostatLength) / 5 - flowChannelWidth / 2,\n y + chemostatChannelWidth / 2 + (2 * chemostatLength) / 5 - flowChannelWidth / 2\n );\n bottomRight = new paper.Point(\n x + chemostatChannelWidth / 2 + (3 * chemostatLength) / 5 - flowChannelWidth / 2 + hval,\n y + chemostatChannelWidth / 2 + (2 * chemostatLength) / 5 + flowChannelWidth / 2\n );\n serp.addChild(\n (new paper.Path.Rectangle(topLeft, bottomRight).rotate(\n angt,\n new paper.Point(x + chemostatChannelWidth / 2 + (3 * chemostatLength) / 5, y + chemostatChannelWidth / 2 + (2 * chemostatLength) / 5)\n ) as unknown) as paper.Path.Rectangle\n );\n\n // in circle bottom vert\n topLeft = new paper.Point(x + chemostatChannelWidth / 2 + (5 * chemostatLength) / 7 - flowChannelWidth / 2, y + chemostatChannelWidth / 2 + chemostatLength / 2);\n bottomRight = new paper.Point(x + chemostatChannelWidth / 2 + (5 * chemostatLength) / 7 + flowChannelWidth / 2, y + chemostatChannelWidth / 2 + (7 * chemostatLength) / 11);\n serp.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n // in circle bottom hori\n topLeft = new paper.Point(\n x + chemostatChannelWidth / 2 + (5 * chemostatLength) / 7 - flowChannelWidth / 2,\n y + chemostatChannelWidth / 2 + (7 * chemostatLength) / 11 - flowChannelWidth / 2\n );\n bottomRight = new paper.Point(x + chemostatLength, y + chemostatChannelWidth / 2 + (7 * chemostatLength) / 11 + flowChannelWidth / 2);\n serp.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n // in bottom right vert\n topLeft = new paper.Point(x + (5 * chemostatLength) / 6 - flowChannelWidth / 2, y + chemostatChannelWidth / 2 + (7 * chemostatLength) / 11);\n bottomRight = new paper.Point(x + (5 * chemostatLength) / 6 + flowChannelWidth / 2, y + chemostatChannelWidth / 2 + chemostatLength);\n serp.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n // in bottom middle vert\n topLeft = new paper.Point(x + chemostatChannelWidth / 2 + (3 * chemostatLength) / 7 - flowChannelWidth / 2, y + chemostatChannelWidth / 2 + (4 * chemostatLength) / 6);\n bottomRight = new paper.Point(x + chemostatChannelWidth / 2 + (3 * chemostatLength) / 7 + flowChannelWidth / 2, y + chemostatChannelWidth / 2 + chemostatLength);\n serp.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n // in bottom circle\n center = new paper.Point(x + chemostatChannelWidth / 2 + (3 * chemostatLength) / 7, y + chemostatChannelWidth / 2 + (4 * chemostatLength) / 6);\n serp.addChild(new paper.Path.Circle(center, radius));\n\n /// / stuff outside the ring\n\n // left top hori\n topLeft = new paper.Point(x - chemostatLength / 3, y + chemostatLength / 5 - flowChannelWidth / 2);\n bottomRight = new paper.Point(x, y + chemostatLength / 5 + flowChannelWidth / 2);\n serp.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n // left top vert\n topLeft = new paper.Point(x - chemostatLength / 3 - flowChannelWidth / 2, y - chemostatLength / 3);\n bottomRight = new paper.Point(x - chemostatLength / 3 + flowChannelWidth / 2, y + chemostatLength / 5 + flowChannelWidth / 2);\n serp.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n // left flow port hori bar\n topLeft = new paper.Point(x - chemostatLength / 3 - chemostatLength / 2, y - chemostatLength / 3 - flowChannelWidth / 2);\n bottomRight = new paper.Point(x - chemostatLength / 3 + chemostatLength / 2, y - chemostatLength / 3 + flowChannelWidth / 2);\n serp.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n // horizontal circles\n // left\n // center = new paper.Point(x - chemostatLength/3 - chemostatLength/2, y - chemostatLength/3);\n // serp.addChild(new paper.Path.Circle(center, radius));\n // right\n // center = new paper.Point(x - chemostatLength/3 + chemostatLength/2, y - chemostatLength/3);\n // serp.addChild(new paper.Path.Circle(center, radius));\n\n // left flow port vert\n topLeft = new paper.Point(x - chemostatLength / 3 - chemostatLength / 5 - flowChannelWidth / 2, y - chemostatLength / 3 - chemostatLength / 3);\n bottomRight = new paper.Point(x - chemostatLength / 3 - chemostatLength / 5 + flowChannelWidth / 2, y - chemostatLength / 3);\n serp.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n // right flow port vert\n topLeft = new paper.Point(x - chemostatLength / 3 + chemostatLength / 5 - flowChannelWidth / 2, y - chemostatLength / 3 - chemostatLength / 3);\n bottomRight = new paper.Point(x - chemostatLength / 3 + chemostatLength / 5 + flowChannelWidth / 2, y - chemostatLength / 3);\n serp.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n // top circles\n // left\n // center = new paper.Point(x - chemostatLength/3 - chemostatLength/5, y - chemostatLength/3 - chemostatLength/3);\n // serp.addChild(new paper.Path.Circle(center, radius));\n\n // right\n // center = new paper.Point(x - chemostatLength/3 + chemostatLength/5, y - chemostatLength/3 - chemostatLength/3);\n // serp.addChild(new paper.Path.Circle(center, radius));\n\n // left vert line that goes to bottom\n topLeft = new paper.Point(x - chemostatLength / 5 - flowChannelWidth / 2, y + chemostatLength / 5);\n bottomRight = new paper.Point(x - chemostatLength / 5 + flowChannelWidth / 2, y + chemostatLength + chemostatChannelWidth + chemostatLength / 5);\n serp.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n // left middle hori\n topLeft = new paper.Point(x - chemostatLength / 5, y + chemostatLength / 5 + chemostatLength / 2 - flowChannelWidth / 2);\n bottomRight = new paper.Point(x, y + chemostatLength / 5 + chemostatLength / 2 + flowChannelWidth / 2);\n serp.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n // bottom hori\n topLeft = new paper.Point(x - chemostatLength / 5 - flowChannelWidth / 2, y + chemostatLength + chemostatChannelWidth + chemostatLength / 5 - flowChannelWidth / 2);\n bottomRight = new paper.Point(\n x + chemostatChannelWidth / 2 + (3 * chemostatLength) / 5,\n y + chemostatLength + chemostatChannelWidth + chemostatLength / 5 + flowChannelWidth / 2\n );\n serp.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n // bottom left vert\n topLeft = new paper.Point(x + chemostatChannelWidth / 2 + chemostatLength / 4 - flowChannelWidth / 2, y + chemostatLength + chemostatChannelWidth / 2);\n bottomRight = new paper.Point(\n x + chemostatChannelWidth / 2 + chemostatLength / 4 + flowChannelWidth / 2,\n y + chemostatLength + chemostatChannelWidth + chemostatLength / 5\n );\n serp.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n // bottom middle vert\n topLeft = new paper.Point(x + chemostatChannelWidth / 2 + (3 * chemostatLength) / 5 - flowChannelWidth / 2, y + chemostatLength + chemostatChannelWidth / 2);\n bottomRight = new paper.Point(\n x + chemostatChannelWidth / 2 + (3 * chemostatLength) / 5 + flowChannelWidth / 2,\n y + chemostatLength + chemostatChannelWidth + (2 * chemostatLength) / 5\n );\n serp.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n // bottom right hori\n topLeft = new paper.Point(\n x + chemostatChannelWidth / 2 + (3 * chemostatLength) / 5 - flowChannelWidth / 2,\n y + chemostatLength + chemostatChannelWidth + (2 * chemostatLength) / 5 - flowChannelWidth / 2\n );\n bottomRight = new paper.Point(\n x + chemostatChannelWidth + chemostatLength + (2 * chemostatLength) / 5,\n y + chemostatLength + chemostatChannelWidth + (2 * chemostatLength) / 5 + flowChannelWidth / 2\n );\n serp.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n // right bottom vert\n topLeft = new paper.Point(\n x + chemostatChannelWidth + chemostatLength + (2 * chemostatLength) / 5 - flowChannelWidth / 2,\n y + chemostatChannelWidth / 2 + (7 * chemostatLength) / 11\n );\n bottomRight = new paper.Point(\n x + chemostatChannelWidth + chemostatLength + (2 * chemostatLength) / 5 + flowChannelWidth / 2,\n y + chemostatLength + chemostatChannelWidth + (2 * chemostatLength) / 5 + flowChannelWidth / 2\n );\n serp.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n center = new paper.Point(x + chemostatChannelWidth + chemostatLength + (2 * chemostatLength) / 5, y + chemostatChannelWidth / 2 + (7 * chemostatLength) / 11 - radius);\n serp.addChild(new paper.Path.Circle(center, radius));\n\n // right bottom hori\n topLeft = new paper.Point(\n x + chemostatChannelWidth + chemostatLength + chemostatLength / 5,\n y + chemostatLength + chemostatChannelWidth + chemostatLength / 5 - flowChannelWidth / 2\n );\n bottomRight = new paper.Point(\n x + chemostatChannelWidth + chemostatLength + (2 * chemostatLength) / 5,\n y + chemostatLength + chemostatChannelWidth + chemostatLength / 5 + flowChannelWidth / 2\n );\n serp.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n // right vert that goes to top\n topLeft = new paper.Point(x + chemostatChannelWidth + chemostatLength + chemostatLength / 5 - flowChannelWidth / 2, y - chemostatLength / 5);\n bottomRight = new paper.Point(\n x + chemostatChannelWidth + chemostatLength + chemostatLength / 5 + flowChannelWidth / 2,\n y + chemostatLength + chemostatChannelWidth + chemostatLength / 5 + flowChannelWidth / 2\n );\n serp.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n // right middle hori\n topLeft = new paper.Point(x + chemostatChannelWidth / 2 + chemostatLength, y + chemostatChannelWidth / 2 + (4 * chemostatLength) / 5 - flowChannelWidth / 2);\n bottomRight = new paper.Point(\n x + chemostatChannelWidth + chemostatLength + chemostatLength / 5,\n y + chemostatChannelWidth / 2 + (4 * chemostatLength) / 5 + flowChannelWidth / 2\n );\n serp.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n // right top hori\n topLeft = new paper.Point(x + chemostatChannelWidth / 2 + chemostatLength, y + chemostatChannelWidth / 2 + (2 * chemostatLength) / 5 - flowChannelWidth / 2);\n bottomRight = new paper.Point(\n x + chemostatChannelWidth + chemostatLength + chemostatLength / 5,\n y + chemostatChannelWidth / 2 + (2 * chemostatLength) / 5 + flowChannelWidth / 2\n );\n serp.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n // top hori\n topLeft = new paper.Point(x + chemostatChannelWidth / 2 + (3 * chemostatLength) / 7, y - chemostatLength / 5 - flowChannelWidth / 2);\n bottomRight = new paper.Point(x + chemostatChannelWidth + chemostatLength + chemostatLength / 5 + flowChannelWidth / 2, y - chemostatLength / 5 + flowChannelWidth / 2);\n serp.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n // top left vert\n topLeft = new paper.Point(x + chemostatChannelWidth / 2 + (3 * chemostatLength) / 7 - flowChannelWidth / 2, y - chemostatLength / 5 - flowChannelWidth / 2);\n bottomRight = new paper.Point(x + chemostatChannelWidth / 2 + (3 * chemostatLength) / 7 + flowChannelWidth / 2, y);\n serp.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n // top right vert\n topLeft = new paper.Point(x + (5 * chemostatLength) / 6 - flowChannelWidth / 2, y - chemostatLength / 5);\n bottomRight = new paper.Point(x + (5 * chemostatLength) / 6 + flowChannelWidth / 2, y);\n serp.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n serp.rotate(rotation, new paper.Point(x, y));\n serp.fillColor = color;\n return serp;\n }\n\n __drawControl(params: { [k: string]: any }) {\n const x = params.position[0];\n const y = params.position[1];\n const flowChannelWidth = params.flowChannelWidth;\n const controlChannelWidth = params.controlChannelWidth;\n const chemostatChannelWidth = params.chemostatChannelWidth;\n const volume = params.volume;\n const height = params.height;\n const radius = params.radius;\n const rotation = params.rotation;\n const color = params.color;\n\n const area = volume / height;\n const chemostatLength = area / (4 * chemostatChannelWidth);\n\n const control = new paper.CompoundPath(\"\");\n\n const valvelength = 1.5 * chemostatChannelWidth;\n const valvewidth = 2 * controlChannelWidth;\n const controlSpacing = chemostatLength / 10;\n\n const controlendpoint = (-7 * chemostatLength) / 8;\n const bendDist = chemostatLength / 15;\n\n // 1\n let topLeft = new paper.Point(x - chemostatLength / 3 - chemostatLength / 5 - controlChannelWidth / 2 - controlSpacing - radius, y + controlendpoint);\n let bottomRight = new paper.Point(x - chemostatLength / 3 - chemostatLength / 5 + controlChannelWidth / 2 - controlSpacing - radius, y - chemostatLength / 3 - bendDist);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n topLeft = new paper.Point(\n x - chemostatLength / 3 - chemostatLength / 5 - controlChannelWidth / 2 - controlSpacing - radius,\n y - chemostatLength / 3 - bendDist - controlChannelWidth / 2\n );\n bottomRight = new paper.Point(x - chemostatLength / 3 - chemostatLength / 5 - controlSpacing, y - chemostatLength / 3 - bendDist + controlChannelWidth / 2);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n topLeft = new paper.Point(\n x - chemostatLength / 3 - chemostatLength / 5 - controlSpacing - controlChannelWidth / 2,\n y - chemostatLength / 3 - bendDist - controlChannelWidth / 2\n );\n bottomRight = new paper.Point(x - chemostatLength / 3 - chemostatLength / 5 - controlSpacing + controlChannelWidth / 2, y - chemostatLength / 3);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n topLeft = new paper.Point(x - chemostatLength / 3 - chemostatLength / 5 - controlSpacing - valvewidth / 2, y - chemostatLength / 3 - valvelength / 2);\n bottomRight = new paper.Point(x - chemostatLength / 3 - chemostatLength / 5 - controlSpacing + valvewidth / 2, y - chemostatLength / 3 + valvelength / 2);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n // 2\n topLeft = new paper.Point(x - chemostatLength / 3 - chemostatLength / 5 - valvelength / 2, y - chemostatLength / 3 - controlSpacing - valvewidth / 2);\n bottomRight = new paper.Point(x - chemostatLength / 3 - chemostatLength / 5 + valvelength / 2, y - chemostatLength / 3 - controlSpacing + valvewidth / 2);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n topLeft = new paper.Point(x - chemostatLength / 3 - chemostatLength / 5, y - chemostatLength / 3 - controlSpacing - controlChannelWidth / 2);\n bottomRight = new paper.Point(x - chemostatLength / 3 - chemostatLength / 5 + 1.3 * radius, y - chemostatLength / 3 - controlSpacing + controlChannelWidth / 2);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n topLeft = new paper.Point(x - chemostatLength / 3 - chemostatLength / 5 + 1.3 * radius - controlChannelWidth / 2, y + controlendpoint);\n bottomRight = new paper.Point(\n x - chemostatLength / 3 - chemostatLength / 5 + 1.3 * radius + controlChannelWidth / 2,\n y - chemostatLength / 3 - controlSpacing + controlChannelWidth / 2\n );\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n // 3\n topLeft = new paper.Point(x - chemostatLength / 3 - chemostatLength / 5 + controlSpacing - valvewidth / 2, y - chemostatLength / 3 - valvelength / 2);\n bottomRight = new paper.Point(x - chemostatLength / 3 - chemostatLength / 5 + controlSpacing + valvewidth / 2, y - chemostatLength / 3 + valvelength / 2);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n topLeft = new paper.Point(x - chemostatLength / 3 - chemostatLength / 5 + controlSpacing - controlChannelWidth / 2, y - chemostatLength / 3 - bendDist);\n bottomRight = new paper.Point(x - chemostatLength / 3 - chemostatLength / 5 + controlSpacing + controlChannelWidth / 2, y - chemostatLength / 3);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n topLeft = new paper.Point(\n x - chemostatLength / 3 - chemostatLength / 5 + controlSpacing - controlChannelWidth / 2,\n y - chemostatLength / 3 - bendDist - controlChannelWidth / 2\n );\n bottomRight = new paper.Point(x - chemostatLength / 3 - chemostatLength / 5 + 1.7 * radius, y - chemostatLength / 3 - bendDist + controlChannelWidth / 2);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n topLeft = new paper.Point(x - chemostatLength / 3 - chemostatLength / 5 + 1.7 * radius - controlChannelWidth / 2, y + controlendpoint);\n bottomRight = new paper.Point(\n x - chemostatLength / 3 - chemostatLength / 5 + 1.7 * radius + controlChannelWidth / 2,\n y - chemostatLength / 3 - bendDist + controlChannelWidth / 2\n );\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n // 4\n topLeft = new paper.Point(x - chemostatLength / 3 + chemostatLength / 5 - controlChannelWidth / 2 - controlSpacing - radius, y + controlendpoint);\n bottomRight = new paper.Point(x - chemostatLength / 3 + chemostatLength / 5 + controlChannelWidth / 2 - controlSpacing - radius, y - chemostatLength / 3 - bendDist);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n topLeft = new paper.Point(\n x - chemostatLength / 3 + chemostatLength / 5 - controlChannelWidth / 2 - controlSpacing - radius,\n y - chemostatLength / 3 - bendDist - controlChannelWidth / 2\n );\n bottomRight = new paper.Point(x - chemostatLength / 3 + chemostatLength / 5 - controlSpacing, y - chemostatLength / 3 - bendDist + controlChannelWidth / 2);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n topLeft = new paper.Point(\n x - chemostatLength / 3 + chemostatLength / 5 - controlSpacing - controlChannelWidth / 2,\n y - chemostatLength / 3 - bendDist - controlChannelWidth / 2\n );\n bottomRight = new paper.Point(x - chemostatLength / 3 + chemostatLength / 5 - controlSpacing + controlChannelWidth / 2, y - chemostatLength / 3);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n topLeft = new paper.Point(x - chemostatLength / 3 + chemostatLength / 5 - controlSpacing - valvewidth / 2, y - chemostatLength / 3 - valvelength / 2);\n bottomRight = new paper.Point(x - chemostatLength / 3 + chemostatLength / 5 - controlSpacing + valvewidth / 2, y - chemostatLength / 3 + valvelength / 2);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n // 5\n topLeft = new paper.Point(x - chemostatLength / 3 + chemostatLength / 5 - valvelength / 2, y - chemostatLength / 3 - controlSpacing - valvewidth / 2);\n bottomRight = new paper.Point(x - chemostatLength / 3 + chemostatLength / 5 + valvelength / 2, y - chemostatLength / 3 - controlSpacing + valvewidth / 2);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n topLeft = new paper.Point(x - chemostatLength / 3 + chemostatLength / 5, y - chemostatLength / 3 - controlSpacing - controlChannelWidth / 2);\n bottomRight = new paper.Point(x - chemostatLength / 3 + chemostatLength / 5 + 1.3 * radius, y - chemostatLength / 3 - controlSpacing + controlChannelWidth / 2);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n topLeft = new paper.Point(x - chemostatLength / 3 + chemostatLength / 5 + 1.3 * radius - controlChannelWidth / 2, y + controlendpoint);\n bottomRight = new paper.Point(\n x - chemostatLength / 3 + chemostatLength / 5 + 1.3 * radius + controlChannelWidth / 2,\n y - chemostatLength / 3 - controlSpacing + controlChannelWidth / 2\n );\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n // 6\n topLeft = new paper.Point(x - chemostatLength / 3 + chemostatLength / 5 + controlSpacing - valvewidth / 2, y - chemostatLength / 3 - valvelength / 2);\n bottomRight = new paper.Point(x - chemostatLength / 3 + chemostatLength / 5 + controlSpacing + valvewidth / 2, y - chemostatLength / 3 + valvelength / 2);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n topLeft = new paper.Point(x - chemostatLength / 3 + chemostatLength / 5 + controlSpacing - controlChannelWidth / 2, y - chemostatLength / 3 - bendDist);\n bottomRight = new paper.Point(x - chemostatLength / 3 + chemostatLength / 5 + controlSpacing + controlChannelWidth / 2, y - chemostatLength / 3);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n topLeft = new paper.Point(\n x - chemostatLength / 3 + chemostatLength / 5 + controlSpacing - controlChannelWidth / 2,\n y - chemostatLength / 3 - bendDist - controlChannelWidth / 2\n );\n bottomRight = new paper.Point(x - chemostatLength / 3 + chemostatLength / 5 + 1.7 * radius, y - chemostatLength / 3 - bendDist + controlChannelWidth / 2);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n topLeft = new paper.Point(x - chemostatLength / 3 + chemostatLength / 5 + 1.7 * radius - controlChannelWidth / 2, y + controlendpoint);\n bottomRight = new paper.Point(\n x - chemostatLength / 3 + chemostatLength / 5 + 1.7 * radius + controlChannelWidth / 2,\n y - chemostatLength / 3 - bendDist + controlChannelWidth / 2\n );\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n // top left vert\n let originx = chemostatChannelWidth / 2 + (3 * chemostatLength) / 7;\n let originy = chemostatChannelWidth / 2;\n // 7\n topLeft = new paper.Point(x + originx - controlChannelWidth / 2 - controlSpacing - 0.5 * radius, y + controlendpoint);\n bottomRight = new paper.Point(x + originx + controlChannelWidth / 2 - controlSpacing - 0.5 * radius, y + originy - bendDist);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n topLeft = new paper.Point(x + originx - controlChannelWidth / 2 - controlSpacing - 0.5 * radius, y + originy - bendDist - controlChannelWidth / 2);\n bottomRight = new paper.Point(x + originx - controlSpacing, y + originy - bendDist + controlChannelWidth / 2);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n topLeft = new paper.Point(x + originx - controlSpacing - controlChannelWidth / 2, y + originy - bendDist - controlChannelWidth / 2);\n bottomRight = new paper.Point(x + originx - controlSpacing + controlChannelWidth / 2, y + originy);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n topLeft = new paper.Point(x + originx - controlSpacing - valvewidth / 2, y + originy - valvelength / 2);\n bottomRight = new paper.Point(x + originx - controlSpacing + valvewidth / 2, y + originy + valvelength / 2);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n // 8\n topLeft = new paper.Point(x + originx - valvelength / 2, y + originy - controlSpacing - valvewidth / 2);\n bottomRight = new paper.Point(x + originx + valvelength / 2, y + originy - controlSpacing + valvewidth / 2);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n topLeft = new paper.Point(x + originx, y + originy - controlSpacing - controlChannelWidth / 2);\n bottomRight = new paper.Point(x + originx + 1.3 * radius, y + originy - controlSpacing + controlChannelWidth / 2);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n topLeft = new paper.Point(x + originx + 1.3 * radius - controlChannelWidth / 2, y + controlendpoint);\n bottomRight = new paper.Point(x + originx + 1.3 * radius + controlChannelWidth / 2, y + originy - controlSpacing + controlChannelWidth / 2);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n // 9\n topLeft = new paper.Point(x + originx + controlSpacing - valvewidth / 2, y + originy - valvelength / 2);\n bottomRight = new paper.Point(x + originx + controlSpacing + valvewidth / 2, y + originy + valvelength / 2);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n topLeft = new paper.Point(x + originx + controlSpacing - controlChannelWidth / 2, y + originy - bendDist);\n bottomRight = new paper.Point(x + originx + controlSpacing + controlChannelWidth / 2, y + originy);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n topLeft = new paper.Point(x + originx + controlSpacing - controlChannelWidth / 2, y + originy - bendDist - controlChannelWidth / 2);\n bottomRight = new paper.Point(x + originx + 1.7 * radius, y + originy - bendDist + controlChannelWidth / 2);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n topLeft = new paper.Point(x + originx + 1.7 * radius - controlChannelWidth / 2, y + controlendpoint);\n bottomRight = new paper.Point(x + originx + 1.7 * radius + controlChannelWidth / 2, y + originy - bendDist + controlChannelWidth / 2);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n // top right vert\n originx = (5 * chemostatLength) / 6;\n originy = chemostatChannelWidth / 2;\n // 10\n topLeft = new paper.Point(x + originx - controlChannelWidth / 2 - controlSpacing - 0.5 * radius, y + controlendpoint);\n bottomRight = new paper.Point(x + originx + controlChannelWidth / 2 - controlSpacing - 0.5 * radius, y + originy - bendDist);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n topLeft = new paper.Point(x + originx - controlChannelWidth / 2 - controlSpacing - 0.5 * radius, y + originy - bendDist - controlChannelWidth / 2);\n bottomRight = new paper.Point(x + originx - controlSpacing, y + originy - bendDist + controlChannelWidth / 2);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n topLeft = new paper.Point(x + originx - controlSpacing - controlChannelWidth / 2, y + originy - bendDist - controlChannelWidth / 2);\n bottomRight = new paper.Point(x + originx - controlSpacing + controlChannelWidth / 2, y + originy);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n topLeft = new paper.Point(x + originx - controlSpacing - valvewidth / 2, y + originy - valvelength / 2);\n bottomRight = new paper.Point(x + originx - controlSpacing + valvewidth / 2, y + originy + valvelength / 2);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n // 11\n topLeft = new paper.Point(x + originx - valvelength / 2, y + originy - controlSpacing - valvewidth / 2);\n bottomRight = new paper.Point(x + originx + valvelength / 2, y + originy - controlSpacing + valvewidth / 2);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n topLeft = new paper.Point(x + originx, y + originy - controlSpacing - controlChannelWidth / 2);\n bottomRight = new paper.Point(x + originx + 1.3 * radius, y + originy - controlSpacing + controlChannelWidth / 2);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n topLeft = new paper.Point(x + originx + 1.3 * radius - controlChannelWidth / 2, y + controlendpoint);\n bottomRight = new paper.Point(x + originx + 1.3 * radius + controlChannelWidth / 2, y + originy - controlSpacing + controlChannelWidth / 2);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n // 12\n topLeft = new paper.Point(x + originx + controlSpacing - valvewidth / 2, y + originy - valvelength / 2);\n bottomRight = new paper.Point(x + originx + controlSpacing + valvewidth / 2, y + originy + valvelength / 2);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n topLeft = new paper.Point(x + originx + controlSpacing - controlChannelWidth / 2, y + originy - bendDist);\n bottomRight = new paper.Point(x + originx + controlSpacing + controlChannelWidth / 2, y + originy);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n topLeft = new paper.Point(x + originx + controlSpacing - controlChannelWidth / 2, y + originy - bendDist - controlChannelWidth / 2);\n bottomRight = new paper.Point(x + originx + 1.7 * radius, y + originy - bendDist + controlChannelWidth / 2);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n topLeft = new paper.Point(x + originx + 1.7 * radius - controlChannelWidth / 2, y + controlendpoint);\n bottomRight = new paper.Point(x + originx + 1.7 * radius + controlChannelWidth / 2, y + originy - bendDist + controlChannelWidth / 2);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n // left top\n originx = chemostatChannelWidth / 2;\n originy = chemostatLength / 5;\n\n // 13\n topLeft = new paper.Point(x + originx - valvelength / 2, y + originy - controlSpacing - valvewidth / 2);\n bottomRight = new paper.Point(x + originx + valvelength / 2, y + originy - controlSpacing + valvewidth / 2);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n topLeft = new paper.Point(x + originx - bendDist - controlChannelWidth / 2, y + originy - controlSpacing - controlChannelWidth / 2);\n bottomRight = new paper.Point(x + originx, y + originy - controlSpacing + controlChannelWidth / 2);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n topLeft = new paper.Point(x + originx - bendDist - controlChannelWidth / 2, y + originy - controlChannelWidth / 2 - controlSpacing - 0.5 * radius);\n bottomRight = new paper.Point(x + originx - bendDist + controlChannelWidth / 2, y + originy - controlSpacing);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n topLeft = new paper.Point(x + controlendpoint, y + originy - controlChannelWidth / 2 - controlSpacing - 0.5 * radius);\n bottomRight = new paper.Point(x + originx - bendDist, y + originy + controlChannelWidth / 2 - controlSpacing - 0.5 * radius);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n // 14\n topLeft = new paper.Point(x + originx - controlSpacing - valvewidth / 2, y + originy - valvelength / 2);\n bottomRight = new paper.Point(x + originx - controlSpacing + valvewidth / 2, y + originy + valvelength / 2);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n topLeft = new paper.Point(x + originx - controlSpacing - controlChannelWidth / 2, y + originy);\n bottomRight = new paper.Point(x + originx - controlSpacing + controlChannelWidth / 2, y + originy + 1.3 * radius);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n topLeft = new paper.Point(x + controlendpoint, y + originy + 1.3 * radius - controlChannelWidth / 2);\n bottomRight = new paper.Point(x + originx - controlSpacing + controlChannelWidth / 2, y + originy + 1.3 * radius + controlChannelWidth / 2);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n // 15\n topLeft = new paper.Point(x + originx - valvelength / 2, y + originy + controlSpacing - valvewidth / 2);\n bottomRight = new paper.Point(x + originx + valvelength / 2, y + originy + controlSpacing + valvewidth / 2);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n topLeft = new paper.Point(x + originx - bendDist, y + originy + controlSpacing - controlChannelWidth / 2);\n bottomRight = new paper.Point(x + originx, y + originy + controlSpacing + controlChannelWidth / 2);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n topLeft = new paper.Point(x + originx - bendDist - controlChannelWidth / 2, y + originy + controlSpacing - controlChannelWidth / 2);\n bottomRight = new paper.Point(x + originx - bendDist + controlChannelWidth / 2, y + originy + 1.7 * radius);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n topLeft = new paper.Point(x + controlendpoint, y + originy + 1.7 * radius - controlChannelWidth / 2);\n bottomRight = new paper.Point(x + originx - bendDist + controlChannelWidth / 2, y + originy + 1.7 * radius + controlChannelWidth / 2);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n // left bottom\n originx = chemostatChannelWidth / 2;\n originy = chemostatLength / 5 + chemostatLength / 2;\n\n // 16\n topLeft = new paper.Point(x + originx - valvelength / 2, y + originy - controlSpacing - valvewidth / 2);\n bottomRight = new paper.Point(x + originx + valvelength / 2, y + originy - controlSpacing + valvewidth / 2);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n topLeft = new paper.Point(x + originx - bendDist - controlChannelWidth / 2, y + originy - controlSpacing - controlChannelWidth / 2);\n bottomRight = new paper.Point(x + originx, y + originy - controlSpacing + controlChannelWidth / 2);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n topLeft = new paper.Point(x + originx - bendDist - controlChannelWidth / 2, y + originy - controlChannelWidth / 2 - controlSpacing - 0.5 * radius);\n bottomRight = new paper.Point(x + originx - bendDist + controlChannelWidth / 2, y + originy - controlSpacing);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n topLeft = new paper.Point(x + controlendpoint, y + originy - controlChannelWidth / 2 - controlSpacing - 0.5 * radius);\n bottomRight = new paper.Point(x + originx - bendDist, y + originy + controlChannelWidth / 2 - controlSpacing - 0.5 * radius);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n // 17\n topLeft = new paper.Point(x + originx - controlSpacing - valvewidth / 2, y + originy - valvelength / 2);\n bottomRight = new paper.Point(x + originx - controlSpacing + valvewidth / 2, y + originy + valvelength / 2);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n topLeft = new paper.Point(x + originx - controlSpacing - controlChannelWidth / 2, y + originy);\n bottomRight = new paper.Point(x + originx - controlSpacing + controlChannelWidth / 2, y + originy + 1.3 * radius);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n topLeft = new paper.Point(x + controlendpoint, y + originy + 1.3 * radius - controlChannelWidth / 2);\n bottomRight = new paper.Point(x + originx - controlSpacing + controlChannelWidth / 2, y + originy + 1.3 * radius + controlChannelWidth / 2);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n // 18\n topLeft = new paper.Point(x + originx - valvelength / 2, y + originy + controlSpacing - valvewidth / 2);\n bottomRight = new paper.Point(x + originx + valvelength / 2, y + originy + controlSpacing + valvewidth / 2);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n topLeft = new paper.Point(x + originx - bendDist, y + originy + controlSpacing - controlChannelWidth / 2);\n bottomRight = new paper.Point(x + originx, y + originy + controlSpacing + controlChannelWidth / 2);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n topLeft = new paper.Point(x + originx - bendDist - controlChannelWidth / 2, y + originy + controlSpacing - controlChannelWidth / 2);\n bottomRight = new paper.Point(x + originx - bendDist + controlChannelWidth / 2, y + originy + 1.7 * radius);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n topLeft = new paper.Point(x + controlendpoint, y + originy + 1.7 * radius - controlChannelWidth / 2);\n bottomRight = new paper.Point(x + originx - bendDist + controlChannelWidth / 2, y + originy + 1.7 * radius + controlChannelWidth / 2);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n // right top\n originx = chemostatChannelWidth / 2 + chemostatLength;\n originy = chemostatChannelWidth / 2 + (2 * chemostatLength) / 5;\n\n // 19\n topLeft = new paper.Point(x + originx - valvelength / 2, y + originy - controlSpacing - valvewidth / 2);\n bottomRight = new paper.Point(x + originx + valvelength / 2, y + originy - controlSpacing + valvewidth / 2);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n topLeft = new paper.Point(x + originx + bendDist - controlChannelWidth / 2, y + originy - controlSpacing - controlChannelWidth / 2);\n bottomRight = new paper.Point(x + originx, y + originy - controlSpacing + controlChannelWidth / 2);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n topLeft = new paper.Point(x + originx + bendDist - controlChannelWidth / 2, y + originy - controlChannelWidth / 2 - controlSpacing - 0.5 * radius);\n bottomRight = new paper.Point(x + originx + bendDist + controlChannelWidth / 2, y + originy - controlSpacing + controlChannelWidth / 2);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n topLeft = new paper.Point(x + 2 * chemostatLength, y + originy - controlChannelWidth / 2 - controlSpacing - 0.5 * radius);\n bottomRight = new paper.Point(x + originx + bendDist, y + originy + controlChannelWidth / 2 - controlSpacing - 0.5 * radius);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n // 20\n topLeft = new paper.Point(x + originx + controlSpacing - valvewidth / 2, y + originy - valvelength / 2);\n bottomRight = new paper.Point(x + originx + controlSpacing + valvewidth / 2, y + originy + valvelength / 2);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n topLeft = new paper.Point(x + originx + controlSpacing - controlChannelWidth / 2, y + originy);\n bottomRight = new paper.Point(x + originx + controlSpacing + controlChannelWidth / 2, y + originy + 1.3 * radius);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n topLeft = new paper.Point(x + 2 * chemostatLength, y + originy + 1.3 * radius - controlChannelWidth / 2);\n bottomRight = new paper.Point(x + originx + controlSpacing - controlChannelWidth / 2, y + originy + 1.3 * radius + controlChannelWidth / 2);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n // 21\n topLeft = new paper.Point(x + originx - valvelength / 2, y + originy + controlSpacing - valvewidth / 2);\n bottomRight = new paper.Point(x + originx + valvelength / 2, y + originy + controlSpacing + valvewidth / 2);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n topLeft = new paper.Point(x + originx + bendDist, y + originy + controlSpacing - controlChannelWidth / 2);\n bottomRight = new paper.Point(x + originx, y + originy + controlSpacing + controlChannelWidth / 2);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n topLeft = new paper.Point(x + originx + bendDist - controlChannelWidth / 2, y + originy + controlSpacing - controlChannelWidth / 2);\n bottomRight = new paper.Point(x + originx + bendDist + controlChannelWidth / 2, y + originy + 1.7 * radius);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n topLeft = new paper.Point(x + 2 * chemostatLength, y + originy + 1.7 * radius - controlChannelWidth / 2);\n bottomRight = new paper.Point(x + originx + bendDist - controlChannelWidth / 2, y + originy + 1.7 * radius + controlChannelWidth / 2);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n // right bottom\n originx = chemostatChannelWidth / 2 + chemostatLength;\n originy = chemostatChannelWidth / 2 + (4 * chemostatLength) / 5;\n\n // 22\n topLeft = new paper.Point(x + originx - valvelength / 2, y + originy - controlSpacing - valvewidth / 2);\n bottomRight = new paper.Point(x + originx + valvelength / 2, y + originy - controlSpacing + valvewidth / 2);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n topLeft = new paper.Point(x + originx + bendDist - controlChannelWidth / 2, y + originy - controlSpacing - controlChannelWidth / 2);\n bottomRight = new paper.Point(x + originx, y + originy - controlSpacing + controlChannelWidth / 2);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n topLeft = new paper.Point(x + originx + bendDist - controlChannelWidth / 2, y + originy - controlChannelWidth / 2 - controlSpacing - 0.5 * radius);\n bottomRight = new paper.Point(x + originx + bendDist + controlChannelWidth / 2, y + originy - controlSpacing + controlChannelWidth / 2);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n topLeft = new paper.Point(x + 2 * chemostatLength, y + originy - controlChannelWidth / 2 - controlSpacing - 0.5 * radius);\n bottomRight = new paper.Point(x + originx + bendDist, y + originy + controlChannelWidth / 2 - controlSpacing - 0.5 * radius);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n // 23\n topLeft = new paper.Point(x + originx + controlSpacing - valvewidth / 2, y + originy - valvelength / 2);\n bottomRight = new paper.Point(x + originx + controlSpacing + valvewidth / 2, y + originy + valvelength / 2);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n topLeft = new paper.Point(x + originx + controlSpacing - controlChannelWidth / 2, y + originy);\n bottomRight = new paper.Point(x + originx + controlSpacing + controlChannelWidth / 2, y + originy + 1.3 * radius);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n topLeft = new paper.Point(x + 2 * chemostatLength, y + originy + 1.3 * radius - controlChannelWidth / 2);\n bottomRight = new paper.Point(x + originx + controlSpacing - controlChannelWidth / 2, y + originy + 1.3 * radius + controlChannelWidth / 2);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n // 24\n topLeft = new paper.Point(x + originx - valvelength / 2, y + originy + controlSpacing - valvewidth / 2);\n bottomRight = new paper.Point(x + originx + valvelength / 2, y + originy + controlSpacing + valvewidth / 2);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n topLeft = new paper.Point(x + originx + bendDist, y + originy + controlSpacing - controlChannelWidth / 2);\n bottomRight = new paper.Point(x + originx, y + originy + controlSpacing + controlChannelWidth / 2);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n topLeft = new paper.Point(x + originx + bendDist - controlChannelWidth / 2, y + originy + controlSpacing - controlChannelWidth / 2);\n bottomRight = new paper.Point(x + originx + bendDist + controlChannelWidth / 2, y + originy + 1.7 * radius);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n topLeft = new paper.Point(x + 2 * chemostatLength, y + originy + 1.7 * radius - controlChannelWidth / 2);\n bottomRight = new paper.Point(x + originx + bendDist - controlChannelWidth / 2, y + originy + 1.7 * radius + controlChannelWidth / 2);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n // bottom left\n originx = chemostatChannelWidth / 2 + chemostatLength / 4;\n originy = chemostatLength + chemostatChannelWidth / 2;\n\n // 25\n topLeft = new paper.Point(x + originx - 0.3 * controlSpacing - valvewidth / 2, y + originy - valvelength / 2);\n bottomRight = new paper.Point(x + originx - 0.3 * controlSpacing + valvewidth / 2, y + originy + valvelength / 2);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n topLeft = new paper.Point(x + originx - controlChannelWidth / 2 - 0.3 * controlSpacing, y + originy);\n bottomRight = new paper.Point(x + originx + controlChannelWidth / 2 - 0.3 * controlSpacing, y + 2 * chemostatLength);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n // 26\n topLeft = new paper.Point(x + originx - valvelength / 2, y + originy + controlSpacing - valvewidth / 2);\n bottomRight = new paper.Point(x + originx + valvelength / 2, y + originy + controlSpacing + valvewidth / 2);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n topLeft = new paper.Point(x + originx, y + originy + controlSpacing - controlChannelWidth / 2);\n bottomRight = new paper.Point(x + originx + 0.5 * controlSpacing, y + originy + controlSpacing + controlChannelWidth / 2);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n topLeft = new paper.Point(x + originx + 0.5 * controlSpacing - controlChannelWidth / 2, y + originy + controlSpacing - controlChannelWidth / 2);\n bottomRight = new paper.Point(x + originx + 0.5 * controlSpacing + controlChannelWidth / 2, y + 2 * chemostatLength);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n // 27\n topLeft = new paper.Point(x + originx + 0.3 * controlSpacing - valvewidth / 2, y + originy - valvelength / 2);\n bottomRight = new paper.Point(x + originx + 0.3 * controlSpacing + valvewidth / 2, y + originy + valvelength / 2);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n topLeft = new paper.Point(x + originx + 0.3 * controlSpacing - controlChannelWidth / 2, y + originy);\n bottomRight = new paper.Point(x + originx + 0.3 * controlSpacing + controlChannelWidth / 2, y + originy + bendDist);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n topLeft = new paper.Point(x + originx + 0.3 * controlSpacing - controlChannelWidth / 2, y + originy + bendDist - controlChannelWidth / 2);\n bottomRight = new paper.Point(x + originx + 0.3 * controlSpacing + 0.4 * controlSpacing, y + originy + bendDist + controlChannelWidth / 2);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n topLeft = new paper.Point(x + originx - controlChannelWidth / 2 + 0.4 * controlSpacing + 0.3 * controlSpacing, y + originy - controlChannelWidth / 2 + bendDist);\n bottomRight = new paper.Point(x + originx + controlChannelWidth / 2 + 0.4 * controlSpacing + 0.3 * controlSpacing, y + 2 * chemostatLength);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n // bottom middle\n originx = chemostatChannelWidth / 2 + (3 * chemostatLength) / 7;\n originy = chemostatLength + chemostatChannelWidth / 2;\n\n // 28\n topLeft = new paper.Point(x + originx - 0.3 * controlSpacing - valvewidth / 2, y + originy - valvelength / 2);\n bottomRight = new paper.Point(x + originx - 0.3 * controlSpacing + valvewidth / 2, y + originy + valvelength / 2);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n topLeft = new paper.Point(x + originx - controlChannelWidth / 2 - 0.3 * controlSpacing, y + originy);\n bottomRight = new paper.Point(x + originx + controlChannelWidth / 2 - 0.3 * controlSpacing, y + 2 * chemostatLength);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n // 29\n topLeft = new paper.Point(x + originx - valvelength / 2, y + originy - controlSpacing - valvewidth / 2);\n bottomRight = new paper.Point(x + originx + valvelength / 2, y + originy - controlSpacing + valvewidth / 2);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n topLeft = new paper.Point(x + originx, y + originy - controlSpacing - controlChannelWidth / 2);\n bottomRight = new paper.Point(x + originx - 0.5 * controlSpacing, y + originy - controlSpacing + controlChannelWidth / 2);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n topLeft = new paper.Point(x + originx - 0.5 * controlSpacing - controlChannelWidth / 2, y + originy - controlSpacing - controlChannelWidth / 2);\n bottomRight = new paper.Point(x + originx - 0.5 * controlSpacing + controlChannelWidth / 2, y + 2 * chemostatLength);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n // 30\n topLeft = new paper.Point(x + originx + 0.3 * controlSpacing - valvewidth / 2, y + originy - valvelength / 2);\n bottomRight = new paper.Point(x + originx + 0.3 * controlSpacing + valvewidth / 2, y + originy + valvelength / 2);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n topLeft = new paper.Point(x + originx - controlChannelWidth / 2 + 0.3 * controlSpacing, y + originy);\n bottomRight = new paper.Point(x + originx + controlChannelWidth / 2 + 0.3 * controlSpacing, y + 2 * chemostatLength);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n // 31\n topLeft = new paper.Point(x + originx + 0.55 * controlSpacing - valvewidth / 2, y + originy - valvelength);\n bottomRight = new paper.Point(x + originx + 0.55 * controlSpacing + valvewidth / 2, y + originy + valvelength);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n topLeft = new paper.Point(x + originx + 0.55 * controlSpacing - controlChannelWidth / 2, y + originy);\n bottomRight = new paper.Point(x + originx + 0.55 * controlSpacing + controlChannelWidth / 2, y + 2 * chemostatLength);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n // 32\n topLeft = new paper.Point(x + originx + 0.85 * controlSpacing - valvewidth / 2, y + originy - valvelength);\n bottomRight = new paper.Point(x + originx + 0.85 * controlSpacing + valvewidth / 2, y + originy + valvelength);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n topLeft = new paper.Point(x + originx + 0.85 * controlSpacing - controlChannelWidth / 2, y + originy);\n bottomRight = new paper.Point(x + originx + 0.85 * controlSpacing + controlChannelWidth / 2, y + 2 * chemostatLength);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n // 33\n topLeft = new paper.Point(x + originx + 1.15 * controlSpacing - valvewidth / 2, y + originy - valvelength);\n bottomRight = new paper.Point(x + originx + 1.15 * controlSpacing + valvewidth / 2, y + originy + valvelength);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n topLeft = new paper.Point(x + originx + 1.15 * controlSpacing - controlChannelWidth / 2, y + originy);\n bottomRight = new paper.Point(x + originx + 1.15 * controlSpacing + controlChannelWidth / 2, y + 2 * chemostatLength);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n // bottom right\n originx = chemostatChannelWidth / 2 + (3 * chemostatLength) / 5;\n originy = chemostatLength + chemostatChannelWidth / 2;\n\n // 34\n topLeft = new paper.Point(x + originx - 0.3 * controlSpacing - valvewidth / 2, y + originy - valvelength / 2);\n bottomRight = new paper.Point(x + originx - 0.3 * controlSpacing + valvewidth / 2, y + originy + valvelength / 2);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n topLeft = new paper.Point(x + originx - controlChannelWidth / 2 - 0.3 * controlSpacing, y + originy);\n bottomRight = new paper.Point(x + originx + controlChannelWidth / 2 - 0.3 * controlSpacing, y + 2 * chemostatLength);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n // 35\n topLeft = new paper.Point(x + originx - valvelength / 2, y + originy + controlSpacing - valvewidth / 2);\n bottomRight = new paper.Point(x + originx + valvelength / 2, y + originy + controlSpacing + valvewidth / 2);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n topLeft = new paper.Point(x + originx, y + originy + controlSpacing - controlChannelWidth / 2);\n bottomRight = new paper.Point(x + originx + 0.5 * controlSpacing, y + originy + controlSpacing + controlChannelWidth / 2);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n topLeft = new paper.Point(x + originx + 0.5 * controlSpacing - controlChannelWidth / 2, y + originy + controlSpacing - controlChannelWidth / 2);\n bottomRight = new paper.Point(x + originx + 0.5 * controlSpacing + controlChannelWidth / 2, y + 2 * chemostatLength);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n // 36\n topLeft = new paper.Point(x + originx + 0.3 * controlSpacing - valvewidth / 2, y + originy - valvelength / 2);\n bottomRight = new paper.Point(x + originx + 0.3 * controlSpacing + valvewidth / 2, y + originy + valvelength / 2);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n topLeft = new paper.Point(x + originx + 0.3 * controlSpacing - controlChannelWidth / 2, y + originy);\n bottomRight = new paper.Point(x + originx + 0.3 * controlSpacing + controlChannelWidth / 2, y + originy + bendDist);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n topLeft = new paper.Point(x + originx + 0.3 * controlSpacing - controlChannelWidth / 2, y + originy + bendDist - controlChannelWidth / 2);\n bottomRight = new paper.Point(x + originx + 0.3 * controlSpacing + 0.4 * controlSpacing, y + originy + bendDist + controlChannelWidth / 2);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n topLeft = new paper.Point(x + originx - controlChannelWidth / 2 + 0.4 * controlSpacing + 0.3 * controlSpacing, y + originy - controlChannelWidth / 2 + bendDist);\n bottomRight = new paper.Point(x + originx + controlChannelWidth / 2 + 0.4 * controlSpacing + 0.3 * controlSpacing, y + 2 * chemostatLength);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n control.rotate(rotation, new paper.Point(x, y));\n control.fillColor = color;\n return control;\n }\n\n render2DTarget(key: string | null, params: { [k: string]: any }) {\n const serp = this.__drawFlow(params);\n serp.addChild(this.__drawControl(params));\n\n serp.fillColor!.alpha = 0.5;\n return serp;\n }\n}\n","import Template from \"./template\";\nimport paper from \"paper\";\nimport ComponentPort from \"../core/componentPort\";\nimport { LogicalLayerType } from \"../core/init\";\n\nexport default class Incubation extends Template {\n constructor() {\n super();\n }\n\n __setupDefinitions(): void {\n this.__unique = {\n position: \"Point\"\n };\n\n this.__heritable = {\n componentSpacing: \"Float\",\n rotation: \"Float\",\n channelWidth: \"Float\",\n length: \"Float\",\n width: \"Float\",\n height: \"Float\"\n };\n\n this.__defaults = {\n componentSpacing: 1000,\n rotation: 0,\n channelWidth: 0.8 * 1000,\n width: 1.23 * 1000,\n length: 4.92 * 1000,\n height: 250\n };\n\n this.__units = {\n componentSpacing: \"μm\",\n rotation: \"°\",\n channelWidth: \"μm\",\n length: \"μm\",\n width: \"μm\",\n height: \"μm\"\n };\n\n this.__minimum = {\n componentSpacing: 0,\n rotation: 0,\n channelWidth: 10,\n width: 30,\n length: 120,\n height: 10\n };\n\n this.__maximum = {\n componentSpacing: 10000,\n rotation: 360,\n channelWidth: 2000,\n width: 6000,\n length: 24 * 1000,\n height: 1200\n };\n\n this.__featureParams = {\n componentSpacing: \"componentSpacing\",\n position: \"position\",\n rotation: \"rotation\",\n channelWidth: \"channelWidth\",\n length: \"length\",\n width: \"width\"\n };\n\n this.__targetParams = {\n componentSpacing: \"componentSpacing\",\n channelWidth: \"channelWidth\",\n length: \"length\",\n width: \"width\",\n rotation: \"rotation\"\n };\n\n this.__placementTool = \"componentPositionTool\";\n\n this.__toolParams = {\n position: \"position\"\n };\n\n this.__renderKeys = [\"FLOW\"];\n\n this.__mint = \"INCUBATION\";\n\n this.__zOffsetKeys = {\n FLOW: \"height\"\n };\n\n this.__substrateOffset = {\n FLOW: \"0\"\n };\n }\n\n getPorts(params: { [k: string]: any }) {\n const length = params.length;\n\n const ports = [];\n\n ports.push(new ComponentPort(0, -length / 2, \"1\", LogicalLayerType.FLOW));\n\n ports.push(new ComponentPort(0, length / 2, \"2\", LogicalLayerType.FLOW));\n\n return ports;\n }\n\n render2D(params: { [k: string]: any }, key: string) {\n const position = params.position;\n const px = position[0];\n const py = position[1];\n const cw = params.channelWidth;\n const l = params.length;\n const w = params.width;\n const rotation = params.rotation;\n const color = params.color;\n let p0, p1, p2, p3, p4, p5;\n // if (rotation === \"H\") {\n // p0 = [px - l / 2, py - cw / 2];\n // p1 = [px - l / 2, py + cw / 2];\n // p2 = [px, py + w + cw / 2];\n // p3 = [px + l / 2, py + cw / 2];\n // p4 = [px + l / 2, py - cw / 2];\n // p5 = [px, py - cw / 2 - w];\n // } else {\n p0 = [px - cw / 2, py - l / 2];\n p1 = [px + cw / 2, py - l / 2];\n p2 = [px + w + cw / 2, py];\n p3 = [px + cw / 2, py + l / 2];\n p4 = [px - cw / 2, py + l / 2];\n p5 = [px - cw / 2 - w, py];\n // }\n const hex = new paper.Path();\n hex.add(new paper.Point(p0));\n hex.add(new paper.Point(p1));\n hex.add(new paper.Point(p2));\n hex.add(new paper.Point(p3));\n hex.add(new paper.Point(p4));\n hex.add(new paper.Point(p5));\n hex.closed = true;\n hex.fillColor = color;\n\n hex.rotate(rotation, new paper.Point(px, py));\n\n return hex;\n }\n\n render2DTarget(key: string | null, params: { [k: string]: any }) {\n if (key === null) {\n key = this.__renderKeys[0];\n }\n const render = this.render2D(params, key);\n render.fillColor!.alpha = 0.5;\n return render;\n }\n}\n","import Template from \"./template\";\nimport paper from \"paper\";\nimport ComponentPort from \"../core/componentPort\";\nimport { LogicalLayerType } from \"../core/init\";\n\nexport default class Merger extends Template {\n constructor() {\n super();\n }\n\n __setupDefinitions(): void {\n this.__unique = {\n position: \"Point\"\n };\n\n this.__heritable = {\n componentSpacing: \"Float\",\n rotation: \"Float\",\n height: \"Float\",\n inletWidth: \"Float\",\n inletLength: \"Float\",\n electrodeWidth: \"Float\",\n electrodeLength: \"Float\",\n electrodeDistance: \"Float\",\n outletWidth: \"Float\",\n outletLength: \"Float\",\n chamberHeight: \"Float\",\n chamberLength: \"Float\",\n channelDepth: \"Float\",\n electrodeDepth: \"Float\"\n };\n\n this.__defaults = {\n componentSpacing: 1000,\n rotation: 0,\n height: 250,\n inletWidth: 2 * 1000,\n inletLength: 4 * 1000,\n electrodeWidth: 1000,\n electrodeLength: 5 * 1000,\n electrodeDistance: 1000,\n outletWidth: 2 * 1000,\n outletLength: 4 * 1000,\n chamberHeight: 2.7 * 1000,\n chamberLength: 2 * 1000,\n channelDepth: 1000,\n electrodeDepth: 1000\n };\n\n this.__units = {\n componentSpacing: \"μm\",\n rotation: \"°\",\n height: \"μm\",\n inletWidth: \"μm\",\n inletLength: \"μm\",\n electrodeWidth: \"μm\",\n electrodeLength: \"μm\",\n electrodeDistance: \"μm\",\n outletWidth: \"μm\",\n outletLength: \"μm\",\n chamberHeight: \"μm\",\n chamberLength: \"μm\",\n channelDepth: \"μm\",\n electrodeDepth: \"μm\"\n };\n\n this.__minimum = {\n componentSpacing: 0,\n rotation: 0,\n height: 10,\n inletWidth: 1000,\n inletLength: 1000,\n electrodeWidth: 500,\n electrodeLength: 3 * 1000,\n electrodeDistance: 500,\n outletWidth: 1000,\n outletLength: 1000,\n chamberHeight: 1000,\n chamberLength: 1000,\n channelDepth: 1000,\n electrodeDepth: 1000\n };\n\n this.__maximum = {\n componentSpacing: 10000,\n rotation: 360,\n height: 1200,\n inletWidth: 3 * 1000,\n inletLength: 6 * 1000,\n electrodeWidth: 3 * 1000,\n electrodeLength: 7 * 1000,\n electrodeDistance: 1500,\n outletWidth: 3 * 1000,\n outletLength: 6 * 1000,\n chamberHeight: 4 * 1000,\n chamberLength: 4 * 1000,\n channelDepth: 1000,\n electrodeDepth: 1000\n };\n\n this.__placementTool = \"multilayerPositionTool\";\n\n this.__toolParams = {\n cursorPosition: \"position\"\n };\n\n this.__featureParams = {\n componentSpacing: \"componentSpacing\",\n position: \"position\",\n rotation: \"rotation\",\n inletWidth: \"inletWidth\",\n inletLength: \"inletLength\",\n electrodeWidth: \"electrodeWidth\",\n electrodeLength: \"electrodeLength\",\n electrodeDistance: \"electrodeDistance\",\n outletWidth: \"outletWidth\",\n outletLength: \"outletLength\",\n chamberHeight: \"chamberHeight\",\n chamberLength: \"chamberLength\",\n channelDepth: \"channelDepth\",\n electrodeDepth: \"electrodeDepth\"\n };\n\n this.__targetParams = {\n componentSpacing: \"componentSpacing\",\n rotation: \"rotation\",\n inletWidth: \"inletWidth\",\n inletLength: \"inletLength\",\n electrodeWidth: \"electrodeWidth\",\n electrodeLength: \"electrodeLength\",\n electrodeDistance: \"electrodeDistance\",\n outletWidth: \"outletWidth\",\n outletLength: \"outletLength\",\n chamberHeight: \"chamberHeight\",\n chamberLength: \"chamberLength\",\n channelDepth: \"channelDepth\",\n electrodeDepth: \"electrodeDepth\"\n };\n\n this.__renderKeys = [\"FLOW\", \"INTEGRATION\"];\n\n this.__mint = \"DROPLET MERGER\";\n\n this.__zOffsetKeys = {\n FLOW: \"height\",\n INTEGRATION: \"electrodeDepth\"\n };\n\n this.__substrateOffset = {\n FLOW: \"0\",\n INTEGRATION: \"+1\"\n };\n }\n\n getPorts(params: { [k: string]: any }) {\n const inletLength = params.inletLength;\n const outletLength = params.outletLength;\n const chamberLength = params.chamberLength;\n\n const ports = [];\n\n ports.push(new ComponentPort(0, 0, \"1\", LogicalLayerType.FLOW));\n\n ports.push(new ComponentPort(inletLength + chamberLength + outletLength, 0, \"2\", LogicalLayerType.FLOW));\n\n return ports;\n }\n\n __renderFlow(params: { [k: string]: any }) {\n const rotation = params.rotation;\n const x = params.position[0];\n const y = params.position[1];\n const color = params.color;\n const inletWidth = params.inletWidth;\n const inletLength = params.inletLength;\n const outletWidth = params.outletWidth;\n const outletLength = params.outletLength;\n const chamberHeight = params.chamberHeight;\n const chamberLength = params.chamberLength;\n const channelDepth = params.channelDepth;\n const electrodeDepth = params.electrodeDepth;\n\n const serp = new paper.CompoundPath(\"\");\n\n // inlet\n let topLeft = new paper.Point(x, y - inletWidth / 2);\n let bottomRight = new paper.Point(x + inletLength, y + inletWidth / 2);\n\n serp.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n // merge chamber\n topLeft = new paper.Point(x + inletLength, y - chamberHeight / 2);\n bottomRight = new paper.Point(x + inletLength + chamberLength, y + chamberHeight / 2);\n\n serp.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n // outlet\n topLeft = new paper.Point(x + inletLength + chamberLength, y - outletWidth / 2);\n bottomRight = new paper.Point(x + inletLength + chamberLength + outletLength, y + outletWidth / 2);\n\n serp.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n serp.rotate(rotation, new paper.Point(x, y));\n\n serp.fillColor = color;\n return serp;\n }\n\n __renderIntegrate(params: { [k: string]: any }) {\n const rotation = params.rotation;\n const x = params.position[0];\n const y = params.position[1];\n const color = params.color;\n const inletLength = params.inletLength;\n const electrodeWidth = params.electrodeWidth;\n const electrodeLength = params.electrodeLength;\n const electrodeDistance = params.electrodeDistance;\n const channelDepth = params.channelDepth;\n const electrodeDepth = params.electrodeDepth;\n\n const serp = new paper.CompoundPath(\"\");\n\n // left electrode\n let topLeft = new paper.Point(x + inletLength, y - electrodeLength / 2);\n let bottomRight = new paper.Point(x + inletLength + electrodeWidth, y + electrodeLength / 2);\n\n serp.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n // right electrode\n topLeft = new paper.Point(x + inletLength + electrodeWidth + electrodeDistance, y - electrodeLength / 2);\n bottomRight = new paper.Point(x + inletLength + 2 * electrodeWidth + electrodeDistance, y + electrodeLength / 2);\n\n serp.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n serp.rotate(rotation, new paper.Point(x, y));\n\n serp.fillColor = color;\n return serp;\n }\n\n // render2DTarget(key, params) {\n // const serp = this.render2D(params, key);\n\n // serp.fillColor.alpha = 0.5;\n // return serp;\n // }\n\n render2D(params: { [k: string]: any }, key = \"FLOW\") {\n if (key === \"FLOW\") {\n return this.__renderFlow(params);\n } else if (key === \"INTEGRATION\") {\n return this.__renderIntegrate(params);\n }\n throw new Error(\"Unknown render key found in DROPLET MERGER: \" + key);\n }\n\n render2DTarget(key: string | null, params: { [k: string]: any }) {\n const ret = new paper.CompoundPath(\"\");\n const flow = this.render2D(params, \"FLOW\");\n const integrate = this.render2D(params, \"INTEGRATION\");\n ret.addChild(integrate);\n ret.addChild(flow);\n ret.fillColor = params.color;\n ret.fillColor!.alpha = 0.5;\n return ret;\n }\n}\n","import Template from \"./template\";\nimport paper from \"paper\";\nimport ComponentPort from \"../core/componentPort\";\nimport { LogicalLayerType } from \"../core/init\";\n\nexport default class PicoInjection extends Template {\n constructor() {\n super();\n }\n\n __setupDefinitions(): void {\n this.__unique = {\n position: \"Point\"\n };\n\n this.__heritable = {\n componentSpacing: \"Float\",\n height: \"Float\",\n width: \"Float\",\n injectorWidth: \"Float\",\n injectorLength: \"Float\",\n dropletWidth: \"Float\",\n nozzleWidth: \"Float\",\n nozzleLength: \"Float\",\n electrodeDistance: \"Float\",\n electrodeWidth: \"Float\",\n electrodeLength: \"Float\",\n rotation: \"Float\"\n };\n\n this.__defaults = {\n componentSpacing: 1000,\n height: 250,\n width: 10 * 1000,\n injectorWidth: 2 * 1000,\n injectorLength: 3 * 1000,\n dropletWidth: 0.8 * 1000,\n nozzleWidth: 0.4 * 1000,\n nozzleLength: 0.4 * 1000,\n electrodeDistance: 0.8 * 1000,\n electrodeWidth: 0.8 * 1000,\n electrodeLength: 3 * 1000,\n rotation: 0\n };\n\n this.__units = {\n componentSpacing: \"μm\",\n height: \"μm\",\n width: \"μm\",\n injectorWidth: \"μm\",\n injectorLength: \"μm\",\n dropletWidth: \"μm\",\n nozzleWidth: \"μm\",\n nozzleLength: \"μm\",\n electrodeDistance: \"μm\",\n electrodeWidth: \"μm\",\n electrodeLength: \"μm\",\n rotation: \"°\"\n };\n\n this.__minimum = {\n componentSpacing: 0,\n height: 10,\n width: 5 * 1000,\n injectorWidth: 1000,\n injectorLength: 1000,\n dropletWidth: 100,\n nozzleWidth: 80,\n nozzleLength: 80,\n electrodeDistance: 100,\n electrodeWidth: 100,\n electrodeLength: 1000,\n rotation: 0\n };\n\n this.__maximum = {\n componentSpacing: 10000,\n height: 1200,\n width: 20 * 1000,\n injectorWidth: 4000,\n injectorLength: 5000,\n dropletWidth: 2000,\n nozzleWidth: 1000,\n nozzleLength: 500,\n electrodeDistance: 2000,\n electrodeWidth: 2000,\n electrodeLength: 5000,\n rotation: 360\n };\n\n this.__placementTool = \"multilayerPositionTool\";\n\n this.__toolParams = {\n cursorPosition: \"position\"\n };\n\n this.__featureParams = {\n componentSpacing: \"componentSpacing\",\n position: \"position\",\n width: \"width\",\n injectorWidth: \"injectorWidth\",\n injectorLength: \"injectorLength\",\n dropletWidth: \"dropletWidth\",\n nozzleWidth: \"nozzleWidth\",\n nozzleLength: \"nozzleLength\",\n electrodeDistance: \"electrodeDistance\",\n electrodeWidth: \"electrodeWidth\",\n electrodeLength: \"electrodeLength\",\n rotation: \"rotation\"\n };\n\n this.__targetParams = {\n componentSpacing: \"componentSpacing\",\n width: \"width\",\n injectorWidth: \"injectorWidth\",\n injectorLength: \"injectorLength\",\n dropletWidth: \"dropletWidth\",\n nozzleWidth: \"nozzleWidth\",\n nozzleLength: \"nozzleLength\",\n electrodeDistance: \"electrodeDistance\",\n electrodeWidth: \"electrodeWidth\",\n electrodeLength: \"electrodeLength\",\n rotation: \"rotation\"\n };\n\n this.__renderKeys = [\"FLOW\", \"INTEGRATION\"];\n\n this.__mint = \"PICOINJECTOR\";\n\n this.__zOffsetKeys = {\n FLOW: \"height\",\n INTEGRATION: \"height\"\n };\n\n this.__substrateOffset = {\n FLOW: \"0\",\n INTEGRATION: \"0\"\n };\n }\n\n getPorts(params: { [k: string]: any }) {\n const width = params.width;\n const injectorLength = params.injectorLength;\n const dropletWidth = params.dropletWidth;\n const nozzleLength = params.nozzleLength;\n const electrodeDistance = params.electrodeDistance;\n const electrodeWidth = params.electrodeWidth;\n const electrodeLength = params.electrodeLength;\n\n const ports = [];\n\n // droplet channel\n ports.push(new ComponentPort(-width / 2, 0, \"1\", LogicalLayerType.FLOW));\n ports.push(new ComponentPort(width / 2, 0, \"2\", LogicalLayerType.FLOW));\n\n // injector\n ports.push(new ComponentPort(0, -dropletWidth / 2 - nozzleLength - injectorLength, \"3\", LogicalLayerType.FLOW));\n\n return ports;\n }\n\n __renderFlow(params: { [k: string]: any }) {\n const rotation = params.rotation;\n const x = params.position[0];\n const y = params.position[1];\n const color = params.color;\n const width = params.width;\n const injectorWidth = params.injectorWidth;\n const injectorLength = params.injectorLength;\n const dropletWidth = params.dropletWidth;\n const nozzleWidth = params.nozzleWidth;\n const nozzleLength = params.nozzleLength;\n const serp = new paper.CompoundPath(\"\");\n\n // droplet channel\n let topLeft = new paper.Point(x - width / 2, y - dropletWidth / 2);\n let bottomRight = new paper.Point(x + width / 2, y + dropletWidth / 2);\n\n serp.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n // nozzle\n topLeft = new paper.Point(x - nozzleWidth / 2, y - dropletWidth / 2 - nozzleLength);\n bottomRight = new paper.Point(x + nozzleWidth / 2, y - dropletWidth / 2);\n\n serp.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n // injector\n topLeft = new paper.Point(x - injectorWidth / 2, y - dropletWidth / 2 - nozzleLength - injectorLength);\n bottomRight = new paper.Point(x + injectorWidth / 2, y - dropletWidth / 2 - nozzleLength);\n\n serp.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n serp.rotate(rotation, new paper.Point(x, y));\n\n serp.fillColor = color;\n return serp;\n }\n\n __renderIntegrate(params: { [k: string]: any }) {\n const rotation = params.rotation;\n const x = params.position[0];\n const y = params.position[1];\n const color = params.color;\n const electrodeDistance = params.electrodeDistance;\n const electrodeWidth = params.electrodeWidth;\n const electrodeLength = params.electrodeLength;\n const serp = new paper.CompoundPath(\"\");\n\n // middle electrode\n let topLeft = new paper.Point(x - electrodeWidth / 2, y + electrodeDistance);\n let bottomRight = new paper.Point(x + electrodeWidth / 2, y + electrodeDistance + electrodeLength);\n\n serp.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n // left electrode\n topLeft = new paper.Point(x - electrodeWidth / 2 - 2 * electrodeWidth, y + electrodeDistance);\n bottomRight = new paper.Point(x + electrodeWidth / 2 - 2 * electrodeWidth, y + electrodeDistance + electrodeLength);\n\n serp.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n // right electrode\n topLeft = new paper.Point(x - electrodeWidth / 2 + 2 * electrodeWidth, y + electrodeDistance);\n bottomRight = new paper.Point(x + electrodeWidth / 2 + 2 * electrodeWidth, y + electrodeDistance + electrodeLength);\n\n serp.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n serp.rotate(rotation, new paper.Point(x, y));\n\n serp.fillColor = color;\n return serp;\n }\n\n // render2DTarget(key, params) {\n // const serp = this.render2D(params, key);\n\n // serp.fillColor.alpha = 0.5;\n // return serp;\n // }\n\n render2D(params: { [k: string]: any }, key = \"FLOW\") {\n if (key === \"FLOW\") {\n return this.__renderFlow(params);\n } else if (key === \"INTEGRATION\") {\n return this.__renderIntegrate(params);\n }\n throw new Error(\"Unknown render key found in PICOINJECTOR: \" + key);\n }\n\n render2DTarget(key: string | null, params: { [k: string]: any }) {\n const ret = new paper.CompoundPath(\"\");\n const flow = this.render2D(params, \"FLOW\");\n const integrate = this.render2D(params, \"INTEGRATION\");\n ret.addChild(integrate);\n ret.addChild(flow);\n ret.fillColor = params.color;\n ret.fillColor!.alpha = 0.5;\n return ret;\n }\n}\n","import Template from \"./template\";\nimport paper from \"paper\";\nimport ComponentPort from \"../core/componentPort\";\nimport { LogicalLayerType } from \"../core/init\";\n\nexport default class Sorter extends Template {\n constructor() {\n super();\n }\n\n __setupDefinitions(): void {\n this.__unique = {\n position: \"Point\"\n };\n\n this.__heritable = {\n componentSpacing: \"Float\",\n rotation: \"Float\",\n height: \"Float\",\n inletWidth: \"Float\",\n inletLength: \"Float\",\n electrodeDistance: \"Float\",\n electrodeWidth: \"Float\",\n electrodeLength: \"Float\",\n outletWidth: \"Float\",\n angle: \"Float\",\n wasteWidth: \"Float\",\n outputLength: \"Float\",\n keepWidth: \"Float\",\n pressureWidth: \"Float\",\n pressureSpacing: \"Float\",\n numberofDistributors: \"Float\",\n channelDepth: \"Float\",\n electrodeDepth: \"Float\",\n pressureDepth: \"Float\"\n };\n\n this.__defaults = {\n componentSpacing: 1000,\n rotation: 0,\n height: 250,\n inletWidth: 0.8 * 1000,\n inletLength: 4 * 1000,\n electrodeDistance: 1 * 1000,\n electrodeWidth: 0.7 * 1000,\n electrodeLength: 5 * 1000,\n outletWidth: 0.8 * 1000,\n angle: 45,\n wasteWidth: 1.2 * 1000,\n outputLength: 4 * 1000,\n keepWidth: 2 * 1000,\n pressureWidth: 0.4 * 1000,\n pressureSpacing: 1.5 * 1000,\n numberofDistributors: 5,\n channelDepth: 1000,\n electrodeDepth: 1000,\n pressureDepth: 1000\n };\n\n this.__units = {\n componentSpacing: \"μm\",\n rotation: \"°\",\n height: \"μm\",\n inletWidth: \"μm\",\n inletLength: \"μm\",\n electrodeDistance: \"μm\",\n electrodeWidth: \"μm\",\n electrodeLength: \"μm\",\n outletWidth: \"μm\",\n angle: \"°\",\n wasteWidth: \"μm\",\n outputLength: \"μm\",\n keepWidth: \"μm\",\n pressureWidth: \"μm\",\n pressureSpacing: \"μm\",\n numberofDistributors: \"μm\",\n channelDepth: \"μm\",\n electrodeDepth: \"μm\",\n pressureDepth: \"μm\"\n };\n\n this.__minimum = {\n componentSpacing: 0,\n rotation: 0,\n height: 10,\n inletWidth: 0.5 * 1000,\n inletLength: 2 * 1000,\n electrodeDistance: 0.5 * 1000,\n electrodeWidth: 0.5 * 1000,\n electrodeLength: 2.5 * 1000,\n outletWidth: 0.5 * 1000,\n angle: 0,\n wasteWidth: 0.5 * 1000,\n outputLength: 2 * 1000,\n keepWidth: 2 * 1000,\n pressureWidth: 0.2 * 1000,\n pressureSpacing: 0.5 * 1000,\n numberofDistributors: 1,\n channelDepth: 1000,\n electrodeDepth: 1000,\n pressureDepth: 1000\n };\n\n this.__maximum = {\n componentSpacing: 10000,\n rotation: 360,\n height: 1200,\n inletWidth: 2 * 1000,\n inletLength: 6 * 1000,\n electrodeDistance: 1.5 * 1000,\n electrodeWidth: 1.5 * 1000,\n electrodeLength: 7.5 * 1000,\n outletWidth: 2 * 1000,\n angle: 180,\n wasteWidth: 1.5 * 1000,\n outputLength: 6 * 1000,\n keepWidth: 3.5 * 1000,\n pressureWidth: 1 * 1000,\n pressureSpacing: 2 * 1000,\n numberofDistributors: 10,\n channelDepth: 1000,\n electrodeDepth: 1000,\n pressureDepth: 1000\n };\n\n this.__placementTool = \"multilayerPositionTool\";\n\n this.__toolParams = {\n cursorPosition: \"position\"\n };\n\n this.__featureParams = {\n componentSpacing: \"componentSpacing\",\n position: \"position\",\n rotation: \"rotation\",\n inletWidth: \"inletWidth\",\n inletLength: \"inletLength\",\n electrodeDistance: \"electrodeDistance\",\n electrodeWidth: \"electrodeWidth\",\n electrodeLength: \"electrodeLength\",\n outletWidth: \"outletWidth\",\n angle: \"angle\",\n wasteWidth: \"wasteWidth\",\n outputLength: \"outputLength\",\n keepWidth: \"keepWidth\",\n pressureWidth: \"pressureWidth\",\n pressureSpacing: \"pressureSpacing\",\n numberofDistributors: \"numberofDistributors\",\n channelDepth: \"channelDepth\",\n electrodeDepth: \"electrodeDepth\",\n pressureDepth: \"pressureDepth\"\n };\n\n this.__targetParams = {\n componentSpacing: \"componentSpacing\",\n rotation: \"rotation\",\n inletWidth: \"inletWidth\",\n inletLength: \"inletLength\",\n electrodeDistance: \"electrodeDistance\",\n electrodeWidth: \"electrodeWidth\",\n electrodeLength: \"electrodeLength\",\n outletWidth: \"outletWidth\",\n angle: \"angle\",\n wasteWidth: \"wasteWidth\",\n outputLength: \"outputLength\",\n keepWidth: \"keepWidth\",\n pressureWidth: \"pressureWidth\",\n pressureSpacing: \"pressureSpacing\",\n numberofDistributors: \"numberofDistributors\",\n channelDepth: \"channelDepth\",\n electrodeDepth: \"electrodeDepth\",\n pressureDepth: \"pressureDepth\"\n };\n\n this.__renderKeys = [\"FLOW\", \"INTEGRATION\"];\n\n this.__mint = \"DROPLET SORTER\";\n\n this.__zOffsetKeys = {\n FLOW: \"height\",\n INTEGRATION: \"electrodeDepth\"\n };\n\n this.__substrateOffset = {\n FLOW: \"0\",\n INTEGRATION: \"0\"\n };\n }\n\n getPorts(params: { [k: string]: any }) {\n const inletLength = params.inletLength;\n const angle = params.angle;\n const outputLength = params.outputLength;\n const pressureWidth = params.pressureWidth;\n const pressureSpacing = params.pressureSpacing;\n const numberofDistributors = params.numberofDistributors;\n\n const outletLen = ((numberofDistributors + 0.5) * (pressureSpacing + pressureWidth)) / Math.cos(((angle / 2) * Math.PI) / 180);\n\n const ports = [];\n\n ports.push(new ComponentPort(-inletLength, 0, \"1\", LogicalLayerType.FLOW));\n\n ports.push(\n new ComponentPort(\n outletLen * Math.cos(((angle / 2) * Math.PI) / 180) + outputLength,\n -((numberofDistributors + 0.5) * (pressureSpacing + pressureWidth) - pressureWidth / 2) * Math.tan(((angle / 2) * Math.PI) / 180),\n \"2\",\n LogicalLayerType.FLOW\n )\n );\n\n ports.push(\n new ComponentPort(\n outletLen * Math.cos(((angle / 2) * Math.PI) / 180) + outputLength,\n ((numberofDistributors + 0.5) * (pressureSpacing + pressureWidth) - pressureWidth / 2) * Math.tan(((angle / 2) * Math.PI) / 180),\n \"3\",\n LogicalLayerType.FLOW\n )\n );\n\n return ports;\n }\n\n __renderFlow(params: { [k: string]: any }) {\n const rotation = params.rotation;\n const x = params.position[0];\n const y = params.position[1];\n const color = params.color;\n const inletWidth = params.inletWidth;\n const inletLength = params.inletLength;\n const outletWidth = params.outletWidth;\n const angle = params.angle;\n const wasteWidth = params.wasteWidth;\n const outputLength = params.outputLength;\n const keepWidth = params.keepWidth;\n const pressureWidth = params.pressureWidth;\n const pressureSpacing = params.pressureSpacing;\n const numberofDistributors = params.numberofDistributors;\n const serp = new paper.CompoundPath(\"\");\n\n // pressure distributors\n for (let i = 0; i < numberofDistributors; i++) {\n const newRightX = (i + 1.5) * (pressureSpacing + pressureWidth);\n\n const newLeftX = newRightX - pressureWidth;\n\n const pHeight = (newRightX - pressureWidth / 2) * Math.tan(((angle / 2) * Math.PI) / 180);\n // upper\n let topLeft = new paper.Point(x + newLeftX, y - pHeight);\n let bottomRight = new paper.Point(x + newRightX, y);\n serp.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n // lower\n topLeft = new paper.Point(x + newLeftX, y + pHeight);\n bottomRight = new paper.Point(x + newRightX, y);\n serp.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n }\n\n const outletLen = ((numberofDistributors + 0.5) * (pressureSpacing + pressureWidth)) / Math.cos(((angle / 2) * Math.PI) / 180);\n let topLeft = new paper.Point(x, y - outletWidth / 2);\n let bottomRight = new paper.Point(x + outletLen, y + outletWidth / 2);\n\n // upper outlet\n let outlet = new paper.Path.Rectangle(topLeft, bottomRight);\n outlet.rotate(-angle / 2, new paper.Point(x, y));\n serp.addChild(outlet);\n\n // lower outlet\n outlet = new paper.Path.Rectangle(topLeft, bottomRight);\n outlet.rotate(angle / 2, new paper.Point(x, y));\n serp.addChild(outlet);\n\n // inlet\n topLeft = new paper.Point(x - inletLength, y - inletWidth / 2);\n bottomRight = new paper.Point(x, y + inletWidth / 2);\n\n serp.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n // waste\n topLeft = new paper.Point(\n x + outletLen * Math.cos(((angle / 2) * Math.PI) / 180),\n y - ((numberofDistributors + 0.5) * (pressureSpacing + pressureWidth) - pressureWidth / 2) * Math.tan(((angle / 2) * Math.PI) / 180) - wasteWidth / 2\n );\n bottomRight = new paper.Point(\n x + outletLen * Math.cos(((angle / 2) * Math.PI) / 180) + outputLength,\n y - ((numberofDistributors + 0.5) * (pressureSpacing + pressureWidth) - pressureWidth / 2) * Math.tan(((angle / 2) * Math.PI) / 180) + wasteWidth / 2\n );\n\n serp.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n // keep\n topLeft = new paper.Point(\n x + outletLen * Math.cos(((angle / 2) * Math.PI) / 180),\n y + ((numberofDistributors + 0.5) * (pressureSpacing + pressureWidth) - pressureWidth / 2) * Math.tan(((angle / 2) * Math.PI) / 180) - keepWidth / 2\n );\n bottomRight = new paper.Point(\n x + outletLen * Math.cos(((angle / 2) * Math.PI) / 180) + outputLength,\n y + ((numberofDistributors + 0.5) * (pressureSpacing + pressureWidth) - pressureWidth / 2) * Math.tan(((angle / 2) * Math.PI) / 180) + keepWidth / 2\n );\n\n serp.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n serp.rotate(rotation, new paper.Point(x, y));\n\n serp.fillColor = color;\n return serp;\n }\n\n __renderIntegrate(params: { [k: string]: any }) {\n const rotation = params.rotation;\n const x = params.position[0];\n const y = params.position[1];\n const color = params.color;\n const electrodeDistance = params.electrodeDistance;\n const electrodeWidth = params.electrodeWidth;\n const electrodeLength = params.electrodeLength;\n const angle = params.angle;\n const serp = new paper.CompoundPath(\"\");\n\n // middle electrode\n let topLeft = new paper.Point(x - electrodeWidth / 2, y + electrodeDistance);\n let bottomRight = new paper.Point(x + electrodeWidth / 2, y + electrodeDistance + electrodeLength);\n\n serp.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n // left electrode\n topLeft = new paper.Point(x - electrodeWidth / 2 - 2 * electrodeWidth, y + electrodeDistance);\n bottomRight = new paper.Point(x + electrodeWidth / 2 - 2 * electrodeWidth, y + electrodeDistance + electrodeLength);\n\n serp.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n // right electrode\n topLeft = new paper.Point(x - electrodeWidth / 2 + 2 * electrodeWidth, y + electrodeDistance + 2 * electrodeWidth * Math.tan(((angle / 2) * Math.PI) / 180));\n bottomRight = new paper.Point(\n x + electrodeWidth / 2 + 2 * electrodeWidth,\n y + electrodeDistance + 2 * electrodeWidth * Math.tan(((angle / 2) * Math.PI) / 180) + electrodeLength\n );\n\n serp.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n serp.rotate(rotation, new paper.Point(x, y));\n\n serp.fillColor = color;\n return serp;\n }\n\n // render2DTarget(key, params) {\n // const serp = this.render2D(params, key);\n\n // serp.fillColor.alpha = 0.5;\n // return serp;\n // }\n\n render2D(params: { [k: string]: any }, key = \"FLOW\") {\n if (key === \"FLOW\") {\n return this.__renderFlow(params);\n } else if (key === \"INTEGRATION\") {\n return this.__renderIntegrate(params);\n }\n throw new Error(\"Unknown render key found in DROPLET SORTER: \" + key);\n }\n\n render2DTarget(key: string | null, params: { [k: string]: any }) {\n const ret = new paper.CompoundPath(\"\");\n const flow = this.render2D(params, \"FLOW\");\n const integrate = this.render2D(params, \"INTEGRATION\");\n ret.addChild(integrate);\n ret.addChild(flow);\n ret.fillColor = params.color;\n ret.fillColor!.alpha = 0.5;\n return ret;\n }\n}\n","import Template from \"./template\";\nimport paper from \"paper\";\nimport ComponentPort from \"../core/componentPort\";\nimport { LogicalLayerType } from \"../core/init\";\n\nexport default class CapacitanceSensor extends Template {\n constructor() {\n super();\n }\n\n __setupDefinitions(): void {\n this.__unique = {\n position: \"Point\"\n };\n\n this.__heritable = {\n componentSpacing: \"Float\",\n rotation: \"Float\",\n height: \"Float\",\n inletWidth: \"Float\",\n inletLength: \"Float\",\n electrodeWidth: \"Float\",\n electrodeLength: \"Float\",\n electrodeDistance: \"Float\",\n sensorWidth: \"Float\",\n sensorLength: \"Float\",\n channelDepth: \"Float\",\n electrodeDepth: \"Float\"\n };\n\n this.__defaults = {\n componentSpacing: 1000,\n rotation: 0,\n height: 250,\n inletWidth: 1 * 1000,\n inletLength: 10 * 1000,\n electrodeWidth: 1.5 * 1000,\n electrodeLength: 4 * 1000,\n electrodeDistance: 2 * 1000,\n sensorWidth: 1 * 1000,\n sensorLength: 3 * 1000,\n channelDepth: 1000,\n electrodeDepth: 1000\n };\n\n this.__units = {\n componentSpacing: \"μm\",\n rotation: \"°\",\n height: \"μm\",\n inletWidth: \"μm\",\n inletLength: \"μm\",\n electrodeWidth: \"μm\",\n electrodeLength: \"μm\",\n electrodeDistance: \"μm\",\n sensorWidth: \"μm\",\n sensorLength: \"μm\",\n channelDepth: \"μm\",\n electrodeDepth: \"μm\"\n };\n\n this.__minimum = {\n componentSpacing: 0,\n rotation: 0,\n height: 10,\n inletWidth: 0.5 * 1000,\n inletLength: 5 * 1000,\n electrodeWidth: 1 * 1000,\n electrodeLength: 2 * 1000,\n electrodeDistance: 1 * 1000,\n sensorWidth: 0.5 * 1000,\n sensorLength: 1.5 * 1000,\n channelDepth: 1000,\n electrodeDepth: 1000\n };\n\n this.__maximum = {\n componentSpacing: 10000,\n rotation: 360,\n height: 1200,\n inletWidth: 2 * 1000,\n inletLength: 15 * 1000,\n electrodeWidth: 3 * 1000,\n electrodeLength: 6 * 1000,\n electrodeDistance: 3 * 1000,\n sensorWidth: 1.5 * 1000,\n sensorLength: 4.5 * 1000,\n channelDepth: 1000,\n electrodeDepth: 1000\n };\n\n this.__placementTool = \"multilayerPositionTool\";\n\n this.__toolParams = {\n cursorPosition: \"position\"\n };\n\n this.__featureParams = {\n componentSpacing: \"componentSpacing\",\n position: \"position\",\n rotation: \"rotation\",\n inletWidth: \"inletWidth\",\n inletLength: \"inletLength\",\n electrodeWidth: \"electrodeWidth\",\n electrodeLength: \"electrodeLength\",\n electrodeDistance: \"electrodeDistance\",\n sensorWidth: \"sensorWidth\",\n sensorLength: \"sensorLength\",\n channelDepth: \"channelDepth\",\n electrodeDepth: \"electrodeDepth\"\n };\n\n this.__targetParams = {\n componentSpacing: \"componentSpacing\",\n rotation: \"rotation\",\n inletWidth: \"inletWidth\",\n inletLength: \"inletLength\",\n electrodeWidth: \"electrodeWidth\",\n electrodeLength: \"electrodeLength\",\n electrodeDistance: \"electrodeDistance\",\n sensorWidth: \"sensorWidth\",\n sensorLength: \"sensorLength\",\n channelDepth: \"channelDepth\",\n electrodeDepth: \"electrodeDepth\"\n };\n\n this.__renderKeys = [\"FLOW\", \"INTEGRATION\"];\n\n this.__mint = \"DROPLET CAPACITANCE SENSOR\";\n\n this.__zOffsetKeys = {\n FLOW: \"height\",\n INTEGRATION: \"electrodeDepth\"\n };\n\n this.__substrateOffset = {\n FLOW: \"0\",\n INTEGRATION: \"0\"\n };\n }\n\n getPorts(params: { [k: string]: any }) {\n const inletLength = params.inletLength;\n\n const ports = [];\n\n ports.push(new ComponentPort(-inletLength / 2, 0, \"1\", LogicalLayerType.FLOW));\n\n ports.push(new ComponentPort(inletLength / 2, 0, \"2\", LogicalLayerType.FLOW));\n\n return ports;\n }\n\n __renderFlow(params: { [k: string]: any }) {\n const rotation = params.rotation;\n const x = params.position[0];\n const y = params.position[1];\n const color = params.color;\n const inletWidth = params.inletWidth;\n const inletLength = params.inletLength;\n const serp = new paper.CompoundPath(\"\");\n\n // inlet\n const topLeft = new paper.Point(x - inletLength / 2, y - inletWidth / 2);\n const bottomRight = new paper.Point(x + inletLength / 2, y + inletWidth / 2);\n\n serp.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n serp.rotate(rotation, new paper.Point(x, y));\n\n serp.fillColor = color;\n return serp;\n }\n\n __renderIntegrate(params: { [k: string]: any }) {\n const rotation = params.rotation;\n const x = params.position[0];\n const y = params.position[1];\n const color = params.color;\n const inletWidth = params.inletWidth;\n const electrodeWidth = params.electrodeWidth;\n const electrodeLength = params.electrodeLength;\n const electrodeDistance = params.electrodeDistance;\n const sensorWidth = params.sensorWidth;\n const sensorLength = params.sensorLength;\n const serp = new paper.CompoundPath(\"\");\n\n // top electrode\n let topLeft = new paper.Point(x - electrodeWidth / 2, y - inletWidth / 2 - electrodeDistance - sensorWidth / 2 - electrodeLength);\n let bottomRight = new paper.Point(x + electrodeWidth / 2, y - inletWidth / 2 - electrodeDistance - sensorWidth / 2);\n\n serp.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n // top sensor\n let elli = new paper.Path.Ellipse({\n point: [x - sensorLength / 2, y - inletWidth / 2 - electrodeDistance - sensorWidth],\n size: [sensorLength, sensorWidth]\n });\n\n serp.addChild(elli);\n\n // bottom electrode\n topLeft = new paper.Point(x - electrodeWidth / 2, y + inletWidth / 2 + electrodeDistance + sensorWidth / 2 + electrodeLength);\n bottomRight = new paper.Point(x + electrodeWidth / 2, y + inletWidth / 2 + electrodeDistance + sensorWidth / 2);\n\n serp.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n // bottom sensor\n elli = new paper.Path.Ellipse({\n point: [x - sensorLength / 2, y + inletWidth / 2 + electrodeDistance],\n size: [sensorLength, sensorWidth]\n });\n\n serp.addChild(elli);\n\n serp.rotate(rotation, new paper.Point(x, y));\n\n serp.fillColor = color;\n return serp;\n }\n\n render2D(params: { [k: string]: any }, key = \"FLOW\") {\n if (key === \"FLOW\") {\n return this.__renderFlow(params);\n } else if (key === \"INTEGRATION\") {\n return this.__renderIntegrate(params);\n }\n throw new Error(\"Unknown render key found in DROPLET CAPACITANCE SENSOR: \" + key);\n }\n\n render2DTarget(key: string | null, params: { [k: string]: any }) {\n const ret = new paper.CompoundPath(\"\");\n const flow = this.render2D(params, \"FLOW\");\n const integrate = this.render2D(params, \"INTEGRATION\");\n ret.addChild(integrate);\n ret.addChild(flow);\n ret.fillColor = params.color;\n ret.fillColor!.alpha = 0.5;\n return ret;\n }\n}\n","import Template from \"./template\";\nimport paper from \"paper\";\nimport ComponentPort from \"../core/componentPort\";\nimport { LogicalLayerType } from \"../core/init\";\n\nexport default class Splitter extends Template {\n constructor() {\n super();\n }\n\n __setupDefinitions(): void {\n this.__unique = {\n position: \"Point\"\n };\n\n this.__heritable = {\n componentSpacing: \"Float\",\n rotation: \"Float\",\n height: \"Float\",\n inletWidth: \"Float\",\n inletLength: \"Float\",\n outletWidth1: \"Float\",\n outletLength1: \"Float\",\n outletWidth2: \"Float\",\n outletLength2: \"Float\"\n };\n\n this.__defaults = {\n componentSpacing: 1000,\n rotation: 0,\n height: 250,\n inletWidth: 2 * 1000,\n inletLength: 6 * 1000,\n outletWidth1: 1 * 1000,\n outletLength1: 3 * 1000,\n outletWidth2: 2 * 1000,\n outletLength2: 3 * 1000\n };\n\n this.__units = {\n componentSpacing: \"μm\",\n rotation: \"°\",\n height: \"μm\",\n inletWidth: \"μm\",\n inletLength: \"μm\",\n outletWidth1: \"μm\",\n outletLength1: \"μm\",\n outletWidth2: \"μm\",\n outletLength2: \"μm\"\n };\n\n this.__minimum = {\n componentSpacing: 0,\n rotation: 0,\n height: 10,\n inletWidth: 1 * 1000,\n inletLength: 3 * 1000,\n outletWidth1: 0.5 * 1000,\n outletLength1: 2 * 1000,\n outletWidth2: 0.5 * 1000,\n outletLength2: 2 * 1000\n };\n\n this.__maximum = {\n componentSpacing: 10000,\n rotation: 360,\n height: 1200,\n inletWidth: 3 * 1000,\n inletLength: 8 * 1000,\n outletWidth1: 3 * 1000,\n outletLength1: 5 * 1000,\n outletWidth2: 3 * 1000,\n outletLength2: 5 * 1000\n };\n\n this.__placementTool = \"componentPositionTool\";\n\n this.__toolParams = {\n cursorPosition: \"position\"\n };\n\n this.__featureParams = {\n componentSpacing: \"componentSpacing\",\n position: \"position\",\n rotation: \"rotation\",\n height: \"height\",\n inletWidth: \"inletWidth\",\n inletLength: \"inletLength\",\n outletWidth1: \"outletWidth1\",\n outletLength1: \"outletLength1\",\n outletWidth2: \"outletWidth2\",\n outletLength2: \"outletLength2\"\n };\n\n this.__targetParams = {\n componentSpacing: \"componentSpacing\",\n rotation: \"rotation\",\n height: \"height\",\n inletWidth: \"inletWidth\",\n inletLength: \"inletLength\",\n outletWidth1: \"outletWidth1\",\n outletLength1: \"outletLength1\",\n outletWidth2: \"outletWidth2\",\n outletLength2: \"outletLength2\"\n };\n\n this.__renderKeys = [\"FLOW\"];\n\n this.__mint = \"DROPLET SPLITTER\";\n\n this.__zOffsetKeys = {\n FLOW: \"height\"\n };\n\n this.__substrateOffset = {\n FLOW: \"0\"\n };\n }\n\n getPorts(params: { [k: string]: any }) {\n const inletWidth = params.inletWidth;\n const inletLength = params.inletLength;\n const outletWidth1 = params.outletWidth1;\n const outletLength1 = params.outletLength1;\n const outletWidth2 = params.outletWidth2;\n const outletLength2 = params.outletLength2;\n\n const ports = [];\n\n // inlet\n ports.push(new ComponentPort(0, 0, \"1\", LogicalLayerType.FLOW));\n\n // outlet 1\n ports.push(new ComponentPort(inletLength - outletWidth1 / 2, -inletWidth / 2 - outletLength1, \"2\", LogicalLayerType.FLOW));\n\n // outlet 2\n ports.push(new ComponentPort(inletLength - outletWidth2 / 2, inletWidth / 2 + outletLength2, \"3\", LogicalLayerType.FLOW));\n\n return ports;\n }\n\n render2D(params: { [k: string]: any }, key: string) {\n const rotation = params.rotation;\n const x = params.position[0];\n const y = params.position[1];\n const color = params.color;\n const inletWidth = params.inletWidth;\n const inletLength = params.inletLength;\n const outletWidth1 = params.outletWidth1;\n const outletLength1 = params.outletLength1;\n const outletWidth2 = params.outletWidth2;\n const outletLength2 = params.outletLength2;\n\n const serp = new paper.CompoundPath(\"\");\n\n // inlet\n let topLeft = new paper.Point(x, y - inletWidth / 2);\n let bottomRight = new paper.Point(x + inletLength, y + inletWidth / 2);\n\n serp.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n // outlet 1\n topLeft = new paper.Point(x + inletLength - outletWidth1, y - inletWidth / 2 - outletLength1);\n bottomRight = new paper.Point(x + inletLength, y - inletWidth / 2);\n\n serp.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n // outlet 2\n topLeft = new paper.Point(x + inletLength - outletWidth2, y + inletWidth / 2);\n bottomRight = new paper.Point(x + inletLength, y + inletWidth / 2 + outletLength2);\n\n serp.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n serp.rotate(rotation, new paper.Point(x, y));\n\n serp.fillColor = color;\n return serp;\n }\n\n render2DTarget(key: string | null, params: { [k: string]: any }) {\n if (key === null) {\n key = this.__renderKeys[0];\n }\n const serp = this.render2D(params, key);\n serp.fillColor!.alpha = 0.5;\n return serp;\n }\n}\n","import Template from \"./template\";\nimport paper from \"paper\";\nimport ComponentPort from \"../core/componentPort\";\nimport { LogicalLayerType } from \"../core/init\";\n\nexport default class Node extends Template {\n constructor() {\n super();\n }\n\n __setupDefinitions(): void {\n this.__unique = {\n position: \"Point\"\n };\n\n this.__heritable = {\n componentSpacing: \"Float\",\n height: \"Float\"\n };\n\n this.__defaults = {\n componentSpacing: 1000,\n height: 100\n };\n\n this.__units = {\n componentSpacing: \"μm\",\n height: \"μm\"\n };\n\n this.__minimum = {\n componentSpacing: 10,\n height: 10\n };\n\n this.__maximum = {\n componentSpacing: 10000,\n height: 1000\n };\n\n this.__placementTool = \"componentPositionTool\";\n\n this.__toolParams = {\n position: \"position\"\n };\n\n this.__featureParams = {\n componentSpacing: \"componentSpacing\"\n };\n\n this.__targetParams = {\n componentSpacing: \"componentSpacing\"\n };\n\n this.__renderKeys = [\"FLOW\"];\n\n this.__mint = \"NODE\";\n\n this.__zOffsetKeys = {\n FLOW: \"height\"\n };\n\n this.__substrateOffset = {\n FLOW: \"0\"\n };\n }\n\n getPorts(params: { [k: string]: any }) {\n const ports = [];\n\n ports.push(new ComponentPort(0, 0, \"1\", LogicalLayerType.FLOW));\n\n return ports;\n }\n\n render2D(params: { [k: string]: any }, key: string) {\n // Regardless of the key...\n const pos = new paper.Point(0, 0);\n const outerCircle = new paper.Path.Circle(pos, 0);\n return outerCircle;\n }\n\n render2DTarget(key: string | null, params: { [k: string]: any }) {\n if (key === null) {\n key = this.__renderKeys[0];\n }\n const render = this.render2D(params, key);\n render.fillColor!.alpha = 0.5;\n return render;\n }\n}\n","import Template from \"./template\";\nimport paper from \"paper\";\nimport ComponentPort from \"../core/componentPort\";\nimport { LogicalLayerType } from \"../core/init\";\n\nexport default class DropletGeneratorT extends Template {\n constructor() {\n super();\n }\n\n __setupDefinitions(): void {\n this.__unique = {\n position: \"Point\"\n };\n\n this.__heritable = {\n componentSpacing: \"Float\",\n oilChannelWidth: \"Float\",\n waterChannelWidth: \"Float\",\n length: \"Float\",\n radius: \"Float\",\n // angle: \"Float\",\n height: \"Float\",\n rotation: \"Float\"\n };\n\n this.__defaults = {\n componentSpacing: 1000,\n oilChannelWidth: 0.6 * 1000,\n waterChannelWidth: 0.3 * 1000,\n length: 5 * 1000,\n radius: 500,\n height: 250,\n rotation: 0\n };\n\n this.__units = {\n componentSpacing: \"μm\",\n oilChannelWidth: \"μm\",\n height: \"μm\",\n waterChannelWidth: \"μm\",\n radius: \"μm\",\n rotation: \"°\",\n length: \"μm\"\n };\n\n this.__minimum = {\n componentSpacing: 0,\n oilChannelWidth: 1,\n waterChannelWidth: 1,\n radius: 1,\n rotation: 0,\n length: 0 * 1000\n };\n\n this.__maximum = {\n componentSpacing: 10000,\n oilChannelWidth: 2000,\n waterChannelWidth: 2000,\n height: 1200,\n radius: 2000,\n rotation: 360,\n length: 8 * 1000\n };\n\n this.__featureParams = {\n componentSpacing: \"componentSpacing\",\n position: \"position\",\n oilChannelWidth: \"oilChannelWidth\",\n waterChannelWidth: \"waterChannelWidth\",\n height: \"height\",\n rotation: \"rotation\",\n radius: \"radius\",\n length: \"length\"\n };\n\n this.__targetParams = {\n componentSpacing: \"componentSpacing\",\n oilChannelWidth: \"oilChannelWidth\",\n waterChannelWidth: \"waterChannelWidth\",\n height: \"height\",\n rotation: \"rotation\",\n radius: \"radius\",\n length: \"length\"\n };\n\n this.__placementTool = \"componentPositionTool\";\n\n this.__toolParams = {\n position: \"position\"\n };\n\n this.__renderKeys = [\"FLOW\"];\n\n this.__mint = \"DROPLET GENERATOR T\";\n\n this.__zOffsetKeys = {\n FLOW: \"height\"\n };\n\n this.__substrateOffset = {\n FLOW: \"0\"\n };\n }\n\n getPorts(params: { [k: string]: any }) {\n const length = params.length;\n\n const ports = [];\n\n ports.push(new ComponentPort(length / 2, 0, \"1\", LogicalLayerType.FLOW));\n\n // Out\n return ports;\n }\n\n render2D(params: { [k: string]: any }, key: string) {\n const pos = params.position;\n const x = pos[0];\n const y = pos[1];\n const color = params.color;\n const oilChannelWidth = params.oilChannelWidth;\n const waterChannelWidth = params.waterChannelWidth;\n const radius = params.radius;\n const rotation = params.rotation;\n const length = params.length;\n\n const ret = new paper.CompoundPath(\"\");\n\n let topLeft = new paper.Point(x - length / 2, y - oilChannelWidth / 2);\n let bottomRight = new paper.Point(x + length / 2, y + oilChannelWidth / 2);\n\n ret.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n let circ = new paper.Path.Circle(new paper.Point(x - length / 2, y), radius);\n\n ret.addChild(circ);\n\n topLeft = new paper.Point(x - waterChannelWidth / 2, y);\n bottomRight = new paper.Point(x + waterChannelWidth / 2, y + length / 2);\n\n ret.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n circ = new paper.Path.Circle(new paper.Point(x, y + length / 2), radius);\n\n ret.addChild(circ);\n\n // Rotate the geometry\n ret.closed = true;\n ret.rotate(rotation, new paper.Point(x, y));\n ret.fillColor = color;\n\n return ret;\n }\n\n render2DTarget(key: string | null, params: { [k: string]: any }) {\n if (key === null) {\n key = this.__renderKeys[0];\n }\n const render = this.render2D(params, key);\n render.fillColor!.alpha = 0.5;\n return render;\n }\n}\n","import Template from \"./template\";\nimport paper from \"paper\";\nimport ComponentPort from \"../core/componentPort\";\nimport { LogicalLayerType } from \"../core/init\";\n\nexport default class DropletGeneratorFlowFocus extends Template {\n constructor() {\n super();\n }\n\n __setupDefinitions(): void {\n this.__unique = {\n position: \"Point\"\n };\n\n this.__heritable = {\n componentSpacing: \"Float\",\n oilChannelWidth: \"Float\",\n waterChannelWidth: \"Float\",\n length: \"Float\",\n radius: \"Float\",\n angle: \"Float\",\n height: \"Float\",\n rotation: \"Float\"\n };\n\n this.__defaults = {\n componentSpacing: 1000,\n oilChannelWidth: 0.4 * 1000,\n waterChannelWidth: 0.2 * 1000,\n length: 3 * 1000,\n radius: 500,\n angle: 45,\n height: 250,\n rotation: 0\n };\n\n this.__units = {\n componentSpacing: \"μm\",\n oilChannelWidth: \"μm\",\n height: \"μm\",\n waterChannelWidth: \"μm\",\n radius: \"μm\",\n length: \"μm\",\n rotation: \"°\",\n angle: \"°\"\n };\n\n this.__minimum = {\n componentSpacing: 0,\n oilChannelWidth: 1,\n waterChannelWidth: 1,\n length: 1,\n radius: 1,\n angle: 1,\n rotation: 0\n };\n\n this.__maximum = {\n componentSpacing: 10000,\n oilChannelWidth: 2000,\n waterChannelWidth: 2000,\n length: 20000,\n angle: 360,\n height: 1200,\n radius: 2000,\n rotation: 360\n };\n\n this.__featureParams = {\n componentSpacing: \"componentSpacing\",\n position: \"position\",\n oilChannelWidth: \"oilChannelWidth\",\n waterChannelWidth: \"waterChannelWidth\",\n length: \"length\",\n angle: \"angle\",\n height: \"height\",\n rotation: \"rotation\",\n radius: \"radius\"\n };\n\n this.__targetParams = {\n componentSpacing: \"componentSpacing\",\n oilChannelWidth: \"oilChannelWidth\",\n waterChannelWidth: \"waterChannelWidth\",\n length: \"length\",\n angle: \"angle\",\n height: \"height\",\n rotation: \"rotation\",\n radius: \"radius\"\n };\n\n this.__placementTool = \"componentPositionTool\";\n\n this.__toolParams = {\n position: \"position\"\n };\n\n this.__renderKeys = [\"FLOW\"];\n\n this.__mint = \"DROPLET GENERATOR FLOW FOCUS\";\n\n this.__zOffsetKeys = {\n FLOW: \"height\"\n };\n\n this.__substrateOffset = {\n FLOW: \"0\"\n };\n }\n\n getPorts(params: { [k: string]: any }) {\n const ports = [];\n\n ports.push(new ComponentPort(0, 0, \"1\", LogicalLayerType.FLOW));\n\n // Out\n return ports;\n }\n\n render2D(params: { [k: string]: any }, key: string) {\n const pos = params.position;\n const x = pos[0];\n const y = pos[1];\n const color = params.color;\n const oilChannelWidth = params.oilChannelWidth;\n const waterChannelWidth = params.waterChannelWidth;\n const length = params.length;\n const angle = params.angle;\n const radius = params.radius;\n const rotation = params.rotation;\n\n const ret = new paper.CompoundPath(\"\");\n\n // middle path\n let topLeft = new paper.Point(x - length / 3 - 2 * length, y - waterChannelWidth / 2);\n let bottomRight = new paper.Point(x, y + waterChannelWidth / 2);\n\n ret.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n let circ = new paper.Path.Circle(new paper.Point(x - length / 3 - 2 * length, y), radius);\n\n ret.addChild(circ);\n // top tilt path\n const Hlength = length / Math.cos((angle * Math.PI) / 180);\n\n topLeft = new paper.Point(x - length / 3 - Hlength, y - oilChannelWidth / 2);\n bottomRight = new paper.Point(x - length / 3, y + oilChannelWidth / 2);\n\n let tiltBlock = new paper.Path.Rectangle(topLeft, bottomRight);\n tiltBlock.rotate(angle, new paper.Point(x - length / 3, y));\n\n ret.addChild(tiltBlock);\n\n // bottom tilt path\n tiltBlock = new paper.Path.Rectangle(topLeft, bottomRight);\n tiltBlock.rotate(-angle, new paper.Point(x - length / 3, y));\n\n ret.addChild(tiltBlock);\n\n // top part\n const disFromMid = Hlength * Math.sin((angle * Math.PI) / 180);\n const angleS = 90 - angle;\n const seamCover = (oilChannelWidth / 2) * Math.tan((angleS * Math.PI) / 180);\n\n topLeft = new paper.Point(x - length / 3 - length - oilChannelWidth / 2, y - disFromMid - (2 * length) / 3 + seamCover);\n bottomRight = new paper.Point(x - length / 3 - length + oilChannelWidth / 2, y - disFromMid + seamCover);\n\n ret.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n topLeft = new paper.Point(x - length / 3 - 2 * length, y - disFromMid - (2 * length) / 3 + seamCover);\n bottomRight = new paper.Point(x - length / 3 - length - oilChannelWidth / 2, y - disFromMid - (2 * length) / 3 + oilChannelWidth + seamCover);\n\n ret.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n circ = new paper.Path.Circle(new paper.Point(x - length / 3 - 2 * length, y - disFromMid - (2 * length) / 3 + seamCover + oilChannelWidth / 2), radius);\n\n ret.addChild(circ);\n\n // bottom part\n topLeft = new paper.Point(x - length / 3 - length - oilChannelWidth / 2, y + disFromMid + (2 * length) / 3 - seamCover);\n bottomRight = new paper.Point(x - length / 3 - length + oilChannelWidth / 2, y + disFromMid - seamCover);\n\n ret.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n topLeft = new paper.Point(x - length / 3 - 2 * length, y + disFromMid + (2 * length) / 3 - seamCover);\n bottomRight = new paper.Point(x - length / 3 - length - oilChannelWidth / 2, y + disFromMid + (2 * length) / 3 - oilChannelWidth - seamCover);\n\n ret.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n circ = new paper.Path.Circle(new paper.Point(x - length / 3 - 2 * length, y + disFromMid + (2 * length) / 3 - seamCover - oilChannelWidth / 2), radius);\n\n ret.addChild(circ);\n\n // Rotate the geometry\n ret.rotate(rotation, new paper.Point(pos[0], pos[1]));\n\n ret.closed = true;\n ret.fillColor = color;\n return ret;\n }\n\n render2DTarget(key: string | null, params: { [k: string]: any }) {\n if (key === null) {\n key = this.__renderKeys[0];\n }\n const render = this.render2D(params, key);\n render.fillColor!.alpha = 0.5;\n return render;\n }\n}\n","import Template from \"./template\";\nimport paper from \"paper\";\nimport ComponentPort from \"../core/componentPort\";\nimport { LogicalLayerType } from \"../core/init\";\n\nexport default class LogicArray extends Template {\n constructor() {\n super();\n }\n\n __setupDefinitions(): void {\n this.__unique = {\n position: \"Point\"\n };\n\n this.__heritable = {\n componentSpacing: \"Float\",\n chamberWidth: \"Float\",\n height: \"Float\",\n chamberLength: \"Float\",\n flowChannelWidth: \"Float\",\n controlChannelWidth: \"Float\",\n portRadius: \"Float\",\n rotation: \"Float\"\n };\n\n this.__defaults = {\n componentSpacing: 1000,\n height: 1.1 * 1000,\n chamberWidth: 1.5 * 1000,\n chamberLength: 1.5 * 1000,\n flowChannelWidth: 0.6 * 1000,\n controlChannelWidth: 0.4 * 1000,\n portRadius: 1000,\n rotation: 0\n };\n\n this.__units = {\n componentSpacing: \"μm\",\n chamberWidth: \"μm\",\n chamberLength: \"μm\",\n flowChannelWidth: \"μm\",\n controlChannelWidth: \"μm\",\n portRadius: \"μm\",\n height: \"μm\",\n rotation: \"°\"\n };\n\n this.__minimum = {\n componentSpacing: 0,\n height: 1,\n chamberWidth: 1,\n chamberLength: 1,\n flowChannelWidth: 1,\n controlChannelWidth: 1,\n portRadius: 1,\n rotation: 0\n };\n\n this.__maximum = {\n componentSpacing: 10000,\n height: 1.1 * 10000,\n chamberWidth: 10000,\n chamberLength: 10000,\n flowChannelWidth: 10000,\n controlChannelWidth: 10000,\n portRadius: 10000,\n rotation: 360\n };\n\n this.__placementTool = \"multilayerPositionTool\";\n\n this.__toolParams = {\n position: \"position\"\n };\n\n this.__featureParams = {\n componentSpacing: \"componentSpacing\",\n chamberWidth: \"chamberWidth\",\n flowChannelWidth: \"flowChannelWidth\",\n controlChannelWidth: \"controlChannelWidth\",\n portRadius: \"portRadius\",\n chamberLength: \"chamberLength\",\n height: \"height\",\n position: \"position\",\n rotation: \"rotation\"\n };\n\n this.__targetParams = {\n componentSpacing: \"componentSpacing\",\n chamberWidth: \"chamberWidth\",\n flowChannelWidth: \"flowChannelWidth\",\n controlChannelWidth: \"controlChannelWidth\",\n portRadius: \"portRadius\",\n chamberLength: \"chamberLength\",\n height: \"height\",\n rotation: \"rotation\"\n };\n\n this.__renderKeys = [\"FLOW\", \"CONTROL\", \"CELL\"];\n\n this.__mint = \"LOGIC ARRAY\";\n\n this.__zOffsetKeys = {\n FLOW: \"height\",\n CONTROL: \"height\",\n CELL: \"height\"\n };\n\n this.__substrateOffset = {\n FLOW: \"0\",\n CONTROL: \"+1\",\n CELL: \"0\"\n };\n }\n\n render2D(params: { [k: string]: any }, key: string) {\n if (key === \"FLOW\") {\n return this.__drawFlow(params);\n } else if (key === \"CONTROL\") {\n return this.__drawControl(params);\n } else if (key === \"CELL\") {\n console.log(\"cell\");\n return this.__drawCell(params);\n }\n throw new Error(\"Invalid key passed to LogicArray render2D\");\n }\n\n __drawFlow(params: { [k: string]: any }) {\n const x = params.position[0];\n const y = params.position[1];\n const color = params.color;\n const spacing = params.componentSpacing;\n const chamberWidth = params.chamberWidth;\n const flowChannelWidth = params.flowChannelWidth;\n const controlChannelWidth = params.controlChannelWidth;\n const portRadius = params.portRadius;\n const chamberLength = params.chamberLength;\n const rotation = params.rotation;\n\n const ret = new paper.CompoundPath(\"\");\n const topDistance = 14 * spacing;\n const inWidth = 5 * spacing;\n const pathLength = 20 * spacing;\n const extraLength = 2 * spacing;\n\n // middle path\n let topLeft = new paper.Point(x, y - flowChannelWidth / 2);\n let bottomRight = new paper.Point(x + pathLength, y + flowChannelWidth / 2);\n\n let rec: paper.Rectangle | paper.PathItem = new paper.Path.Rectangle(topLeft, bottomRight);\n\n /// / left\n topLeft = new paper.Point(x + (2 * inWidth) / 3 - controlChannelWidth, y - flowChannelWidth / 2 - controlChannelWidth);\n bottomRight = new paper.Point(x + (2 * inWidth) / 3 + controlChannelWidth, y + flowChannelWidth / 2 + controlChannelWidth);\n rec = rec.subtract(new paper.Path.Rectangle(topLeft, bottomRight));\n\n /// / second left\n topLeft = new paper.Point(x + inWidth + pathLength / 2 - extraLength - controlChannelWidth, y - flowChannelWidth / 2 - controlChannelWidth);\n bottomRight = new paper.Point(x + inWidth + pathLength / 2 - extraLength + controlChannelWidth, y + flowChannelWidth / 2 + controlChannelWidth);\n rec = rec.subtract(new paper.Path.Rectangle(topLeft, bottomRight));\n\n /// / right\n topLeft = new paper.Point(x + inWidth + pathLength / 2 + extraLength - controlChannelWidth, y - flowChannelWidth / 2 - controlChannelWidth);\n bottomRight = new paper.Point(x + inWidth + pathLength / 2 + extraLength + controlChannelWidth, y + flowChannelWidth / 2 + controlChannelWidth);\n rec = rec.subtract(new paper.Path.Rectangle(topLeft, bottomRight));\n ret.addChild(rec);\n\n // top part ** cut\n topLeft = new paper.Point(x, y - topDistance - flowChannelWidth / 2);\n bottomRight = new paper.Point(x + inWidth, y - topDistance + flowChannelWidth / 2);\n\n rec = new paper.Path.Rectangle(topLeft, bottomRight);\n\n topLeft = new paper.Point(x + inWidth / 3 - controlChannelWidth, y - topDistance - flowChannelWidth / 2 - controlChannelWidth);\n bottomRight = new paper.Point(x + inWidth / 3 + controlChannelWidth, y - topDistance + flowChannelWidth / 2 + controlChannelWidth);\n\n const cutrec = new paper.Path.Rectangle(topLeft, bottomRight);\n\n rec = rec.subtract(cutrec);\n\n ret.addChild(rec);\n\n topLeft = new paper.Point(x + inWidth - flowChannelWidth / 2, y - topDistance - topDistance / 2);\n bottomRight = new paper.Point(x + inWidth + flowChannelWidth / 2, y - topDistance + topDistance / 2);\n\n ret.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n topLeft = new paper.Point(x + inWidth, y - topDistance - topDistance / 2);\n bottomRight = new paper.Point(x + inWidth + pathLength, y - topDistance - topDistance / 2 + flowChannelWidth);\n\n ret.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n topLeft = new paper.Point(x + inWidth + pathLength - flowChannelWidth, y - topDistance - topDistance / 2);\n bottomRight = new paper.Point(x + inWidth + pathLength, y - topDistance + topDistance / 2);\n\n ret.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n // top part bottom line ** cut for control\n topLeft = new paper.Point(x + inWidth, y - topDistance + topDistance / 2 - flowChannelWidth);\n bottomRight = new paper.Point(x + inWidth + pathLength, y - topDistance + topDistance / 2);\n\n rec = new paper.Path.Rectangle(topLeft, bottomRight);\n\n /// / left\n topLeft = new paper.Point(x + pathLength / 2 - extraLength - controlChannelWidth, y - topDistance / 2 - flowChannelWidth - controlChannelWidth);\n bottomRight = new paper.Point(x + pathLength / 2 - extraLength + controlChannelWidth, y - topDistance / 2 + controlChannelWidth);\n rec = rec.subtract(new paper.Path.Rectangle(topLeft, bottomRight));\n\n /// / second left\n topLeft = new paper.Point(x + inWidth + pathLength / 2 - extraLength - controlChannelWidth, y - topDistance / 2 - flowChannelWidth - controlChannelWidth);\n bottomRight = new paper.Point(x + inWidth + pathLength / 2 - extraLength + controlChannelWidth, y - topDistance / 2 + controlChannelWidth);\n rec = rec.subtract(new paper.Path.Rectangle(topLeft, bottomRight));\n\n /// / second right\n topLeft = new paper.Point(x + inWidth + pathLength / 2 + extraLength - controlChannelWidth, y - topDistance / 2 - flowChannelWidth - controlChannelWidth);\n bottomRight = new paper.Point(x + inWidth + pathLength / 2 + extraLength + controlChannelWidth, y - topDistance / 2 + controlChannelWidth);\n rec = rec.subtract(new paper.Path.Rectangle(topLeft, bottomRight));\n\n /// / right\n topLeft = new paper.Point(x + 2 * inWidth + pathLength / 2 + extraLength - controlChannelWidth, y - topDistance / 2 - flowChannelWidth - controlChannelWidth);\n bottomRight = new paper.Point(x + 2 * inWidth + pathLength / 2 + extraLength + controlChannelWidth, y - topDistance / 2 + controlChannelWidth);\n rec = rec.subtract(new paper.Path.Rectangle(topLeft, bottomRight));\n ret.addChild(rec);\n\n // bottom part ** cut\n topLeft = new paper.Point(x, y + topDistance + flowChannelWidth / 2);\n bottomRight = new paper.Point(x + inWidth, y + topDistance - flowChannelWidth / 2);\n\n rec = new paper.Path.Rectangle(topLeft, bottomRight);\n\n topLeft = new paper.Point(x + inWidth / 3 - controlChannelWidth, y + topDistance - flowChannelWidth / 2 - controlChannelWidth);\n bottomRight = new paper.Point(x + inWidth / 3 + controlChannelWidth, y + topDistance + flowChannelWidth / 2 + controlChannelWidth);\n rec = rec.subtract(new paper.Path.Rectangle(topLeft, bottomRight));\n ret.addChild(rec);\n\n topLeft = new paper.Point(x + inWidth - flowChannelWidth / 2, y + topDistance + topDistance / 2);\n bottomRight = new paper.Point(x + inWidth + flowChannelWidth / 2, y + topDistance - topDistance / 2);\n\n ret.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n topLeft = new paper.Point(x + inWidth, y + topDistance + topDistance / 2);\n bottomRight = new paper.Point(x + inWidth + pathLength, y + topDistance + topDistance / 2 - flowChannelWidth);\n\n ret.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n topLeft = new paper.Point(x + inWidth + pathLength - flowChannelWidth, y + topDistance + topDistance / 2);\n bottomRight = new paper.Point(x + inWidth + pathLength, y + topDistance - topDistance / 2);\n\n ret.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n // bottom part top line ** cut for control\n topLeft = new paper.Point(x + inWidth, y + topDistance - topDistance / 2 + flowChannelWidth);\n bottomRight = new paper.Point(x + inWidth + pathLength, y + topDistance - topDistance / 2);\n\n rec = new paper.Path.Rectangle(topLeft, bottomRight);\n\n /// / left\n topLeft = new paper.Point(x + pathLength / 2 - extraLength - controlChannelWidth, y + topDistance / 2 - controlChannelWidth);\n bottomRight = new paper.Point(x + pathLength / 2 - extraLength + controlChannelWidth, y + topDistance / 2 + flowChannelWidth + controlChannelWidth);\n rec = rec.subtract(new paper.Path.Rectangle(topLeft, bottomRight));\n\n /// / second left\n topLeft = new paper.Point(x + inWidth + pathLength / 2 - extraLength - controlChannelWidth, y + topDistance / 2 - controlChannelWidth);\n bottomRight = new paper.Point(x + inWidth + pathLength / 2 - extraLength + controlChannelWidth, y + topDistance / 2 + flowChannelWidth + controlChannelWidth);\n rec = rec.subtract(new paper.Path.Rectangle(topLeft, bottomRight));\n\n /// / second right\n topLeft = new paper.Point(x + inWidth + pathLength / 2 + extraLength - controlChannelWidth, y + topDistance / 2 - controlChannelWidth);\n bottomRight = new paper.Point(x + inWidth + pathLength / 2 + extraLength + controlChannelWidth, y + topDistance / 2 + flowChannelWidth + controlChannelWidth);\n rec = rec.subtract(new paper.Path.Rectangle(topLeft, bottomRight));\n\n /// / right\n topLeft = new paper.Point(x + 2 * inWidth + pathLength / 2 + extraLength - controlChannelWidth, y + topDistance / 2 - controlChannelWidth);\n bottomRight = new paper.Point(x + 2 * inWidth + pathLength / 2 + extraLength + controlChannelWidth, y + topDistance / 2 + flowChannelWidth + controlChannelWidth);\n rec = rec.subtract(new paper.Path.Rectangle(topLeft, bottomRight));\n ret.addChild(rec);\n\n // insde middle ** cut\n topLeft = new paper.Point(x + inWidth + pathLength / 2 - flowChannelWidth / 2, y - topDistance / 2);\n bottomRight = new paper.Point(x + inWidth + pathLength / 2 + flowChannelWidth / 2, y + topDistance / 2);\n\n rec = new paper.Path.Rectangle(topLeft, bottomRight);\n\n /// / top\n topLeft = new paper.Point(x + inWidth + pathLength / 2 - flowChannelWidth / 2 - controlChannelWidth, y - topDistance / 2 + 4 * spacing - controlChannelWidth);\n bottomRight = new paper.Point(x + inWidth + pathLength / 2 + flowChannelWidth / 2 + controlChannelWidth, y - topDistance / 2 + 4 * spacing + controlChannelWidth);\n rec = rec.subtract(new paper.Path.Rectangle(topLeft, bottomRight));\n\n /// / bottom\n topLeft = new paper.Point(x + inWidth + pathLength / 2 - flowChannelWidth / 2 - controlChannelWidth, y + topDistance / 2 - 4 * spacing - controlChannelWidth);\n bottomRight = new paper.Point(x + inWidth + pathLength / 2 + flowChannelWidth / 2 + controlChannelWidth, y + topDistance / 2 - 4 * spacing + controlChannelWidth);\n rec = rec.subtract(new paper.Path.Rectangle(topLeft, bottomRight));\n ret.addChild(rec);\n\n // inside left ** cut\n topLeft = new paper.Point(x + pathLength / 2 - flowChannelWidth / 2, y - topDistance - topDistance / 4);\n bottomRight = new paper.Point(x + pathLength / 2 + flowChannelWidth / 2, y + topDistance + topDistance / 4);\n\n rec = new paper.Path.Rectangle(topLeft, bottomRight);\n\n /// / top\n topLeft = new paper.Point(x + pathLength / 2 - flowChannelWidth / 2 - controlChannelWidth, y - topDistance / 2 - 5 * spacing - controlChannelWidth);\n bottomRight = new paper.Point(x + pathLength / 2 + flowChannelWidth / 2 + controlChannelWidth, y - topDistance / 2 - 5 * spacing + controlChannelWidth);\n rec = rec.subtract(new paper.Path.Rectangle(topLeft, bottomRight));\n\n /// / second top\n topLeft = new paper.Point(x + pathLength / 2 - flowChannelWidth / 2 - controlChannelWidth, y - topDistance / 2 + 3 * spacing - controlChannelWidth);\n bottomRight = new paper.Point(x + pathLength / 2 + flowChannelWidth / 2 + controlChannelWidth, y - topDistance / 2 + 3 * spacing + controlChannelWidth);\n rec = rec.subtract(new paper.Path.Rectangle(topLeft, bottomRight));\n\n /// / second bottom\n topLeft = new paper.Point(x + pathLength / 2 - flowChannelWidth / 2 - controlChannelWidth, y + topDistance / 2 - 3 * spacing - controlChannelWidth);\n bottomRight = new paper.Point(x + pathLength / 2 + flowChannelWidth / 2 + controlChannelWidth, y + topDistance / 2 - 3 * spacing + controlChannelWidth);\n rec = rec.subtract(new paper.Path.Rectangle(topLeft, bottomRight));\n\n /// / bottom\n topLeft = new paper.Point(x + pathLength / 2 - flowChannelWidth / 2 - controlChannelWidth, y + topDistance / 2 + 5 * spacing - controlChannelWidth);\n bottomRight = new paper.Point(x + pathLength / 2 + flowChannelWidth / 2 + controlChannelWidth, y + topDistance / 2 + 5 * spacing + controlChannelWidth);\n rec = rec.subtract(new paper.Path.Rectangle(topLeft, bottomRight));\n ret.addChild(rec);\n\n let circ = new paper.Path.Circle(new paper.Point(x + pathLength / 2, y - topDistance - topDistance / 4), portRadius);\n\n ret.addChild(circ);\n\n circ = new paper.Path.Circle(new paper.Point(x + pathLength / 2, y + topDistance + topDistance / 4), portRadius);\n\n ret.addChild(circ);\n\n // inside right ** cut\n topLeft = new paper.Point(x + 2 * inWidth + pathLength / 2 - flowChannelWidth, y - topDistance - topDistance / 4);\n bottomRight = new paper.Point(x + 2 * inWidth + pathLength / 2, y + topDistance + topDistance / 4);\n\n rec = new paper.Path.Rectangle(topLeft, bottomRight);\n\n /// / top\n topLeft = new paper.Point(x + 2 * inWidth + pathLength / 2 - flowChannelWidth - controlChannelWidth, y - topDistance / 2 - 2 * spacing - controlChannelWidth);\n bottomRight = new paper.Point(x + 2 * inWidth + pathLength / 2 + controlChannelWidth, y - topDistance / 2 - 2 * spacing + controlChannelWidth);\n rec = rec.subtract(new paper.Path.Rectangle(topLeft, bottomRight));\n\n /// / second top\n topLeft = new paper.Point(x + 2 * inWidth + pathLength / 2 - flowChannelWidth - controlChannelWidth, y - topDistance / 2 + 5 * spacing - controlChannelWidth);\n bottomRight = new paper.Point(x + 2 * inWidth + pathLength / 2 + controlChannelWidth, y - topDistance / 2 + 5 * spacing + controlChannelWidth);\n rec = rec.subtract(new paper.Path.Rectangle(topLeft, bottomRight));\n\n /// / second bottom\n topLeft = new paper.Point(x + 2 * inWidth + pathLength / 2 - flowChannelWidth - controlChannelWidth, y + topDistance / 2 - 5 * spacing - controlChannelWidth);\n bottomRight = new paper.Point(x + 2 * inWidth + pathLength / 2 + controlChannelWidth, y + topDistance / 2 - 5 * spacing + controlChannelWidth);\n rec = rec.subtract(new paper.Path.Rectangle(topLeft, bottomRight));\n\n /// / bottom\n topLeft = new paper.Point(x + 2 * inWidth + pathLength / 2 - flowChannelWidth - controlChannelWidth, y + topDistance / 2 + 2 * spacing - controlChannelWidth);\n bottomRight = new paper.Point(x + 2 * inWidth + pathLength / 2 + controlChannelWidth, y + topDistance / 2 + 2 * spacing + controlChannelWidth);\n rec = rec.subtract(new paper.Path.Rectangle(topLeft, bottomRight));\n ret.addChild(rec);\n\n circ = new paper.Path.Circle(new paper.Point(x + 2 * inWidth + pathLength / 2 - flowChannelWidth / 2, y - topDistance - topDistance / 4), portRadius);\n\n ret.addChild(circ);\n\n circ = new paper.Path.Circle(new paper.Point(x + 2 * inWidth + pathLength / 2 - flowChannelWidth / 2, y + topDistance + topDistance / 4), portRadius);\n\n ret.addChild(circ);\n\n ret.fillColor = color;\n ret.rotate(rotation, new paper.Point(x, y));\n return ret;\n }\n\n __drawControl(params: { [k: string]: any }) {\n const x = params.position[0];\n const y = params.position[1];\n const color = params.color;\n const spacing = params.componentSpacing;\n const chamberWidth = params.chamberWidth;\n const flowChannelWidth = params.flowChannelWidth;\n const controlChannelWidth = params.controlChannelWidth;\n const portRadius = params.portRadius;\n const chamberLength = params.chamberLength;\n const rotation = params.rotation;\n\n const ret = new paper.CompoundPath(\"\");\n const topDistance = 14 * spacing;\n const inWidth = 5 * spacing;\n const pathLength = 20 * spacing;\n\n const extraLength = 2 * spacing;\n\n const control = new paper.CompoundPath(\"\");\n\n // control 24\n let topLeft = new paper.Point(x + inWidth / 3 - controlChannelWidth / 2, y - topDistance - topDistance / 2 - extraLength);\n let bottomRight = new paper.Point(x + inWidth / 3 + controlChannelWidth / 2, y - topDistance);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n topLeft = new paper.Point(x + inWidth / 3 - controlChannelWidth, y - topDistance - flowChannelWidth / 2 - controlChannelWidth);\n bottomRight = new paper.Point(x + inWidth / 3 + controlChannelWidth, y - topDistance + flowChannelWidth / 2 + controlChannelWidth);\n\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n // cnotrol 25\n topLeft = new paper.Point(x + (2 * inWidth) / 3 - controlChannelWidth / 2, y - topDistance - topDistance / 2 - extraLength);\n bottomRight = new paper.Point(x + (2 * inWidth) / 3 + controlChannelWidth / 2, y);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n topLeft = new paper.Point(x + (2 * inWidth) / 3 - controlChannelWidth, y - flowChannelWidth / 2 - controlChannelWidth);\n bottomRight = new paper.Point(x + (2 * inWidth) / 3 + controlChannelWidth, y + flowChannelWidth / 2 + controlChannelWidth);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n // control 26\n topLeft = new paper.Point(x + inWidth / 3 - controlChannelWidth / 2, y + topDistance + topDistance / 2 + extraLength);\n bottomRight = new paper.Point(x + inWidth / 3 + controlChannelWidth / 2, y + topDistance);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n topLeft = new paper.Point(x + inWidth / 3 - controlChannelWidth, y + topDistance - flowChannelWidth / 2 - controlChannelWidth);\n bottomRight = new paper.Point(x + inWidth / 3 + controlChannelWidth, y + topDistance + flowChannelWidth / 2 + controlChannelWidth);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n // control 8\n topLeft = new paper.Point(x + 2 * inWidth + pathLength / 2 - flowChannelWidth / 2, y - topDistance / 2 - 2 * spacing - controlChannelWidth / 2);\n bottomRight = new paper.Point(x + inWidth + pathLength + extraLength, y - topDistance / 2 - 2 * spacing + controlChannelWidth / 2);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n topLeft = new paper.Point(x + 2 * inWidth + pathLength / 2 - flowChannelWidth - controlChannelWidth, y - topDistance / 2 - 2 * spacing - controlChannelWidth);\n bottomRight = new paper.Point(x + 2 * inWidth + pathLength / 2 + controlChannelWidth, y - topDistance / 2 - 2 * spacing + controlChannelWidth);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n // control 7\n topLeft = new paper.Point(x + inWidth + pathLength / 2 + extraLength, y - topDistance / 2 - 3 * spacing - controlChannelWidth / 2);\n bottomRight = new paper.Point(x + inWidth + pathLength + extraLength, y - topDistance / 2 - 3 * spacing + controlChannelWidth / 2);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n topLeft = new paper.Point(x + inWidth + pathLength / 2 + extraLength - controlChannelWidth / 2, y - topDistance / 2 - 3 * spacing - controlChannelWidth / 2);\n bottomRight = new paper.Point(x + inWidth + pathLength / 2 + extraLength + controlChannelWidth / 2, y - topDistance / 2);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n topLeft = new paper.Point(x + inWidth + pathLength / 2 + extraLength - controlChannelWidth, y - topDistance / 2 - flowChannelWidth - controlChannelWidth);\n bottomRight = new paper.Point(x + inWidth + pathLength / 2 + extraLength + controlChannelWidth, y - topDistance / 2 + controlChannelWidth);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n // control 6\n topLeft = new paper.Point(x + inWidth + pathLength / 2 - extraLength, y - topDistance / 2 - 4 * spacing - controlChannelWidth / 2);\n bottomRight = new paper.Point(x + inWidth + pathLength + extraLength, y - topDistance / 2 - 4 * spacing + controlChannelWidth / 2);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n topLeft = new paper.Point(x + inWidth + pathLength / 2 - extraLength - controlChannelWidth / 2, y - topDistance / 2 - 4 * spacing - controlChannelWidth / 2);\n bottomRight = new paper.Point(x + inWidth + pathLength / 2 - extraLength + controlChannelWidth / 2, y - topDistance / 2);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n topLeft = new paper.Point(x + inWidth + pathLength / 2 - extraLength - controlChannelWidth, y - topDistance / 2 - flowChannelWidth - controlChannelWidth);\n bottomRight = new paper.Point(x + inWidth + pathLength / 2 - extraLength + controlChannelWidth, y - topDistance / 2 + controlChannelWidth);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n // control 5\n topLeft = new paper.Point(x + pathLength / 2, y - topDistance / 2 - 5 * spacing - controlChannelWidth / 2);\n bottomRight = new paper.Point(x + inWidth + pathLength + extraLength, y - topDistance / 2 - 5 * spacing + controlChannelWidth / 2);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n topLeft = new paper.Point(x + pathLength / 2 - flowChannelWidth / 2 - controlChannelWidth, y - topDistance / 2 - 5 * spacing - controlChannelWidth);\n bottomRight = new paper.Point(x + pathLength / 2 + flowChannelWidth / 2 + controlChannelWidth, y - topDistance / 2 - 5 * spacing + controlChannelWidth);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n // control 4\n topLeft = new paper.Point(x + pathLength / 2 - extraLength, y - topDistance / 2 - 6 * spacing - controlChannelWidth / 2);\n bottomRight = new paper.Point(x + inWidth + pathLength + extraLength, y - topDistance / 2 - 6 * spacing + controlChannelWidth / 2);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n topLeft = new paper.Point(x + pathLength / 2 - extraLength - controlChannelWidth / 2, y - topDistance / 2 - 6 * spacing - controlChannelWidth / 2);\n bottomRight = new paper.Point(x + pathLength / 2 - extraLength + controlChannelWidth / 2, y - topDistance / 2);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n topLeft = new paper.Point(x + pathLength / 2 - extraLength - controlChannelWidth, y - topDistance / 2 - flowChannelWidth - controlChannelWidth);\n bottomRight = new paper.Point(x + pathLength / 2 - extraLength + controlChannelWidth, y - topDistance / 2 + controlChannelWidth);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n // control 19\n topLeft = new paper.Point(x + 2 * inWidth + pathLength / 2 - flowChannelWidth / 2, y + topDistance / 2 + 2 * spacing + controlChannelWidth / 2);\n bottomRight = new paper.Point(x + inWidth + pathLength + extraLength, y + topDistance / 2 + 2 * spacing - controlChannelWidth / 2);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n topLeft = new paper.Point(x + 2 * inWidth + pathLength / 2 - flowChannelWidth - controlChannelWidth, y + topDistance / 2 + 2 * spacing - controlChannelWidth);\n bottomRight = new paper.Point(x + 2 * inWidth + pathLength / 2 + controlChannelWidth, y + topDistance / 2 + 2 * spacing + controlChannelWidth);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n // control 20\n topLeft = new paper.Point(x + inWidth + pathLength / 2 + extraLength, y + topDistance / 2 + 3 * spacing + controlChannelWidth / 2);\n bottomRight = new paper.Point(x + inWidth + pathLength + extraLength, y + topDistance / 2 + 3 * spacing - controlChannelWidth / 2);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n topLeft = new paper.Point(x + inWidth + pathLength / 2 + extraLength - controlChannelWidth / 2, y + topDistance / 2 + 3 * spacing + controlChannelWidth / 2);\n bottomRight = new paper.Point(x + inWidth + pathLength / 2 + extraLength + controlChannelWidth / 2, y + topDistance / 2);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n topLeft = new paper.Point(x + inWidth + pathLength / 2 + extraLength - controlChannelWidth, y + topDistance / 2 - controlChannelWidth);\n bottomRight = new paper.Point(x + inWidth + pathLength / 2 + extraLength + controlChannelWidth, y + topDistance / 2 + flowChannelWidth + controlChannelWidth);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n // control 21\n topLeft = new paper.Point(x + inWidth + pathLength / 2 - extraLength, y + topDistance / 2 + 4 * spacing + controlChannelWidth / 2);\n bottomRight = new paper.Point(x + inWidth + pathLength + extraLength, y + topDistance / 2 + 4 * spacing - controlChannelWidth / 2);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n topLeft = new paper.Point(x + inWidth + pathLength / 2 - extraLength - controlChannelWidth / 2, y + topDistance / 2 + 4 * spacing + controlChannelWidth / 2);\n bottomRight = new paper.Point(x + inWidth + pathLength / 2 - extraLength + controlChannelWidth / 2, y + topDistance / 2);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n topLeft = new paper.Point(x + inWidth + pathLength / 2 - extraLength - controlChannelWidth, y + topDistance / 2 - controlChannelWidth);\n bottomRight = new paper.Point(x + inWidth + pathLength / 2 - extraLength + controlChannelWidth, y + topDistance / 2 + flowChannelWidth + controlChannelWidth);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n // control 22\n topLeft = new paper.Point(x + pathLength / 2, y + topDistance / 2 + 5 * spacing + controlChannelWidth / 2);\n bottomRight = new paper.Point(x + inWidth + pathLength + extraLength, y + topDistance / 2 + 5 * spacing - controlChannelWidth / 2);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n topLeft = new paper.Point(x + pathLength / 2 - flowChannelWidth / 2 - controlChannelWidth, y + topDistance / 2 + 5 * spacing - controlChannelWidth);\n bottomRight = new paper.Point(x + pathLength / 2 + flowChannelWidth / 2 + controlChannelWidth, y + topDistance / 2 + 5 * spacing + controlChannelWidth);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n // control 23\n topLeft = new paper.Point(x + pathLength / 2 - extraLength, y + topDistance / 2 + 6 * spacing + controlChannelWidth / 2);\n bottomRight = new paper.Point(x + inWidth + pathLength + extraLength, y + topDistance / 2 + 6 * spacing - controlChannelWidth / 2);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n topLeft = new paper.Point(x + pathLength / 2 - extraLength - controlChannelWidth / 2, y + topDistance / 2 + 6 * spacing + controlChannelWidth / 2);\n bottomRight = new paper.Point(x + pathLength / 2 - extraLength + controlChannelWidth / 2, y + topDistance / 2);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n topLeft = new paper.Point(x + pathLength / 2 - extraLength - controlChannelWidth, y + topDistance / 2 - controlChannelWidth);\n bottomRight = new paper.Point(x + pathLength / 2 - extraLength + controlChannelWidth, y + topDistance / 2 + flowChannelWidth + controlChannelWidth);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n // control 9\n topLeft = new paper.Point(x + 2 * inWidth + pathLength / 2 + extraLength, y - topDistance / 2 + 2 * spacing - controlChannelWidth / 2);\n bottomRight = new paper.Point(x + inWidth + pathLength + extraLength, y - topDistance / 2 + 2 * spacing + controlChannelWidth / 2);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n topLeft = new paper.Point(x + 2 * inWidth + pathLength / 2 + extraLength - controlChannelWidth / 2, y - topDistance / 2);\n bottomRight = new paper.Point(x + 2 * inWidth + pathLength / 2 + extraLength + controlChannelWidth / 2, y - topDistance / 2 + 2 * spacing + controlChannelWidth / 2);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n topLeft = new paper.Point(x + 2 * inWidth + pathLength / 2 + extraLength - controlChannelWidth, y - topDistance / 2 - flowChannelWidth - controlChannelWidth);\n bottomRight = new paper.Point(x + 2 * inWidth + pathLength / 2 + extraLength + controlChannelWidth, y - topDistance / 2 + controlChannelWidth);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n // control 18\n topLeft = new paper.Point(x + 2 * inWidth + pathLength / 2 + extraLength, y + topDistance / 2 - 2 * spacing - controlChannelWidth / 2);\n bottomRight = new paper.Point(x + inWidth + pathLength + extraLength, y + topDistance / 2 - 2 * spacing + controlChannelWidth / 2);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n topLeft = new paper.Point(x + 2 * inWidth + pathLength / 2 + extraLength - controlChannelWidth / 2, y + topDistance / 2);\n bottomRight = new paper.Point(x + 2 * inWidth + pathLength / 2 + extraLength + controlChannelWidth / 2, y + topDistance / 2 - 2 * spacing - controlChannelWidth / 2);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n topLeft = new paper.Point(x + 2 * inWidth + pathLength / 2 + extraLength - controlChannelWidth, y + topDistance / 2 - controlChannelWidth);\n bottomRight = new paper.Point(x + 2 * inWidth + pathLength / 2 + extraLength + controlChannelWidth, y + topDistance / 2 + flowChannelWidth + controlChannelWidth);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n // control 10\n topLeft = new paper.Point(x + pathLength / 2, y - topDistance / 2 + 3 * spacing - controlChannelWidth / 2);\n bottomRight = new paper.Point(x + inWidth + pathLength + extraLength, y - topDistance / 2 + 3 * spacing + controlChannelWidth / 2);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n topLeft = new paper.Point(x + pathLength / 2 - flowChannelWidth / 2 - controlChannelWidth, y - topDistance / 2 + 3 * spacing - controlChannelWidth);\n bottomRight = new paper.Point(x + pathLength / 2 + flowChannelWidth / 2 + controlChannelWidth, y - topDistance / 2 + 3 * spacing + controlChannelWidth);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n // control 17\n topLeft = new paper.Point(x + pathLength / 2, y + topDistance / 2 - 3 * spacing - controlChannelWidth / 2);\n bottomRight = new paper.Point(x + inWidth + pathLength + extraLength, y + topDistance / 2 - 3 * spacing + controlChannelWidth / 2);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n topLeft = new paper.Point(x + pathLength / 2 - flowChannelWidth / 2 - controlChannelWidth, y + topDistance / 2 - 3 * spacing - controlChannelWidth);\n bottomRight = new paper.Point(x + pathLength / 2 + flowChannelWidth / 2 + controlChannelWidth, y + topDistance / 2 - 3 * spacing + controlChannelWidth);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n // control 11\n topLeft = new paper.Point(x + inWidth + pathLength / 2, y - topDistance / 2 + 4 * spacing - controlChannelWidth / 2);\n bottomRight = new paper.Point(x + inWidth + pathLength + extraLength, y - topDistance / 2 + 4 * spacing + controlChannelWidth / 2);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n topLeft = new paper.Point(x + inWidth + pathLength / 2 - flowChannelWidth / 2 - controlChannelWidth, y - topDistance / 2 + 4 * spacing - controlChannelWidth);\n bottomRight = new paper.Point(x + inWidth + pathLength / 2 + flowChannelWidth / 2 + controlChannelWidth, y - topDistance / 2 + 4 * spacing + controlChannelWidth);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n // control 16\n topLeft = new paper.Point(x + inWidth + pathLength / 2, y + topDistance / 2 - 4 * spacing - controlChannelWidth / 2);\n bottomRight = new paper.Point(x + inWidth + pathLength + extraLength, y + topDistance / 2 - 4 * spacing + controlChannelWidth / 2);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n topLeft = new paper.Point(x + inWidth + pathLength / 2 - flowChannelWidth / 2 - controlChannelWidth, y + topDistance / 2 - 4 * spacing - controlChannelWidth);\n bottomRight = new paper.Point(x + inWidth + pathLength / 2 + flowChannelWidth / 2 + controlChannelWidth, y + topDistance / 2 - 4 * spacing + controlChannelWidth);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n // control 12\n topLeft = new paper.Point(x + 2 * inWidth + pathLength / 2, y - topDistance / 2 + 5 * spacing - controlChannelWidth / 2);\n bottomRight = new paper.Point(x + inWidth + pathLength + extraLength, y - topDistance / 2 + 5 * spacing + controlChannelWidth / 2);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n topLeft = new paper.Point(x + 2 * inWidth + pathLength / 2 - flowChannelWidth - controlChannelWidth, y - topDistance / 2 + 5 * spacing - controlChannelWidth);\n bottomRight = new paper.Point(x + 2 * inWidth + pathLength / 2 + controlChannelWidth, y - topDistance / 2 + 5 * spacing + controlChannelWidth);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n // control 15\n topLeft = new paper.Point(x + 2 * inWidth + pathLength / 2, y + topDistance / 2 - 5 * spacing - controlChannelWidth / 2);\n bottomRight = new paper.Point(x + inWidth + pathLength + extraLength, y + topDistance / 2 - 5 * spacing + controlChannelWidth / 2);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n topLeft = new paper.Point(x + 2 * inWidth + pathLength / 2 - flowChannelWidth - controlChannelWidth, y + topDistance / 2 - 5 * spacing - controlChannelWidth);\n bottomRight = new paper.Point(x + 2 * inWidth + pathLength / 2 + controlChannelWidth, y + topDistance / 2 - 5 * spacing + controlChannelWidth);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n // control 13\n topLeft = new paper.Point(x + inWidth + pathLength / 2 - extraLength, y - topDistance / 2 + 6 * spacing - controlChannelWidth / 2);\n bottomRight = new paper.Point(x + inWidth + pathLength + extraLength, y - topDistance / 2 + 6 * spacing + controlChannelWidth / 2);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n topLeft = new paper.Point(x + inWidth + pathLength / 2 - extraLength - controlChannelWidth / 2, y - topDistance / 2 + 6 * spacing - controlChannelWidth / 2);\n bottomRight = new paper.Point(x + inWidth + pathLength / 2 - extraLength + controlChannelWidth / 2, y + controlChannelWidth / 2);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n topLeft = new paper.Point(x + inWidth + pathLength / 2 - extraLength - controlChannelWidth, y - flowChannelWidth / 2 - controlChannelWidth);\n bottomRight = new paper.Point(x + inWidth + pathLength / 2 - extraLength + controlChannelWidth, y + flowChannelWidth / 2 + controlChannelWidth);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n // control 14\n topLeft = new paper.Point(x + inWidth + pathLength / 2 + extraLength, y + topDistance / 2 - 6 * spacing - controlChannelWidth / 2);\n bottomRight = new paper.Point(x + inWidth + pathLength + extraLength, y + topDistance / 2 - 6 * spacing + controlChannelWidth / 2);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n topLeft = new paper.Point(x + inWidth + pathLength / 2 + extraLength - controlChannelWidth / 2, y);\n bottomRight = new paper.Point(x + inWidth + pathLength / 2 + extraLength + controlChannelWidth / 2, y + topDistance / 2 - 6 * spacing + controlChannelWidth / 2);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n topLeft = new paper.Point(x + inWidth + pathLength / 2 + extraLength - controlChannelWidth, y - flowChannelWidth / 2 - controlChannelWidth);\n bottomRight = new paper.Point(x + inWidth + pathLength / 2 + extraLength + controlChannelWidth, y + flowChannelWidth / 2 + controlChannelWidth);\n control.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n control.fillColor = color;\n control.rotate(rotation, new paper.Point(x, y));\n\n return control;\n }\n\n getPorts(params: { [k: string]: any }) {\n const ports = [];\n const chamberWidth = params.chamberWidth;\n const flowChannelWidth = params.flowChannelWidth;\n const controlChannelWidth = params.controlChannelWidth;\n const portRadius = params.portRadius;\n const chamberLength = params.chamberLength;\n const rotation = params.rotation;\n const spacing = params.componentSpacing;\n\n const topDistance = 14 * spacing;\n const inWidth = 5 * spacing;\n const pathLength = 20 * spacing;\n\n const extraLength = 2 * spacing;\n\n // flow\n ports.push(new ComponentPort(0, -topDistance, \"1\", LogicalLayerType.FLOW));\n ports.push(new ComponentPort(0, 0, \"2\", LogicalLayerType.FLOW));\n ports.push(new ComponentPort(0, topDistance, \"3\", LogicalLayerType.FLOW));\n\n // control\n ports.push(new ComponentPort(inWidth + pathLength + extraLength, -topDistance / 2 - 6 * spacing, \"4\", LogicalLayerType.CONTROL));\n ports.push(new ComponentPort(inWidth + pathLength + extraLength, -topDistance / 2 - 5 * spacing, \"5\", LogicalLayerType.CONTROL));\n ports.push(new ComponentPort(inWidth + pathLength + extraLength, -topDistance / 2 - 4 * spacing, \"6\", LogicalLayerType.CONTROL));\n ports.push(new ComponentPort(inWidth + pathLength + extraLength, -topDistance / 2 - 3 * spacing, \"7\", LogicalLayerType.CONTROL));\n ports.push(new ComponentPort(inWidth + pathLength + extraLength, -topDistance / 2 - 2 * spacing, \"8\", LogicalLayerType.CONTROL));\n ports.push(new ComponentPort(inWidth + pathLength + extraLength, -topDistance / 2 + 2 * spacing, \"9\", LogicalLayerType.CONTROL));\n ports.push(new ComponentPort(inWidth + pathLength + extraLength, -topDistance / 2 + 3 * spacing, \"10\", LogicalLayerType.CONTROL));\n ports.push(new ComponentPort(inWidth + pathLength + extraLength, -topDistance / 2 + 4 * spacing, \"11\", LogicalLayerType.CONTROL));\n ports.push(new ComponentPort(inWidth + pathLength + extraLength, -topDistance / 2 + 5 * spacing, \"12\", LogicalLayerType.CONTROL));\n ports.push(new ComponentPort(inWidth + pathLength + extraLength, -topDistance / 2 + 6 * spacing, \"13\", LogicalLayerType.CONTROL));\n ports.push(new ComponentPort(inWidth + pathLength + extraLength, topDistance / 2 - 6 * spacing, \"14\", LogicalLayerType.CONTROL));\n ports.push(new ComponentPort(inWidth + pathLength + extraLength, topDistance / 2 - 5 * spacing, \"15\", LogicalLayerType.CONTROL));\n ports.push(new ComponentPort(inWidth + pathLength + extraLength, topDistance / 2 - 4 * spacing, \"16\", LogicalLayerType.CONTROL));\n ports.push(new ComponentPort(inWidth + pathLength + extraLength, topDistance / 2 - 3 * spacing, \"17\", LogicalLayerType.CONTROL));\n ports.push(new ComponentPort(inWidth + pathLength + extraLength, topDistance / 2 - 2 * spacing, \"18\", LogicalLayerType.CONTROL));\n ports.push(new ComponentPort(inWidth + pathLength + extraLength, topDistance / 2 + 2 * spacing, \"19\", LogicalLayerType.CONTROL));\n ports.push(new ComponentPort(inWidth + pathLength + extraLength, topDistance / 2 + 3 * spacing, \"20\", LogicalLayerType.CONTROL));\n ports.push(new ComponentPort(inWidth + pathLength + extraLength, topDistance / 2 + 4 * spacing, \"21\", LogicalLayerType.CONTROL));\n ports.push(new ComponentPort(inWidth + pathLength + extraLength, topDistance / 2 + 5 * spacing, \"22\", LogicalLayerType.CONTROL));\n ports.push(new ComponentPort(inWidth + pathLength + extraLength, topDistance / 2 + 6 * spacing, \"23\", LogicalLayerType.CONTROL));\n ports.push(new ComponentPort(inWidth / 3, -topDistance - topDistance / 2 - extraLength, \"24\", LogicalLayerType.CONTROL));\n ports.push(new ComponentPort((2 * inWidth) / 3, -topDistance - topDistance / 2 - extraLength, \"25\", LogicalLayerType.CONTROL));\n ports.push(new ComponentPort(inWidth / 3, topDistance + topDistance / 2 + extraLength, \"26\", LogicalLayerType.CONTROL));\n\n return ports;\n }\n\n __drawCell(params: { [k: string]: any }) {\n const x = params.position[0];\n const y = params.position[1];\n const color = params.color;\n const spacing = params.componentSpacing;\n const chamberWidth = params.chamberWidth;\n const flowChannelWidth = params.flowChannelWidth;\n const controlChannelWidth = params.controlChannelWidth;\n const portRadius = params.portRadius;\n const chamberLength = params.chamberLength;\n const rotation = params.rotation;\n\n const ret = new paper.CompoundPath(\"\");\n const topDistance = 14 * spacing;\n const inWidth = 5 * spacing;\n const pathLength = 20 * spacing;\n\n const extraLength = 2 * spacing;\n\n const cell = new paper.CompoundPath(\"\");\n\n // top left\n let topLeft = new paper.Point(x + pathLength / 2 - chamberWidth / 2, y - topDistance / 2 - chamberLength / 2 - flowChannelWidth / 2);\n let bottomRight = new paper.Point(x + pathLength / 2 + chamberWidth / 2, y - topDistance / 2 + chamberLength / 2 - flowChannelWidth / 2);\n cell.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n // top right\n topLeft = new paper.Point(x + 2 * inWidth + pathLength / 2 - chamberWidth / 2 - flowChannelWidth / 2, y - topDistance / 2 - chamberLength / 2 - flowChannelWidth / 2);\n bottomRight = new paper.Point(x + 2 * inWidth + pathLength / 2 + chamberWidth / 2 - flowChannelWidth / 2, y - topDistance / 2 + chamberLength / 2 - flowChannelWidth / 2);\n cell.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n // bottom left\n topLeft = new paper.Point(x + pathLength / 2 - chamberWidth / 2, y + topDistance / 2 - chamberLength / 2 + flowChannelWidth / 2);\n bottomRight = new paper.Point(x + pathLength / 2 + chamberWidth / 2, y + topDistance / 2 + chamberLength / 2 + flowChannelWidth / 2);\n cell.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n // top right\n topLeft = new paper.Point(x + 2 * inWidth + pathLength / 2 - chamberWidth / 2 - flowChannelWidth / 2, y + topDistance / 2 - chamberLength / 2 + flowChannelWidth / 2);\n bottomRight = new paper.Point(x + 2 * inWidth + pathLength / 2 + chamberWidth / 2 - flowChannelWidth / 2, y + topDistance / 2 + chamberLength / 2 + flowChannelWidth / 2);\n cell.addChild(new paper.Path.Rectangle(topLeft, bottomRight));\n\n cell.fillColor = color;\n cell.rotate(rotation, new paper.Point(x, y));\n\n return cell;\n }\n\n render2DTarget(key: string | null, params: { [k: string]: any }) {\n const render = this.__drawFlow(params);\n render.addChild(this.__drawControl(params));\n render.addChild(this.__drawCell(params));\n\n render.fillColor!.alpha = 0.5;\n return render;\n }\n}\n","import Template from \"./template\";\nimport paper from \"paper\";\nimport ComponentPort from \"../core/componentPort\";\nimport { Path, Point } from \"paper/dist/paper-core\";\n// import { LogicalLayerType, ToolPaperObject } from \"../core/init\";\nimport { LogicalLayerType } from \"../core/init\";\n\nexport default class ToroidalMixer extends Template {\n constructor() {\n super();\n }\n\n __setupDefinitions(): void {\n this.__unique = {\n position: \"Point\"\n };\n\n this.__heritable = {\n componentSpacing: \"Float\",\n neckAngle: \"Float\",\n neckLength: \"Float\",\n neckWidth: \"Float\",\n numberOfMixers: \"Float\",\n channelWidth: \"Float\",\n innerDiameter: \"Float\",\n rotation: \"Float\",\n height: \"Float\"\n };\n\n this.__defaults = {\n componentSpacing: 1000,\n rotation: 0,\n channelWidth: 0.8 * 1000,\n neckAngle: 120,\n neckLength: 1000,\n neckWidth: 800,\n numberOfMixers: 1,\n innerDiameter: 2.46 * 1000,\n height: 250\n };\n\n this.__units = {\n componentSpacing: \"μm\",\n rotation: \"°\",\n neckAngle: \"°\",\n neckLength: \"μm\",\n neckWidth: \"μm\",\n numberOfMixers: \"\",\n channelWidth: \"μm\",\n innerDiameter: \"μm\",\n height: \"μm\"\n };\n\n this.__minimum = {\n componentSpacing: 0,\n rotation: 0,\n channelWidth: 10,\n neckAngle: 0,\n neckLength: 0,\n neckWidth: 10,\n numberOfMixers: 1,\n innerDiameter: 10,\n height: 10\n };\n\n this.__maximum = {\n componentSpacing: 10000,\n rotation: 360,\n channelWidth: 2000,\n neckAngle: 360,\n neckLength: 10000,\n neckWidth: 2000,\n numberOfMixers: 20,\n innerDiameter: 12 * 1000,\n height: 1200\n };\n\n this.__featureParams = {\n componentSpacing: \"componentSpacing\",\n position: \"position\",\n channelWidth: \"channelWidth\",\n neckAngle: \"neckAngle\",\n neckLength: \"neckLength\",\n neckWidth: \"neckWidth\",\n numberOfMixers: \"numberOfMixers\",\n rotation: \"rotation\",\n innerDiameter: \"innerDiameter\"\n };\n\n this.__targetParams = {\n componentSpacing: \"componentSpacing\",\n channelWidth: \"channelWidth\",\n neckAngle: \"neckAngle\",\n neckLength: \"neckLength\",\n neckWidth: \"neckWidth\",\n numberOfMixers: \"numberOfMixers\",\n rotation: \"rotation\",\n innerDiameter: \"innerDiameter\"\n };\n\n this.__placementTool = \"componentPositionTool\";\n\n this.__toolParams = {\n position: \"position\"\n };\n\n this.__renderKeys = [\"FLOW\"];\n\n this.__mint = \"TOROIDAL MIXER\";\n\n this.__zOffsetKeys = {\n FLOW: \"height\"\n };\n\n this.__substrateOffset = {\n FLOW: \"0\"\n };\n }\n\n getPorts(params: { [index: string]: any }) {\n const y: number = params.position[1];\n const channelWidth: number = params.channelWidth;\n const innerDiameter: number = params.innerDiameter;\n const neckLength: number = params.neckLength;\n const neckAngle: number = params.neckAngle;\n const numberOfMixers: number = params.numberOfMixers;\n const y_center: number = y + Math.abs((neckLength + channelWidth + 0.5 * innerDiameter) * Math.sin((0.5 * neckAngle * Math.PI) / 180));\n const diameter: number = 2 * (y_center - y);\n const y_neckComponent: number = neckLength * Math.sin((0.5 * neckAngle * Math.PI) / 180);\n\n const ports: Array = [];\n\n ports.push(new ComponentPort(0, 0, \"1\", LogicalLayerType.FLOW));\n\n if (numberOfMixers % 2 == 1) {\n ports.push(\n new ComponentPort(\n 0,\n (numberOfMixers - 1) * diameter - (numberOfMixers - 2) * y_neckComponent + diameter - neckLength * Math.sin((0.5 * neckAngle * Math.PI) / 180),\n \"2\",\n LogicalLayerType.FLOW\n )\n );\n } else {\n ports.push(\n new ComponentPort(\n -1 * neckLength * Math.cos((0.5 * neckAngle * Math.PI) / 180),\n (numberOfMixers - 1) * diameter - (numberOfMixers - 2) * y_neckComponent + diameter - neckLength * Math.sin((0.5 * neckAngle * Math.PI) / 180),\n \"2\",\n LogicalLayerType.FLOW\n )\n );\n }\n\n return ports;\n }\n\n render2D(params: { [index: string]: any }, key: string): paper.CompoundPath {\n const channelWidth: number = params.channelWidth;\n const innerDiameter: number = params.innerDiameter;\n const neckAngle: number = params.neckAngle;\n const neckWidth: number = params.neckWidth;\n const rotation: number = params.rotation;\n const neckLength: number = params.neckLength;\n const numMixers: number = params.numberOfMixers;\n const x: number = params.position[0];\n const y: number = params.position[1];\n const color: any = params.color;\n const serp: paper.CompoundPath = new paper.CompoundPath([]);\n const x_center: number = x - (neckLength + channelWidth + 0.5 * innerDiameter) * Math.cos((0.5 * neckAngle * Math.PI) / 180);\n const y_center: number = y + Math.abs((neckLength + channelWidth + 0.5 * innerDiameter) * Math.sin((0.5 * neckAngle * Math.PI) / 180));\n const center: paper.Point = new paper.Point(x_center, y_center);\n const diameter: number = 2 * (y_center - y);\n const y_neckComponent: number = neckLength * Math.sin((0.5 * neckAngle * Math.PI) / 180);\n\n let mixerUnit: paper.PathItem;\n\n //Initial ring\n let outerCircle: paper.Path = new paper.Path.Circle(center, 0.5 * innerDiameter + channelWidth);\n let innerCircle: paper.Path = new paper.Path.Circle(center, 0.5 * innerDiameter);\n mixerUnit = outerCircle.subtract(innerCircle);\n //Initial neck\n let neck: paper.Path = new paper.Path.Rectangle(new paper.Point(x - neckLength - channelWidth, y - 0.5 * neckWidth), new paper.Size(neckLength + channelWidth, neckWidth));\n neck.rotate((-1 * neckAngle) / 2, new paper.Point(x, y));\n mixerUnit = mixerUnit.unite(neck);\n //Trailing neck\n neck = new paper.Path.Rectangle(new paper.Point(x - neckLength - channelWidth, y - 0.5 * neckWidth + diameter), new paper.Size(neckLength + channelWidth, neckWidth));\n neck.rotate(neckAngle / 2, new paper.Point(x, y + diameter));\n mixerUnit = mixerUnit.unite(neck);\n\n let y_val: number;\n let x_centerAnalog: number;\n let y_centerAnalog: number;\n let centerAnalog: paper.Point;\n let numRepeats: number = numMixers - 1;\n for (let i = 1; i <= numRepeats; i++) {\n y_val = y + i * diameter - (i - 1) * y_neckComponent;\n if (i % 2 == 1) {\n x_centerAnalog = x + (channelWidth + 0.5 * innerDiameter) * Math.cos((0.5 * neckAngle * Math.PI) / 180);\n y_centerAnalog = y_val + Math.abs((channelWidth + 0.5 * innerDiameter) * Math.sin((0.5 * neckAngle * Math.PI) / 180));\n centerAnalog = new paper.Point(x_centerAnalog, y_centerAnalog);\n //Add next ring\n outerCircle = new paper.Path.Circle(centerAnalog, 0.5 * innerDiameter + channelWidth);\n innerCircle = new paper.Path.Circle(centerAnalog, 0.5 * innerDiameter);\n mixerUnit = mixerUnit.unite(outerCircle.subtract(innerCircle));\n //Complete inter-ring connection\n neck = new paper.Path.Rectangle(new paper.Point(x, y_val - 0.5 * neckWidth), new paper.Size(channelWidth, neckWidth));\n neck.rotate(neckAngle / 2, new paper.Point(x, y_val));\n mixerUnit = mixerUnit.unite(neck);\n //Add trailing neck\n neck = new paper.Path.Rectangle(\n new paper.Point(x - neckLength, y_val - 0.5 * neckWidth + (2 * channelWidth + innerDiameter) * Math.sin((0.5 * neckAngle * Math.PI) / 180)),\n new paper.Size(neckLength + channelWidth, neckWidth)\n );\n neck.rotate((-1 * neckAngle) / 2, new paper.Point(x, y_val + (2 * channelWidth + innerDiameter) * Math.sin((0.5 * neckAngle * Math.PI) / 180)));\n mixerUnit = mixerUnit.unite(neck);\n } else {\n y_centerAnalog = y_val + Math.abs((channelWidth + 0.5 * innerDiameter) * Math.sin((0.5 * neckAngle * Math.PI) / 180));\n centerAnalog = new paper.Point(x_center, y_centerAnalog);\n //Add next ring\n outerCircle = new paper.Path.Circle(centerAnalog, 0.5 * innerDiameter + channelWidth);\n innerCircle = new paper.Path.Circle(centerAnalog, 0.5 * innerDiameter);\n mixerUnit = mixerUnit.unite(outerCircle.subtract(innerCircle));\n //Complete inter-ring connection\n neck = new paper.Path.Rectangle(\n new paper.Point(x - channelWidth - neckLength * Math.cos((0.5 * neckAngle * Math.PI) / 180), y_val - 0.5 * neckWidth),\n new paper.Size(channelWidth, neckWidth)\n );\n neck.rotate((-1 * neckAngle) / 2, new paper.Point(x - neckLength * Math.cos((0.5 * neckAngle * Math.PI) / 180), y_val));\n mixerUnit = mixerUnit.unite(neck);\n //Add trailing neck\n neck = new paper.Path.Rectangle(\n new paper.Point(x - neckLength - channelWidth, y_val - 0.5 * neckWidth + diameter - neckLength * Math.sin((0.5 * neckAngle * Math.PI) / 180)),\n new paper.Size(neckLength + channelWidth, neckWidth)\n );\n neck.rotate(neckAngle / 2, new paper.Point(x, y_val + diameter - neckLength * Math.sin((0.5 * neckAngle * Math.PI) / 180)));\n mixerUnit = mixerUnit.unite(neck);\n }\n }\n serp.addChild(mixerUnit);\n serp.fillColor = color;\n serp.rotate(rotation, new paper.Point(x, y));\n return serp;\n }\n\n render2DTarget(key: string | null, params: { [index: string]: any }): paper.CompoundPath {\n if (key === null) {\n key = this.__renderKeys[0];\n }\n const render = this.render2D(params, key);\n if (render.fillColor !== null) render.fillColor.alpha = 0.5;\n return render;\n }\n}\n","import Template from \"./template\";\nimport paper from \"paper\";\nimport ComponentPort from \"../core/componentPort\";\nimport { LogicalLayerType } from \"../core/init\";\n\nexport default class DogboneInsert extends Template {\n constructor() {\n super();\n }\n\n __setupDefinitions(): void {\n this.__unique = {\n position: \"Point\"\n };\n\n this.__heritable = {\n componentSpacing: \"Float\",\n rotation: \"Float\",\n length: \"Float\",\n innerRadius: \"Float\",\n outerRadius: \"Float\",\n height: \"Float\"\n };\n\n this.__defaults = {\n componentSpacing: 1000,\n rotation: 0,\n innerRadius: 400,\n outerRadius: 800,\n length: 7200,\n height: 250\n };\n\n this.__units = {\n componentSpacing: \"μm\",\n rotation: \"°\",\n length: \"μm\",\n innerRadius: \"μm\",\n outerRadius: \"μm\",\n height: \"μm\"\n };\n\n this.__minimum = {\n componentSpacing: 0,\n innerRadius: 1,\n outerRadius: 1,\n length: 120,\n height: 10,\n rotation: 0\n };\n\n this.__maximum = {\n componentSpacing: 10000,\n innerRadius: 1000,\n outerRadius: 1000,\n length: 24 * 1000,\n height: 1200,\n rotation: 360\n };\n\n this.__featureParams = {\n componentSpacing: \"componentSpacing\",\n position: \"position\",\n rotation: \"rotation\",\n length: \"length\",\n innerRadius: \"innerRadius\",\n outerRadius: \"outerRadius\",\n };\n\n this.__targetParams = {\n componentSpacing: \"componentSpacing\",\n length: \"length\",\n innerRadius: \"innerRadius\",\n outerRadius: \"outerRadius\",\n rotation: \"rotation\"\n };\n\n this.__placementTool = \"componentPositionTool\";\n\n this.__toolParams = {\n position: \"position\"\n };\n\n this.__renderKeys = [\"FLOW\"];\n\n this.__mint = \"DOGBONE INSERT\";\n\n this.__zOffsetKeys = {\n FLOW: \"height\"\n };\n\n this.__substrateOffset = {\n FLOW: \"0\"\n };\n }\n\n getPorts(params: { [k: string]: any }) {\n const l = params.length;\n\n const ports = [];\n\n ports.push(new ComponentPort(-l / 2, 0, \"1\", LogicalLayerType.FLOW));\n\n ports.push(new ComponentPort(l / 2, 0, \"2\", LogicalLayerType.FLOW));\n\n return ports;\n }\n\n render2D(params: { [k: string]: any }, key: string): paper.CompoundPath {\n const position = params.position;\n const px = position[0];\n const py = position[1];\n const length = params.length;\n const innerRadius = params.innerRadius;\n const outerRadius = params.outerRadius;\n const rotation = params.rotation;\n const color = params.color;\n\n const fulllength = length + innerRadius * 2 + outerRadius * 2;\n const width = innerRadius * 2 + outerRadius * 4;\n\n const serp: paper.CompoundPath = new paper.CompoundPath([]);\n\n let insert = new paper.PathItem;\n\n // Produce rectangle\n const rect2 = new paper.Path.Rectangle(new paper.Point(px - fulllength / 2 + outerRadius, py - width / 2), new paper.Size(fulllength - 2 * outerRadius, width));\n \n // Add half circles to ends\n // Left side\n let curve: paper.Path.Arc | paper.PathItem = new paper.Path.Arc({\n from: [px - fulllength / 2 + outerRadius, py + width / 2],\n through: [px - fulllength / 2, py + width / 2 - outerRadius],\n to: [px - fulllength / 2 + outerRadius, py + innerRadius]\n });\n (curve as any).closed = true;\n insert = rect2.unite(curve);\n curve = new paper.Path.Arc({\n from: [px - fulllength / 2 + outerRadius, py - width / 2],\n through: [px - fulllength / 2, py - width / 2 + outerRadius],\n to: [px - fulllength / 2 + outerRadius, py - innerRadius]\n });\n (curve as any).closed = true;\n insert = insert.unite(curve);\n //Right side\n curve = new paper.Path.Arc({\n from: [px + fulllength / 2 - outerRadius, py + width / 2],\n through: [px + fulllength / 2, py + width / 2 - outerRadius],\n to: [px + fulllength / 2 - outerRadius, py + innerRadius]\n });\n (curve as any).closed = true;\n insert = insert.unite(curve);\n curve = new paper.Path.Arc({\n from: [px + fulllength / 2 - outerRadius, py - width / 2],\n through: [px + fulllength / 2, py - width / 2 + outerRadius],\n to: [px + fulllength / 2 - outerRadius, py - innerRadius]\n });\n (curve as any).closed = true;\n insert = insert.unite(curve);\n \n // Subtract half circles\n curve = new paper.Path.Arc({\n from: [px - fulllength / 2 + outerRadius, py + innerRadius],\n through: [px - fulllength / 2 + innerRadius + outerRadius, py],\n to: [px - fulllength / 2 + outerRadius, py - innerRadius]\n });\n (curve as any).closed = true;\n insert = insert.subtract(curve);\n curve = new paper.Path.Arc({\n from: [px + fulllength / 2 - outerRadius, py + innerRadius],\n through: [px + fulllength / 2 - innerRadius - outerRadius, py],\n to: [px + fulllength / 2 - outerRadius, py - innerRadius]\n });\n (curve as any).closed = true;\n insert = insert.subtract(curve);\n\n serp.addChild(insert);\n serp.fillColor = color;\n serp.rotate(rotation, new paper.Point(px, py));\n return serp;\n }\n\n render2DTarget(key: string | null, params: { [k: string]: any }): paper.CompoundPath {\n if (key === null) {\n key = this.__renderKeys[0];\n }\n const render = this.render2D(params, key);\n render.fillColor!.alpha = 0.5;\n return render;\n }\n}\n","\nimport ComponentPort from \"../../core/componentPort\";\nimport { GeometricOperationType, ToolPaperObject } from \"../../core/init\";\nimport paper from \"paper\";\n//import { ManufacturingInfo } from \"../manufacturing/ManufacturingInfo\";\nimport { LogicalLayerType } from \"../../core/init\";\nimport {PRIMITIVES_SERVER} from \"../../../componentAPI\";\n\nexport default class FeatureTemplate {\n\n protected _macro: string = \"FeatureTemplate\";\n protected _geometricOperation: GeometricOperationType = GeometricOperationType.UNION;\n protected __unique: { [key: string]: string } | null = null;\n protected __heritable: { [key: string]: string } | null = null;\n protected __defaults: { [key: string]: number } | null = null;\n protected __minimum: { [key: string]: number } | null = null;\n protected __maximum: { [key: string]: number } | null = null;\n protected __units: { [key: string]: string } | null = null;\n protected __toolParams: { [key: string]: string } | null = null; // { position: \"position\" };\n protected __featureParams: { [key: string]: string } | null = null;\n protected __targetParams: { [key: string]: string } | null = null;\n protected __zOffsetKeys: { [key: string]: string } | null = null;\n protected __substrateOffset: { [key: string]: string } | null = null;\n\n\n /**\n *Creates an instance of Template.\n * @memberof Template\n */\n constructor() {\n this.__setupDefinitions();\n this.__checkDefinitions();\n }\n\n __setupDefinitions(): void {\n //Throw an error if this function is not implemented\n throw new Error(\"Method not implemented.\");\n }\n\n __checkDefinitions(): void {\n //Check that all the definitions are set\n if (this._macro === null) {\n throw new Error(\"Macro not defined: \" + this._macro);\n }\n if (this.__unique === null) {\n throw new Error(\"Unique parameters not defined: \" + this._macro);\n }\n if (this.__heritable === null) {\n throw new Error(\"Heritable parameters not defined: \" + this._macro);\n }\n if (this.__defaults === null) {\n throw new Error(\"Default parameters not defined: \" + this._macro);\n }\n if (this.__minimum === null) {\n throw new Error(\"Minimum parameters not defined: \" + this._macro);\n }\n if (this.__maximum === null) {\n throw new Error(\"Maximum parameters not defined: \" + this._macro);\n }\n if (this.__units === null) {\n throw new Error(\"Units not defined: \" + this._macro);\n }\n if (this.__toolParams === null) {\n throw new Error(\"Tool parameters not defined: \" + this._macro);\n }\n if (this.__featureParams === null) {\n throw new Error(\"Feature parameters not defined: \" + this._macro);\n }\n if (this.__targetParams === null) {\n throw new Error(\"Target parameters not defined: \" + this._macro);\n }\n }\n\n /**\n * Get the Macro parameters for the feature\n *\n * @type {GeometricOperationType}\n * @memberof FeatureTemplate\n */\n get geometricOperation(): GeometricOperationType {\n return this._geometricOperation;\n }\n\n /**\n * Get the Macro parameters for the feature\n * \n * @type {string}\n * @memberof FeatureTemplate\n */\n get macro(): string {\n return this._macro;\n }\n\n render2d(params: { [key: string]: any }): ToolPaperObject {\n //Throw an error if this function is not implemented\n throw new Error(\"Method not implemented.\");\n }\n\n}\n\n","import { GeometricOperationType } from \"@/app/core/init\";\nimport FeatureTemplate from \"./featureTemplate\";\n\nexport default class NormallyClosedValveCrescents extends FeatureTemplate {\n constructor() {\n super();\n }\n\n __setupDefinitions(): void {\n this._macro = \"VALVE3D FLOW\";\n\n this.__unique = {\n position: \"Point\"\n };\n\n this.__heritable = {\n componentSpacing: \"Float\",\n rotation: \"Float\",\n valveRadius: \"Float\",\n height: \"Float\",\n gap: \"Float\",\n width: \"Float\",\n length: \"Float\"\n };\n\n this.__defaults = {\n componentSpacing: 1000,\n rotation: 0,\n valveRadius: 1.2 * 1000,\n height: 250,\n gap: 0.6 * 1000,\n width: 2.4 * 1000,\n length: 2.4 * 1000\n };\n\n this.__units = {\n componentSpacing: \"μm\",\n valveRadius: \"μm\",\n height: \"μm\",\n gap: \"μm\",\n width: \"μm\",\n length: \"μm\",\n rotation: \"°\"\n };\n\n this.__minimum = {\n componentSpacing: 0,\n valveRadius: 0.1 * 100,\n height: 0.1 * 100,\n gap: 0.5 * 10,\n rotation: 0,\n width: 10,\n length: 10\n };\n\n this.__maximum = {\n componentSpacing: 10000,\n valveRadius: 0.3 * 10000,\n height: 1.2 * 1000,\n gap: 0.1 * 10000,\n rotation: 180,\n width: 3 * 1000,\n length: 3 * 1000\n };\n\n this.__featureParams = {\n componentSpacing: \"componentSpacing\",\n position: \"position\",\n rotation: \"rotation\",\n radius1: \"valveRadius\",\n radius2: \"valveRadius\",\n valveRadius: \"valveRadius\",\n gap: \"gap\"\n };\n\n this.__targetParams = {\n componentSpacing: \"componentSpacing\",\n position: \"position\",\n rotation: \"rotation\",\n radius1: \"valveRadius\",\n radius2: \"valveRadius\",\n valveRadius: \"valveRadius\",\n gap: \"gap\"\n };\n\n\n this.__toolParams = {\n position: \"position\"\n };\n\n this._geometricOperation = GeometricOperationType.UNION;\n // TODO: Setup the manufacuring info for this feature\n }\n\n}","import { GeometricOperationType } from \"@/app/core/init\";\nimport FeatureTemplate from \"./featureTemplate\";\n\nexport default class NormallyClosedValveModificationsGap extends FeatureTemplate {\n constructor() {\n super();\n }\n\n __setupDefinitions(): void {\n this._macro = \"VALVE3D GAP\";\n\n this.__unique = {\n position: \"Point\"\n };\n\n this.__heritable = {\n componentSpacing: \"Float\",\n rotation: \"Float\",\n valveRadius: \"Float\",\n height: \"Float\",\n gap: \"Float\",\n width: \"Float\",\n length: \"Float\"\n };\n\n this.__defaults = {\n componentSpacing: 1000,\n rotation: 0,\n valveRadius: 1.2 * 1000,\n height: 250,\n gap: 0.6 * 1000,\n width: 2.4 * 1000,\n length: 2.4 * 1000\n };\n\n this.__units = {\n componentSpacing: \"μm\",\n valveRadius: \"μm\",\n height: \"μm\",\n gap: \"μm\",\n width: \"μm\",\n length: \"μm\",\n rotation: \"°\"\n };\n\n this.__minimum = {\n componentSpacing: 0,\n valveRadius: 0.1 * 100,\n height: 0.1 * 100,\n gap: 0.5 * 10,\n rotation: 0,\n width: 10,\n length: 10\n\n };\n\n this.__maximum = {\n componentSpacing: 10000,\n valveRadius: 0.3 * 10000,\n height: 1.2 * 1000,\n gap: 0.1 * 10000,\n rotation: 180,\n width: 3 * 1000,\n length: 3 * 1000\n };\n\n this.__featureParams = {\n componentSpacing: \"componentSpacing\",\n position: \"position\",\n rotation: \"rotation\",\n radius1: \"valveRadius\",\n radius2: \"valveRadius\",\n valveRadius: \"valveRadius\",\n gap: \"gap\"\n };\n\n this.__targetParams = {\n componentSpacing: \"componentSpacing\",\n position: \"position\",\n rotation: \"rotation\",\n radius1: \"valveRadius\",\n radius2: \"valveRadius\",\n valveRadius: \"valveRadius\",\n gap: \"gap\"\n };\n\n this.__toolParams = {\n position: \"position\"\n };\n\n this._geometricOperation = GeometricOperationType.DIFFERENCE;\n // TODO: Setup the manufacuring info for this feature\n }\n\n}","import Text from \"./app/library/text\";\nimport Port from \"./app/library/port\";\nimport Anode from \"./app/library/anode\"; // new from CK\nimport Cathode from \"./app/library/cathode\"; // new from CK\nimport Channel from \"./app/library/channel\";\nimport BetterMixer from \"./app/library/betterMixer\";\nimport RotaryMixer from \"./app/library/rotaryMixer\";\nimport AlignmentMarks from \"./app/library/alignmentMarks\";\nimport CellTrapL from \"./app/library/celltrapL\";\nimport Gelchannel from \"./app/library/gelchannel\"; // CK\nimport Chamber from \"./app/library/chamber\";\nimport Connection from \"./app/library/connection\";\nimport CurvedMixer from \"./app/library/curvedMixer\";\nimport DiamondReactionChamber from \"./app/library/diamondReactionChamber\";\nimport DropletGenerator from \"./app/library/dropletGenerator\";\nimport GradientGenerator from \"./app/library/gradientGenerator\";\nimport Mux from \"./app/library/mux\";\nimport Pump from \"./app/library/pump\";\nimport Pump3D from \"./app/library/pump3D\";\nimport RoundedChannel from \"./app/library/roundedChannel\";\nimport thermoCycler from \"./app/library/thermoCycler\";\nimport Transition from \"./app/library/transition\";\nimport Transposer from \"./app/library/transposer\";\nimport Valve from \"./app/library/valve\";\nimport Valve3D from \"./app/library/valve3D\";\nimport Tree from \"./app/library/tree\";\nimport YTree from \"./app/library/ytree\";\nimport LLChamber from \"./app/library/llChamber\";\nimport ThreeDMixer from \"./app/library/threeDMixer\";\nimport Via from \"./app/library/via\";\n\n// new\n\nimport Filter from \"./app/library/filter\";\nimport CellTrapS from \"./app/library/celltrapS\";\nimport ThreeDMux from \"./app/library/threeDMux\";\nimport ChemostatRing from \"./app/library/chemostatring\";\nimport Incubation from \"./app/library/incubation\";\nimport Merger from \"./app/library/merger\";\nimport PicoInjection from \"./app/library/picoinjection\";\nimport Sorter from \"./app/library/sorter\";\nimport CapacitanceSensor from \"./app/library/capacitancesensor\";\nimport Splitter from \"./app/library/splitter\";\nimport Node from \"./app/library/node\";\nimport DropletGeneratorT from \"./app/library/dropletGeneratorT\";\nimport DropletGeneratorFlowFocus from \"./app/library/dropletGeneratorFlowFocus\";\nimport LogicArray from \"./app/library/logicArray\";\nimport ToroidalMixer from \"./app/library/toroidalMixer\";\nimport DogboneInsert from \"./app/library/dogboneInsert\";\n\nimport Template from \"./app/library/template\";\nimport ComponentPort from \"./app/core/componentPort\";\nimport CustomComponent from \"./app/core/customComponent\";\nimport uuid from \"node-uuid\";\nimport FeatureTemplate from \"./app/library/geometricElements/featureTemplate\";\nimport NormallyClosedValveCrescents from \"./app/library/geometricElements/normallyClosedValveCrecents\";\nimport NormallyClosedValveModificationsGap from \"./app/library/geometricElements/normallyClosedValveGap\";\nimport { ValveType } from \"./app/core/init\";\n\nexport var PRIMITIVES_SERVER = false;\n\nexport function enablePrimitiveServer() {\n PRIMITIVES_SERVER = true;\n}\nexport type LibraryEntryDefinition = {\n unique: { [key: string]: string };\n heritable: { [key: string]: string };\n units: { [key: string]: string };\n defaults: { [key: string]: number };\n minimum: { [key: string]: number };\n maximum: { [key: string]: number };\n mint: string;\n};\n\ntype LibraryEntry = {\n object: Template;\n key: string;\n};\n\ntype FeatureLibraryEntry = {\n object: FeatureTemplate;\n key: string;\n};\n\n/**\n * Component API Class that contains all the components and their definitions,\n * Replaces the FeatureSet API in the future and simplifies all the extension\n * of the library.\n *\n * @class ComponentAPI\n */\nexport class ComponentAPI {\n static library: { [key: string]: LibraryEntry } = {\n Template: { object: new Template(), key: \"FLOW\" },\n Text: { object: new Text(), key: \"FLOW\" },\n Port: { object: new Port(), key: \"FLOW\" },\n Anode: { object: new Anode(), key: \"INTEGRATION\" }, // ck addition\n Cathode: { object: new Cathode(), key: \"INTEGRATION\" }, // ck addition\n Channel: { object: new Channel(), key: \"FLOW\" },\n BetterMixer: { object: new BetterMixer(), key: \"FLOW\" },\n RotaryMixer: { object: new RotaryMixer(), key: \"FLOW\" },\n RotaryMixer_control: { object: new RotaryMixer(), key: \"CONTROL\" },\n AlignmentMarks: { object: new AlignmentMarks(), key: \"FLOW\" },\n AlignmentMarks_control: {\n object: new AlignmentMarks(),\n key: \"CONTROL\"\n },\n CellTrapL: { object: new CellTrapL(), key: \"FLOW\" },\n CellTrapL_cell: { object: new CellTrapL(), key: \"CELL\" },\n Gelchannel: { object: new Gelchannel(), key: \"FLOW\" }, // CK\n Gelchannel_cell: { object: new Gelchannel(), key: \"CELL\" }, // CK\n Chamber: { object: new Chamber(), key: \"FLOW\" },\n CurvedMixer: { object: new CurvedMixer(), key: \"FLOW\" },\n ToroidalMixer: { object: new ToroidalMixer(), key: \"FLOW\"},\n DiamondReactionChamber: {\n object: new DiamondReactionChamber(),\n key: \"FLOW\"\n },\n\n Connection: { object: new Connection(), key: \"FLOW\" },\n DropletGen: { object: new DropletGenerator(), key: \"FLOW\" },\n GradientGenerator: { object: new GradientGenerator(), key: \"FLOW\" },\n Mux: { object: new Mux(), key: \"FLOW\" },\n Mux_control: { object: new Mux(), key: \"CONTROL\" },\n Pump: { object: new Pump(), key: \"FLOW\" },\n Pump_control: { object: new Pump(), key: \"CONTROL\" },\n Pump3D: { object: new Pump3D(), key: \"FLOW\" },\n Pump3D_control: { object: new Pump3D(), key: \"CONTROL\" },\n RoundedChannel: { object: new RoundedChannel(), key: \"FLOW\" },\n thermoCycler: { object: new thermoCycler(), key: \"FLOW\" },\n Transition: { object: new Transition(), key: \"FLOW\" },\n Transposer: { object: new Transposer(), key: \"FLOW\" },\n Transposer_control: { object: new Transposer(), key: \"CONTROL\" },\n Tree: { object: new Tree(), key: \"FLOW\" },\n YTree: { object: new YTree(), key: \"FLOW\" },\n Valve: { object: new Valve(ValveType.NORMALLY_OPEN), key: \"CONTROL\" },\n // TODO: Get rid of this fully after we move over to the new valve feature system\n // Valve3D: { object: new Valve3D(ValveType.NORMALLY_CLOSED), key: \"FLOW\" },\n Valve3D_control: { object: new Valve3D(ValveType.NORMALLY_CLOSED), key: \"CONTROL\" },\n LLChamber: { object: new LLChamber(), key: \"FLOW\" },\n LLChamber_control: { object: new LLChamber(), key: \"CONTROL\" },\n \"3DMixer\": { object: new ThreeDMixer(), key: \"FLOW\" },\n \"3DMixer_control\": { object: new ThreeDMixer(), key: \"CONTROL\" },\n Via: { object: new Via(), key: \"FLOW\" },\n\n // new\n DogboneInsert: { object: new DogboneInsert(), key: \"FLOW\" },\n Filter: { object: new Filter(), key: \"FLOW\" },\n CellTrapS: { object: new CellTrapS(), key: \"FLOW\" },\n CellTrapS_cell: { object: new CellTrapS(), key: \"CELL\" },\n \"3DMux\": { object: new ThreeDMux(), key: \"FLOW\" },\n \"3DMux_control\": { object: new ThreeDMux(), key: \"CONTROL\" },\n ChemostatRing: { object: new ChemostatRing(), key: \"FLOW\" },\n ChemostatRing_control: { object: new ChemostatRing(), key: \"CONTROL\" },\n Incubation: { object: new Incubation(), key: \"FLOW\" },\n Merger: { object: new Merger(), key: \"FLOW\" },\n Merger_integration: { object: new Merger(), key: \"INTEGRATION\" },\n PicoInjection: { object: new PicoInjection(), key: \"FLOW\" },\n PicoInjection_integration: { object: new PicoInjection(), key: \"INTEGRATION\" },\n Sorter: { object: new Sorter(), key: \"FLOW\" },\n Sorter_integration: { object: new Sorter(), key: \"INTEGRATION\" },\n Splitter: { object: new Splitter(), key: \"FLOW\" },\n CapacitanceSensor: { object: new CapacitanceSensor(), key: \"FLOW\" },\n CapacitanceSensor_integration: { object: new CapacitanceSensor(), key: \"INTEGRATION\" },\n Node: { object: new Node(), key: \"FLOW\" },\n DropletGenT: { object: new DropletGeneratorT(), key: \"FLOW\" },\n DropletGenFlow: { object: new DropletGeneratorFlowFocus(), key: \"FLOW\" },\n LogicArray: { object: new LogicArray(), key: \"FLOW\" },\n LogicArray_control: { object: new LogicArray(), key: \"CONTROL\" },\n LogicArray_cell: { object: new LogicArray(), key: \"CELL\" },\n };\n\n static connectionLibrary: { [key: string]: LibraryEntry } = {\n Connection: { object: new Connection(), key: \"FLOW\" }\n };\n\n static featureLibrary: { [key: string]: FeatureLibraryEntry } = {\n // Features\n NormallyClosedValveModifications: { object: new NormallyClosedValveCrescents(), key: \"FLOW\" },\n NormallyClosedValveModifications_Gap: { object: new NormallyClosedValveModificationsGap(), key: \"GAP\" },\n\n }\n\n\n static customTypes: Map = new Map();\n __setString: any;\n __tools: any;\n __render2D: any;\n __render3D: any;\n name: any;\n setString: string | undefined;\n\n /**\n * Gets all the components definitions (template type objects) in the library.\n *\n * @static\n * @returns {Array}\n * @memberof ComponentAPI\n */\n static getAllComponents(): Array {\n const ret: Array = [];\n for (const key in ComponentAPI.library) {\n const definition = ComponentAPI.library[key].object;\n ret.push(definition);\n }\n return ret;\n }\n\n /**\n * Returns Template object given by the mint type\n *\n * @static\n * @param {string} minttype\n * @returns {(Template | null)}\n * @memberof ComponentAPI\n */\n static getComponentWithMINT(minttype: string): Template | null {\n const checkmint = minttype;\n for (const key in this.library) {\n if (checkmint == this.library[key].object.mint) {\n return ComponentAPI.library[key].object;\n }\n }\n return null;\n }\n\n static getFeatureWithMINT(minttype: string): FeatureTemplate | null {\n const checkmint = minttype;\n for (const key in this.featureLibrary) {\n if (checkmint == this.featureLibrary[key].object.macro) {\n return ComponentAPI.featureLibrary[key].object;\n }\n \n }\n return null;\n }\n /**\n * Get the definition of a component given by the corresponding mint type\n *\n * @static\n * @param {string} minttype\n * @returns {(LibraryEntryDefinition | null)}\n * @memberof ComponentAPI\n */\n static getDefinitionForMINT(minttype: string): LibraryEntryDefinition | null {\n const checkmint = minttype;\n let ret: LibraryEntryDefinition | null = null;\n for (const key in this.library) {\n if (checkmint == this.library[key].object.mint) {\n ret = {\n unique: this.library[key].object.unique,\n heritable: this.library[key].object.heritable,\n units: this.library[key].object.units,\n defaults: this.library[key].object.defaults,\n minimum: this.library[key].object.minimum,\n maximum: this.library[key].object.maximum,\n mint: this.library[key].object.mint\n };\n }\n }\n return ret;\n }\n\n /**\n * Gets the library definition for the component with the given name.\n * Note- Takes the old 3DuF entity type name and not MINT type name.\n *\n * @static\n * @param {string} threeduftype\n * @returns {(LibraryEntryDefinition | null)}\n * @memberof ComponentAPI\n */\n static getDefinition(threeduftype: string): LibraryEntryDefinition | null {\n // If threeduftype is a key present in library, return the definition\n // TODO: Change this to use minttype in the future\n if (Object.prototype.hasOwnProperty.call(ComponentAPI.library, threeduftype)) {\n const template = ComponentAPI.library[threeduftype].object;\n const definition = {\n unique: template.unique,\n heritable: template.heritable,\n units: template.units,\n defaults: template.defaults,\n minimum: template.minimum,\n maximum: template.maximum,\n mint: template.mint\n };\n return definition;\n }\n return null;\n }\n\n /**\n * Gets the 3duf type for mint type\n *\n * @static\n * @param {string} minttype\n * @returns {(string | null)}\n * @memberof ComponentAPI\n */\n static getTypeForMINT(minttype: string): string | null {\n for (const key in ComponentAPI.library) {\n if (minttype === ComponentAPI.library[key].object.mint) {\n return key;\n }\n }\n return null;\n }\n\n /**\n * Gets the mint type for 3duf type\n *\n * @static\n * @param {string} threeduftype\n * @returns {(string | null)}\n * @memberof ComponentAPI\n */\n static getMINTForType(threeduftype: string): string | null {\n for (const key in ComponentAPI.library) {\n if (threeduftype === key) {\n return ComponentAPI.library[key].object.mint;\n }\n }\n return null;\n }\n\n /**\n * Gets the library drawing definitions for the component with the given MINT tyep.\n *\n * @static\n * @param {string} minttype\n * @returns {(Array | null)}\n * @memberof ComponentAPI\n */\n static getRenderTypeKeysForMINT(minttype: string): Array | null {\n let ret = [];\n for (const key in ComponentAPI.library) {\n if (minttype === ComponentAPI.library[key].object.mint) {\n ret.push(key);\n }\n }\n if (ret.length > 0) {\n return ret;\n } else {\n throw new Error(\"No render type found for mint type: \" + minttype);\n }\n }\n\n /**\n * Returns the component ports for a given component\n * @param params\n * @param minttypestring\n * @return {void|Array}\n */\n static getComponentPorts(params: Map, minttypestring: string): Array {\n let threeduftypestring = ComponentAPI.getTypeForMINT(minttypestring);\n if (threeduftypestring === null) {\n console.error(\"Component Ports of: \" + threeduftypestring + \" not found in library. Using default Template\");\n threeduftypestring = \"Template\";\n }\n const definition = ComponentAPI.library[threeduftypestring].object;\n const params_to_pass: { [index: string]: any } = {};\n params.forEach((value, key) => {\n params_to_pass[key] = value;\n });\n const ports = definition.getPorts(params_to_pass);\n return ports;\n }\n\n /**\n * Checks if the component definition in the library has the Inverse Render generation support\n * @param typestring\n * @return {*|boolean}\n */\n static hasInverseRenderLayer(typestring: string): boolean {\n const definition = ComponentAPI.library[typestring].object;\n // Go through the renderkeys and check if inverse is available\n const renderkeys = definition.renderKeys;\n return renderkeys.includes(\"INVERSE\");\n }\n\n /**\n * ?\n * @param {String} typeString\n * @param {String} setString\n * @returns {Template.defaults}\n * @memberof Feature\n */\n static getDefaultsForType(threeduftypeString: string): { [key: string]: number } {\n if (Object.prototype.hasOwnProperty.call(ComponentAPI.library, threeduftypeString)) {\n return ComponentAPI.library[threeduftypeString].object.defaults;\n } else {\n throw new Error(\"Component Type definition: \" + threeduftypeString + \" not found in library\");\n }\n }\n\n /**\n * Gets the heritable keys for a given component\n *\n * @static\n * @param {string} threeduftypeString\n * @returns {{ [key: string]: string }}\n * @memberof ComponentAPI\n */\n static getHeritableForType(threeduftypeString: string): { [key: string]: string } {\n if (Object.prototype.hasOwnProperty.call(ComponentAPI.library, threeduftypeString)) {\n return ComponentAPI.library[threeduftypeString].object.heritable;\n } else {\n throw new Error(\"Component Type definition: \" + threeduftypeString + \" not found in library\");\n }\n }\n\n /**\n * Gets the unique keys for a given component\n *\n * @static\n * @param {string} threeduftypeString\n * @returns {{ [key: string]: string }}\n * @memberof ComponentAPI\n */\n static getUniqueForType(threeduftypeString: string): { [key: string]: string } {\n if (Object.prototype.hasOwnProperty.call(ComponentAPI.library, threeduftypeString)) {\n return ComponentAPI.library[threeduftypeString].object.unique;\n } else {\n throw new Error(\"Component Type definition: \" + threeduftypeString + \" not found in library\");\n }\n }\n\n /**\n * Checks if the component definition belongs to a custom component\n *\n * @static\n * @param {string} threeduftypeString\n * @returns {boolean}\n * @memberof ComponentAPI\n */\n static isCustomType(threeduftypeString: string): boolean {\n if (threeduftypeString in ComponentAPI.customTypes.keys()) {\n return true;\n }\n return false;\n }\n\n /**\n * Generates a unique ID\n *\n * @static\n * @returns {string}\n * @memberof ComponentAPI\n */\n static generateID(): string {\n return uuid.v1();\n }\n\n /**\n * Returns the component renderer info for the given type\n *\n * @static\n * @param {string} threeduftypeString\n * @returns {Template}\n * @memberof ComponentAPI\n */\n static getRenderer(threeduftypeString: string): Template {\n //Check if threeduftypestring in library\n if (Object.prototype.hasOwnProperty.call(ComponentAPI.library, threeduftypeString)) {\n return ComponentAPI.library[threeduftypeString].object;\n } else {\n throw new Error(\"Component Type definition: \" + threeduftypeString + \" not found in library\");\n }\n }\n\n /**\n * Returns the component renderer info for the given type\n *\n * @static\n * @param {string} minttype\n * @returns {Template}\n * @memberof ComponentAPI\n */\n static getRendererForMINT(minttype: string): Template {\n // Go through all the objects in the library and return the one that matches the minttype\n for (const key in ComponentAPI.library) {\n if (ComponentAPI.library[key].object.mint === minttype) {\n console.log(\"Renderer: \", ComponentAPI.library[key].object);\n return ComponentAPI.library[key].object;\n }\n }\n throw new Error(\"Component Type definition: \" + minttype + \" not found in library\");\n }\n\n /**\n * Returns the component definition for the given type\n *\n * @static\n * @param {string} threeduftypeString\n * @returns {LibraryEntry}\n * @memberof ComponentAPI\n */\n static getRendererInfo(threeduftypeString: string): LibraryEntry {\n //Check if threeduftypestring in library\n if (Object.prototype.hasOwnProperty.call(ComponentAPI.library, threeduftypeString)) {\n return ComponentAPI.library[threeduftypeString];\n } else {\n throw new Error(\"Component Type definition: \" + threeduftypeString + \" not found in library\");\n }\n }\n\n /**\n * Returns the component rendering keys for the given type\n *\n * @static\n * @param {string} threeduftypeString\n * @returns {Array}\n * @memberof ComponentAPI\n */\n static getAllRenderKeys(threeduftypeString: string): Array {\n return ComponentAPI.library[threeduftypeString].object.renderKeys;\n }\n\n /**\n * Returns the different types of connection types in the library\n *\n * @static\n * @returns {Array}\n * @memberof ComponentAPI\n */\n static getConnectionTypes(): Array {\n let ret = [];\n for (const key in ComponentAPI.connectionLibrary) {\n let entry = ComponentAPI.connectionLibrary[key];\n ret.push(entry.object.mint);\n }\n return ret;\n }\n}\n","import { LogicalLayerType } from \"../core/init\";\n\nexport enum DFMType {\n EDGE = \"EDGE\",\n XYZ = \"XYZ\",\n XY = \"XY\",\n Z = \"Z\"\n}\n\n/**\n * Type which contains information for manufacturing svg production\n * @param {DFMType} fabtype Type of fabrication\n * @param {LogicalLayerType | null} layertype Type of layer on which the feature sits\n * @param {string} rendername Key which accesses the z-offset-key and substrate--offset\n * @param {string} z-offset-key Key which corresponds to the property representing height of the feature\n * @param {string} substrate_offset String represented value which represent how this substrate relates to the FLOW substrate\n */\nexport type ManufacturingInfo = {\n fabtype: DFMType;\n layertype: LogicalLayerType | null;\n rendername: string;\n z_offset_key: string;\n depth: number;\n substrate_offset: string;\n substrate: number | null;\n modifier: string | null;\n};\n","/**\n * DXFObject class\n */\nexport default class DXFObject {\n protected _rootObject: any;\n protected _type: string;\n\n /**\n * Default Constructor\n * @param {*} jsondata\n */\n constructor(jsondata: any) {\n this._rootObject = jsondata;\n\n this._type = jsondata.type;\n }\n\n /**\n * Sets type of the object\n * @param {String} type\n * @memberof DXFObject\n * @returns {void}\n */\n setType(type: string): void {\n this._type = type;\n this._rootObject.type = type;\n }\n\n /**\n * Gets the type of the object\n * @returns {String} Returns type of the object\n * @memberof DXFObject\n */\n getType(): string {\n return this._type;\n }\n\n /**\n * Gets the data of the object\n * @returns {} Returns the data of the object\n * @memberof DXFObject\n */\n getData(): any {\n return this._rootObject;\n }\n\n /**\n * Adds data by passing the key (Name of the data) and it's value\n * @param {String} key\n * @param {*} value\n * @memberof DXFObject\n * @returns {void}\n */\n addData(key: string, value: any): void {\n this._rootObject[key] = value;\n }\n\n /**\n * ?\n * @returns {Object}\n * @memberof DXFObject\n */\n toJSON(): JSON {\n return this._rootObject;\n }\n\n /**\n *\n * @param {JSON} json\n * @returns {DXFObject} Returns new DXFObject object\n * @memberof DXFObject\n */\n static fromJSON(json: JSON): DXFObject {\n return new DXFObject(json);\n }\n}\n","/**\n * Parameter class\n */\nexport default class Parameter {\n private __type: string;\n private __value: any;\n\n /**\n * Default Constructor of the Parameter object\n * @param {String} type\n * @param {*} value\n */\n constructor(type: string, value: any) {\n //Check value if its parsable string\n if (typeof value === \"string\" && type === \"Float\") {\n value = parseInt(value);\n } else if (typeof value === \"string\" && type === \"Integer\") {\n value = parseInt(value);\n }\n //Parameter.checkValue(type, value);\n this.__type = type;\n this.__value = value;\n }\n /**\n * @returns {}\n * @memberof Parameter\n */\n toJSON(): any {\n return this.__value;\n }\n /**\n * Gets value of parameter\n * @returns {} Returns value of the parameter\n * @memberof Parameter\n */\n public get value(): any {\n return this.__value;\n }\n /**\n * Gets type of parameter\n * @returns {String} Returns the type of parameter\n * @memberof Parameter\n */\n public get type(): string {\n return this.__type;\n }\n\n /**\n * Updates the value of parameter\n * @param {*} value New value of the parameter\n * @memberof Parameter\n * @returns {void}\n */\n updateValue(value: any): void {\n //Parameter.checkValue(this.__type, value);\n this.__value = value;\n }\n\n resetValue(): void {}\n}\n","/// \nimport Parameter from \"./parameter\";\n/**\n * Params class\n */\nexport default class Params {\n private __unique: Map;\n private __heritable: Map;\n private __parameters: { [index: string]: Parameter };\n\n /**\n * Default constructor create a Params object.\n * @param {} values Values of the params\n * @param {Boolean} unique Boolean if it's unique\n * @param {} heritable Boolean if it's heritable\n */\n constructor(values: { [index: string]: any }, unique: Map, heritable: Map) {\n this.__unique = unique;\n this.__heritable = heritable;\n this.__parameters = {};\n for (let key in values) {\n this.__parameters[key] = new Parameter(typeof values[key], values[key]);\n }\n }\n\n /**\n * Returns the parameters object (TODO - Remove this in the future)\n *\n * @readonly\n * @memberof Params\n */\n get parameters(): { [index: string]: Parameter } {\n return this.__parameters;\n }\n\n /**\n * Updates parameter value.\n * @param {String} key Identifier of the parameter\n * @param {*} value New value of the parameter\n * @memberof Params\n * @returns {void}\n */\n updateParameter(key: string, value: any): void {\n if (this.__parameters.hasOwnProperty(key)) {\n this.__parameters[key].updateValue(value);\n } else {\n throw new Error(key + \"parameter does not exist in Params object\");\n }\n }\n /**\n * Checks if the object has certain parameter.\n * @param {String} key The key is use to identify the parameter\n * @memberof Params\n * @returns {void}\n */\n __ensureHasKey(key: string): void {\n if (!this.__parameters.hasOwnProperty(key)) throw new Error(key + \" parameter not found in Params object.\");\n }\n /**\n * Gets the value of the selected parameter.\n * @param {String} key The key is needed to identify the parameter\n * @returns Returns parameter value\n * @memberof Params\n */\n getValue(key: string): any {\n this.__ensureHasKey(key);\n return this.__parameters[key].value;\n }\n\n /**\n * Checks if param object has unique key.\n * @param {String} key Key to identify the param\n * @returns {boolean}\n * @memberof Params\n */\n isUnique(key: string): boolean {\n return this.__unique.has(key);\n }\n /**\n * Checks if param object has heritable attribute.\n * @param {String} key Key to identify the param\n * @returns {boolean}\n * @memberof Params\n */\n isHeritable(key: string): boolean {\n return this.__heritable.has(key);\n }\n\n /**\n * Converts to JSON format.\n * @returns {JSON} Returns JSON format.\n * @memberof Params\n */\n toJSON(): { [index: string]: any } {\n let json: { [index: string]: any } = {};\n for (let key in this.__parameters) {\n if (this.__parameters[key] != undefined) {\n json[key] = this.__parameters[key].value;\n }\n }\n return json;\n }\n /**\n * Creates new params object from a JSON format.\n * @param {JSON} json\n * @param {*} unique\n * @param {*} heritable\n * @returns {Params} Returns a new params object.\n * @memberof Params\n */\n static fromJSON(json: Map, unique: Map, heritable: Map): Params {\n return new Params(json, unique, heritable);\n }\n /**\n * Checks if it has parameters.\n * @param {String} key The key is use to identify the desire parameter.\n * @returns {boolean}\n * @memberof Params\n */\n hasParam(key: string): boolean {\n return this.__parameters.hasOwnProperty(key);\n }\n\n /**\n * Returns a ES6 Map() type object with keys and values.\n * @return {Map}\n * @memberof Params\n */\n toMap(): Map {\n let ret = new Map();\n for (let key in this.__parameters) {\n if (this.__parameters[key] != undefined) {\n ret.set(key, this.__parameters[key].value);\n }\n }\n return ret;\n }\n\n /**\n * Sets the parameters of the params\n *\n * @param {{ [index: string]: Parameter }} parameters\n * @memberof Params\n */\n loadParameters(parameters: { [index: string]: Parameter }): void {\n for (let key in parameters) {\n this.__parameters[key] = parameters[key];\n }\n }\n\n /**\n * Returns the list of unique keys of the params.\n *\n * @readonly\n * @type {Array}\n * @memberof Params\n */\n get unique(): Array {\n return Array.from(this.__unique.keys());\n }\n\n /**\n * Returns the list of heritable keys of the params.\n *\n * @readonly\n * @type {Array}\n * @memberof Params\n */\n get heritable(): Array {\n return Array.from(this.__heritable.keys());\n }\n}\n","import uuid from \"node-uuid\";\nimport EdgeFeature from \"./edgeFeature\";\nimport Feature from \"./feature\";\nimport Params from \"./params\";\nimport Device from \"./device\";\nimport { FeatureInterchangeV1_2 } from \"./init\";\nimport { LayerInterchangeV1, LogicalLayerType } from \"./init\";\nimport { ComponentAPI } from \"@/componentAPI\";\n\n/**\n * Layer class\n */\nexport default class Layer {\n params: Params;\n name: string;\n features: { [index: string]: Feature };\n featureCount: number;\n device?: Device;\n private __id: string;\n private __type: LogicalLayerType = LogicalLayerType.FLOW;\n private __group: string;\n\n /**\n * Default Constructor for the layer\n * @param {*} values Value of the layer\n * @param {String} name Name of the layer\n */\n constructor(values: { [index: string]: any }, name: string = \"New Layer\", type: LogicalLayerType = LogicalLayerType.FLOW, group: string = \"0\", device?: Device) {\n this.params = new Params(values, Layer.getUniqueParameters(), Layer.getHeritableParameters());\n this.name = name;\n this.features = {};\n this.featureCount = 0;\n this.device = device;\n this.__id = ComponentAPI.generateID();\n this.__type = type;\n this.__group = group;\n }\n\n get type(): LogicalLayerType {\n return this.__type;\n }\n\n get id(): string {\n return this.__id;\n }\n\n set id(ID: string) {\n this.__id = ID;\n }\n\n get group(): string {\n return this.__group;\n }\n\n /**\n * Adds a feature to the layer\n * @param {Feature} feature Feature to pass to add to the layer\n * @memberof Layer\n * @returns {void}\n */\n addFeature(feature: Feature): void {\n this.__ensureIsAFeature(feature);\n this.features[feature.ID] = feature;\n this.featureCount += 1;\n //TODO - Verify that this is not a problem anymore\n feature.layer = this;\n feature.setManufacturingInfoLayer();\n }\n\n /**\n * Returns index of layer\n * @returns {Number}\n * @memberof Layer\n */\n getIndex(): number {\n if (this.device) {\n return this.device.layers.indexOf(this);\n } else {\n throw new Error(\"No device referenced on this layer\");\n }\n }\n /*\n estimateLayerHeight(){\n let dev = this.device;\n let flip = this.params.getValue(\"flip\");\n let offset = this.params.getValue(\"z_offset\");\n if (dev){\n let thisIndex = this.getIndex();\n let targetIndex;\n if (flip) targetIndex = thisIndex - 1;\n else targetIndex = thisIndex + 1;\n if (thisIndex >= 0 || thisIndex <= (dev.layers.length -1)){\n let targetLayer = dev.layers[targetIndex];\n return Math.abs(offset - targetLayer.params.getValue(\"z_offset\"));\n } else {\n if (thisIndex -1 >= 0){\n let targetLayer = dev.layers[thisIndex -1];\n return targetLayer.estimateLayerHeight();\n }\n }\n }\n return 0;\n }\n*/\n\n /**\n * Checks whether the argument pass is a feature\n * @param {Feature} feature Feature object\n * @memberof Layer\n * @returns {void}\n */\n __ensureIsAFeature(feature: any): void {\n if (!(feature instanceof Feature) && !(feature instanceof EdgeFeature)) {\n throw new Error(\"Provided value\" + feature + \" is not a Feature! Did you pass an ID by mistake?\");\n }\n }\n\n /**\n * Checks whether the feature already exist\n * @param {Feature} feature Feature object\n * @memberof Layer\n * @returns {void}\n */\n __ensureFeatureExists(feature: Feature): void {\n if (!this.containsFeature(feature)) throw new Error(\"Layer does not contain the specified feature!\");\n }\n\n /**\n * Checks if feature exist based on it's ID\n * @param {String} featureID ID of the feature to search for\n * @memberof Layer\n * @returns {void}\n */\n __ensureFeatureIDExists(featureID: string): void {\n if (!this.containsFeatureID(featureID)) throw new Error(\"Layer does not contain a feature with the specified ID!\");\n }\n\n /**\n * Returns unique parameters\n * @returns {Map}\n * @memberof Layer\n * @returns {void}\n */\n static getUniqueParameters(): Map {\n let unique: Map = new Map();\n unique.set(\"z_offset\", \"Float\");\n unique.set(\"flip\", \"Boolean\");\n return unique;\n }\n\n /**\n * Returns heritable parameters\n * @returns {Map}\n * @memberof Layer\n * @returns {void}\n */\n static getHeritableParameters(): Map {\n return new Map();\n }\n\n /**\n * Returns feature based on it's ID\n * @param {String} featureID\n * @returns {Feature}\n * @memberof Layer\n */\n getFeature(featureID: string): Feature {\n this.__ensureFeatureIDExists(featureID);\n return this.features[featureID];\n }\n\n /**\n * Removes selected feature\n * @param {Feature} feature Feature object\n * @memberof Layer\n * @returns {void}\n */\n removeFeature(feature: Feature): void {\n this.removeFeatureByID(feature.ID);\n console.log(\"Device: \", this.device);\n if (this.device !== null || this.device !== undefined) {\n this.device?.removeFeature(feature);\n }\n }\n\n // TODO: Stop using delete, it's slow!\n /**\n * Removes a feature by passing it's ID as a parameter\n * @param {string} featureID ID of the feature\n * @memberof Layer\n * @returns {void}\n */\n removeFeatureByID(featureID: string): void {\n this.__ensureFeatureIDExists(featureID);\n const feature: Feature = this.features[featureID];\n this.featureCount -= 1;\n delete this.features[featureID];\n }\n\n /**\n * Checks if object contains a feature\n * @param {Feature} feature Feature object\n * @returns {Boolean} true if it has the feature\n * @memberof Layer\n */\n containsFeature(feature: Feature): boolean {\n this.__ensureIsAFeature(feature);\n return this.features.hasOwnProperty(feature.ID);\n }\n\n /**\n * Checks if object contains a feature based on the feature's ID\n * @param {String} featureID ID of the feature to search for\n * @returns {Boolean} true if it has the feature\n * @memberof Layer\n */\n containsFeatureID(featureID: string): boolean {\n return this.features.hasOwnProperty(featureID);\n }\n\n /**\n * Gets all features from the layers\n * @returns {Array} Returns all features from the layers\n * @memberof Layer\n */\n getAllFeaturesFromLayer(): { [index: string]: Feature } {\n return this.features;\n }\n\n /**\n * Convers features to JSON format\n * @returns {JSON} Returns a JSON format with the features in a JSON format\n * @memberof Layer\n */\n __featuresToJSON(): { [index: string]: any } {\n const output: { [index: string]: any } = {};\n for (const i in this.features) {\n output[i] = this.features[i].toJSON();\n }\n return output;\n }\n\n /**\n * Converts features to Interchange format\n * @returns {Array} Returns an array with the features in Interchange format\n * @memberof Layer\n */\n __featuresInterchangeV1(): Array {\n const output: Array = [];\n for (const i in this.features) {\n output.push(this.features[i].toInterchangeV1());\n }\n return output;\n }\n\n /**\n * Loads features from JSON format\n * @param {JSON} json JSON format file\n * @memberof Layer\n */\n __loadFeaturesFromJSON(json: { [index: string]: any }): void {\n for (const i in json) {\n this.addFeature(Feature.fromJSON(json[i]));\n }\n }\n\n /**\n * Loads features from Interchange format\n * @param {*} json Interchange format file\n * @memberof Layer\n */\n __loadFeaturesFromInterchangeV1(json: { [index: string]: any }): void {\n for (const i in json) {\n this.addFeature(Feature.fromInterchangeV1(json[i]));\n }\n }\n\n // TODO: Replace Params and remove static method\n /**\n * Converts the attributes of the object into a JSON format\n * @returns {JSON} Returns a JSON format with the attributes of the object\n * @memberof Layer\n */\n toJSON(): { [index: string]: any } {\n const output: { [index: string]: any } = {};\n output.name = this.name;\n output.params = this.params.toJSON();\n output.features = this.__featuresToJSON();\n return output;\n }\n\n /**\n * Converts the attributes of the object into Interchange format\n * @returns {LayerInterchangeV1} Returns a Interchange format with the attributes of the object\n * @memberof Layer\n */\n toInterchangeV1(): LayerInterchangeV1 {\n let layerType = \"FLOW\";\n if (this.type === LogicalLayerType.FLOW) {\n layerType = \"FLOW\";\n } else if (this.type === LogicalLayerType.CONTROL) {\n layerType = \"CONTROL\";\n } else if (this.type === LogicalLayerType.INTEGRATION) {\n layerType = \"INTEGRATION\";\n } else {\n throw new Error(\"Unknown layer type: \" + this.type);\n }\n\n const output: LayerInterchangeV1 = {\n id: this.__id,\n name: this.name,\n type: layerType,\n // TODO - Add group and unique name parameters to the system and do type checking\n // against type and not name in the future\n group: this.__group,\n params: this.params.toJSON(),\n features: this.__featuresInterchangeV1()\n };\n return output;\n }\n\n /**\n * Generate the feature layer json that is neccissary for\n * seriailizing the visual of the 3DuF designs\n *\n * @returns {*} json of the features\n * @memberof Layer\n */\n toFeatureLayerJSON(): { [index: string]: any } {\n const output: { [index: string]: any } = {};\n output.name = this.name;\n output.params = this.params.toJSON();\n output.features = this.__featuresInterchangeV1();\n return output;\n }\n\n /**\n * Load from an Interchange format a new layer object\n * @param {*} json\n * @returns {Layer} Returns a new layer object\n * @memberof Layer\n */\n static fromInterchangeV1(json: LayerInterchangeV1, device: Device): Layer {\n let layerType = LogicalLayerType.FLOW;\n if (Object.prototype.hasOwnProperty.call(json, \"type\")) {\n if (json.type === \"FLOW\") {\n layerType = LogicalLayerType.FLOW;\n } else if (json.type === \"CONTROL\") {\n layerType = LogicalLayerType.CONTROL;\n } else if (json.type === \"INTEGRATION\") {\n layerType = LogicalLayerType.INTEGRATION;\n } else {\n throw new Error(\"Unknown layer type: \" + json.type);\n }\n }\n const newLayer: Layer = new Layer(json.params, json.name, layerType, json.group, device);\n newLayer.__loadFeaturesFromInterchangeV1(json.features);\n return newLayer;\n }\n}\n","export default class LinkedList {\n head: Node | null;\n tail: Node | null;\n count: number;\n current: Node | null;\n\n constructor() {\n this.head = null;\n this.tail = null;\n this.count = 0;\n this.current = null;\n }\n\n currentData() {\n return this.current?.data;\n }\n\n removeCurrent(): void {\n const prev = this.current!.prev;\n const next = this.current!.next;\n\n prev!.next = next;\n next!.prev = prev;\n }\n\n removeNode(node: { [k: string]: any }): void {\n const cnode = this.head;\n if (node.id === cnode?.id) {\n // remove the node\n const prev = cnode!.prev;\n const next = cnode!.next;\n\n prev!.next = next;\n if (next) {\n next.prev = prev;\n }\n } else {\n let nextnode = LinkedList.getNextNode(cnode!);\n while (nextnode) {\n if (nextnode.id === node.id) {\n // remove the node\n const prev = nextnode.prev;\n const next = nextnode.next;\n\n prev!.next = next;\n if (next) {\n next.prev = prev;\n }\n break;\n } else {\n nextnode = LinkedList.getNextNode(nextnode);\n }\n }\n }\n this.count--;\n }\n\n get length() {\n return this.count;\n }\n\n push(data: { [k: string]: any }): void {\n // Incase its the first one\n if (this.count === 0) {\n const node = new Node(data);\n this.head = node;\n this.tail = node;\n } else {\n // Save the old head\n const temp = this.head;\n\n // Set the new head\n const node = new Node(data);\n node.id = this.count;\n\n // Create new links\n node.next = temp;\n temp!.prev = node;\n\n this.head = node;\n }\n this.count++;\n }\n\n getArray() {\n const retarray = [];\n retarray.push(this.head!.data);\n let nextnode = LinkedList.getNextNode(this.head!);\n while (nextnode) {\n retarray.push(nextnode.data);\n nextnode = LinkedList.getNextNode(nextnode);\n }\n return retarray;\n }\n\n static getNextNode(node: Node) {\n return node.next;\n }\n\n static getPreviousNode(node: Node) {\n return node.prev;\n }\n}\n\nclass Node {\n prev: Node | null;\n data: any;\n next: Node | null;\n id: number;\n\n constructor(data: any) {\n this.prev = null;\n this.data = data;\n this.next = null;\n this.id = 0;\n }\n}\n","export default class GeometryEdge {\n private __start: any;\n private __end: any;\n private __type: any;\n private __id: any;\n private __dxfData: any;\n\n constructor(start: any, end: any, type: any, id: any, data: any) {\n this.__start = start;\n this.__end = end;\n\n this.__type = type;\n this.__id = id;\n\n this.__dxfData = data;\n\n // TODO: Do classification of kind of edge (curve, horizontal, vertical, angled, etc), compute length\n }\n\n get id() {\n return this.__id;\n }\n\n get start() {\n return this.__start;\n }\n\n get end() {\n return this.__end;\n }\n\n get type() {\n return this.__type;\n }\n\n get dxfData() {\n return this.__dxfData;\n }\n}\n","import GeometryEdge from \"./geometryEdge\";\n\n// @ts-ignore\nimport graphlib from \"@dagrejs/graphlib\";\nimport paper from \"paper\";\n\nexport default class GeometryGraph {\n private __nodes: any;\n private __nodecount: number;\n private __edgecount: number;\n private __edgeData: Map;\n private __networkGraph: any;\n\n constructor() {\n // TODO: Do all the initializations here\n this.__nodes = new Map();\n this.__nodecount = 0;\n this.__edgecount = 0;\n this.__edgeData = new Map();\n\n this.__networkGraph = new graphlib.Graph({ directed: false });\n }\n\n addEdge(start: any, end: any, data: any): void {\n const startnode = this.findNode(start);\n const endnode = this.findNode(end);\n\n const edgeobject = new GeometryEdge(startnode, endnode, data.type, String(this.__edgecount++), data);\n\n this.__edgeData.set(edgeobject.id, edgeobject);\n\n this.__networkGraph.setEdge(startnode, endnode, edgeobject.id);\n }\n\n findNode(node: any) {\n for (const key of this.__nodes.keys()) {\n const nodetocheck = this.__nodes.get(key);\n\n if (GeometryGraph.computeDistance(node, nodetocheck) < 0.000001) {\n return key;\n }\n }\n\n // If it comes to this, then it means that the node does not exist\n const newkey = String(this.__nodecount++);\n this.__nodes.set(newkey, node);\n\n return newkey;\n }\n\n generateGeometry() {\n // console.log(\"Cycles:\", graphlib.alg.findCycles(this.__networkGraph));\n // console.log(\"Edges:\", this.__networkGraph.edges());\n // console.log(\"Nodes:\", this.__nodes);\n // console.log(\"Edge Data:\", this.__edgeData);\n const path = new paper.CompoundPath(\"\");\n\n // graphlib.alg.findCycles(this.__networkGraph);\n const graphcomponents = graphlib.alg.components(this.__networkGraph);\n // console.log(\"Components:\", graphcomponents);\n\n /*\n Step 1 - Iterate through each of the components (disconnected components)\n Step 2 - Draw outline for each of the components\n */\n\n for (const component of graphcomponents) {\n this.drawComponent(component, path);\n }\n\n return path;\n }\n\n drawComponent(component: any[], path: any): void {\n /*\n Step 1 - Take the starting node\n Step 2 - start traversing through the component and start making a path with segments\n */\n\n // console.log(\"Graph component\",component);\n\n // Get the first item in the component\n\n // let startnode = this.__nodes.get(component[0]);\n // console.log(\"startnode\", startnode);\n\n const segments = [];\n const startnode = this.__nodes.get(component[0]);\n const endnode = null;\n // console.log(\"test ?\");\n // Get traversal\n const traversal = graphlib.alg.preorder(this.__networkGraph, component[0]);\n\n const childpath = new paper.Path();\n\n for (let i = 0; i < traversal.length; i++) {\n const noderef = traversal[i];\n const node = this.__nodes.get(noderef);\n let nextnoderef;\n if (i + 1 === traversal.length) {\n // Last Node\n nextnoderef = traversal[0];\n } else {\n // All other nodes\n nextnoderef = traversal[i + 1];\n }\n\n // Get the edge\n const edge = this.__getEdge(noderef, nextnoderef);\n\n // console.log(\"Edge:\", edge);\n // console.log(\"Edge Type:\", edge.type);\n switch (edge.type) {\n case \"LINE\":\n childpath.add(new paper.Point(node.x, node.y));\n break;\n case \"ARC\":\n childpath.add(new paper.Point(node.x, node.y));\n const nextnode = this.__nodes.get(nextnoderef);\n const endpoint = new paper.Point(nextnode.x, nextnode.y);\n const midpoint = this.getARCMidpoint(edge.dxfData);\n childpath.arcTo(midpoint, endpoint);\n break;\n }\n }\n\n path.addChild(childpath);\n\n // //Generate Lines for everything\n // for(let i = 0; i< traversal.length; i++ ){\n // let node = this.__nodes.get(traversal[i]);\n //\n // console.log(\"Line:\", \"Start\", startnode, \"End\" , endnode);\n // //TODO: Draw curve for curves\n // let line = new paper.Path.Line(new paper.Point(startnode.x, endnode.y), new paper.Point(endnode.x, endnode.y));\n // childpath.add(line);\n // }\n //\n // startnode = endnode;\n // endnode = this.__nodes.get(component[0]);\n // console.log(\"Line:\", \"Start\", startnode, \"End\" , endnode);\n //\n // //Last segment to close everything off\n // childpath.add(new paper.Path.Line(\n // // new paper.Point(startnode.x, endnode.y),\n // new paper.Point(endnode.x, endnode.y))\n // );\n //\n // console.log(path);\n\n // Now join all the segments\n // let joinedpath = null;\n // for(let i = 0; i < segments.length; i++){\n // if(joinedpath === null){\n // joinedpath = segments[i];\n // }\n // joinedpath.join(segments[i]);\n // }\n\n // console.log(\"Joined Path\", joinedpath);\n // console.log(\"Segments:\", segments);\n\n // path.addChild(joinedpath);\n }\n\n getARCMidpoint(dxfData: any) {\n // console.log(\"DXF:\",dxfData);\n const center = new paper.Point(dxfData.center.x, dxfData.center.y);\n const radius = dxfData.radius;\n const startAngle = dxfData.startAngle;\n const endAngle = dxfData.endAngle; //* 180/Math.PI;\n const midAngle = (startAngle + endAngle) / 2;\n\n const midpoint = new paper.Point(center.x + radius * Math.cos(midAngle), center.y + radius * Math.sin(midAngle));\n\n return midpoint;\n }\n\n __getEdge(source: any, target: any) {\n const edgeref = this.__networkGraph.edge(source, target);\n return this.__edgeData.get(edgeref);\n }\n\n static computeDistance(node: any, nodetocheck: any): number {\n const sqdist = Math.pow(node.x - nodetocheck.x, 2) + Math.pow(node.y - nodetocheck.y, 2);\n // TODO: check if there is a z component\n return Math.sqrt(sqdist);\n }\n}\n","import paper from \"paper\";\nimport * as THREE from \"three\";\nimport LinkedList from \"../../utils/linkedList\";\nimport GeometryGraph from \"../../geometry/geometryGraph\";\nimport Feature from \"@/app/core/feature\";\nimport DXFObject from \"@/app/core/dxfObject\";\nimport CustomComponent from \"@/app/core/customComponent\";\n\nexport function renderCustomComponentFeature(feature: Feature, color: string) {\n const position = feature.getValue(\"position\");\n const rotation = feature.getValue(\"rotation\");\n const render = renderDXFObjects(feature.dxfObjects);\n render.translate(new paper.Point(position[0], position[1]));\n render.rotate(rotation);\n render.fillColor = new paper.Color(color);\n return render;\n}\n\nexport function renderCustomComponentTarget(customcomponent: CustomComponent, params: {[key: string]: any}) {\n // console.log(\"Render Posiition:\", position);\n const position = params.position;\n const color = new paper.Color(params.color);\n const rotation = params.rotation;\n const p = new paper.Point(position[0], position[1]);\n const render = renderDXFObjects(customcomponent.dxfData);\n\n render.fillColor = color;\n render.fillColor.alpha = 0.5;\n render.translate(p);\n render.rotate(rotation);\n return render;\n}\n\nexport function renderFeatureObjects(feature: Feature) {\n console.log(\"rendering the features dxf objects\");\n for (const i in feature.getDXFObjects()) {\n const dxfobject = feature.getDXFObjects()[i];\n }\n throw new Error(\"Implement the renderer\");\n}\n\n/**\n * Calculates and returns the bulge through point\n * @param startpoint\n * @param endpoint\n * @param bulgevalue\n * @return {paper.Point}\n */\nfunction calculateBulgeThroughPoint(startpoint: paper.Point, endpoint: paper.Point, bulgevalue: number) {\n\n const start = new paper.Point(startpoint.x, startpoint.y);\n const end = new paper.Point(endpoint.x, endpoint.y);\n const angle = 4 * Math.atan(bulgevalue);\n\n /*\n https://math.stackexchange.com/questions/9365/endpoint-of-a-line-knowing-slope-start-and-distance\n */\n const epsilon = angle / 4;\n\n const midpoint = new paper.Point(startpoint.x / 2 + endpoint.x / 2, startpoint.y / 2 + endpoint.y / 2);\n\n const p = new paper.Point(startpoint.x, startpoint.y).getDistance(midpoint) * bulgevalue;\n\n let slope = (endpoint.y - startpoint.y) / (endpoint.x - startpoint.x);\n\n const chordvector = end.subtract(start);\n\n // console.log(\"all points:\", start, end, chordvector);\n /*\n First handle the two cases when they're nicely aligned to the axes\n */\n\n // console.log(chordvector, \"Angle:\",chordvector.angle, Math.round(chordvector.angle), \"Dist from midpoint:\", p);\n\n if (Math.round(chordvector.angle) === 0) {\n // Horizontal\n // console.log(\"Horizontal Case\");\n let throughpoint = new paper.Point(midpoint.x, midpoint.y - p);\n return throughpoint;\n } else if (Math.round(chordvector.angle) === 90) {\n // Vertical\n // console.log(\"Vertical Case\");\n let throughpoint = new paper.Point(midpoint.x + p, midpoint.y);\n return throughpoint;\n } else {\n // All other angles\n // console.log(\"Angled Case\")\n slope = -1 * slope;\n\n // midpoint\n const k = -p / Math.sqrt(1 + slope * slope);\n\n let throughpoint = midpoint.add(new paper.Point(k, k * slope));\n return throughpoint;\n }\n\n}\n\nfunction isClosedPolyline(dxfobject: DXFObject) {\n const data = dxfobject.getData();\n // console.log(data, data.shape);\n return data.shape;\n}\n\nfunction processARC(geometryGraph: GeometryGraph, data: {[key: string]: any}) {\n // console.warn(\"Implement this function !!\");\n\n /*\n\n DXF gives :\n 1. startAngle\n 2. endAngle\n 3. center\n 4. radius\n\n To translate we start with the center point, then calculate points at start angle and end angle\n\n center-> @------r------* <- startAngle\n \\\n \\\n r\n \\\n \\\n * <- endAngle\n\n */\n\n const center = new paper.Point(data.center.x * 1000, data.center.y * 1000);\n const radius = data.radius * 1000;\n const startAngle = data.startAngle;\n const endAngle = data.endAngle; //* 180/Math.PI;\n\n const startpoint = new paper.Point(center.x + radius * Math.cos(startAngle), center.y + radius * Math.sin(startAngle));\n\n const endpoint = new paper.Point(center.x + radius * Math.cos(endAngle), center.y + radius * Math.sin(endAngle));\n\n geometryGraph.addEdge(startpoint, endpoint, data);\n}\n\nfunction processClosedPolyLine(entity: any) {\n const polygon = new paper.Path();\n \n // // create geometry\n for (let i = 0; i < entity.vertices.length; i++) {\n const dxfvertex = entity.vertices[i];\n polygon.add(new paper.Point(dxfvertex.x * 1000, dxfvertex.y * 1000));\n }\n polygon.closed = true;\n \n let modpath = polygon as any;\n modpath.origin = \"POLYLINE\";\n return modpath as paper.PathItem;\n}\n\nfunction processPolyLine(geometryGraph: GeometryGraph, data: any) {\n console.warn(\"Implement this function !!\");\n}\n\nfunction processSpline(geometryGraph: GeometryGraph, data: any) {\n console.warn(\"Implement this function !!\");\n}\n\nfunction processLine(geometryGraph: GeometryGraph, data: any) {\n const startPoint = data.vertices[0];\n const endPoint = data.vertices[1];\n\n geometryGraph.addEdge(startPoint, endPoint, data);\n}\n\nexport function renderDXFObjects(dxfobjectarray: Array) {\n // let path = new paper.CompoundPath();\n\n if (dxfobjectarray === undefined) {\n throw new Error(\"Cannot find DXF DATA\");\n }\n // console.log(\"DXF Object Array to render:\", dxfobjectarray);\n\n const patharray = new LinkedList();\n const closedshapes = [];\n\n const geometryGraph = new GeometryGraph();\n\n for (const i in dxfobjectarray) {\n const dxfobject = dxfobjectarray[i];\n\n /*\n If ARC - Get the start and end points - save to edge graph as\n */\n\n if (dxfobject.getType() === \"ARC\") {\n processARC(geometryGraph, dxfobject.getData());\n } else if (dxfobject.getType() === \"LINE\") {\n processLine(geometryGraph, dxfobject.getData());\n } else if (dxfobject.getType() === \"LWPOLYLINE\" || dxfobject.getType() === \"POLYLINE\") {\n if (isClosedPolyline(dxfobject)) {\n closedshapes.push(processClosedPolyLine(dxfobject.getData()));\n } else {\n processPolyLine(geometryGraph, dxfobject.getData());\n }\n } else if (dxfobject.getType() === \"ELLIPSE\") {\n closedshapes.push(drawEllipse(dxfobject.getData()));\n } else if (dxfobject.getType() === \"CIRCLE\") {\n closedshapes.push(drawCircle(dxfobject.getData()));\n } else if (dxfobject.getType() === \"SPLINE\") {\n alert(\"The current version of the DXF Parser does not support SPLINE objects. Support will be added in future versions\");\n throw new Error(\"Unsupported DXF render object - SPLINE\");\n // processSpline(geometryGraph, dxfobject.getData());\n } else if (dxfobject.getType() === \"DIMENSION\") {\n console.warn(\"DIMENSION entry in DXF will be ignored. Please ensure that all the designs are of the correct dimensions\");\n } else if (dxfobject.getType() === \"MTEXT\") {\n console.warn(\"MTEXT entry in DXF will be ignored. Please ensure that none of the features require text \");\n } else if (dxfobject.getType() === \"INSERT\") {\n alert(\"The current version of the DXF Parser does not support INSERT and BLOCK design references.\");\n throw new Error(\"Unsupported render object\");\n } else {\n alert(\"Unsupported DXF Entity Type for Component Import : \" + dxfobject.getType());\n console.error(\"Unsupported DXF Entity Type for Component Import : \" + dxfobject.getType());\n }\n }\n\n // console.log(\"Geometry grpah:\",geometryGraph);\n // console.log(\"Closed Shapes:\", closedshapes);\n // TODO: Generate the Geometry from the geometry graph , this should a return a compound path that takes care of the\n // right kind of correct connected paths\n\n const path = geometryGraph.generateGeometry();\n\n // TODO: Now add all the remainder closed shapes to the compound paths\n for (const child of closedshapes) {\n path.addChild(child);\n }\n\n // path.strokeColor = '#000000';\n // path.strokeWidth = 1;\n path.closed = true;\n path.fillColor = new paper.Color(\"#ff7606\");\n path.fillRule = \"evenodd\";\n const topleft = path.bounds.topLeft;\n path.translate(new paper.Point(-topleft.x, -topleft.y));\n path.scale(1, -1); // The coordinate system is all different for DXF\n\n path.scale(1000, 1000); // Scale the coordinates to microns\n\n return path;\n}\n\n/**\n * Returns a PaperJS outline rendering of the given\n * DXF objects contained in the feature.\n * @param feature\n */\nexport function renderEdgeFeature(feature: Feature) {\n const path = new paper.CompoundPath(\"\");\n\n // console.log('rendering the outline dxf objects....', feature.getDXFObjects());\n for (const i in feature.getDXFObjects()) {\n const dxfobject = feature.getDXFObjects()[i];\n // Figure out what entity this is and then based on that do the drawing\n let mesh;\n if (dxfobject.getType() === \"ARC\") {\n path.addChild(drawArc(dxfobject.getData()));\n } else if (dxfobject.getType() === \"LWPOLYLINE\" || dxfobject.getType() === \"LINE\" || dxfobject.getType() === \"POLYLINE\") {\n path.addChild(drawLine(dxfobject.getData()));\n } else if (dxfobject.getType() === \"SPLINE\") {\n path.addChild(drawSpline(dxfobject.getData(), path));\n } else if (dxfobject.getType() === \"ELLIPSE\") {\n path.addChild(drawEllipse(dxfobject.getData()));\n } else if (dxfobject.getType() === \"CIRCLE\") {\n path.addChild(drawCircle(dxfobject.getData()));\n } else {\n console.error(\"Unsupported DXF Entity Type for Outline Generation : \" + dxfobject.getType());\n }\n }\n // Set the visual properties for the path\n path.strokeColor = new paper.Color(\"#ff7606\");\n path.strokeWidth = 200;\n // Since this is an outline we need to do the required transformations to it\n path.scale(1, -1); // The coordinate system is all different for DXF\n // console.log(path.bounds.topLeft);\n const topleft = path.bounds.topLeft;\n path.translate(new paper.Point(-topleft.x, -topleft.y));\n\n // Add the feature id to the rendered object or else the whole things breaks down\n // TODO: Streamline the feature ID insertion for each rendered object business\n let modpath = path as any;\n modpath.featureID = feature.ID;\n return modpath as paper.PathItem;\n}\n\n\n/**\n * Generates the paper.js equivalent of the ELLIPSE DXF object\n * @param entity DXF Data\n */\nfunction drawEllipse(entity: any) {\n /*\n https://www.autodesk.com/techpubs/autocad/acad2000/dxf/ellipse_dxf_06.htm\n */\n // console.log(\"DXF Data\", entity);\n\n const center = new paper.Point(entity.center.x * 1000, entity.center.y * 1000);\n const axisratio = entity.axisRatio;\n const majoraxislength = Math.sqrt(Math.pow(entity.majorAxisEndPoint.x * 1000, 2) + Math.pow(entity.majorAxisEndPoint.y * 1000, 2));\n const minoraxislength = majoraxislength * axisratio;\n let rotation = (Math.atan(entity.majorAxisEndPoint.y / entity.majorAxisEndPoint.x) * 180) / Math.PI;\n // console.log(\"Rotation:\", rotation);\n if (Number.isNaN(rotation)) {\n rotation = 0;\n }\n // console.log(\"Rotation:\", rotation);\n // console.log(\"lengths:\", majoraxislength, minoraxislength);\n const ellipse = new paper.Path.Ellipse({\n center: [center.x, center.y],\n radius: [majoraxislength, minoraxislength]\n });\n\n ellipse.rotate(rotation, center);\n return ellipse;\n}\n\n// function drawMtext(entity, data) {\n// var color = getColor(entity, data);\n\n// var geometry = new THREE.TextGeometry(entity.text, {\n// font: font,\n// size: entity.height * (4 / 5),\n// height: 1\n// });\n// var material = new THREE.MeshBasicMaterial({ color: color });\n// var text = new THREE.Mesh(geometry, material);\n\n// // Measure what we rendered.\n// var measure = new THREE.Box3();\n// measure.setFromObject(text);\n\n// var textWidth = measure.max.x - measure.min.x;\n\n// // If the text ends up being wider than the box, it's supposed\n// // to be multiline. Doing that in threeJS is overkill.\n// if (textWidth > entity.width) {\n// console.log(\"Can't render this multipline MTEXT entity, sorry.\", entity);\n// return undefined;\n// }\n\n// text.position.z = 0;\n// switch (entity.attachmentPoint) {\n// case 1:\n// // Top Left\n// text.position.x = entity.position.x;\n// text.position.y = entity.position.y - entity.height;\n// break;\n// case 2:\n// // Top Center\n// text.position.x = entity.position.x - textWidth / 2;\n// text.position.y = entity.position.y - entity.height;\n// break;\n// case 3:\n// // Top Right\n// text.position.x = entity.position.x - textWidth;\n// text.position.y = entity.position.y - entity.height;\n// break;\n\n// case 4:\n// // Middle Left\n// text.position.x = entity.position.x;\n// text.position.y = entity.position.y - entity.height / 2;\n// break;\n// case 5:\n// // Middle Center\n// text.position.x = entity.position.x - textWidth / 2;\n// text.position.y = entity.position.y - entity.height / 2;\n// break;\n// case 6:\n// // Middle Right\n// text.position.x = entity.position.x - textWidth;\n// text.position.y = entity.position.y - entity.height / 2;\n// break;\n\n// case 7:\n// // Bottom Left\n// text.position.x = entity.position.x;\n// text.position.y = entity.position.y;\n// break;\n// case 8:\n// // Bottom Center\n// text.position.x = entity.position.x - textWidth / 2;\n// text.position.y = entity.position.y;\n// break;\n// case 9:\n// // Bottom Right\n// text.position.x = entity.position.x - textWidth;\n// text.position.y = entity.position.y;\n// break;\n\n// default:\n// return undefined;\n// }\n\n// return text;\n// }\n\nfunction drawSpline(entity: any, path: any): paper.PathItem {\n let curve;\n // const points = entity.controlPoints.map(function(vec) {\n // return new paper.Point(vec.x, vec.y);\n // });\n throw new Error(\"Spline entity is not supported !\");\n // let color = \"black\";\n // var interpolatedPoints = [];\n // if (entity.degreeOfSplineCurve === 2 || entity.degreeOfSplineCurve === 3) {\n // for (var i = 0; i + 2 < points.length; i = i + 2) {\n // if (entity.degreeOfSplineCurve === 2) {\n // curve = new THREE.QuadraticBezierCurve(points[i], points[i + 1], points[i + 2]);\n // } else {\n // curve = new THREE.QuadraticBezierCurve3(points[i], points[i + 1], points[i + 2]);\n // }\n // interpolatedPoints.push.apply(interpolatedPoints, curve.getPoints(50));\n // }\n // } else {\n // curve = new THREE.SplineCurve(points);\n // interpolatedPoints = curve.getPoints(400);\n // }\n\n // var geometry = new THREE.BufferGeometry().setFromPoints(interpolatedPoints);\n // var material = new THREE.LineBasicMaterial({ linewidth: 1, color: color });\n // var splineObject = new THREE.Line(geometry, material);\n\n // return splineObject;\n}\n\nfunction drawCircle(entity: any) {\n const center = new paper.Point(entity.center.x * 1000, entity.center.y * 1000);\n const circle = new paper.Path.Circle(center, entity.radius * 1000);\n return circle;\n}\n\n/**\n * Generates the paper.js equivalent of the LINE, POLYLINE, LWPOLYLINE DXF object\n * @param entity DXF Data\n */\nfunction drawLine(entity: any) {\n // Create a path\n const basepath = new paper.Path();\n \n let bulge, bugleGeometry;\n let startPoint, endPoint;\n\n // // create geometry\n for (let i = 0; i < entity.vertices.length; i++) {\n // console.log(\"Point:\", i , entity.vertices[i]);\n if (entity.vertices[i].bulge) {\n console.log(\"Drawing arc segment to incorporate bulge values\");\n // TODO: Figure out what to do with the bugle value\n bulge = entity.vertices[i].bulge;\n startPoint = entity.vertices[i];\n if (i < entity.vertices.length - 1) {\n endPoint = entity.vertices[i + 1];\n } else {\n console.log(\"LAst vertex\");\n endPoint = entity.vertices[0];\n }\n // endPoint = (i + 1 < entity.vertices.length) ? entity.vertices[i + 1] :entity.vertices[0];\n console.log(\"Start Point:\", startPoint);\n console.log(\"End Point:\", endPoint);\n const throughpoint = calculateBulgeThroughPoint(startPoint, endPoint, bulge);\n\n console.log(\"Throughpoint:\", throughpoint);\n\n basepath.add(new paper.Point(startPoint.x * 1000, startPoint.y * 1000));\n // basepath.add(new paper.Point(endPoint.x, endPoint.y));\n basepath.arcTo(throughpoint, new paper.Point(endPoint.x * 1000, endPoint.y * 1000));\n i++;\n } else {\n // let vertex = entity.vertices[i];\n // let nextvertex = entity.vertices[(i + 1 < entity.vertices.length) ? i + 1 : 0];\n // let point = new paper.Point(vertex.x * 1000, vertex.y * 1000); //Need to convert everything to microns\n // let nextpoint = new paper.Point(nextvertex.x * 1000, nextvertex.y * 1000);\n // // console.log(\"Vertex:\", point, nextpoint);\n // let line = new paper.Path.Line(point, nextpoint);\n // path.addChild(line);\n\n const dxfvertex = entity.vertices[i];\n basepath.add(new paper.Point(dxfvertex.x * 1000, dxfvertex.y * 1000));\n }\n }\n\n let modpath = basepath as any;\n modpath.origin = \"LINE\";\n\n return modpath as paper.PathItem;\n}\n\n/**\n * Generates the paper.js equivalent of the ARC DXF object\n * @param entity DXF Data\n */\nfunction drawArc(entity: any) {\n /*\n Ok so for this to work in paperjs, we need to have 3 variables\n 1. Start\n 2. Through\n 3. End\n\n DXF gives :\n 1. startAngle\n 2. endAngle\n 3. center\n 4. radius\n\n To translate we start with the center point, then calculate points at start angle and end angle\n\n center-> @------r------* <- startAngle\n \\\n \\\n r\n \\\n \\\n * <- endAngle\n\n */\n\n const center = new paper.Point(entity.center.x * 1000, entity.center.y * 1000);\n const radius = entity.radius * 1000;\n const startAngle = entity.startAngle;\n const endAngle = entity.endAngle; //* 180/Math.PI;\n const midAngle = (startAngle + endAngle) / 2;\n\n const startpoint = new paper.Point(center.x + radius * Math.cos(startAngle), center.y + radius * Math.sin(startAngle));\n\n const midpoint = new paper.Point(center.x + radius * Math.cos(midAngle), center.y + radius * Math.sin(midAngle));\n\n const endpoint = new paper.Point(center.x + radius * Math.cos(endAngle), center.y + radius * Math.sin(endAngle));\n\n const arc = new paper.Path.Arc(startpoint, midpoint, endpoint);\n\n // arc.origin = \"ARC\";\n let modpath = arc as any;\n modpath.origin = \"ARC\";\n\n return modpath as paper.PathItem;\n}\n\n// function drawSolid(entity, data) {\n// var material,\n// mesh,\n// verts,\n// geometry = new THREE.Geometry();\n\n// verts = geometry.vertices;\n// verts.push(new THREE.Vector3(entity.points[0].x, entity.points[0].y, entity.points[0].z));\n// verts.push(new THREE.Vector3(entity.points[1].x, entity.points[1].y, entity.points[1].z));\n// verts.push(new THREE.Vector3(entity.points[2].x, entity.points[2].y, entity.points[2].z));\n// verts.push(new THREE.Vector3(entity.points[3].x, entity.points[3].y, entity.points[3].z));\n\n// // Calculate which direction the points are facing (clockwise or counter-clockwise)\n// var vector1 = new THREE.Vector3();\n// var vector2 = new THREE.Vector3();\n// vector1.subVectors(verts[1], verts[0]);\n// vector2.subVectors(verts[2], verts[0]);\n// vector1.cross(vector2);\n\n// // If z < 0 then we must draw these in reverse order\n// if (vector1.z < 0) {\n// geometry.faces.push(new THREE.Face3(2, 1, 0));\n// geometry.faces.push(new THREE.Face3(2, 3, 1));\n// } else {\n// geometry.faces.push(new THREE.Face3(0, 1, 2));\n// geometry.faces.push(new THREE.Face3(1, 3, 2));\n// }\n\n// material = new THREE.MeshBasicMaterial({ color: getColor(entity, data) });\n\n// return new THREE.Mesh(geometry, material);\n// }\n\n// function drawText(entity, data) {\n// var geometry, material, text;\n\n// if (!font)\n// return console.warn(\n// \"Text is not supported without a Three.js font loaded with THREE.FontLoader! Load a font of your choice and pass this into the constructor. See the sample for this repository or Three.js examples at http://threejs.org/examples/?q=text#webgl_geometry_text for more details.\"\n// );\n\n// geometry = new THREE.TextGeometry(entity.text, {\n// font: font,\n// height: 0,\n// size: entity.textHeight || 12\n// });\n\n// material = new THREE.MeshBasicMaterial({ color: getColor(entity, data) });\n\n// text = new THREE.Mesh(geometry, material);\n// text.position.x = entity.startPoint.x;\n// text.position.y = entity.startPoint.y;\n// text.position.z = entity.startPoint.z;\n\n// return text;\n// }\n\n// function drawPoint(entity, data) {\n// var geometry, material, point;\n\n// geometry = new THREE.Geometry();\n\n// geometry.vertices.push(new THREE.Vector3(entity.position.x, entity.position.y, entity.position.z));\n\n// // TODO: could be more efficient. PointCloud per layer?\n\n// var numPoints = 1;\n\n// var color = getColor(entity, data);\n// var colors = new Float32Array(numPoints * 3);\n// colors[0] = color.r;\n// colors[1] = color.g;\n// colors[2] = color.b;\n\n// geometry.colors = colors;\n// geometry.computeBoundingBox();\n\n// material = new THREE.PointsMaterial({\n// size: 0.05,\n// vertexColors: THREE.VertexColors\n// });\n// point = new THREE.Points(geometry, material);\n// scene.add(point);\n// }\n","// import Feature from \"../core/feature\";\nimport * as paper from \"paper\";\nimport Layer from \"../core/layer\";\nimport { LogicalLayerType } from \"@/app/core/init\";\nimport RenderLayer from \"./renderLayer\";\n\n// Colors taken from: http://www.google.ch/design/spec/style/color.html\nexport const RED_500 = \"#F44336\";\nexport const INDIGO_500 = \"#3F51B5\";\nexport const GREEN_500 = \"#4CAF50\";\nexport const GREEN_100 = \"#C8E6C9\";\nexport const GREEN_A200 = \"#69F0AE\";\nexport const DEEP_PURPLE_500 = \"#673AB7\";\nexport const PURPLE_200 = \"#E1BEE7\";\nexport const PURPLE_100 = \"#E1BEE7\";\nexport const TEAL_100 = \"#B2DFDB\";\nexport const BLUE_50 = \"#e3f2fd\";\nexport const BLUE_100 = \"#BBDEFB\";\nexport const BLUE_200 = \"#90CAF9\";\nexport const BLUE_300 = \"#64B5F6\";\nexport const BLUE_500 = \"#2196F3\";\nexport const GREY_200 = \"#EEEEEE\";\nexport const GREY_300 = \"#E0E0E0\";\nexport const GREY_400 = \"#BDBDBD\";\nexport const LIGHT_GREEN_100 = \"#DCEDC8\";\nexport const GREY_700 = \"#616161\";\nexport const GREY_500 = \"#9E9E9E\";\nexport const AMBER_50 = \"#FFF8E1\";\nexport const PINK_500 = \"#E91E63\";\nexport const PINK_300 = \"#F06292\";\nexport const BLACK = \"#000000\";\nexport const WHITE = \"#FFFFFF\";\n\nexport const defaultColorKeys = [\"50\", \"100\", \"200\", \"300\", \"400\", \"500\", \"600\", \"700\", \"800\", \"900\"];\nexport const darkColorKeys = [\"300\", \"400\", \"500\", \"600\", \"700\", \"800\", \"900\"];\n\nconst indigo = {\n 900: \"#\" + \"1A237E\",\n 800: \"#\" + \"283593\",\n 700: \"#\" + \"303F9F\",\n 600: \"#\" + \"3949AB\",\n 500: \"#\" + \"3F51B5\",\n 400: \"#\" + \"5C6BC0\",\n 300: \"#\" + \"7986CB\",\n 200: \"#\" + \"9FA8DA\",\n 100: \"#\" + \"C5CAE9\",\n 50: \"#\" + \"E8EAF6\",\n A100: \"#\" + \"8C9EFF\",\n A200: \"#\" + \"536DFE\",\n A400: \"#\" + \"3D5AFE\",\n A700: \"#\" + \"304FFE\"\n};\n\nconst red = {\n 900: \"#\" + \"B71C1C\",\n 800: \"#\" + \"C62828\",\n 700: \"#\" + \"D32F2F\",\n 600: \"#\" + \"E53935\",\n 500: \"#\" + \"F44336\",\n 400: \"#\" + \"EF5350\",\n 300: \"#\" + \"E57373\",\n 200: \"#\" + \"EF9A9A\",\n 100: \"#\" + \"FFCDD2\",\n 50: \"#\" + \"FFEBEE\",\n A100: \"#\" + \"FF8A80\",\n A200: \"#\" + \"FF5252\",\n A400: \"#\" + \"FF1744\",\n A700: \"#\" + \"D50000\"\n};\n\nconst blue = {\n 900: \"#\" + \"1A237E\",\n 800: \"#\" + \"283593\",\n 700: \"#\" + \"303F9F\",\n 600: \"#\" + \"3949AB\",\n 500: \"#\" + \"3F51B5\",\n 400: \"#\" + \"5C6BC0\",\n 300: \"#\" + \"7986CB\",\n 200: \"#\" + \"9FA8DA\",\n 100: \"#\" + \"C5CAE9\",\n 50: \"#\" + \"E8EAF6\",\n A100: \"#\" + \"8C9EFF\",\n A200: \"#\" + \"536DFE\",\n A400: \"#\" + \"3D5AFE\",\n A700: \"#\" + \"304FFE\"\n};\n\nconst green = {\n 900: \"#\" + \"006200\",\n 800: \"#\" + \"007600\",\n 700: \"#\" + \"008900\",\n 600: \"#\" + \"009d00\",\n 500: \"#\" + \"00b100\",\n 400: \"#\" + \"00d800\",\n 300: \"#\" + \"00ff00\",\n 200: \"#\" + \"3bff3b\",\n 100: \"#\" + \"62ff62\",\n 50: \"#\" + \"b1ffb1\",\n A100: \"#\" + \"ebffeb\",\n A200: \"#\" + \"9dff9d\",\n A400: \"#\" + \"14ff14\",\n A700: \"#\" + \"00b100\"\n};\n\nconst layerColors = {\n indigo: indigo,\n red: red,\n blue: blue,\n green: green\n};\n/**\n * Converts from decimal to index\n * @param {number} decimal\n * @param {number} indices\n * @returns {number}\n */\nconst decimalToIndex = function(decimal: number, indices: number) {\n return Math.round((indices - 1) * decimal);\n};\n/**\n * Converts the decimal to the corresponding layer color\n * @param {number} decimal\n * @param {Object} layerColors\n * @param {Array} orderedKeys\n */\nexport function decimalToLayerColor(decimal: number, layerColors: { [k: string]: string }, orderedKeys: string[]): string {\n const index = decimalToIndex(decimal, orderedKeys.length);\n const key = orderedKeys[index];\n return layerColors[\"700\"];\n}\n/**\n * Renders all the colors\n * @param {Layer} layer\n * @param {Array} orderedKeys\n */\nexport function renderAllColors(layer: { [k: string]: string }, orderedKeys: string[]): void {\n for (let i = 0; i < orderedKeys.length; i++) {\n new paper.Path.Circle({\n position: new paper.Point(0 + i * 1000, 0),\n fillColor: layer[orderedKeys[i]],\n radius: 500\n });\n }\n\n for (let i = 0; i < orderedKeys.length; i++) {\n const color = decimalToLayerColor(i / orderedKeys.length, layer, orderedKeys);\n new paper.Path.Circle({\n position: new paper.Point(0 + i * 1000, 2000),\n fillColor: layer[orderedKeys[i]],\n radius: 500\n });\n }\n}\n/**\n * Gets the color corresponding to the layer.\n * @param {Layer} layerType\n */\nexport function getLayerColors(layerType: LogicalLayerType) {\n if (!layerType) {\n throw new Error(\"Undefined color\");\n }\n\n if (layerType == LogicalLayerType.FLOW) {\n return layerColors.indigo;\n } else if (layerType == LogicalLayerType.CONTROL) {\n return layerColors.red;\n } else if (layerType == LogicalLayerType.INTEGRATION) {\n return layerColors.green;\n } else {\n throw new Error(\"Undefined LogicalLayerType\");\n }\n}\n/**\n * Gets the default color for the layer\n * @param {Layer} layer\n */\nexport function getDefaultLayerColor(layer: Layer) {\n if (layer === undefined) {\n throw new Error(\"Undefined layer object passed\");\n } \n return getLayerColors(layer.type)[\"500\"];\n}\n\n// TODO: We need to fix how this works and remove the circular dependency form this chain\nexport function getDefaultFeatureColor(typeString: string, layer: RenderLayer) {\n if (layer) {\n // let height = Feature.getDefaultsForType(typeString, setString)[\"height\"];\n let decimal = 500; // layer.estimateLayerHeight();\n // if (!(layer as any).flip) decimal = 1 - decimal;\n const colors = getLayerColors(layer.type);\n return decimalToLayerColor(decimal, colors, darkColorKeys);\n } else {\n return decimalToLayerColor(0, layerColors.indigo, darkColorKeys);\n }\n}\n","import uuid from \"node-uuid\";\nimport RenderLayer from \"../view/renderLayer\";\nimport ViewManager from \"../view/viewManager\";\nimport AdaptiveGrid from \"../view/grid/adaptiveGrid\";\nimport Device from \"./device\";\nimport Layer from \"./layer\";\n\nclass Registry {\n /*\n Place where we store the data necessary for the text label\n TODO: Change this from this awful hacky implementation\n */\n constructor() {\n // registerSets({ Basic: Basic });\n }\n\n //TODO: Convert this into multiple text layers for use with multiple layers\n id_counter = 0;\n threeRenderer = null;\n\n public currentDevice: Device | null = null;\n canvasManager = null;\n currentTextLayer: Layer | null = null;\n currentGrid: AdaptiveGrid | null = null;\n view = null;\n viewManager: ViewManager | null = null;\n}\n\nconst instance = new Registry();\n\nexport default instance;\n","import * as THREE from \"three\";\nimport paper from \"paper\";\n\nimport edgeFeature from \"@/app/core/edgeFeature\";\n\nexport function renderFeatureObjects(feature: any) {\n throw new Error(\"Implement the renderer\");\n\n // console.log(\"rendering the features dxf objects\");\n // for (const i in feature.getDXFObjects()) {\n // const dxfobject = feature.getDXFObjects()[i];\n // }\n // return undefined;\n}\n\n/**\n * Returns a PaperJS outline rendering of the given\n * DXF objects contained in the feature.\n * @param feature\n */\nexport function renderEdgeFeature(feature: edgeFeature) {\n const path = new paper.CompoundPath(\"\");\n\n // console.log('rendering the outline dxf objects....', feature.getDXFObjects());\n for (const i in feature.getDXFObjects()) {\n const dxfobject = feature.getDXFObjects()[i];\n // Figure out what entity this is and then based on that do the drawing\n let mesh;\n if (dxfobject.getType() === \"ARC\") {\n drawArc(dxfobject.getData(), path);\n } else if (dxfobject.getType() === \"LWPOLYLINE\" || dxfobject.getType() === \"LINE\" || dxfobject.getType() === \"POLYLINE\") {\n drawLine(dxfobject.getData(), path);\n } else if (dxfobject.getType() === \"SPLINE\") {\n drawSpline(dxfobject.getData(), path);\n } else if (dxfobject.getType() === \"ELLIPSE\") {\n drawEllipse(dxfobject.getData(), path);\n } else if (dxfobject.getType() === \"CIRCLE\") {\n drawCircle(dxfobject.getData(), path);\n } else {\n console.error(\"Unsupported DXF Entity Type for Outline Generation : \" + dxfobject.getType());\n }\n }\n // Set the visual properties for the path\n path.strokeColor = new paper.Color(\"#ff7606\");\n path.strokeWidth = 200;\n // Since this is an outline we need to do the required transformations to it\n path.scale(1, -1); // The coordinate system is all different for DXF\n // console.log(path.bounds.topLeft);\n const topleft = path.bounds.topLeft;\n path.translate(new paper.Point(-topleft.x, -topleft.y));\n\n // Add the feature id to the rendered object or else the whole things breaks down\n // TODO: Streamline the feature ID insertion for each rendered object business\n \n // eslint-disable-next-line\n let modpath = path as any;\n modpath.featureID = feature.ID;\n return modpath as paper.CompoundPath;\n}\n\n\n/**\n * Generates the paper.js equivalent of the ELLIPSE DXF object\n * @param entity DXF Data\n * @param path Compound Path onto which the drawing will be inserted into\n */\nfunction drawEllipse(entity: { center: { x: number; y: number; }; axisRatio: any; majorAxisEndPoint: { x: number; y: number; }; }, path: paper.CompoundPath) {\n /*\n https://www.autodesk.com/techpubs/autocad/acad2000/dxf/ellipse_dxf_06.htm\n */\n // console.log(\"DXF Data\", entity);\n\n const center = new paper.Point(entity.center.x * 1000, entity.center.y * 1000);\n const axisratio = entity.axisRatio;\n const majoraxislength = Math.sqrt(Math.pow(entity.majorAxisEndPoint.x * 1000, 2) + Math.pow(entity.majorAxisEndPoint.y * 1000, 2));\n const minoraxislength = majoraxislength * axisratio;\n let rotation = (Math.atan(entity.majorAxisEndPoint.y / entity.majorAxisEndPoint.x) * 180) / Math.PI;\n // console.log(\"Rotation:\", rotation);\n if (Number.isNaN(rotation)) {\n rotation = 0;\n }\n // console.log(\"Rotation:\", rotation);\n // console.log(\"lengths:\", majoraxislength, minoraxislength);\n const ellipse = new paper.Path.Ellipse({\n center: [center.x, center.y],\n radius: [majoraxislength, minoraxislength]\n });\n\n ellipse.rotate(rotation, center);\n path.addChild(ellipse);\n}\n\nfunction drawMtext(entity: any, data: any) {\n throw new Error(\"Not Implemented\");\n // const color = getColor(entity, data);\n\n // const geometry = new THREE.TextGeometry(entity.text, {\n // font: font,\n // size: entity.height * (4 / 5),\n // height: 1\n // });\n // const material = new THREE.MeshBasicMaterial({ color: color });\n // const text = new THREE.Mesh(geometry, material);\n\n // // Measure what we rendered.\n // const measure = new THREE.Box3();\n // measure.setFromObject(text);\n\n // const textWidth = measure.max.x - measure.min.x;\n\n // // If the text ends up being wider than the box, it's supposed\n // // to be multiline. Doing that in threeJS is overkill.\n // if (textWidth > entity.width) {\n // console.log(\"Can't render this multipline MTEXT entity, sorry.\", entity);\n // return undefined;\n // }\n\n // text.position.z = 0;\n // switch (entity.attachmentPoint) {\n // case 1:\n // // Top Left\n // text.position.x = entity.position.x;\n // text.position.y = entity.position.y - entity.height;\n // break;\n // case 2:\n // // Top Center\n // text.position.x = entity.position.x - textWidth / 2;\n // text.position.y = entity.position.y - entity.height;\n // break;\n // case 3:\n // // Top Right\n // text.position.x = entity.position.x - textWidth;\n // text.position.y = entity.position.y - entity.height;\n // break;\n\n // case 4:\n // // Middle Left\n // text.position.x = entity.position.x;\n // text.position.y = entity.position.y - entity.height / 2;\n // break;\n // case 5:\n // // Middle Center\n // text.position.x = entity.position.x - textWidth / 2;\n // text.position.y = entity.position.y - entity.height / 2;\n // break;\n // case 6:\n // // Middle Right\n // text.position.x = entity.position.x - textWidth;\n // text.position.y = entity.position.y - entity.height / 2;\n // break;\n\n // case 7:\n // // Bottom Left\n // text.position.x = entity.position.x;\n // text.position.y = entity.position.y;\n // break;\n // case 8:\n // // Bottom Center\n // text.position.x = entity.position.x - textWidth / 2;\n // text.position.y = entity.position.y;\n // break;\n // case 9:\n // // Bottom Right\n // text.position.x = entity.position.x - textWidth;\n // text.position.y = entity.position.y;\n // break;\n\n // default:\n // return undefined;\n // }\n\n // return text;\n}\n\nfunction drawSpline(entity: any, path: paper.CompoundPath) {\n throw new Error(\"Not Implemented\");\n // const points = entity.controlPoints.map(function(vec) {\n // return new paper.Point(vec.x, vec.y);\n // });\n // let curve;\n // let interpolatedPoints = [];\n // if (entity.degreeOfSplineCurve === 2 || entity.degreeOfSplineCurve === 3) {\n // for (let i = 0; i + 2 < points.length; i = i + 2) {\n // if (entity.degreeOfSplineCurve === 2) {\n // curve = new THREE.QuadraticBezierCurve(points[i], points[i + 1], points[i + 2]);\n // } else {\n // curve = new THREE.QuadraticBezierCurve3(points[i], points[i + 1], points[i + 2]);\n // }\n // interpolatedPoints.push.apply(interpolatedPoints, curve.getPoints(50));\n // }\n // } else {\n // curve = new THREE.SplineCurve(points);\n // interpolatedPoints = curve.getPoints(400);\n // }\n\n // const geometry = new THREE.BufferGeometry().setFromPoints(interpolatedPoints);\n // const material = new THREE.LineBasicMaterial({ linewidth: 1, color: color });\n // const splineObject = new THREE.Line(geometry, material);\n\n // return splineObject;\n}\n\nfunction drawCircle(entity: { center: { x: number; y: number; }; radius: number; }, path: paper.CompoundPath) {\n const center = new paper.Point(entity.center.x * 1000, entity.center.y * 1000);\n const circle = new paper.Path.Circle(center, entity.radius * 1000);\n path.addChild(circle);\n}\n\n/**\n * Generates the paper.js equivalent of the LINE, POLYLINE, LWPOLYLINE DXF object\n * @param entity DXF Data\n * @param path Compound Path onto which the drawing will be inserted into\n */\nfunction drawLine(entity: { vertices: string | any[]; }, path: paper.CompoundPath) {\n let bulge, bugleGeometry;\n let startPoint, endPoint;\n\n // // create geometry\n for (let i = 0; i < entity.vertices.length; i++) {\n if (entity.vertices[i].bulge) {\n // TODO: Figure out what to do with the bugle value\n bulge = entity.vertices[i].bulge;\n startPoint = entity.vertices[i];\n endPoint = i + 1 < entity.vertices.length ? entity.vertices[i + 1] : entity.vertices[0];\n console.log(\"Start Point:\", startPoint);\n console.log(\"End Point:\", endPoint);\n } else {\n const vertex = entity.vertices[i];\n const nextvertex = entity.vertices[i + 1 < entity.vertices.length ? i + 1 : 0];\n const point = new paper.Point(vertex.x * 1000, vertex.y * 1000); // Need to convert everything to microns\n const nextpoint = new paper.Point(nextvertex.x * 1000, nextvertex.y * 1000);\n // console.log(\"Vertex:\", point, nextpoint);\n const line = new paper.Path.Line(point, nextpoint);\n path.addChild(line);\n }\n }\n}\n\n/**\n * Generates the paper.js equivalent of the ARC DXF object\n * @param entity DXF Data\n * @param path Compound Path onto which the drawing will be inserted into\n */\nfunction drawArc(entity: { center: { x: number; y: number; }; radius: number; startAngle: any; endAngle: any; }, path: paper.CompoundPath) {\n /*\n Ok so for this to work in paperjs, we need to have 3 variables\n 1. Start\n 2. Through\n 3. End\n\n DXF gives :\n 1. startAngle\n 2. endAngle\n 3. center\n 4. radius\n\n To translate we start with the center point, then calculate points at start angle and end angle\n\n center-> @------r------* <- startAngle\n \\\n \\\n r\n \\\n \\\n * <- endAngle\n\n */\n\n const center = new paper.Point(entity.center.x * 1000, entity.center.y * 1000);\n const radius = entity.radius * 1000;\n const startAngle = entity.startAngle;\n const endAngle = entity.endAngle; //* 180/Math.PI;\n const midAngle = (startAngle + endAngle) / 2;\n\n const startpoint = new paper.Point(center.x + radius * Math.cos(startAngle), center.y + radius * Math.sin(startAngle));\n\n // var starcenter = new paper.Point(startpoint);\n // var points = 5;\n // var radius1 = 250;\n // var radius2 = 400;\n // var star = new paper.Path.Star(starcenter, points, radius1, radius2);\n //\n // path.addChild(star);\n\n const midpoint = new paper.Point(center.x + radius * Math.cos(midAngle), center.y + radius * Math.sin(midAngle));\n\n // starcenter = new paper.Point(midpoint);\n // points = 10;\n // star = new paper.Path.Star(starcenter, points, radius1, radius2);\n //\n // path.addChild(star);\n\n const endpoint = new paper.Point(center.x + radius * Math.cos(endAngle), center.y + radius * Math.sin(endAngle));\n\n // starcenter = new paper.Point(endpoint);\n // points = 20;\n // star = new paper.Path.Star(starcenter, points, radius1, radius2);\n //\n // path.addChild(star);\n\n const arc = new paper.Path.Arc(startpoint, midpoint, endpoint);\n\n path.addChild(arc);\n}\n\nfunction drawSolid(entity: any, data: any) {\n throw new Error(\"Not Implemented\");\n // let material;\n // let mesh;\n // let verts;\n // const geometry = new THREE.Geometry();\n\n // verts = geometry.vertices;\n // verts.push(new THREE.Vector3(entity.points[0].x, entity.points[0].y, entity.points[0].z));\n // verts.push(new THREE.Vector3(entity.points[1].x, entity.points[1].y, entity.points[1].z));\n // verts.push(new THREE.Vector3(entity.points[2].x, entity.points[2].y, entity.points[2].z));\n // verts.push(new THREE.Vector3(entity.points[3].x, entity.points[3].y, entity.points[3].z));\n\n // // Calculate which direction the points are facing (clockwise or counter-clockwise)\n // const vector1 = new THREE.Vector3();\n // const vector2 = new THREE.Vector3();\n // vector1.subVectors(verts[1], verts[0]);\n // vector2.subVectors(verts[2], verts[0]);\n // vector1.cross(vector2);\n\n // // If z < 0 then we must draw these in reverse order\n // if (vector1.z < 0) {\n // geometry.faces.push(new THREE.Face3(2, 1, 0));\n // geometry.faces.push(new THREE.Face3(2, 3, 1));\n // } else {\n // geometry.faces.push(new THREE.Face3(0, 1, 2));\n // geometry.faces.push(new THREE.Face3(1, 3, 2));\n // }\n\n // material = new THREE.MeshBasicMaterial({ color: getColor(entity, data) });\n\n // return new THREE.Mesh(geometry, material);\n}\n\nfunction drawText(entity: any, data: any) {\n throw new Error(\"Not implemented yet\");\n // let geometry, material, text;\n\n // if (!font) {\n // return console.warn(\n // \"Text is not supported without a Three.js font loaded with THREE.FontLoader! Load a font of your choice and pass this into the constructor. See the sample for this repository or Three.js examples at http://threejs.org/examples/?q=text#webgl_geometry_text for more details.\"\n // );\n // }\n\n // geometry = new THREE.TextGeometry(entity.text, {\n // font: font,\n // height: 0,\n // size: entity.textHeight || 12\n // });\n\n // material = new THREE.MeshBasicMaterial({ color: getColor(entity, data) });\n\n // text = new THREE.Mesh(geometry, material);\n // text.position.x = entity.startPoint.x;\n // text.position.y = entity.startPoint.y;\n // text.position.z = entity.startPoint.z;\n\n // return text;\n}\n\n// function drawPoint(entity, data) {\n// let geometry, material, point;\n\n// geometry = new THREE.Geometry();\n\n// geometry.vertices.push(new THREE.Vector3(entity.position.x, entity.position.y, entity.position.z));\n\n// // TODO: could be more efficient. PointCloud per layer?\n\n// const numPoints = 1;\n\n// const color = getColor(entity, data);\n// const colors = new Float32Array(numPoints * 3);\n// colors[0] = color.r;\n// colors[1] = color.g;\n// colors[2] = color.b;\n\n// geometry.colors = colors;\n// geometry.computeBoundingBox();\n\n// material = new THREE.PointsMaterial({\n// size: 0.05,\n// vertexColors: THREE.VertexColors\n// });\n// point = new THREE.Points(geometry, material);\n// scene.add(point);\n// }\n","import * as DXFSolidObjectRenderer2D from \"./dxfSolidObjectRenderer2D\";\nimport * as Colors from \"../colors\";\nimport Registry from \"../../core/registry\";\nimport { renderEdgeFeature } from \"./dxfObjectRenderer2D\";\nimport paper from \"paper\";\nimport { ComponentAPI } from \"@/componentAPI\";\nimport {Point, ToolPaperObject} from \"@/app/core/init\";\nimport Feature from \"@/app/core/feature\";\n\nconst getLayerColor = function(feature: Feature) {\n const height = feature.getValue(\"height\");\n const layerHeight = 1; // feature.layer.estimateLayerHeight();\n let decimal = height / layerHeight;\n if (decimal > 1) decimal = 1;\n // if (!feature.layer.flip) decimal = 1 - decimal;\n console.log(\"feature Object:\", feature);\n console.log(\"feature layer:\", feature.layer);\n console.log(\"feature layer type:\", feature.layer!.type);\n // Throw error if the layer in the feature is null\n if (!feature.layer) {\n throw new Error(\"Feature layer is null\");\n }\n const targetColorSet = Colors.getLayerColors(feature.layer.type);\n return Colors.decimalToLayerColor(decimal, targetColorSet, Colors.darkColorKeys);\n};\n\nconst getBaseColor = function(feature: Feature): string {\n let decimal = 0;\n // if (!feature.layer.flip) decimal = 1 - decimal;\n // throw error if the layer in the feature is null\n if (!feature.layer) {\n throw new Error(\"Feature layer is null\");\n }\n const targetColorSet = Colors.getLayerColors(feature.layer.type);\n return Colors.decimalToLayerColor(decimal, targetColorSet, Colors.darkColorKeys);\n};\n\nexport function getDefaultValueForType(typeString: string, key: string) {\n return ComponentAPI.getDefaultsForType(typeString)[key];\n}\n\nexport function renderTarget(typeString:string, position: Point, customParameters:any = null) {\n if (Registry.viewManager?.currentLayer === null || Registry.viewManager?.currentLayer === undefined) {\n console.error(\"No current layer\");\n throw new Error(\"No current layer\");\n }\n const rendererinfo = ComponentAPI.getRendererInfo(typeString);\n const renderer = rendererinfo.object;\n const params = renderer.targetParams;\n const primParams: {[key: string]: any} = {};\n if (customParameters !== null) {\n for (const item of customParameters) {\n primParams[item.name] = item.value;\n }\n } else {\n for (const key in params) {\n primParams[key] = getDefaultValueForType(typeString, params[key]);\n }\n }\n primParams[\"position\"] = position;\n primParams[\"color\"] = new paper.Color(Colors.getDefaultFeatureColor(typeString, Registry.viewManager?.currentLayer));\n const rendered = renderer.render2DTarget(null, primParams);\n return rendered;\n}\n\n/**\n * This function renders the text to target that trails the cursor\n * @param typeString\n * @param setString\n * @param position\n * @return {d}\n */\nexport function renderTextTarget(typeString: string, position: Point) {\n if (Registry.viewManager === null) {\n console.error(\"Registry.viewManager is null\");\n throw new Error(\"Registry.viewManager is null\");\n }\n const rendered = new paper.PointText(new paper.Point(position[0], position[1]));\n rendered.justification = \"center\";\n rendered.fillColor = new paper.Color(Colors.DEEP_PURPLE_500);\n rendered.content = Registry.viewManager.tools.InsertTextTool.text;\n rendered.fontSize = 10000;\n return rendered;\n}\n\nexport function renderEdge(feature:any) {\n // TODO: Just call the DXF renderer (outline) for this\n renderEdgeFeature(feature);\n}\n\nexport function renderText(feature:any) {\n // TODO - Figure out where to save the position of the feature\n const position = feature.getValue(\"position\");\n const rendered = new paper.PointText(new paper.Point(position[0], position[1]));\n rendered.justification = \"center\";\n if (feature.getParams().color != undefined) {\n let color = feature.getParams().color.value;\n if (color == \"white\" || color == \"White\" || color == \"WHITE\") {\n rendered.fillColor = new paper.Color(Colors.WHITE);\n } else if (color == \"black\" || color == \"Black\" || color == \"BLACK\") {\n rendered.fillColor = new paper.Color(Colors.BLACK);\n } else if (color == \"blue\" || color == \"Blue\" || color == \"BLUE\") {\n rendered.fillColor = new paper.Color(Colors.BLUE_500);\n } else if (color == \"red\" || color == \"Red\" || color == \"RED\") {\n rendered.fillColor = new paper.Color(Colors.RED_500);\n } else {\n throw new Error(\"Color choice \" + color + \" not enabled\");\n }\n } else {\n rendered.fillColor = new paper.Color(getLayerColor(feature));\n }\n /// rendered.content = feature.getText();\n rendered.content = feature.getValue(\"text\");\n rendered.fontSize = feature.getValue(\"fontSize\");\n let modrendered = rendered as any;\n modrendered[\"featureID\"] = feature.ID;\n return modrendered;\n}\n\n/**\n * Returns the paperjs drawing object of the passed feature\n * @param feature\n * @return {*}\n */\nexport function renderFeature(feature: Feature, key: string | null) {\n let rendered;\n let params;\n const type = feature.getType();\n let set = \"Basic\";\n if (ComponentAPI.isCustomType(type)) {\n set = \"Custom\";\n rendered = DXFSolidObjectRenderer2D.renderCustomComponentFeature(feature, getBaseColor(feature));\n let modrendered = rendered as any;\n modrendered[\"featureID\"] = feature.ID;\n return modrendered as ToolPaperObject;\n } else if (type === \"EDGE\") {\n return renderEdge(feature);\n } else if (type === \"Text\") {\n return renderText(feature);\n } else {\n const rendererinfo = ComponentAPI.getRendererInfo(type);\n const renderer = ComponentAPI.getRenderer(type);\n\n /*\n If the user does not specify the key, then extract it from the rendering info of the feature.\n I guess theoretically speaking, one needs to generate a set of invisible feature but for now we are just\n ignoring that.\n\n TODO - Clean up this mess of a system. Its not obvious about how once send this logic.\n */\n if (!key || key === null) {\n key = rendererinfo.key;\n }\n\n if (!renderer) {\n console.error(\"Could not find renderer method for feature:\", feature);\n } else {\n params = renderer.featureParams;\n }\n\n const primParams: {[key: string]: any} = {};\n for (const paramkey in params) {\n primParams[paramkey] = feature.getValue(params[paramkey]);\n }\n //primParams[\"position\"] = [0,0];\n //console.log(\"Data for rendering:\", primParams);\n //Set the position of the params to 0,0\n primParams.color = getLayerColor(feature);\n primParams.baseColor = getBaseColor(feature);\n rendered = renderer.render2D(primParams, key);\n // Rendered is going to be at 0,0 with whatever rotation\n // Now we can get draw offset by looking at the rendered topleft corner\n // move the feature to user pointed position\n // save the drawoffsets on the feature object \n // later on in the component, calculate position by subtracting draw offset\n // recalculate draw offset whenever parameter changed\n let modrendered = rendered as any;\n modrendered[\"featureID\"] = feature.ID;\n \n return modrendered as ToolPaperObject;\n }\n}\n","import Registry from \"@/app/core/registry\";\nimport { ComponentAPI } from \"@/componentAPI\";\n\nexport default class ComponentUtils {\n constructor() {}\n\n static getFeatureFromID(featureid: string) {\n return Registry.currentDevice!.getFeatureByID(featureid);\n }\n\n static getRenderedFeature(featureid: string) {\n return Registry.viewManager!.view.getRenderedFeature(featureid);\n }\n\n static generateDeviceName(type: string): string {\n return Registry.currentDevice!.generateNewName(type);\n }\n\n static getDeviceLayers() {\n return Registry.currentDevice!.layers;\n }\n\n static getDeviceLayerFromID(featureid: string) {\n return Registry.currentDevice!.getLayerFromFeatureID(featureid);\n }\n}\n","export default class MapUtils {\n static toMap(obj: { [key: string]: any }): Map {\n const map = new Map();\n for (const key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n map.set(key, obj[key]);\n }\n }\n return map;\n }\n}\n","import Params from \"./params\";\nimport CustomComponent from \"./customComponent\";\nimport ComponentPort from \"./componentPort\";\nimport * as FeatureRenderer2D from \"../view/render2D/featureRenderer2D\";\nimport Port from \"../library/port\";\nimport { ComponentPortInterchangeV1, ComponentInterchangeV1, Point } from \"./init\";\nimport ComponentUtils from \"../utils/componentUtils\";\nimport { ComponentAPI } from \"@/componentAPI\";\nimport MapUtils from \"../utils/mapUtils\";\n\n/**\n * This class contains the component abstraction used in the interchange format and the\n * high level device model of the microfluidic.\n */\nexport default class Component {\n protected _params: Params;\n protected _name: string;\n protected _id: string;\n protected _entity: string;\n protected _featureIDs: Array;\n protected _bounds: paper.Rectangle | null;\n protected _placed: boolean;\n protected _ports: Map;\n protected _componentPortTRenders: Map;\n protected _xspan: number;\n protected _yspan: number;\n\n protected _renderOffset: Point;\n /**\n * Default Constructor\n * @param {string} type\n * @param {Params} params\n * @param {String} name\n * @param {string} mint\n * @param {String} id\n */\n constructor(params: Params, name: string, mint: string, id: string = ComponentAPI.generateID()) {\n this._params = params;\n this._name = name;\n this._id = id;\n this._entity = mint;\n // This stores the features that are a part of the component\n this._featureIDs = [];\n // TODO: Need to figure out how to effectively search through these\n this._bounds = null;\n this._placed = false;\n this._ports = new Map();\n this._componentPortTRenders = new Map();\n\n // TODO - Figure out how to use this for generic components\n this._xspan = 0;\n this._yspan = 0;\n this._renderOffset = [0, 0];\n\n // Create and set the ports here itself\n\n const cleanparamdata = this._params.toMap();\n if ((mint !== \"\" && mint !== \"TEXT\") || mint === null) {\n const ports = ComponentAPI.getComponentPorts(cleanparamdata, mint);\n if (ports != undefined && ports.length >= 0 && ports !== null) {\n for (const port of ports) {\n this.setPort(port.label, port);\n }\n }\n } else {\n console.warn(\"Component mint is empty\");\n }\n }\n\n /**\n * Returns the mint type of the component\n *\n * @readonly\n * @type {string}\n * @memberof Component\n */\n get mint(): string {\n return this._entity;\n }\n\n /**\n * Returns the offset value of the component\n * @type {[number, number]}\n * @memberof Component\n */\n get offset(): [number, number] {\n return this._renderOffset;\n }\n\n /**\n * Gets the ports of the component\n * @returns {Map()} Returns ports of the component\n * @memberof Component\n */\n get ports(): Map {\n return this._ports;\n }\n\n /**\n * Sets the port of the component\n * @param {} value\n * @returns {void}\n * @memberof Component\n */\n set ports(value) {\n this._ports = value;\n }\n\n /**\n * Gets the place of the component\n * @returns {Boolean} Returns the place of the component\n * @memberof Component\n */\n get placed(): boolean {\n return this._placed;\n }\n\n /**\n * Sets the place\n * @param {Boolean} value\n * @returns {void}\n * @memberof Component\n */\n set placed(value: boolean) {\n this._placed = value;\n }\n\n /**\n * Returns an array of strings that are the feature ids of the component\n * @return {Array} Returns an array with the features\n * @memberof Component\n */\n get featureIDs(): Array {\n return this._featureIDs;\n }\n\n /**\n * Sets the bounds i.e. the x,y position and the width and length of the component\n * @param {Object} bounds PaperJS Rectangle object associated with a Path.bounds property\n * @memberof Component\n * @returns {void}\n */\n setBounds(bounds: paper.Rectangle): void {\n this._bounds = bounds;\n const topleftpt = bounds.topLeft;\n this._params.updateParameter(\"position\", [topleftpt.x, topleftpt.y]);\n this._params.updateParameter(\"xspan\", bounds.width);\n this._params.updateParameter(\"yspan\", bounds.height);\n }\n\n /**\n * Updates the parameters stored by the component\n * @param {String} key Key to identify the parameter\n * @param {} value New value to be assign in the feature\n * @memberof Component\n * @returns {void}\n */\n updateParameter(key: string, value: any): void {\n if (key == \"position\") console.error(\"Use updateComponentPosition instead of updateParameter when changing position\");\n this._params.updateParameter(key, value);\n for (const featureid of this._featureIDs) {\n\n // Get the feature id and modify it\n const feature = ComponentUtils.getFeatureFromID(featureid);\n feature.updateParameter(key, value);\n }\n\n // Update component position\n const featPos = ComponentUtils.getFeatureFromID(this._featureIDs[0]).getValue(\"position\");\n // Update position (top-left corner)\n this.setPosition();\n // Update offset\n this.setOffset();\n // Update the ComponentPorts\n this.updateComponentPorts();\n }\n\n /**\n * Generates the object that needs to be serialzed into JSON for interchange format V1\n * @returns {ComponentInterchangeV1} Object\n * @memberof Component\n */\n toInterchangeV1(): ComponentInterchangeV1 {\n const bounds = this.getBoundingRectangle();\n\n const portdata: Array = [];\n const map: Map = this.ports;\n if (map !== null) {\n for (const key of map.keys()) {\n let part: ComponentPort | undefined = map.get(key);\n if (part != undefined) {\n let p = part.toInterchangeV1();\n portdata.push(p);\n }\n }\n }\n\n const output: ComponentInterchangeV1 = {\n id: this._id,\n name: this._name,\n entity: this._entity,\n params: this._params.toJSON(),\n \"x-span\": this._xspan,\n \"y-span\": this._yspan,\n ports: portdata,\n layers: this.findLayerReferences()\n };\n\n return output;\n }\n\n private findLayerReferences(): Array {\n const layers = ComponentUtils.getDeviceLayers();\n const layerrefs = [];\n let layer;\n for (const layer of layers) {\n // Check if the component is in layer then put it there\n let feature;\n for (const key in layer.features) {\n feature = layer.features[key];\n if (feature.referenceID == this.id) {\n layerrefs.push(layer.id);\n }\n }\n }\n return layerrefs;\n }\n\n /**\n * Returns the ID of the component\n * @returns {string}\n * @memberof Component\n */\n get id() {\n return this._id;\n }\n\n /**\n * Allows the user to set the name of the component\n * @param {string} name\n * @returns {void}\n * @memberof Component\n *\n */\n set name(name: string) {\n this._name = name;\n }\n\n /**\n * Returns the name of the component\n * @returns {string}\n * @memberof Component\n */\n get name() {\n return this._name;\n }\n\n /**\n * Returns an Array of size two containing the X and Y coordinates\n * @return {Point}\n * @memberof Component\n */\n getPosition(): Point {\n return this._params.getValue(\"position\");\n }\n\n /**\n * Returns the value of the parameter stored against the following key in the component params\n * @param {string} key Key to access the value\n * @returns {*} Returns the value or an error\n * @memberof Component\n */\n getValue(key: string): any {\n try {\n return this._params.getValue(key);\n } catch (err) {\n throw new Error(\"Unable to get value for key: \" + key);\n }\n }\n\n /**\n * Adds a feature that is associated with the component\n * @param {String} featureID String id of the feature\n * @memberof Component\n * @returns {void}\n */\n addFeatureID(featureID: string): void {\n this._featureIDs.push(featureID);\n // Now update bounds\n // this.__updateBounds();\n }\n\n /**\n * This method updates the bounds of the component\n * @private\n * @memberof Component\n * @returns {void}\n */\n private updateBounds(): void {\n let bounds = null;\n let feature = null;\n let renderedfeature = null;\n for (const featureid of this._featureIDs) {\n // gets teh feature defined by the id\n feature = ComponentUtils.getFeatureFromID(featureid);\n renderedfeature = FeatureRenderer2D.renderFeature(feature, null);\n if (bounds === null) {\n bounds = renderedfeature.bounds;\n } else {\n bounds = bounds.unite(renderedfeature.bounds);\n }\n }\n this._bounds = bounds;\n }\n\n /**\n * Gets the params associated with the component\n * @return {Params} Returns the params associated with the component\n * @memberof Component\n */\n get params(): Params {\n return this._params;\n }\n\n /**\n * Returns a paper.Rectangle object that defines the bounds of the component\n * @return {Object}\n * @memberof Component\n */\n getBoundingRectangle(): paper.Rectangle {\n if (this._featureIDs.length == 0 || this._featureIDs === null || this._featureIDs == undefined) {\n console.error(\"No features associated with the component\");\n }\n let bounds = null;\n for (const featureid of this._featureIDs) {\n const render = ComponentUtils.getRenderedFeature(featureid);\n if (bounds && render) {\n bounds = bounds.unite(render.bounds);\n } else {\n bounds = render.bounds;\n }\n }\n if (bounds !== null) return bounds;\n else throw new Error(\"Component \" + this._name + \" \" + this._id + \" cannot have bounds of null\");\n }\n\n /**\n * Updates the coordinates of the component and all the connected features\n * based on the position from which the features are drawn\n * @param {Point} center\n * @memberof Component\n * @returns {void}\n */\n updateComponentPosition(center: Point): void {\n console.log(\"input position: \", center);\n // Update component\n this._params.updateParameter(\"position\", [center[0] + this._renderOffset[0], center[1] + this._renderOffset[1]]);\n // Update features\n for (const featureidtochange of this._featureIDs) {\n\n const feature = ComponentUtils.getFeatureFromID(featureidtochange);\n feature.updateParameter(\"position\", center);\n }\n // Update the ComponentPorts\n this.updateComponentPorts();\n }\n\n setInitialOffset(): void {\n const rect = this.getBoundingRectangle();\n this._renderOffset = [rect.x, rect.y];\n }\n\n setOffset():void {\n const rect = this.getBoundingRectangle();\n const featPos = ComponentUtils.getFeatureFromID(this._featureIDs[0]).getValue(\"position\");\n this._renderOffset = [rect.x - featPos[0], rect.y - featPos[1]];\n }\n\n setPosition():void {\n this._params.updateParameter(\"position\", this.getTopLeftPosition());\n }\n\n\n /**\n * Replicates the component at the given positions\n * @param {Number} xpos Integer location of X\n * @param {Number} ypos Integer location of Y\n * @param {string} name Name of the replicated component\n * @return {Component}\n * @memberof Component\n */\n replicate(xpos: number, ypos: number, name: string = ComponentUtils.generateDeviceName(this._entity)): Component {\n // TODO: Fix this ridiculous chain of converting params back and forth, there should be an easier way\n // Converting all the params into raw values\n // let paramvalues = {};\n // for(let key in this._params.parameters){\n // paramvalues[key] = this.getValue(key);\n // }\n\n const definition = ComponentAPI.getDefinitionForMINT(this._entity);\n if (definition === null) {\n throw new Error(\"Unable to find definition for component type: \" + this._entity);\n }\n // Clean Param Data\n const cleanparamdata = this._params.parameters;\n const unique_map = MapUtils.toMap(definition.unique);\n const heritable_map = MapUtils.toMap(definition.heritable);\n const replicaparams = new Params(cleanparamdata, unique_map, heritable_map);\n const ret = new Component(replicaparams, name, this._entity);\n console.log(\"Checking what the new component params are:\", ret._params);\n // Generate New features\n for (const featureid of this._featureIDs) {\n const feature = ComponentUtils.getFeatureFromID(featureid);\n const replica = feature.replicate(this.getPosition()[0], this.getPosition()[1]);\n replica.referenceID = ret.id;\n ret.featureIDs.push(replica.ID);\n\n // TODO: add new feature to the layer in which the current feature is in\n const currentlayer = ComponentUtils.getDeviceLayerFromID(featureid);\n currentlayer.addFeature(replica);\n }\n console.warn(\"TODO: Generate renders for the new Features for this new component\");\n ret.updateComponentPosition([xpos, ypos]);\n return ret;\n }\n\n /**\n * Returns the center position of the component as a 2D vector\n * @return {Array}\n * @memberof Component\n */\n getCenterPosition(): Point {\n const bounds = this.getBoundingRectangle();\n return [bounds.center.x, bounds.center.y];\n }\n\n /**\n * Returns the topleft position of the component as a 2D vector\n * @return {Array}\n * @memberof Component\n */\n getTopLeftPosition(): Point {\n const bounds = this.getBoundingRectangle();\n return [bounds.topLeft.x, bounds.topLeft.y];\n }\n\n /**\n * This method is used to import the component from Interchange V1 JSON\n * @param {} json\n * @returns {*}\n * @memberof component\n */\n static fromInterchangeV1(json: ComponentInterchangeV1): Component {\n // let set;\n // if (json.hasOwnProperty(\"set\")) set = json.set;\n // else set = \"Basic\";\n // //TODO: This will have to change soon when the thing is updated\n // throw new Error(\"Need to implement Interchange V1 Import for component object\");\n const iscustomcompnent = false;\n const name = json.name;\n const id = json.id;\n const entity = json.entity;\n\n // Idk whether this is correct\n // It was originially this._span = this.span which threw several errors so I patterned in off the above const var\n const xspan = json[\"x-span\"];\n const yspan = json[\"y-span\"];\n\n const params = json.params;\n\n // TODO - remove this dependency\n // iscustomcompnent = Registry.viewManager.customComponentManager.hasDefinition(entity);\n\n let definition;\n\n if (iscustomcompnent) {\n definition = CustomComponent.defaultParameterDefinitions();\n } else {\n definition = ComponentAPI.getDefinitionForMINT(entity);\n }\n\n if (definition === null) {\n throw Error(\"Could not find definition for type: \" + entity);\n }\n\n let type;\n let value;\n for (const key in json.params) {\n if (Object.prototype.hasOwnProperty.call(definition.heritable, key)) {\n type = definition.heritable[key];\n } else if (Object.prototype.hasOwnProperty.call(definition.unique, key)) {\n type = definition.unique[key];\n }\n // let paramobject = Parameter.generateComponentParameter(key, json.params[key]);\n // Check if the value type is float and convert the value from string\n value = json.params[key];\n if (type === \"Float\" && typeof value === \"string\") {\n value = parseFloat(value);\n }\n\n // let paramobject = new Parameter(type, value);\n params[key] = value;\n }\n\n // Do another check and see if position is present or not\n if (!Object.prototype.hasOwnProperty.call(params, \"position\")) {\n params.position = [0.0, 0.0];\n }\n const unique_map = MapUtils.toMap(definition.unique);\n const heritable_map = MapUtils.toMap(definition.heritable);\n const paramstoadd = new Params(params, unique_map, heritable_map);\n const component = new Component(paramstoadd, name, entity, id);\n\n // Deserialize the component ports\n const portdata = new Map();\n for (const port of json.ports) {\n const componentport = ComponentPort.fromInterchangeV1(port);\n portdata.set(componentport.label, componentport);\n }\n\n component.ports = portdata;\n\n return component;\n }\n\n /**\n * Set port for the component\n * @param {string} label\n * @param {Port} port\n * @memberof Component\n * @returns {void}\n */\n setPort(label: string, port: ComponentPort): void {\n this._ports.set(label, port);\n }\n\n /**\n * Gets the rotation of the component\n * @returns {Number} Returns the degree of rotation\n * @memberof Component\n */\n getRotation(): number {\n if (this._params.hasParam(\"rotation\")) {\n return this.getValue(\"rotation\");\n } else if (this._params.hasParam(\"orientation\")) {\n const orientation = this.getValue(\"orientation\");\n if (orientation === \"V\") {\n return 0;\n } else {\n return 270;\n }\n } else {\n console.warn(\"Returning rotation = 0 since no rotation was found for component: \", this);\n return 0;\n }\n }\n\n /**\n *\n * @param {string} label\n * @param {any} render\n * @returns {void}\n * @memberof Component\n */\n attachComponentPortRender(label: string, render: any): void {\n this._componentPortTRenders.set(label, render);\n }\n\n /**\n * Updates the Component Ports to have the latest location information\n * @memberof Component\n * @returns {void}\n */\n updateComponentPorts(): void {\n // updating the Component Ports\n const cleanparamdata = this.params.toMap();\n const currPos: [number, number] = cleanparamdata.get(\"position\");\n cleanparamdata.set(\"position\", [currPos[0] - this._renderOffset[0], currPos[1] - this._renderOffset[1]]);\n const ports = ComponentAPI.getComponentPorts(cleanparamdata, this._entity);\n for (const port of ports) {\n this.setPort(port.label, port);\n }\n }\n}\n","import Component from \"./component\";\nimport Device from \"./device\";\nimport { ConnectionTargetInterchangeV1 } from \"./init\";\n\n/**\n * Connection target class\n */\nexport default class ConnectionTarget {\n protected _component: Component;\n protected _portLabel: string;\n\n /**\n * Default ConnectionTarget Constructor\n * @param {Component} component\n * @param {string} portLabel\n */\n constructor(component: Component, portLabel: string) {\n this._component = component;\n this._portLabel = portLabel;\n }\n\n /**\n * Gets the port label of the object\n * @returns {string} Returns the port label of the object\n * @memberof ConnectionTarget\n */\n get portLabel(): string {\n return this._portLabel;\n }\n\n /**\n * Gets the component in the connection\n * @returns {Component} Returns a component object\n * @memberof ConnectionTarget\n */\n get component(): Component {\n return this._component;\n }\n\n /**\n * Converts to JSON format\n * @returns {JSON}\n * @memberof ConnectionTarget\n */\n toJSON(): { component: string; port: string } {\n // This is for the older design data\n if (this._component instanceof Component) {\n return {\n component: this._component.id,\n port: this._portLabel\n };\n } else {\n return { component: this._component, port: this._portLabel };\n }\n }\n\n /**\n * Creates a new connection from a JSON format\n * @param {Device} device Device in the connection\n * @param {JSON} json File where the connection is contain\n * @returns {ConnectionTarget} Returns a Connection Target Object\n * @memberof ConnectionTarget\n */\n static fromJSON(device: Device, json: ConnectionTargetInterchangeV1): ConnectionTarget {\n const component = device.getComponentByID(json.component);\n if (component !== null) return new ConnectionTarget(component, json.port);\n else throw new Error(\"Component not found\");\n }\n}\n","import Registry from \"@/app/core/registry\";\nimport { ComponentAPI } from \"@/componentAPI\";\n\nexport default class ConnectionUtils {\n constructor() {}\n\n\n static getDefinition(stringname: string) {\n return ComponentAPI.getDefinition(\"Connection\");\n }\n\n static getFeatureFromID(featureid: string) {\n return Registry.currentDevice!.getFeatureByID(featureid);\n }\n}\n","import ViewManager from \"@/app/view/viewManager\";\n\nimport {\n ConnectionTargetInterchangeV1,\n GeometryElementInterchangeV1_2,\n InterchangeV1_2\n // DeviceInterchangeV1,\n // LayerInterchangeV1,\n // RenderLayerInterchangeV1,\n // FeatureInterchangeV0,\n // ComponentInterchangeV1,\n // ConnectionInterchangeV1,\n // ComponentPortInterchangeV1,\n // LogicalLayerType\n} from \"@/app/core/init\";\nimport ConnectionTarget from \"../core/connectionTarget\";\nimport GeometryElement from \"../core/geometryElement\";\n\nexport class SerializationError {\n /**\n * Error message for the user.\n *\n * @type {string}\n * @memberof SerializationError\n */\n public message: string;\n\n /**\n * The element that caused the error.\n * TBD on how ot use this in the future.\n * @type {*}\n * @memberof SerializationError\n */\n public element: string;\n\n /**\n * The JSON data that was being processed when the error occurred.\n *\n * @type {string}\n * @memberof SerializationError\n */\n public jsonData: string;\n\n /**\n * Creates an instance of SerializationError.\n * @param {string} message\n * @param {string} element\n * @param {string} jsonData\n * @memberof SerializationError\n */\n constructor(message: string, element: string, jsonData: string) {\n this.message = message;\n this.element = element;\n this.jsonData = jsonData;\n }\n\n /**\n * Converts the error to a string.\n * suitable for display to the user. or in a log file.\n *\n * @returns {string}\n * @memberof SerializationError\n */\n toText(): string {\n let ret = `Error: ${this.message}\\n`;\n ret += `Element: ${this.element}\\n`;\n ret += \"JSON Data:\\n\";\n ret += \"\\`\\`\\`\\n\";\n ret += this.jsonData;\n ret += \"\\n\\`\\`\\`\\n\";\n\n return ret;\n }\n}\n\n\nexport default class ExportUtils {\n\n /**\n * Converts a device to interchange format.\n *\n * @static\n * @param {ViewManager} viewManagerDelegate\n * @returns {InterchangeV1_2}\n * @memberof ExportUtils\n */\n static toInterchangeV1_2(viewManagerDelegate: ViewManager, errorList:SerializationError[]): InterchangeV1_2 {\n if(viewManagerDelegate.currentDevice === null) {\n throw new Error(\"No device selected\");\n }\n let renderLayers = [];\n if (viewManagerDelegate === null) throw new Error(\"Registry or viewManager not initialized\");\n for (let i = 0; i < viewManagerDelegate.renderLayers.length; i++) {\n renderLayers.push(viewManagerDelegate.renderLayers[i].toInterchangeV1());\n }\n const device = viewManagerDelegate.currentDevice.toInterchangeV1(errorList);\n \n const valvemap = {};\n const valvetypemap = {};\n\n\n const newScratch: InterchangeV1_2 = {\n name: device.name,\n params: device.params,\n renderLayers: renderLayers,\n layers: device.layers,\n groups: device.groups,\n components: device.components,\n connections: device.connections,\n valves: device.valves,\n features: ExportUtils.featuresToInterchangeV1_2(viewManagerDelegate.currentDevice.parchmintFeatures) ,\n version: \"1.2\"\n };\n\n return newScratch;\n }\n\n /**\n * Converts a list of features to interchange format.\n * @static\n * @param {Array} featuresGeometries\n * @returns {Array}\n * @memberof ExportUtils\n */\n static featuresToInterchangeV1_2(featuresGeometries: Array): Array {\n let features: Array = [];\n featuresGeometries.forEach(feature => {\n features.push(feature.toInterchageV1_2());\n });\n return features;\n }\n\n /**\n * Converts a device to interchange format.\n *\n * @static\n * @param {ConnectionTarget} target\n * @returns {ConnectionTargetInterchangeV1}\n * @memberof ExportUtils\n */\n static toConnectionTargetInterchangeV1(target: ConnectionTarget): ConnectionTargetInterchangeV1{\n const ret: ConnectionTargetInterchangeV1 = {\n component: target.component.id,\n port: target.portLabel\n };\n return ret;\n }\n}\n\n","import paper from \"paper\";\nimport Parameter from \"./parameter\";\nimport Params from \"./params\";\nimport ConnectionTarget from \"./connectionTarget\";\nimport Device from \"./device\";\nimport * as FeatureRenderer2D from \"../view/render2D/featureRenderer2D\";\nimport Layer from \"./layer\";\nimport uuid from \"node-uuid\";\nimport { ConnectionInterchangeV1_2, ConnectionPathInterchangeV1_2, ConnectionTargetInterchangeV1 } from \"./init\";\nimport { Segment, Point } from \"./init\";\nimport ConnectionUtils from \"../utils/connectionUtils\";\nimport { ComponentAPI } from \"@/componentAPI\";\nimport MapUtils from \"../utils/mapUtils\";\nimport ExportUtils from \"../utils/exportUtils\";\nimport Feature from \"./feature\";\n\n/**\n * This class contains the connection abstraction used in the interchange format and the\n * high level device model of the microfluidic.\n */\nexport default class Connection {\n protected _params: Params;\n protected _name: string;\n protected _id: string;\n protected _type: string;\n protected _entity: string;\n protected _featureIDs: Array;\n protected _nodes: any;\n protected _bounds: paper.Rectangle | null;\n protected _source: ConnectionTarget | null;\n protected _sinks: Array;\n protected _paths: Array>;\n protected _objects: any;\n protected _routed: boolean;\n protected _layer: Layer;\n\n features: Array = [];\n\n /**\n * Default Connection Constructor\n * @param {String} type\n * @param {Params} params\n * @param {String} name\n * @param {String} mint\n * @param {String} id\n */\n constructor(type: string, params: Params, name: string, mint: string, layer: Layer, id: string = ComponentAPI.generateID()) {\n this._params = params;\n this._name = name;\n this._id = id;\n this._type = type;\n this._entity = mint;\n //This stores the features that are a part of the component\n this._featureIDs = [];\n this._nodes = [];\n //TODO: Need to figure out how to effectively search through these\n this._bounds = null;\n this._source = null;\n this._sinks = [];\n this._paths = [];\n this._objects = [];\n this._routed = false;\n this._layer = layer;\n }\n\n get layer(): Layer {\n return this._layer;\n }\n\n set layer(layer: Layer) {\n this._layer = layer;\n }\n /**\n * Gets the sinks in the connection\n * @returns {ConnectionTarget[]} Returns an array with the sinks\n * @memberof Connection\n */\n get sinks(): Array {\n return this._sinks;\n }\n\n /**\n * Gets the source of the connection\n * @returns {ConnectionTarget} Returns the source of the connection\n * @memberof Connection\n */\n get source(): ConnectionTarget | null {\n return this._source;\n }\n\n /**\n * Checks if the connection is routed\n * @returns {Boolean} Returns true whether if it is routed or not\n * @memberof Connection\n */\n get routed(): boolean {\n return this._routed;\n }\n\n /**\n * Sets if the connection is routed\n * @param {Boolean} value true if it's router or false if it's not\n * @returns {void}\n * @memberof Connection\n */\n set routed(value: boolean) {\n this._routed = value;\n }\n\n /**\n * Returns the list of features associated with the connection\n * @return {Feature[]}\n * @memberof Connection\n */\n get featureIDs(): Array {\n return this._featureIDs;\n }\n\n /**\n * Returns the params associated with the connection\n * @return {Params}\n * @memberof Connection\n */\n get params(): Params {\n return this._params;\n }\n\n\n /**\n * Sets the bounds i.e. the x,y position and the width and length of the component\n * @param {paper.Rectangle} bounds PaperJS Rectangle object associated with a Path.bounds property\n * @memberof Connection\n * @returns {void}\n */\n setBounds(bounds: paper.Rectangle): void {\n this._bounds = bounds;\n let topleftpt = bounds.topLeft;\n this._params.updateParameter(\"position\", [topleftpt.x, topleftpt.y]);\n this._params.updateParameter(\"xspan\", bounds.width);\n this._params.updateParameter(\"yspan\", bounds.height);\n }\n\n /**\n * Updates the parameters stored by the component\n * @param {String} key Identifier of the parameter\n * @param {any} value\n * @memberof Connection\n * @returns {void}\n */\n updateParameter(key: string, value: any): void {\n this._params.updateParameter(key, value);\n\n console.log(\"Key: \", key, \" Val: \", value);\n\n if (key != \"segments\") {\n for (const featureidtochange of this._featureIDs) {\n\n // Get the feature id and modify it\n const feature = ConnectionUtils.getFeatureFromID(featureidtochange);\n feature.updateParameter(key, value);\n }\n }\n\n // this._params[key] = value;\n // this.updateView();\n }\n\n /**\n * Generates the object that needs to be serialzed into JSON for interchange format V1\n * @returns {ConnectionInterchangeV1_2} Object\n * @memberof Connection\n */\n toInterchangeV1(): ConnectionInterchangeV1_2 {\n if (this._source === null) {\n throw new Error(\"Source is null, cannot convert connection to interchange format:\" + this._id);\n }\n const outputpaths: Array = [];\n for (let i = 0; i < this._paths.length; i++) {\n const path = this._paths[i];\n const outputpath: ConnectionPathInterchangeV1_2 = {\n source: this._source !== null ? this._source.toJSON() : null,\n sink: this.sinks.length > i ? this._sinks[i].toJSON() : null,\n wayPoints: path,\n // Get the id's of the features\n features: this.features.map(feature => {return feature.id;})\n };\n outputpaths.push(outputpath);\n }\n const output: ConnectionInterchangeV1_2 = {\n id: this._id,\n name: this._name,\n entity: this._entity,\n source: this._source.toJSON(),\n sinks: [],\n paths: outputpaths,\n params: this._params.toJSON(),\n layer: this._layer.id\n };\n\n if (this._source !== null) {\n output.source = this._source.toJSON();\n }\n if (this._sinks !== null && this._sinks.length > 0) {\n let sinks = [];\n for (const sink of this._sinks) {\n sinks.push(sink.toJSON());\n }\n output.sinks = this._sinks.map(sink => {\n return ExportUtils.toConnectionTargetInterchangeV1(sink);\n });\n }\n return output;\n }\n\n /**\n * Returns the ID of the component\n * @returns {String}\n * @memberof Connection\n */\n get id(): string {\n return this._id;\n }\n\n /**\n * Allows the user to set the name of the component\n * @param {String} name Name of the component\n * @memberof Connection\n * @returns {void}\n */\n set name(name: string) {\n this._name = name;\n }\n\n /**\n * Returns the name of the component\n * @returns {String} Name of the component\n * @memberof Connection\n */\n get name(): string {\n return this._name;\n }\n\n /**\n * Gets the 3DuF Type of the component, this will soon be depreciated and merged with\n * the MINT references\n * @returns {String}\n * @memberof Connection\n */\n get type(): string {\n return this._type;\n }\n\n /**\n * Returns the position of the component\n * @return {string}\n * @memberof Connection\n */\n /**\n * Returns the value of the parameter stored against the following key in teh component params\n * @returns {any}\n * @memberof Connection\n */\n getValue(key: string): any {\n try {\n return this._params.getValue(key);\n } catch (err) {\n throw new Error(\"Unable to get value for key: \" + key);\n }\n }\n\n /**\n * Adds a feature that is associated with the component\n * @param {String} featureID String id of the feature\n * @memberof Connection\n * @returns {void}\n */\n addFeatureID(featureID: string): void {\n this._featureIDs.push(featureID);\n //Now update bounds\n // this.__updateBounds();\n }\n\n /**\n * This method updates the bounds of the component\n * @memberof Connection\n * @returns {void}\n * @protected\n */\n protected updateBounds(): void {\n console.log(\"test\");\n let bounds = null;\n let feature = null;\n let renderedfeature = null;\n for (const featureid of this._featureIDs) {\n // gets teh feature defined by the id\n feature = ConnectionUtils.getFeatureFromID(featureid);\n console.log(feature);\n renderedfeature = FeatureRenderer2D.renderFeature(feature, null);\n console.log(\"rendered:\");\n console.log(renderedfeature);\n if (bounds === null) {\n bounds = renderedfeature.bounds;\n } else {\n bounds = bounds.unite(renderedfeature.bounds);\n }\n }\n this._bounds = bounds;\n }\n\n /**\n * Sets the params associated with the component\n * @param {Params} params key -> Parameter Set\n * @returns {void}\n * @memberof Connection\n */\n set params(params: Params) {\n this._params = params;\n //TODO: Modify all the associated Features\n for (let key in params) {\n let value = params.getValue(key);\n for (const featureidtochange of this._featureIDs) {\n\n //Get the feature id and modify it\n let feature = ConnectionUtils.getFeatureFromID(featureidtochange);\n feature.updateParameter(key, value.getValue());\n }\n }\n }\n\n /**\n * Returns the list of waypoints associated with the connection\n * @return {Point[]}\n * @memberof Connection\n */\n getPaths(): Array> {\n return this._paths;\n }\n\n /**\n * Updates the segments of the connection\n * @param {Segment[]} segments\n * @memberof Connection\n * @returns {void}\n */\n updateSegments(segments: Array): void {\n this.updateParameter(\"segments\", new Parameter(\"SegmentArray\", segments));\n for (const featureidtochange of this._featureIDs) {\n\n const feature = ConnectionUtils.getFeatureFromID(featureidtochange);\n // feature.updateParameter('position', center);\n feature.updateParameter(\"segments\", segments);\n }\n }\n\n /**\n * Inserts the gap using the boundingbox\n * @param {any} boundingbox\n * @memberof Connection\n * @returns {boolean}\n */\n insertFeatureGap(boundingbox: any): boolean {\n let foundflag = false;\n // Convert Rectangle to Path.Rectangle\n console.log(boundingbox, boundingbox.width, boundingbox.height);\n boundingbox = new paper.Path.Rectangle(boundingbox);\n // Check which segment I need to break\n const segments = this.getValue(\"segments\");\n for (const i in segments) {\n const segment = segments[i];\n const line = new paper.Path.Line(new paper.Point(segment[0]), new paper.Point(segment[1]));\n const intersections = line.getIntersections(boundingbox);\n // console.log(\"Intersections found\", intersections);\n if (intersections.length === 2) {\n const break1 = intersections[0].point;\n const break2 = intersections[1].point;\n const newsegs = this.breakSegment(segment, break1, break2);\n console.log(\"breaking:\", segment, newsegs);\n if (newsegs.length !== 2) {\n throw new Error(\"Could not break the segments correctly\");\n }\n segments.splice(i, 1, newsegs[0], newsegs[1]);\n foundflag = true;\n } else if (intersections.length === 1) {\n console.error(\"Only found 1 intersection point so going to use a different method\");\n console.log(\"Found Intersection:\", intersections);\n\n console.log(\"Segments:\", segments);\n console.log(\"line:\", line);\n console.log(\"Bounding Box:\", boundingbox);\n } else {\n console.error(\"No intersections found so going to use a different method\");\n console.log(\"Found Intersection:\", intersections);\n\n console.log(\"Segments:\", segments);\n console.log(\"line:\", line);\n console.log(\"Bounding Box:\", boundingbox);\n }\n }\n\n // Now that we exit the check for every segment we can verify if this is ok\n if (!foundflag) {\n console.error(\"There's something funky going on with the intersection,no intersections found\");\n console.log(\"Segments:\", segments);\n // console.log(\"line:\", line);\n console.log(\"Bounding Box:\", boundingbox);\n throw new Error(\"Could not find 2 intersection points, hence aborting the whole thing\");\n }\n // console.log(\"raw new segments:\", segments);\n this.updateSegments(segments);\n\n return foundflag;\n }\n\n /**\n * Breaks the segment at the 2 points given by the points\n * @param {Point[]} segment\n * @param {paper.Point} break1\n * @param {paper.Point} break2\n * @return {Segment[]} Returns the two segments\n * @memberof Connection\n * @protected\n */\n protected breakSegment(segment: Segment, break1: paper.Point, break2: paper.Point): Array {\n //Generate 2 segments from this 1 segemnt\n const p1 = new paper.Point(segment[0]);\n const p2 = new paper.Point(segment[1]);\n\n let segment1: Segment, segment2: Segment;\n const p1_break1 = p1.getDistance(break1);\n const p2_break1 = p2.getDistance(break1);\n const p1_break2 = p1.getDistance(break2);\n const p2_break2 = p2.getDistance(break2);\n\n // Find out if break1 is closer to p1 or p2\n if (p1_break1 + p2_break2 < p2_break1 + p1_break2) {\n // break1 is closer to p1 and break2 is closer to p2\\\n segment1 = [\n [Math.round(p1.x), Math.round(p1.y)],\n [Math.round(break1.x), Math.round(break1.y)]\n ];\n segment2 = [\n [Math.round(p2.x), Math.round(p2.y)],\n [Math.round(break2.x), Math.round(break2.y)]\n ];\n } else {\n // break1 is closer to p2 and break1 is closer to p1\n segment1 = [\n [Math.round(p2.x), Math.round(p2.y)],\n [Math.round(break1.x), Math.round(break1.y)]\n ];\n segment2 = [\n [Math.round(p1.x), Math.round(p1.y)],\n [Math.round(break2.x), Math.round(break2.y)]\n ];\n }\n return [segment1, segment2];\n }\n\n /**\n * This method is used to import the component from Interchange V1 JSON\n * @param json\n * @returns {Connection} Returns a connection object\n * @memberof Connection\n */\n static fromInterchangeV1(device: Device, json: ConnectionInterchangeV1_2): Connection {\n // let set;\n // if (json.hasOwnProperty(\"set\")) set = json.set;\n // else set = \"Basic\";\n // //TODO: This will have to change soon when the thing is updated\n // throw new Error(\"Need to implement Interchange V1 Import for component object\");\n // //return Device.makeFeature(json.macro, set, json.params, json.name, json.id, json.type);\n\n const name = json.name;\n const id = json.id;\n const entity = json.entity;\n const params = json.params;\n const layer = device.getLayer(json.layer);\n if (layer === null) {\n throw new Error(\"Could not find layer with id: \" + json.layer);\n }\n\n // Check if the params have the other unique elements necessary otherwise add them as null\n if (!Object.prototype.hasOwnProperty.call(params, \"start\")) {\n // Setting this value to origin\n params.start = [0, 0];\n }\n if (!Object.prototype.hasOwnProperty.call(params, \"end\")) {\n // Setting this value to origin\n params.end = [0, 0];\n }\n if (!Object.prototype.hasOwnProperty.call(params, \"wayPoints\")) {\n // TODO: setting a single waypoint at origin\n params.wayPoints = [\n [0, 0],\n [1, 2]\n ];\n }\n if (!Object.prototype.hasOwnProperty.call(params, \"segments\")) {\n // TODO: Setting a default segment from origin to origin\n params.segments = [\n [\n [0, 0],\n [0, 0]\n ],\n [\n [0, 0],\n [0, 0]\n ]\n ];\n }\n let definition = ComponentAPI.getDefinition(\"Connection\");\n if (definition === null || definition === undefined) {\n throw new Error(\"Could not find the definition for the Connection\");\n }\n const paramstoadd = new Params(params, MapUtils.toMap(definition.unique), MapUtils.toMap(definition.heritable));\n\n const connection = new Connection(entity, paramstoadd, name, entity, layer, id);\n if (Object.prototype.hasOwnProperty.call(json, \"source\")) {\n if (json.source !== null && json.source !== undefined) {\n connection.setSourceFromJSON(device, json.source);\n }\n }\n if (Object.prototype.hasOwnProperty.call(json, \"sinks\")) {\n if (json.sinks !== null && json.sinks !== undefined) {\n for (const i in json.sinks) {\n const sink = json.sinks[i];\n connection.addSinkFromJSON(device, sink);\n }\n }\n }\n if (Object.prototype.hasOwnProperty.call(json, \"paths\")) {\n if (json.paths !== null && json.paths !== undefined) {\n for (const i in json.paths) {\n connection.addWayPoints(json.paths[i].wayPoints);\n }\n }\n }\n\n return connection;\n }\n\n /**\n * Goes through teh waypoints and generates the connection segments\n * @return {SegmentArray}\n * @memberof Connection\n */\n regenerateSegments(): void {\n const pathscopy = this.getPaths();\n const ret: Array = [];\n let waypointscopy;\n for (const j in pathscopy) {\n waypointscopy = pathscopy[j];\n for (let i = 0; i < waypointscopy.length - 1; i++) {\n const segment: Segment = [waypointscopy[i], waypointscopy[i + 1]];\n ret.push(segment);\n }\n }\n this.updateSegments(ret);\n }\n\n // /**\n // * Allows the user to set the source of the connection\n // * @param {Object} component\n // * @param {ComponentPort} port\n // * @memberof Connection\n // * @returns {void}\n // */\n // setSource(component: string, port: ComponentPort) {\n // if (typeof component != \"string\" && !(component instanceof String)) {\n // console.error(\"The reference object value can only be a string\");\n // }\n // this._source = new ConnectionTarget(component, port);\n // }\n\n // /**\n // * Allows the user to add a sink to the connection\n // * @param {string} component\n // * @param {ComponentPort} port\n // * @memberof Connection\n // * @returns {void}\n // */\n // addSink(component: string, port: ComponentPort) {\n // if (typeof component != \"string\" || !(component instanceof String)) {\n // console.error(\"The reference object value can only be a string\");\n // }\n // this._sinks.push(new ConnectionTarget(component, port));\n // }\n\n /**\n * Adds a new connection target to either the source or the sinks of the connection object. Requires the user to pass\n * a ConnectionTarget Object or else it will throw an error.\n * @param {string} connectiontarget\n * @memberof Connection\n * @returns {void}\n */\n addConnectionTarget(connectiontarget: ConnectionTarget): void {\n if (!(connectiontarget instanceof ConnectionTarget) || connectiontarget === null || connectiontarget == undefined) {\n console.error(\"Cannot add non-ConnectionTarget object as source or sink\");\n }\n\n if (this._source === null) {\n this._source = connectiontarget;\n } else {\n //TODO: Check for duplicates - does it matter actually ?\n this._sinks.push(connectiontarget);\n }\n }\n\n /**\n * Tries to delete any connection target reference that uses the said component\n * @param {string} componentid Component ID\n * @return {boolean} Returns true if any corresponding connection target is found\n * @memberof Connection\n *\n */\n tryDeleteConnectionTarget(componentid: string): boolean {\n let ret = false;\n\n let source = this._source;\n if (source !== null) {\n if (source.component.id == componentid) {\n //Remove the source object\n this._source = null;\n ret = true;\n }\n }\n\n for (let i in this._sinks) {\n let sink = this._sinks[i];\n\n if (sink.component.id == componentid) {\n this._sinks.splice(+i, 1);\n ret = true;\n }\n }\n\n return ret;\n }\n\n /**\n * Adds a new set of waypoints to the path field of the connection\n * @param {} wayPoints\n * @memberof Connection\n * @returns {void}\n */\n addWayPoints(wayPoints: Array): void {\n this._paths.push(wayPoints);\n }\n\n /**\n * Merges connections\n * @param {Connection} connection\n * @memberof Connection\n * @returns {void}\n */\n mergeConnection(connection: Connection): void {\n console.error(\"Merge the newly found connection with the new connection\");\n // TODO:\n /*\n 1. Transfer all the paths\n 2. Transfer all the ConnectionTargets\n 3. Transfer all the other objects\n 4. Move the params\n 5.\n */\n }\n\n /**\n * Converts from JSON format to connection object\n * @param {Object} device\n * @param {JSON} json\n * @memberof Connection\n * @returns {void}\n */\n setSourceFromJSON(device: Device, json: ConnectionTargetInterchangeV1): void {\n const target = ConnectionTarget.fromJSON(device, json);\n this._source = target;\n }\n\n /**\n * Adds a sink to the connection\n * @param {Object} device\n * @param {JSON} json\n * @memberof Connection\n * @returns {void}\n */\n addSinkFromJSON(device: Device, json: ConnectionTargetInterchangeV1): void {\n let target = ConnectionTarget.fromJSON(device, json);\n this._sinks.push(target);\n }\n\n /**\n * Adds a feature to the connection\n *\n * @param {Feature} feature\n * @memberof Connection\n */\n addFeature(feature: Feature): void {\n this.features.push(feature);\n }\n\n /**\n * Removes a feature from the connection\n *\n * @param {Feature} feature\n * @memberof Connection\n */\n removeFeature(feature: Feature): void {\n this.features.splice(this.features.indexOf(feature), 1);\n }\n\n}\n","export function mapToJson(map: Map) {\n console.log(\"map to json\");\n const object: { [k: string]: any } = {};\n for (const [k, v] of map) {\n // We don’t escape the key '__proto__'\n // which can cause problems on older engines\n object[k] = v;\n }\n return object;\n}\n\nexport function jsonToMap(jsonStr: { [k: string]: any }) {\n console.log(\"json to map\");\n const ret = new Map();\n for (const key in jsonStr) {\n const value = jsonStr[key];\n console.log(\"Setting:\", key, value);\n ret.set(key, value);\n }\n return ret;\n}\n\nfunction fixDeviceDimensionParams(json: { [k: string]: any }) {\n if (Object.prototype.hasOwnProperty.call(json, \"params\")) {\n if (Object.prototype.hasOwnProperty.call(json.params, \"width\")) {\n const xspan = json.params.width;\n json.params.xspan = xspan;\n delete json.params.width;\n console.warn(\"Fixed issue with incorrect device xspan param\");\n }\n if (Object.prototype.hasOwnProperty.call(json.params, \"length\")) {\n const yspan = json.params.length;\n json.params.yspan = yspan;\n delete json.params.length;\n console.warn(\"Fixed issue with incorrect device yspan param\");\n }\n }\n}\n\nexport function sanitizeV1Plus(jsonstr: { [k: string]: any }): void {\n fixDeviceDimensionParams(jsonstr);\n // TODO: add other proceses\n}\n","import Registry from \"@/app/core/registry\";\nimport Layer from \"../core/layer\";\n\nexport default class DeviceUtils {\n static __nameMap = new Map();\n\n static addLayer(layer: Layer, index: number): void {\n Registry.viewManager!.addLayer(layer, index);\n }\n\n /**\n * Generates a new new name for the type, use this to autogenerate the names for components that are typespecific\n * @param {string} type\n * @return {string}\n * @memberof Device\n */\n static generateNewName(type: string): string {\n let value = DeviceUtils.__nameMap.get(type);\n if (value != undefined) {\n this.__nameMap.set(type, value + 1);\n return type + \"_\" + String(value + 1);\n } else {\n this.__nameMap.set(type, 1);\n return type + \"_1\";\n }\n }\n}\n","/// \n\nimport Params from \"./params\";\nimport GeometryElement from \"./geometryElement\";\n\nimport Feature from \"./feature\";\nimport { DeviceInterchangeV1, DeviceInterchangeV1_1, LogicalLayerType, Point, ValveInterchangeV1_2, ValveType } from \"./init\";\nimport { ComponentInterchangeV1 } from \"./init\";\nimport { ConnectionInterchangeV1_2 } from \"./init\";\nimport { LayerInterchangeV1 } from \"./init\";\n\nimport Layer from \"./layer\";\nimport Component from \"./component\";\nimport Connection from \"./connection\";\nimport EdgeFeature from \"./edgeFeature\";\nimport DXFObject from \"./dxfObject\";\nimport ComponentPort from \"./componentPort\";\nimport * as IOUtils from \"../utils/ioUtils\";\n\nimport DeviceUtils from \"@/app/utils/deviceUtils\";\nimport { ComponentAPI } from \"@/componentAPI\";\nimport MapUtils from \"../utils/mapUtils\";\nimport { SerializationError } from \"../utils/exportUtils\";\n\n/**\n * The Device stores information about a design.\n */\nexport default class Device {\n private __layers: Array;\n private __textLayers: Array;\n private __params: Params;\n private __name: string;\n private __components: Array;\n private __nameMap: Map;\n private __connections: Array;\n private __valveMap: Map;\n private __valveTypeMap: Map;\n private __groups: Array;\n private __parchmintFeatures: Array;\n\n /**\n * Default Constructor\n * @param {*} values\n * @param {string} name Name of the Device\n */\n constructor(values: { [index: string]: any }, name: string = \"New Device\") {\n this.__layers = [];\n this.__textLayers = [];\n //this.__features = [];\n this.__groups = [];\n this.__params = new Params(values, Device.getUniqueParameters(), Device.getHeritableParameters());\n // this.setXSpan(values.width);\n // this.setYSpan(values.length);\n\n this.__name = name;\n this.__components = [];\n this.__nameMap = new Map();\n this.__connections = [];\n\n //Map to store \n this.__valveMap = new Map();\n this.__valveTypeMap = new Map();\n\n // Initilize the Features array that would be used to store the Parchmint Features\n this.__parchmintFeatures = [];\n }\n\n /**\n * Adds a layer to the device\n *\n * @param {string} componentid\n * @param {string} connectionid\n * @param {ValveType} valvetype\n * @memberof Device\n */\n addValve(componentid: string, connectionid: string, valvetype: ValveType): void {\n this.__valveMap.set(componentid, connectionid);\n this.__valveTypeMap.set(componentid, valvetype);\n }\n\n /**\n * Returns the name of the device\n *\n * @returns {String}\n * @memberof Device\n */\n get name(): string {\n return this.__name;\n }\n\n /**\n * Sets the map used for naming objects\n * @param {Map}\n * @memberof Device\n */\n set nameMap(nameMap: Map) {\n this.__nameMap = nameMap;\n }\n\n /**\n * Returns the list of layers in the device\n * @return {Array}\n * @memberof Device\n */\n get layers(): Array {\n return this.__layers;\n }\n\n get parchmintFeatures(): Array {\n return this.__parchmintFeatures;\n }\n\n /**\n * Adds a connection to the device\n * @param {Connection} connection\n * @memberof Device\n * @returns {void}\n */\n addConnection(connection: Connection): void {\n this.__connections.push(connection);\n }\n\n /**\n * Removes a connection from the device\n * @param {Connection} connection\n * @memberof Device\n * @returns {void}\n */\n removeConnection(connection: Connection): void {\n let i = this.__connections.indexOf(connection);\n if (i != -1) {\n this.__connections.splice(i, 1);\n }\n }\n\n /**\n * Adds a component to the device\n * @param {Component} component Component to be added to the device\n * @memberof Device\n * @returns {void}\n */\n addComponent(component: Component): void {\n if (component instanceof Component) {\n this.__components.push(component);\n } else {\n throw new Error(\"Tried to add a component that isn't a component to the device\");\n }\n }\n\n /**\n * Removes a component from the device\n * @param {Component} component Component to remove from the device\n * @memberof Device\n * @returns {void}\n */\n removeComponent(component: Component): null | Connection {\n //Remove the component from the map\n let trydelete;\n let componentid = component.id;\n let connectiontorefresh = null;\n\n //Remove component from connections\n for (const connection of this.__connections) {\n try {\n trydelete = connection.tryDeleteConnectionTarget(componentid);\n if (trydelete) {\n console.log(\"Removed Component from Connection : \", connection.id);\n }\n } catch (e) {\n console.error(e);\n }\n }\n //Check if the valve map has the component\n let checkConnection: string | undefined = this.__valveMap.get(componentid);\n if (checkConnection != undefined) {\n connectiontorefresh = this.getConnectionByID(checkConnection);\n this.__valveMap.delete(componentid);\n }\n\n let i = this.__components.indexOf(component);\n if (i != -1) {\n this.__components.splice(i, 1);\n }\n\n return connectiontorefresh;\n }\n\n /**\n * Returns the list of components from the device\n * @return {Array} Array with the components of the device\n * @memberof Device\n */\n get components(): Array {\n return this.__components;\n }\n\n /**\n * Sets the name of the device\n * @param {string} name Name of the device\n * @memberof Device\n */\n set name(name: string) {\n this.__name = name;\n }\n\n /**\n * Updates the parameter\n * @param {string} key Key to identigy the parameter\n * @param {} value Parameter's value\n * @memberof Device\n * @returns {void}\n */\n updateParameter(key: string, value: any): void {\n this.__params.updateParameter(key, value);\n }\n\n /**\n * Returns the layer with the given ID\n *\n * @param {string} id\n * @returns {(Layer | null)}\n * @memberof Device\n */\n getLayer(id: string): Layer | null {\n for (let i in this.__layers) {\n let layer = this.__layers[i];\n if (layer.id == id) {\n return layer;\n }\n }\n return null;\n }\n\n /**\n * Returns the layer that contains the feature with the given feature ID\n * @param {string} featureID ID of the feature to search for it\n * @return {Layer} Returns the layer\n * @memberof Device\n */\n getLayerFromFeatureID(featureID: string): Layer {\n for (let i = 0; i < this.__layers.length; i++) {\n let layer = this.__layers[i];\n if (layer.containsFeatureID(featureID)) {\n return layer;\n }\n }\n for (let i = 0; i < this.__textLayers.length; i++) {\n let layer = this.__textLayers[i];\n if (layer.containsFeatureID(featureID)) {\n return layer;\n }\n }\n throw new Error(\"FeatureID \" + featureID + \" not found in any layer.\");\n }\n\n /**\n * Checks if feature with given feature id is part of the device\n * @param {string} featureID ID of the feature to search for it\n * @return {boolean}\n * @memberof Device\n */\n containsFeatureID(featureID: string): boolean {\n for (let i = 0; i < this.__layers.length; i++) {\n if (this.__layers[i].containsFeatureID(featureID)) return true;\n }\n return false;\n }\n\n /**\n * Returns a list of all the features in the device\n * @return {Array} Array with all the features of the device\n * @memberof Device\n */\n getAllFeaturesFromDevice(): Array {\n let features: Array = [];\n for (let i in this.__layers) {\n //features.push.apply(features, layer.features);\n let layer: Layer = this.__layers[i];\n for (let j in layer.features) {\n // console.log(layer.features[j]);\n features.push(layer.getFeature(j));\n }\n }\n return features;\n }\n\n /**\n * Returns the feature with the given feature id\n * @param {string} featureID ID of the feature to search\n * @return {Feature}\n * @memberof Device\n */\n getFeatureByID(featureID: string): Feature {\n let layer = this.getLayerFromFeatureID(featureID);\n return layer.getFeature(featureID);\n }\n\n /**\n * Returns the feature with the given name\n * @param {string} name Name of the feature to be search\n * @return {Feature}\n * @memberof Device\n */\n getFeatureByName(name: string): Feature {\n let layer;\n let features;\n for (let i = 0; i < this.__layers.length; i++) {\n layer = this.__layers[i];\n features = layer.getAllFeaturesFromLayer();\n for (let ii in features) {\n let feature = features[ii];\n if (feature.getName() === name) {\n return feature;\n }\n }\n }\n for (let i = 0; i < this.__textLayers.length; i++) {\n layer = this.__layers[i];\n features = layer.getAllFeaturesFromLayer();\n for (let ii in features) {\n let feature = features[ii];\n if (feature.getName() === name) {\n return feature;\n }\n }\n }\n throw new Error(\"FeatureID \" + name + \" not found in any layer.\");\n }\n\n /**\n * Add a layer, and re-sort the layers array\n * @param {Layer} layer Layer to add\n * @memberof Device\n * @returns {void}\n */\n addLayer(layer: Layer): void {\n layer.device = this;\n this.__layers.push(layer);\n //this.sortLayers();\n // TODO: Fix layer system\n DeviceUtils.addLayer(layer, this.__layers.indexOf(layer));\n }\n\n /**\n * Add a layer to specific index, and re-sort the layers array\n * @param {Layer} layer Layer to add\n * @param {number} index The index into which to add the layer\n * @memberof Device\n * @returns {void}\n */\n addLayerAtIndex(layer: Layer, index: number): void {\n layer.device = this;\n this.__layers.splice(index, 0, layer);\n //this.sortLayers();\n // TODO: Fix layer system\n DeviceUtils.addLayer(layer, this.__layers.indexOf(layer));\n }\n\n /**\n * Removes feature of the Device\n * @param {Feature} feature Feature to be removed\n * @memberof Device\n * @returns {void}\n */\n removeFeature(feature: Feature): void {\n if (feature.type == \"Connection\") {\n for (let i = 0; i < this.__connections.length; i++) {\n let featIDs = this.__connections[i].featureIDs;\n for (let j = 0; j < featIDs.length; j++) {\n if (this.__connections[i].featureIDs[j] == feature.ID) {\n this.__connections[i].featureIDs.splice(j, 1);\n if (this.__connections[i].featureIDs.length == 0) {\n this.__connections.splice(i, 1);\n }\n }\n }\n }\n } else {\n for (let i = 0; i < this.__components.length; i++) {\n let featIDs = this.__components[i].featureIDs;\n for (let j = 0; j < featIDs.length; j++) {\n if (this.__components[i].featureIDs[j] == feature.ID) {\n this.__components[i].featureIDs.splice(j, 1);\n if (this.__components[i].featureIDs.length == 0) {\n this.__components.splice(i, 1);\n }\n }\n }\n }\n }\n }\n\n /**\n * Gets the unique parameters\n * @returns {Object}\n */\n static getUniqueParameters(): Map {\n let unique: Map = new Map();\n unique.set(\"x-span\", \"Float\");\n unique.set(\"y-span\", \"Float\");\n return unique;\n }\n\n /**\n * Update the cross-reference\n * @param {String} objectID ID of the object to search for\n * @param {String} featureID ID of the feature to search in the given object\n * @memberof Device\n * @returns {void}\n */\n updateObjectReference(objectID: string, featureID: string): void {\n //Goes through the components to update the reference\n let component: Component;\n let foundflag = false;\n for (const component of this.__components) {\n // console.log(objectID, component.id);\n if (objectID == component.id) {\n component.addFeatureID(featureID);\n component.placed = true;\n foundflag = true;\n }\n }\n\n //Goes through the connection to update the reference\n let connection;\n for (const connection of this.__connections) {\n if (objectID == connection.id) {\n connection.addFeatureID(featureID);\n connection.routed = true;\n foundflag = true;\n }\n }\n\n if (!foundflag) {\n console.error(\"Could not find object to update reference: \" + featureID);\n }\n }\n /**\n * ?\n */\n static getHeritableParameters(): Map {\n return new Map();\n }\n /**\n * Converts groups to JSON\n * @returns {JSON}\n * @memberof Device\n */\n __groupsToJSON(): Array {\n let output: Array = [];\n for (let i in this.__groups) {\n output.push(this.__groups[i]);\n }\n return output;\n }\n /**\n * Converts layers to JSON\n * @returns {JSON}\n * @memberof Device\n */\n __layersToJSON(): Array<{ [index: string]: any }> {\n let output: Array<{ [index: string]: any }> = [];\n for (let i in this.__layers) {\n output.push(this.__layers[i].toJSON());\n }\n return output;\n }\n /**\n * Returns an array with the components\n * @returns {Array}\n * @memberof Device\n */\n __componentsToInterchangeV1(errorList: Array): Array {\n let output: Array = [];\n for (let i in this.__components) {\n try {\n output.push(this.__components[i].toInterchangeV1());\n }\n catch (e) {\n console.error(e);\n errorList.push(new SerializationError(\n e.message,\n `Component ${this.__components[i].id} could not be converted to InterchangeV1`,\n JSON.stringify(this.__components[i]),\n ));\n }\n }\n return output;\n }\n /**\n * Converts connection to InterchangeV1\n * @returns {Array} Returns an array with the connections\n * @memberof Device\n */\n __connectionToInterchangeV1(errorList: Array): Array {\n let output: Array = [];\n for (let i in this.__connections) {\n try {\n output.push(this.__connections[i].toInterchangeV1());\n } catch (e) {\n console.error(e);\n errorList.push(new SerializationError(\n e.message,\n `Connection : ${this.__connections[i].id} could not be converted to InterchangeV1`,\n JSON.stringify(this.__connections[i]),\n ));\n }\n }\n return output;\n }\n\n __valvesToInterchangeV1(errorList: Array): Array {\n let output: Array = [];\n this.__valveMap.forEach((target, valveID) => {\n let valve_type = this.__valveTypeMap.get(valveID);\n if(valve_type === undefined) {\n console.warn(\"Valve type not found for valve: \" + valveID + \" , setting default to NORMALLY_OPEN\");\n valve_type = ValveType.NORMALLY_OPEN;\n }\n try {\n output.push({\n componentid: valveID,\n connectionid: target,\n type: valve_type,\n params: {}\n });\n } catch (e) {\n console.error(e);\n errorList.push(new SerializationError(\n e.message,\n `Valve : ${valveID} could not be converted to InterchangeV1`,\n JSON.stringify(valveID),\n ));\n }\n });\n return output;\n }\n\n /**\n * Converts feature layers to InterchangeV1\n * @return {Array} Returns an array with the feature layers\n * @memberof Device\n */\n __featureLayersToInterchangeV1(): Array {\n let output: Array = [];\n for (let i in this.__layers) {\n output.push(this.__layers[i].toInterchangeV1());\n }\n return output;\n }\n /**\n * Converts layers to InterchangeV1\n * @return {Array} Returns an array with the layers\n * @memberof Device\n */\n __layersToInterchangeV1(errorList: Array): Array {\n const output: Array = [];\n for (const i in this.__layers) {\n try {\n output.push(this.__layers[i].toInterchangeV1());\n } catch (e) {\n console.error(e);\n errorList.push(new SerializationError(\n e.message,\n `Layer ${this.__layers[i].id} could not be converted to InterchangeV1`,\n JSON.stringify(this.__layers[i])\n ));\n }\n }\n return output;\n }\n\n /**\n * Loads feature layers from a Interchange format into the device object\n * @param {*} json\n * @memberof Device\n * @returns {void}\n */\n __loadLayersFromInterchangeV1(json: Array): void {\n for (let i in json) {\n let newLayer = Layer.fromInterchangeV1(json[i], this);\n this.addLayer(newLayer);\n }\n }\n\n /**\n * Loads the JSON Component object into the device object\n * @param {ComponentInterchangeV1} components\n * @memberof Device\n * @returns {void}\n * @private\n */\n __loadComponentsFromInterchangeV1(components: Array): void {\n let componenttoadd;\n\n for (let i in components) {\n componenttoadd = Component.fromInterchangeV1(components[i]);\n this.__components.push(componenttoadd);\n }\n }\n /**\n * Loads connections to the device object\n * @param {Connection} connections Connections to add to the device\n * @memberof Device\n * @returns {void}\n */\n __loadConnectionsFromInterchangeV1(connections: Array): void {\n let connectiontoload;\n for (let i in connections) {\n connectiontoload = Connection.fromInterchangeV1(this, connections[i]);\n this.__connections.push(connectiontoload);\n }\n }\n\n /**\n * Converts to Interchange V1 format\n * @returns {Device} Returns an Device object in Interchange V1 format\n * @memberof Device\n */\n toInterchangeV1(errorList: Array): DeviceInterchangeV1 {\n let output: DeviceInterchangeV1 = {\n name: this.__name,\n params: {\n width: this.getXSpan(),\n length: this.getYSpan()\n },\n //TODO: Use this to dynamically create enough layers to scroll through\n layers: this.__layersToInterchangeV1(errorList),\n components: this.__componentsToInterchangeV1(errorList),\n connections: this.__connectionToInterchangeV1(errorList),\n valves: this.__valvesToInterchangeV1(errorList),\n version: \"1\",\n groups: this.__groupsToJSON()\n };\n return output;\n }\n\n toInterchangeV1_1(errorList: Array): DeviceInterchangeV1_1 {\n let output: DeviceInterchangeV1_1 = {\n name: this.__name,\n params: {\n width: this.getXSpan(),\n length: this.getYSpan()\n },\n //TODO: Use this to dynamically create enough layers to scroll through\n layers: this.__layersToInterchangeV1(errorList),\n components: this.__componentsToInterchangeV1(errorList),\n connections: this.__connectionToInterchangeV1(errorList),\n version: \"1.1\",\n groups: this.__groupsToJSON()\n };\n return output;\n }\n\n static fromInterchangeV1(json: DeviceInterchangeV1): Device {\n let newDevice: Device;\n if (Object.prototype.hasOwnProperty.call(json, \"params\")) {\n if (Object.prototype.hasOwnProperty.call(json.params, \"width\") && Object.prototype.hasOwnProperty.call(json.params, \"length\")) {\n newDevice = new Device(\n {\n width: json.params.width,\n length: json.params.length\n },\n json.name\n );\n } else {\n newDevice = new Device(\n {\n width: 135000,\n length: 85000\n },\n json.name\n );\n }\n } else {\n console.warn(\"Could not find device params, using some default values for device size\");\n newDevice = new Device(\n {\n width: 135000,\n length: 85000\n },\n json.name\n );\n }\n //TODO: Use this to dynamically create enough layers to scroll through\n //newDevice.__loadLayersFromInterchangeV1(json.layers);\n //TODO: Use these two generate a rat's nest\n newDevice.__loadComponentsFromInterchangeV1(json.components);\n newDevice.__loadConnectionsFromInterchangeV1(json.connections);\n //TODO: Use this to render the device features\n\n //Check if JSON has features else mark\n if (Object.prototype.hasOwnProperty.call(json, \"layers\")) {\n newDevice.__loadLayersFromInterchangeV1(json.layers);\n } else {\n //We need to add a default layer\n let newlayer = new Layer({}, \"flow\", LogicalLayerType.FLOW, \"0\", newDevice);\n newDevice.addLayer(newlayer);\n newlayer = new Layer({}, \"control\", LogicalLayerType.CONTROL, \"0\", newDevice);\n newDevice.addLayer(newlayer);\n }\n\n //Updating cross-references\n let features = newDevice.getAllFeaturesFromDevice();\n let feature;\n for (let i in features) {\n //console.log(\"Feature:\", features[i]);\n feature = features[i];\n if (feature.referenceID !== null) {\n newDevice.updateObjectReference(feature.referenceID, feature.ID);\n }\n }\n\n return newDevice;\n }\n\n static fromInterchangeV1_1(json: DeviceInterchangeV1): Device {\n IOUtils.sanitizeV1Plus(json);\n let newDevice;\n\n if (Object.prototype.hasOwnProperty.call(json, \"params\")) {\n if (Object.prototype.hasOwnProperty.call(json.params, \"xspan\") && Object.prototype.hasOwnProperty.call(json.params, \"yspan\")) {\n newDevice = new Device(\n {\n width: json.params.xspan,\n length: json.params.yspan\n },\n json.name\n );\n } else {\n newDevice = new Device(\n {\n width: 135000,\n length: 85000\n },\n json.name\n );\n }\n } else {\n console.warn(\"Could not find device params, using some default values for device size\");\n newDevice = new Device(\n {\n width: 135000,\n length: 85000\n },\n json.name\n );\n }\n //TODO: Use this to dynamically create enough layers to scroll through\n //newDevice.__loadLayersFromInterchangeV1(json.layers);\n //TODO: Use these two generate a rat's nest\n newDevice.__loadComponentsFromInterchangeV1(json.components);\n newDevice.__loadConnectionsFromInterchangeV1(json.connections);\n\n let valve_map, valve_type_map;\n //Import ValveMap\n if (Object.prototype.hasOwnProperty.call(json.params, \"valveMap\") && Object.prototype.hasOwnProperty.call(json.params, \"valveTypeMap\")) {\n valve_map = IOUtils.jsonToMap(json.params.valveMap);\n console.log(\"Imported valvemap\", valve_map);\n\n console.log(\"Loaded valvetypemap\", json.params.valveTypeMap);\n valve_type_map = IOUtils.jsonToMap(json.params.valveTypeMap);\n\n console.log(json.params.valveTypeMap, valve_type_map);\n for (let [componentid, connectionid] of valve_map) {\n let valve = newDevice.getComponentByID(componentid);\n if(valve === null) {\n console.error(\"Could not find valve with id:\", componentid);\n throw new Error(\"Could not find valve with id: \" + componentid);\n }\n let connection = newDevice.getConnectionByID(connectionid);\n if(connection === null) {\n console.error(\"Could not find connection with id:\", connectionid);\n throw new Error(\"Could not find connection with id: \" + connectionid);\n }\n const valve_type_text = valve_type_map.get(componentid);\n let valve_type = ValveType.NORMALLY_OPEN;\n if (valve_type_text === \"NORMALLY_OPEN\") {\n valve_type = ValveType.NORMALLY_OPEN;\n }else if(valve_type_text === \"NORMALLY_CLOSED\") {\n valve_type = ValveType.NORMALLY_CLOSED;\n } else {\n console.warn(\"Could not find valve type for valve with id:\", componentid);\n throw new Error(\"Could not find valve type for valve with id: \" + componentid);\n }\n\n newDevice.insertValve(valve, connection, valve_type_map.get(componentid));\n }\n }\n\n //TODO: Use this to render the device features\n\n //Check if JSON has features else mark\n if (Object.prototype.hasOwnProperty.call(json, \"features\")) {\n newDevice.__loadLayersFromInterchangeV1(json.layers);\n } else {\n //We need to add a default layer\n let newlayer = new Layer({}, \"flow\", LogicalLayerType.FLOW, \"0\", newDevice);\n newDevice.addLayer(newlayer);\n newlayer = new Layer({}, \"control\", LogicalLayerType.CONTROL, \"0\", newDevice);\n newDevice.addLayer(newlayer);\n }\n\n //Updating cross-references\n let features = newDevice.getAllFeaturesFromDevice();\n let feature;\n for (let i in features) {\n //console.log(\"Feature:\", features[i]);\n feature = features[i];\n if (feature.referenceID !== null) {\n newDevice.updateObjectReference(feature.referenceID, feature.ID);\n }\n }\n\n return newDevice;\n }\n\n /**\n * Set the X-Span Value\n * @param {number} value\n * @memberof Device\n * @returns {void}\n */\n setXSpan(value: number): void {\n this.__params.updateParameter(\"x-span\", value);\n }\n\n /**\n * Set the Y-Span Value\n * @param {number} value\n * @memberof Device\n * @returns {void}\n */\n setYSpan(value: number): void {\n this.__params.updateParameter(\"y-span\", value);\n }\n\n /**\n * Returns the X-Span Value\n * @return {number}\n * @memberof Device\n */\n getXSpan(): number {\n return this.__params.getValue(\"x-span\");\n }\n\n /**\n * Returns the Y-Span Value\n * @return {number}\n * @memberof Device\n */\n getYSpan(): number {\n return this.__params.getValue(\"y-span\");\n }\n\n /**\n * Create the layers necessary for creating a new level\n * @return {Array} Returns a the layer objects created\n * @memberof Device\n */\n createNewLayerBlock(layers: Array): void {\n for (let i in layers) {\n this.addLayer(layers[i]);\n }\n }\n\n /**\n * Deletes the layer defined by the index\n * @param {number} index\n * @memberof Device\n * @returns {void}\n */\n deleteLayer(index: number): void {\n let layer = this.__layers[index];\n for (let feature in layer.features) {\n this.removeFeature(layer.features[feature]);\n }\n if (index != -1) {\n this.__layers.splice(index, 1);\n }\n }\n\n /**\n * Returns the component identified by the id\n * @param {string} id ID of the feature to get the component\n * @return {Component|null}\n * @memberof Device\n */\n getComponentForFeatureID(id: string): Component | null {\n for (let i in this.__components) {\n let component = this.__components[i];\n //go through each component's features\n for (let j in component.featureIDs) {\n let featureid = component.featureIDs[j];\n if (featureid === id) {\n return component;\n }\n }\n }\n\n return null;\n }\n\n /**\n * Generates a new new name for the type, use this to autogenerate the names for components that are typespecific\n * @param {string} type\n * @return {string}\n * @memberof Device\n */\n generateNewName(type: string): string {\n let value: number | undefined = this.__nameMap.get(type);\n if (value != undefined) {\n this.__nameMap.set(type, value + 1);\n return type + \"_\" + String(value + 1);\n } else {\n this.__nameMap.set(type, 1);\n return type + \"_1\";\n }\n }\n\n /**\n * Returns a connection object corresponding to the ID\n * @param {String} id ID of feature to get the connection\n * @return {Connection|null}\n * @memberof Device\n */\n getConnectionForFeatureID(id: string): Connection | null {\n for (let i in this.__connections) {\n let connection = this.__connections[i];\n //go through each component's features\n for (let j in connection.featureIDs) {\n let featureid = connection.featureIDs[j];\n if (featureid === id) {\n return connection;\n }\n }\n }\n\n return null;\n }\n\n /**\n * Insert a connection between a valve component and the connection component\n * @param {Component} valve Valve object\n * @param {Connection} connection Connection object\n * @memberof Device\n * @returns {void}\n */\n insertValve(valve: Component, connection: Connection, valvetype: ValveType = ValveType.NORMALLY_OPEN): void {\n this.__valveMap.set(valve.id, connection.id);\n this.__valveTypeMap.set(valve.id, valvetype);\n }\n /**\n * Returns connections of the device\n * @returns {Connections} Connections object\n * @memberof Device\n */\n get connections(): Array {\n return this.__connections;\n }\n\n /**\n * Returns a list of valves mapped onto the connection\n * @param {Connection} connection Connection object\n * @return {Array}\n * @memberof Device\n */\n getValvesForConnection(connection: Connection): Array {\n let connectionid: string = connection.id;\n let ret: Array = [];\n for (let [key, value] of this.__valveMap) {\n // let = pair;\n if (connectionid === value) {\n let valve = this.getComponentByID(key);\n if (valve !== null) {\n ret.push(valve);\n }\n }\n }\n\n return ret;\n }\n\n /**\n * Returns whether or not the valve generates a break\n * @param {Component} valve Valve device\n * @return {any}\n * @memberof Device\n */\n getValveType(valve: Component): ValveType {\n\n let valveid = valve.id;\n let ret = this.__valveTypeMap.get(valveid);\n if (ret === undefined) {\n throw new Error(\"Valve not found\");\n }\n return ret;\n }\n\n /**\n * Returns component object that is identified by the given key\n * @param {String} key Key to the component\n * @return {Component}\n * @memberof Device\n */\n getComponentByID(key: string): Component | null {\n for (let i in this.__components) {\n let component = this.__components[i];\n if (component.id === key) {\n return component;\n }\n }\n return null;\n //throw new Error(\"Component with ID \" + key + \" does not exist\");\n }\n\n /**\n * Returns connection object which is identified by a given key\n * @param {String} key Key to identify the connection\n * @return {Connection}\n * @memberof Device\n */\n getConnectionByID(key: string): Connection | null {\n for (let i in this.__connections) {\n let connection = this.__connections[i];\n if (connection.id === key) {\n return connection;\n }\n }\n return null;\n //throw new Error(\"Connection with ID \" + key + \" does not exist\");\n }\n\n /**\n * Returns the component given by the user friendly name parameter. Returns null if nothing is found\n * @param {String} name\n * @return {Component|null}\n * @memberof Device\n */\n getComponentByName(name: string): Component {\n let components = this.__components;\n for (const component of components) {\n if (name == component.name) {\n return component;\n }\n }\n throw new Error(\"Component with name \" + name + \"does not exist\");\n }\n\n /**\n * Returns a list of connections that have not been routed yet\n * @return {Array}\n * @memberof Device\n */\n getUnroutedConnections(): Array {\n let ret: Array = [];\n let connections = this.__connections;\n for (const connection of connections) {\n if (!connection.routed) {\n ret.push(connection);\n }\n }\n return ret;\n }\n /**\n * Gets the position of the component port based depending which port you selected\n * @param {ComponentPort} componentport Component port object\n * @memberof Device\n * @returns {Array} Returns array with the absolute positions of the component port\n */\n getPositionOfComponentPort(componentport: ComponentPort): Point | undefined {\n let components: Array = this.__components;\n for (const component of components) {\n for (const key of component.ports.keys()) {\n let port: undefined | ComponentPort = component.ports.get(key);\n if (port != undefined) {\n if (componentport.id == port.id) {\n //Found the component so return the position\n return ComponentPort.calculateAbsolutePosition(componentport, component);\n }\n }\n }\n }\n }\n\n /**\n * This is the method that is called when one needs to make the feature object. The static function encapsulates\n * all the functionality that needs to be implemented.\n * @param {string} typeString\n * @param {string} setString\n * @param {} paramvalues\n * @param {string} name\n * @param {string} id\n * @param {} fabtype\n * @param {DXFObject} dxfdata\n * @return {EdgeFeature|Feature}\n * @memberof Device\n */\n static makeFeature(\n typeString: string,\n paramvalues: any,\n name: string = \"New Feature\",\n id: string | undefined = undefined,\n fabtype?: string,\n dxfdata?: Array | null\n ): Feature {\n let params: Params = new Params(new Map(), new Map(), new Map());\n\n if (typeString === \"EDGE\") {\n //TODO: Put in params initialization\n return new EdgeFeature(fabtype, params, id);\n }\n let featureType = ComponentAPI.getDefinition(typeString);\n if (paramvalues && featureType) {\n Feature.checkDefaults(paramvalues, featureType.heritable, ComponentAPI.getDefaultsForType(typeString));\n params = new Params(paramvalues, MapUtils.toMap(featureType.unique), MapUtils.toMap(featureType.heritable));\n } else {\n let unique: Map = new Map();\n params = new Params(paramvalues, unique.set(\"position\", \"Point\"), new Map());\n }\n\n let feature = new Feature(typeString, params, name, id);\n if (dxfdata) {\n for (let i = 0; i < dxfdata.length; i++) {\n feature.addDXFObject(DXFObject.fromJSON(dxfdata[i]));\n }\n }\n\n return feature;\n }\n\n get textLayers(): Array {\n return this.__textLayers;\n }\n}\n","import DXFObject from \"./dxfObject\";\nimport Device from \"./device\";\n\nimport Params from \"./params\";\nimport Template from \"../library/template\";\nimport Feature from \"./feature\";\nimport DeviceUtils from \"../utils/deviceUtils\";\nimport { ComponentAPI, LibraryEntryDefinition } from \"@/componentAPI\";\n\n/**\n * This class contains the component abstraction used in the interchange format and the\n * high level device model of the microfluidic.\n */\nexport default class CustomComponent extends Template {\n dxfData: any = null;\n protected _type: string = \"\";\n protected _entity: string = \"\";\n protected _renderData: any = null;\n protected _params: Params = new Params({}, new Map(), new Map());\n\n /**\n * Default constructor\n * @param {String} type Type of component\n * @param {DXFObject} dxfdata DXFObject\n * @param {String} mint Unique MINT identifier\n */\n constructor(type: string, dxfdata: any, mint: string = type.toUpperCase()) {\n super();\n // this.__params = params;\n this._type = type;\n this._entity = mint;\n this.dxfData = dxfdata;\n // this.__params = null;\n // this.__renderData = null;\n // This stores the features that are a part of the component\n // this.__features = [];\n // //TODO: Need to figure out how to effectively search through these\n // this.__bounds = null;\n }\n\n /**\n * Returns the entity type\n * @return {string}\n * @memberof CustomComponent\n */\n get entity(): string {\n return this._entity;\n }\n\n /**\n * Returns the type\n * @return {string}\n * @memberof CustomComponent\n */\n get type(): string {\n return this._type;\n }\n\n /**\n * Sets the rendering data\n * @param {} data\n * @memberof CustomComponent\n * @returns {void}\n */\n set renderData(data: any) {\n this._renderData = data;\n }\n\n /**\n * Generates a Feature that has all the corresponding respective data\n * @returns {Feature} Returns a feature based on the data\n * @memberof CustomComponent\n */\n generateComponent(): Feature {\n const paramvalues = {};\n const feature = Device.makeFeature(this.type, paramvalues, DeviceUtils.generateNewName(this.type), ComponentAPI.generateID(), \"XY\", this.dxfData);\n return feature;\n }\n\n /**\n * Generates the object that needs to be serialzed into JSON for interchange format V1\n * @returns {JSON} Object\n * @memberof CustomComponent\n */\n toJSON() {\n const dxfdata = [];\n for (const i in this.dxfData) {\n dxfdata.push(this.dxfData[i].getData());\n }\n\n const output = {\n type: this.type,\n entity: this.entity,\n params: this._params.toJSON(),\n dxfData: dxfdata\n };\n return output;\n }\n\n /**\n * This method is used to import the component from Interchange V1 JSON\n * @param json\n * @returns {CustomComponent}\n * @memberof CustomComponent\n */\n static fromInterchangeV1(json: any) {\n const dxfdata = [];\n for (const i in json.dxfData) {\n dxfdata.push(new DXFObject(json.dxfData[i]));\n }\n\n // TODO: This will have to change soon when the thing is updated\n const ret = new CustomComponent(json.type, dxfdata, json.entity);\n // ret.renderData = json.renderData;\n // let render = DXFRenderer.renderDXFObjects(dxfdata);\n // ret.renderData = render.exportSVG();\n return ret;\n }\n\n /**\n * Contains the default parameters\n * @returns {Object} Returns an Object containing the default parameters\n * @memberof CustomComponent\n */\n static defaultParameterDefinitions(): LibraryEntryDefinition {\n const params = {\n unique: {\n position: \"Point\"\n },\n heritable: {\n rotation: \"Float\",\n // \"x-scale\": \"Float\",\n // \"width\": \"Float\",\n height: \"Float\"\n },\n units: {\n rotation: \"°\",\n // \"length\": \"μm\",\n // \"width\": \"μm\",\n height: \"μm\"\n },\n defaults: {\n rotation: 0,\n // \"width\": 1.23 * 1000,\n // \"length\": 4.92 * 1000,\n height: 0.1 * 1000\n },\n minimum: {\n rotation: 0,\n // \"width\": 30,\n // \"length\": 120,\n height: 1\n },\n maximum: {\n rotation: 359,\n // \"width\": 6000,\n // \"length\": 24 * 1000,\n height: 1200\n },\n mint: \"\"\n };\n return params;\n }\n}\n","import EventEmitter from \"eventemitter3\";\n\nclass EventBus extends EventEmitter {\n private static instance: EventBus | null = null;\n\n static get(): EventBus {\n if (EventBus.instance === null) {\n EventBus.instance = new EventBus();\n }\n return EventBus.instance;\n }\n\n static NAVBAR_SCROLL_EVENT = \"navbar_scroll_event\";\n static SHOW_COMPONENT_PARAMS = \"show_component_params_event\";\n static SHOW_CONNECTION_PARAMS = \"show_connection_params_event\";\n static UPDATE_GRID_SIZE = \"update_grid_size\";\n static EDIT_CONNECTION = \"edit_connection\";\n static DBL_CLICK_COMPONENT = \"dbl_click_component\";\n static DBL_CLICK_ELEMENT = \"dbl_click_element\";\n static DBL_CLICK_CONNECTION = \"dbl_click_connection\";\n static DBL_CLICK_FEATURE = \"dbl_click_connection\";\n static UPDATE_RENDERS = \"update_renders\";\n static RIGHT_CLICK = \"right_click\";\n static CLOSE_ALL_WINDOWS = \"close_all_windows\";\n static UPDATE_ZOOM = \"update_zoom\";\n}\n\nexport default EventBus;\n","import Registry from \"@/app/core/registry\";\nimport Feature from \"@/app/core/feature\";\nimport Layer from \"@/app/core/layer\";\nimport RenderLayer from \"@/app/view/renderLayer\";\nimport { LogicalLayerType } from \"@/app/core/init\";\n\nexport default class FeatureUtils {\n /**\n * Determines substrate from layer index and susbtrate offset\n * @return {number}\n * @memberof FeatureUtils\n */\n static setSubstrate(feature: Feature, offset: string): number {\n let substrate: number;\n let layer: Layer | null = feature.layer;\n if (layer === null) {\n throw new Error(\"Layer never set for feature \" + feature.ID);\n } else if (Registry.currentDevice === null) {\n throw new Error(\"Current device has not been set in registry\");\n }\n\n if (layer.type == LogicalLayerType.FLOW) {\n if (offset.includes(\"-\")) {\n substrate = ~~(Registry.currentDevice.layers.indexOf(layer) / 3) - parseInt(offset);\n } else {\n substrate = ~~(Registry.currentDevice.layers.indexOf(layer) / 3) + parseInt(offset);\n }\n } else if (layer.type == LogicalLayerType.CONTROL) {\n if (offset.includes(\"-\")) {\n substrate = ~~(Registry.currentDevice.layers.indexOf(layer) / 3) - parseInt(offset);\n } else if (offset != \"0\") {\n substrate = ~~(Registry.currentDevice.layers.indexOf(layer) / 3) + parseInt(offset);\n } else {\n substrate = ~~(Registry.currentDevice.layers.indexOf(layer) / 3) + 1;\n }\n } else if (layer.type == LogicalLayerType.INTEGRATION) {\n if (offset.includes(\"-\")) {\n substrate = ~~(Registry.currentDevice.layers.indexOf(layer) / 3) - parseInt(offset);\n } else {\n substrate = ~~(Registry.currentDevice.layers.indexOf(layer) / 3) + parseInt(offset);\n }\n } else {\n throw new Error(\"Layer type\" + layer.type + \"not recognized\");\n }\n return substrate;\n }\n}\n","import CustomComponent from \"./customComponent\";\nimport Params from \"./params\";\nimport Device from \"./device\";\nimport Layer from \"./layer\";\nimport DXFObject from \"./dxfObject\";\nimport { ComponentAPI } from \"@/componentAPI\";\nimport MapUtils from \"../utils/mapUtils\";\nimport { FeatureInterchangeV1_2, LogicalLayerType } from \"./init\";\nimport Parameter from \"./parameter\";\nimport EventBus from \"@/events/events\";\nimport RenderLayer from \"../view/renderLayer\";\nimport { DFMType, ManufacturingInfo } from \"../manufacturing/manufacturingInfo\";\nimport FeatureUtils from \"@/app/utils/featureUtils\";\n\n/**\n * Feature class\n */\nexport default class Feature {\n protected _type: string;\n protected _params: Params;\n protected _name: string;\n protected _id: string;\n protected _fabtype: DFMType;\n protected _dxfObjects: Array;\n protected _referenceID: string | null;\n public layer: Layer | null;\n protected _manufacturingInfo: ManufacturingInfo;\n\n /**\n * Feature Object\n * @param {String} type\n * @param {} set\n * @param {Params} params\n * @param {String} name\n * @param {String} id\n * @param {} fabtype\n */\n constructor(type: string, params: Params, name: string, id: string = ComponentAPI.generateID(), fabtype: DFMType = DFMType.XY) {\n this._type = type;\n this._params = params;\n this._name = name;\n this._id = id;\n this._type = type;\n this._fabtype = fabtype;\n this._dxfObjects = [];\n this._referenceID = null;\n this.layer = null;\n const tempRenderName: string = this.deriveRenderName();\n let modifierName: string;\n if (this.type == \"Port\") modifierName = \"PORT\";\n else modifierName = \"COMPONENT\";\n console.log(\"rendName: \", tempRenderName);\n console.log(\"z-offset-key: \", ComponentAPI.library[this.type].object.zOffsetKey(tempRenderName));\n this._manufacturingInfo = {\n fabtype: fabtype,\n layertype: null,\n rendername: tempRenderName,\n z_offset_key: ComponentAPI.library[this.type].object.zOffsetKey(tempRenderName),\n depth: this.getValue(ComponentAPI.library[this.type].object.zOffsetKey(tempRenderName)),\n substrate_offset: ComponentAPI.library[this.type].object.substrateOffset(tempRenderName),\n substrate: null,\n modifier: modifierName\n };\n }\n\n get id(): string {\n return this._id;\n }\n \n get type(): string {\n return this._type;\n }\n\n /**\n * Returns the reference object id\n * @return {String}\n * @memberof Feature\n */\n get referenceID(): string | null {\n return this._referenceID;\n }\n\n /**\n * Sets the reference object id\n * @param {} value\n * @memberof Feature\n * @returns {void}\n * @private\n */\n set referenceID(value: string | null) {\n this._referenceID = value;\n }\n\n /**\n * Sets dxf object\n * @param {} dxfdata\n * @memberof Feature\n * @returns {void}\n */\n set dxfObjects(dxfdata: Array) {\n this._dxfObjects = dxfdata;\n }\n\n /**\n * Returns a string that describes the fabrication type\n * @return {DFMType|*}\n * @memberof Feature\n */\n get fabType(): DFMType {\n return this._fabtype;\n }\n\n /**\n * Returns the manufacturing information\n * @return {ManufacturingInfo}\n * @memberof Feature\n */\n get manufacturingInfo(): ManufacturingInfo {\n this.setManufacturingInfoLayer();\n return this._manufacturingInfo;\n }\n\n /**\n * Ensures that layer and substrate values in manufacturingInfo have been set\n * @return {void}\n * @memberof Feature\n */\n setManufacturingInfoLayer(): void {\n this._manufacturingInfo.depth = this.getValue(ComponentAPI.library[this.type].object.zOffsetKey(this.deriveRenderName()));\n if (this.layer !== null) {\n this._manufacturingInfo.layertype = this.layer.type;\n this._manufacturingInfo.substrate = FeatureUtils.setSubstrate(this, this._manufacturingInfo.substrate_offset);\n } else {\n throw new Error(\"Layer not set in feature \" + this.ID + \" so manufacturingInfo cannot be set\");\n }\n }\n\n /**\n * Updates the parameter stored for the given key\n * @param {String} key Key to identify the parameter\n * @param {} value New value to be assigned to the parameter\n * @memberof Feature\n * @returns {void}\n */\n updateParameter(key: string, value: any): void {\n this._params.updateParameter(key, value);\n EventBus.get().emit(EventBus.UPDATE_RENDERS, this);\n }\n\n /**\n * Generates the serial version of this object\n * @returns {Feature} Returns Feature object in JSON format\n * @memberof Feature\n */\n toJSON() {\n const output = {\n id: this._id,\n name: this._name,\n type: this._type,\n params: this._params.toJSON()\n };\n\n return output;\n }\n\n /**\n * Generates the serial version of this object but conforms to the interchange format\n * @returns {}\n * @memberof Feature\n */\n toInterchangeV1(): FeatureInterchangeV1_2 {\n // TODO: We need to figure out what to do and what the final feature format will be\n const output = {\n id: this._id,\n name: this._name,\n macro: this._type,\n params: this._params.toJSON(),\n type: this._fabtype,\n referenceID: this._referenceID,\n dxfData: this._dxfObjects.map(function(dxfObject) {\n return dxfObject.toJSON();\n }),\n layerID: this.layer?.id ?? \"\",\n };\n return output;\n }\n\n /**\n * Gets dxfObject\n * @returns {DXFObject}\n * @memberof Feature\n */\n get dxfObjects() {\n return this._dxfObjects;\n }\n\n /**\n * Gets the ID of the object\n * @returns {String} Returns the ID\n * @memberof Feature\n */\n get ID() {\n return this._id;\n }\n\n /**\n * Set the name of the object\n * @param {String} name\n * @memberof Feature\n * @returns {void}\n */\n setName(name: string): void {\n this._name = name;\n }\n\n /**\n * Gets the name of the feature object\n * @returns {String} Returns the name of the feature object\n * @memberof Feature\n *\n */\n getName(): string {\n return this._name;\n }\n\n /**\n * Gets type of the feature object\n * @returns {String} Returns the type of the object\n * @memberof Feature\n */\n getType(): string {\n return this._type;\n }\n\n /**\n * Gets the value of certain feature by passing a key identifier\n * @param {String} key Key is use to identify the desire feature\n * @returns {} Returns the value of the parameters\n * @memberof Feature\n */\n getValue(key: string) {\n try {\n return this._params.getValue(key);\n } catch (err) {\n if (this.hasDefaultParam(key)) return this.getDefaults()[key];\n else throw new Error(\"Unable to get value for key: \" + key);\n }\n }\n\n /**\n * Checks if the feature object corresponding to the key passed has default parameters.\n * @param {String} key\n * @returns {boolean} Returns true if it has default parameters\n * @memberof Feature\n */\n hasDefaultParam(key: string): boolean {\n if (this.getDefaults().hasOwnProperty(key)) return true;\n else return false;\n }\n\n /**\n * Checks if the feature object has unique parameters. To select object, a key identifier is requiered\n * @param {String} key\n * @returns {boolean}\n * @memberof Feature\n */\n hasUniqueParam(key: string): boolean {\n return this._params.isUnique(key);\n }\n\n /**\n * Checks if the feature object has heritable parameters. To select object, a key identifier is requiered\n * @param {String} key\n * @returns {boolean}\n * @memberof Feature\n */\n hasHeritableParam(key: string): boolean {\n return this._params.isHeritable(key);\n }\n\n /**\n * Gets the heritable parameters of the feature object\n * @returns {Array} Returns the heritable parameters of the feature object\n * @memberof Feature\n */\n getHeritableParams(): { [key: string]: string } {\n return ComponentAPI.getHeritableForType(this.getType());\n }\n\n /**\n * Gets the unique parameters of the feature object\n * @returns {Array} Returns the unique parameters of the feature object\n * @memberof Feature\n */\n getUniqueParams(): { [key: string]: string } {\n return ComponentAPI.getUniqueForType(this.getType());\n }\n\n /**\n * Gets the default parameters of the feature object\n * @returns {Array} Returns the default paramets of the feature object\n * @memberof Feature\n */\n getDefaults(): { [key: string]: number } {\n return ComponentAPI.getDefaultsForType(this.getType());\n }\n\n /**\n * Gets the parameters of the feature object\n * @returns {Array} Returns the parameters of the feature object\n * @memberof Feature\n */\n getParams(): { [index: string]: Parameter } {\n return this._params.parameters;\n }\n\n /**\n * Sets the passed parameter as a parameter of the feature object\n * @param {Params} params New parameter to the object\n * @memberof Feature\n * @returns {void}\n */\n setParams(params: { [index: string]: Parameter }): void {\n this._params.loadParameters(params);\n }\n\n /**\n * Replicates the position\n * @param {Number} xpos X coordinate to replicate\n * @param {Number} ypos Y coordinate to replicate\n * @returns {Feature}\n * @memberof Feature\n */\n replicate(xpos: number, ypos: number): Feature {\n const paramscopy = this._params;\n const replicaparams: { [key: string]: any } = {\n position: [xpos, ypos]\n };\n for (const key in this._params.parameters) {\n replicaparams[key] = this.getValue(key);\n }\n\n const ret = Device.makeFeature(\n this._type,\n replicaparams,\n this._name,\n ComponentAPI.generateID(),\n \"XY\",\n this._dxfObjects.map(function(dxfObject) {\n return dxfObject.toJSON();\n })\n );\n\n return ret;\n }\n\n /**\n * Determines the string which should be used for the renderName\n * @returns Returns the render name\n * @memberof Feature\n */\n\n deriveRenderName(): string {\n if (!ComponentAPI.library[this.type]) {\n console.error(\"Type unrecognized, defaulting to template.\");\n this._type = \"Template\";\n }\n return ComponentAPI.library[this.type].key;\n }\n\n /**\n * Checks whether the values do not have an own property and assigns them a default value.\n * @param {*} values\n * @param {*} heritable\n * @param {*} defaults\n * @returns Returns the values\n * @memberof Feature\n */\n static checkDefaults(values: { [key: string]: number }, heritable: { [key: string]: string }, defaults: { [key: string]: number }) {\n for (const key in heritable) {\n if (!Object.prototype.hasOwnProperty.call(values, key)) values[key] = defaults[key];\n }\n return values;\n }\n\n /**\n * Loads from JSON format the features for a device\n * @param {JSON} json\n * @returns {Feature} Returns a Device object with the features in the JSON\n * @memberof Feature\n */\n static fromJSON(json: any) {\n return Device.makeFeature(json.type, json.params, json.name, json.id, \"XY\", []);\n }\n\n /**\n * Loads from an InetchangeV1 format the features for a device object\n * @param {*} json\n * @returns {Feature}\n * @memberof Feature\n */\n static fromInterchangeV1(json: any) {\n let ret;\n // TODO: This will have to change soon when the thing is updated\n ret = Device.makeFeature(json.macro, json.params, json.name, json.id, json.type, json.dxfData);\n if (Object.prototype.hasOwnProperty.call(json, \"referenceID\")) {\n ret.referenceID = json.referenceID;\n // Registry.currentDevice.updateObjectReference(json.id, json.referenceID);\n }\n return ret;\n }\n\n /**\n * Creates a custom feature for the component based on the parameters values\n * @returns {Feature} Returns a new feature object\n * @memberof Feature\n */\n static makeCustomComponentFeature(customcomponent: CustomComponent, setstring: string, paramvalues: { [key: string]: any }, name = \"New Feature\", id = undefined) {\n const definitions = CustomComponent.defaultParameterDefinitions();\n Feature.checkDefaults(paramvalues, definitions.heritable, ComponentAPI.getDefaultsForType(customcomponent.type));\n const params = new Params(paramvalues, MapUtils.toMap(definitions.unique), MapUtils.toMap(definitions.heritable));\n const ret = new Feature(customcomponent.type, params, name, id, DFMType.XY);\n ret.dxfObjects = customcomponent.dxfData;\n return ret;\n }\n\n /**\n * Returns the dxf objects\n * @return {DXFObject}\n * @memberof Feature\n */\n getDXFObjects(): Array {\n return this._dxfObjects;\n }\n\n /**\n * Add a DXF object\n * @param {DXFObject} dxfobject\n * @memberof Feature\n * @returns {void}\n */\n addDXFObject(dxfobject: DXFObject): void {\n this._dxfObjects.push(dxfobject);\n }\n}\n","import { ComponentAPI } from \"@/componentAPI\";\nimport { DFMType } from \"@/app/manufacturing/manufacturingInfo\";\nimport DXFObject from \"./dxfObject\";\n\nimport Feature from \"./feature\";\nimport Params from \"./params\";\n\n/**\n * Edge Feature class\n */\nexport default class EdgeFeature extends Feature {\n protected _edgeObjects: any;\n\n /**\n * Default constructor for the edge feature\n * @param {Object} edgeObjects\n * @param {Params} params\n * @param {String} id\n */\n constructor(edgeObjects: any, params: Params, id = ComponentAPI.generateID()) {\n super(\"EDGE\", params, id, id, DFMType.EDGE);\n if (edgeObjects) {\n this._edgeObjects = edgeObjects;\n } else {\n this._edgeObjects = [];\n }\n }\n\n /**\n * Generate a rectangular edge for the device\n * @param {Number} xspan X coordinate\n * @param {Number} yspan Y coordinate\n * @memberof EdgeFeature\n * @returns {void}\n */\n generateRectEdge(xspan: number, yspan: number): void {\n // TODO: Fix this by trying to incorporate a system where the unit is given\n xspan /= 1000;\n yspan /= 1000;\n const object = new DXFObject({\n type: \"POLYLINE\",\n vertices: [\n {\n x: 0,\n y: 0,\n z: 0\n },\n {\n x: xspan,\n y: 0,\n z: 0\n },\n {\n x: xspan,\n y: yspan,\n z: 0\n },\n {\n x: 0,\n y: yspan,\n z: 0\n },\n {\n x: 0,\n y: 0,\n z: 0\n }\n ]\n });\n\n this.addDXFObject(object);\n }\n}\n","import paper from \"paper\";\nimport {SymbolDefinition} from \"paper\";\nimport AdaptiveGrid from \"../grid/adaptiveGrid\";\n\nexport default class GridRenderer {\n static renderGrid(grid: AdaptiveGrid) {\n // con\n const gridGroup = new paper.Group();\n gridGroup.addChild(GridRenderer.makeHorizontalLines(grid));\n gridGroup.addChild(GridRenderer.makeVerticalLines(grid));\n return gridGroup;\n }\n\n static vertLineSymbol(width: number, color: paper.Color) {\n return GridRenderer.lineSymbol(paper.view.bounds.topLeft, paper.view.bounds.bottomLeft, width, color);\n }\n\n static horizLineSymbol(width: number, color: paper.Color) {\n return GridRenderer.lineSymbol(paper.view.bounds.topLeft, paper.view.bounds.topRight, width, color);\n }\n\n static lineSymbol(start: paper.Point, end: paper.Point, width: number, color: paper.Color) {\n color.alpha = 0.25;\n const line = new paper.Path.Line({\n from: start,\n to: end,\n strokeWidth: width,\n strokeColor: color\n });\n // line.strokeColor.alpha = 0.25;\n line.remove();\n return new paper.SymbolDefinition(line);\n }\n\n static isThick(val: number, origin: number, spacing:number, thickCount:number) {\n const diff = Math.abs(val - origin);\n const remainder = diff % (spacing * thickCount);\n if (remainder < spacing) {\n return true;\n } else return false;\n }\n\n static makeVerticalLines(grid: AdaptiveGrid) {\n const spacing = grid.getSpacing();\n const sym = GridRenderer.vertLineSymbol(grid.getThinWidth(), grid.color);\n const thickSym = GridRenderer.vertLineSymbol(grid.getThickWidth(), grid.color);\n const start = paper.view.bounds.topLeft;\n const end = paper.view.bounds.topRight;\n const height = paper.view.bounds.height;\n const group = new paper.Group();\n\n const startX = Math.floor((start.x - grid.origin.x) / spacing) * spacing + grid.origin.x;\n\n for (let i = startX; i < end.x; i += spacing) {\n const pos = new paper.Point(i, start.y + height / 2);\n if (GridRenderer.isThick(i, grid.origin.x, spacing, grid.thickCount)) group.addChild(thickSym.place(pos));\n else group.addChild(sym.place(pos));\n }\n\n for (let i = startX; i >= end.x; i -= spacing) {\n const pos = new paper.Point(i, start.y + height / 2);\n if (GridRenderer.isThick(i, grid.origin.x, spacing, grid.thickCount)) group.addChild(thickSym.place(pos));\n else group.addChild(sym.place(pos));\n }\n return group;\n }\n\n static makeHorizontalLines(grid: AdaptiveGrid) {\n const spacing = grid.getSpacing();\n const sym = GridRenderer.horizLineSymbol(grid.getThinWidth(), grid.color);\n const thickSym = GridRenderer.horizLineSymbol(grid.getThickWidth(), grid.color);\n const start = paper.view.bounds.topLeft;\n const end = paper.view.bounds.bottomLeft;\n const width = paper.view.bounds.width;\n const group = new paper.Group();\n\n const startY = Math.floor((start.y - grid.origin.y) / spacing) * spacing + grid.origin.y;\n\n for (let i = startY; i < end.y; i += spacing) {\n const pos = new paper.Point(start.x + width / 2, i);\n if (GridRenderer.isThick(i, grid.origin.y, spacing, grid.thickCount)) group.addChild(thickSym.place(pos));\n else group.addChild(sym.place(pos));\n }\n\n for (let i = startY; i >= end.y; i -= spacing) {\n const pos = new paper.Point(start.x + width / 2, i);\n if (GridRenderer.isThick(i, grid.origin.y, spacing, grid.thickCount)) group.addChild(thickSym.place(pos));\n else group.addChild(sym.place(pos));\n }\n return group;\n }\n}\n","import * as Colors from \"../colors\"; // pixels\nimport paper from \"paper\";\nimport Device from \"@/app/core/device\";\nconst DEFAULT_STROKE_COLOR = Colors.GREY_700;\nconst BORDER_THICKNESS = 5;\n\nexport default class DeviceRenderer {\n static renderLayerMask(device: Device) {\n const width = device.getXSpan();\n const height = device.getYSpan();\n let fillColor = new paper.Color(Colors.WHITE);\n fillColor.alpha = 0.5;\n const mask = new paper.Path.Rectangle({\n from: new paper.Point(0, 0),\n to: new paper.Point(width, height),\n fillColor: fillColor,\n strokeColor: null\n });\n return mask;\n }\n\n static renderDevice(device: Device, strokeColor = DEFAULT_STROKE_COLOR) {\n const background = new paper.Path.Rectangle({\n from: paper.view.bounds.topLeft.subtract(new paper.Point(paper.view.size)),\n to: paper.view.bounds.bottomRight.add(new paper.Point(paper.view.size)),\n fillColor: new paper.Color(Colors.BLUE_50),\n strokeColor: null\n });\n const thickness = BORDER_THICKNESS / paper.view.zoom;\n const xspan = device.getXSpan();\n const yspan = device.getYSpan();\n const border = new paper.Path.Rectangle({\n from: new paper.Point(0, 0),\n to: new paper.Point(xspan, yspan),\n fillColor: Colors.WHITE,\n strokeColor: strokeColor,\n strokeWidth: thickness\n });\n\n const group = new paper.Group([background, border]);\n\n return group;\n }\n}\n","import { PaperView } from \"..\";\n\n/**\n * Pan and Zoom class\n */\nexport default class PanAndZoom {\n view: PaperView;\n\n /**\n * Default Constructor for the PanAndZoom object\n * @param {*} paperView\n */\n constructor(paperView: PaperView) {\n this.view = paperView;\n }\n\n /**\n * Sets a zoom value to a certain position\n * @param {number} zoom Zoom value\n * @param {Array} position X and Y coordinates\n * @returns {void}\n * @memberof PanAndZoom\n */\n stableZoom(zoom: number, position: paper.Point): void {\n const newZoom = zoom;\n const p = position;\n const c = this.view.getCenter();\n const beta = this.view.getZoom() / newZoom;\n const pc = p.subtract(c);\n const a = p.subtract(pc.multiply(beta)).subtract(c);\n this.view.setCenter(this.view.getCenter().add(a));\n this.view.setZoom(newZoom);\n }\n\n /**\n * Adjust the zoom and the position\n * @param {number} delta Value of adjustment of the zoom value\n * @param {Array} position X and Y coordinates\n * @returns {void}\n * @memberof PanAndZoom\n */\n adjustZoom(delta: number, position: paper.Point): void {\n this.stableZoom(this.calcZoom(delta), position);\n }\n\n // Stable pan and zoom modified from: http://matthiasberth.com/articles/stable-zoom-and-pan-in-paperjs/\n /**\n * Calculates the zoom\n * @param {number} delta Value of adjustment of the zoom value\n * @param {number} multiplier Default = 1.177827941003\n * @returns {number}\n * @memberof PanAndZoom\n */\n calcZoom(delta: number, multiplier = 1.177827941003): number {\n if (delta < 0) return this.view.getZoom() * multiplier;\n else if (delta > 0) return this.view.getZoom() / multiplier;\n else return this.view.getZoom();\n }\n\n /**\n * Updates the center coordinates\n * @param {number} delta Value of adjustment of the zoom value\n * @returns {void}\n * @memberof PanAndZoom\n */\n moveCenter(delta: paper.Point): void {\n this.view.setCenter(this.calcCenter(delta));\n }\n\n /**\n * Calculates the new center position\n * @param {number} delta Value of adjustment of the zoom value\n * @returns {Array} Returns and array with X and Y coordinates\n * @memberof PanAndZoom\n */\n calcCenter(delta: paper.Point): paper.Point {\n return this.view.getCenter().subtract(delta);\n }\n}\n","import paper from \"paper\";\nimport * as FeatureRenderer2D from \"../view/render2D/featureRenderer2D\";\nimport Registry from \"../core/registry\";\nimport Feature from \"../core/feature\";\nimport Device from \"../core/device\";\nimport { PaperView } from \"..\";\nimport { ToolPaperObject } from \"../core/init\";\n\n/**\n * Manufacturing Layer class\n */\nexport default class ManufacturingLayer {\n __features: Array;\n __name: string;\n __paperGroup: paper.Group;\n __flip: boolean;\n\n /**\n * Default Constructor for the Manufacturing Layer\n * @param {String} name Name of the field\n */\n constructor(name: string, flip = false) {\n this.__features = [];\n this.__name = name;\n this.__paperGroup = new paper.Group();\n this.__flip = flip;\n }\n\n /**\n * Returns the name field\n * @return {String} Returns the name of the field\n * @memberof ManufacturingLayer\n */\n get name(): string {\n return this.__name;\n }\n\n /**\n * Returns the flip property\n * @return {boolean} Returns a boolean representing whether the manufacturing layer should be flipped\n * @memberof ManufacturingLayer\n */\n get flip(): boolean {\n return this.__flip;\n }\n\n /**\n * Adds a feature to the manufacturing layer\n * @param {Feature} feature Feature to add to the layer\n * @memberof ManufacturingLayer\n * @returns {boolean}\n */\n addFeature(feature: ToolPaperObject): boolean {\n if (feature === null || undefined === feature) {\n return false;\n }\n const copy: ToolPaperObject = feature.clone();\n console.log(\"Copied feature\", copy);\n this.__features.push(copy);\n\n this.__paperGroup.addChild(copy);\n return true;\n }\n\n /**\n * Generates the paperjs render for a feature that has no render displayed on the canvas\n * and hence cannot get the render out of display set.\n * @param feature\n * @param renderkey\n * @returns {boolean}\n * @memberof ManufacturingLayer\n */\n generateFeatureRender(feature: Feature, renderkey: string | null): boolean {\n console.log(\"Generating Render for invisible feature\", feature);\n\n const render: ToolPaperObject = FeatureRenderer2D.renderFeature(feature, renderkey);\n this.__features.push(render);\n\n this.__paperGroup.addChild(render);\n return true;\n }\n\n /**\n * Flips the manufacturing layer in X-Axis\n * @memberof ManufacturingLayer\n * @returns {void}\n */\n flipX(): void {\n // console.warn(\"Implement method to flip the the group\");\n /*\n Step 2 - Flip the whole godamn thing\n */\n const currentDevice: Device | null = Registry.currentDevice;\n if (currentDevice !== null) {\n const yspan = currentDevice.getYSpan();\n const xspan = currentDevice.getXSpan();\n\n console.log(\"Flipping stuff:\", xspan, yspan);\n\n const center = new paper.Point(xspan / 2, yspan / 2);\n\n this.__paperGroup.scale(-1, 1, center);\n }\n }\n\n /**\n * Returns the SVG text\n * @return {string}\n * @memberof ManufacturingLayer\n */\n exportToSVG(): string {\n const currentDevice: Device | null = Registry.currentDevice;\n if (currentDevice !== null) {\n const yspan = currentDevice.getYSpan();\n const xspan = currentDevice.getXSpan();\n let svgtext = this.__paperGroup.exportSVG({ asString: true });\n svgtext = ManufacturingLayer.generateSVGTextPrepend(xspan, yspan) + svgtext + ManufacturingLayer.generateSVGTextAppend();\n return svgtext;\n } else {\n throw new Error(\"Registry.currentDevice is null\");\n }\n }\n\n /**\n * @memberof ManufacturingLayer\n * @returns {void}\n */\n flushData(): void {\n this.__paperGroup.removeChildren();\n }\n\n /**\n * Generates the SVG Prepend\n * @param {number} xspan\n * @param {number} yspan\n * @return {string}\n * @memberof ManufacturingLayer\n */\n static generateSVGTextPrepend(xspan: number, yspan: number): string {\n const text = `\";\n }\n}\n","import Connection from \"@/app/core/connection\";\nimport { Point } from \"@/app/core/init\";\nimport paper from \"paper\";\nimport Device from \"@/app/core/device\";\n\nexport default class RatsNestRenderer2D {\n static renderRatsNest(connectionlist: Array, device: Device) {\n const ratsnestgroup = new paper.Group();\n let start, end, sink, render, sourceid, sinkid;\n for (const i in connectionlist) {\n const connection = connectionlist[i];\n const source = connection.source;\n if (source === null) {\n console.error(`source ${connection.id} is null, cannot render rats nest`);\n continue;\n }\n const sinks = connection.sinks;\n // console.log(\"Sinks\", sinks, sinks.length);\n for (const ii in sinks) {\n sink = sinks[ii];\n const startcomponent = source.component;\n const endcomponent = sink.component;\n start = startcomponent.getCenterPosition();\n end = endcomponent.getCenterPosition();\n // console.log(start, end);\n render = RatsNestRenderer2D.renderRatsNestConnection(start, end);\n ratsnestgroup.addChild(render);\n }\n }\n\n return ratsnestgroup;\n }\n\n static renderRatsNestConnection(start: Point, end: Point) {\n const vstart = new paper.Point(start[0], start[1]);\n const vend = new paper.Point(end[0], end[1]);\n\n const vpath = new paper.Path([vstart, vend]);\n\n vpath.strokeColor = new paper.Color(\"#696965\");\n vpath.strokeWidth = 500;\n vpath.strokeCap = \"round\";\n\n vpath.dashArray = [1000, 1300];\n return vpath;\n }\n}\n","import * as Colors from \"../colors\";\nimport paper from \"paper\";\nimport Registry from \"../../core/registry\";\nimport Component from \"@/app/core/component\";\nimport ComponentPort from \"@/app/core/componentPort\";\nimport { Point } from \"@/app/core/init\";\n\nexport default class ComponentPortRenderer2D {\n static renderComponentPort(componentport: ComponentPort, draworigin: Point, rotation: number, portrendersize: number = 500) {\n const xpos = draworigin[0];\n const ypos = draworigin[1];\n const point = new paper.Point(xpos + componentport.x, ypos + componentport.y);\n\n const circle = new paper.Path.Circle(point, portrendersize);\n\n circle.rotate(rotation, new paper.Point(draworigin[0], draworigin[1]));\n\n circle.fillColor = new paper.Color(Colors.BLACK);\n\n return circle;\n }\n\n static getSizeforZoomLevel() {\n const zoomlevel = paper.view.zoom;\n let ret = 5 / zoomlevel;\n if (ret > 500) {\n ret = 500;\n }\n return ret;\n }\n\n static renderComponentPorts(component: Component) {\n const rendersize = ComponentPortRenderer2D.getSizeforZoomLevel();\n const componentports = component.ports;\n const ret = [];\n const rotation = component.getRotation();\n const currPos = component.getValue(\"position\");\n component.setOffset();\n const position: Point = [currPos[0] - component.offset[0], currPos[1] - component.offset[1]];\n for (const key of componentports.keys()) {\n const componentport = componentports.get(key);\n if (componentport === undefined) {\n console.error(`component ${component.id} has no port ${key}`);\n continue;\n }\n const render = ComponentPortRenderer2D.renderComponentPort(componentport, position, rotation, rendersize);\n // TODO - Figure out how to fix this or keep track of this\n // render[\"renderid\"] = componentport.id;\n component.attachComponentPortRender(key, render);\n ret.push(render);\n }\n return ret;\n }\n}\n","import Component from \"@/app/core/component\";\nimport { Point } from \"paper/dist/paper-core\";\nimport ViewManager from \"../viewManager\";\nimport ComponentPortRenderer2D from \"./componentPortRenderer2D\";\n\nexport default class PaperComponentPortView {\n\n private _viewManagerDelegate: ViewManager;\n private _componentAndRenderMap: Map>;\n private _activeRenders: Array;\n private _paperlayer: paper.Group;\n private _enabled: boolean;\n\n constructor(paperlayer: paper.Group, viewmanager: ViewManager) {\n this._paperlayer = paperlayer;\n this._componentAndRenderMap = new Map();\n this._activeRenders = [];\n this._viewManagerDelegate = viewmanager;\n this._enabled = true;\n }\n\n addComponentPortElements(component: Component) {\n const zfactor = 1;\n if (!this._componentAndRenderMap.has(component.id)) {\n this._componentAndRenderMap.set(component.id, []);\n }\n\n const componentportrenders = this._componentAndRenderMap.get(component.id);\n\n if (componentportrenders === undefined) {\n console.error(`component ${component.id} has no port renders`);\n return;\n }\n\n for (const key of component.ports.keys()) {\n const componentport = component.ports.get(key);\n if (componentport === undefined) {\n console.error(`component ${component.id} has no port ${key}`);\n continue;\n }\n // TODO - Fix this API\n const render = ComponentPortRenderer2D.renderComponentPort(componentport, [0,0], 0, zfactor);\n componentportrenders.push(render);\n }\n }\n\n updateRenders() {\n if(this._viewManagerDelegate.currentDevice === null){\n console.error(\"No device selected, not rendering component ports\");\n return;\n }\n\n if (!this._enabled) {\n this.clearActiveRenders();\n return;\n }\n this.clearActiveRenders();\n const components = this._viewManagerDelegate.currentDevice.components;\n for (const i in components) {\n const component = components[i];\n const renders = ComponentPortRenderer2D.renderComponentPorts(component);\n for (const j in renders) {\n this._activeRenders.push(renders[j]);\n this._paperlayer.addChild(renders[j]);\n }\n }\n }\n\n clearActiveRenders() {\n if (!this._enabled) {\n return;\n }\n if (this._activeRenders) {\n for (const i in this._activeRenders) {\n this._activeRenders[i].remove();\n }\n }\n\n this._activeRenders = [];\n }\n\n enable() {\n this._enabled = true;\n }\n\n disable() {\n this.clearActiveRenders();\n this._enabled = false;\n }\n}\n","import Parameter from \"../core/parameter\";\nimport { ComponentAPI } from \"@/componentAPI\";\n\nexport default class UIElement {\n protected __type: string;\n protected __position: [number, number];\n protected __height: number;\n protected __featureIDs: Array;\n protected __id: string;\n\n //constructor(type: string, paramdata: { [index: string]: Parameter }, featureIDs: Array, id: string = ComponentAPI.generateID()) {\n constructor(id: string = ComponentAPI.generateID()) {\n this.__position = [0, 0];\n this.__height = 0;\n this.__type = \"BlankUIElement\";\n this.__featureIDs = [];\n // this.__position = paramdata.position.value;\n // this.__height = paramdata.height.value;\n // this.__type = type;\n // this.__featureIDs = featureIDs;\n this.__id = id;\n }\n\n get type(): string {\n return this.__type;\n }\n\n get featureIDs(): Array {\n return this.__featureIDs;\n }\n\n get position(): [number, number] {\n return this.__position;\n }\n\n get id(): string {\n return this.__id;\n }\n\n hasFeatureID(featureID: string): boolean {\n if (this.__featureIDs.includes(featureID)) return true;\n else return false;\n }\n\n draw(): void {\n console.log(`Drawing at ${this.__position[0]}, ${this.__position[1]}`);\n }\n}\n","import Parameter from \"../core/parameter\";\nimport { ComponentAPI } from \"@/componentAPI\";\nimport UIElement from \"./uiElement\";\n\nexport default class TextElement extends UIElement {\n constructor(type: string, paramdata: { [index: string]: Parameter }, featureIDs: Array, id: string = ComponentAPI.generateID()) {\n super(id);\n this.__position = paramdata.position.value;\n this.__height = paramdata.height.value;\n this.__type = type;\n this.__featureIDs = featureIDs;\n }\n}\n","import uuid from \"node-uuid\";\nimport EdgeFeature from \"../core/edgeFeature\";\nimport paper from \"paper\";\nimport { ComponentAPI } from \"@/componentAPI\";\n\nimport Registry from \"../core/registry\";\nimport * as FeatureRenderer2D from \"./render2D/featureRenderer2D\";\nimport GridRenderer from \"./render2D/gridRenderer\";\nimport DeviceRenderer from \"./render2D/deviceRenderer2D\";\n// const DeviceRenderer = require(\"./render2D/deviceRenderer2D\");\n// var AlignmentRenderer = require(\"./render2D/alignmentRenderer2D\");\nimport PanAndZoom from \"./panAndZoom\";\nimport * as Colors from \"./colors\";\nimport ManufacturingLayer from \"../manufacturing/manufacturingLayer\";\nimport RatsNestRenderer2D from \"./render2D/ratsNestRenderer2D\";\nimport ComponentPortRenderer2D from \"./render2D/componentPortRenderer2D\";\nimport PaperComponentPortView from \"./render2D/paperComponentPortView\";\nimport * as DXFObjectRenderer2D from \"./render2D/dxfObjectRenderer2D\";\nimport * as DXFSolidObjectRenderer from \"./render2D/dxfSolidObjectRenderer2D\";\nimport Layer from \"../core/layer\";\nimport Device from \"../core/device\";\nimport Feature from \"../core/feature\";\nimport Params from \"../core/params\";\nimport Component from \"../core/component\";\nimport UIElement from \"./uiElement\";\nimport TextElement from \"./textElement\";\nimport MapUtils from \"../utils/mapUtils\";\nimport { Point, ToolPaperObject } from \"../core/init\";\nimport Connection from \"../core/connection\";\nimport { ViewManager } from \"..\";\nimport Parameter from \"../core/parameter\";\nimport EventBus from \"@/events/events\";\n/**\n * Paper View class\n */\nexport default class PaperView {\n panAndZoom: PanAndZoom;\n center: paper.Point;\n zoom: number;\n canvas: HTMLElement | null;\n paperFeatures: any;\n paperLayers: any;\n paperGrid: paper.Group | null;\n paperDevice: paper.Group | null;\n activeLayer: any;\n gridLayer: paper.Group;\n deviceLayer: paper.Group;\n featureLayer: paper.Group;\n textFeatureLayer: paper.Group;\n alignmentMarksLayer: paper.Group;\n uiLayer: paper.Group;\n ratsNestLayer: paper.Group;\n componentPortsLayer: paper.Group;\n currentTarget: any;\n lastTargetType: string | null;\n lastTargetPosition: Point | null;\n lastTargetParameters: any;\n selectedComponents: Array;\n selectedConnections: Array