From 0a3832ffcab96b839ce49b57d86b4ca40768bdb3 Mon Sep 17 00:00:00 2001 From: PaulJPremakumar Date: Tue, 20 Aug 2024 18:16:16 +0000 Subject: [PATCH] deploy: onshape-public/onshape-public-docs@236ce5c1da5778fcbcf57002fa30b31a534fa67b --- 404.html | 2 +- categories/index.html | 2 +- categories/index.xml | 2 +- css/prism.css | 210 +- css/shortcodes.css | 2 - css/shortcodes/cards-pane.css | 21 - css/shortcodes/tabbed-pane.css | 18 - css/swagger-ui.css | 4 - docs/api-adv/assemblies/index.html | 15 +- docs/api-adv/associativity/index.html | 12 +- docs/api-adv/billing/index.html | 23 +- docs/api-adv/configs/index.html | 13 +- docs/api-adv/drawings/index.html | 15 +- docs/api-adv/errors/index.html | 12 +- docs/api-adv/featureaccess/index.html | 15 +- docs/api-adv/fs/index.html | 15 +- docs/api-adv/index.html | 4 +- docs/api-adv/index.xml | 2955 +------ docs/api-adv/metadata/index.html | 15 +- docs/api-adv/translation/index.html | 13 +- docs/api-intro/architecture/index.html | 10 +- docs/api-intro/explorer/index.html | 15 +- docs/api-intro/index.html | 8 +- docs/api-intro/index.xml | 782 +- docs/api-intro/quickstart/index.html | 12 +- docs/api-intro/whyonshape/index.html | 14 +- docs/app-dev/clientmessaging/index.html | 78 +- docs/app-dev/extensions/index.html | 6 +- docs/app-dev/index.html | 11 +- docs/app-dev/index.xml | 1338 +-- docs/app-dev/structuredstorage/index.html | 13 +- docs/app-dev/webhook/index.html | 14 +- docs/app-store/checklist/index.html | 10 +- docs/app-store/index.html | 9 +- docs/app-store/index.xml | 309 +- docs/app-store/quality/index.html | 12 +- docs/app-store/testingguidelines/index.html | 13 +- docs/auth/apikeys/index.html | 14 +- docs/auth/index.html | 8 +- docs/auth/index.xml | 689 +- docs/auth/oauth/index.html | 14 +- docs/changelog/index.html | 5 +- docs/help/index.html | 10 +- docs/help/index.xml | 2 +- docs/index.html | 6 +- docs/index.xml | 7757 +---------------- docs/tutorials/createextension/index.html | 13 +- docs/tutorials/derivative/index.html | 13 +- docs/tutorials/gltf/index.html | 14 +- docs/tutorials/index.html | 8 +- docs/tutorials/index.xml | 1332 +-- docs/tutorials/releases/index.html | 14 +- docs/tutorials/sync/index.html | 7 +- index.html | 35 +- index.xml | 48 +- ...23f9890ca18fea3158604c8471746d046702bad.js | 2 + ...f752c6a4442c54b48b883b17c497b7c7d96a796.js | 5 + ...98f84156385fd2ded5d1776c98a24db210d3ec6.js | 1 - js/prism.js | 40 +- js/swagger-ui-bundle.js | 134 - js/swagger-ui-standalone-preset.js | 22 - js/tabpane-persist.js | 129 +- ...f03525457e05cdace62229bf02030f0a66d236.css | 9 + ...178413e026f88ce0bcf0304ee6423d78091466.css | 7 - tags/index.html | 2 +- tags/index.xml | 2 +- webfonts/fa-brands-400.eot | Bin 129734 -> 0 bytes webfonts/fa-brands-400.svg | 3451 -------- webfonts/fa-brands-400.ttf | Bin 129428 -> 209128 bytes webfonts/fa-brands-400.woff | Bin 87644 -> 0 bytes webfonts/fa-brands-400.woff2 | Bin 74740 -> 117860 bytes webfonts/fa-regular-400.eot | Bin 34394 -> 0 bytes webfonts/fa-regular-400.svg | 803 -- webfonts/fa-regular-400.ttf | Bin 34096 -> 67860 bytes webfonts/fa-regular-400.woff | Bin 16804 -> 0 bytes webfonts/fa-regular-400.woff2 | Bin 13656 -> 25392 bytes webfonts/fa-solid-900.eot | Bin 192122 -> 0 bytes webfonts/fa-solid-900.svg | 4649 ---------- webfonts/fa-solid-900.ttf | Bin 191836 -> 420332 bytes webfonts/fa-solid-900.woff | Bin 98020 -> 0 bytes webfonts/fa-solid-900.woff2 | Bin 75336 -> 156404 bytes webfonts/fa-v4compatibility.ttf | Bin 0 -> 10832 bytes webfonts/fa-v4compatibility.woff2 | Bin 0 -> 4792 bytes 83 files changed, 539 insertions(+), 24728 deletions(-) delete mode 100644 css/shortcodes.css delete mode 100644 css/shortcodes/cards-pane.css delete mode 100644 css/shortcodes/tabbed-pane.css delete mode 100644 css/swagger-ui.css create mode 100644 js/click-to-copy.min.73478a7d4807698aed7e355eb23f9890ca18fea3158604c8471746d046702bad.js create mode 100644 js/main.min.69e2c1ae9320465ab10236d9ef752c6a4442c54b48b883b17c497b7c7d96a796.js delete mode 100644 js/main.min.a8aca58be32dafbc1f83ea37498f84156385fd2ded5d1776c98a24db210d3ec6.js delete mode 100644 js/swagger-ui-bundle.js delete mode 100644 js/swagger-ui-standalone-preset.js create mode 100644 scss/main.min.7622946b88aadfa24dcf933afaf03525457e05cdace62229bf02030f0a66d236.css delete mode 100644 scss/main.min.edb0fcc3e0fafdc35693077075178413e026f88ce0bcf0304ee6423d78091466.css delete mode 100644 webfonts/fa-brands-400.eot delete mode 100644 webfonts/fa-brands-400.svg delete mode 100644 webfonts/fa-brands-400.woff delete mode 100644 webfonts/fa-regular-400.eot delete mode 100644 webfonts/fa-regular-400.svg delete mode 100644 webfonts/fa-regular-400.woff delete mode 100644 webfonts/fa-solid-900.eot delete mode 100644 webfonts/fa-solid-900.svg delete mode 100644 webfonts/fa-solid-900.woff create mode 100644 webfonts/fa-v4compatibility.ttf create mode 100644 webfonts/fa-v4compatibility.woff2 diff --git a/404.html b/404.html index faed31c..aad0230 100644 --- a/404.html +++ b/404.html @@ -1 +1 @@ -404 Page not found |

Not found

Oops! This page doesn't exist. Try going back to our home page.

\ No newline at end of file +404 Page not found |

Not found

Oops! This page doesn't exist. Try going back to the home page.

\ No newline at end of file diff --git a/categories/index.html b/categories/index.html index ae31d3f..1014120 100644 --- a/categories/index.html +++ b/categories/index.html @@ -1 +1 @@ -Categories |

Categories

\ No newline at end of file +Categories |

Categories

\ No newline at end of file diff --git a/categories/index.xml b/categories/index.xml index 5c64594..5b64699 100644 --- a/categories/index.xml +++ b/categories/index.xml @@ -1 +1 @@ -– Categorieshttps://onshape-public.github.io/categories/Recent content in Categories onHugo -- gohugo.ioen-us \ No newline at end of file +Categories onhttps://onshape-public.github.io/categories/Recent content in Categories onHugoen-us \ No newline at end of file diff --git a/css/prism.css b/css/prism.css index f55c4c6..716b70d 100644 --- a/css/prism.css +++ b/css/prism.css @@ -1,208 +1,4 @@ -/* PrismJS 1.21.0 +/* PrismJS 1.28.0 https://prismjs.com/download.html#themes=prism&languages=markup+css+clike+javascript+bash+c+csharp+cpp+go+java+markdown+python+scss+sql+toml+yaml&plugins=toolbar+copy-to-clipboard */ -/** - * prism.js default theme for JavaScript, CSS and HTML - * Based on dabblet (http://dabblet.com) - * @author Lea Verou - */ - -code[class*="language-"], -pre[class*="language-"] { - color: black; - background: none; - text-shadow: 0 1px white; - font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace; - font-size: 1em; - text-align: left; - white-space: pre; - word-spacing: normal; - word-break: normal; - word-wrap: normal; - line-height: 1.5; - - -moz-tab-size: 4; - -o-tab-size: 4; - tab-size: 4; - - -webkit-hyphens: none; - -moz-hyphens: none; - -ms-hyphens: none; - hyphens: none; -} - -pre[class*="language-"]::-moz-selection, pre[class*="language-"] ::-moz-selection, -code[class*="language-"]::-moz-selection, code[class*="language-"] ::-moz-selection { - text-shadow: none; - background: #b3d4fc; -} - -pre[class*="language-"]::selection, pre[class*="language-"] ::selection, -code[class*="language-"]::selection, code[class*="language-"] ::selection { - text-shadow: none; - background: #b3d4fc; -} - -@media print { - code[class*="language-"], - pre[class*="language-"] { - text-shadow: none; - } -} - -/* Code blocks */ -pre[class*="language-"] { - padding: 1em; - margin: .5em 0; - overflow: auto; -} - -:not(pre) > code[class*="language-"], -pre[class*="language-"] { - background: #f5f2f0; -} - -/* Inline code */ -:not(pre) > code[class*="language-"] { - padding: .1em; - border-radius: .3em; - white-space: normal; -} - -.token.comment, -.token.prolog, -.token.doctype, -.token.cdata { - color: slategray; -} - -.token.punctuation { - color: #999; -} - -.token.namespace { - opacity: .7; -} - -.token.property, -.token.tag, -.token.boolean, -.token.number, -.token.constant, -.token.symbol, -.token.deleted { - color: #905; -} - -.token.selector, -.token.attr-name, -.token.string, -.token.char, -.token.builtin, -.token.inserted { - color: #690; -} - -.token.operator, -.token.entity, -.token.url, -.language-css .token.string, -.style .token.string { - color: #9a6e3a; - /* This background color was intended by the author of this theme. */ - background: hsla(0, 0%, 100%, .5); -} - -.token.atrule, -.token.attr-value, -.token.keyword { - color: #07a; -} - -.token.function, -.token.class-name { - color: #DD4A68; -} - -.token.regex, -.token.important, -.token.variable { - color: #e90; -} - -.token.important, -.token.bold { - font-weight: bold; -} -.token.italic { - font-style: italic; -} - -.token.entity { - cursor: help; -} - -div.code-toolbar { - position: relative; -} - -div.code-toolbar > .toolbar { - position: absolute; - top: .3em; - right: .2em; - transition: opacity 0.3s ease-in-out; - opacity: 0; -} - -div.code-toolbar:hover > .toolbar { - opacity: 1; -} - -/* Separate line b/c rules are thrown out if selector is invalid. - IE11 and old Edge versions don't support :focus-within. */ -div.code-toolbar:focus-within > .toolbar { - opacity: 1; -} - -div.code-toolbar > .toolbar .toolbar-item { - display: inline-block; -} - -div.code-toolbar > .toolbar a { - cursor: pointer; -} - -div.code-toolbar > .toolbar button { - background: none; - border: 0; - color: inherit; - font: inherit; - line-height: normal; - overflow: visible; - padding: 0; - -webkit-user-select: none; /* for button */ - -moz-user-select: none; - -ms-user-select: none; -} - -div.code-toolbar > .toolbar a, -div.code-toolbar > .toolbar button, -div.code-toolbar > .toolbar span { - color: #bbb; - font-size: .8em; - padding: 0 .5em; - background: #f5f2f0; - background: rgba(224, 224, 224, 0.2); - box-shadow: 0 2px 0 0 rgba(0,0,0,0.2); - border-radius: .5em; -} - -div.code-toolbar > .toolbar a:hover, -div.code-toolbar > .toolbar a:focus, -div.code-toolbar > .toolbar button:hover, -div.code-toolbar > .toolbar button:focus, -div.code-toolbar > .toolbar span:hover, -div.code-toolbar > .toolbar span:focus { - color: inherit; - text-decoration: none; -} - +code[class*=language-],pre[class*=language-]{color:#000;background:0 0;text-shadow:0 1px #fff;font-family:Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace;font-size:1em;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none}code[class*=language-] ::-moz-selection,code[class*=language-]::-moz-selection,pre[class*=language-] ::-moz-selection,pre[class*=language-]::-moz-selection{text-shadow:none;background:#b3d4fc}code[class*=language-] ::selection,code[class*=language-]::selection,pre[class*=language-] ::selection,pre[class*=language-]::selection{text-shadow:none;background:#b3d4fc}@media print{code[class*=language-],pre[class*=language-]{text-shadow:none}}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto}:not(pre)>code[class*=language-],pre[class*=language-]{background:#f5f2f0}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#708090}.token.punctuation{color:#999}.token.namespace{opacity:.7}.token.boolean,.token.constant,.token.deleted,.token.number,.token.property,.token.symbol,.token.tag{color:#905}.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string{color:#690}.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url{color:#9a6e3a;background:hsla(0,0%,100%,.5)}.token.atrule,.token.attr-value,.token.keyword{color:#07a}.token.class-name,.token.function{color:#dd4a68}.token.important,.token.regex,.token.variable{color:#e90}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help} +div.code-toolbar{position:relative}div.code-toolbar>.toolbar{position:absolute;z-index:10;top:.3em;right:.2em;transition:opacity .3s ease-in-out;opacity:0}div.code-toolbar:hover>.toolbar{opacity:1}div.code-toolbar:focus-within>.toolbar{opacity:1}div.code-toolbar>.toolbar>.toolbar-item{display:inline-block}div.code-toolbar>.toolbar>.toolbar-item>a{cursor:pointer}div.code-toolbar>.toolbar>.toolbar-item>button{background:0 0;border:0;color:inherit;font:inherit;line-height:normal;overflow:visible;padding:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}div.code-toolbar>.toolbar>.toolbar-item>a,div.code-toolbar>.toolbar>.toolbar-item>button,div.code-toolbar>.toolbar>.toolbar-item>span{color:#bbb;font-size:.8em;padding:0 .5em;background:#f5f2f0;background:rgba(224,224,224,.2);box-shadow:0 2px 0 0 rgba(0,0,0,.2);border-radius:.5em}div.code-toolbar>.toolbar>.toolbar-item>a:focus,div.code-toolbar>.toolbar>.toolbar-item>a:hover,div.code-toolbar>.toolbar>.toolbar-item>button:focus,div.code-toolbar>.toolbar>.toolbar-item>button:hover,div.code-toolbar>.toolbar>.toolbar-item>span:focus,div.code-toolbar>.toolbar>.toolbar-item>span:hover{color:inherit;text-decoration:none} diff --git a/css/shortcodes.css b/css/shortcodes.css deleted file mode 100644 index 0aa1c0f..0000000 --- a/css/shortcodes.css +++ /dev/null @@ -1,2 +0,0 @@ -@import "shortcodes/tabbed-pane.css"; -@import "shortcodes/cards-pane.css"; diff --git a/css/shortcodes/cards-pane.css b/css/shortcodes/cards-pane.css deleted file mode 100644 index 34c8545..0000000 --- a/css/shortcodes/cards-pane.css +++ /dev/null @@ -1,21 +0,0 @@ -.card-deck { - max-width: 83%; -} - -.card { - max-width: 80%; -} - -.card-body.code { - background-color: #f8f9fa; - padding: 0 0 0 1ex; -} - -.card-body pre { - margin: 0; - padding: 0 1rem 1rem 1rem; -} - -.card .highlight { - border: none; -} diff --git a/css/shortcodes/tabbed-pane.css b/css/shortcodes/tabbed-pane.css deleted file mode 100644 index 3016398..0000000 --- a/css/shortcodes/tabbed-pane.css +++ /dev/null @@ -1,18 +0,0 @@ -.td-content .highlight { - margin: 0rem 0 2rem 0; -} - -.tab-content .highlight { - border: none; -} - -.tab-content { - margin: 0rem; - max-width: 80%; -} - -.tab-content pre { - border-left: 1px solid rgba(0, 0, 0, 0.125); - border-right: 1px solid rgba(0, 0, 0, 0.125); - border-bottom: 1px solid rgba(0, 0, 0, 0.125); -} diff --git a/css/swagger-ui.css b/css/swagger-ui.css deleted file mode 100644 index c61e5a8..0000000 --- a/css/swagger-ui.css +++ /dev/null @@ -1,4 +0,0 @@ -.swagger-ui{ - /*! normalize.css v7.0.0 | MIT License | github.com/necolas/normalize.css */font-family:sans-serif;color:#3b4151}.swagger-ui html{line-height:1.15;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}.swagger-ui body{margin:0}.swagger-ui article,.swagger-ui aside,.swagger-ui footer,.swagger-ui header,.swagger-ui nav,.swagger-ui section{display:block}.swagger-ui h1{font-size:2em;margin:.67em 0}.swagger-ui figcaption,.swagger-ui figure,.swagger-ui main{display:block}.swagger-ui figure{margin:1em 40px}.swagger-ui hr{box-sizing:content-box;height:0;overflow:visible}.swagger-ui pre{font-family:monospace,monospace;font-size:1em}.swagger-ui a{background-color:transparent;-webkit-text-decoration-skip:objects}.swagger-ui abbr[title]{border-bottom:none;text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}.swagger-ui b,.swagger-ui strong{font-weight:inherit;font-weight:bolder}.swagger-ui code,.swagger-ui kbd,.swagger-ui samp{font-family:monospace,monospace;font-size:1em}.swagger-ui dfn{font-style:italic}.swagger-ui mark{background-color:#ff0;color:#000}.swagger-ui small{font-size:80%}.swagger-ui sub,.swagger-ui sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}.swagger-ui sub{bottom:-.25em}.swagger-ui sup{top:-.5em}.swagger-ui audio,.swagger-ui video{display:inline-block}.swagger-ui audio:not([controls]){display:none;height:0}.swagger-ui img{border-style:none}.swagger-ui svg:not(:root){overflow:hidden}.swagger-ui button,.swagger-ui input,.swagger-ui optgroup,.swagger-ui select,.swagger-ui textarea{font-family:sans-serif;font-size:100%;line-height:1.15;margin:0}.swagger-ui button,.swagger-ui input{overflow:visible}.swagger-ui button,.swagger-ui select{text-transform:none}.swagger-ui [type=reset],.swagger-ui [type=submit],.swagger-ui button,.swagger-ui html [type=button]{-webkit-appearance:button}.swagger-ui [type=button]::-moz-focus-inner,.swagger-ui [type=reset]::-moz-focus-inner,.swagger-ui [type=submit]::-moz-focus-inner,.swagger-ui button::-moz-focus-inner{border-style:none;padding:0}.swagger-ui [type=button]:-moz-focusring,.swagger-ui [type=reset]:-moz-focusring,.swagger-ui [type=submit]:-moz-focusring,.swagger-ui button:-moz-focusring{outline:1px dotted ButtonText}.swagger-ui fieldset{padding:.35em .75em .625em}.swagger-ui legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}.swagger-ui progress{display:inline-block;vertical-align:baseline}.swagger-ui textarea{overflow:auto}.swagger-ui [type=checkbox],.swagger-ui [type=radio]{box-sizing:border-box;padding:0}.swagger-ui [type=number]::-webkit-inner-spin-button,.swagger-ui [type=number]::-webkit-outer-spin-button{height:auto}.swagger-ui [type=search]{-webkit-appearance:textfield;outline-offset:-2px}.swagger-ui [type=search]::-webkit-search-cancel-button,.swagger-ui [type=search]::-webkit-search-decoration{-webkit-appearance:none}.swagger-ui ::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}.swagger-ui details,.swagger-ui menu{display:block}.swagger-ui summary{display:list-item}.swagger-ui canvas{display:inline-block}.swagger-ui template{display:none}.swagger-ui [hidden]{display:none}.swagger-ui .debug *{outline:1px solid gold}.swagger-ui .debug-white *{outline:1px solid #fff}.swagger-ui .debug-black *{outline:1px solid #000}.swagger-ui .debug-grid{background:transparent url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyhpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTExIDc5LjE1ODMyNSwgMjAxNS8wOS8xMC0wMToxMDoyMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MTRDOTY4N0U2N0VFMTFFNjg2MzZDQjkwNkQ4MjgwMEIiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MTRDOTY4N0Q2N0VFMTFFNjg2MzZDQjkwNkQ4MjgwMEIiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUgKE1hY2ludG9zaCkiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo3NjcyQkQ3NjY3QzUxMUU2QjJCQ0UyNDA4MTAwMjE3MSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo3NjcyQkQ3NzY3QzUxMUU2QjJCQ0UyNDA4MTAwMjE3MSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PsBS+GMAAAAjSURBVHjaYvz//z8DLsD4gcGXiYEAGBIKGBne//fFpwAgwAB98AaF2pjlUQAAAABJRU5ErkJggg==) repeat 0 0}.swagger-ui .debug-grid-16{background:transparent url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyhpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTExIDc5LjE1ODMyNSwgMjAxNS8wOS8xMC0wMToxMDoyMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6ODYyRjhERDU2N0YyMTFFNjg2MzZDQjkwNkQ4MjgwMEIiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6ODYyRjhERDQ2N0YyMTFFNjg2MzZDQjkwNkQ4MjgwMEIiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUgKE1hY2ludG9zaCkiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo3NjcyQkQ3QTY3QzUxMUU2QjJCQ0UyNDA4MTAwMjE3MSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo3NjcyQkQ3QjY3QzUxMUU2QjJCQ0UyNDA4MTAwMjE3MSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PvCS01IAAABMSURBVHjaYmR4/5+BFPBfAMFm/MBgx8RAGWCn1AAmSg34Q6kBDKMGMDCwICeMIemF/5QawEipAWwUhwEjMDvbAWlWkvVBwu8vQIABAEwBCph8U6c0AAAAAElFTkSuQmCC) repeat 0 0}.swagger-ui .debug-grid-8-solid{background:#fff url(data:image/jpeg;base64,/9j/4QAYRXhpZgAASUkqAAgAAAAAAAAAAAAAAP/sABFEdWNreQABAAQAAAAAAAD/4QMxaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLwA8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/PiA8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJBZG9iZSBYTVAgQ29yZSA1LjYtYzExMSA3OS4xNTgzMjUsIDIwMTUvMDkvMTAtMDE6MTA6MjAgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCBDQyAyMDE1IChNYWNpbnRvc2gpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOkIxMjI0OTczNjdCMzExRTZCMkJDRTI0MDgxMDAyMTcxIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOkIxMjI0OTc0NjdCMzExRTZCMkJDRTI0MDgxMDAyMTcxIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6QjEyMjQ5NzE2N0IzMTFFNkIyQkNFMjQwODEwMDIxNzEiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6QjEyMjQ5NzI2N0IzMTFFNkIyQkNFMjQwODEwMDIxNzEiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz7/7gAOQWRvYmUAZMAAAAAB/9sAhAAbGhopHSlBJiZBQi8vL0JHPz4+P0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHAR0pKTQmND8oKD9HPzU/R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0f/wAARCAAIAAgDASIAAhEBAxEB/8QAWQABAQAAAAAAAAAAAAAAAAAAAAYBAQEAAAAAAAAAAAAAAAAAAAIEEAEBAAMBAAAAAAAAAAAAAAABADECA0ERAAEDBQAAAAAAAAAAAAAAAAARITFBUWESIv/aAAwDAQACEQMRAD8AoOnTV1QTD7JJshP3vSM3P//Z) repeat 0 0}.swagger-ui .debug-grid-16-solid{background:#fff url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyhpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTExIDc5LjE1ODMyNSwgMjAxNS8wOS8xMC0wMToxMDoyMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUgKE1hY2ludG9zaCkiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NzY3MkJEN0U2N0M1MTFFNkIyQkNFMjQwODEwMDIxNzEiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NzY3MkJEN0Y2N0M1MTFFNkIyQkNFMjQwODEwMDIxNzEiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo3NjcyQkQ3QzY3QzUxMUU2QjJCQ0UyNDA4MTAwMjE3MSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo3NjcyQkQ3RDY3QzUxMUU2QjJCQ0UyNDA4MTAwMjE3MSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pve6J3kAAAAzSURBVHjaYvz//z8D0UDsMwMjSRoYP5Gq4SPNbRjVMEQ1fCRDg+in/6+J1AJUxsgAEGAA31BAJMS0GYEAAAAASUVORK5CYII=) repeat 0 0}.swagger-ui .border-box,.swagger-ui a,.swagger-ui article,.swagger-ui body,.swagger-ui code,.swagger-ui dd,.swagger-ui div,.swagger-ui dl,.swagger-ui dt,.swagger-ui fieldset,.swagger-ui footer,.swagger-ui form,.swagger-ui h1,.swagger-ui h2,.swagger-ui h3,.swagger-ui h4,.swagger-ui h5,.swagger-ui h6,.swagger-ui header,.swagger-ui html,.swagger-ui input[type=email],.swagger-ui input[type=number],.swagger-ui input[type=password],.swagger-ui input[type=tel],.swagger-ui input[type=text],.swagger-ui input[type=url],.swagger-ui legend,.swagger-ui li,.swagger-ui main,.swagger-ui ol,.swagger-ui p,.swagger-ui pre,.swagger-ui section,.swagger-ui table,.swagger-ui td,.swagger-ui textarea,.swagger-ui th,.swagger-ui tr,.swagger-ui ul{box-sizing:border-box}.swagger-ui .aspect-ratio{height:0;position:relative}.swagger-ui .aspect-ratio--16x9{padding-bottom:56.25%}.swagger-ui .aspect-ratio--9x16{padding-bottom:177.77%}.swagger-ui .aspect-ratio--4x3{padding-bottom:75%}.swagger-ui .aspect-ratio--3x4{padding-bottom:133.33%}.swagger-ui .aspect-ratio--6x4{padding-bottom:66.6%}.swagger-ui .aspect-ratio--4x6{padding-bottom:150%}.swagger-ui .aspect-ratio--8x5{padding-bottom:62.5%}.swagger-ui .aspect-ratio--5x8{padding-bottom:160%}.swagger-ui .aspect-ratio--7x5{padding-bottom:71.42%}.swagger-ui .aspect-ratio--5x7{padding-bottom:140%}.swagger-ui .aspect-ratio--1x1{padding-bottom:100%}.swagger-ui .aspect-ratio--object{position:absolute;top:0;right:0;bottom:0;left:0;width:100%;height:100%;z-index:100}@media screen and (min-width:30em){.swagger-ui .aspect-ratio-ns{height:0;position:relative}.swagger-ui .aspect-ratio--16x9-ns{padding-bottom:56.25%}.swagger-ui .aspect-ratio--9x16-ns{padding-bottom:177.77%}.swagger-ui .aspect-ratio--4x3-ns{padding-bottom:75%}.swagger-ui .aspect-ratio--3x4-ns{padding-bottom:133.33%}.swagger-ui .aspect-ratio--6x4-ns{padding-bottom:66.6%}.swagger-ui .aspect-ratio--4x6-ns{padding-bottom:150%}.swagger-ui .aspect-ratio--8x5-ns{padding-bottom:62.5%}.swagger-ui .aspect-ratio--5x8-ns{padding-bottom:160%}.swagger-ui .aspect-ratio--7x5-ns{padding-bottom:71.42%}.swagger-ui .aspect-ratio--5x7-ns{padding-bottom:140%}.swagger-ui .aspect-ratio--1x1-ns{padding-bottom:100%}.swagger-ui .aspect-ratio--object-ns{position:absolute;top:0;right:0;bottom:0;left:0;width:100%;height:100%;z-index:100}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .aspect-ratio-m{height:0;position:relative}.swagger-ui .aspect-ratio--16x9-m{padding-bottom:56.25%}.swagger-ui .aspect-ratio--9x16-m{padding-bottom:177.77%}.swagger-ui .aspect-ratio--4x3-m{padding-bottom:75%}.swagger-ui .aspect-ratio--3x4-m{padding-bottom:133.33%}.swagger-ui .aspect-ratio--6x4-m{padding-bottom:66.6%}.swagger-ui .aspect-ratio--4x6-m{padding-bottom:150%}.swagger-ui .aspect-ratio--8x5-m{padding-bottom:62.5%}.swagger-ui .aspect-ratio--5x8-m{padding-bottom:160%}.swagger-ui .aspect-ratio--7x5-m{padding-bottom:71.42%}.swagger-ui .aspect-ratio--5x7-m{padding-bottom:140%}.swagger-ui .aspect-ratio--1x1-m{padding-bottom:100%}.swagger-ui .aspect-ratio--object-m{position:absolute;top:0;right:0;bottom:0;left:0;width:100%;height:100%;z-index:100}}@media screen and (min-width:60em){.swagger-ui .aspect-ratio-l{height:0;position:relative}.swagger-ui .aspect-ratio--16x9-l{padding-bottom:56.25%}.swagger-ui .aspect-ratio--9x16-l{padding-bottom:177.77%}.swagger-ui .aspect-ratio--4x3-l{padding-bottom:75%}.swagger-ui .aspect-ratio--3x4-l{padding-bottom:133.33%}.swagger-ui .aspect-ratio--6x4-l{padding-bottom:66.6%}.swagger-ui .aspect-ratio--4x6-l{padding-bottom:150%}.swagger-ui .aspect-ratio--8x5-l{padding-bottom:62.5%}.swagger-ui .aspect-ratio--5x8-l{padding-bottom:160%}.swagger-ui .aspect-ratio--7x5-l{padding-bottom:71.42%}.swagger-ui .aspect-ratio--5x7-l{padding-bottom:140%}.swagger-ui .aspect-ratio--1x1-l{padding-bottom:100%}.swagger-ui .aspect-ratio--object-l{position:absolute;top:0;right:0;bottom:0;left:0;width:100%;height:100%;z-index:100}}.swagger-ui img{max-width:100%}.swagger-ui .cover{background-size:cover!important}.swagger-ui .contain{background-size:contain!important}@media screen and (min-width:30em){.swagger-ui .cover-ns{background-size:cover!important}.swagger-ui .contain-ns{background-size:contain!important}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .cover-m{background-size:cover!important}.swagger-ui .contain-m{background-size:contain!important}}@media screen and (min-width:60em){.swagger-ui .cover-l{background-size:cover!important}.swagger-ui .contain-l{background-size:contain!important}}.swagger-ui .bg-center{background-repeat:no-repeat;background-position:50%}.swagger-ui .bg-top{background-repeat:no-repeat;background-position:top}.swagger-ui .bg-right{background-repeat:no-repeat;background-position:100%}.swagger-ui .bg-bottom{background-repeat:no-repeat;background-position:bottom}.swagger-ui .bg-left{background-repeat:no-repeat;background-position:0}@media screen and (min-width:30em){.swagger-ui .bg-center-ns{background-repeat:no-repeat;background-position:50%}.swagger-ui .bg-top-ns{background-repeat:no-repeat;background-position:top}.swagger-ui .bg-right-ns{background-repeat:no-repeat;background-position:100%}.swagger-ui .bg-bottom-ns{background-repeat:no-repeat;background-position:bottom}.swagger-ui .bg-left-ns{background-repeat:no-repeat;background-position:0}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .bg-center-m{background-repeat:no-repeat;background-position:50%}.swagger-ui .bg-top-m{background-repeat:no-repeat;background-position:top}.swagger-ui .bg-right-m{background-repeat:no-repeat;background-position:100%}.swagger-ui .bg-bottom-m{background-repeat:no-repeat;background-position:bottom}.swagger-ui .bg-left-m{background-repeat:no-repeat;background-position:0}}@media screen and (min-width:60em){.swagger-ui .bg-center-l{background-repeat:no-repeat;background-position:50%}.swagger-ui .bg-top-l{background-repeat:no-repeat;background-position:top}.swagger-ui .bg-right-l{background-repeat:no-repeat;background-position:100%}.swagger-ui .bg-bottom-l{background-repeat:no-repeat;background-position:bottom}.swagger-ui .bg-left-l{background-repeat:no-repeat;background-position:0}}.swagger-ui .outline{outline:1px solid}.swagger-ui .outline-transparent{outline:1px solid transparent}.swagger-ui .outline-0{outline:0}@media screen and (min-width:30em){.swagger-ui .outline-ns{outline:1px solid}.swagger-ui .outline-transparent-ns{outline:1px solid transparent}.swagger-ui .outline-0-ns{outline:0}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .outline-m{outline:1px solid}.swagger-ui .outline-transparent-m{outline:1px solid transparent}.swagger-ui .outline-0-m{outline:0}}@media screen and (min-width:60em){.swagger-ui .outline-l{outline:1px solid}.swagger-ui .outline-transparent-l{outline:1px solid transparent}.swagger-ui .outline-0-l{outline:0}}.swagger-ui .ba{border-style:solid;border-width:1px}.swagger-ui .bt{border-top-style:solid;border-top-width:1px}.swagger-ui .br{border-right-style:solid;border-right-width:1px}.swagger-ui .bb{border-bottom-style:solid;border-bottom-width:1px}.swagger-ui .bl{border-left-style:solid;border-left-width:1px}.swagger-ui .bn{border-style:none;border-width:0}@media screen and (min-width:30em){.swagger-ui .ba-ns{border-style:solid;border-width:1px}.swagger-ui .bt-ns{border-top-style:solid;border-top-width:1px}.swagger-ui .br-ns{border-right-style:solid;border-right-width:1px}.swagger-ui .bb-ns{border-bottom-style:solid;border-bottom-width:1px}.swagger-ui .bl-ns{border-left-style:solid;border-left-width:1px}.swagger-ui .bn-ns{border-style:none;border-width:0}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .ba-m{border-style:solid;border-width:1px}.swagger-ui .bt-m{border-top-style:solid;border-top-width:1px}.swagger-ui .br-m{border-right-style:solid;border-right-width:1px}.swagger-ui .bb-m{border-bottom-style:solid;border-bottom-width:1px}.swagger-ui .bl-m{border-left-style:solid;border-left-width:1px}.swagger-ui .bn-m{border-style:none;border-width:0}}@media screen and (min-width:60em){.swagger-ui .ba-l{border-style:solid;border-width:1px}.swagger-ui .bt-l{border-top-style:solid;border-top-width:1px}.swagger-ui .br-l{border-right-style:solid;border-right-width:1px}.swagger-ui .bb-l{border-bottom-style:solid;border-bottom-width:1px}.swagger-ui .bl-l{border-left-style:solid;border-left-width:1px}.swagger-ui .bn-l{border-style:none;border-width:0}}.swagger-ui .b--black{border-color:#000}.swagger-ui .b--near-black{border-color:#111}.swagger-ui .b--dark-gray{border-color:#333}.swagger-ui .b--mid-gray{border-color:#555}.swagger-ui .b--gray{border-color:#777}.swagger-ui .b--silver{border-color:#999}.swagger-ui .b--light-silver{border-color:#aaa}.swagger-ui .b--moon-gray{border-color:#ccc}.swagger-ui .b--light-gray{border-color:#eee}.swagger-ui .b--near-white{border-color:#f4f4f4}.swagger-ui .b--white{border-color:#fff}.swagger-ui .b--white-90{border-color:hsla(0,0%,100%,.9)}.swagger-ui .b--white-80{border-color:hsla(0,0%,100%,.8)}.swagger-ui .b--white-70{border-color:hsla(0,0%,100%,.7)}.swagger-ui .b--white-60{border-color:hsla(0,0%,100%,.6)}.swagger-ui .b--white-50{border-color:hsla(0,0%,100%,.5)}.swagger-ui .b--white-40{border-color:hsla(0,0%,100%,.4)}.swagger-ui .b--white-30{border-color:hsla(0,0%,100%,.3)}.swagger-ui .b--white-20{border-color:hsla(0,0%,100%,.2)}.swagger-ui .b--white-10{border-color:hsla(0,0%,100%,.1)}.swagger-ui .b--white-05{border-color:hsla(0,0%,100%,.05)}.swagger-ui .b--white-025{border-color:hsla(0,0%,100%,.025)}.swagger-ui .b--white-0125{border-color:hsla(0,0%,100%,.0125)}.swagger-ui .b--black-90{border-color:rgba(0,0,0,.9)}.swagger-ui .b--black-80{border-color:rgba(0,0,0,.8)}.swagger-ui .b--black-70{border-color:rgba(0,0,0,.7)}.swagger-ui .b--black-60{border-color:rgba(0,0,0,.6)}.swagger-ui .b--black-50{border-color:rgba(0,0,0,.5)}.swagger-ui .b--black-40{border-color:rgba(0,0,0,.4)}.swagger-ui .b--black-30{border-color:rgba(0,0,0,.3)}.swagger-ui .b--black-20{border-color:rgba(0,0,0,.2)}.swagger-ui .b--black-10{border-color:rgba(0,0,0,.1)}.swagger-ui .b--black-05{border-color:rgba(0,0,0,.05)}.swagger-ui .b--black-025{border-color:rgba(0,0,0,.025)}.swagger-ui .b--black-0125{border-color:rgba(0,0,0,.0125)}.swagger-ui .b--dark-red{border-color:#e7040f}.swagger-ui .b--red{border-color:#ff4136}.swagger-ui .b--light-red{border-color:#ff725c}.swagger-ui .b--orange{border-color:#ff6300}.swagger-ui .b--gold{border-color:#ffb700}.swagger-ui .b--yellow{border-color:gold}.swagger-ui .b--light-yellow{border-color:#fbf1a9}.swagger-ui .b--purple{border-color:#5e2ca5}.swagger-ui .b--light-purple{border-color:#a463f2}.swagger-ui .b--dark-pink{border-color:#d5008f}.swagger-ui .b--hot-pink{border-color:#ff41b4}.swagger-ui .b--pink{border-color:#ff80cc}.swagger-ui .b--light-pink{border-color:#ffa3d7}.swagger-ui .b--dark-green{border-color:#137752}.swagger-ui .b--green{border-color:#19a974}.swagger-ui .b--light-green{border-color:#9eebcf}.swagger-ui .b--navy{border-color:#001b44}.swagger-ui .b--dark-blue{border-color:#00449e}.swagger-ui .b--blue{border-color:#357edd}.swagger-ui .b--light-blue{border-color:#96ccff}.swagger-ui .b--lightest-blue{border-color:#cdecff}.swagger-ui .b--washed-blue{border-color:#f6fffe}.swagger-ui .b--washed-green{border-color:#e8fdf5}.swagger-ui .b--washed-yellow{border-color:#fffceb}.swagger-ui .b--washed-red{border-color:#ffdfdf}.swagger-ui .b--transparent{border-color:transparent}.swagger-ui .b--inherit{border-color:inherit}.swagger-ui .br0{border-radius:0}.swagger-ui .br1{border-radius:.125rem}.swagger-ui .br2{border-radius:.25rem}.swagger-ui .br3{border-radius:.5rem}.swagger-ui .br4{border-radius:1rem}.swagger-ui .br-100{border-radius:100%}.swagger-ui .br-pill{border-radius:9999px}.swagger-ui .br--bottom{border-top-left-radius:0;border-top-right-radius:0}.swagger-ui .br--top{border-bottom-left-radius:0;border-bottom-right-radius:0}.swagger-ui .br--right{border-top-left-radius:0;border-bottom-left-radius:0}.swagger-ui .br--left{border-top-right-radius:0;border-bottom-right-radius:0}@media screen and (min-width:30em){.swagger-ui .br0-ns{border-radius:0}.swagger-ui .br1-ns{border-radius:.125rem}.swagger-ui .br2-ns{border-radius:.25rem}.swagger-ui .br3-ns{border-radius:.5rem}.swagger-ui .br4-ns{border-radius:1rem}.swagger-ui .br-100-ns{border-radius:100%}.swagger-ui .br-pill-ns{border-radius:9999px}.swagger-ui .br--bottom-ns{border-top-left-radius:0;border-top-right-radius:0}.swagger-ui .br--top-ns{border-bottom-left-radius:0;border-bottom-right-radius:0}.swagger-ui .br--right-ns{border-top-left-radius:0;border-bottom-left-radius:0}.swagger-ui .br--left-ns{border-top-right-radius:0;border-bottom-right-radius:0}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .br0-m{border-radius:0}.swagger-ui .br1-m{border-radius:.125rem}.swagger-ui .br2-m{border-radius:.25rem}.swagger-ui .br3-m{border-radius:.5rem}.swagger-ui .br4-m{border-radius:1rem}.swagger-ui .br-100-m{border-radius:100%}.swagger-ui .br-pill-m{border-radius:9999px}.swagger-ui .br--bottom-m{border-top-left-radius:0;border-top-right-radius:0}.swagger-ui .br--top-m{border-bottom-left-radius:0;border-bottom-right-radius:0}.swagger-ui .br--right-m{border-top-left-radius:0;border-bottom-left-radius:0}.swagger-ui .br--left-m{border-top-right-radius:0;border-bottom-right-radius:0}}@media screen and (min-width:60em){.swagger-ui .br0-l{border-radius:0}.swagger-ui .br1-l{border-radius:.125rem}.swagger-ui .br2-l{border-radius:.25rem}.swagger-ui .br3-l{border-radius:.5rem}.swagger-ui .br4-l{border-radius:1rem}.swagger-ui .br-100-l{border-radius:100%}.swagger-ui .br-pill-l{border-radius:9999px}.swagger-ui .br--bottom-l{border-top-left-radius:0;border-top-right-radius:0}.swagger-ui .br--top-l{border-bottom-left-radius:0;border-bottom-right-radius:0}.swagger-ui .br--right-l{border-top-left-radius:0;border-bottom-left-radius:0}.swagger-ui .br--left-l{border-top-right-radius:0;border-bottom-right-radius:0}}.swagger-ui .b--dotted{border-style:dotted}.swagger-ui .b--dashed{border-style:dashed}.swagger-ui .b--solid{border-style:solid}.swagger-ui .b--none{border-style:none}@media screen and (min-width:30em){.swagger-ui .b--dotted-ns{border-style:dotted}.swagger-ui .b--dashed-ns{border-style:dashed}.swagger-ui .b--solid-ns{border-style:solid}.swagger-ui .b--none-ns{border-style:none}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .b--dotted-m{border-style:dotted}.swagger-ui .b--dashed-m{border-style:dashed}.swagger-ui .b--solid-m{border-style:solid}.swagger-ui .b--none-m{border-style:none}}@media screen and (min-width:60em){.swagger-ui .b--dotted-l{border-style:dotted}.swagger-ui .b--dashed-l{border-style:dashed}.swagger-ui .b--solid-l{border-style:solid}.swagger-ui .b--none-l{border-style:none}}.swagger-ui .bw0{border-width:0}.swagger-ui .bw1{border-width:.125rem}.swagger-ui .bw2{border-width:.25rem}.swagger-ui .bw3{border-width:.5rem}.swagger-ui .bw4{border-width:1rem}.swagger-ui .bw5{border-width:2rem}.swagger-ui .bt-0{border-top-width:0}.swagger-ui .br-0{border-right-width:0}.swagger-ui .bb-0{border-bottom-width:0}.swagger-ui .bl-0{border-left-width:0}@media screen and (min-width:30em){.swagger-ui .bw0-ns{border-width:0}.swagger-ui .bw1-ns{border-width:.125rem}.swagger-ui .bw2-ns{border-width:.25rem}.swagger-ui .bw3-ns{border-width:.5rem}.swagger-ui .bw4-ns{border-width:1rem}.swagger-ui .bw5-ns{border-width:2rem}.swagger-ui .bt-0-ns{border-top-width:0}.swagger-ui .br-0-ns{border-right-width:0}.swagger-ui .bb-0-ns{border-bottom-width:0}.swagger-ui .bl-0-ns{border-left-width:0}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .bw0-m{border-width:0}.swagger-ui .bw1-m{border-width:.125rem}.swagger-ui .bw2-m{border-width:.25rem}.swagger-ui .bw3-m{border-width:.5rem}.swagger-ui .bw4-m{border-width:1rem}.swagger-ui .bw5-m{border-width:2rem}.swagger-ui .bt-0-m{border-top-width:0}.swagger-ui .br-0-m{border-right-width:0}.swagger-ui .bb-0-m{border-bottom-width:0}.swagger-ui .bl-0-m{border-left-width:0}}@media screen and (min-width:60em){.swagger-ui .bw0-l{border-width:0}.swagger-ui .bw1-l{border-width:.125rem}.swagger-ui .bw2-l{border-width:.25rem}.swagger-ui .bw3-l{border-width:.5rem}.swagger-ui .bw4-l{border-width:1rem}.swagger-ui .bw5-l{border-width:2rem}.swagger-ui .bt-0-l{border-top-width:0}.swagger-ui .br-0-l{border-right-width:0}.swagger-ui .bb-0-l{border-bottom-width:0}.swagger-ui .bl-0-l{border-left-width:0}}.swagger-ui .shadow-1{box-shadow:0 0 4px 2px rgba(0,0,0,.2)}.swagger-ui .shadow-2{box-shadow:0 0 8px 2px rgba(0,0,0,.2)}.swagger-ui .shadow-3{box-shadow:2px 2px 4px 2px rgba(0,0,0,.2)}.swagger-ui .shadow-4{box-shadow:2px 2px 8px 0 rgba(0,0,0,.2)}.swagger-ui .shadow-5{box-shadow:4px 4px 8px 0 rgba(0,0,0,.2)}@media screen and (min-width:30em){.swagger-ui .shadow-1-ns{box-shadow:0 0 4px 2px rgba(0,0,0,.2)}.swagger-ui .shadow-2-ns{box-shadow:0 0 8px 2px rgba(0,0,0,.2)}.swagger-ui .shadow-3-ns{box-shadow:2px 2px 4px 2px rgba(0,0,0,.2)}.swagger-ui .shadow-4-ns{box-shadow:2px 2px 8px 0 rgba(0,0,0,.2)}.swagger-ui .shadow-5-ns{box-shadow:4px 4px 8px 0 rgba(0,0,0,.2)}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .shadow-1-m{box-shadow:0 0 4px 2px rgba(0,0,0,.2)}.swagger-ui .shadow-2-m{box-shadow:0 0 8px 2px rgba(0,0,0,.2)}.swagger-ui .shadow-3-m{box-shadow:2px 2px 4px 2px rgba(0,0,0,.2)}.swagger-ui .shadow-4-m{box-shadow:2px 2px 8px 0 rgba(0,0,0,.2)}.swagger-ui .shadow-5-m{box-shadow:4px 4px 8px 0 rgba(0,0,0,.2)}}@media screen and (min-width:60em){.swagger-ui .shadow-1-l{box-shadow:0 0 4px 2px rgba(0,0,0,.2)}.swagger-ui .shadow-2-l{box-shadow:0 0 8px 2px rgba(0,0,0,.2)}.swagger-ui .shadow-3-l{box-shadow:2px 2px 4px 2px rgba(0,0,0,.2)}.swagger-ui .shadow-4-l{box-shadow:2px 2px 8px 0 rgba(0,0,0,.2)}.swagger-ui .shadow-5-l{box-shadow:4px 4px 8px 0 rgba(0,0,0,.2)}}.swagger-ui .pre{overflow-x:auto;overflow-y:hidden;overflow:scroll}.swagger-ui .top-0{top:0}.swagger-ui .right-0{right:0}.swagger-ui .bottom-0{bottom:0}.swagger-ui .left-0{left:0}.swagger-ui .top-1{top:1rem}.swagger-ui .right-1{right:1rem}.swagger-ui .bottom-1{bottom:1rem}.swagger-ui .left-1{left:1rem}.swagger-ui .top-2{top:2rem}.swagger-ui .right-2{right:2rem}.swagger-ui .bottom-2{bottom:2rem}.swagger-ui .left-2{left:2rem}.swagger-ui .top--1{top:-1rem}.swagger-ui .right--1{right:-1rem}.swagger-ui .bottom--1{bottom:-1rem}.swagger-ui .left--1{left:-1rem}.swagger-ui .top--2{top:-2rem}.swagger-ui .right--2{right:-2rem}.swagger-ui .bottom--2{bottom:-2rem}.swagger-ui .left--2{left:-2rem}.swagger-ui .absolute--fill{top:0;right:0;bottom:0;left:0}@media screen and (min-width:30em){.swagger-ui .top-0-ns{top:0}.swagger-ui .left-0-ns{left:0}.swagger-ui .right-0-ns{right:0}.swagger-ui .bottom-0-ns{bottom:0}.swagger-ui .top-1-ns{top:1rem}.swagger-ui .left-1-ns{left:1rem}.swagger-ui .right-1-ns{right:1rem}.swagger-ui .bottom-1-ns{bottom:1rem}.swagger-ui .top-2-ns{top:2rem}.swagger-ui .left-2-ns{left:2rem}.swagger-ui .right-2-ns{right:2rem}.swagger-ui .bottom-2-ns{bottom:2rem}.swagger-ui .top--1-ns{top:-1rem}.swagger-ui .right--1-ns{right:-1rem}.swagger-ui .bottom--1-ns{bottom:-1rem}.swagger-ui .left--1-ns{left:-1rem}.swagger-ui .top--2-ns{top:-2rem}.swagger-ui .right--2-ns{right:-2rem}.swagger-ui .bottom--2-ns{bottom:-2rem}.swagger-ui .left--2-ns{left:-2rem}.swagger-ui .absolute--fill-ns{top:0;right:0;bottom:0;left:0}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .top-0-m{top:0}.swagger-ui .left-0-m{left:0}.swagger-ui .right-0-m{right:0}.swagger-ui .bottom-0-m{bottom:0}.swagger-ui .top-1-m{top:1rem}.swagger-ui .left-1-m{left:1rem}.swagger-ui .right-1-m{right:1rem}.swagger-ui .bottom-1-m{bottom:1rem}.swagger-ui .top-2-m{top:2rem}.swagger-ui .left-2-m{left:2rem}.swagger-ui .right-2-m{right:2rem}.swagger-ui .bottom-2-m{bottom:2rem}.swagger-ui .top--1-m{top:-1rem}.swagger-ui .right--1-m{right:-1rem}.swagger-ui .bottom--1-m{bottom:-1rem}.swagger-ui .left--1-m{left:-1rem}.swagger-ui .top--2-m{top:-2rem}.swagger-ui .right--2-m{right:-2rem}.swagger-ui .bottom--2-m{bottom:-2rem}.swagger-ui .left--2-m{left:-2rem}.swagger-ui .absolute--fill-m{top:0;right:0;bottom:0;left:0}}@media screen and (min-width:60em){.swagger-ui .top-0-l{top:0}.swagger-ui .left-0-l{left:0}.swagger-ui .right-0-l{right:0}.swagger-ui .bottom-0-l{bottom:0}.swagger-ui .top-1-l{top:1rem}.swagger-ui .left-1-l{left:1rem}.swagger-ui .right-1-l{right:1rem}.swagger-ui .bottom-1-l{bottom:1rem}.swagger-ui .top-2-l{top:2rem}.swagger-ui .left-2-l{left:2rem}.swagger-ui .right-2-l{right:2rem}.swagger-ui .bottom-2-l{bottom:2rem}.swagger-ui .top--1-l{top:-1rem}.swagger-ui .right--1-l{right:-1rem}.swagger-ui .bottom--1-l{bottom:-1rem}.swagger-ui .left--1-l{left:-1rem}.swagger-ui .top--2-l{top:-2rem}.swagger-ui .right--2-l{right:-2rem}.swagger-ui .bottom--2-l{bottom:-2rem}.swagger-ui .left--2-l{left:-2rem}.swagger-ui .absolute--fill-l{top:0;right:0;bottom:0;left:0}}.swagger-ui .cf:after,.swagger-ui .cf:before{content:" ";display:table}.swagger-ui .cf:after{clear:both}.swagger-ui .cf{*zoom:1}.swagger-ui .cl{clear:left}.swagger-ui .cr{clear:right}.swagger-ui .cb{clear:both}.swagger-ui .cn{clear:none}@media screen and (min-width:30em){.swagger-ui .cl-ns{clear:left}.swagger-ui .cr-ns{clear:right}.swagger-ui .cb-ns{clear:both}.swagger-ui .cn-ns{clear:none}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .cl-m{clear:left}.swagger-ui .cr-m{clear:right}.swagger-ui .cb-m{clear:both}.swagger-ui .cn-m{clear:none}}@media screen and (min-width:60em){.swagger-ui .cl-l{clear:left}.swagger-ui .cr-l{clear:right}.swagger-ui .cb-l{clear:both}.swagger-ui .cn-l{clear:none}}.swagger-ui .flex{display:flex}.swagger-ui .inline-flex{display:inline-flex}.swagger-ui .flex-auto{flex:1 1 auto;min-width:0;min-height:0}.swagger-ui .flex-none{flex:none}.swagger-ui .flex-column{flex-direction:column}.swagger-ui .flex-row{flex-direction:row}.swagger-ui .flex-wrap{flex-wrap:wrap}.swagger-ui .flex-nowrap{flex-wrap:nowrap}.swagger-ui .flex-wrap-reverse{flex-wrap:wrap-reverse}.swagger-ui .flex-column-reverse{flex-direction:column-reverse}.swagger-ui .flex-row-reverse{flex-direction:row-reverse}.swagger-ui .items-start{align-items:flex-start}.swagger-ui .items-end{align-items:flex-end}.swagger-ui .items-center{align-items:center}.swagger-ui .items-baseline{align-items:baseline}.swagger-ui .items-stretch{align-items:stretch}.swagger-ui .self-start{align-self:flex-start}.swagger-ui .self-end{align-self:flex-end}.swagger-ui .self-center{align-self:center}.swagger-ui .self-baseline{align-self:baseline}.swagger-ui .self-stretch{align-self:stretch}.swagger-ui .justify-start{justify-content:flex-start}.swagger-ui .justify-end{justify-content:flex-end}.swagger-ui .justify-center{justify-content:center}.swagger-ui .justify-between{justify-content:space-between}.swagger-ui .justify-around{justify-content:space-around}.swagger-ui .content-start{align-content:flex-start}.swagger-ui .content-end{align-content:flex-end}.swagger-ui .content-center{align-content:center}.swagger-ui .content-between{align-content:space-between}.swagger-ui .content-around{align-content:space-around}.swagger-ui .content-stretch{align-content:stretch}.swagger-ui .order-0{order:0}.swagger-ui .order-1{order:1}.swagger-ui .order-2{order:2}.swagger-ui .order-3{order:3}.swagger-ui .order-4{order:4}.swagger-ui .order-5{order:5}.swagger-ui .order-6{order:6}.swagger-ui .order-7{order:7}.swagger-ui .order-8{order:8}.swagger-ui .order-last{order:99999}.swagger-ui .flex-grow-0{flex-grow:0}.swagger-ui .flex-grow-1{flex-grow:1}.swagger-ui .flex-shrink-0{flex-shrink:0}.swagger-ui .flex-shrink-1{flex-shrink:1}@media screen and (min-width:30em){.swagger-ui .flex-ns{display:flex}.swagger-ui .inline-flex-ns{display:inline-flex}.swagger-ui .flex-auto-ns{flex:1 1 auto;min-width:0;min-height:0}.swagger-ui .flex-none-ns{flex:none}.swagger-ui .flex-column-ns{flex-direction:column}.swagger-ui .flex-row-ns{flex-direction:row}.swagger-ui .flex-wrap-ns{flex-wrap:wrap}.swagger-ui .flex-nowrap-ns{flex-wrap:nowrap}.swagger-ui .flex-wrap-reverse-ns{flex-wrap:wrap-reverse}.swagger-ui .flex-column-reverse-ns{flex-direction:column-reverse}.swagger-ui .flex-row-reverse-ns{flex-direction:row-reverse}.swagger-ui .items-start-ns{align-items:flex-start}.swagger-ui .items-end-ns{align-items:flex-end}.swagger-ui .items-center-ns{align-items:center}.swagger-ui .items-baseline-ns{align-items:baseline}.swagger-ui .items-stretch-ns{align-items:stretch}.swagger-ui .self-start-ns{align-self:flex-start}.swagger-ui .self-end-ns{align-self:flex-end}.swagger-ui .self-center-ns{align-self:center}.swagger-ui .self-baseline-ns{align-self:baseline}.swagger-ui .self-stretch-ns{align-self:stretch}.swagger-ui .justify-start-ns{justify-content:flex-start}.swagger-ui .justify-end-ns{justify-content:flex-end}.swagger-ui .justify-center-ns{justify-content:center}.swagger-ui .justify-between-ns{justify-content:space-between}.swagger-ui .justify-around-ns{justify-content:space-around}.swagger-ui .content-start-ns{align-content:flex-start}.swagger-ui .content-end-ns{align-content:flex-end}.swagger-ui .content-center-ns{align-content:center}.swagger-ui .content-between-ns{align-content:space-between}.swagger-ui .content-around-ns{align-content:space-around}.swagger-ui .content-stretch-ns{align-content:stretch}.swagger-ui .order-0-ns{order:0}.swagger-ui .order-1-ns{order:1}.swagger-ui .order-2-ns{order:2}.swagger-ui .order-3-ns{order:3}.swagger-ui .order-4-ns{order:4}.swagger-ui .order-5-ns{order:5}.swagger-ui .order-6-ns{order:6}.swagger-ui .order-7-ns{order:7}.swagger-ui .order-8-ns{order:8}.swagger-ui .order-last-ns{order:99999}.swagger-ui .flex-grow-0-ns{flex-grow:0}.swagger-ui .flex-grow-1-ns{flex-grow:1}.swagger-ui .flex-shrink-0-ns{flex-shrink:0}.swagger-ui .flex-shrink-1-ns{flex-shrink:1}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .flex-m{display:flex}.swagger-ui .inline-flex-m{display:inline-flex}.swagger-ui .flex-auto-m{flex:1 1 auto;min-width:0;min-height:0}.swagger-ui .flex-none-m{flex:none}.swagger-ui .flex-column-m{flex-direction:column}.swagger-ui .flex-row-m{flex-direction:row}.swagger-ui .flex-wrap-m{flex-wrap:wrap}.swagger-ui .flex-nowrap-m{flex-wrap:nowrap}.swagger-ui .flex-wrap-reverse-m{flex-wrap:wrap-reverse}.swagger-ui .flex-column-reverse-m{flex-direction:column-reverse}.swagger-ui .flex-row-reverse-m{flex-direction:row-reverse}.swagger-ui .items-start-m{align-items:flex-start}.swagger-ui .items-end-m{align-items:flex-end}.swagger-ui .items-center-m{align-items:center}.swagger-ui .items-baseline-m{align-items:baseline}.swagger-ui .items-stretch-m{align-items:stretch}.swagger-ui .self-start-m{align-self:flex-start}.swagger-ui .self-end-m{align-self:flex-end}.swagger-ui .self-center-m{align-self:center}.swagger-ui .self-baseline-m{align-self:baseline}.swagger-ui .self-stretch-m{align-self:stretch}.swagger-ui .justify-start-m{justify-content:flex-start}.swagger-ui .justify-end-m{justify-content:flex-end}.swagger-ui .justify-center-m{justify-content:center}.swagger-ui .justify-between-m{justify-content:space-between}.swagger-ui .justify-around-m{justify-content:space-around}.swagger-ui .content-start-m{align-content:flex-start}.swagger-ui .content-end-m{align-content:flex-end}.swagger-ui .content-center-m{align-content:center}.swagger-ui .content-between-m{align-content:space-between}.swagger-ui .content-around-m{align-content:space-around}.swagger-ui .content-stretch-m{align-content:stretch}.swagger-ui .order-0-m{order:0}.swagger-ui .order-1-m{order:1}.swagger-ui .order-2-m{order:2}.swagger-ui .order-3-m{order:3}.swagger-ui .order-4-m{order:4}.swagger-ui .order-5-m{order:5}.swagger-ui .order-6-m{order:6}.swagger-ui .order-7-m{order:7}.swagger-ui .order-8-m{order:8}.swagger-ui .order-last-m{order:99999}.swagger-ui .flex-grow-0-m{flex-grow:0}.swagger-ui .flex-grow-1-m{flex-grow:1}.swagger-ui .flex-shrink-0-m{flex-shrink:0}.swagger-ui .flex-shrink-1-m{flex-shrink:1}}@media screen and (min-width:60em){.swagger-ui .flex-l{display:flex}.swagger-ui .inline-flex-l{display:inline-flex}.swagger-ui .flex-auto-l{flex:1 1 auto;min-width:0;min-height:0}.swagger-ui .flex-none-l{flex:none}.swagger-ui .flex-column-l{flex-direction:column}.swagger-ui .flex-row-l{flex-direction:row}.swagger-ui .flex-wrap-l{flex-wrap:wrap}.swagger-ui .flex-nowrap-l{flex-wrap:nowrap}.swagger-ui .flex-wrap-reverse-l{flex-wrap:wrap-reverse}.swagger-ui .flex-column-reverse-l{flex-direction:column-reverse}.swagger-ui .flex-row-reverse-l{flex-direction:row-reverse}.swagger-ui .items-start-l{align-items:flex-start}.swagger-ui .items-end-l{align-items:flex-end}.swagger-ui .items-center-l{align-items:center}.swagger-ui .items-baseline-l{align-items:baseline}.swagger-ui .items-stretch-l{align-items:stretch}.swagger-ui .self-start-l{align-self:flex-start}.swagger-ui .self-end-l{align-self:flex-end}.swagger-ui .self-center-l{align-self:center}.swagger-ui .self-baseline-l{align-self:baseline}.swagger-ui .self-stretch-l{align-self:stretch}.swagger-ui .justify-start-l{justify-content:flex-start}.swagger-ui .justify-end-l{justify-content:flex-end}.swagger-ui .justify-center-l{justify-content:center}.swagger-ui .justify-between-l{justify-content:space-between}.swagger-ui .justify-around-l{justify-content:space-around}.swagger-ui .content-start-l{align-content:flex-start}.swagger-ui .content-end-l{align-content:flex-end}.swagger-ui .content-center-l{align-content:center}.swagger-ui .content-between-l{align-content:space-between}.swagger-ui .content-around-l{align-content:space-around}.swagger-ui .content-stretch-l{align-content:stretch}.swagger-ui .order-0-l{order:0}.swagger-ui .order-1-l{order:1}.swagger-ui .order-2-l{order:2}.swagger-ui .order-3-l{order:3}.swagger-ui .order-4-l{order:4}.swagger-ui .order-5-l{order:5}.swagger-ui .order-6-l{order:6}.swagger-ui .order-7-l{order:7}.swagger-ui .order-8-l{order:8}.swagger-ui .order-last-l{order:99999}.swagger-ui .flex-grow-0-l{flex-grow:0}.swagger-ui .flex-grow-1-l{flex-grow:1}.swagger-ui .flex-shrink-0-l{flex-shrink:0}.swagger-ui .flex-shrink-1-l{flex-shrink:1}}.swagger-ui .dn{display:none}.swagger-ui .di{display:inline}.swagger-ui .db{display:block}.swagger-ui .dib{display:inline-block}.swagger-ui .dit{display:inline-table}.swagger-ui .dt{display:table}.swagger-ui .dtc{display:table-cell}.swagger-ui .dt-row{display:table-row}.swagger-ui .dt-row-group{display:table-row-group}.swagger-ui .dt-column{display:table-column}.swagger-ui .dt-column-group{display:table-column-group}.swagger-ui .dt--fixed{table-layout:fixed;width:100%}@media screen and (min-width:30em){.swagger-ui .dn-ns{display:none}.swagger-ui .di-ns{display:inline}.swagger-ui .db-ns{display:block}.swagger-ui .dib-ns{display:inline-block}.swagger-ui .dit-ns{display:inline-table}.swagger-ui .dt-ns{display:table}.swagger-ui .dtc-ns{display:table-cell}.swagger-ui .dt-row-ns{display:table-row}.swagger-ui .dt-row-group-ns{display:table-row-group}.swagger-ui .dt-column-ns{display:table-column}.swagger-ui .dt-column-group-ns{display:table-column-group}.swagger-ui .dt--fixed-ns{table-layout:fixed;width:100%}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .dn-m{display:none}.swagger-ui .di-m{display:inline}.swagger-ui .db-m{display:block}.swagger-ui .dib-m{display:inline-block}.swagger-ui .dit-m{display:inline-table}.swagger-ui .dt-m{display:table}.swagger-ui .dtc-m{display:table-cell}.swagger-ui .dt-row-m{display:table-row}.swagger-ui .dt-row-group-m{display:table-row-group}.swagger-ui .dt-column-m{display:table-column}.swagger-ui .dt-column-group-m{display:table-column-group}.swagger-ui .dt--fixed-m{table-layout:fixed;width:100%}}@media screen and (min-width:60em){.swagger-ui .dn-l{display:none}.swagger-ui .di-l{display:inline}.swagger-ui .db-l{display:block}.swagger-ui .dib-l{display:inline-block}.swagger-ui .dit-l{display:inline-table}.swagger-ui .dt-l{display:table}.swagger-ui .dtc-l{display:table-cell}.swagger-ui .dt-row-l{display:table-row}.swagger-ui .dt-row-group-l{display:table-row-group}.swagger-ui .dt-column-l{display:table-column}.swagger-ui .dt-column-group-l{display:table-column-group}.swagger-ui .dt--fixed-l{table-layout:fixed;width:100%}}.swagger-ui .fl{float:left;_display:inline}.swagger-ui .fr{float:right;_display:inline}.swagger-ui .fn{float:none}@media screen and (min-width:30em){.swagger-ui .fl-ns{float:left;_display:inline}.swagger-ui .fr-ns{float:right;_display:inline}.swagger-ui .fn-ns{float:none}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .fl-m{float:left;_display:inline}.swagger-ui .fr-m{float:right;_display:inline}.swagger-ui .fn-m{float:none}}@media screen and (min-width:60em){.swagger-ui .fl-l{float:left;_display:inline}.swagger-ui .fr-l{float:right;_display:inline}.swagger-ui .fn-l{float:none}}.swagger-ui .sans-serif{font-family:-apple-system,BlinkMacSystemFont,avenir next,avenir,helvetica,helvetica neue,ubuntu,roboto,noto,segoe ui,arial,sans-serif}.swagger-ui .serif{font-family:georgia,serif}.swagger-ui .system-sans-serif{font-family:sans-serif}.swagger-ui .system-serif{font-family:serif}.swagger-ui .code,.swagger-ui code{font-family:Consolas,monaco,monospace}.swagger-ui .courier{font-family:Courier Next,courier,monospace}.swagger-ui .helvetica{font-family:helvetica neue,helvetica,sans-serif}.swagger-ui .avenir{font-family:avenir next,avenir,sans-serif}.swagger-ui .athelas{font-family:athelas,georgia,serif}.swagger-ui .georgia{font-family:georgia,serif}.swagger-ui .times{font-family:times,serif}.swagger-ui .bodoni{font-family:Bodoni MT,serif}.swagger-ui .calisto{font-family:Calisto MT,serif}.swagger-ui .garamond{font-family:garamond,serif}.swagger-ui .baskerville{font-family:baskerville,serif}.swagger-ui .i{font-style:italic}.swagger-ui .fs-normal{font-style:normal}@media screen and (min-width:30em){.swagger-ui .i-ns{font-style:italic}.swagger-ui .fs-normal-ns{font-style:normal}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .i-m{font-style:italic}.swagger-ui .fs-normal-m{font-style:normal}}@media screen and (min-width:60em){.swagger-ui .i-l{font-style:italic}.swagger-ui .fs-normal-l{font-style:normal}}.swagger-ui .normal{font-weight:400}.swagger-ui .b{font-weight:700}.swagger-ui .fw1{font-weight:100}.swagger-ui .fw2{font-weight:200}.swagger-ui .fw3{font-weight:300}.swagger-ui .fw4{font-weight:400}.swagger-ui .fw5{font-weight:500}.swagger-ui .fw6{font-weight:600}.swagger-ui .fw7{font-weight:700}.swagger-ui .fw8{font-weight:800}.swagger-ui .fw9{font-weight:900}@media screen and (min-width:30em){.swagger-ui .normal-ns{font-weight:400}.swagger-ui .b-ns{font-weight:700}.swagger-ui .fw1-ns{font-weight:100}.swagger-ui .fw2-ns{font-weight:200}.swagger-ui .fw3-ns{font-weight:300}.swagger-ui .fw4-ns{font-weight:400}.swagger-ui .fw5-ns{font-weight:500}.swagger-ui .fw6-ns{font-weight:600}.swagger-ui .fw7-ns{font-weight:700}.swagger-ui .fw8-ns{font-weight:800}.swagger-ui .fw9-ns{font-weight:900}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .normal-m{font-weight:400}.swagger-ui .b-m{font-weight:700}.swagger-ui .fw1-m{font-weight:100}.swagger-ui .fw2-m{font-weight:200}.swagger-ui .fw3-m{font-weight:300}.swagger-ui .fw4-m{font-weight:400}.swagger-ui .fw5-m{font-weight:500}.swagger-ui .fw6-m{font-weight:600}.swagger-ui .fw7-m{font-weight:700}.swagger-ui .fw8-m{font-weight:800}.swagger-ui .fw9-m{font-weight:900}}@media screen and (min-width:60em){.swagger-ui .normal-l{font-weight:400}.swagger-ui .b-l{font-weight:700}.swagger-ui .fw1-l{font-weight:100}.swagger-ui .fw2-l{font-weight:200}.swagger-ui .fw3-l{font-weight:300}.swagger-ui .fw4-l{font-weight:400}.swagger-ui .fw5-l{font-weight:500}.swagger-ui .fw6-l{font-weight:600}.swagger-ui .fw7-l{font-weight:700}.swagger-ui .fw8-l{font-weight:800}.swagger-ui .fw9-l{font-weight:900}}.swagger-ui .input-reset{-webkit-appearance:none;-moz-appearance:none}.swagger-ui .button-reset::-moz-focus-inner,.swagger-ui .input-reset::-moz-focus-inner{border:0;padding:0}.swagger-ui .h1{height:1rem}.swagger-ui .h2{height:2rem}.swagger-ui .h3{height:4rem}.swagger-ui .h4{height:8rem}.swagger-ui .h5{height:16rem}.swagger-ui .h-25{height:25%}.swagger-ui .h-50{height:50%}.swagger-ui .h-75{height:75%}.swagger-ui .h-100{height:100%}.swagger-ui .min-h-100{min-height:100%}.swagger-ui .vh-25{height:25vh}.swagger-ui .vh-50{height:50vh}.swagger-ui .vh-75{height:75vh}.swagger-ui .vh-100{height:100vh}.swagger-ui .min-vh-100{min-height:100vh}.swagger-ui .h-auto{height:auto}.swagger-ui .h-inherit{height:inherit}@media screen and (min-width:30em){.swagger-ui .h1-ns{height:1rem}.swagger-ui .h2-ns{height:2rem}.swagger-ui .h3-ns{height:4rem}.swagger-ui .h4-ns{height:8rem}.swagger-ui .h5-ns{height:16rem}.swagger-ui .h-25-ns{height:25%}.swagger-ui .h-50-ns{height:50%}.swagger-ui .h-75-ns{height:75%}.swagger-ui .h-100-ns{height:100%}.swagger-ui .min-h-100-ns{min-height:100%}.swagger-ui .vh-25-ns{height:25vh}.swagger-ui .vh-50-ns{height:50vh}.swagger-ui .vh-75-ns{height:75vh}.swagger-ui .vh-100-ns{height:100vh}.swagger-ui .min-vh-100-ns{min-height:100vh}.swagger-ui .h-auto-ns{height:auto}.swagger-ui .h-inherit-ns{height:inherit}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .h1-m{height:1rem}.swagger-ui .h2-m{height:2rem}.swagger-ui .h3-m{height:4rem}.swagger-ui .h4-m{height:8rem}.swagger-ui .h5-m{height:16rem}.swagger-ui .h-25-m{height:25%}.swagger-ui .h-50-m{height:50%}.swagger-ui .h-75-m{height:75%}.swagger-ui .h-100-m{height:100%}.swagger-ui .min-h-100-m{min-height:100%}.swagger-ui .vh-25-m{height:25vh}.swagger-ui .vh-50-m{height:50vh}.swagger-ui .vh-75-m{height:75vh}.swagger-ui .vh-100-m{height:100vh}.swagger-ui .min-vh-100-m{min-height:100vh}.swagger-ui .h-auto-m{height:auto}.swagger-ui .h-inherit-m{height:inherit}}@media screen and (min-width:60em){.swagger-ui .h1-l{height:1rem}.swagger-ui .h2-l{height:2rem}.swagger-ui .h3-l{height:4rem}.swagger-ui .h4-l{height:8rem}.swagger-ui .h5-l{height:16rem}.swagger-ui .h-25-l{height:25%}.swagger-ui .h-50-l{height:50%}.swagger-ui .h-75-l{height:75%}.swagger-ui .h-100-l{height:100%}.swagger-ui .min-h-100-l{min-height:100%}.swagger-ui .vh-25-l{height:25vh}.swagger-ui .vh-50-l{height:50vh}.swagger-ui .vh-75-l{height:75vh}.swagger-ui .vh-100-l{height:100vh}.swagger-ui .min-vh-100-l{min-height:100vh}.swagger-ui .h-auto-l{height:auto}.swagger-ui .h-inherit-l{height:inherit}}.swagger-ui .tracked{letter-spacing:.1em}.swagger-ui .tracked-tight{letter-spacing:-.05em}.swagger-ui .tracked-mega{letter-spacing:.25em}@media screen and (min-width:30em){.swagger-ui .tracked-ns{letter-spacing:.1em}.swagger-ui .tracked-tight-ns{letter-spacing:-.05em}.swagger-ui .tracked-mega-ns{letter-spacing:.25em}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .tracked-m{letter-spacing:.1em}.swagger-ui .tracked-tight-m{letter-spacing:-.05em}.swagger-ui .tracked-mega-m{letter-spacing:.25em}}@media screen and (min-width:60em){.swagger-ui .tracked-l{letter-spacing:.1em}.swagger-ui .tracked-tight-l{letter-spacing:-.05em}.swagger-ui .tracked-mega-l{letter-spacing:.25em}}.swagger-ui .lh-solid{line-height:1}.swagger-ui .lh-title{line-height:1.25}.swagger-ui .lh-copy{line-height:1.5}@media screen and (min-width:30em){.swagger-ui .lh-solid-ns{line-height:1}.swagger-ui .lh-title-ns{line-height:1.25}.swagger-ui .lh-copy-ns{line-height:1.5}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .lh-solid-m{line-height:1}.swagger-ui .lh-title-m{line-height:1.25}.swagger-ui .lh-copy-m{line-height:1.5}}@media screen and (min-width:60em){.swagger-ui .lh-solid-l{line-height:1}.swagger-ui .lh-title-l{line-height:1.25}.swagger-ui .lh-copy-l{line-height:1.5}}.swagger-ui .link{text-decoration:none}.swagger-ui .link,.swagger-ui .link:link,.swagger-ui .link:visited{transition:color .15s ease-in}.swagger-ui .link:hover{transition:color .15s ease-in}.swagger-ui .link:active{transition:color .15s ease-in}.swagger-ui .link:focus{transition:color .15s ease-in;outline:1px dotted currentColor}.swagger-ui .list{list-style-type:none}.swagger-ui .mw-100{max-width:100%}.swagger-ui .mw1{max-width:1rem}.swagger-ui .mw2{max-width:2rem}.swagger-ui .mw3{max-width:4rem}.swagger-ui .mw4{max-width:8rem}.swagger-ui .mw5{max-width:16rem}.swagger-ui .mw6{max-width:32rem}.swagger-ui .mw7{max-width:48rem}.swagger-ui .mw8{max-width:64rem}.swagger-ui .mw9{max-width:96rem}.swagger-ui .mw-none{max-width:none}@media screen and (min-width:30em){.swagger-ui .mw-100-ns{max-width:100%}.swagger-ui .mw1-ns{max-width:1rem}.swagger-ui .mw2-ns{max-width:2rem}.swagger-ui .mw3-ns{max-width:4rem}.swagger-ui .mw4-ns{max-width:8rem}.swagger-ui .mw5-ns{max-width:16rem}.swagger-ui .mw6-ns{max-width:32rem}.swagger-ui .mw7-ns{max-width:48rem}.swagger-ui .mw8-ns{max-width:64rem}.swagger-ui .mw9-ns{max-width:96rem}.swagger-ui .mw-none-ns{max-width:none}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .mw-100-m{max-width:100%}.swagger-ui .mw1-m{max-width:1rem}.swagger-ui .mw2-m{max-width:2rem}.swagger-ui .mw3-m{max-width:4rem}.swagger-ui .mw4-m{max-width:8rem}.swagger-ui .mw5-m{max-width:16rem}.swagger-ui .mw6-m{max-width:32rem}.swagger-ui .mw7-m{max-width:48rem}.swagger-ui .mw8-m{max-width:64rem}.swagger-ui .mw9-m{max-width:96rem}.swagger-ui .mw-none-m{max-width:none}}@media screen and (min-width:60em){.swagger-ui .mw-100-l{max-width:100%}.swagger-ui .mw1-l{max-width:1rem}.swagger-ui .mw2-l{max-width:2rem}.swagger-ui .mw3-l{max-width:4rem}.swagger-ui .mw4-l{max-width:8rem}.swagger-ui .mw5-l{max-width:16rem}.swagger-ui .mw6-l{max-width:32rem}.swagger-ui .mw7-l{max-width:48rem}.swagger-ui .mw8-l{max-width:64rem}.swagger-ui .mw9-l{max-width:96rem}.swagger-ui .mw-none-l{max-width:none}}.swagger-ui .w1{width:1rem}.swagger-ui .w2{width:2rem}.swagger-ui .w3{width:4rem}.swagger-ui .w4{width:8rem}.swagger-ui .w5{width:16rem}.swagger-ui .w-10{width:10%}.swagger-ui .w-20{width:20%}.swagger-ui .w-25{width:25%}.swagger-ui .w-30{width:30%}.swagger-ui .w-33{width:33%}.swagger-ui .w-34{width:34%}.swagger-ui .w-40{width:40%}.swagger-ui .w-50{width:50%}.swagger-ui .w-60{width:60%}.swagger-ui .w-70{width:70%}.swagger-ui .w-75{width:75%}.swagger-ui .w-80{width:80%}.swagger-ui .w-90{width:90%}.swagger-ui .w-100{width:100%}.swagger-ui .w-third{width:33.33333%}.swagger-ui .w-two-thirds{width:66.66667%}.swagger-ui .w-auto{width:auto}@media screen and (min-width:30em){.swagger-ui .w1-ns{width:1rem}.swagger-ui .w2-ns{width:2rem}.swagger-ui .w3-ns{width:4rem}.swagger-ui .w4-ns{width:8rem}.swagger-ui .w5-ns{width:16rem}.swagger-ui .w-10-ns{width:10%}.swagger-ui .w-20-ns{width:20%}.swagger-ui .w-25-ns{width:25%}.swagger-ui .w-30-ns{width:30%}.swagger-ui .w-33-ns{width:33%}.swagger-ui .w-34-ns{width:34%}.swagger-ui .w-40-ns{width:40%}.swagger-ui .w-50-ns{width:50%}.swagger-ui .w-60-ns{width:60%}.swagger-ui .w-70-ns{width:70%}.swagger-ui .w-75-ns{width:75%}.swagger-ui .w-80-ns{width:80%}.swagger-ui .w-90-ns{width:90%}.swagger-ui .w-100-ns{width:100%}.swagger-ui .w-third-ns{width:33.33333%}.swagger-ui .w-two-thirds-ns{width:66.66667%}.swagger-ui .w-auto-ns{width:auto}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .w1-m{width:1rem}.swagger-ui .w2-m{width:2rem}.swagger-ui .w3-m{width:4rem}.swagger-ui .w4-m{width:8rem}.swagger-ui .w5-m{width:16rem}.swagger-ui .w-10-m{width:10%}.swagger-ui .w-20-m{width:20%}.swagger-ui .w-25-m{width:25%}.swagger-ui .w-30-m{width:30%}.swagger-ui .w-33-m{width:33%}.swagger-ui .w-34-m{width:34%}.swagger-ui .w-40-m{width:40%}.swagger-ui .w-50-m{width:50%}.swagger-ui .w-60-m{width:60%}.swagger-ui .w-70-m{width:70%}.swagger-ui .w-75-m{width:75%}.swagger-ui .w-80-m{width:80%}.swagger-ui .w-90-m{width:90%}.swagger-ui .w-100-m{width:100%}.swagger-ui .w-third-m{width:33.33333%}.swagger-ui .w-two-thirds-m{width:66.66667%}.swagger-ui .w-auto-m{width:auto}}@media screen and (min-width:60em){.swagger-ui .w1-l{width:1rem}.swagger-ui .w2-l{width:2rem}.swagger-ui .w3-l{width:4rem}.swagger-ui .w4-l{width:8rem}.swagger-ui .w5-l{width:16rem}.swagger-ui .w-10-l{width:10%}.swagger-ui .w-20-l{width:20%}.swagger-ui .w-25-l{width:25%}.swagger-ui .w-30-l{width:30%}.swagger-ui .w-33-l{width:33%}.swagger-ui .w-34-l{width:34%}.swagger-ui .w-40-l{width:40%}.swagger-ui .w-50-l{width:50%}.swagger-ui .w-60-l{width:60%}.swagger-ui .w-70-l{width:70%}.swagger-ui .w-75-l{width:75%}.swagger-ui .w-80-l{width:80%}.swagger-ui .w-90-l{width:90%}.swagger-ui .w-100-l{width:100%}.swagger-ui .w-third-l{width:33.33333%}.swagger-ui .w-two-thirds-l{width:66.66667%}.swagger-ui .w-auto-l{width:auto}}.swagger-ui .overflow-visible{overflow:visible}.swagger-ui .overflow-hidden{overflow:hidden}.swagger-ui .overflow-scroll{overflow:scroll}.swagger-ui .overflow-auto{overflow:auto}.swagger-ui .overflow-x-visible{overflow-x:visible}.swagger-ui .overflow-x-hidden{overflow-x:hidden}.swagger-ui .overflow-x-scroll{overflow-x:scroll}.swagger-ui .overflow-x-auto{overflow-x:auto}.swagger-ui .overflow-y-visible{overflow-y:visible}.swagger-ui .overflow-y-hidden{overflow-y:hidden}.swagger-ui .overflow-y-scroll{overflow-y:scroll}.swagger-ui .overflow-y-auto{overflow-y:auto}@media screen and (min-width:30em){.swagger-ui .overflow-visible-ns{overflow:visible}.swagger-ui .overflow-hidden-ns{overflow:hidden}.swagger-ui .overflow-scroll-ns{overflow:scroll}.swagger-ui .overflow-auto-ns{overflow:auto}.swagger-ui .overflow-x-visible-ns{overflow-x:visible}.swagger-ui .overflow-x-hidden-ns{overflow-x:hidden}.swagger-ui .overflow-x-scroll-ns{overflow-x:scroll}.swagger-ui .overflow-x-auto-ns{overflow-x:auto}.swagger-ui .overflow-y-visible-ns{overflow-y:visible}.swagger-ui .overflow-y-hidden-ns{overflow-y:hidden}.swagger-ui .overflow-y-scroll-ns{overflow-y:scroll}.swagger-ui .overflow-y-auto-ns{overflow-y:auto}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .overflow-visible-m{overflow:visible}.swagger-ui .overflow-hidden-m{overflow:hidden}.swagger-ui .overflow-scroll-m{overflow:scroll}.swagger-ui .overflow-auto-m{overflow:auto}.swagger-ui .overflow-x-visible-m{overflow-x:visible}.swagger-ui .overflow-x-hidden-m{overflow-x:hidden}.swagger-ui .overflow-x-scroll-m{overflow-x:scroll}.swagger-ui .overflow-x-auto-m{overflow-x:auto}.swagger-ui .overflow-y-visible-m{overflow-y:visible}.swagger-ui .overflow-y-hidden-m{overflow-y:hidden}.swagger-ui .overflow-y-scroll-m{overflow-y:scroll}.swagger-ui .overflow-y-auto-m{overflow-y:auto}}@media screen and (min-width:60em){.swagger-ui .overflow-visible-l{overflow:visible}.swagger-ui .overflow-hidden-l{overflow:hidden}.swagger-ui .overflow-scroll-l{overflow:scroll}.swagger-ui .overflow-auto-l{overflow:auto}.swagger-ui .overflow-x-visible-l{overflow-x:visible}.swagger-ui .overflow-x-hidden-l{overflow-x:hidden}.swagger-ui .overflow-x-scroll-l{overflow-x:scroll}.swagger-ui .overflow-x-auto-l{overflow-x:auto}.swagger-ui .overflow-y-visible-l{overflow-y:visible}.swagger-ui .overflow-y-hidden-l{overflow-y:hidden}.swagger-ui .overflow-y-scroll-l{overflow-y:scroll}.swagger-ui .overflow-y-auto-l{overflow-y:auto}}.swagger-ui .static{position:static}.swagger-ui .relative{position:relative}.swagger-ui .absolute{position:absolute}.swagger-ui .fixed{position:fixed}@media screen and (min-width:30em){.swagger-ui .static-ns{position:static}.swagger-ui .relative-ns{position:relative}.swagger-ui .absolute-ns{position:absolute}.swagger-ui .fixed-ns{position:fixed}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .static-m{position:static}.swagger-ui .relative-m{position:relative}.swagger-ui .absolute-m{position:absolute}.swagger-ui .fixed-m{position:fixed}}@media screen and (min-width:60em){.swagger-ui .static-l{position:static}.swagger-ui .relative-l{position:relative}.swagger-ui .absolute-l{position:absolute}.swagger-ui .fixed-l{position:fixed}}.swagger-ui .o-100{opacity:1}.swagger-ui .o-90{opacity:.9}.swagger-ui .o-80{opacity:.8}.swagger-ui .o-70{opacity:.7}.swagger-ui .o-60{opacity:.6}.swagger-ui .o-50{opacity:.5}.swagger-ui .o-40{opacity:.4}.swagger-ui .o-30{opacity:.3}.swagger-ui .o-20{opacity:.2}.swagger-ui .o-10{opacity:.1}.swagger-ui .o-05{opacity:.05}.swagger-ui .o-025{opacity:.025}.swagger-ui .o-0{opacity:0}.swagger-ui .rotate-45{-webkit-transform:rotate(45deg);transform:rotate(45deg)}.swagger-ui .rotate-90{-webkit-transform:rotate(90deg);transform:rotate(90deg)}.swagger-ui .rotate-135{-webkit-transform:rotate(135deg);transform:rotate(135deg)}.swagger-ui .rotate-180{-webkit-transform:rotate(180deg);transform:rotate(180deg)}.swagger-ui .rotate-225{-webkit-transform:rotate(225deg);transform:rotate(225deg)}.swagger-ui .rotate-270{-webkit-transform:rotate(270deg);transform:rotate(270deg)}.swagger-ui .rotate-315{-webkit-transform:rotate(315deg);transform:rotate(315deg)}@media screen and (min-width:30em){.swagger-ui .rotate-45-ns{-webkit-transform:rotate(45deg);transform:rotate(45deg)}.swagger-ui .rotate-90-ns{-webkit-transform:rotate(90deg);transform:rotate(90deg)}.swagger-ui .rotate-135-ns{-webkit-transform:rotate(135deg);transform:rotate(135deg)}.swagger-ui .rotate-180-ns{-webkit-transform:rotate(180deg);transform:rotate(180deg)}.swagger-ui .rotate-225-ns{-webkit-transform:rotate(225deg);transform:rotate(225deg)}.swagger-ui .rotate-270-ns{-webkit-transform:rotate(270deg);transform:rotate(270deg)}.swagger-ui .rotate-315-ns{-webkit-transform:rotate(315deg);transform:rotate(315deg)}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .rotate-45-m{-webkit-transform:rotate(45deg);transform:rotate(45deg)}.swagger-ui .rotate-90-m{-webkit-transform:rotate(90deg);transform:rotate(90deg)}.swagger-ui .rotate-135-m{-webkit-transform:rotate(135deg);transform:rotate(135deg)}.swagger-ui .rotate-180-m{-webkit-transform:rotate(180deg);transform:rotate(180deg)}.swagger-ui .rotate-225-m{-webkit-transform:rotate(225deg);transform:rotate(225deg)}.swagger-ui .rotate-270-m{-webkit-transform:rotate(270deg);transform:rotate(270deg)}.swagger-ui .rotate-315-m{-webkit-transform:rotate(315deg);transform:rotate(315deg)}}@media screen and (min-width:60em){.swagger-ui .rotate-45-l{-webkit-transform:rotate(45deg);transform:rotate(45deg)}.swagger-ui .rotate-90-l{-webkit-transform:rotate(90deg);transform:rotate(90deg)}.swagger-ui .rotate-135-l{-webkit-transform:rotate(135deg);transform:rotate(135deg)}.swagger-ui .rotate-180-l{-webkit-transform:rotate(180deg);transform:rotate(180deg)}.swagger-ui .rotate-225-l{-webkit-transform:rotate(225deg);transform:rotate(225deg)}.swagger-ui .rotate-270-l{-webkit-transform:rotate(270deg);transform:rotate(270deg)}.swagger-ui .rotate-315-l{-webkit-transform:rotate(315deg);transform:rotate(315deg)}}.swagger-ui .black-90{color:rgba(0,0,0,.9)}.swagger-ui .black-80{color:rgba(0,0,0,.8)}.swagger-ui .black-70{color:rgba(0,0,0,.7)}.swagger-ui .black-60{color:rgba(0,0,0,.6)}.swagger-ui .black-50{color:rgba(0,0,0,.5)}.swagger-ui .black-40{color:rgba(0,0,0,.4)}.swagger-ui .black-30{color:rgba(0,0,0,.3)}.swagger-ui .black-20{color:rgba(0,0,0,.2)}.swagger-ui .black-10{color:rgba(0,0,0,.1)}.swagger-ui .black-05{color:rgba(0,0,0,.05)}.swagger-ui .white-90{color:hsla(0,0%,100%,.9)}.swagger-ui .white-80{color:hsla(0,0%,100%,.8)}.swagger-ui .white-70{color:hsla(0,0%,100%,.7)}.swagger-ui .white-60{color:hsla(0,0%,100%,.6)}.swagger-ui .white-50{color:hsla(0,0%,100%,.5)}.swagger-ui .white-40{color:hsla(0,0%,100%,.4)}.swagger-ui .white-30{color:hsla(0,0%,100%,.3)}.swagger-ui .white-20{color:hsla(0,0%,100%,.2)}.swagger-ui .white-10{color:hsla(0,0%,100%,.1)}.swagger-ui .black{color:#000}.swagger-ui .near-black{color:#111}.swagger-ui .dark-gray{color:#333}.swagger-ui .mid-gray{color:#555}.swagger-ui .gray{color:#777}.swagger-ui .silver{color:#999}.swagger-ui .light-silver{color:#aaa}.swagger-ui .moon-gray{color:#ccc}.swagger-ui .light-gray{color:#eee}.swagger-ui .near-white{color:#f4f4f4}.swagger-ui .white{color:#fff}.swagger-ui .dark-red{color:#e7040f}.swagger-ui .red{color:#ff4136}.swagger-ui .light-red{color:#ff725c}.swagger-ui .orange{color:#ff6300}.swagger-ui .gold{color:#ffb700}.swagger-ui .yellow{color:gold}.swagger-ui .light-yellow{color:#fbf1a9}.swagger-ui .purple{color:#5e2ca5}.swagger-ui .light-purple{color:#a463f2}.swagger-ui .dark-pink{color:#d5008f}.swagger-ui .hot-pink{color:#ff41b4}.swagger-ui .pink{color:#ff80cc}.swagger-ui .light-pink{color:#ffa3d7}.swagger-ui .dark-green{color:#137752}.swagger-ui .green{color:#19a974}.swagger-ui .light-green{color:#9eebcf}.swagger-ui .navy{color:#001b44}.swagger-ui .dark-blue{color:#00449e}.swagger-ui .blue{color:#357edd}.swagger-ui .light-blue{color:#96ccff}.swagger-ui .lightest-blue{color:#cdecff}.swagger-ui .washed-blue{color:#f6fffe}.swagger-ui .washed-green{color:#e8fdf5}.swagger-ui .washed-yellow{color:#fffceb}.swagger-ui .washed-red{color:#ffdfdf}.swagger-ui .color-inherit{color:inherit}.swagger-ui .bg-black-90{background-color:rgba(0,0,0,.9)}.swagger-ui .bg-black-80{background-color:rgba(0,0,0,.8)}.swagger-ui .bg-black-70{background-color:rgba(0,0,0,.7)}.swagger-ui .bg-black-60{background-color:rgba(0,0,0,.6)}.swagger-ui .bg-black-50{background-color:rgba(0,0,0,.5)}.swagger-ui .bg-black-40{background-color:rgba(0,0,0,.4)}.swagger-ui .bg-black-30{background-color:rgba(0,0,0,.3)}.swagger-ui .bg-black-20{background-color:rgba(0,0,0,.2)}.swagger-ui .bg-black-10{background-color:rgba(0,0,0,.1)}.swagger-ui .bg-black-05{background-color:rgba(0,0,0,.05)}.swagger-ui .bg-white-90{background-color:hsla(0,0%,100%,.9)}.swagger-ui .bg-white-80{background-color:hsla(0,0%,100%,.8)}.swagger-ui .bg-white-70{background-color:hsla(0,0%,100%,.7)}.swagger-ui .bg-white-60{background-color:hsla(0,0%,100%,.6)}.swagger-ui .bg-white-50{background-color:hsla(0,0%,100%,.5)}.swagger-ui .bg-white-40{background-color:hsla(0,0%,100%,.4)}.swagger-ui .bg-white-30{background-color:hsla(0,0%,100%,.3)}.swagger-ui .bg-white-20{background-color:hsla(0,0%,100%,.2)}.swagger-ui .bg-white-10{background-color:hsla(0,0%,100%,.1)}.swagger-ui .bg-black{background-color:#000}.swagger-ui .bg-near-black{background-color:#111}.swagger-ui .bg-dark-gray{background-color:#333}.swagger-ui .bg-mid-gray{background-color:#555}.swagger-ui .bg-gray{background-color:#777}.swagger-ui .bg-silver{background-color:#999}.swagger-ui .bg-light-silver{background-color:#aaa}.swagger-ui .bg-moon-gray{background-color:#ccc}.swagger-ui .bg-light-gray{background-color:#eee}.swagger-ui .bg-near-white{background-color:#f4f4f4}.swagger-ui .bg-white{background-color:#fff}.swagger-ui .bg-transparent{background-color:transparent}.swagger-ui .bg-dark-red{background-color:#e7040f}.swagger-ui .bg-red{background-color:#ff4136}.swagger-ui .bg-light-red{background-color:#ff725c}.swagger-ui .bg-orange{background-color:#ff6300}.swagger-ui .bg-gold{background-color:#ffb700}.swagger-ui .bg-yellow{background-color:gold}.swagger-ui .bg-light-yellow{background-color:#fbf1a9}.swagger-ui .bg-purple{background-color:#5e2ca5}.swagger-ui .bg-light-purple{background-color:#a463f2}.swagger-ui .bg-dark-pink{background-color:#d5008f}.swagger-ui .bg-hot-pink{background-color:#ff41b4}.swagger-ui .bg-pink{background-color:#ff80cc}.swagger-ui .bg-light-pink{background-color:#ffa3d7}.swagger-ui .bg-dark-green{background-color:#137752}.swagger-ui .bg-green{background-color:#19a974}.swagger-ui .bg-light-green{background-color:#9eebcf}.swagger-ui .bg-navy{background-color:#001b44}.swagger-ui .bg-dark-blue{background-color:#00449e}.swagger-ui .bg-blue{background-color:#357edd}.swagger-ui .bg-light-blue{background-color:#96ccff}.swagger-ui .bg-lightest-blue{background-color:#cdecff}.swagger-ui .bg-washed-blue{background-color:#f6fffe}.swagger-ui .bg-washed-green{background-color:#e8fdf5}.swagger-ui .bg-washed-yellow{background-color:#fffceb}.swagger-ui .bg-washed-red{background-color:#ffdfdf}.swagger-ui .bg-inherit{background-color:inherit}.swagger-ui .hover-black:focus,.swagger-ui .hover-black:hover{color:#000}.swagger-ui .hover-near-black:focus,.swagger-ui .hover-near-black:hover{color:#111}.swagger-ui .hover-dark-gray:focus,.swagger-ui .hover-dark-gray:hover{color:#333}.swagger-ui .hover-mid-gray:focus,.swagger-ui .hover-mid-gray:hover{color:#555}.swagger-ui .hover-gray:focus,.swagger-ui .hover-gray:hover{color:#777}.swagger-ui .hover-silver:focus,.swagger-ui .hover-silver:hover{color:#999}.swagger-ui .hover-light-silver:focus,.swagger-ui .hover-light-silver:hover{color:#aaa}.swagger-ui .hover-moon-gray:focus,.swagger-ui .hover-moon-gray:hover{color:#ccc}.swagger-ui .hover-light-gray:focus,.swagger-ui .hover-light-gray:hover{color:#eee}.swagger-ui .hover-near-white:focus,.swagger-ui .hover-near-white:hover{color:#f4f4f4}.swagger-ui .hover-white:focus,.swagger-ui .hover-white:hover{color:#fff}.swagger-ui .hover-black-90:focus,.swagger-ui .hover-black-90:hover{color:rgba(0,0,0,.9)}.swagger-ui .hover-black-80:focus,.swagger-ui .hover-black-80:hover{color:rgba(0,0,0,.8)}.swagger-ui .hover-black-70:focus,.swagger-ui .hover-black-70:hover{color:rgba(0,0,0,.7)}.swagger-ui .hover-black-60:focus,.swagger-ui .hover-black-60:hover{color:rgba(0,0,0,.6)}.swagger-ui .hover-black-50:focus,.swagger-ui .hover-black-50:hover{color:rgba(0,0,0,.5)}.swagger-ui .hover-black-40:focus,.swagger-ui .hover-black-40:hover{color:rgba(0,0,0,.4)}.swagger-ui .hover-black-30:focus,.swagger-ui .hover-black-30:hover{color:rgba(0,0,0,.3)}.swagger-ui .hover-black-20:focus,.swagger-ui .hover-black-20:hover{color:rgba(0,0,0,.2)}.swagger-ui .hover-black-10:focus,.swagger-ui .hover-black-10:hover{color:rgba(0,0,0,.1)}.swagger-ui .hover-white-90:focus,.swagger-ui .hover-white-90:hover{color:hsla(0,0%,100%,.9)}.swagger-ui .hover-white-80:focus,.swagger-ui .hover-white-80:hover{color:hsla(0,0%,100%,.8)}.swagger-ui .hover-white-70:focus,.swagger-ui .hover-white-70:hover{color:hsla(0,0%,100%,.7)}.swagger-ui .hover-white-60:focus,.swagger-ui .hover-white-60:hover{color:hsla(0,0%,100%,.6)}.swagger-ui .hover-white-50:focus,.swagger-ui .hover-white-50:hover{color:hsla(0,0%,100%,.5)}.swagger-ui .hover-white-40:focus,.swagger-ui .hover-white-40:hover{color:hsla(0,0%,100%,.4)}.swagger-ui .hover-white-30:focus,.swagger-ui .hover-white-30:hover{color:hsla(0,0%,100%,.3)}.swagger-ui .hover-white-20:focus,.swagger-ui .hover-white-20:hover{color:hsla(0,0%,100%,.2)}.swagger-ui .hover-white-10:focus,.swagger-ui .hover-white-10:hover{color:hsla(0,0%,100%,.1)}.swagger-ui .hover-inherit:focus,.swagger-ui .hover-inherit:hover{color:inherit}.swagger-ui .hover-bg-black:focus,.swagger-ui .hover-bg-black:hover{background-color:#000}.swagger-ui .hover-bg-near-black:focus,.swagger-ui .hover-bg-near-black:hover{background-color:#111}.swagger-ui .hover-bg-dark-gray:focus,.swagger-ui .hover-bg-dark-gray:hover{background-color:#333}.swagger-ui .hover-bg-mid-gray:focus,.swagger-ui .hover-bg-mid-gray:hover{background-color:#555}.swagger-ui .hover-bg-gray:focus,.swagger-ui .hover-bg-gray:hover{background-color:#777}.swagger-ui .hover-bg-silver:focus,.swagger-ui .hover-bg-silver:hover{background-color:#999}.swagger-ui .hover-bg-light-silver:focus,.swagger-ui .hover-bg-light-silver:hover{background-color:#aaa}.swagger-ui .hover-bg-moon-gray:focus,.swagger-ui .hover-bg-moon-gray:hover{background-color:#ccc}.swagger-ui .hover-bg-light-gray:focus,.swagger-ui .hover-bg-light-gray:hover{background-color:#eee}.swagger-ui .hover-bg-near-white:focus,.swagger-ui .hover-bg-near-white:hover{background-color:#f4f4f4}.swagger-ui .hover-bg-white:focus,.swagger-ui .hover-bg-white:hover{background-color:#fff}.swagger-ui .hover-bg-transparent:focus,.swagger-ui .hover-bg-transparent:hover{background-color:transparent}.swagger-ui .hover-bg-black-90:focus,.swagger-ui .hover-bg-black-90:hover{background-color:rgba(0,0,0,.9)}.swagger-ui .hover-bg-black-80:focus,.swagger-ui .hover-bg-black-80:hover{background-color:rgba(0,0,0,.8)}.swagger-ui .hover-bg-black-70:focus,.swagger-ui .hover-bg-black-70:hover{background-color:rgba(0,0,0,.7)}.swagger-ui .hover-bg-black-60:focus,.swagger-ui .hover-bg-black-60:hover{background-color:rgba(0,0,0,.6)}.swagger-ui .hover-bg-black-50:focus,.swagger-ui .hover-bg-black-50:hover{background-color:rgba(0,0,0,.5)}.swagger-ui .hover-bg-black-40:focus,.swagger-ui .hover-bg-black-40:hover{background-color:rgba(0,0,0,.4)}.swagger-ui .hover-bg-black-30:focus,.swagger-ui .hover-bg-black-30:hover{background-color:rgba(0,0,0,.3)}.swagger-ui .hover-bg-black-20:focus,.swagger-ui .hover-bg-black-20:hover{background-color:rgba(0,0,0,.2)}.swagger-ui .hover-bg-black-10:focus,.swagger-ui .hover-bg-black-10:hover{background-color:rgba(0,0,0,.1)}.swagger-ui .hover-bg-white-90:focus,.swagger-ui .hover-bg-white-90:hover{background-color:hsla(0,0%,100%,.9)}.swagger-ui .hover-bg-white-80:focus,.swagger-ui .hover-bg-white-80:hover{background-color:hsla(0,0%,100%,.8)}.swagger-ui .hover-bg-white-70:focus,.swagger-ui .hover-bg-white-70:hover{background-color:hsla(0,0%,100%,.7)}.swagger-ui .hover-bg-white-60:focus,.swagger-ui .hover-bg-white-60:hover{background-color:hsla(0,0%,100%,.6)}.swagger-ui .hover-bg-white-50:focus,.swagger-ui .hover-bg-white-50:hover{background-color:hsla(0,0%,100%,.5)}.swagger-ui .hover-bg-white-40:focus,.swagger-ui .hover-bg-white-40:hover{background-color:hsla(0,0%,100%,.4)}.swagger-ui .hover-bg-white-30:focus,.swagger-ui .hover-bg-white-30:hover{background-color:hsla(0,0%,100%,.3)}.swagger-ui .hover-bg-white-20:focus,.swagger-ui .hover-bg-white-20:hover{background-color:hsla(0,0%,100%,.2)}.swagger-ui .hover-bg-white-10:focus,.swagger-ui .hover-bg-white-10:hover{background-color:hsla(0,0%,100%,.1)}.swagger-ui .hover-dark-red:focus,.swagger-ui .hover-dark-red:hover{color:#e7040f}.swagger-ui .hover-red:focus,.swagger-ui .hover-red:hover{color:#ff4136}.swagger-ui .hover-light-red:focus,.swagger-ui .hover-light-red:hover{color:#ff725c}.swagger-ui .hover-orange:focus,.swagger-ui .hover-orange:hover{color:#ff6300}.swagger-ui .hover-gold:focus,.swagger-ui .hover-gold:hover{color:#ffb700}.swagger-ui .hover-yellow:focus,.swagger-ui .hover-yellow:hover{color:gold}.swagger-ui .hover-light-yellow:focus,.swagger-ui .hover-light-yellow:hover{color:#fbf1a9}.swagger-ui .hover-purple:focus,.swagger-ui .hover-purple:hover{color:#5e2ca5}.swagger-ui .hover-light-purple:focus,.swagger-ui .hover-light-purple:hover{color:#a463f2}.swagger-ui .hover-dark-pink:focus,.swagger-ui .hover-dark-pink:hover{color:#d5008f}.swagger-ui .hover-hot-pink:focus,.swagger-ui .hover-hot-pink:hover{color:#ff41b4}.swagger-ui .hover-pink:focus,.swagger-ui .hover-pink:hover{color:#ff80cc}.swagger-ui .hover-light-pink:focus,.swagger-ui .hover-light-pink:hover{color:#ffa3d7}.swagger-ui .hover-dark-green:focus,.swagger-ui .hover-dark-green:hover{color:#137752}.swagger-ui .hover-green:focus,.swagger-ui .hover-green:hover{color:#19a974}.swagger-ui .hover-light-green:focus,.swagger-ui .hover-light-green:hover{color:#9eebcf}.swagger-ui .hover-navy:focus,.swagger-ui .hover-navy:hover{color:#001b44}.swagger-ui .hover-dark-blue:focus,.swagger-ui .hover-dark-blue:hover{color:#00449e}.swagger-ui .hover-blue:focus,.swagger-ui .hover-blue:hover{color:#357edd}.swagger-ui .hover-light-blue:focus,.swagger-ui .hover-light-blue:hover{color:#96ccff}.swagger-ui .hover-lightest-blue:focus,.swagger-ui .hover-lightest-blue:hover{color:#cdecff}.swagger-ui .hover-washed-blue:focus,.swagger-ui .hover-washed-blue:hover{color:#f6fffe}.swagger-ui .hover-washed-green:focus,.swagger-ui .hover-washed-green:hover{color:#e8fdf5}.swagger-ui .hover-washed-yellow:focus,.swagger-ui .hover-washed-yellow:hover{color:#fffceb}.swagger-ui .hover-washed-red:focus,.swagger-ui .hover-washed-red:hover{color:#ffdfdf}.swagger-ui .hover-bg-dark-red:focus,.swagger-ui .hover-bg-dark-red:hover{background-color:#e7040f}.swagger-ui .hover-bg-red:focus,.swagger-ui .hover-bg-red:hover{background-color:#ff4136}.swagger-ui .hover-bg-light-red:focus,.swagger-ui .hover-bg-light-red:hover{background-color:#ff725c}.swagger-ui .hover-bg-orange:focus,.swagger-ui .hover-bg-orange:hover{background-color:#ff6300}.swagger-ui .hover-bg-gold:focus,.swagger-ui .hover-bg-gold:hover{background-color:#ffb700}.swagger-ui .hover-bg-yellow:focus,.swagger-ui .hover-bg-yellow:hover{background-color:gold}.swagger-ui .hover-bg-light-yellow:focus,.swagger-ui .hover-bg-light-yellow:hover{background-color:#fbf1a9}.swagger-ui .hover-bg-purple:focus,.swagger-ui .hover-bg-purple:hover{background-color:#5e2ca5}.swagger-ui .hover-bg-light-purple:focus,.swagger-ui .hover-bg-light-purple:hover{background-color:#a463f2}.swagger-ui .hover-bg-dark-pink:focus,.swagger-ui .hover-bg-dark-pink:hover{background-color:#d5008f}.swagger-ui .hover-bg-hot-pink:focus,.swagger-ui .hover-bg-hot-pink:hover{background-color:#ff41b4}.swagger-ui .hover-bg-pink:focus,.swagger-ui .hover-bg-pink:hover{background-color:#ff80cc}.swagger-ui .hover-bg-light-pink:focus,.swagger-ui .hover-bg-light-pink:hover{background-color:#ffa3d7}.swagger-ui .hover-bg-dark-green:focus,.swagger-ui .hover-bg-dark-green:hover{background-color:#137752}.swagger-ui .hover-bg-green:focus,.swagger-ui .hover-bg-green:hover{background-color:#19a974}.swagger-ui .hover-bg-light-green:focus,.swagger-ui .hover-bg-light-green:hover{background-color:#9eebcf}.swagger-ui .hover-bg-navy:focus,.swagger-ui .hover-bg-navy:hover{background-color:#001b44}.swagger-ui .hover-bg-dark-blue:focus,.swagger-ui .hover-bg-dark-blue:hover{background-color:#00449e}.swagger-ui .hover-bg-blue:focus,.swagger-ui .hover-bg-blue:hover{background-color:#357edd}.swagger-ui .hover-bg-light-blue:focus,.swagger-ui .hover-bg-light-blue:hover{background-color:#96ccff}.swagger-ui .hover-bg-lightest-blue:focus,.swagger-ui .hover-bg-lightest-blue:hover{background-color:#cdecff}.swagger-ui .hover-bg-washed-blue:focus,.swagger-ui .hover-bg-washed-blue:hover{background-color:#f6fffe}.swagger-ui .hover-bg-washed-green:focus,.swagger-ui .hover-bg-washed-green:hover{background-color:#e8fdf5}.swagger-ui .hover-bg-washed-yellow:focus,.swagger-ui .hover-bg-washed-yellow:hover{background-color:#fffceb}.swagger-ui .hover-bg-washed-red:focus,.swagger-ui .hover-bg-washed-red:hover{background-color:#ffdfdf}.swagger-ui .hover-bg-inherit:focus,.swagger-ui .hover-bg-inherit:hover{background-color:inherit}.swagger-ui .pa0{padding:0}.swagger-ui .pa1{padding:.25rem}.swagger-ui .pa2{padding:.5rem}.swagger-ui .pa3{padding:1rem}.swagger-ui .pa4{padding:2rem}.swagger-ui .pa5{padding:4rem}.swagger-ui .pa6{padding:8rem}.swagger-ui .pa7{padding:16rem}.swagger-ui .pl0{padding-left:0}.swagger-ui .pl1{padding-left:.25rem}.swagger-ui .pl2{padding-left:.5rem}.swagger-ui .pl3{padding-left:1rem}.swagger-ui .pl4{padding-left:2rem}.swagger-ui .pl5{padding-left:4rem}.swagger-ui .pl6{padding-left:8rem}.swagger-ui .pl7{padding-left:16rem}.swagger-ui .pr0{padding-right:0}.swagger-ui .pr1{padding-right:.25rem}.swagger-ui .pr2{padding-right:.5rem}.swagger-ui .pr3{padding-right:1rem}.swagger-ui .pr4{padding-right:2rem}.swagger-ui .pr5{padding-right:4rem}.swagger-ui .pr6{padding-right:8rem}.swagger-ui .pr7{padding-right:16rem}.swagger-ui .pb0{padding-bottom:0}.swagger-ui .pb1{padding-bottom:.25rem}.swagger-ui .pb2{padding-bottom:.5rem}.swagger-ui .pb3{padding-bottom:1rem}.swagger-ui .pb4{padding-bottom:2rem}.swagger-ui .pb5{padding-bottom:4rem}.swagger-ui .pb6{padding-bottom:8rem}.swagger-ui .pb7{padding-bottom:16rem}.swagger-ui .pt0{padding-top:0}.swagger-ui .pt1{padding-top:.25rem}.swagger-ui .pt2{padding-top:.5rem}.swagger-ui .pt3{padding-top:1rem}.swagger-ui .pt4{padding-top:2rem}.swagger-ui .pt5{padding-top:4rem}.swagger-ui .pt6{padding-top:8rem}.swagger-ui .pt7{padding-top:16rem}.swagger-ui .pv0{padding-top:0;padding-bottom:0}.swagger-ui .pv1{padding-top:.25rem;padding-bottom:.25rem}.swagger-ui .pv2{padding-top:.5rem;padding-bottom:.5rem}.swagger-ui .pv3{padding-top:1rem;padding-bottom:1rem}.swagger-ui .pv4{padding-top:2rem;padding-bottom:2rem}.swagger-ui .pv5{padding-top:4rem;padding-bottom:4rem}.swagger-ui .pv6{padding-top:8rem;padding-bottom:8rem}.swagger-ui .pv7{padding-top:16rem;padding-bottom:16rem}.swagger-ui .ph0{padding-left:0;padding-right:0}.swagger-ui .ph1{padding-left:.25rem;padding-right:.25rem}.swagger-ui .ph2{padding-left:.5rem;padding-right:.5rem}.swagger-ui .ph3{padding-left:1rem;padding-right:1rem}.swagger-ui .ph4{padding-left:2rem;padding-right:2rem}.swagger-ui .ph5{padding-left:4rem;padding-right:4rem}.swagger-ui .ph6{padding-left:8rem;padding-right:8rem}.swagger-ui .ph7{padding-left:16rem;padding-right:16rem}.swagger-ui .ma0{margin:0}.swagger-ui .ma1{margin:.25rem}.swagger-ui .ma2{margin:.5rem}.swagger-ui .ma3{margin:1rem}.swagger-ui .ma4{margin:2rem}.swagger-ui .ma5{margin:4rem}.swagger-ui .ma6{margin:8rem}.swagger-ui .ma7{margin:16rem}.swagger-ui .ml0{margin-left:0}.swagger-ui .ml1{margin-left:.25rem}.swagger-ui .ml2{margin-left:.5rem}.swagger-ui .ml3{margin-left:1rem}.swagger-ui .ml4{margin-left:2rem}.swagger-ui .ml5{margin-left:4rem}.swagger-ui .ml6{margin-left:8rem}.swagger-ui .ml7{margin-left:16rem}.swagger-ui .mr0{margin-right:0}.swagger-ui .mr1{margin-right:.25rem}.swagger-ui .mr2{margin-right:.5rem}.swagger-ui .mr3{margin-right:1rem}.swagger-ui .mr4{margin-right:2rem}.swagger-ui .mr5{margin-right:4rem}.swagger-ui .mr6{margin-right:8rem}.swagger-ui .mr7{margin-right:16rem}.swagger-ui .mb0{margin-bottom:0}.swagger-ui .mb1{margin-bottom:.25rem}.swagger-ui .mb2{margin-bottom:.5rem}.swagger-ui .mb3{margin-bottom:1rem}.swagger-ui .mb4{margin-bottom:2rem}.swagger-ui .mb5{margin-bottom:4rem}.swagger-ui .mb6{margin-bottom:8rem}.swagger-ui .mb7{margin-bottom:16rem}.swagger-ui .mt0{margin-top:0}.swagger-ui .mt1{margin-top:.25rem}.swagger-ui .mt2{margin-top:.5rem}.swagger-ui .mt3{margin-top:1rem}.swagger-ui .mt4{margin-top:2rem}.swagger-ui .mt5{margin-top:4rem}.swagger-ui .mt6{margin-top:8rem}.swagger-ui .mt7{margin-top:16rem}.swagger-ui .mv0{margin-top:0;margin-bottom:0}.swagger-ui .mv1{margin-top:.25rem;margin-bottom:.25rem}.swagger-ui .mv2{margin-top:.5rem;margin-bottom:.5rem}.swagger-ui .mv3{margin-top:1rem;margin-bottom:1rem}.swagger-ui .mv4{margin-top:2rem;margin-bottom:2rem}.swagger-ui .mv5{margin-top:4rem;margin-bottom:4rem}.swagger-ui .mv6{margin-top:8rem;margin-bottom:8rem}.swagger-ui .mv7{margin-top:16rem;margin-bottom:16rem}.swagger-ui .mh0{margin-left:0;margin-right:0}.swagger-ui .mh1{margin-left:.25rem;margin-right:.25rem}.swagger-ui .mh2{margin-left:.5rem;margin-right:.5rem}.swagger-ui .mh3{margin-left:1rem;margin-right:1rem}.swagger-ui .mh4{margin-left:2rem;margin-right:2rem}.swagger-ui .mh5{margin-left:4rem;margin-right:4rem}.swagger-ui .mh6{margin-left:8rem;margin-right:8rem}.swagger-ui .mh7{margin-left:16rem;margin-right:16rem}@media screen and (min-width:30em){.swagger-ui .pa0-ns{padding:0}.swagger-ui .pa1-ns{padding:.25rem}.swagger-ui .pa2-ns{padding:.5rem}.swagger-ui .pa3-ns{padding:1rem}.swagger-ui .pa4-ns{padding:2rem}.swagger-ui .pa5-ns{padding:4rem}.swagger-ui .pa6-ns{padding:8rem}.swagger-ui .pa7-ns{padding:16rem}.swagger-ui .pl0-ns{padding-left:0}.swagger-ui .pl1-ns{padding-left:.25rem}.swagger-ui .pl2-ns{padding-left:.5rem}.swagger-ui .pl3-ns{padding-left:1rem}.swagger-ui .pl4-ns{padding-left:2rem}.swagger-ui .pl5-ns{padding-left:4rem}.swagger-ui .pl6-ns{padding-left:8rem}.swagger-ui .pl7-ns{padding-left:16rem}.swagger-ui .pr0-ns{padding-right:0}.swagger-ui .pr1-ns{padding-right:.25rem}.swagger-ui .pr2-ns{padding-right:.5rem}.swagger-ui .pr3-ns{padding-right:1rem}.swagger-ui .pr4-ns{padding-right:2rem}.swagger-ui .pr5-ns{padding-right:4rem}.swagger-ui .pr6-ns{padding-right:8rem}.swagger-ui .pr7-ns{padding-right:16rem}.swagger-ui .pb0-ns{padding-bottom:0}.swagger-ui .pb1-ns{padding-bottom:.25rem}.swagger-ui .pb2-ns{padding-bottom:.5rem}.swagger-ui .pb3-ns{padding-bottom:1rem}.swagger-ui .pb4-ns{padding-bottom:2rem}.swagger-ui .pb5-ns{padding-bottom:4rem}.swagger-ui .pb6-ns{padding-bottom:8rem}.swagger-ui .pb7-ns{padding-bottom:16rem}.swagger-ui .pt0-ns{padding-top:0}.swagger-ui .pt1-ns{padding-top:.25rem}.swagger-ui .pt2-ns{padding-top:.5rem}.swagger-ui .pt3-ns{padding-top:1rem}.swagger-ui .pt4-ns{padding-top:2rem}.swagger-ui .pt5-ns{padding-top:4rem}.swagger-ui .pt6-ns{padding-top:8rem}.swagger-ui .pt7-ns{padding-top:16rem}.swagger-ui .pv0-ns{padding-top:0;padding-bottom:0}.swagger-ui .pv1-ns{padding-top:.25rem;padding-bottom:.25rem}.swagger-ui .pv2-ns{padding-top:.5rem;padding-bottom:.5rem}.swagger-ui .pv3-ns{padding-top:1rem;padding-bottom:1rem}.swagger-ui .pv4-ns{padding-top:2rem;padding-bottom:2rem}.swagger-ui .pv5-ns{padding-top:4rem;padding-bottom:4rem}.swagger-ui .pv6-ns{padding-top:8rem;padding-bottom:8rem}.swagger-ui .pv7-ns{padding-top:16rem;padding-bottom:16rem}.swagger-ui .ph0-ns{padding-left:0;padding-right:0}.swagger-ui .ph1-ns{padding-left:.25rem;padding-right:.25rem}.swagger-ui .ph2-ns{padding-left:.5rem;padding-right:.5rem}.swagger-ui .ph3-ns{padding-left:1rem;padding-right:1rem}.swagger-ui .ph4-ns{padding-left:2rem;padding-right:2rem}.swagger-ui .ph5-ns{padding-left:4rem;padding-right:4rem}.swagger-ui .ph6-ns{padding-left:8rem;padding-right:8rem}.swagger-ui .ph7-ns{padding-left:16rem;padding-right:16rem}.swagger-ui .ma0-ns{margin:0}.swagger-ui .ma1-ns{margin:.25rem}.swagger-ui .ma2-ns{margin:.5rem}.swagger-ui .ma3-ns{margin:1rem}.swagger-ui .ma4-ns{margin:2rem}.swagger-ui .ma5-ns{margin:4rem}.swagger-ui .ma6-ns{margin:8rem}.swagger-ui .ma7-ns{margin:16rem}.swagger-ui .ml0-ns{margin-left:0}.swagger-ui .ml1-ns{margin-left:.25rem}.swagger-ui .ml2-ns{margin-left:.5rem}.swagger-ui .ml3-ns{margin-left:1rem}.swagger-ui .ml4-ns{margin-left:2rem}.swagger-ui .ml5-ns{margin-left:4rem}.swagger-ui .ml6-ns{margin-left:8rem}.swagger-ui .ml7-ns{margin-left:16rem}.swagger-ui .mr0-ns{margin-right:0}.swagger-ui .mr1-ns{margin-right:.25rem}.swagger-ui .mr2-ns{margin-right:.5rem}.swagger-ui .mr3-ns{margin-right:1rem}.swagger-ui .mr4-ns{margin-right:2rem}.swagger-ui .mr5-ns{margin-right:4rem}.swagger-ui .mr6-ns{margin-right:8rem}.swagger-ui .mr7-ns{margin-right:16rem}.swagger-ui .mb0-ns{margin-bottom:0}.swagger-ui .mb1-ns{margin-bottom:.25rem}.swagger-ui .mb2-ns{margin-bottom:.5rem}.swagger-ui .mb3-ns{margin-bottom:1rem}.swagger-ui .mb4-ns{margin-bottom:2rem}.swagger-ui .mb5-ns{margin-bottom:4rem}.swagger-ui .mb6-ns{margin-bottom:8rem}.swagger-ui .mb7-ns{margin-bottom:16rem}.swagger-ui .mt0-ns{margin-top:0}.swagger-ui .mt1-ns{margin-top:.25rem}.swagger-ui .mt2-ns{margin-top:.5rem}.swagger-ui .mt3-ns{margin-top:1rem}.swagger-ui .mt4-ns{margin-top:2rem}.swagger-ui .mt5-ns{margin-top:4rem}.swagger-ui .mt6-ns{margin-top:8rem}.swagger-ui .mt7-ns{margin-top:16rem}.swagger-ui .mv0-ns{margin-top:0;margin-bottom:0}.swagger-ui .mv1-ns{margin-top:.25rem;margin-bottom:.25rem}.swagger-ui .mv2-ns{margin-top:.5rem;margin-bottom:.5rem}.swagger-ui .mv3-ns{margin-top:1rem;margin-bottom:1rem}.swagger-ui .mv4-ns{margin-top:2rem;margin-bottom:2rem}.swagger-ui .mv5-ns{margin-top:4rem;margin-bottom:4rem}.swagger-ui .mv6-ns{margin-top:8rem;margin-bottom:8rem}.swagger-ui .mv7-ns{margin-top:16rem;margin-bottom:16rem}.swagger-ui .mh0-ns{margin-left:0;margin-right:0}.swagger-ui .mh1-ns{margin-left:.25rem;margin-right:.25rem}.swagger-ui .mh2-ns{margin-left:.5rem;margin-right:.5rem}.swagger-ui .mh3-ns{margin-left:1rem;margin-right:1rem}.swagger-ui .mh4-ns{margin-left:2rem;margin-right:2rem}.swagger-ui .mh5-ns{margin-left:4rem;margin-right:4rem}.swagger-ui .mh6-ns{margin-left:8rem;margin-right:8rem}.swagger-ui .mh7-ns{margin-left:16rem;margin-right:16rem}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .pa0-m{padding:0}.swagger-ui .pa1-m{padding:.25rem}.swagger-ui .pa2-m{padding:.5rem}.swagger-ui .pa3-m{padding:1rem}.swagger-ui .pa4-m{padding:2rem}.swagger-ui .pa5-m{padding:4rem}.swagger-ui .pa6-m{padding:8rem}.swagger-ui .pa7-m{padding:16rem}.swagger-ui .pl0-m{padding-left:0}.swagger-ui .pl1-m{padding-left:.25rem}.swagger-ui .pl2-m{padding-left:.5rem}.swagger-ui .pl3-m{padding-left:1rem}.swagger-ui .pl4-m{padding-left:2rem}.swagger-ui .pl5-m{padding-left:4rem}.swagger-ui .pl6-m{padding-left:8rem}.swagger-ui .pl7-m{padding-left:16rem}.swagger-ui .pr0-m{padding-right:0}.swagger-ui .pr1-m{padding-right:.25rem}.swagger-ui .pr2-m{padding-right:.5rem}.swagger-ui .pr3-m{padding-right:1rem}.swagger-ui .pr4-m{padding-right:2rem}.swagger-ui .pr5-m{padding-right:4rem}.swagger-ui .pr6-m{padding-right:8rem}.swagger-ui .pr7-m{padding-right:16rem}.swagger-ui .pb0-m{padding-bottom:0}.swagger-ui .pb1-m{padding-bottom:.25rem}.swagger-ui .pb2-m{padding-bottom:.5rem}.swagger-ui .pb3-m{padding-bottom:1rem}.swagger-ui .pb4-m{padding-bottom:2rem}.swagger-ui .pb5-m{padding-bottom:4rem}.swagger-ui .pb6-m{padding-bottom:8rem}.swagger-ui .pb7-m{padding-bottom:16rem}.swagger-ui .pt0-m{padding-top:0}.swagger-ui .pt1-m{padding-top:.25rem}.swagger-ui .pt2-m{padding-top:.5rem}.swagger-ui .pt3-m{padding-top:1rem}.swagger-ui .pt4-m{padding-top:2rem}.swagger-ui .pt5-m{padding-top:4rem}.swagger-ui .pt6-m{padding-top:8rem}.swagger-ui .pt7-m{padding-top:16rem}.swagger-ui .pv0-m{padding-top:0;padding-bottom:0}.swagger-ui .pv1-m{padding-top:.25rem;padding-bottom:.25rem}.swagger-ui .pv2-m{padding-top:.5rem;padding-bottom:.5rem}.swagger-ui .pv3-m{padding-top:1rem;padding-bottom:1rem}.swagger-ui .pv4-m{padding-top:2rem;padding-bottom:2rem}.swagger-ui .pv5-m{padding-top:4rem;padding-bottom:4rem}.swagger-ui .pv6-m{padding-top:8rem;padding-bottom:8rem}.swagger-ui .pv7-m{padding-top:16rem;padding-bottom:16rem}.swagger-ui .ph0-m{padding-left:0;padding-right:0}.swagger-ui .ph1-m{padding-left:.25rem;padding-right:.25rem}.swagger-ui .ph2-m{padding-left:.5rem;padding-right:.5rem}.swagger-ui .ph3-m{padding-left:1rem;padding-right:1rem}.swagger-ui .ph4-m{padding-left:2rem;padding-right:2rem}.swagger-ui .ph5-m{padding-left:4rem;padding-right:4rem}.swagger-ui .ph6-m{padding-left:8rem;padding-right:8rem}.swagger-ui .ph7-m{padding-left:16rem;padding-right:16rem}.swagger-ui .ma0-m{margin:0}.swagger-ui .ma1-m{margin:.25rem}.swagger-ui .ma2-m{margin:.5rem}.swagger-ui .ma3-m{margin:1rem}.swagger-ui .ma4-m{margin:2rem}.swagger-ui .ma5-m{margin:4rem}.swagger-ui .ma6-m{margin:8rem}.swagger-ui .ma7-m{margin:16rem}.swagger-ui .ml0-m{margin-left:0}.swagger-ui .ml1-m{margin-left:.25rem}.swagger-ui .ml2-m{margin-left:.5rem}.swagger-ui .ml3-m{margin-left:1rem}.swagger-ui .ml4-m{margin-left:2rem}.swagger-ui .ml5-m{margin-left:4rem}.swagger-ui .ml6-m{margin-left:8rem}.swagger-ui .ml7-m{margin-left:16rem}.swagger-ui .mr0-m{margin-right:0}.swagger-ui .mr1-m{margin-right:.25rem}.swagger-ui .mr2-m{margin-right:.5rem}.swagger-ui .mr3-m{margin-right:1rem}.swagger-ui .mr4-m{margin-right:2rem}.swagger-ui .mr5-m{margin-right:4rem}.swagger-ui .mr6-m{margin-right:8rem}.swagger-ui .mr7-m{margin-right:16rem}.swagger-ui .mb0-m{margin-bottom:0}.swagger-ui .mb1-m{margin-bottom:.25rem}.swagger-ui .mb2-m{margin-bottom:.5rem}.swagger-ui .mb3-m{margin-bottom:1rem}.swagger-ui .mb4-m{margin-bottom:2rem}.swagger-ui .mb5-m{margin-bottom:4rem}.swagger-ui .mb6-m{margin-bottom:8rem}.swagger-ui .mb7-m{margin-bottom:16rem}.swagger-ui .mt0-m{margin-top:0}.swagger-ui .mt1-m{margin-top:.25rem}.swagger-ui .mt2-m{margin-top:.5rem}.swagger-ui .mt3-m{margin-top:1rem}.swagger-ui .mt4-m{margin-top:2rem}.swagger-ui .mt5-m{margin-top:4rem}.swagger-ui .mt6-m{margin-top:8rem}.swagger-ui .mt7-m{margin-top:16rem}.swagger-ui .mv0-m{margin-top:0;margin-bottom:0}.swagger-ui .mv1-m{margin-top:.25rem;margin-bottom:.25rem}.swagger-ui .mv2-m{margin-top:.5rem;margin-bottom:.5rem}.swagger-ui .mv3-m{margin-top:1rem;margin-bottom:1rem}.swagger-ui .mv4-m{margin-top:2rem;margin-bottom:2rem}.swagger-ui .mv5-m{margin-top:4rem;margin-bottom:4rem}.swagger-ui .mv6-m{margin-top:8rem;margin-bottom:8rem}.swagger-ui .mv7-m{margin-top:16rem;margin-bottom:16rem}.swagger-ui .mh0-m{margin-left:0;margin-right:0}.swagger-ui .mh1-m{margin-left:.25rem;margin-right:.25rem}.swagger-ui .mh2-m{margin-left:.5rem;margin-right:.5rem}.swagger-ui .mh3-m{margin-left:1rem;margin-right:1rem}.swagger-ui .mh4-m{margin-left:2rem;margin-right:2rem}.swagger-ui .mh5-m{margin-left:4rem;margin-right:4rem}.swagger-ui .mh6-m{margin-left:8rem;margin-right:8rem}.swagger-ui .mh7-m{margin-left:16rem;margin-right:16rem}}@media screen and (min-width:60em){.swagger-ui .pa0-l{padding:0}.swagger-ui .pa1-l{padding:.25rem}.swagger-ui .pa2-l{padding:.5rem}.swagger-ui .pa3-l{padding:1rem}.swagger-ui .pa4-l{padding:2rem}.swagger-ui .pa5-l{padding:4rem}.swagger-ui .pa6-l{padding:8rem}.swagger-ui .pa7-l{padding:16rem}.swagger-ui .pl0-l{padding-left:0}.swagger-ui .pl1-l{padding-left:.25rem}.swagger-ui .pl2-l{padding-left:.5rem}.swagger-ui .pl3-l{padding-left:1rem}.swagger-ui .pl4-l{padding-left:2rem}.swagger-ui .pl5-l{padding-left:4rem}.swagger-ui .pl6-l{padding-left:8rem}.swagger-ui .pl7-l{padding-left:16rem}.swagger-ui .pr0-l{padding-right:0}.swagger-ui .pr1-l{padding-right:.25rem}.swagger-ui .pr2-l{padding-right:.5rem}.swagger-ui .pr3-l{padding-right:1rem}.swagger-ui .pr4-l{padding-right:2rem}.swagger-ui .pr5-l{padding-right:4rem}.swagger-ui .pr6-l{padding-right:8rem}.swagger-ui .pr7-l{padding-right:16rem}.swagger-ui .pb0-l{padding-bottom:0}.swagger-ui .pb1-l{padding-bottom:.25rem}.swagger-ui .pb2-l{padding-bottom:.5rem}.swagger-ui .pb3-l{padding-bottom:1rem}.swagger-ui .pb4-l{padding-bottom:2rem}.swagger-ui .pb5-l{padding-bottom:4rem}.swagger-ui .pb6-l{padding-bottom:8rem}.swagger-ui .pb7-l{padding-bottom:16rem}.swagger-ui .pt0-l{padding-top:0}.swagger-ui .pt1-l{padding-top:.25rem}.swagger-ui .pt2-l{padding-top:.5rem}.swagger-ui .pt3-l{padding-top:1rem}.swagger-ui .pt4-l{padding-top:2rem}.swagger-ui .pt5-l{padding-top:4rem}.swagger-ui .pt6-l{padding-top:8rem}.swagger-ui .pt7-l{padding-top:16rem}.swagger-ui .pv0-l{padding-top:0;padding-bottom:0}.swagger-ui .pv1-l{padding-top:.25rem;padding-bottom:.25rem}.swagger-ui .pv2-l{padding-top:.5rem;padding-bottom:.5rem}.swagger-ui .pv3-l{padding-top:1rem;padding-bottom:1rem}.swagger-ui .pv4-l{padding-top:2rem;padding-bottom:2rem}.swagger-ui .pv5-l{padding-top:4rem;padding-bottom:4rem}.swagger-ui .pv6-l{padding-top:8rem;padding-bottom:8rem}.swagger-ui .pv7-l{padding-top:16rem;padding-bottom:16rem}.swagger-ui .ph0-l{padding-left:0;padding-right:0}.swagger-ui .ph1-l{padding-left:.25rem;padding-right:.25rem}.swagger-ui .ph2-l{padding-left:.5rem;padding-right:.5rem}.swagger-ui .ph3-l{padding-left:1rem;padding-right:1rem}.swagger-ui .ph4-l{padding-left:2rem;padding-right:2rem}.swagger-ui .ph5-l{padding-left:4rem;padding-right:4rem}.swagger-ui .ph6-l{padding-left:8rem;padding-right:8rem}.swagger-ui .ph7-l{padding-left:16rem;padding-right:16rem}.swagger-ui .ma0-l{margin:0}.swagger-ui .ma1-l{margin:.25rem}.swagger-ui .ma2-l{margin:.5rem}.swagger-ui .ma3-l{margin:1rem}.swagger-ui .ma4-l{margin:2rem}.swagger-ui .ma5-l{margin:4rem}.swagger-ui .ma6-l{margin:8rem}.swagger-ui .ma7-l{margin:16rem}.swagger-ui .ml0-l{margin-left:0}.swagger-ui .ml1-l{margin-left:.25rem}.swagger-ui .ml2-l{margin-left:.5rem}.swagger-ui .ml3-l{margin-left:1rem}.swagger-ui .ml4-l{margin-left:2rem}.swagger-ui .ml5-l{margin-left:4rem}.swagger-ui .ml6-l{margin-left:8rem}.swagger-ui .ml7-l{margin-left:16rem}.swagger-ui .mr0-l{margin-right:0}.swagger-ui .mr1-l{margin-right:.25rem}.swagger-ui .mr2-l{margin-right:.5rem}.swagger-ui .mr3-l{margin-right:1rem}.swagger-ui .mr4-l{margin-right:2rem}.swagger-ui .mr5-l{margin-right:4rem}.swagger-ui .mr6-l{margin-right:8rem}.swagger-ui .mr7-l{margin-right:16rem}.swagger-ui .mb0-l{margin-bottom:0}.swagger-ui .mb1-l{margin-bottom:.25rem}.swagger-ui .mb2-l{margin-bottom:.5rem}.swagger-ui .mb3-l{margin-bottom:1rem}.swagger-ui .mb4-l{margin-bottom:2rem}.swagger-ui .mb5-l{margin-bottom:4rem}.swagger-ui .mb6-l{margin-bottom:8rem}.swagger-ui .mb7-l{margin-bottom:16rem}.swagger-ui .mt0-l{margin-top:0}.swagger-ui .mt1-l{margin-top:.25rem}.swagger-ui .mt2-l{margin-top:.5rem}.swagger-ui .mt3-l{margin-top:1rem}.swagger-ui .mt4-l{margin-top:2rem}.swagger-ui .mt5-l{margin-top:4rem}.swagger-ui .mt6-l{margin-top:8rem}.swagger-ui .mt7-l{margin-top:16rem}.swagger-ui .mv0-l{margin-top:0;margin-bottom:0}.swagger-ui .mv1-l{margin-top:.25rem;margin-bottom:.25rem}.swagger-ui .mv2-l{margin-top:.5rem;margin-bottom:.5rem}.swagger-ui .mv3-l{margin-top:1rem;margin-bottom:1rem}.swagger-ui .mv4-l{margin-top:2rem;margin-bottom:2rem}.swagger-ui .mv5-l{margin-top:4rem;margin-bottom:4rem}.swagger-ui .mv6-l{margin-top:8rem;margin-bottom:8rem}.swagger-ui .mv7-l{margin-top:16rem;margin-bottom:16rem}.swagger-ui .mh0-l{margin-left:0;margin-right:0}.swagger-ui .mh1-l{margin-left:.25rem;margin-right:.25rem}.swagger-ui .mh2-l{margin-left:.5rem;margin-right:.5rem}.swagger-ui .mh3-l{margin-left:1rem;margin-right:1rem}.swagger-ui .mh4-l{margin-left:2rem;margin-right:2rem}.swagger-ui .mh5-l{margin-left:4rem;margin-right:4rem}.swagger-ui .mh6-l{margin-left:8rem;margin-right:8rem}.swagger-ui .mh7-l{margin-left:16rem;margin-right:16rem}}.swagger-ui .na1{margin:-.25rem}.swagger-ui .na2{margin:-.5rem}.swagger-ui .na3{margin:-1rem}.swagger-ui .na4{margin:-2rem}.swagger-ui .na5{margin:-4rem}.swagger-ui .na6{margin:-8rem}.swagger-ui .na7{margin:-16rem}.swagger-ui .nl1{margin-left:-.25rem}.swagger-ui .nl2{margin-left:-.5rem}.swagger-ui .nl3{margin-left:-1rem}.swagger-ui .nl4{margin-left:-2rem}.swagger-ui .nl5{margin-left:-4rem}.swagger-ui .nl6{margin-left:-8rem}.swagger-ui .nl7{margin-left:-16rem}.swagger-ui .nr1{margin-right:-.25rem}.swagger-ui .nr2{margin-right:-.5rem}.swagger-ui .nr3{margin-right:-1rem}.swagger-ui .nr4{margin-right:-2rem}.swagger-ui .nr5{margin-right:-4rem}.swagger-ui .nr6{margin-right:-8rem}.swagger-ui .nr7{margin-right:-16rem}.swagger-ui .nb1{margin-bottom:-.25rem}.swagger-ui .nb2{margin-bottom:-.5rem}.swagger-ui .nb3{margin-bottom:-1rem}.swagger-ui .nb4{margin-bottom:-2rem}.swagger-ui .nb5{margin-bottom:-4rem}.swagger-ui .nb6{margin-bottom:-8rem}.swagger-ui .nb7{margin-bottom:-16rem}.swagger-ui .nt1{margin-top:-.25rem}.swagger-ui .nt2{margin-top:-.5rem}.swagger-ui .nt3{margin-top:-1rem}.swagger-ui .nt4{margin-top:-2rem}.swagger-ui .nt5{margin-top:-4rem}.swagger-ui .nt6{margin-top:-8rem}.swagger-ui .nt7{margin-top:-16rem}@media screen and (min-width:30em){.swagger-ui .na1-ns{margin:-.25rem}.swagger-ui .na2-ns{margin:-.5rem}.swagger-ui .na3-ns{margin:-1rem}.swagger-ui .na4-ns{margin:-2rem}.swagger-ui .na5-ns{margin:-4rem}.swagger-ui .na6-ns{margin:-8rem}.swagger-ui .na7-ns{margin:-16rem}.swagger-ui .nl1-ns{margin-left:-.25rem}.swagger-ui .nl2-ns{margin-left:-.5rem}.swagger-ui .nl3-ns{margin-left:-1rem}.swagger-ui .nl4-ns{margin-left:-2rem}.swagger-ui .nl5-ns{margin-left:-4rem}.swagger-ui .nl6-ns{margin-left:-8rem}.swagger-ui .nl7-ns{margin-left:-16rem}.swagger-ui .nr1-ns{margin-right:-.25rem}.swagger-ui .nr2-ns{margin-right:-.5rem}.swagger-ui .nr3-ns{margin-right:-1rem}.swagger-ui .nr4-ns{margin-right:-2rem}.swagger-ui .nr5-ns{margin-right:-4rem}.swagger-ui .nr6-ns{margin-right:-8rem}.swagger-ui .nr7-ns{margin-right:-16rem}.swagger-ui .nb1-ns{margin-bottom:-.25rem}.swagger-ui .nb2-ns{margin-bottom:-.5rem}.swagger-ui .nb3-ns{margin-bottom:-1rem}.swagger-ui .nb4-ns{margin-bottom:-2rem}.swagger-ui .nb5-ns{margin-bottom:-4rem}.swagger-ui .nb6-ns{margin-bottom:-8rem}.swagger-ui .nb7-ns{margin-bottom:-16rem}.swagger-ui .nt1-ns{margin-top:-.25rem}.swagger-ui .nt2-ns{margin-top:-.5rem}.swagger-ui .nt3-ns{margin-top:-1rem}.swagger-ui .nt4-ns{margin-top:-2rem}.swagger-ui .nt5-ns{margin-top:-4rem}.swagger-ui .nt6-ns{margin-top:-8rem}.swagger-ui .nt7-ns{margin-top:-16rem}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .na1-m{margin:-.25rem}.swagger-ui .na2-m{margin:-.5rem}.swagger-ui .na3-m{margin:-1rem}.swagger-ui .na4-m{margin:-2rem}.swagger-ui .na5-m{margin:-4rem}.swagger-ui .na6-m{margin:-8rem}.swagger-ui .na7-m{margin:-16rem}.swagger-ui .nl1-m{margin-left:-.25rem}.swagger-ui .nl2-m{margin-left:-.5rem}.swagger-ui .nl3-m{margin-left:-1rem}.swagger-ui .nl4-m{margin-left:-2rem}.swagger-ui .nl5-m{margin-left:-4rem}.swagger-ui .nl6-m{margin-left:-8rem}.swagger-ui .nl7-m{margin-left:-16rem}.swagger-ui .nr1-m{margin-right:-.25rem}.swagger-ui .nr2-m{margin-right:-.5rem}.swagger-ui .nr3-m{margin-right:-1rem}.swagger-ui .nr4-m{margin-right:-2rem}.swagger-ui .nr5-m{margin-right:-4rem}.swagger-ui .nr6-m{margin-right:-8rem}.swagger-ui .nr7-m{margin-right:-16rem}.swagger-ui .nb1-m{margin-bottom:-.25rem}.swagger-ui .nb2-m{margin-bottom:-.5rem}.swagger-ui .nb3-m{margin-bottom:-1rem}.swagger-ui .nb4-m{margin-bottom:-2rem}.swagger-ui .nb5-m{margin-bottom:-4rem}.swagger-ui .nb6-m{margin-bottom:-8rem}.swagger-ui .nb7-m{margin-bottom:-16rem}.swagger-ui .nt1-m{margin-top:-.25rem}.swagger-ui .nt2-m{margin-top:-.5rem}.swagger-ui .nt3-m{margin-top:-1rem}.swagger-ui .nt4-m{margin-top:-2rem}.swagger-ui .nt5-m{margin-top:-4rem}.swagger-ui .nt6-m{margin-top:-8rem}.swagger-ui .nt7-m{margin-top:-16rem}}@media screen and (min-width:60em){.swagger-ui .na1-l{margin:-.25rem}.swagger-ui .na2-l{margin:-.5rem}.swagger-ui .na3-l{margin:-1rem}.swagger-ui .na4-l{margin:-2rem}.swagger-ui .na5-l{margin:-4rem}.swagger-ui .na6-l{margin:-8rem}.swagger-ui .na7-l{margin:-16rem}.swagger-ui .nl1-l{margin-left:-.25rem}.swagger-ui .nl2-l{margin-left:-.5rem}.swagger-ui .nl3-l{margin-left:-1rem}.swagger-ui .nl4-l{margin-left:-2rem}.swagger-ui .nl5-l{margin-left:-4rem}.swagger-ui .nl6-l{margin-left:-8rem}.swagger-ui .nl7-l{margin-left:-16rem}.swagger-ui .nr1-l{margin-right:-.25rem}.swagger-ui .nr2-l{margin-right:-.5rem}.swagger-ui .nr3-l{margin-right:-1rem}.swagger-ui .nr4-l{margin-right:-2rem}.swagger-ui .nr5-l{margin-right:-4rem}.swagger-ui .nr6-l{margin-right:-8rem}.swagger-ui .nr7-l{margin-right:-16rem}.swagger-ui .nb1-l{margin-bottom:-.25rem}.swagger-ui .nb2-l{margin-bottom:-.5rem}.swagger-ui .nb3-l{margin-bottom:-1rem}.swagger-ui .nb4-l{margin-bottom:-2rem}.swagger-ui .nb5-l{margin-bottom:-4rem}.swagger-ui .nb6-l{margin-bottom:-8rem}.swagger-ui .nb7-l{margin-bottom:-16rem}.swagger-ui .nt1-l{margin-top:-.25rem}.swagger-ui .nt2-l{margin-top:-.5rem}.swagger-ui .nt3-l{margin-top:-1rem}.swagger-ui .nt4-l{margin-top:-2rem}.swagger-ui .nt5-l{margin-top:-4rem}.swagger-ui .nt6-l{margin-top:-8rem}.swagger-ui .nt7-l{margin-top:-16rem}}.swagger-ui .collapse{border-collapse:collapse;border-spacing:0}.swagger-ui .striped--light-silver:nth-child(odd){background-color:#aaa}.swagger-ui .striped--moon-gray:nth-child(odd){background-color:#ccc}.swagger-ui .striped--light-gray:nth-child(odd){background-color:#eee}.swagger-ui .striped--near-white:nth-child(odd){background-color:#f4f4f4}.swagger-ui .stripe-light:nth-child(odd){background-color:hsla(0,0%,100%,.1)}.swagger-ui .stripe-dark:nth-child(odd){background-color:rgba(0,0,0,.1)}.swagger-ui .strike{text-decoration:line-through}.swagger-ui .underline{text-decoration:underline}.swagger-ui .no-underline{text-decoration:none}@media screen and (min-width:30em){.swagger-ui .strike-ns{text-decoration:line-through}.swagger-ui .underline-ns{text-decoration:underline}.swagger-ui .no-underline-ns{text-decoration:none}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .strike-m{text-decoration:line-through}.swagger-ui .underline-m{text-decoration:underline}.swagger-ui .no-underline-m{text-decoration:none}}@media screen and (min-width:60em){.swagger-ui .strike-l{text-decoration:line-through}.swagger-ui .underline-l{text-decoration:underline}.swagger-ui .no-underline-l{text-decoration:none}}.swagger-ui .tl{text-align:left}.swagger-ui .tr{text-align:right}.swagger-ui .tc{text-align:center}.swagger-ui .tj{text-align:justify}@media screen and (min-width:30em){.swagger-ui .tl-ns{text-align:left}.swagger-ui .tr-ns{text-align:right}.swagger-ui .tc-ns{text-align:center}.swagger-ui .tj-ns{text-align:justify}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .tl-m{text-align:left}.swagger-ui .tr-m{text-align:right}.swagger-ui .tc-m{text-align:center}.swagger-ui .tj-m{text-align:justify}}@media screen and (min-width:60em){.swagger-ui .tl-l{text-align:left}.swagger-ui .tr-l{text-align:right}.swagger-ui .tc-l{text-align:center}.swagger-ui .tj-l{text-align:justify}}.swagger-ui .ttc{text-transform:capitalize}.swagger-ui .ttl{text-transform:lowercase}.swagger-ui .ttu{text-transform:uppercase}.swagger-ui .ttn{text-transform:none}@media screen and (min-width:30em){.swagger-ui .ttc-ns{text-transform:capitalize}.swagger-ui .ttl-ns{text-transform:lowercase}.swagger-ui .ttu-ns{text-transform:uppercase}.swagger-ui .ttn-ns{text-transform:none}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .ttc-m{text-transform:capitalize}.swagger-ui .ttl-m{text-transform:lowercase}.swagger-ui .ttu-m{text-transform:uppercase}.swagger-ui .ttn-m{text-transform:none}}@media screen and (min-width:60em){.swagger-ui .ttc-l{text-transform:capitalize}.swagger-ui .ttl-l{text-transform:lowercase}.swagger-ui .ttu-l{text-transform:uppercase}.swagger-ui .ttn-l{text-transform:none}}.swagger-ui .f-6,.swagger-ui .f-headline{font-size:6rem}.swagger-ui .f-5,.swagger-ui .f-subheadline{font-size:5rem}.swagger-ui .f1{font-size:3rem}.swagger-ui .f2{font-size:2.25rem}.swagger-ui .f3{font-size:1.5rem}.swagger-ui .f4{font-size:1.25rem}.swagger-ui .f5{font-size:1rem}.swagger-ui .f6{font-size:.875rem}.swagger-ui .f7{font-size:.75rem}@media screen and (min-width:30em){.swagger-ui .f-6-ns,.swagger-ui .f-headline-ns{font-size:6rem}.swagger-ui .f-5-ns,.swagger-ui .f-subheadline-ns{font-size:5rem}.swagger-ui .f1-ns{font-size:3rem}.swagger-ui .f2-ns{font-size:2.25rem}.swagger-ui .f3-ns{font-size:1.5rem}.swagger-ui .f4-ns{font-size:1.25rem}.swagger-ui .f5-ns{font-size:1rem}.swagger-ui .f6-ns{font-size:.875rem}.swagger-ui .f7-ns{font-size:.75rem}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .f-6-m,.swagger-ui .f-headline-m{font-size:6rem}.swagger-ui .f-5-m,.swagger-ui .f-subheadline-m{font-size:5rem}.swagger-ui .f1-m{font-size:3rem}.swagger-ui .f2-m{font-size:2.25rem}.swagger-ui .f3-m{font-size:1.5rem}.swagger-ui .f4-m{font-size:1.25rem}.swagger-ui .f5-m{font-size:1rem}.swagger-ui .f6-m{font-size:.875rem}.swagger-ui .f7-m{font-size:.75rem}}@media screen and (min-width:60em){.swagger-ui .f-6-l,.swagger-ui .f-headline-l{font-size:6rem}.swagger-ui .f-5-l,.swagger-ui .f-subheadline-l{font-size:5rem}.swagger-ui .f1-l{font-size:3rem}.swagger-ui .f2-l{font-size:2.25rem}.swagger-ui .f3-l{font-size:1.5rem}.swagger-ui .f4-l{font-size:1.25rem}.swagger-ui .f5-l{font-size:1rem}.swagger-ui .f6-l{font-size:.875rem}.swagger-ui .f7-l{font-size:.75rem}}.swagger-ui .measure{max-width:30em}.swagger-ui .measure-wide{max-width:34em}.swagger-ui .measure-narrow{max-width:20em}.swagger-ui .indent{text-indent:1em;margin-top:0;margin-bottom:0}.swagger-ui .small-caps{font-variant:small-caps}.swagger-ui .truncate{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}@media screen and (min-width:30em){.swagger-ui .measure-ns{max-width:30em}.swagger-ui .measure-wide-ns{max-width:34em}.swagger-ui .measure-narrow-ns{max-width:20em}.swagger-ui .indent-ns{text-indent:1em;margin-top:0;margin-bottom:0}.swagger-ui .small-caps-ns{font-variant:small-caps}.swagger-ui .truncate-ns{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .measure-m{max-width:30em}.swagger-ui .measure-wide-m{max-width:34em}.swagger-ui .measure-narrow-m{max-width:20em}.swagger-ui .indent-m{text-indent:1em;margin-top:0;margin-bottom:0}.swagger-ui .small-caps-m{font-variant:small-caps}.swagger-ui .truncate-m{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}}@media screen and (min-width:60em){.swagger-ui .measure-l{max-width:30em}.swagger-ui .measure-wide-l{max-width:34em}.swagger-ui .measure-narrow-l{max-width:20em}.swagger-ui .indent-l{text-indent:1em;margin-top:0;margin-bottom:0}.swagger-ui .small-caps-l{font-variant:small-caps}.swagger-ui .truncate-l{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}}.swagger-ui .overflow-container{overflow-y:scroll}.swagger-ui .center{margin-right:auto;margin-left:auto}.swagger-ui .mr-auto{margin-right:auto}.swagger-ui .ml-auto{margin-left:auto}@media screen and (min-width:30em){.swagger-ui .center-ns{margin-right:auto;margin-left:auto}.swagger-ui .mr-auto-ns{margin-right:auto}.swagger-ui .ml-auto-ns{margin-left:auto}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .center-m{margin-right:auto;margin-left:auto}.swagger-ui .mr-auto-m{margin-right:auto}.swagger-ui .ml-auto-m{margin-left:auto}}@media screen and (min-width:60em){.swagger-ui .center-l{margin-right:auto;margin-left:auto}.swagger-ui .mr-auto-l{margin-right:auto}.swagger-ui .ml-auto-l{margin-left:auto}}.swagger-ui .clip{position:fixed!important;_position:absolute!important;clip:rect(1px 1px 1px 1px);clip:rect(1px,1px,1px,1px)}@media screen and (min-width:30em){.swagger-ui .clip-ns{position:fixed!important;_position:absolute!important;clip:rect(1px 1px 1px 1px);clip:rect(1px,1px,1px,1px)}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .clip-m{position:fixed!important;_position:absolute!important;clip:rect(1px 1px 1px 1px);clip:rect(1px,1px,1px,1px)}}@media screen and (min-width:60em){.swagger-ui .clip-l{position:fixed!important;_position:absolute!important;clip:rect(1px 1px 1px 1px);clip:rect(1px,1px,1px,1px)}}.swagger-ui .ws-normal{white-space:normal}.swagger-ui .nowrap{white-space:nowrap}.swagger-ui .pre{white-space:pre}@media screen and (min-width:30em){.swagger-ui .ws-normal-ns{white-space:normal}.swagger-ui .nowrap-ns{white-space:nowrap}.swagger-ui .pre-ns{white-space:pre}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .ws-normal-m{white-space:normal}.swagger-ui .nowrap-m{white-space:nowrap}.swagger-ui .pre-m{white-space:pre}}@media screen and (min-width:60em){.swagger-ui .ws-normal-l{white-space:normal}.swagger-ui .nowrap-l{white-space:nowrap}.swagger-ui .pre-l{white-space:pre}}.swagger-ui .v-base{vertical-align:baseline}.swagger-ui .v-mid{vertical-align:middle}.swagger-ui .v-top{vertical-align:top}.swagger-ui .v-btm{vertical-align:bottom}@media screen and (min-width:30em){.swagger-ui .v-base-ns{vertical-align:baseline}.swagger-ui .v-mid-ns{vertical-align:middle}.swagger-ui .v-top-ns{vertical-align:top}.swagger-ui .v-btm-ns{vertical-align:bottom}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .v-base-m{vertical-align:baseline}.swagger-ui .v-mid-m{vertical-align:middle}.swagger-ui .v-top-m{vertical-align:top}.swagger-ui .v-btm-m{vertical-align:bottom}}@media screen and (min-width:60em){.swagger-ui .v-base-l{vertical-align:baseline}.swagger-ui .v-mid-l{vertical-align:middle}.swagger-ui .v-top-l{vertical-align:top}.swagger-ui .v-btm-l{vertical-align:bottom}}.swagger-ui .dim{opacity:1;transition:opacity .15s ease-in}.swagger-ui .dim:focus,.swagger-ui .dim:hover{opacity:.5;transition:opacity .15s ease-in}.swagger-ui .dim:active{opacity:.8;transition:opacity .15s ease-out}.swagger-ui .glow{transition:opacity .15s ease-in}.swagger-ui .glow:focus,.swagger-ui .glow:hover{opacity:1;transition:opacity .15s ease-in}.swagger-ui .hide-child .child{opacity:0;transition:opacity .15s ease-in}.swagger-ui .hide-child:active .child,.swagger-ui .hide-child:focus .child,.swagger-ui .hide-child:hover .child{opacity:1;transition:opacity .15s ease-in}.swagger-ui .underline-hover:focus,.swagger-ui .underline-hover:hover{text-decoration:underline}.swagger-ui .grow{-moz-osx-font-smoothing:grayscale;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-transform:translateZ(0);transform:translateZ(0);transition:-webkit-transform .25s ease-out;transition:transform .25s ease-out;transition:transform .25s ease-out, -webkit-transform .25s ease-out}.swagger-ui .grow:focus,.swagger-ui .grow:hover{-webkit-transform:scale(1.05);transform:scale(1.05)}.swagger-ui .grow:active{-webkit-transform:scale(.9);transform:scale(.9)}.swagger-ui .grow-large{-moz-osx-font-smoothing:grayscale;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-transform:translateZ(0);transform:translateZ(0);transition:-webkit-transform .25s ease-in-out;transition:transform .25s ease-in-out;transition:transform .25s ease-in-out, -webkit-transform .25s ease-in-out}.swagger-ui .grow-large:focus,.swagger-ui .grow-large:hover{-webkit-transform:scale(1.2);transform:scale(1.2)}.swagger-ui .grow-large:active{-webkit-transform:scale(.95);transform:scale(.95)}.swagger-ui .pointer:hover{cursor:pointer}.swagger-ui .shadow-hover{cursor:pointer;position:relative;transition:all .5s cubic-bezier(.165,.84,.44,1)}.swagger-ui .shadow-hover:after{content:"";box-shadow:0 0 16px 2px rgba(0,0,0,.2);border-radius:inherit;opacity:0;position:absolute;top:0;left:0;width:100%;height:100%;z-index:-1;transition:opacity .5s cubic-bezier(.165,.84,.44,1)}.swagger-ui .shadow-hover:focus:after,.swagger-ui .shadow-hover:hover:after{opacity:1}.swagger-ui .bg-animate,.swagger-ui .bg-animate:focus,.swagger-ui .bg-animate:hover{transition:background-color .15s ease-in-out}.swagger-ui .z-0{z-index:0}.swagger-ui .z-1{z-index:1}.swagger-ui .z-2{z-index:2}.swagger-ui .z-3{z-index:3}.swagger-ui .z-4{z-index:4}.swagger-ui .z-5{z-index:5}.swagger-ui .z-999{z-index:999}.swagger-ui .z-9999{z-index:9999}.swagger-ui .z-max{z-index:2147483647}.swagger-ui .z-inherit{z-index:inherit}.swagger-ui .z-initial{z-index:auto}.swagger-ui .z-unset{z-index:unset}.swagger-ui .nested-copy-line-height ol,.swagger-ui .nested-copy-line-height p,.swagger-ui .nested-copy-line-height ul{line-height:1.5}.swagger-ui .nested-headline-line-height h1,.swagger-ui .nested-headline-line-height h2,.swagger-ui .nested-headline-line-height h3,.swagger-ui .nested-headline-line-height h4,.swagger-ui .nested-headline-line-height h5,.swagger-ui .nested-headline-line-height h6{line-height:1.25}.swagger-ui .nested-list-reset ol,.swagger-ui .nested-list-reset ul{padding-left:0;margin-left:0;list-style-type:none}.swagger-ui .nested-copy-indent p+p{text-indent:.1em;margin-top:0;margin-bottom:0}.swagger-ui .nested-copy-seperator p+p{margin-top:1.5em}.swagger-ui .nested-img img{width:100%;max-width:100%;display:block}.swagger-ui .nested-links a{color:#357edd;transition:color .15s ease-in}.swagger-ui .nested-links a:focus,.swagger-ui .nested-links a:hover{color:#96ccff;transition:color .15s ease-in}.swagger-ui .wrapper{width:100%;max-width:1460px;margin:0 auto;padding:0 20px;box-sizing:border-box}.swagger-ui .opblock-tag-section{display:flex;flex-direction:column}.swagger-ui .opblock-tag{display:flex;align-items:center;padding:10px 20px 10px 10px;cursor:pointer;transition:all .2s;border-bottom:1px solid rgba(59,65,81,.3)}.swagger-ui .opblock-tag:hover{background:rgba(0,0,0,.02)}.swagger-ui .opblock-tag{font-size:24px;margin:0 0 5px;font-family:sans-serif;color:#3b4151}.swagger-ui .opblock-tag.no-desc span{flex:1}.swagger-ui .opblock-tag svg{transition:all .4s}.swagger-ui .opblock-tag small{font-size:14px;font-weight:400;flex:1;padding:0 10px;font-family:sans-serif;color:#3b4151}.swagger-ui .parameter__type{font-size:12px;padding:5px 0;font-family:monospace;font-weight:600;color:#3b4151}.swagger-ui .parameter-controls{margin-top:.75em}.swagger-ui .examples__title{display:block;font-size:1.1em;font-weight:700;margin-bottom:.75em}.swagger-ui .examples__section{margin-top:1.5em}.swagger-ui .examples__section-header{font-weight:700;font-size:.9rem;margin-bottom:.5rem}.swagger-ui .examples-select{margin-bottom:.75em}.swagger-ui .examples-select__section-label{font-weight:700;font-size:.9rem;margin-right:.5rem}.swagger-ui .example__section{margin-top:1.5em}.swagger-ui .example__section-header{font-weight:700;font-size:.9rem;margin-bottom:.5rem}.swagger-ui .view-line-link{position:relative;top:3px;width:20px;margin:0 5px;cursor:pointer;transition:all .5s}.swagger-ui .opblock{margin:0 0 15px;border:1px solid #000;border-radius:4px;box-shadow:0 0 3px rgba(0,0,0,.19)}.swagger-ui .opblock .tab-header{display:flex;flex:1}.swagger-ui .opblock .tab-header .tab-item{padding:0 40px;cursor:pointer}.swagger-ui .opblock .tab-header .tab-item:first-of-type{padding:0 40px 0 0}.swagger-ui .opblock .tab-header .tab-item.active h4 span{position:relative}.swagger-ui .opblock .tab-header .tab-item.active h4 span:after{position:absolute;bottom:-15px;left:50%;width:120%;height:4px;content:"";-webkit-transform:translateX(-50%);transform:translateX(-50%);background:grey}.swagger-ui .opblock.is-open .opblock-summary{border-bottom:1px solid #000}.swagger-ui .opblock .opblock-section-header{display:flex;align-items:center;padding:8px 20px;min-height:50px;background:hsla(0,0%,100%,.8);box-shadow:0 1px 2px rgba(0,0,0,.1)}.swagger-ui .opblock .opblock-section-header>label{font-size:12px;font-weight:700;display:flex;align-items:center;margin:0 0 0 auto;font-family:sans-serif;color:#3b4151}.swagger-ui .opblock .opblock-section-header>label>span{padding:0 10px 0 0}.swagger-ui .opblock .opblock-section-header h4{font-size:14px;flex:1;margin:0;font-family:sans-serif;color:#3b4151}.swagger-ui .opblock .opblock-summary-method{font-size:14px;font-weight:700;min-width:80px;padding:6px 15px;text-align:center;border-radius:3px;background:#000;text-shadow:0 1px 0 rgba(0,0,0,.1);font-family:sans-serif;color:#fff}.swagger-ui .opblock .opblock-summary-operation-id,.swagger-ui .opblock .opblock-summary-path,.swagger-ui .opblock .opblock-summary-path__deprecated{font-size:16px;display:flex;align-items:center;word-break:break-word;padding:0 10px;font-family:monospace;font-weight:600;color:#3b4151}@media (max-width:768px){.swagger-ui .opblock .opblock-summary-operation-id,.swagger-ui .opblock .opblock-summary-path,.swagger-ui .opblock .opblock-summary-path__deprecated{font-size:12px}}.swagger-ui .opblock .opblock-summary-path__deprecated{text-decoration:line-through}.swagger-ui .opblock .opblock-summary-operation-id{font-size:14px}.swagger-ui .opblock .opblock-summary-description{font-size:13px;flex:1 1 auto;word-break:break-word;font-family:sans-serif;color:#3b4151}.swagger-ui .opblock .opblock-summary{display:flex;align-items:center;padding:5px;cursor:pointer}.swagger-ui .opblock .opblock-summary .view-line-link{position:relative;top:2px;width:0;margin:0;cursor:pointer;transition:all .5s}.swagger-ui .opblock .opblock-summary:hover .view-line-link{width:18px;margin:0 5px}.swagger-ui .opblock.opblock-post{border-color:#49cc90;background:rgba(73,204,144,.1)}.swagger-ui .opblock.opblock-post .opblock-summary-method{background:#49cc90}.swagger-ui .opblock.opblock-post .opblock-summary{border-color:#49cc90}.swagger-ui .opblock.opblock-post .tab-header .tab-item.active h4 span:after{background:#49cc90}.swagger-ui .opblock.opblock-put{border-color:#fca130;background:rgba(252,161,48,.1)}.swagger-ui .opblock.opblock-put .opblock-summary-method{background:#fca130}.swagger-ui .opblock.opblock-put .opblock-summary{border-color:#fca130}.swagger-ui .opblock.opblock-put .tab-header .tab-item.active h4 span:after{background:#fca130}.swagger-ui .opblock.opblock-delete{border-color:#f93e3e;background:rgba(249,62,62,.1)}.swagger-ui .opblock.opblock-delete .opblock-summary-method{background:#f93e3e}.swagger-ui .opblock.opblock-delete .opblock-summary{border-color:#f93e3e}.swagger-ui .opblock.opblock-delete .tab-header .tab-item.active h4 span:after{background:#f93e3e}.swagger-ui .opblock.opblock-get{border-color:#61affe;background:rgba(97,175,254,.1)}.swagger-ui .opblock.opblock-get .opblock-summary-method{background:#61affe}.swagger-ui .opblock.opblock-get .opblock-summary{border-color:#61affe}.swagger-ui .opblock.opblock-get .tab-header .tab-item.active h4 span:after{background:#61affe}.swagger-ui .opblock.opblock-patch{border-color:#50e3c2;background:rgba(80,227,194,.1)}.swagger-ui .opblock.opblock-patch .opblock-summary-method{background:#50e3c2}.swagger-ui .opblock.opblock-patch .opblock-summary{border-color:#50e3c2}.swagger-ui .opblock.opblock-patch .tab-header .tab-item.active h4 span:after{background:#50e3c2}.swagger-ui .opblock.opblock-head{border-color:#9012fe;background:rgba(144,18,254,.1)}.swagger-ui .opblock.opblock-head .opblock-summary-method{background:#9012fe}.swagger-ui .opblock.opblock-head .opblock-summary{border-color:#9012fe}.swagger-ui .opblock.opblock-head .tab-header .tab-item.active h4 span:after{background:#9012fe}.swagger-ui .opblock.opblock-options{border-color:#0d5aa7;background:rgba(13,90,167,.1)}.swagger-ui .opblock.opblock-options .opblock-summary-method{background:#0d5aa7}.swagger-ui .opblock.opblock-options .opblock-summary{border-color:#0d5aa7}.swagger-ui .opblock.opblock-options .tab-header .tab-item.active h4 span:after{background:#0d5aa7}.swagger-ui .opblock.opblock-deprecated{opacity:.6;border-color:#ebebeb;background:hsla(0,0%,92.2%,.1)}.swagger-ui .opblock.opblock-deprecated .opblock-summary-method{background:#ebebeb}.swagger-ui .opblock.opblock-deprecated .opblock-summary{border-color:#ebebeb}.swagger-ui .opblock.opblock-deprecated .tab-header .tab-item.active h4 span:after{background:#ebebeb}.swagger-ui .opblock .opblock-schemes{padding:8px 20px}.swagger-ui .opblock .opblock-schemes .schemes-title{padding:0 10px 0 0}.swagger-ui .filter .operation-filter-input{width:100%;margin:20px 0;padding:10px;border:2px solid #d8dde7}.swagger-ui .model-example{margin-top:1em}.swagger-ui .tab{display:flex;padding:0;list-style:none}.swagger-ui .tab li{font-size:12px;min-width:60px;padding:0;cursor:pointer;font-family:sans-serif;color:#3b4151}.swagger-ui .tab li:first-of-type{position:relative;padding-left:0;padding-right:12px}.swagger-ui .tab li:first-of-type:after{position:absolute;top:0;right:6px;width:1px;height:100%;content:"";background:rgba(0,0,0,.2)}.swagger-ui .tab li.active{font-weight:700}.swagger-ui .opblock-description-wrapper,.swagger-ui .opblock-external-docs-wrapper,.swagger-ui .opblock-title_normal{font-size:12px;margin:0 0 5px;padding:15px 20px;font-family:sans-serif;color:#3b4151}.swagger-ui .opblock-description-wrapper h4,.swagger-ui .opblock-external-docs-wrapper h4,.swagger-ui .opblock-title_normal h4{font-size:12px;margin:0 0 5px;font-family:sans-serif;color:#3b4151}.swagger-ui .opblock-description-wrapper p,.swagger-ui .opblock-external-docs-wrapper p,.swagger-ui .opblock-title_normal p{font-size:14px;margin:0;font-family:sans-serif;color:#3b4151}.swagger-ui .opblock-external-docs-wrapper h4{padding-left:0}.swagger-ui .execute-wrapper{padding:20px;text-align:right}.swagger-ui .execute-wrapper .btn{width:100%;padding:8px 40px}.swagger-ui .body-param-options{display:flex;flex-direction:column}.swagger-ui .body-param-options .body-param-edit{padding:10px 0}.swagger-ui .body-param-options label{padding:8px 0}.swagger-ui .body-param-options label select{margin:3px 0 0}.swagger-ui .responses-inner{padding:20px}.swagger-ui .responses-inner h4,.swagger-ui .responses-inner h5{font-size:12px;margin:10px 0 5px;font-family:sans-serif;color:#3b4151}.swagger-ui .response-col_status{font-size:14px;font-family:sans-serif;color:#3b4151}.swagger-ui .response-col_status .response-undocumented{font-size:11px;font-family:monospace;font-weight:600;color:#909090}.swagger-ui .response-col_links{padding-left:2em;max-width:40em;font-size:14px;font-family:sans-serif;color:#3b4151}.swagger-ui .response-col_links .response-undocumented{font-size:11px;font-family:monospace;font-weight:600;color:#909090}.swagger-ui .opblock-body .opblock-loading-animation{display:block;margin:3em auto}.swagger-ui .opblock-body pre.microlight{font-size:12px;margin:0;padding:10px;white-space:pre-wrap;word-wrap:break-word;word-break:break-all;word-break:break-word;-webkit-hyphens:auto;-ms-hyphens:auto;hyphens:auto;border-radius:4px;background:#41444e;overflow-wrap:break-word;font-family:monospace;font-weight:600;color:#fff}.swagger-ui .opblock-body pre.microlight span{color:#fff!important}.swagger-ui .opblock-body pre.microlight .headerline{display:block}.swagger-ui .highlight-code{position:relative}.swagger-ui .highlight-code>.microlight{overflow-y:auto;max-height:400px;min-height:6em}.swagger-ui .download-contents{position:absolute;bottom:10px;right:10px;cursor:pointer;background:#7d8293;text-align:center;padding:5px;border-radius:4px;font-family:sans-serif;font-weight:600;color:#fff;font-size:14px;height:30px;width:75px}.swagger-ui .scheme-container{margin:0 0 20px;padding:30px 0;background:#fff;box-shadow:0 1px 2px 0 rgba(0,0,0,.15)}.swagger-ui .scheme-container .schemes{display:flex;align-items:flex-end}.swagger-ui .scheme-container .schemes>label{font-size:12px;font-weight:700;display:flex;flex-direction:column;margin:-20px 15px 0 0;font-family:sans-serif;color:#3b4151}.swagger-ui .scheme-container .schemes>label select{min-width:130px;text-transform:uppercase}.swagger-ui .loading-container{padding:40px 0 60px;margin-top:1em;min-height:1px;display:flex;justify-content:center;align-items:center;flex-direction:column}.swagger-ui .loading-container .loading{position:relative}.swagger-ui .loading-container .loading:after{font-size:10px;font-weight:700;position:absolute;top:50%;left:50%;content:"loading";-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);text-transform:uppercase;font-family:sans-serif;color:#3b4151}.swagger-ui .loading-container .loading:before{position:absolute;top:50%;left:50%;display:block;width:60px;height:60px;margin:-30px;content:"";-webkit-animation:rotation 1s linear infinite,opacity .5s;animation:rotation 1s linear infinite,opacity .5s;opacity:1;border:2px solid rgba(85,85,85,.1);border-top-color:rgba(0,0,0,.6);border-radius:100%;-webkit-backface-visibility:hidden;backface-visibility:hidden}@-webkit-keyframes rotation{to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes rotation{to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}.swagger-ui .response-controls{padding-top:1em;display:flex}.swagger-ui .response-control-media-type{margin-right:1em}.swagger-ui .response-control-media-type--accept-controller select{border-color:green}.swagger-ui .response-control-media-type__accept-message{color:green;font-size:.7em}.swagger-ui .response-control-examples__title,.swagger-ui .response-control-media-type__title{display:block;margin-bottom:.2em;font-size:.7em}@-webkit-keyframes blinker{50%{opacity:0}}@keyframes blinker{50%{opacity:0}}.swagger-ui section h3{font-family:sans-serif;color:#3b4151}.swagger-ui a.nostyle{display:inline}.swagger-ui a.nostyle,.swagger-ui a.nostyle:visited{text-decoration:inherit;color:inherit;cursor:pointer}.swagger-ui .version-pragma{height:100%;padding:5em 0}.swagger-ui .version-pragma__message{display:flex;justify-content:center;height:100%;font-size:1.2em;text-align:center;line-height:1.5em;padding:0 .6em}.swagger-ui .version-pragma__message>div{max-width:55ch;flex:1}.swagger-ui .version-pragma__message code{background-color:#dedede;padding:4px 4px 2px;white-space:pre}.swagger-ui .btn{font-size:14px;font-weight:700;padding:5px 23px;transition:all .3s;border:2px solid grey;border-radius:4px;background:transparent;box-shadow:0 1px 2px rgba(0,0,0,.1);font-family:sans-serif;color:#3b4151}.swagger-ui .btn.btn-sm{font-size:12px;padding:4px 23px}.swagger-ui .btn[disabled]{cursor:not-allowed;opacity:.3}.swagger-ui .btn:hover{box-shadow:0 0 5px rgba(0,0,0,.3)}.swagger-ui .btn.cancel{border-color:#ff6060;background-color:transparent;font-family:sans-serif;color:#ff6060}.swagger-ui .btn.authorize{line-height:1;display:inline;color:#49cc90;border-color:#49cc90;background-color:transparent}.swagger-ui .btn.authorize span{float:left;padding:4px 20px 0 0}.swagger-ui .btn.authorize svg{fill:#49cc90}.swagger-ui .btn.execute{background-color:#4990e2;color:#fff;border-color:#4990e2}.swagger-ui .btn-group{display:flex;padding:30px}.swagger-ui .btn-group .btn{flex:1}.swagger-ui .btn-group .btn:first-child{border-radius:4px 0 0 4px}.swagger-ui .btn-group .btn:last-child{border-radius:0 4px 4px 0}.swagger-ui .authorization__btn{padding:0 10px;border:none;background:none}.swagger-ui .authorization__btn.locked{opacity:1}.swagger-ui .authorization__btn.unlocked{opacity:.4}.swagger-ui .expand-methods,.swagger-ui .expand-operation{border:none;background:none}.swagger-ui .expand-methods svg,.swagger-ui .expand-operation svg{width:20px;height:20px}.swagger-ui .expand-methods{padding:0 10px}.swagger-ui .expand-methods:hover svg{fill:#404040}.swagger-ui .expand-methods svg{transition:all .3s;fill:#707070}.swagger-ui button{cursor:pointer;outline:none}.swagger-ui button.invalid{-webkit-animation:shake .4s 1;animation:shake .4s 1;border-color:#f93e3e;background:#feebeb}.swagger-ui select{font-size:14px;font-weight:700;padding:5px 40px 5px 10px;border:2px solid #41444e;border-radius:4px;background:#f7f7f7 url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMCAyMCI+PHBhdGggZD0iTTEzLjQxOCA3Ljg1OWEuNjk1LjY5NSAwIDAxLjk3OCAwIC42OC42OCAwIDAxMCAuOTY5bC0zLjkwOCAzLjgzYS42OTcuNjk3IDAgMDEtLjk3OSAwbC0zLjkwOC0zLjgzYS42OC42OCAwIDAxMC0uOTY5LjY5NS42OTUgMCAwMS45NzggMEwxMCAxMWwzLjQxOC0zLjE0MXoiLz48L3N2Zz4=) right 10px center no-repeat;background-size:20px;box-shadow:0 1px 2px 0 rgba(0,0,0,.25);font-family:sans-serif;color:#3b4151;-webkit-appearance:none;-moz-appearance:none;appearance:none}.swagger-ui select[multiple]{margin:5px 0;padding:5px;background:#f7f7f7}.swagger-ui select.invalid{-webkit-animation:shake .4s 1;animation:shake .4s 1;border-color:#f93e3e;background:#feebeb}.swagger-ui .opblock-body select{min-width:230px}@media (max-width:768px){.swagger-ui .opblock-body select{min-width:180px}}.swagger-ui label{font-size:12px;font-weight:700;margin:0 0 5px;font-family:sans-serif;color:#3b4151}.swagger-ui input[type=email],.swagger-ui input[type=file],.swagger-ui input[type=password],.swagger-ui input[type=search],.swagger-ui input[type=text],.swagger-ui textarea{min-width:100px;margin:5px 0;padding:8px 10px;border:1px solid #d9d9d9;border-radius:4px;background:#fff}@media (max-width:768px){.swagger-ui input[type=email],.swagger-ui input[type=file],.swagger-ui input[type=password],.swagger-ui input[type=search],.swagger-ui input[type=text],.swagger-ui textarea{max-width:175px}}.swagger-ui input[type=email].invalid,.swagger-ui input[type=file].invalid,.swagger-ui input[type=password].invalid,.swagger-ui input[type=search].invalid,.swagger-ui input[type=text].invalid,.swagger-ui textarea.invalid{-webkit-animation:shake .4s 1;animation:shake .4s 1;border-color:#f93e3e;background:#feebeb}.swagger-ui input[disabled],.swagger-ui select[disabled],.swagger-ui textarea[disabled]{background-color:#fafafa;color:#888;cursor:not-allowed}.swagger-ui select[disabled]{border-color:#888}.swagger-ui textarea[disabled]{background-color:#41444e;color:#fff}@-webkit-keyframes shake{10%,90%{-webkit-transform:translate3d(-1px,0,0);transform:translate3d(-1px,0,0)}20%,80%{-webkit-transform:translate3d(2px,0,0);transform:translate3d(2px,0,0)}30%,50%,70%{-webkit-transform:translate3d(-4px,0,0);transform:translate3d(-4px,0,0)}40%,60%{-webkit-transform:translate3d(4px,0,0);transform:translate3d(4px,0,0)}}@keyframes shake{10%,90%{-webkit-transform:translate3d(-1px,0,0);transform:translate3d(-1px,0,0)}20%,80%{-webkit-transform:translate3d(2px,0,0);transform:translate3d(2px,0,0)}30%,50%,70%{-webkit-transform:translate3d(-4px,0,0);transform:translate3d(-4px,0,0)}40%,60%{-webkit-transform:translate3d(4px,0,0);transform:translate3d(4px,0,0)}}.swagger-ui textarea{font-size:12px;width:100%;min-height:280px;padding:10px;border:none;border-radius:4px;outline:none;background:hsla(0,0%,100%,.8);font-family:monospace;font-weight:600;color:#3b4151}.swagger-ui textarea:focus{border:2px solid #61affe}.swagger-ui textarea.curl{font-size:12px;min-height:100px;margin:0;padding:10px;resize:none;border-radius:4px;background:#41444e;font-family:monospace;font-weight:600;color:#fff}.swagger-ui .checkbox{padding:5px 0 10px;transition:opacity .5s;color:#303030}.swagger-ui .checkbox label{display:flex}.swagger-ui .checkbox p{font-weight:400!important;font-style:italic;margin:0!important;font-family:monospace;font-weight:600;color:#3b4151}.swagger-ui .checkbox input[type=checkbox]{display:none}.swagger-ui .checkbox input[type=checkbox]+label>.item{position:relative;top:3px;display:inline-block;width:16px;height:16px;margin:0 8px 0 0;padding:5px;cursor:pointer;border-radius:1px;background:#e8e8e8;box-shadow:0 0 0 2px #e8e8e8;flex:none}.swagger-ui .checkbox input[type=checkbox]+label>.item:active{-webkit-transform:scale(.9);transform:scale(.9)}.swagger-ui .checkbox input[type=checkbox]:checked+label>.item{background:#e8e8e8 url("data:image/svg+xml;charset=utf-8,%3Csvg width='10' height='8' viewBox='3 7 10 8' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill='%2341474E' fill-rule='evenodd' d='M6.333 15L3 11.667l1.333-1.334 2 2L11.667 7 13 8.333z'/%3E%3C/svg%3E") 50% no-repeat}.swagger-ui .dialog-ux{position:fixed;z-index:9999;top:0;right:0;bottom:0;left:0}.swagger-ui .dialog-ux .backdrop-ux{position:fixed;top:0;right:0;bottom:0;left:0;background:rgba(0,0,0,.8)}.swagger-ui .dialog-ux .modal-ux{position:absolute;z-index:9999;top:50%;left:50%;width:100%;min-width:300px;max-width:650px;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);border:1px solid #ebebeb;border-radius:4px;background:#fff;box-shadow:0 10px 30px 0 rgba(0,0,0,.2)}.swagger-ui .dialog-ux .modal-ux-content{overflow-y:auto;max-height:540px;padding:20px}.swagger-ui .dialog-ux .modal-ux-content p{font-size:12px;margin:0 0 5px;color:#41444e;font-family:sans-serif;color:#3b4151}.swagger-ui .dialog-ux .modal-ux-content h4{font-size:18px;font-weight:600;margin:15px 0 0;font-family:sans-serif;color:#3b4151}.swagger-ui .dialog-ux .modal-ux-header{display:flex;padding:12px 0;border-bottom:1px solid #ebebeb;align-items:center}.swagger-ui .dialog-ux .modal-ux-header .close-modal{padding:0 10px;border:none;background:none;-webkit-appearance:none;-moz-appearance:none;appearance:none}.swagger-ui .dialog-ux .modal-ux-header h3{font-size:20px;font-weight:600;margin:0;padding:0 20px;flex:1;font-family:sans-serif;color:#3b4151}.swagger-ui .model{font-size:12px;font-weight:300;font-family:monospace;font-weight:600;color:#3b4151}.swagger-ui .model .deprecated span,.swagger-ui .model .deprecated td{color:#a0a0a0!important}.swagger-ui .model .deprecated>td:first-of-type{text-decoration:line-through}.swagger-ui .model-toggle{font-size:10px;position:relative;top:6px;display:inline-block;margin:auto .3em;cursor:pointer;transition:-webkit-transform .15s ease-in;transition:transform .15s ease-in;transition:transform .15s ease-in, -webkit-transform .15s ease-in;-webkit-transform:rotate(90deg);transform:rotate(90deg);-webkit-transform-origin:50% 50%;transform-origin:50% 50%}.swagger-ui .model-toggle.collapsed{-webkit-transform:rotate(0deg);transform:rotate(0deg)}.swagger-ui .model-toggle:after{display:block;width:20px;height:20px;content:"";background:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24'%3E%3Cpath d='M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z'/%3E%3C/svg%3E") 50% no-repeat;background-size:100%}.swagger-ui .model-jump-to-path{position:relative;cursor:pointer}.swagger-ui .model-jump-to-path .view-line-link{position:absolute;top:-.4em;cursor:pointer}.swagger-ui .model-title{position:relative}.swagger-ui .model-title:hover .model-hint{visibility:visible}.swagger-ui .model-hint{position:absolute;top:-1.8em;visibility:hidden;padding:.1em .5em;white-space:nowrap;color:#ebebeb;border-radius:4px;background:rgba(0,0,0,.7)}.swagger-ui .model p{margin:0 0 1em}.swagger-ui section.models{margin:30px 0;border:1px solid rgba(59,65,81,.3);border-radius:4px}.swagger-ui section.models.is-open{padding:0 0 20px}.swagger-ui section.models.is-open h4{margin:0 0 5px;border-bottom:1px solid rgba(59,65,81,.3)}.swagger-ui section.models h4{font-size:16px;display:flex;align-items:center;margin:0;padding:10px 20px 10px 10px;cursor:pointer;transition:all .2s;font-family:sans-serif;color:#606060}.swagger-ui section.models h4 svg{transition:all .4s}.swagger-ui section.models h4 span{flex:1}.swagger-ui section.models h4:hover{background:rgba(0,0,0,.02)}.swagger-ui section.models h5{font-size:16px;margin:0 0 10px;font-family:sans-serif;color:#707070}.swagger-ui section.models .model-jump-to-path{position:relative;top:5px}.swagger-ui section.models .model-container{margin:0 20px 15px;position:relative;transition:all .5s;border-radius:4px;background:rgba(0,0,0,.05)}.swagger-ui section.models .model-container:hover{background:rgba(0,0,0,.07)}.swagger-ui section.models .model-container:first-of-type{margin:20px}.swagger-ui section.models .model-container:last-of-type{margin:0 20px}.swagger-ui section.models .model-container .models-jump-to-path{position:absolute;top:8px;right:5px;opacity:.65}.swagger-ui section.models .model-box{background:none}.swagger-ui .model-box{padding:10px;display:inline-block;border-radius:4px;background:rgba(0,0,0,.1)}.swagger-ui .model-box .model-jump-to-path{position:relative;top:4px}.swagger-ui .model-box.deprecated{opacity:.5}.swagger-ui .model-title{font-size:16px;font-family:sans-serif;color:#505050}.swagger-ui .model-deprecated-warning{font-size:16px;font-weight:600;margin-right:1em;font-family:sans-serif;color:#f93e3e}.swagger-ui span>span.model .brace-close{padding:0 0 0 10px}.swagger-ui .prop-name{display:inline-block;margin-right:1em}.swagger-ui .prop-type{color:#55a}.swagger-ui .prop-enum{display:block}.swagger-ui .prop-format{color:#606060}.swagger-ui .servers>label{font-size:12px;margin:-20px 15px 0 0;font-family:sans-serif;color:#3b4151}.swagger-ui .servers>label select{min-width:130px;max-width:100%}.swagger-ui .servers h4.message{padding-bottom:2em}.swagger-ui .servers table tr{width:30em}.swagger-ui .servers table td{display:inline-block;max-width:15em;vertical-align:middle;padding-top:10px;padding-bottom:10px}.swagger-ui .servers table td:first-of-type{padding-right:2em}.swagger-ui .servers table td input{width:100%;height:100%}.swagger-ui .servers .computed-url{margin:2em 0}.swagger-ui .servers .computed-url code{display:inline-block;padding:4px;font-size:16px;margin:0 1em}.swagger-ui .servers-title{font-size:12px;font-weight:700}.swagger-ui .operation-servers h4.message{margin-bottom:2em}.swagger-ui table{width:100%;padding:0 10px;border-collapse:collapse}.swagger-ui table.model tbody tr td{padding:0;vertical-align:top}.swagger-ui table.model tbody tr td:first-of-type{width:174px;padding:0 0 0 2em}.swagger-ui table.headers td{font-size:12px;font-weight:300;vertical-align:middle;font-family:monospace;font-weight:600;color:#3b4151}.swagger-ui table tbody tr td{padding:10px 0 0;vertical-align:top}.swagger-ui table tbody tr td:first-of-type{max-width:20%;min-width:6em;padding:10px 0}.swagger-ui table thead tr td,.swagger-ui table thead tr th{font-size:12px;font-weight:700;padding:12px 0;text-align:left;border-bottom:1px solid rgba(59,65,81,.2);font-family:sans-serif;color:#3b4151}.swagger-ui .parameters-col_description{width:99%;margin-bottom:2em}.swagger-ui .parameters-col_description input[type=text]{width:100%;max-width:340px}.swagger-ui .parameters-col_description select{border-width:1px}.swagger-ui .parameter__name{font-size:16px;font-weight:400;margin-right:.75em;font-family:sans-serif;color:#3b4151}.swagger-ui .parameter__name.required{font-weight:700}.swagger-ui .parameter__name.required:after{font-size:10px;position:relative;top:-6px;padding:5px;content:"required";color:rgba(255,0,0,.6)}.swagger-ui .parameter__extension,.swagger-ui .parameter__in{font-size:12px;font-style:italic;font-family:monospace;font-weight:600;color:grey}.swagger-ui .parameter__deprecated{font-size:12px;font-style:italic;font-family:monospace;font-weight:600;color:red}.swagger-ui .parameter__empty_value_toggle{font-size:13px;padding-top:5px;padding-bottom:12px}.swagger-ui .parameter__empty_value_toggle input{margin-right:7px}.swagger-ui .parameter__empty_value_toggle.disabled{opacity:.7}.swagger-ui .table-container{padding:20px}.swagger-ui .response-col_description{width:99%}.swagger-ui .response-col_links{min-width:6em}.swagger-ui .topbar{padding:10px 0;background-color:#1b1b1b}.swagger-ui .topbar .topbar-wrapper,.swagger-ui .topbar a{display:flex;align-items:center}.swagger-ui .topbar a{font-size:1.5em;font-weight:700;flex:1;max-width:300px;text-decoration:none;font-family:sans-serif;color:#fff}.swagger-ui .topbar a span{margin:0;padding:0 10px}.swagger-ui .topbar .download-url-wrapper{display:flex;flex:3;justify-content:flex-end}.swagger-ui .topbar .download-url-wrapper input[type=text]{width:100%;margin:0;border:2px solid #62a03f;border-radius:4px 0 0 4px;outline:none}.swagger-ui .topbar .download-url-wrapper .select-label{display:flex;align-items:center;width:100%;max-width:600px;margin:0;color:#f0f0f0}.swagger-ui .topbar .download-url-wrapper .select-label span{font-size:16px;flex:1;padding:0 10px 0 0;text-align:right}.swagger-ui .topbar .download-url-wrapper .select-label select{flex:2;width:100%;border:2px solid #62a03f;outline:none;box-shadow:none}.swagger-ui .topbar .download-url-wrapper .download-url-button{font-size:16px;font-weight:700;padding:4px 30px;border:none;border-radius:0 4px 4px 0;background:#62a03f;font-family:sans-serif;color:#fff}.swagger-ui .info{margin:50px 0}.swagger-ui .info hgroup.main{margin:0 0 20px}.swagger-ui .info hgroup.main a{font-size:12px}.swagger-ui .info pre{font-size:14px}.swagger-ui .info li,.swagger-ui .info p,.swagger-ui .info table{font-size:14px;font-family:sans-serif;color:#3b4151}.swagger-ui .info h1,.swagger-ui .info h2,.swagger-ui .info h3,.swagger-ui .info h4,.swagger-ui .info h5{font-family:sans-serif;color:#3b4151}.swagger-ui .info a{font-size:14px;transition:all .4s;font-family:sans-serif;color:#4990e2}.swagger-ui .info a:hover{color:#1f69c0}.swagger-ui .info>div{margin:0 0 5px}.swagger-ui .info .base-url{font-size:12px;font-weight:300!important;margin:0;font-family:monospace;font-weight:600;color:#3b4151}.swagger-ui .info .title{font-size:36px;margin:0;font-family:sans-serif;color:#3b4151}.swagger-ui .info .title small{font-size:10px;position:relative;top:-5px;display:inline-block;margin:0 0 0 5px;padding:2px 4px;vertical-align:super;border-radius:57px;background:#7d8492}.swagger-ui .info .title small pre{margin:0;padding:0;font-family:sans-serif;color:#fff}.swagger-ui .auth-btn-wrapper{display:flex;padding:10px 0;justify-content:center}.swagger-ui .auth-btn-wrapper .btn-done{margin-right:1em}.swagger-ui .auth-wrapper{display:flex;flex:1;justify-content:flex-end}.swagger-ui .auth-wrapper .authorize{padding-right:20px;margin-right:10px}.swagger-ui .auth-container{margin:0 0 10px;padding:10px 20px;border-bottom:1px solid #ebebeb}.swagger-ui .auth-container:last-of-type{margin:0;padding:10px 20px;border:0}.swagger-ui .auth-container h4{margin:5px 0 15px!important}.swagger-ui .auth-container .wrapper{margin:0;padding:0}.swagger-ui .auth-container input[type=password],.swagger-ui .auth-container input[type=text]{min-width:230px}.swagger-ui .auth-container .errors{font-size:12px;padding:10px;border-radius:4px;font-family:monospace;font-weight:600;color:#3b4151}.swagger-ui .scopes h2{font-size:14px;font-family:sans-serif;color:#3b4151}.swagger-ui .scope-def{padding:0 0 20px}.swagger-ui .errors-wrapper{margin:20px;padding:10px 20px;-webkit-animation:scaleUp .5s;animation:scaleUp .5s;border:2px solid #f93e3e;border-radius:4px;background:rgba(249,62,62,.1)}.swagger-ui .errors-wrapper .error-wrapper{margin:0 0 10px}.swagger-ui .errors-wrapper .errors h4{font-size:14px;margin:0;font-family:monospace;font-weight:600;color:#3b4151}.swagger-ui .errors-wrapper .errors small{color:#606060}.swagger-ui .errors-wrapper hgroup{display:flex;align-items:center}.swagger-ui .errors-wrapper hgroup h4{font-size:20px;margin:0;flex:1;font-family:sans-serif;color:#3b4151}@-webkit-keyframes scaleUp{0%{-webkit-transform:scale(.8);transform:scale(.8);opacity:0}to{-webkit-transform:scale(1);transform:scale(1);opacity:1}}@keyframes scaleUp{0%{-webkit-transform:scale(.8);transform:scale(.8);opacity:0}to{-webkit-transform:scale(1);transform:scale(1);opacity:1}}.swagger-ui .Resizer.vertical.disabled{display:none}.swagger-ui .markdown p,.swagger-ui .markdown pre,.swagger-ui .renderedMarkdown p,.swagger-ui .renderedMarkdown pre{margin:1em auto}.swagger-ui .markdown pre,.swagger-ui .renderedMarkdown pre{color:#000;font-weight:400;white-space:pre-wrap;background:none;padding:0}.swagger-ui .markdown code,.swagger-ui .renderedMarkdown code{font-size:14px;padding:5px 7px;border-radius:4px;background:rgba(0,0,0,.05);font-family:monospace;font-weight:600;color:#9012fe}.swagger-ui .markdown pre>code,.swagger-ui .renderedMarkdown pre>code{display:block} - -/*# sourceMappingURL=swagger-ui.css.map*/ \ No newline at end of file diff --git a/docs/api-adv/assemblies/index.html b/docs/api-adv/assemblies/index.html index 6e3bf8d..fb641cb 100644 --- a/docs/api-adv/assemblies/index.html +++ b/docs/api-adv/assemblies/index.html @@ -1,15 +1,12 @@ -Assemblies | Assemblies |

Assemblies

This page describes the APIs Onshape provides for working with assemblies.

📘 Notes

\ No newline at end of file diff --git a/docs/api-adv/associativity/index.html b/docs/api-adv/associativity/index.html index dee79cb..01c811a 100644 --- a/docs/api-adv/associativity/index.html +++ b/docs/api-adv/associativity/index.html @@ -1,8 +1,8 @@ -Associativity |

Associativity

Onshape does not expose a persistent ID for any of these entities. When the model changes, the ID may change. Therefore, Onshape provides an API to enable mapping IDs from a previous microversion to the current microversion. Assuming a simple case of maintaining associativity for a face, an abstract workflow might be:

  1. Read the tessellated model data.
  2. Select the face of interest.
  3. Store the Face ID and Document Microversion ID for the face.
  4. [ user changes model ]
  5. Call the REST API to translate from the known Face ID to an ID in the new model.
  6. Re-apply application-specific data to the face(s) in the new model. Note that a face may become zero, one or multiple faces in the new model, depending on what changes the user made.

Associativity Example

  1. Create a cube in Onshape:
    image alt text
  2. Get the document microversion ID from the URL: https://cad.onshape.com/api/d/<docid>/w/<wid>/microversionId.
  3. Use the appropriate REST API to get the tessellated faces (getPartStudioFaces) +Associativity |

    Associativity

    Onshape does not expose a persistent ID for any of these entities. When the model changes, the ID may change. Therefore, Onshape provides an API to enable mapping IDs from a previous microversion to the current microversion. Assuming a simple case of maintaining associativity for a face, an abstract workflow might be:

    1. Read the tessellated model data.
    2. Select the face of interest.
    3. Store the Face ID and Document Microversion ID for the face.
    4. [ user changes model ]
    5. Call the REST API to translate from the known Face ID to an ID in the new model.
    6. Re-apply application-specific data to the face(s) in the new model. Note that a face may become zero, one or multiple faces in the new model, depending on what changes the user made.

    Associativity Example

    1. Create a cube in Onshape:
      image alt text
    2. Get the document microversion ID from the URL: https://cad.onshape.com/api/d/<docid>/w/<wid>/microversionId.
    3. Use the appropriate REST API to get the tessellated faces (getPartStudioFaces) and edges (getPartStudioEdges}. Note the ids:
      • Part ID: JHD
      • Front face ID: JHO
      • Top edge of the front face ID: JHd
      • Right edge of the top face ID: JHt
    4. Split cube with the Front plane and translate the IDs:

    image alt text

    POST

    https://cad.onshape.com/api/partstudios/d/<docid>/w/<wid>/e/<eid>/idtranslations
     

    Body:

    {
       "sourceDocumentMicroversion" : "47e75ab2ee8b4356a76ebd47",
    @@ -54,4 +54,4 @@
         ],
         "targetDocumentMicroversion": "52aa74d34b624f3aaef33204"
     }
    -
    \ No newline at end of file +
\ No newline at end of file diff --git a/docs/api-adv/billing/index.html b/docs/api-adv/billing/index.html index a1749dc..b16ad5a 100644 --- a/docs/api-adv/billing/index.html +++ b/docs/api-adv/billing/index.html @@ -1,14 +1,15 @@ -Billing | Billing |

Billing

This document describes APIs that will allow partners to interact with the Onshape billing system.

Please address questions to “api-support@onshape.com” for the fastest response.

Overview

All billing is done through “plans” that are created in the Developer Portal. A “plan” has the following attributes:

Name (also called SKU)A unique (within your company) plan name
DescriptionA user-visible description of the plan
AmountThe cost of the plan (may be one-time or recurring, depending on the type)
TypeMonthly, One-time or Consumable

Onshape defines three kinds of plans:

Plan typeDescription
Recurring +Name (also called SKU) A unique (within your company) plan name Description A user-visible description of the plan Amount The cost of the plan (may be one-time or recurring, depending on the type) Type Monthly, One-time or Consumable Onshape defines three kinds of plans:">

Billing

This document describes APIs that will allow partners to interact with the Onshape billing system.

Please address questions to “api-support@onshape.com” for the fastest response.

Overview

All billing is done through “plans” that are created in the Developer Portal. A “plan” has the following attributes:

Name (also called SKU)A unique (within your company) plan name
DescriptionA user-visible description of the plan
AmountThe cost of the plan (may be one-time or recurring, depending on the type)
TypeMonthly, One-time or Consumable

Onshape defines three kinds of plans:

Plan typeDescription
Recurring (Monthly Subscription)A plan that is renewed monthly at a fixed cost. All Apps in the app store must have a Free monthly plan (which is created by default), and may have additional paid plans.
One-timeA plan that is purchased once (not renewed monthly). A user may purchase these multiple times.
ConsumableA plan that represents a consumable unit, such as "hours of rendering" or “simulation runs”. Consumable plans are not fully implemented at this time, but the consumable functionality can be implemented using One-time Purchase plans as described below.

Users may purchase plans through the App Store interface. In addition, if your application has the OAuth Purchase Scope, your application can initiate “in-app” purchases by calling Onshape to request a purchase.

The basic steps for interacting with Onshape Billing:

  1. Define one or more plans using the Developer Portal interface
  2. Use the Onshape API to determine the current user’s plan
  3. Provide features and/or limits based on the current plan

Using the Onshape Billing API

GET /api/accounts/purchases

Returns a list of purchase made by the current user for plans owned by the current application. Use this information to determine what capabilities or features the user is entitled to use.

DELETE /api/accounts/purchases/<purchase id>

Cancel a recurring purchase.

POST /api/accounts/purchases/<purchase id>/consume

Indicate the use of a consumable. (Not fully implemented at this time)

GET /api/billing/plans/client/<client id>

Get a list of the billing plans defined for this client.

Initiating a purchase from an application (in-app purchases)

To initiate a purchase of a subscription or one time item you must set the browser’s location to particular URL within the Onshape stack:

https://cad.onshape.com/billing/purchase?redirectUri=RRRR&clientId=CCCC&sku=SSSS&userId=UUUU

Each of the query parameters should be URL encoded. The clientId is your application’s OAuth Client ID, the sku is the name/sku field for an item (you can find this in the developer portal or it’s retrievable through the /api/billing/plans REST endpoints). The user Id should be the Onshape user Id for the current user and is available through the /api/users/session REST endpoint. The redirectUri is the URI the user will be returned to within your website when the purchase is finished.

When the browser’s location is changed to this pattern the Onshape stack will serve content to confirm the users identity, confirm the details of what is being purchased (or obtained if the item is free) and then after the user agrees to the purchase will confirm the transaction (with our payment processor if the item is not free) and then redirect the user back to the supplied redirectUri (the browser location will be changed to the redirectUri). Additionally Onshape will add a success=true or success=false query parameter to the redirectURI indicating whether the user completed successfully (payment was taken if required etc.) or failed, either due to cancelling the purchase or an issue with payment.

When the browser fetches the redirectUri your application must call back through the /api/account/purchases API to get confirmation of the purchase - do NOT assume that a fetch of the redirectUri with a success=true query parameter actually indicates a purchase has occurred. Query the Onshape stack with the /api/account/purchases API to ensure that the required item has actually been bought.

Consumable Items

A detailed description of the interface for managing consumable purchases will be provided shortly. You can use one-time plans to achieve similar results:

  1. Define a one-time purchase plan with a description indicating the nature of the purchase, for example:

    RENDER-10 Ten rendering hours $100

  2. Keep track of the number of hours that the user has consumed. You can store and retrieve this information in Onshape using the following APIs. These APIs allow you to store and retrieve arbitrary information on a per-user basis.

    POST /applications/clients/:cid/settings/users/:uid -GET /applications/clients/:cid/settings/users/:uid

  3. Check the number of available “units” by getting the purchases and the record of consumables. Be sure to include UI in your application that the user can use to see their remaining quantity.

  4. Alternately, you can store the consumption data in your own system; you do not need to use the Onshape API to manage that data.

Onshape intends to provide a richer set of APIs that help track the purchase and consumption of consumables in the near future.

Other billing models

You can use these mechanisms to implement other models. For example, a time-limited trial could be implemented by scanning purchases for the first “purchase” and denying service if it is more than a defined number of days in the past. A “fixed number of uses per month” could be implemented as a monthly subscription, string usage data with the settings API, and denying service after a fixed number of uses.

Samples

Onshape will provide sample code for both desktop and integrated applications demonstrating the use of the billing APIs and workflow. If you are subscribed to the Onshape Github Partner group, you will have access to those samples as soon as they are posted.

Testing

Please contact api-support@onshape.com to discuss details of testing billing & subscriptions.

\ No newline at end of file +GET /applications/clients/:cid/settings/users/:uid

  • Check the number of available “units” by getting the purchases and the record of consumables. Be sure to include UI in your application that the user can use to see their remaining quantity.

  • Alternately, you can store the consumption data in your own system; you do not need to use the Onshape API to manage that data.

  • Onshape intends to provide a richer set of APIs that help track the purchase and consumption of consumables in the near future.

    Other billing models

    You can use these mechanisms to implement other models. For example, a time-limited trial could be implemented by scanning purchases for the first “purchase” and denying service if it is more than a defined number of days in the past. A “fixed number of uses per month” could be implemented as a monthly subscription, string usage data with the settings API, and denying service after a fixed number of uses.

    Samples

    Onshape will provide sample code for both desktop and integrated applications demonstrating the use of the billing APIs and workflow. If you are subscribed to the Onshape Github Partner group, you will have access to those samples as soon as they are posted.

    Testing

    Please contact api-support@onshape.com to discuss details of testing billing & subscriptions.

    \ No newline at end of file diff --git a/docs/api-adv/configs/index.html b/docs/api-adv/configs/index.html index d1e1f21..5022cff 100644 --- a/docs/api-adv/configs/index.html +++ b/docs/api-adv/configs/index.html @@ -1,9 +1,8 @@ -Configurations |

    Configurations

    This page describes the APIs Onshape provides for working with Configurations.

    You can use Configurations to create variations of entire Part Studios, Assemblies, specific parts and more. You can configure feature and parameter values, part properties, custom part properties, face and part appearances, and sketch text. Each Part Studio can have only one Configuration, but it can contain multiple Configuration inputs. The Configuration inputs you define for a Part Studio become options when inserting that Part Studio into an Assembly or Drawing. You can also create your own Configurations for an Assembly, regardless of any existing Part Studio Configurations. Assembly Configurations work the same way as Part Studio Configurations, but are limited to configuring Mates (not Mate connectors), instances, and patterns.

    📘 Notes

    • This page provides sample code as curls. See the curl documentation for more information.
    • All Onshape API calls must be properly authenticated by replacing the CREDENTIALS variable in the curls below. See the API Keys page for instructions and the Quick Start for an example. All applications submitted to the Onshape App Store must authenticate with OAuth2.
    • This documentation refers to Onshape IDs in the following format: {did}, {wid}, {eid}, {pid}, {otherId}. These represent document, workspace, element, part, and other IDs (respectively) that are needed make the API calls. We sometimes abbreviate these variables as DWVEM Please see API Guide: API Intro for information on what these IDs mean and how to obtain them from your documents. Never include the curly braces ({}) in your API calls.
    • For Enterprise accounts, replace cad in all Onshape URLs with your company domain. +Configurations |

      Configurations

      This page describes the APIs Onshape provides for working with Configurations.

      You can use Configurations to create variations of entire Part Studios, Assemblies, specific parts and more. You can configure feature and parameter values, part properties, custom part properties, face and part appearances, and sketch text. Each Part Studio can have only one Configuration, but it can contain multiple Configuration inputs. The Configuration inputs you define for a Part Studio become options when inserting that Part Studio into an Assembly or Drawing. You can also create your own Configurations for an Assembly, regardless of any existing Part Studio Configurations. Assembly Configurations work the same way as Part Studio Configurations, but are limited to configuring Mates (not Mate connectors), instances, and patterns.

      📘 Notes

      • This page provides sample code as curls. See the curl documentation for more information.
      • All Onshape API calls must be properly authenticated by replacing the CREDENTIALS variable in the curls below. See the API Keys page for instructions and the Quick Start for an example. All applications submitted to the Onshape App Store must authenticate with OAuth2.
      • This documentation refers to Onshape IDs in the following format: {did}, {wid}, {eid}, {pid}, {otherId}. These represent document, workspace, element, part, and other IDs (respectively) that are needed make the API calls. We sometimes abbreviate these variables as DWVEM Please see API Guide: API Intro for information on what these IDs mean and how to obtain them from your documents. Never include the curly braces ({}) in your API calls.
      • For Enterprise accounts, replace cad in all Onshape URLs with your company domain. https://cad.onshape.com > https://companyName.onshape.com

      Endpoints

      • Element/getConfiguration: Get the configuration data for a Part Studio or Assembly.
        curl -X 'GET' \
             'https://cad.onshape.com/api/v6/elements/d/{did}/wvm/{wvmid}/e/{eid}/configuration' \
             -H 'Accept: application/json;charset=UTF-8; qs=0.09' \
        @@ -143,4 +142,4 @@
             -H 'Accept: */*' \
             -H 'Authorization: Basic CREDENTIALS' \
         
      • This endpoint returns a redirect URL. Navigate to the returned URL in your browser to download the export.
        • Hint: The URL will look something like this, but with different IDs:
        https://cad.onshape.com/api/v6/partstudios/d/e60c4803eaf2ac8be492c18e/w/d2558da712764516cc9fec62/e/958bceb5a2511b572dbbe851/parasolid?version=0&includeExportIds=false&configuration=List_izOjbm5HCRXEld%253D_500_mm&binaryExport=false
        -
      • Now we need to import our Parasolid to confirm the correct configuration was used. Open your document in the Onshape UI, click the Insert new tab button, and then select Import.
        Insert new tab menu with Import highlighted in Onshape UI
      • Navigate to the export you downloaded (with the .x_t extension) and import it into Onshape.
      • Use the measure tool to confirm the length of the imported drillbit is 500 mm.
        Measure tool in Onshape UI showing drill length as 500 mm
      • Workflow Video

        This video demonstrates how to complete the above tutorials in the Onshape API Explorer.

        Additional Resources

      \ No newline at end of file +
    • Now we need to import our Parasolid to confirm the correct configuration was used. Open your document in the Onshape UI, click the Insert new tab button, and then select Import.
      Insert new tab menu with Import highlighted in Onshape UI
    • Navigate to the export you downloaded (with the .x_t extension) and import it into Onshape.
    • Use the measure tool to confirm the length of the imported drillbit is 500 mm.
      Measure tool in Onshape UI showing drill length as 500 mm
    • Workflow Video

      This video demonstrates how to complete the above tutorials in the Onshape API Explorer.

      Additional Resources

    \ No newline at end of file diff --git a/docs/api-adv/drawings/index.html b/docs/api-adv/drawings/index.html index d78a5b4..40ec9c2 100644 --- a/docs/api-adv/drawings/index.html +++ b/docs/api-adv/drawings/index.html @@ -1,15 +1,12 @@ -Drawings | Drawings |

    Drawings

    This page describes the APIs Onshape provides for creating and manipulating Onshape drawings.

    📘 Notes

    1. Return to your document and see that the centerline has been added to the document at the snap points.
      drawing front view of a box with two holes with a centerline between the hole centers

    Additional Resources

    \ No newline at end of file diff --git a/docs/api-adv/errors/index.html b/docs/api-adv/errors/index.html index 4aab42d..a89ced4 100644 --- a/docs/api-adv/errors/index.html +++ b/docs/api-adv/errors/index.html @@ -1,11 +1,13 @@ -Response Codes | Response Codes |

    Response Codes

    This page details some of the response codes that may be returned by Onshape API endpoints. For each response code, we’ve provided a brief description of the response and recommended next steps.

    Success (2xx)

    The client call was successful.

    200 - OK

    The client call was successful. No action needed.

    204 - No Content

    The client call was successful, and there’s nothing to return in the response body. The empty response body cannot be parsed.

    Redirect (3xx)

    307 - Temporary Redirect

    The client call was successful, and a redirection URL was returned. Follow the URL provided in the response.

    Client Error (4xx)

    There’s an error with the client request. Find the error code below, and follow the instructions for resolution.

    400 - Bad Request

    The request cannot be processed by the server due a client-side error. This could be a malformed request syntax or other issue. Check the request parameters (GET and POST) and request body (POST) to determine the cause of the failure.

    401 - Unauthorized

    The request failed the authentication/authorization checks. This could mean that the client is not logged in, API keys are invalid, OAuth failed, etc. Make sure the client is authenticated.

    403 - Forbidden

    The client doesn’t have the correct permissions to perform this operation. Check that the API Keys or OAuth authentication have sufficient permissions to perform the operation. For example, POST operations typically require write scope; if the API Key was created with only read scope, the server will return a 403 error.

    You might also need to check document and user permissions. For more details, see Share Documents (for everyone) and Understanding and Administering Project Roles and Permission Schemes (for Enterprise users and administrators).

    404 - Not Found

    The server can’t find what the client is looking for. For example, a 404 error will be returned if the client tries to make a GET request for a document that doesn’t exist.

    405 - Method Not Allowed

    Use of that method is not supported. For example, you cannot perform a DELETE request on a document version, because versions are read-only. Only GET requests on document versions are allowed.

    406 - Not Acceptable

    The server cannot provide a response for the media type requested. See https://datatracker.ietf.org/doc/html/rfc2616#section-6.1.1.

    409 - Conflict

    The client call includes duplicate values, causing a conflict. Modify the request to remove any conflicting values.

    415 - Media Type Not Supported

    The client call includes unsupported data types or invalid JSON. Review the client code. When performing data imports and exports, follow all Translation guidelines to ensure all media and file types are supported.

    429 - Too Many Requests

    The client sent too many requests to a particular endpoint in a given time window. The number of requests allowed per time window vary and are subject to change. Onshape does not publish this information. If the client receives HTTP 429 responses, delay and then retry, or reduce its request rate.

    499 - Timeout

    This call is taking too long. Please try again later.

    Server Error (5xx)

    There’s an error with the Onshape servers. Find the error code below, and follow the instructions for resolution.

    500 - Internal Server Error

    The request resulted in an error. Set a limit for the number of retries, and if the request continues to fail, reach out to support.

    503 - Service Unavailable

    Something is wrong with the Onshape servers. Retry after the delay specified in the response. Set a limit for the number of retries, and if the request continues to fail, reach out to support.

    \ No newline at end of file +204 - No Content The client call was successful, and there’s nothing to return in the response body. The empty response body cannot be parsed.">

    Response Codes

    This page details some of the response codes that may be returned by Onshape API endpoints. For each response code, we’ve provided a brief description of the response and recommended next steps.

    Success (2xx)

    The client call was successful.

    200 - OK

    The client call was successful. No action needed.

    204 - No Content

    The client call was successful, and there’s nothing to return in the response body. The empty response body cannot be parsed.

    Redirect (3xx)

    307 - Temporary Redirect

    The client call was successful, and a redirection URL was returned. Follow the URL provided in the response.

    Client Error (4xx)

    There’s an error with the client request. Find the error code below, and follow the instructions for resolution.

    400 - Bad Request

    The request cannot be processed by the server due a client-side error. This could be a malformed request syntax or other issue. Check the request parameters (GET and POST) and request body (POST) to determine the cause of the failure.

    401 - Unauthorized

    The request failed the authentication/authorization checks. This could mean that the client is not logged in, API keys are invalid, OAuth failed, etc. Make sure the client is authenticated.

    403 - Forbidden

    The client doesn’t have the correct permissions to perform this operation. Check that the API Keys or OAuth authentication have sufficient permissions to perform the operation. For example, POST operations typically require write scope; if the API Key was created with only read scope, the server will return a 403 error.

    You might also need to check document and user permissions. For more details, see Share Documents (for everyone) and Understanding and Administering Project Roles and Permission Schemes (for Enterprise users and administrators).

    404 - Not Found

    The server can’t find what the client is looking for. For example, a 404 error will be returned if the client tries to make a GET request for a document that doesn’t exist.

    405 - Method Not Allowed

    Use of that method is not supported. For example, you cannot perform a DELETE request on a document version, because versions are read-only. Only GET requests on document versions are allowed.

    406 - Not Acceptable

    The server cannot provide a response for the media type requested. See https://datatracker.ietf.org/doc/html/rfc2616#section-6.1.1.

    409 - Conflict

    The client call includes duplicate values, causing a conflict. Modify the request to remove any conflicting values.

    415 - Media Type Not Supported

    The client call includes unsupported data types or invalid JSON. Review the client code. When performing data imports and exports, follow all Translation guidelines to ensure all media and file types are supported.

    429 - Too Many Requests

    The client sent too many requests to a particular endpoint in a given time window. The number of requests allowed per time window vary and are subject to change. Onshape does not publish this information. If the client receives HTTP 429 responses, delay and then retry, or reduce its request rate.

    499 - Timeout

    This call is taking too long. Please try again later.

    Server Error (5xx)

    There’s an error with the Onshape servers. Find the error code below, and follow the instructions for resolution.

    500 - Internal Server Error

    The request resulted in an error. Set a limit for the number of retries, and if the request continues to fail, reach out to support.

    503 - Service Unavailable

    Something is wrong with the Onshape servers. Retry after the delay specified in the response. Set a limit for the number of retries, and if the request continues to fail, reach out to support.

    \ No newline at end of file diff --git a/docs/api-adv/featureaccess/index.html b/docs/api-adv/featureaccess/index.html index df83062..b434e2c 100644 --- a/docs/api-adv/featureaccess/index.html +++ b/docs/api-adv/featureaccess/index.html @@ -1,15 +1,12 @@ -Features | Features |

    Features

    This page describes the APIs Onshape provides for creating and manipulating features and the Feature List in a Part Studio.

    📘 Notes

    \ No newline at end of file diff --git a/docs/api-adv/fs/index.html b/docs/api-adv/fs/index.html index 6b79466..754500f 100644 --- a/docs/api-adv/fs/index.html +++ b/docs/api-adv/fs/index.html @@ -1,15 +1,12 @@ -Evaluating FeatureScript | Evaluating FeatureScript |

    Evaluating FeatureScript

    This page describes some of the APIs Onshape provides for evaluating FeatureScript.

    📘 Notes

    \ No newline at end of file diff --git a/docs/api-adv/index.html b/docs/api-adv/index.html index 6bcc24e..cca5769 100644 --- a/docs/api-adv/index.html +++ b/docs/api-adv/index.html @@ -1,3 +1 @@ -API Guides |
    \ No newline at end of file +API Guides |
    \ No newline at end of file diff --git a/docs/api-adv/index.xml b/docs/api-adv/index.xml index 87efb0c..bec9b6a 100644 --- a/docs/api-adv/index.xml +++ b/docs/api-adv/index.xml @@ -1,2934 +1,21 @@ -– API Guideshttps://onshape-public.github.io/docs/api-adv/Recent content in API Guides onHugo -- gohugo.ioen-usThu, 15 Aug 2024 00:00:00 +0000Docs: Assemblieshttps://onshape-public.github.io/docs/api-adv/assemblies/Tue, 13 Aug 2024 00:00:00 +0000https://onshape-public.github.io/docs/api-adv/assemblies/ -<p>This page describes the APIs Onshape provides for working with assemblies.</p> -<blockquote> -<p>📘 <strong>Notes</strong></p> -<ul> -<li>This page provides sample code as curls. See the <a href="https://curl.se/docs/">curl documentation</a> for more information.</li> -<li>All Onshape API calls must be properly authenticated by replacing the <code>CREDENTIALS</code> variable in the curls below. See the <a href="https://onshape-public.github.io/docs/auth/apikeys">API Keys</a> page for instructions and the <a href="https://onshape-public.github.io/docs/api-intro/quickstart">Quick Start</a> for an example. All applications submitted to the Onshape App Store <em>must</em> authenticate with <a href="https://onshape-public.github.io/docs/auth/oauth">OAuth2</a>.</li> -<li>This documentation refers to Onshape IDs in the following format: <code>{did}, {wid}, {eid}, {pid}, {otherId}</code>. These represent document, workspace, element, part, and other IDs (respectively) that are needed make the API calls. We sometimes abbreviate these variables as <code>DWVEM</code> Please see <a href="https://onshape-public.github.io/docs/api-intro/#onshape-api-request">API Guide: API Intro</a> for information on what these IDs mean and how to obtain them from your documents. Never include the curly braces (<code>{}</code>) in your API calls.</li> -<li>For Enterprise accounts, replace <strong><font color="slate">cad</font></strong> in all Onshape URLs with your company domain. -https://<font color="slate"><strong>cad</strong></font>.onshape.com &gt; https://<font color="slate"><strong>companyName</strong></font>.onshape.com</li> -</ul> -</blockquote> -<h2 id="endpoints">Endpoints</h2> -<ul> -<li><a href="https://cad.onshape.com/glassworks/explorer/#/Assembly/createInstance">Assembly/createInstance</a>: Insert an instance of a part, sketch, assembly, or Part Studio into an assembly: -<pre tabindex="0"><code>curl -X &#39;POST&#39; \ -&#39;https://cad.onshape.com/api/v8/assemblies/d/{targetDid}/w/{targetWid}/e/{targetEid}/instances&#39; \ --H &#39;Accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39;\ --H &#39;Content-Type: application/json;charset=UTF-8; qs=0.09&#39; --d &#39;{ -&#34;configuration&#34;: &#34;string&#34;, -&#34;documentId&#34;: &#34;{sourceDid}&#34;, -&#34;elementId&#34;: &#34;{sourceEid}&#34;, -&#34;featureId&#34;: &#34;string&#34;, -&#34;includePartTypes&#34;: [ -&#34;PARTS&#34; -], -&#34;isAssembly&#34;: true, -&#34;isHidden&#34;: true, -&#34;isSuppressed&#34;: true, -&#34;isWholePartStudio&#34;: true, -&#34;microversionId&#34;: &#34;string&#34;, -&#34;partId&#34;: &#34;string&#34;, -&#34;partNumber&#34;: &#34;string&#34;, -&#34;revision&#34;: &#34;string&#34;, -&#34;versionId&#34;: &#34;{sourceEid}&#34; -}&#39; -</code></pre></li> -</ul> -<h2 id="sample-workflows">Sample Workflows</h2> -<h3 id="insert-a-part-into-an-assembly">Insert a part into an assembly</h3> -<ol> -<li>Open the Part Studio that contains the part you want to insert into an assembly. Make a note of the following in the URL: -<ul> -<li><code>documentId</code> - we&rsquo;ll refer to this as our <code>sourceDid</code> for this example</li> -<li><code>elementId</code> of the Part Studio that contains the part - this is our <code>sourceEid</code></li> -<li><code>versionId</code> - this is our <code>sourceVId</code>, if one exists</li> -</ul> -</li> -<li>Call the <a href="https://cad.onshape.com/glassworks/explorer/#/Part/getPartsWMVE">Part/getPartsWMVE</a> endpoint to get the part&rsquo;s <code>partId</code>: -<pre tabindex="0"><code>curl -X &#39;GET&#39; \ -&#39;https://cad.onshape.com/api/v8/parts/d/{did}/w/{wid}/e/{eid}?withThumbnails=false&amp;includePropertyDefaults=false&#39; \ --H &#39;Accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39;\ --H &#39;Content-Type: application/json;charset=UTF-8; qs=0.09&#39; -</code></pre></li> -<li>Now open the assembly you want to insert the part into. Make a note of the following from the URL: -<ul> -<li><code>documentId</code> - we&rsquo;ll refer to this as our <code>targetDid</code></li> -<li><code>workspaceId</code> - this is our <code>targetWId</code></li> -<li><code>elementId</code> of the assembly - this is our <code>targetEid</code></li> -</ul> -</li> -<li>Call the <a href="https://cad.onshape.com/glassworks/explorer/#/Assembly/createInstance">Assembly/createInstance</a> endpoint on the assembly to insert an instance of the part into the assembly: -<pre tabindex="0"><code>curl -X &#39;POST&#39; \ -&#39;https://cad.onshape.com/api/v8/assemblies/d/{targetDid}/w/{targetWid}/e/{targetEid}/instances&#39; \ --H &#39;Accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39;\ --H &#39;Content-Type: application/json;charset=UTF-8; qs=0.09&#39; \ --d &#39;{ -&#34;documentId&#34;: &#34;{sourceDid}&#34;, -&#34;elementId&#34;: &#34;{sourceEid}&#34;, -&#34;includePartTypes&#34;: [ -&#34;PARTS&#34; -], -&#34;partId&#34;: &#34;{partId}&#34; -}&#39; -</code></pre><ul> -<li>Note: you can add <code>&quot;versionId&quot;: &quot;{sourceVid}&quot;</code> to the request body if needed.</li> -</ul> -</li> -<li>Refresh your assembly and confirm the part is included.</li> -</ol> -<h2 id="additional-resources">Additional Resources</h2> -<ul> -<li><a href="https://cad.onshape.com/glassworks/explorer/#/Assembly">API Explorer: Assemblies</a></li> -<li><a href="https://onshape-public.github.io/docs/api-intro/explorer">API Guide: API Explorer</a></li> -<li><a href="https://cad.onshape.com/help/Content/assembly.htm">Onshape Help: Assemblies</a></li> -</ul>Docs: Associativityhttps://onshape-public.github.io/docs/api-adv/associativity/Mon, 18 May 2020 20:28:26 -0400https://onshape-public.github.io/docs/api-adv/associativity/ -<p>Onshape does not expose a persistent ID for any of these entities. When the model changes, the ID may change. Therefore, Onshape provides an API to enable mapping IDs from a previous microversion to the current microversion. Assuming a simple case of maintaining associativity for a face, an abstract workflow might be:</p> -<ol> -<li>Read the tessellated model data.</li> -<li>Select the face of interest.</li> -<li>Store the Face ID and Document Microversion ID for the face.</li> -<li>[ user changes model ]</li> -<li>Call the REST API to translate from the known Face ID to an ID in the new model.</li> -<li>Re-apply application-specific data to the face(s) in the new model. Note that a face may become zero, one or multiple faces in the new model, depending on what changes the user made.</li> -</ol> -<h2 id="associativity-example">Associativity Example</h2> -<ol> -<li>Create a cube in Onshape:</br> -<img src="https://onshape-public.github.io/images/associativityimage03.png" alt="image alt text"></li> -<li>Get the document microversion ID from the URL: <code>https://cad.onshape.com/api/d/&lt;docid&gt;/w/&lt;wid&gt;/microversionId</code>.</li> -<li>Use the appropriate REST API to get the tessellated faces (<code>getPartStudioFaces</code>) -and edges (<code>getPartStudioEdges</code>}. Note the ids: -<ul> -<li>Part ID: <code>JHD</code></li> -<li>Front face ID: <code>JHO</code></li> -<li>Top edge of the front face ID: <code>JHd</code></li> -<li>Right edge of the top face ID: <code>JHt</code></li> -</ul> -</li> -<li>Split cube with the Front plane and translate the IDs:</li> -</ol> -<p><img src="https://onshape-public.github.io/images/associativityimage00.png" alt="image alt text"></p> -<p><strong>POST</strong></p> -<pre tabindex="0"><code>https://cad.onshape.com/api/partstudios/d/&lt;docid&gt;/w/&lt;wid&gt;/e/&lt;eid&gt;/idtranslations -</code></pre><p><strong>Body</strong>:</p> -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-json" data-lang="json"><span style="display:flex;"><span>{ -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;sourceDocumentMicroversion&#34;</span> : <span style="color:#a50">&#34;47e75ab2ee8b4356a76ebd47&#34;</span>, -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;ids&#34;</span> : [<span style="color:#a50">&#34;JHD&#34;</span>, <span style="color:#a50">&#34;JHO&#34;</span>, <span style="color:#a50">&#34;JHd&#34;</span>, <span style="color:#a50">&#34;JHt&#34;</span> ] -</span></span><span style="display:flex;"><span>} -</span></span></code></pre></div><p><strong>Response</strong>:</p> -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-json" data-lang="json"><span style="display:flex;"><span>{ -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;documentId&#34;</span>: <span style="color:#a50">&#34;748d6e850c9248328189922b&#34;</span>, -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;elementId&#34;</span>: <span style="color:#a50">&#34;042a6fa54e79451e8076463d&#34;</span>, -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;sourceDocumentMicroversion&#34;</span>: <span style="color:#a50">&#34;47e75ab2ee8b4356a76ebd47&#34;</span>, -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;ids&#34;</span>: [ -</span></span><span style="display:flex;"><span> { <span style="color:#1e90ff;font-weight:bold">&#34;source&#34;</span>: <span style="color:#a50">&#34;JHD&#34;</span>, <span style="color:#1e90ff;font-weight:bold">&#34;status&#34;</span>: <span style="color:#a50">&#34;SPLIT&#34;</span>, <span style="color:#1e90ff;font-weight:bold">&#34;target&#34;</span>: [<span style="color:#a50">&#34;JID&#34;</span>, <span style="color:#a50">&#34;JIH&#34;</span>] }, -</span></span><span style="display:flex;"><span> { <span style="color:#1e90ff;font-weight:bold">&#34;source&#34;</span>: <span style="color:#a50">&#34;JHO&#34;</span>, <span style="color:#1e90ff;font-weight:bold">&#34;status&#34;</span>: <span style="color:#a50">&#34;OK&#34;</span>, <span style="color:#1e90ff;font-weight:bold">&#34;target&#34;</span>: [<span style="color:#a50">&#34;JHO&#34;</span>] }, -</span></span><span style="display:flex;"><span> { <span style="color:#1e90ff;font-weight:bold">&#34;source&#34;</span>: <span style="color:#a50">&#34;JHd&#34;</span>, <span style="color:#1e90ff;font-weight:bold">&#34;status&#34;</span>: <span style="color:#a50">&#34;OK&#34;</span>, <span style="color:#1e90ff;font-weight:bold">&#34;target&#34;</span>: [<span style="color:#a50">&#34;JHd&#34;</span>] }, -</span></span><span style="display:flex;"><span> { <span style="color:#1e90ff;font-weight:bold">&#34;source&#34;</span>: <span style="color:#a50">&#34;JHt&#34;</span>, <span style="color:#1e90ff;font-weight:bold">&#34;status&#34;</span>: <span style="color:#a50">&#34;SPLIT&#34;</span>, <span style="color:#1e90ff;font-weight:bold">&#34;target&#34;</span>: [<span style="color:#a50">&#34;JI5&#34;</span>, <span style="color:#a50">&#34;JI9&#34;</span>] } -</span></span><span style="display:flex;"><span> ], -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;targetDocumentMicroversion&#34;</span>: <span style="color:#a50">&#34;78bc7f3fcf82475085c2f3ab&#34;</span> -</span></span><span style="display:flex;"><span>} -</span></span></code></pre></div><ol start="4"> -<li>Delete one of the parts, and translate the IDs:</li> -</ol> -<p><img src="https://onshape-public.github.io/images/associativityimage01.png" alt="image alt text"></p> -<p><strong>POST</strong></p> -<pre tabindex="0"><code>https://cad.onshape.com/api/partstudios/d/&lt;docid&gt;/w/&lt;wid&gt;/e/&lt;eid&gt;/idtranslations -</code></pre><p><strong>Body</strong>:</p> -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-json" data-lang="json"><span style="display:flex;"><span>{ -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;sourceDocumentMicroversion&#34;</span> : <span style="color:#a50">&#34;47e75ab2ee8b4356a76ebd47&#34;</span>, -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;ids&#34;</span> : [<span style="color:#a50">&#34;JHD&#34;</span>, <span style="color:#a50">&#34;JHO&#34;</span>, <span style="color:#a50">&#34;JHd&#34;</span>, <span style="color:#a50">&#34;JHt&#34;</span>] -</span></span><span style="display:flex;"><span>} -</span></span></code></pre></div><p><strong>Response</strong>:</p> -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-json" data-lang="json"><span style="display:flex;"><span>{ -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;documentId&#34;</span>: <span style="color:#a50">&#34;748d6e850c9248328189922b&#34;</span>, -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;elementId&#34;</span>: <span style="color:#a50">&#34;042a6fa54e79451e8076463d&#34;</span>, -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;sourceDocumentMicroversion&#34;</span>: <span style="color:#a50">&#34;47e75ab2ee8b4356a76ebd47&#34;</span>, -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;ids&#34;</span>: [ -</span></span><span style="display:flex;"><span> { <span style="color:#1e90ff;font-weight:bold">&#34;source&#34;</span>: <span style="color:#a50">&#34;JHD&#34;</span>, <span style="color:#1e90ff;font-weight:bold">&#34;status&#34;</span>: <span style="color:#a50">&#34;OK&#34;</span>, <span style="color:#1e90ff;font-weight:bold">&#34;target&#34;</span>: [<span style="color:#a50">&#34;JID&#34;</span>] }, -</span></span><span style="display:flex;"><span> { <span style="color:#1e90ff;font-weight:bold">&#34;source&#34;</span>: <span style="color:#a50">&#34;JHO&#34;</span>, <span style="color:#1e90ff;font-weight:bold">&#34;status&#34;</span>: <span style="color:#a50">&#34;FAILED_TO_RESOLVE&#34;</span>, <span style="color:#1e90ff;font-weight:bold">&#34;target&#34;</span>: [] }, -</span></span><span style="display:flex;"><span> { <span style="color:#1e90ff;font-weight:bold">&#34;source&#34;</span>: <span style="color:#a50">&#34;JHd&#34;</span>, <span style="color:#1e90ff;font-weight:bold">&#34;status&#34;</span>: <span style="color:#a50">&#34;FAILED_TO_RESOLVE&#34;</span>, <span style="color:#1e90ff;font-weight:bold">&#34;target&#34;</span>: [] }, -</span></span><span style="display:flex;"><span> { <span style="color:#1e90ff;font-weight:bold">&#34;source&#34;</span>: <span style="color:#a50">&#34;JHt&#34;</span>, <span style="color:#1e90ff;font-weight:bold">&#34;status&#34;</span>: <span style="color:#a50">&#34;OK&#34;</span>, <span style="color:#1e90ff;font-weight:bold">&#34;target&#34;</span>: [<span style="color:#a50">&#34;JI5&#34;</span>] } -</span></span><span style="display:flex;"><span> ], -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;targetDocumentMicroversion&#34;</span>: <span style="color:#a50">&#34;52aa74d34b624f3aaef33204&#34;</span> -</span></span><span style="display:flex;"><span>} -</span></span></code></pre></div><ol start="5"> -<li>Roll back the delete and the split, and translate the IDs:</li> -</ol> -<p><img src="https://onshape-public.github.io/images/associativityimage02.png" alt="image alt text"></p> -<p><strong>POST</strong></p> -<pre tabindex="0"><code>https://cad.onshape.com/api/partstudios/d/&lt;docid&gt;/w/&lt;wid&gt;/e/&lt;eid&gt;/idtranslations -</code></pre><p><strong>Body</strong>:</p> -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-json" data-lang="json"><span style="display:flex;"><span>{ -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;sourceDocumentMicroversion&#34;</span> : <span style="color:#a50">&#34;47e75ab2ee8b4356a76ebd47&#34;</span>, -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;ids&#34;</span> : [<span style="color:#a50">&#34;JHD&#34;</span>, <span style="color:#a50">&#34;JHO&#34;</span>, <span style="color:#a50">&#34;JHd&#34;</span>, <span style="color:#a50">&#34;JHt&#34;</span>] -</span></span><span style="display:flex;"><span>} -</span></span></code></pre></div><p><strong>Response</strong>:</p> -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-json" data-lang="json"><span style="display:flex;"><span>{ -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;documentId&#34;</span>: <span style="color:#a50">&#34;748d6e850c9248328189922b&#34;</span>, -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;elementId&#34;</span>: <span style="color:#a50">&#34;042a6fa54e79451e8076463d&#34;</span>, -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;sourceDocumentMicroversion&#34;</span>: <span style="color:#a50">&#34;47e75ab2ee8b4356a76ebd47&#34;</span>, -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;ids&#34;</span>: [ -</span></span><span style="display:flex;"><span> { <span style="color:#1e90ff;font-weight:bold">&#34;source&#34;</span>: <span style="color:#a50">&#34;JHD&#34;</span>, <span style="color:#1e90ff;font-weight:bold">&#34;status&#34;</span>: <span style="color:#a50">&#34;OK&#34;</span>, <span style="color:#1e90ff;font-weight:bold">&#34;target&#34;</span>: [<span style="color:#a50">&#34;JID&#34;</span>] }, -</span></span><span style="display:flex;"><span> { <span style="color:#1e90ff;font-weight:bold">&#34;source&#34;</span>: <span style="color:#a50">&#34;JHO&#34;</span>, <span style="color:#1e90ff;font-weight:bold">&#34;status&#34;</span>: <span style="color:#a50">&#34;OK&#34;</span>, <span style="color:#1e90ff;font-weight:bold">&#34;target&#34;</span>: [<span style="color:#a50">&#34;JHO&#34;</span>] }, -</span></span><span style="display:flex;"><span> { <span style="color:#1e90ff;font-weight:bold">&#34;source&#34;</span>: <span style="color:#a50">&#34;JHd&#34;</span>, <span style="color:#1e90ff;font-weight:bold">&#34;status&#34;</span>: <span style="color:#a50">&#34;OK&#34;</span>, <span style="color:#1e90ff;font-weight:bold">&#34;target&#34;</span>: [<span style="color:#a50">&#34;JHd&#34;</span>] }, -</span></span><span style="display:flex;"><span> { <span style="color:#1e90ff;font-weight:bold">&#34;source&#34;</span>: <span style="color:#a50">&#34;JHt&#34;</span>, <span style="color:#1e90ff;font-weight:bold">&#34;status&#34;</span>: <span style="color:#a50">&#34;OK&#34;</span>, <span style="color:#1e90ff;font-weight:bold">&#34;target&#34;</span>: [<span style="color:#a50">&#34;JHt&#34;</span>] } -</span></span><span style="display:flex;"><span> ], -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;targetDocumentMicroversion&#34;</span>: <span style="color:#a50">&#34;52aa74d34b624f3aaef33204&#34;</span> -</span></span><span style="display:flex;"><span>} -</span></span></code></pre></div>Docs: Billinghttps://onshape-public.github.io/docs/api-adv/billing/Mon, 18 May 2020 20:29:36 -0400https://onshape-public.github.io/docs/api-adv/billing/ -<p>This document describes APIs that will allow partners to interact with the Onshape billing system.</p> -<p>Please address questions to &ldquo;<a href="mailto:api-support@onshape.com">api-support@onshape.com</a>&rdquo; for the fastest response.</p> -<h2 id="overview">Overview</h2> -<p>All billing is done through &ldquo;plans&rdquo; that are created in the Developer Portal. A “plan” has the following attributes:</p> -<table> -<tr> -<td>Name (also called SKU)</td> -<td>A unique (within your company) plan name</td> -</tr> -<tr> -<td>Description</td> -<td>A user-visible description of the plan</td> -</tr> -<tr> -<td>Amount</td> -<td>The cost of the plan (may be one-time or recurring, depending on the type)</td> -</tr> -<tr> -<td>Type</td> -<td>Monthly, One-time or Consumable</td> -</tr> -</table> -<p>Onshape defines three kinds of plans:</p> -<table> -<tr> -<td>Plan type</td> -<td>Description</td> -</tr> -<tr> -<td>Recurring -(Monthly Subscription)</td> -<td>A plan that is renewed monthly at a fixed cost. All Apps in the app store must have a Free monthly plan (which is created by default), and may have additional paid plans.</td> -</tr> -<tr> -<td>One-time</td> -<td>A plan that is purchased once (not renewed monthly). A user may purchase these multiple times.</td> -</tr> -<tr> -<td>Consumable</td> -<td>A plan that represents a consumable unit, such as "hours of rendering" or “simulation runs”. Consumable plans are not fully implemented at this time, but the consumable functionality can be implemented using One-time Purchase plans as described below.</td> -</tr> -</table> -<p>Users may purchase plans through the App Store interface. In addition, if your application has the OAuth Purchase Scope, your application can initiate &ldquo;in-app&rdquo; purchases by calling Onshape to request a purchase.</p> -<p>The basic steps for interacting with Onshape Billing:</p> -<ol> -<li>Define one or more plans using the Developer Portal interface</li> -<li>Use the Onshape API to determine the current user’s plan</li> -<li>Provide features and/or limits based on the current plan</li> -</ol> -<h2 id="using-the-onshape-billing-api">Using the Onshape Billing API</h2> -<p><code>GET /api/accounts/purchases</code></p> -<p>Returns a list of purchase made by the current user for plans owned by the current application. Use this information to determine what capabilities or features the user is entitled to use.</p> -<p><code>DELETE /api/accounts/purchases/&lt;purchase id&gt;</code></p> -<p>Cancel a recurring purchase.</p> -<p><code>POST /api/accounts/purchases/&lt;purchase id&gt;/consume</code></p> -<p>Indicate the use of a consumable. (Not fully implemented at this time)</p> -<p><code>GET /api/billing/plans/client/&lt;client id&gt;</code></p> -<p>Get a list of the billing plans defined for this client.</p> -<h2 id="initiating-a-purchase-from-an-application-in-app-purchases">Initiating a purchase from an application (in-app purchases)</h2> -<p>To initiate a purchase of a subscription or one time item you must set the browser’s location to particular URL within the Onshape stack:</p> -<p><code>https://cad.onshape.com/billing/purchase?redirectUri=RRRR&amp;clientId=CCCC&amp;sku=SSSS&amp;userId=UUUU</code></p> -<p>Each of the query parameters should be URL encoded. The clientId is your application’s OAuth Client ID, the sku is the name/sku field for an item (you can find this in the developer portal or it’s retrievable through the /api/billing/plans REST endpoints). The user Id should be the Onshape user Id for the current user and is available through the /api/users/session REST endpoint. The redirectUri is the URI the user will be returned to within your website when the purchase is finished.</p> -<p>When the browser’s location is changed to this pattern the Onshape stack will serve content to confirm the users identity, confirm the details of what is being purchased (or obtained if the item is free) and then after the user agrees to the purchase will confirm the transaction (with our payment processor if the item is not free) and then redirect the user back to the supplied redirectUri (the browser location will be changed to the redirectUri). Additionally Onshape will add a <code>success=true</code> or <code>success=false</code> query parameter to the redirectURI indicating whether the user completed successfully (payment was taken if required etc.) or failed, either due to cancelling the purchase or an issue with payment.</p> -<p>When the browser fetches the redirectUri your application must call back through the <code>/api/account/purchases</code> API to get confirmation of the purchase - do NOT assume that a fetch of the redirectUri with a <code>success=true</code> query parameter actually indicates a purchase has occurred. Query the Onshape stack with the <code>/api/account/purchases</code> API to ensure that the required item has actually been bought.</p> -<h2 id="consumable-items">Consumable Items</h2> -<p>A detailed description of the interface for managing consumable purchases will be provided shortly. You can use one-time plans to achieve similar results:</p> -<ol> -<li> -<p>Define a one-time purchase plan with a description indicating the nature of the purchase, for example:</p> -<p>RENDER-10 Ten rendering hours $100</p> -</li> -<li> -<p>Keep track of the number of hours that the user has consumed. You can store and retrieve this information in Onshape using the following APIs. These APIs allow you to store and retrieve arbitrary information on a per-user basis.</p> -<p>POST /applications/clients/:cid/settings/users/:uid -GET /applications/clients/:cid/settings/users/:uid</p> -</li> -<li> -<p>Check the number of available &ldquo;units&rdquo; by getting the purchases and the record of consumables. Be sure to include UI in your application that the user can use to see their remaining quantity.</p> -</li> -<li> -<p>Alternately, you can store the consumption data in your own system; you do not need to use the Onshape API to manage that data.</p> -</li> -</ol> -<p>Onshape intends to provide a richer set of APIs that help track the purchase and consumption of consumables in the near future.</p> -<h2 id="other-billing-models">Other billing models</h2> -<p>You can use these mechanisms to implement other models. For example, a time-limited trial could be implemented by scanning purchases for the first &ldquo;purchase&rdquo; and denying service if it is more than a defined number of days in the past. A “fixed number of uses per month” could be implemented as a monthly subscription, string usage data with the settings API, and denying service after a fixed number of uses.</p> -<h2 id="samples">Samples</h2> -<p>Onshape will provide sample code for both desktop and integrated applications demonstrating the use of the billing APIs and workflow. If you are subscribed to the Onshape Github Partner group, you will have access to those samples as soon as they are posted.</p> -<h2 id="testing">Testing</h2> -<p>Please contact <a href="mailto:api-support@onshape.com">api-support@onshape.com</a> to discuss details of testing billing &amp; subscriptions.</p>Docs: Configurationshttps://onshape-public.github.io/docs/api-adv/configs/Fri, 05 Apr 2024 00:00:00 +0000https://onshape-public.github.io/docs/api-adv/configs/ -<p>This page describes the APIs Onshape provides for working with <a href="https://cad.onshape.com/help/Content/configurations.htm">Configurations</a>.</p> -<p>You can use Configurations to create variations of entire Part Studios, Assemblies, specific parts and more. You can configure feature and parameter values, part properties, custom part properties, face and part appearances, and sketch text. Each Part Studio can have only one Configuration, but it can contain multiple Configuration inputs. The Configuration inputs you define for a Part Studio become options when inserting that Part Studio into an Assembly or Drawing. You can also create your own Configurations for an Assembly, regardless of any existing Part Studio Configurations. Assembly Configurations work the same way as Part Studio Configurations, but are limited to configuring Mates (<em>not</em> Mate connectors), instances, and patterns.</p> -<blockquote> -<p>📘 <strong>Notes</strong></p> -<ul> -<li>This page provides sample code as curls. See the <a href="https://curl.se/docs/">curl documentation</a> for more information.</li> -<li>All Onshape API calls must be properly authenticated by replacing the <code>CREDENTIALS</code> variable in the curls below. See the <a href="https://onshape-public.github.io/docs/auth/apikeys">API Keys</a> page for instructions and the <a href="https://onshape-public.github.io/docs/api-intro/quickstart">Quick Start</a> for an example. All applications submitted to the Onshape App Store <em>must</em> authenticate with <a href="https://onshape-public.github.io/docs/auth/oauth">OAuth2</a>.</li> -<li>This documentation refers to Onshape IDs in the following format: <code>{did}, {wid}, {eid}, {pid}, {otherId}</code>. These represent document, workspace, element, part, and other IDs (respectively) that are needed make the API calls. We sometimes abbreviate these variables as <code>DWVEM</code> Please see <a href="https://onshape-public.github.io/docs/api-intro/#onshape-api-request">API Guide: API Intro</a> for information on what these IDs mean and how to obtain them from your documents. Never include the curly braces (<code>{}</code>) in your API calls.</li> -<li>For Enterprise accounts, replace <strong><font color="slate">cad</font></strong> in all Onshape URLs with your company domain. -https://<font color="slate"><strong>cad</strong></font>.onshape.com &gt; https://<font color="slate"><strong>companyName</strong></font>.onshape.com</li> -</ul> -</blockquote> -<h2 id="endpoints">Endpoints</h2> -<ul> -<li><a href="https://cad.onshape.com/glassworks/explorer/#/Element/getConfiguration">Element/getConfiguration</a>: Get the configuration data for a Part Studio or Assembly. -<pre tabindex="0"><code>curl -X &#39;GET&#39; \ -&#39;https://cad.onshape.com/api/v6/elements/d/{did}/wvm/{wvmid}/e/{eid}/configuration&#39; \ --H &#39;Accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39;\ --H &#39;Content-Type: application/json;charset=UTF-8; qs=0.09&#39; -</code></pre></li> -<li><a href="https://cad.onshape.com/glassworks/explorer/#/Element/updateConfiguration">Element/updateConfiguration</a>: Update the configuration data for a Part Studio or Assembly. -<pre tabindex="0"><code>curl -X &#39;POST&#39; \ -&#39;https://cad.onshape.com/api/v6/elements/d/{did}/wvm/{wvmid}/e/{eid}/configuration&#39; \ --H &#39;Accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39;\ --H &#39;Content-Type: application/json;charset=UTF-8; qs=0.09&#39; \ --d &#39;{ }&#39; -</code></pre></li> -<li><a href="https://cad.onshape.com/glassworks/explorer/#/Element/decodeConfiguration">Element/decodeConfiguration</a>: Process an encoded configuration file. -<pre tabindex="0"><code>curl -X &#39;GET&#39; \ -&#39;https://cad.onshape.com/api/v6/elements/d/{did}/wvm/{wvmid}/e/{eid}/configurationencodings/{encodingId}&#39; \ --H &#39;Accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; -</code></pre></li> -<li><a href="https://cad.onshape.com/glassworks/explorer/#/Element/encodeConfigurationMap">Element/encodeConfigurationMap</a>: Create an encoded map of configurations. -<pre tabindex="0"><code>curl -X &#39;POST&#39; \ -&#39;https://cad.onshape.com/api/v6/elements/d/{did}/e/{eid}/configurationencodings&#39; \ --H &#39;Accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39;\ --H &#39;Content-Type: application/json;charset=UTF-8; qs=0.09&#39; \ --d &#39;{ -&#34;parameters&#34;: [ -{ -&#34;parameterId&#34;: &#34;{parameterId}&#34;, -&#34;parameterValue&#34;: &#34;{configValue}&#34; -} -] -}&#39; -</code></pre></li> -</ul> -<h3 id="encoded-configuration-strings">Encoded Configuration Strings</h3> -<p>The <a href="https://cad.onshape.com/glassworks/explorer/#/Element/encodeConfigurationMap">Element/encodeConfigurationMap</a> and <a href="https://cad.onshape.com/glassworks/explorer/#/Element/decodeConfiguration">Element/decodeConfiguration</a> APIs convert parameters from JSON to a URL-encoded string in the following format: <code>&quot;configuration=parameterId%3DparameterValue&quot;</code></p> -<p>For example,</p> -<pre tabindex="0"><code>{ -&#34;parameters&#34;: [ -{ -&#34;parameterId&#34;: &#34;List_izOjbm5HCRXEld&#34;, -&#34;parameterValue&#34;: &#34;_500_mm&#34; -} -] -} -</code></pre><p>encodes to:</p> -<pre tabindex="0"><code>&#34;configuration=List_izOjbm5HCRXEld%3D_500_mm&#34; -</code></pre><p>and:</p> -<pre tabindex="0"><code>&#34;configuration=List_izOjbm5HCRXEld%3DDefault&#34; -</code></pre><p>decodes to:</p> -<pre tabindex="0"><code>{ -&#34;parameters&#34;: [ -{ -&#34;parameterId&#34;: &#34;List_izOjbm5HCRXEld&#34;, -&#34;parameterValue&#34;: &#34;Default&#34; -} -] -} -</code></pre><h2 id="sample-workflows">Sample Workflows</h2> -<p>These sample workflows all build off one another. Completing all of the workflows will take you step-by-step through the process of getting Configuration information, encoding the information for use, and using the encoded configuration to create a configured export. You can also watch the <a href="#workflow-video">video</a> to see the entire workflow in the Glassworks API Explorer.</p> -<h3 id="get-a-configuration">Get a Configuration</h3> -<p>In this example, we&rsquo;ll use the <a href="https://cad.onshape.com/glassworks/explorer/#/Element/getConfiguration">Element/getConfiguration</a> endpoint to get the Configuration information from a Part Studio.</p> -<ol> -<li>Make a copy of <a href="https://cad.onshape.com/documents/e60c4803eaf2ac8be492c18e/w/d2558da712764516cc9fec62/e/958bceb5a2511b572dbbe851">this public document</a>. Make a note of the new document&rsquo;s document ID, workspace ID, and element ID.</li> -<li>Click the Configurations dropdown in the Features list, and observe that there are two options for the drillbit length, <code>250 mm</code> and <code>500 mm</code>. -</br></br><img src="https://onshape-public.github.io/images/configs-example-ui.png" alt=" " width=550></li> -<li>Set up a call to the <a href="https://cad.onshape.com/glassworks/explorer/#/Element/getConfiguration">Element/getConfiguration</a> endpoint to get the Configuration for the Part Studio. Don&rsquo;t forget to replace the URL parameters with the IDs from your copy of the document, and replace <code>CREDENTIALS</code> with your authorization credentials. -<pre tabindex="0"><code>curl -X &#39;GET&#39; \ -&#39;https://cad.onshape.com/api/v6/elements/d/{did}/w/{wid}/e/{eid}/configuration&#39; \ --H &#39;Accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; \ -</code></pre></li> -<li>Review the Configuration information detailed in the response. You can see that the Part Studio contains one configuration (<code>Drill_Bit_Length</code>) with two options (<code>250 mm</code> and <code>500 mm</code>): -<pre tabindex="0"><code>{ -&#34;btType&#34;: &#34;BTConfigurationResponse-2019&#34;, -&#34;currentConfiguration&#34;: [ -{ -&#34;btType&#34;: &#34;BTMParameterEnum-145&#34;, -&#34;namespace&#34;: &#34;&#34;, -&#34;nodeId&#34;: &#34;{nodeId1}&#34;, -&#34;value&#34;: &#34;Default&#34;, -&#34;enumName&#34;: &#34;{paramId_conf}&#34;, -&#34;parameterId&#34;: &#34;{paramId}&#34; -} -], -&#34;configurationParameters&#34;: [ -{ -&#34;btType&#34;: &#34;BTMConfigurationParameterEnum-105&#34;, -&#34;defaultValue&#34;: &#34;Default&#34;, -&#34;enumName&#34;: &#34;{enumName}&#34;, -&#34;namespace&#34;: &#34;&#34;, -&#34;options&#34;: [ -{ -&#34;btType&#34;: &#34;BTMEnumOption-592&#34;, -&#34;optionName&#34;: &#34;250 mm&#34;, -&#34;option&#34;: &#34;Default&#34;, -&#34;nodeId&#34;: &#34;{nodeId2}&#34; -}, -{ -&#34;btType&#34;: &#34;BTMEnumOption-592&#34;, -&#34;optionName&#34;: &#34;500 mm&#34;, -&#34;option&#34;: &#34;_500_mm&#34;, -&#34;nodeId&#34;: &#34;{nodeId3}&#34; -} -], -&#34;isCosmetic&#34;: false, -&#34;parameterId&#34;: &#34;{paramId}&#34;, -&#34;parameterName&#34;: &#34;Drill_Bit_Length&#34;, -&#34;nodeId&#34;: &#34;{nodeId4}&#34; -} -], -&#34;serializationVersion&#34;: &#34;1.2.0&#34;, -&#34;sourceMicroversion&#34;: &#34;{mid}&#34;, -&#34;microversionSkew&#34;: false, -&#34;rejectMicroversionSkew&#34;: false, -&#34;libraryVersion&#34;: 2296 -} -</code></pre></li> -</ol> -<h3 id="encode-a-configuration-string">Encode a configuration string</h3> -<p>In this example, we&rsquo;ll encode a Configuration so it can be used as part of a translation (i.e., an export). Please read the <a href="#encoded-configuration-strings">Encoded Configuration Strings</a> section before beginning this example.</p> -<ol> -<li>This example builds off the previous one. Please complete the <a href="#get-a-configuration">Get a Part Studio Configuration</a> workflow to obtain the raw Configuration output for the Part Studio.</li> -<li>Set up a call to the <a href="https://cad.onshape.com/glassworks/explorer/#/Element/encodeConfigurationMap">Element/encodeConfigurationMap</a> endpoint. Don&rsquo;t forget to replace the URL parameters with the IDs from your document, and replace <code>CREDENTIALS</code> with your authorization credentials. -<pre tabindex="0"><code>curl -X &#39;POST&#39; \ -&#39;https://cad.onshape.com/api/v6/elements/d/{did}/e/{eid}/configurationencodings&#39; \ --H &#39;Accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; \ --H &#39;Content-Type: application/json;charset=UTF-8; qs=0.09&#39; \ --d &#39;{ }&#39; -</code></pre></li> -<li>Now we need to create our JSON body for the request. Note the structure of the body: -<pre tabindex="0"><code>{ -&#34;parameters&#34;: [ -{ -&#34;parameterId&#34;: &#34;string&#34;, -&#34;parameterValue&#34;: &#34;string&#34; -} -], -&#34;standardContentParametersId&#34;: &#34;string&#34; -} -</code></pre>Fill out the request body with our information: -<ul> -<li>We&rsquo;re not using a standard content part, so we can delete the second key/value pair.</li> -<li>The parameterId can be found in the response from the previous example. It usually begins with (<code>List_</code>)</li> -<li>For the parameter value, we&rsquo;ll enter one of our configuration options from the previous example. In this case, we&rsquo;ll use <code>_500_mm</code> to export a 500 mm drillbit part.</li> -</ul> -<pre tabindex="0"><code>{ -&#34;parameters&#34;: [ -{ -&#34;parameterId&#34;: &#34;{parameterId}&#34;, -&#34;parameterValue&#34;: &#34;_500_mm&#34; -} -] -} -</code></pre></li> -<li>Now we can make our call: -<pre tabindex="0"><code>curl -X &#39;POST&#39; \ -&#39;https://cad.onshape.com/api/v6/elements/d/{did}/e/{eid}/configurationencodings&#39; \ --H &#39;Accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; \ --H &#39;Content-Type: application/json;charset=UTF-8; qs=0.09&#39; \ --d &#39;{ -&#34;parameters&#34;: [ -{ -&#34;parameterId&#34;: &#34;{parameterId}&#34;, -&#34;parameterValue&#34;: &#34;_500_mm&#34; -} -] -}&#39; -</code></pre></li> -<li>The call responds with two values: the ID of the encoding, and the encoded configuration string. We can use this configuration string (returned in the <code>queryParam</code> field) any time we want to specify the 500 mm drillbit length. -<pre tabindex="0"><code>{ -&#34;encodedId&#34;: &#34;{encodedId}&#34;, -&#34;queryParam&#34;: &#34;configuration={configString}&#34; -} -</code></pre></li> -</ol> -<h3 id="export-a-configured-part">Export a configured part</h3> -<p>In this example, we will export a configured part. We have a drillbit with two configurations: <code>250 mm</code> and <code>500 mm</code> lengths. To export a 500 mm drillbit, we can specify the configuration as part of the export.</p> -<ol> -<li>This example builds off the previous two. Please complete this exercise after the <a href="#encode-a-configuration">Encode a configuration</a> workflow.</li> -<li>Next, set up a call to the <a href="https://cad.onshape.com/glassworks/explorer/#/PartStudio/exportParasolid">PartStudio/exportParasolid</a> endpoint. Don&rsquo;t forget to replace the URL parameters with the IDs from your document, and replace <code>CREDENTIALS</code> with your authorization credentials. Note that this endpoint includes an optional <code>configuration</code> parameter. This is where we&rsquo;ll enter the configuration string we found in the previous example. -<pre tabindex="0"><code>curl -X &#39;GET&#39; \ -&#39;https://cad.onshape.com/api/v6/partstudios/d/{did}/w/{wid}/e/{eid}/parasolid?version=0&amp;includeExportIds=false&amp;configuration={configString}&amp;binaryExport=false&#39; \ --H &#39;Accept: */*&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; \ -</code></pre></li> -<li>This endpoint returns a redirect URL. Navigate to the returned URL in your browser to download the export. -<ul> -<li>Hint: The URL will look something like this, but with different IDs:</li> -</ul> -<pre tabindex="0"><code>https://cad.onshape.com/api/v6/partstudios/d/e60c4803eaf2ac8be492c18e/w/d2558da712764516cc9fec62/e/958bceb5a2511b572dbbe851/parasolid?version=0&amp;includeExportIds=false&amp;configuration=List_izOjbm5HCRXEld%253D_500_mm&amp;binaryExport=false -</code></pre></li> -<li>Now we need to import our Parasolid to confirm the correct configuration was used. Open your document in the Onshape UI, click the Insert new tab button, and then select Import. -</br><img src="https://onshape-public.github.io/images/configs-insert-menu.png" alt="Insert new tab menu with Import highlighted in Onshape UI" width=250></li> -<li>Navigate to the export you downloaded (with the <code>.x_t</code> extension) and import it into Onshape.</li> -<li>Use the measure tool to confirm the length of the imported drillbit is 500 mm. -</br><img src="https://onshape-public.github.io/images/configs-measure-tool.png" alt="Measure tool in Onshape UI showing drill length as 500 mm" width=400></li> -</ol> -<h2 id="workflow-video">Workflow Video</h2> -<p>This video demonstrates how to complete the above tutorials in the Onshape API Explorer. -</br></p> -<p> -<div class="wistia_responsive_padding" style="padding:77.08% 0 0 0;position:relative;"><div class="wistia_responsive_wrapper" style="height:100%;left:0;position:absolute;top:0;width:100%;"><iframe src="https://fast.wistia.net/embed/iframe/o4pvoyjwuk?seo=true&videoFoam=true" title="configs-export-example Video" allow="autoplay; fullscreen" allowtransparency="true" frameborder="0" scrolling="no" class="wistia_embed" name="wistia_embed" msallowfullscreen width="100%" height="100%"></iframe></div></div> -<script src="https://fast.wistia.net/assets/external/E-v1.js" async></script> -</p> -<h2 id="additional-resources">Additional Resources</h2> -<ul> -<li><a href="https://cad.onshape.com/glassworks/explorer/#/Element">API Explorer: Configurations</a></li> -<li><a href="https://onshape-public.github.io/docs/api-intro/explorer">API Guide: API Explorer</a></li> -<li><a href="https://cad.onshape.com/help/Content/configurations.htm">Onshape Help: Configurations</a></li> -</ul>Docs: Drawingshttps://onshape-public.github.io/docs/api-adv/drawings/Thu, 12 Oct 2023 00:00:00 +0000https://onshape-public.github.io/docs/api-adv/drawings/ -<p>This page describes the APIs Onshape provides for creating and manipulating Onshape drawings.</p> -<blockquote> -<p>📘 <strong>Notes</strong></p> -<ul> -<li>This page provides sample code as curls. See the <a href="https://curl.se/docs/">curl documentation</a> for more information.</li> -<li>All Onshape API calls must be properly authenticated by replacing the <code>CREDENTIALS</code> variable in the curls below. See the <a href="https://onshape-public.github.io/docs/auth/apikeys">API Keys</a> page for instructions and the <a href="https://onshape-public.github.io/docs/api-intro/quickstart">Quick Start</a> for an example. All applications submitted to the Onshape App Store <em>must</em> authenticate with <a href="https://onshape-public.github.io/docs/auth/oauth">OAuth2</a>.</li> -<li>This documentation refers to Onshape IDs in the following format: <code>{did}, {wid}, {eid}, {pid}, {otherId}</code>. These represent document, workspace, element, part, and other IDs (respectively) that are needed make the API calls. We sometimes abbreviate these variables as <code>DWVEM</code> Please see <a href="https://onshape-public.github.io/docs/api-intro/#onshape-api-request">API Guide: API Intro</a> for information on what these IDs mean and how to obtain them from your documents. Never include the curly braces (<code>{}</code>) in your API calls.</li> -<li>For Enterprise accounts, replace <strong><font color="slate">cad</font></strong> in all Onshape URLs with your company domain. -https://<font color="slate"><strong>cad</strong></font>.onshape.com &gt; https://<font color="slate"><strong>companyName</strong></font>.onshape.com</li> -</ul> -</blockquote> -<h2 id="endpoints">Endpoints</h2> -<p>To create drawings, Onshape allows you to send all drawing data points and information through the API as part of the request body JSON.</p> -<p>The following endpoints are available:</p> -<ul> -<li><a href="https://cad.onshape.com/glassworks/explorer/#/Drawing/createDrawingAppElement">Create a drawing</a> -<pre tabindex="0"><code>curl -X &#39;POST&#39; \ -&#39;https://cad.onshape.com/api/v6/drawings/d/{did}/w/{wid}/create&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; \ --H &#39;Accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Content-Type: application/json;charset=UTF-8; qs=0.09&#39; \ --d &#39;{ -&lt;JSON request body options from the BTDrawingParams schema&gt; -}&#39; -</code></pre>Specify the document in which to create the drawing in the URL, and pass any additional options as part of the request body. You can provide a name for the drawing, manipulate the drawing graphics area, specify a part or template to create the drawing from, and more. -<ul> -<li>See documentation for all available options in the <a href="https://cad.onshape.com/glassworks/explorer/#/Drawing/createDrawingAppElement">API Explorer</a>.</li> -<li>For instructions on viewing the documentation for the request body schemas, see our <a href="https://onshape-public.github.io/docs/api-intro/explorer#view-request-body-docs">API Explorer</a> page. -Check out the <a href="#sample-workflows">Sample Workflows</a> section below for some practical examples.<p></br> -<img src="https://onshape-public.github.io/images/BTDrawingParamsSchema.png" alt="BTDrawingParams schema in the createDrawingAppElement endpoint"></br></p></li> -</ul> -</li> -<li><a href="https://cad.onshape.com/glassworks/explorer/#/Drawing/modifyDrawing">Modify a drawing</a> -<pre tabindex="0"><code>curl -X &#39;POST \ -&#39;https://cad.onshape.doc/api/v6/drawings/d/{did}/w/{wid}/e/{eid}/modify&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; \ --H &#39;Accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Content-Type: application/json;charset=UTF-8; qs=0.09&#39; \ --d &#39;{ -&#34;description&#34;: &#34;Description of the modification.&#34;, -&#34;jsonRequests&#34;: [ -{ -&lt;JSON request body options from the jsonRequests schema&gt; -} -] -}&#39; -</code></pre>Specify the drawing to modify in the URL, and pass the information on the modification in the request body. Note that the <code>jsonRequests</code> schema is not defined in the Glassworks API Explorer; see the <a href="https://github.com/onshape-public/onshapedrawingjson">OnshapeDrawingJson</a> repository for this information, and check out the <a href="#sample-workflows">Sample Workflows</a> section below for some practical examples.</li> -<li><a href="https://cad.onshape.com/glassworks/explorer/#/Drawing/getModificationStatus">Get the drawing modification status</a> -<pre tabindex="0"><code>curl -X &#39;GET&#39; \ -&#39;https://cad.onshape.com/api/v6/drawings/modify/status/{mrid} --H &#39;Authorization: Basic CREDENTIALS&#39; \ --H &#39;Accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Content-Type: application/json;charset=UTF-8; qs=0.09&#39; \ -</code></pre>Provide the modification ID (from the <code>modifyDrawing</code> response body) to get the status of the modification.</li> -<li><a href="https://cad.onshape.com/glassworks/explorer/#/Drawing/createDrawingTranslation">Translate a drawing</a>: See the <a href="https://onshape-public.github.io/docs/api-adv/translation#export-a-drawing-as-a-json">Translations API Guide</a>.</li> -<li><a href="https://cad.onshape.com/glassworks/explorer/#/Drawing/getDrawingTranslatorFormats">Get drawing translation formats</a>: See the <a href="https://onshape-public.github.io/docs/api-adv/translation#export-a-drawing-as-a-json">Translations API Guide</a>.</li> -</ul> -<h3 id="viewing-drawing-errors">Viewing drawing errors</h3> -<p>You can <a href="https://onshape-public.github.io/docs/api-adv/translation.md#export-a-drawing-as-a-json">export your drawing to a JSON</a> to find errors with your drawing. Each <code>view</code> in the JSON includes an <code>errorState</code> for reporting drawing errors.</p> -<h2 id="sample-app">Sample App</h2> -<p>Please see the <a href="https://github.com/onshape-public/onshape-ts-drawing-client">Onshape TypeScript Drawing Client</a> for a working example of using the Onshape Drawing APIs in an application.</p> -<h2 id="sample-workflows">Sample Workflows</h2> -<h3 id="create-a-drawing-from-a-part">Create a drawing from a part</h3> -<p>In this example, we&rsquo;ll create a drawing from the <strong>FLYWHEEL</strong> part in <a href="https://cad.onshape.com/documents/e60c4803eaf2ac8be492c18e/v/405ba186c3a70e0227ab2941/e/6bed6b43463f6a46a37b4a22">this public document</a>.</p> -<ol> -<li>Create or open an Onshape document in which to create your drawing.</li> -<li>Start to form the <a href="https://cad.onshape.com/glassworks/explorer/#/Drawing/createDrawingAppElement">Drawings/createDrawingAppElement</a> call. Replace <code>{did}</code> and <code>{wid}</code> in the URL below with the document ID and workspace ID of your document (i.e., the <em>target</em> document), and replace <code>CREDENTIAL</code> with your authorization credentials. -<pre tabindex="0"><code>curl -X &#39;POST&#39; \ -&#39;https://cad.onshape.com/api/v6/drawings/d/{did}/w/{wid}/create&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; \ --H &#39;Accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Content-Type: application/json;charset=UTF-8; qs=0.09&#39; \ -</code></pre></li> -<li>Add the request body information: -<ul> -<li>Add <code>flywheelDrawing</code> as the <code>drawingName</code> field.</li> -<li>We must specify the <em>source</em> document&rsquo;s document and version IDs. Note that since our target document and source document are different, we use the <code>external</code> document and version ID fields.</li> -<li>We must also provide the ID of the part to create the drawing from, and the ID of the element (i.e., tab) in which the part lives. -</br> -(Hint: You can call <a href="https://cad.onshape.com/glassworks/explorer/#/Part/getPartsWMVE">Part/getPartsWMVE</a> to get a list of part IDs in an element.)</br> -<pre tabindex="0"><code>curl -X &#39;POST&#39; \ -&#39;https://cad.onshape.com/api/v6/drawings/d/{did}/w/{wid}/create&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; \ --H &#39;Accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Content-Type: application/json;charset=UTF-8; qs=0.09&#39; \ --d &#39;{ -&#34;drawingName&#34;: &#34;flywheelDrawing&#34;, -&#34;externalDocumentId&#34;: &#34;e60c4803eaf2ac8be492c18e&#34;, -&#34;externalDocumentVersionId&#34;: &#34;405ba186c3a70e0227ab2941&#34;, -&#34;elementId&#34;: &#34;6bed6b43463f6a46a37b4a22&#34;, -&#34;partId&#34;: &#34;JiD&#34; -}&#39; -</code></pre></li> -</ul> -</li> -<li>Call the endpoint and open your document. Confirm that you see the new <code>flywheelDrawing</code> element containing the drawing: -</br><img src="https://onshape-public.github.io/images/flywheelDrawingExample1.png" alt="new drawing created from a part in an external document" width=650></li> -</ol> -<h3 id="create-a-drawing-from-a-template">Create a drawing from a template</h3> -<p>In this example, we&rsquo;ll create a drawing from the standard ANSI template in <a href="https://cad.onshape.com/documents/cbe6e776694549b5ba1a3e88/w/24d08acf10234dbc8d3ab585/e/17eef7862b224f6fb12cbc46">this public document</a>.</p> -<ol> -<li>Open any Onshape document in which to create your drawing.</li> -<li>Start to form the <a href="https://cad.onshape.com/glassworks/explorer/#/Drawing/createDrawingAppElement">Drawings/createDrawingAppElement</a> call. Replace <code>{did}</code> and <code>{wid}</code> in the URL below with the document ID and workspace ID of your document (i.e., the <em>target</em> document), and replace <code>CREDENTIAL</code> with your authorization credentials. -<pre tabindex="0"><code>curl -X &#39;POST&#39; \ -&#39;https://cad.onshape.com/api/v6/drawings/d/{did}/w/{wid}/create&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; \ --H &#39;Accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Content-Type: application/json;charset=UTF-8; qs=0.09&#39; \ -</code></pre></li> -<li>Add the request body information: -<ul> -<li>Add <code>templateAnsiDrawing</code> as the <code>drawingName</code> field.</li> -<li>We must specify the <em>source</em> document&rsquo;s document ID and workspace ID.</li> -<li>We must also provide the ID of the element (i.e., tab) in which the template lives.</li> -<li>Note that we use the <code>template</code> document, workspace, and element ID fields when referring to a specific template for drawing creation. -</br> -<pre tabindex="0"><code>curl &#39;https://cad.onshape.com/api/drawings/d/{did}/w/{wid}/create&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; \ --H &#39;Accept: application/json, text/plain, */*&#39; \ --H &#39;Content-Type: application/json;charset=UTF-8&#39; \ --d &#39;{ -&#34;drawingName&#34;: &#34;templateAnsiDrawing&#34;, -&#34;templateDocumentId&#34;:&#34;cbe6e776694549b5ba1a3e88&#34;, -&#34;templateWorkspaceId&#34;:&#34;24d08acf10234dbc8d3ab585&#34;, -&#34;templateElementId&#34;:&#34;17eef7862b224f6fb12cbc46&#34; -}&#39; -</code></pre></li> -</ul> -</li> -<li>Call the endpoint and open your document. Confirm that you see the new <code>templateAnsiDrawing</code> element containing the empty drawing template.</li> -</ol> -<h3 id="create-a-drawing-in-a-custom-graphics-area">Create a drawing in a custom graphics area</h3> -<ol> -<li>Open any Onshape document in which to create your drawing.</li> -<li>Start to form the <a href="https://cad.onshape.com/glassworks/explorer/#/Drawing/createDrawingAppElement">Drawings/createDrawingAppElement</a> call. Replace <code>{did}</code> and <code>{wid}</code> in the URL below with your document, and replace <code>CREDENTIAL</code> with your authorization credentials. -<pre tabindex="0"><code>curl -X &#39;POST&#39; \ -&#39;https://cad.onshape.com/api/v6/drawings/d/{did}/w/{wid}/create&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; \ --H &#39;Accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Content-Type: application/json;charset=UTF-8; qs=0.09&#39; \ -</code></pre></li> -<li>Add information about the drawings area. In this example, we&rsquo;ll add an additional column and row to the drawings area, a title block, and add a border around it. -<pre tabindex="0"><code>curl -X &#39;POST&#39; \ -&#39;https://cad.onshape.com/api/v6/drawings/d/{did}/w/{wid}/create&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; \ --H &#39;accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Content-Type: application/json;charset=UTF-8; qs=0.09&#39; \ --d &#39;{ -&#34;drawingName&#34;: &#34;customGraphicsArea&#34;, -&#34;border&#34;: &#34;true&#34;, -&#34;numberHorizontalZones&#34;: &#34;3&#34;, -&#34;numberVerticalZones&#34;: &#34;3&#34; -&#34;titleblock&#34;: true -}&#39; -</code></pre></li> -<li>Call the endpoint and open your document. Confirm that you see the new <code>customGraphicsArea</code> element: -</br><img src="https://onshape-public.github.io/images/customDrawingArea.png" alt="new drawing created with border and extra column and row" width=550></li> -</ol> -<h3 id="add-a-note-to-a-drawing">Add a note to a drawing</h3> -<ol> -<li>Open an existing (or create a new) Onshape document with a drawing.</li> -<li>Start to form the <a href="https://cad.onshape.com/glassworks/explorer/#/Drawing/modifyDrawing">Drawings/modifyDrawing</a> call. Replace the URL parameters with the values from your document, and replace <code>CREDENTIALS</code> with your authorization credentials. -<pre tabindex="0"><code>curl -X &#39;POST \ -&#39;https://cad.onshape.doc/api/v6/drawings/d/{did}/w/{wid}/e/{eid}/modify&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; \ --H &#39;Accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Content-Type: application/json;charset=UTF-8; qs=0.09&#39; \ -</code></pre></li> -<li>Add information about the modification. In this example, we&rsquo;ll create an <code>Onshape::Note</code> on the drawing. We must specify the <code>messageName</code> and <code>formatVersion</code> for the modification, and then provide the contents and size of the annotation. -<pre tabindex="0"><code>curl -X &#39;POST \ -&#39;https://cad.onshape.doc/api/v6/drawings/d/{did}/w/{wid}/e/{eid}/modify&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; \ --H &#39;Accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Content-Type: application/json;charset=UTF-8; qs=0.09&#39; \ --d &#39;{ -&#34;description&#34;: &#34;Add a note to the drawing.&#34;, -&#34;jsonRequests&#34;: [ { -&#34;messageName&#34;: &#34;onshapeCreateAnnotations&#34;, -&#34;formatVersion&#34;: &#34;2021-01-01&#34;, -&#34;annotations&#34;: [ -{ -&#34;type&#34;: &#34;Onshape::Note&#34;, -&#34;note&#34;: { -&#34;position&#34;: { -&#34;type&#34;: &#34;Onshape::Reference::Point&#34;, -&#34;coordinate&#34;: [ -1, -10, -0 -] -}, -&#34;contents&#34;: &#34;This is a note&#34;, -&#34;textHeight&#34;: 0.2, -&#34;logicalId&#34;: &#34;note1&#34; -} -} -] -}] -}&#39; -</code></pre></li> -<li>Make the call, and then get <code>id</code> from the response body. You&rsquo;ll need this to poll the modification status to figure out when the modification has completed.</li> -<li>Set up the <a href="https://cad.onshape.com/glassworks/explorer/#/Drawing/getModificationStatus">Drawings/getModificationStatus</a> call. Replace <code>{mrid}</code> with the <code>id</code> from the last step, and replace <code>CREDENTIALS</code> with your credentials. Poll the modification status until the response returns <code>&quot;requestState&quot;: &quot;DONE&quot;</code>. -<pre tabindex="0"><code>curl -X &#39;GET \ -&#39;https://cad.onshape.doc/api/v6/drawings/modify/status/{mrid}&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; \ --H &#39;Accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Content-Type: application/json;charset=UTF-8; qs=0.09&#39; \ -</code></pre></li> -<li>Open your drawing and confirm that you see the new note. Note that your drawing may not match this image exactly, depending on your drawing and document properties. This sample document uses Inches for units. -</br><img src="https://onshape-public.github.io/images/drawings-addnote.png" alt="drawing with note annotation" width=550></li> -</ol> -<h3 id="add-a-callout-to-a-drawing">Add a callout to a drawing</h3> -<ol> -<li>Open an existing (or create a new) Onshape document with a drawing.</li> -<li>Start to form the <a href="https://cad.onshape.com/glassworks/explorer/#/Drawing/modifyDrawing">Drawings/modifyDrawing</a> call. Replace the URL parameters with the values from your document, and replace <code>CREDENTIALS</code> with your authorization credentials. -<pre tabindex="0"><code>curl -X &#39;POST \ -&#39;https://cad.onshape.doc/api/v6/drawings/d/{did}/w/{wid}/e/{eid}/modify&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; \ --H &#39;Accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Content-Type: application/json;charset=UTF-8; qs=0.09&#39; \ -</code></pre></li> -<li>Add information about the modification. In this example, we&rsquo;ll add an <code>Onshape::Callout</code> to the drawing. We must specify the <code>messageName</code> and <code>formatVersion</code> for the modification, and then provide the contents and size of the annotation: -<pre tabindex="0"><code>curl -X &#39;POST \ -&#39;https://cad.onshape.doc/api/v6/drawings/d/{did}/w/{wid}/e/{eid}/modify&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; \ --H &#39;Accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Content-Type: application/json;charset=UTF-8; qs=0.09&#39; \ --d &#39;{ -&#34;description&#34;: &#34;Add a callout to the drawing.&#34;, -&#34;jsonRequests&#34;: [ { -&#34;messageName&#34;: &#34;onshapeCreateAnnotations&#34;, -&#34;formatVersion&#34;: &#34;2021-01-01&#34;, -&#34;annotations&#34;: [ -{ -&#34;callout&#34;: -{ -&#34;borderShape&#34;: &#34;Circle&#34;, -&#34;borderSize&#34;: 0, -&#34;contents&#34;: &#34;Example Callout&#34;, -&#34;contentsBottom&#34;: &#34;bottom&#34;, -&#34;contentsLeft&#34;: &#34;left&#34;, -&#34;contentsRight&#34;: &#34;right&#34;, -&#34;contentsTop&#34;: &#34;top&#34;, -&#34;position&#34;: { -&#34;coordinate&#34;: [ -2.5, -6, -0 -], -&#34;type&#34;: &#34;Onshape::Reference::Point&#34; -}, -&#34;textHeight&#34;: 0.12, -&#34;logicalId&#34;: &#34;callout1&#34; -}, -&#34;type&#34;: &#34;Onshape::Callout&#34; -} -] -}] -}&#39; -</code></pre></li> -<li>Make the call, and then get <code>id</code> from the response body. You&rsquo;ll need this to poll the modification status to figure out when the modification has completed.</li> -<li>Set up the <a href="https://cad.onshape.com/glassworks/explorer/#/Drawing/getModificationStatus">Drawings/getModificationStatus</a> call. Replace <code>{mrid}</code> with the <code>id</code> from the last step, and replace <code>CREDENTIALS</code> with your credentials. Poll the modification status until the response returns <code>&quot;requestState&quot;: &quot;DONE&quot;</code>. -<pre tabindex="0"><code>curl -X &#39;GET \ -&#39;https://cad.onshape.doc/api/v6/drawings/modify/status/{mrid}&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; \ --H &#39;Accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Content-Type: application/json;charset=UTF-8; qs=0.09&#39; \ -</code></pre></li> -<li>Open your drawing and confirm that you see the new callout. -</br><img src="https://onshape-public.github.io/images/drawings-addcallout.png" alt="callout added to drawing" width=550></li> -</ol> -<h3 id="add-a-centerline-to-a-drawing">Add a centerline to a drawing</h3> -<ol> -<li>Open an existing (or create a new) Onshape document with a drawing.</li> -<li>Start to form the <a href="https://cad.onshape.com/glassworks/explorer/#/Drawing/modifyDrawing">Drawings/modifyDrawing</a> call. Replace the URL parameters with the values from your document, and replace <code>CREDENTIALS</code> with your authorization credentials. -<pre tabindex="0"><code>curl -X &#39;POST \ -&#39;https://cad.onshape.doc/api/v6/drawings/d/{did}/w/{wid}/e/{eid}/modify&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; \ --H &#39;Accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Content-Type: application/json;charset=UTF-8; qs=0.09&#39; \ -</code></pre></li> -<li>Add information about the modification. In this example, we&rsquo;ll add an <code>Onshape::Centerline</code> to the drawing. We must specify the <code>messageName</code> and <code>formatVersion</code> for the modification, and then provide the coordinates of the centerline ends.</li> -</ol> -<ul> -<li>Note: you can <a href="https://onshape-public.github.io/docs/api-adv/translation/#export-a-drawing-as-a-json">Export a Drawing to JSON</a> to get a list of valid coordinates and handles.</li> -<li>Note: if you have access, you can refer to the <a href="https://docs.opendesign.com/td/">ODA documentation</a> for more detailed formatting information. -<pre tabindex="0"><code>curl -X &#39;POST \ -&#39;https://cad.onshape.doc/api/v6/drawings/d/{did}/w/{wid}/e/{eid}/modify&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; \ --H &#39;Accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Content-Type: application/json;charset=UTF-8; qs=0.09&#39; \ --d &#39;{ -&#34;description&#34;: &#34;Add a centerline to the drawing&#34;, -&#34;jsonRequests&#34;: [ { -&#34;messageName&#34;: &#34;onshapeCreateAnnotations&#34;, -&#34;formatVersion&#34;: &#34;2021-01-01&#34;, -&#34;annotations&#34;: [ -{ -&#34;pointToPointCenterline&#34;: { -&#34;point1&#34;: { -&#34;coordinate&#34;: [ -2, -4, -0 -], -&#34;type&#34;: &#34;Onshape::Reference::Point&#34;, -&#34;uniqueId&#34;: &#34;point1&#34;, -&#34;viewId&#34;: &#34;51fa8b6040e411dfd17a4cda&#34; -}, -&#34;point2&#34;: { -&#34;coordinate&#34;: [ -7, -6, -1 -], -&#34;type&#34;: &#34;Onshape::Reference::Point&#34;, -&#34;uniqueId&#34;: &#34;point2&#34;, -&#34;viewId&#34;: &#34;ay6a8b6020e4h7dfdnn1499i&#34; -} -}, -&#34;type&#34;: &#34;Onshape::Centerline::PointToPoint&#34; -} -] -}] -}&#39; -</code></pre></li> -</ul> -<ol start="4"> -<li>Make the call, and then get <code>id</code> from the response body. You&rsquo;ll need this to poll the modification status to figure out when the modification has completed.</li> -<li>Set up the <a href="https://cad.onshape.com/glassworks/explorer/#/Drawing/getModificationStatus">Drawings/getModificationStatus</a> call. Replace <code>{mrid}</code> with the <code>id</code> from the last step, and replace <code>CREDENTIALS</code> with your credentials. Poll the modification status until the response returns <code>&quot;requestState&quot;: &quot;DONE&quot;</code>. -<pre tabindex="0"><code>curl -X &#39;GET \ -&#39;https://cad.onshape.doc/api/v6/drawings/modify/status/{mrid}&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; \ --H &#39;Accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Content-Type: application/json;charset=UTF-8; qs=0.09&#39; \ -</code></pre></li> -<li>Open your drawing and confirm that you see the new centerline.</li> -</ol> -<h3 id="add-a-dimension-to-a-drawing">Add a dimension to a drawing</h3> -<ol> -<li>Open an existing (or create a new) Onshape document with a drawing.</li> -<li>Start to form the <a href="https://cad.onshape.com/glassworks/explorer/#/Drawing/modifyDrawing">Drawings/modifyDrawing</a> call. Replace the URL parameters with the values from your document, and replace <code>CREDENTIALS</code> with your authorization credentials. -<pre tabindex="0"><code>curl -X &#39;POST \ -&#39;https://cad.onshape.doc/api/v6/drawings/d/{did}/w/{wid}/e/{eid}/modify&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; \ --H &#39;Accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Content-Type: application/json;charset=UTF-8; qs=0.09&#39; \ -</code></pre></li> -<li>Add information about the modification. In this example, we&rsquo;ll add an <code>Onshape::Dimension</code> to the drawing. We must specify the <code>messageName</code> and <code>formatVersion</code> for the modification, and then provide the coordinates and formatting options for the dimension. (Hint: you can <a href="https://onshape-public.github.io/docs/api-adv/translation/#export-a-drawing-as-a-json">Export a Drawing to JSON</a> to get a list of valid coordinates and handles.) -<pre tabindex="0"><code>curl -X &#39;POST \ -&#39;https://cad.onshape.doc/api/v6/drawings/d/{did}/w/{wid}/e/{eid}/modify&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; \ --H &#39;Accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Content-Type: application/json;charset=UTF-8; qs=0.09&#39; \ --d &#39;{ -&#34;description&#34;: &#34;Add a dimension to the drawing&#34;, -&#34;jsonRequests&#34;: [ { -&#34;messageName&#34;: &#34;onshapeCreateAnnotations&#34;, -&#34;formatVersion&#34;: &#34;2021-01-01&#34;, -&#34;annotations&#34;: [ -{ -&#34;radialDimension&#34;: { -&#34;centerPoint&#34;: { -&#34;coordinate&#34;: [ -0.2800021171569824, -0.014964947476983043, -0.079502 -], -&#34;type&#34;: &#34;Onshape::Reference::Point&#34;, -&#34;uniqueId&#34;: &#34;point1&#34;, -&#34;viewId&#34;: &#34;e11c38795c04ca55047f7ea7&#34; -}, -&#34;chordPoint&#34;: { -&#34;coordinate&#34;: [ -0.2920149764955524, -0.010030535983985095, -0.079502 -], -&#34;type&#34;: &#34;Onshape::Reference::Point&#34;, -&#34;uniqueId&#34;: &#34;point2&#34;, -&#34;viewId&#34;: &#34;e11c38795c04ca55047f7ea7&#34; -}, -&#34;formatting&#34;: { -&#34;dimdec&#34;: 2, -&#34;dimlim&#34;: false, -&#34;dimpost&#34;: &#34;R&lt;&gt;&#34;, -&#34;dimtm&#34;: 0, -&#34;dimtol&#34;: false, -&#34;dimtp&#34;: 0, -&#34;type&#34;: &#34;Onshape::Formatting::Dimension&#34; -}, -&#34;logicalId&#34;: &#34;dimension1&#34;, -&#34;textOverride&#34;: &#34;&#34;, -&#34;textPosition&#34;: { -&#34;coordinate&#34;: [ -191.80537349378181, -89.76274130852224, -0 -], -&#34;type&#34;: &#34;Onshape::Reference::Point&#34; -} -}, -&#34;type&#34;: &#34;Onshape::Dimension::Radial&#34; -} -] -}] -}&#39; -</code></pre></li> -<li>Make the call, and then get <code>id</code> from the response body. You&rsquo;ll need this to poll the modification status to figure out when the modification has completed.</li> -<li>Set up the <a href="https://cad.onshape.com/glassworks/explorer/#/Drawing/getModificationStatus">Drawings/getModificationStatus</a> call. Replace <code>{mrid}</code> with the <code>id</code> from the last step, and replace <code>CREDENTIALS</code> with your credentials. Poll the modification status until the response returns <code>&quot;requestState&quot;: &quot;DONE&quot;</code>. -<pre tabindex="0"><code>curl -X &#39;GET \ -&#39;https://cad.onshape.doc/api/v6/drawings/modify/status/{mrid}&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; \ --H &#39;Accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Content-Type: application/json;charset=UTF-8; qs=0.09&#39; \ -</code></pre></li> -<li>Open your drawing and confirm that you see the new dimension.</li> -</ol> -<h3 id="add-a-geometric-tolerance-to-a-drawing">Add a geometric tolerance to a drawing</h3> -<ol> -<li>Open an existing (or create a new) Onshape document with a drawing.</li> -<li>Start to form the <a href="https://cad.onshape.com/glassworks/explorer/#/Drawing/modifyDrawing">Drawings/modifyDrawing</a> call. Replace the URL parameters with the values from your document, and replace <code>CREDENTIALS</code> with your authorization credentials. -<pre tabindex="0"><code>curl -X &#39;POST \ -&#39;https://cad.onshape.doc/api/v6/drawings/d/{did}/w/{wid}/e/{eid}/modify&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; \ --H &#39;Accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Content-Type: application/json;charset=UTF-8; qs=0.09&#39; \ -</code></pre></li> -<li>Add information about the modification. In this example, we&rsquo;ll add an <code>Onshape::GeometricTolerance</code> to the drawing. We must specify the <code>messageName</code> and <code>formatVersion</code> for the modification, and then provide the frames and position of the annotation: -<pre tabindex="0"><code>curl -X &#39;POST \ -&#39;https://cad.onshape.doc/api/v6/drawings/d/{did}/w/{wid}/e/{eid}/modify&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; \ --H &#39;Accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Content-Type: application/json;charset=UTF-8; qs=0.09&#39; \ --d &#39;{ -&#34;description&#34;: &#34;Add a geometric tolerance to the drawing&#34;, -&#34;jsonRequests&#34;: [ { -&#34;messageName&#34;: &#34;onshapeCreateAnnotations&#34;, -&#34;formatVersion&#34;: &#34;2021-01-01&#34;, -&#34;annotations&#34;: [ -{ -&#34;geometricTolerance&#34;: { -&#34;frames&#34;: [ -&#34;{\\fDrawing Symbols Sans;◎}%%v{\\fDrawing Symbols Sans;∅}tol1{\\fDrawing Symbols Sans;Ⓜ}%%v%%v%%v%%v%%v\n&#34;, -&#34;{\\fDrawing Symbols Sans;⌖}%%vto2{\\fDrawing Symbols Sans;Ⓛ}%%v%%v%%v%%v%%v\n&#34; -], -&#34;logicalId&#34;: &#34;geometricTolerance1&#34;, -&#34;position&#34;: { -&#34;coordinate&#34;: [ -6, -6, -0 -], -&#34;type&#34;: &#34;Onshape::Reference::Point&#34; -} -}, -&#34;type&#34;: &#34;Onshape::GeometricTolerance&#34; -} -] -}] -}&#39; -</code></pre></li> -<li>Make the call, and then get <code>id</code> from the response body. You&rsquo;ll need this to poll the modification status to figure out when the modification has completed.</li> -<li>Set up the <a href="https://cad.onshape.com/glassworks/explorer/#/Drawing/getModificationStatus">Drawings/getModificationStatus</a> call. Replace <code>{mrid}</code> with the <code>id</code> from the last step, and replace <code>CREDENTIALS</code> with your credentials. Poll the modification status until the response returns <code>&quot;requestState&quot;: &quot;DONE&quot;</code>. -<pre tabindex="0"><code>curl -X &#39;GET \ -&#39;https://cad.onshape.doc/api/v6/drawings/modify/status/{mrid}&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; \ --H &#39;Accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Content-Type: application/json;charset=UTF-8; qs=0.09&#39; \ -</code></pre></li> -<li>Open your drawing and confirm that you see the new annotation. -</br><img src="https://onshape-public.github.io/images/drawings-addtolerance.png" alt="new drawing created with border and extra column and row" width=550></li> -</ol> -<h3 id="add-an-inspection-symbol-to-a-drawing">Add an inspection symbol to a drawing</h3> -<ol> -<li>Open an existing (or create a new) Onshape document with a drawing.</li> -<li>Start to form the <a href="https://cad.onshape.com/glassworks/explorer/#/Drawing/modifyDrawing">Drawings/modifyDrawing</a> call. Replace the URL parameters with the values from your document, and replace <code>CREDENTIALS</code> with your authorization credentials. -<pre tabindex="0"><code>curl -X &#39;POST \ -&#39;https://cad.onshape.doc/api/v6/drawings/d/{did}/w/{wid}/e/{eid}/modify&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; \ --H &#39;Accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Content-Type: application/json;charset=UTF-8; qs=0.09&#39; \ -</code></pre></li> -<li>Add information about the modification. In this example, we&rsquo;ll add an <code>Onshape::InspectionSymbol</code> to the drawing. We must specify the <code>messageName</code> and <code>formatVersion</code> for the modification, and then provide the shape and position of the inspection symbol. (Hint: you can <a href="https://onshape-public.github.io/docs/api-adv/translation/#export-a-drawing-as-a-json">Export a Drawing to JSON</a> to get a list of valid coordinates and handles.) -<pre tabindex="0"><code>curl -X &#39;POST \ -&#39;https://cad.onshape.doc/api/v6/drawings/d/{did}/w/{wid}/e/{eid}/modify&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; \ --H &#39;Accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Content-Type: application/json;charset=UTF-8; qs=0.09&#39; \ --d &#39;{ -&#34;description&#34;: &#34;Add an inspection symbol to the drawing&#34;, -&#34;jsonRequests&#34;: [ { -&#34;messageName&#34;: &#34;onshapeCreateAnnotations&#34;, -&#34;formatVersion&#34;: &#34;2021-01-01&#34;, -&#34;annotations&#34;: [ -{ -&#34;inspectionSymbol&#34;: { -&#34;borderShape&#34;: &#34;Circle&#34;, -&#34;borderSize&#34;: 2, -&#34;logicalId&#34;: &#34;inspection1&#34;, -&#34;parentAnnotation&#34;: &#34;h:10000577&#34;, -&#34;parentLineIndex&#34;: 0.0, -&#34;position&#34;: { -&#34;coordinate&#34;: [ -2.6, -6, -0 -], -&#34;type&#34;: &#34;Onshape::Reference::Point&#34; -}, -&#34;textHeight&#34;: 2 -}, -&#34;type&#34;: &#34;Onshape::InspectionSymbol&#34; -} -] -}] -}&#39; -</code></pre></li> -<li>Make the call, and then get <code>id</code> from the response body. You&rsquo;ll need this to poll the modification status to figure out when the modification has completed.</li> -<li>Set up the <a href="https://cad.onshape.com/glassworks/explorer/#/Drawing/getModificationStatus">Drawings/getModificationStatus</a> call. Replace <code>{mrid}</code> with the <code>id</code> from the last step, and replace <code>CREDENTIALS</code> with your credentials. Poll the modification status until the response returns <code>&quot;requestState&quot;: &quot;DONE&quot;</code>. -<pre tabindex="0"><code>curl -X &#39;GET \ -&#39;https://cad.onshape.doc/api/v6/drawings/modify/status/{mrid}&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; \ --H &#39;Accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Content-Type: application/json;charset=UTF-8; qs=0.09&#39; \ -</code></pre></li> -<li>Open your drawing and confirm that you see the new inspection symbol.</li> -</ol> -<h3 id="add-a-table-to-a-drawing">Add a table to a drawing</h3> -<ol> -<li>Open an existing (or create a new) Onshape document with a drawing.</li> -<li>Start to form the <a href="https://cad.onshape.com/glassworks/explorer/#/Drawing/modifyDrawing">Drawings/modifyDrawing</a> call. Replace the URL parameters with the values from your document, and replace <code>CREDENTIALS</code> with your authorization credentials. -<pre tabindex="0"><code>curl -X &#39;POST \ -&#39;https://cad.onshape.doc/api/v6/drawings/d/{did}/w/{wid}/e/{eid}/modify&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; \s --H &#39;Accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Content-Type: application/json;charset=UTF-8; qs=0.09&#39; \ -</code></pre></li> -<li>Add information about the modification. In this example, we&rsquo;ll add an <code>Onshape::Table::GeneralTable</code> to the drawing. We must specify the <code>messageName</code> and <code>formatVersion</code> for the modification, and then provide the location, number of rows, and number of columns for the table. (Hint: you can <a href="https://onshape-public.github.io/docs/api-adv/translation/#export-a-drawing-as-a-json">Export a Drawing to JSON</a> to get a list of valid coordinates.) -<pre tabindex="0"><code>curl -X &#39;POST \ -&#39;https://cad.onshape.doc/api/v6/drawings/d/{did}/w/{wid}/e/{eid}/modify&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; \ --H &#39;Accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Content-Type: application/json;charset=UTF-8; qs=0.09&#39; \ --d &#39;{ -&#34;description&#34;: &#34;New table&#34;, -&#34;jsonRequests&#34;: [ { -&#34;formatVersion&#34;: &#34;2021-01-01&#34;, -&#34;messageName&#34;: &#34;onshapeCreateAnnotations&#34;, -&#34;annotations&#34;: [ -{ &#34;table&#34;: { -&#34;cells&#34;: [ -{ -&#34;column&#34;: 0, -&#34;content&#34;: &#34;1.1&#34;, -&#34;row&#34;: 0 -}, -{ -&#34;column&#34;: 0, -&#34;content&#34;: &#34;2.1&#34;, -&#34;row&#34;: 1 -}, -{ -&#34;column&#34;: 1, -&#34;content&#34;: &#34;1.2&#34;, -&#34;row&#34;: 0 -}, -{ -&#34;column&#34;: 1, -&#34;content&#34;: &#34;2.2&#34;, -&#34;row&#34;: 1 -} -], -&#34;columns&#34;: 2, -&#34;rows&#34;: 2, -&#34;showHeaderRow&#34;: false, -&#34;showTitleRow&#34;: false, -&#34;position&#34;: { -&#34;coordinate&#34;: [100.0, 400.0, 0.0], -&#34;type&#34;: &#34;Onshape::Reference::Point&#34; -} -}, -&#34;type&#34;: &#34;Onshape::Table::GeneralTable&#34; -}] -}] -}&#39; -</code></pre></li> -<li>Make the call, and then get <code>id</code> from the response body. You&rsquo;ll need this to poll the modification status to figure out when the modification has completed.</li> -<li>Set up the <a href="https://cad.onshape.com/glassworks/explorer/#/Drawing/getModificationStatus">Drawings/getModificationStatus</a> call. Replace <code>{mrid}</code> with the <code>id</code> from the last step, and replace <code>CREDENTIALS</code> with your credentials. Poll the modification status until the response returns <code>&quot;requestState&quot;: &quot;DONE&quot;</code>. -<pre tabindex="0"><code>curl -X &#39;GET \ -&#39;https://cad.onshape.doc/api/v6/drawings/modify/status/{mrid}&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; \ --H &#39;Accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Content-Type: application/json;charset=UTF-8; qs=0.09&#39; \ -</code></pre></li> -<li>Open your drawing and confirm that you see the new table.</li> -</ol> -<h3 id="specify-a-snap-point">Specify a snap point</h3> -<p>You can use the <a href="https://cad.onshape.com/glassworks/explorer/#/Drawing/modifyDrawing">Drawings/modifyDrawing</a> to choose the snap points for annotations. Available types of snap points are:</p> -<pre tabindex="0"><code> ModeApint // Apparent intersection -ModeCenter // Center point -ModeEnd // End point -ModeIns // Insertion point -ModeIntersec // Intersection -ModeMid // Midpoint -ModeNear // Nearest point -ModeNode // Node -ModePar // Parallel -ModePerp // Perpendicular -ModeQuad // Quadrant -ModeStart // Start point -ModeTan // Tangent point -</code></pre><ol> -<li>Create a sketch in Onshape with two circles, then extrude both circles.</li> -<li>Create a drawing of the part&rsquo;s front view. We&rsquo;ll use the Drawings API to a point to point centerline snapped to the centers of the holes. -</br><img src="https://onshape-public.github.io/images/drawings-snap-before-01.png" alt="drawing front view of a box with two holes" width=350></li> -<li>Next, we&rsquo;ll need to get the view ID of the drawing. Call the <a href="https://cad.onshape.com/glassworks/explorer/#/Drawing/getDrawingViews_1">Drawing/getDrawingViews_1</a> endpoint on your document to get a list of all views in the drawing, and copy the <code>viewId</code> from the response:</li> -</ol> -<pre tabindex="0"><code>curl -X &#39;GET&#39; \ -&#39;https://cad.onshape.com/api/v8/drawings/d/{did}/w/{wid}/e/{eid}/views&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; \s --H &#39;accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Content-Type: application/json;charset=UTF-8; qs=0.09&#39; -</code></pre><ol start="4"> -<li>Use the <code>viewId</code> from the last step to get the <code>uniqueId</code> (or <code>edgeId</code>) of each circle&rsquo;s center from the <a href="https://cad.onshape.com/glassworks/explorer/#/Drawing/getDrawingViewJsonGeometry_1">Drawing/getDrawingViewJsonGeometry_1)</a> endpoint:</li> -</ol> -<pre tabindex="0"><code>curl -X &#39;GET&#39; \ -&#39;https://cad.onshape.com/api/v8/drawings/d/{did}/w/{wid}/e/{eid}/views/{viewId}/jsongeometry&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; \s --H &#39;accept: application/json;charset=UTF-8; qs=0.09&#39; \ -</code></pre><ol start="5"> -<li>Start to form the <a href="https://cad.onshape.com/glassworks/explorer/#/Drawing/modifyDrawing">Drawings/modifyDrawing</a> call. Replace the URL parameters with the values from your document, and replace <code>CREDENTIALS</code> with your authorization credentials. -<pre tabindex="0"><code></code></pre></li> -<li>Add information about the modification. In this example, we&rsquo;ll add a <code>pointToPointCenterline</code> to the drawing. Make sure to update the request body values as followis:</li> -</ol> -<ul> -<li><code>messageName</code>: <code>&quot;onshapeCreateAnnotation&quot;</code></li> -<li><code>formatVersion</code>: <code>&quot;2021-01-01&quot;</code></li> -<li><code>uniqueId</code>: From Step 4</li> -<li><code>viewId</code>: From Step 3</li> -<li><code>coordinates</code>: The values must be sent as part of the request, but are ignored. -<pre tabindex="0"><code> curl -X &#39;POST \ -&#39;https://cad.onshape.doc/api/v8/drawings/d/{did}/w/{wid}/e/{eid}/modify&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; \s --H &#39;Accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Content-Type: application/json;charset=UTF-8; qs=0.09&#39; \ --d { -&#34;description&#34;: &#34;creating a snap point&#34;, -&#34;jsonRequests&#34;: [ { -&#34;messageName&#34;: &#34;onshapeCreateAnnotations&#34;, -&#34;formatVersion&#34;: &#34;2021-01-01&#34;, -&#34;annotations&#34;: [ -{ -&#34;pointToPointCenterline&#34;: { -&#34;point1&#34;: { -&#34;coordinate&#34;: [0,0,0], -&#34;type&#34;: &#34;Onshape::Reference::Point&#34;, -&#34;uniqueId&#34;: &#34;{uniqueId1}&#34;, -&#34;viewId&#34;: &#34;{viewId}&#34;, -&#34;snapPointType&#34;: &#34;ModeCenter&#34; -}, -&#34;point2&#34;: { -&#34;coordinate&#34;: [0,0,0], -&#34;type&#34;: &#34;Onshape::Reference::Point&#34;, -&#34;uniqueId&#34;: &#34;{uniqueId2}&#34;, -&#34;viewId&#34;: &#34;{viewId}&#34;, -&#34;snapPointType&#34;: &#34;ModeCenter&#34; -} -}, -&#34;type&#34;: &#34;Onshape::Centerline::PointToPoint&#34; -} -] -}] -} -</code></pre></li> -</ul> -<ol start="7"> -<li>Return to your document and see that the centerline has been added to the document at the snap points. -</br><img src="https://onshape-public.github.io/images/drawings-snap-after-01.png" alt="drawing front view of a box with two holes with a centerline between the hole centers" width=350></li> -</ol> -<h2 id="additional-resources">Additional Resources</h2> -<ul> -<li><a href="https://onshape-public.github.io/docs/api-intro//#onshape-api-request">Guide to Onshape APIs</a></li> -<li><a href="https://onshape-public.github.io/docs/api-intro/explorer">Guide to the API Explorer</a></li> -<li><a href="https://cad.onshape.com/glassworks/explorer/#/Drawing">API Explorer: Drawings</a></li> -<li><a href="https://cad.onshape.com/help/Content/drawings.htm">Onshape Help: Drawings</a></li> -</ul>Docs: Featureshttps://onshape-public.github.io/docs/api-adv/featureaccess/Mon, 18 May 2020 20:37:28 -0400https://onshape-public.github.io/docs/api-adv/featureaccess/ -<p>This page describes the APIs Onshape provides for creating and manipulating features and the Feature List in a Part Studio.</p> -<blockquote> -<p>📘 <strong>Notes</strong></p> -<ul> -<li>This page provides sample code as curls. See the <a href="https://curl.se/docs/">curl documentation</a> for more information.</li> -<li>All Onshape API calls must be properly authenticated by replacing the <code>CREDENTIALS</code> variable in the curls below. See the <a href="https://onshape-public.github.io/docs/auth/apikeys">API Keys</a> page for instructions and the <a href="https://onshape-public.github.io/docs/api-intro/quickstart">Quick Start</a> for an example. All applications submitted to the Onshape App Store <em>must</em> authenticate with <a href="https://onshape-public.github.io/docs/auth/oauth">OAuth2</a>.</li> -<li>This documentation refers to Onshape IDs in the following format: <code>{did}, {wid}, {vid}, {mid}, {eid}, {pid}, {otherId}</code>. These represent document, workspace, version, microversion, element, part, and other IDs (respectively) that are needed make the API calls. We sometimes abbreviate these variables as <code>DWVEM</code> Please see <a href="https://onshape-public.github.io/docs/api-intro/#onshape-api-request">API Guide: API Intro</a> for information on what these IDs mean and how to obtain them from your documents. Never include the curly braces (<code>{}</code>) in your API calls.</li> -<li>For Enterprise accounts, replace <strong>cad</strong> in all Onshape URLs with your company domain. -https://<strong>cad</strong>.onshape.com &gt; https://<strong>companyName</strong>.onshape.com</li> -</ul> -</blockquote> -<h2 id="featurescript-vs-rest-api">FeatureScript vs REST API</h2> -<p>When working with complex geometry, you might find working directly in FeatureScript easier than working with the Onshape REST API. <a href="https://cad.onshape.com/FsDoc/">Click here to see the FeatureScript documentation.</a></p> -<h2 id="endpoints">Endpoints</h2> -<p>The following endpoints are available for working with features and the Feature List:</p> -<ul> -<li><a href="https://cad.onshape.com/glassworks/explorer/#/PartStudio/getPartStudioFeatures">Get the Feature List</a> -<pre tabindex="0"><code>curl -X &#39;GET&#39; \ -&#39;https://cad.onshape.com/api/v8/partstudios/d/{did}/{wvm}/{wvmid}/e/{eid}/features?rollbackBarIndex=-1&amp;includeGeometryIds=true&amp;noSketchGeometry=false&#39; \ --H &#39;accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; -</code></pre></li> -<li><a href="https://cad.onshape.com/glassworks/explorer/#/PartStudio/addPartStudioFeature">Add a Feature</a> -<pre tabindex="0"><code>curl -X &#39;POST&#39; \ -&#39;https://cad.onshape.com/api/v8/partstudios/d/{did}/{wvm}/{wvmid}/e/{wid}/features&#39; \ --H &#39;accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; \ --H &#39;Content-Type: application/json;charset=UTF-8; qs=0.09&#39; \ --d &#39;{ -&#34;btType&#34;: &#34;BTFeatureDefinitionCall-1406&#34;, -&#34;feature&#34;: { -&#34;btType&#34;: &#34;BTMFeature-134&#34;, -&#34;featureType&#34;: &#34;&#34;, -&#34;name&#34;: &#34;&#34;, -&#34;parameters&#34;: [] -} -}&#39; -</code></pre></li> -<li><a href="https://cad.onshape.com/glassworks/explorer/#/PartStudio/updatePartStudioFeature">Update a Feature</a> -<pre tabindex="0"><code> curl -X &#39;POST&#39; \ -&#39;https://cad.onshape.com/api/v8/partstudios/d/{did}/w/{wid}/e/{eid}/features/featureid/{fid}&#39; \ --H &#39;Accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; \ --H &#39;Content-Type: application/json;charset=UTF-8; qs=0.09&#39; \ --d &#39;{ -&#34;btType&#34;: &#34;BTFeatureDefinitionCall-1406&#34;, -&#34;feature&#34;: { -&#34;btType&#34;: &#34;BTMFeature-134&#34;, -&#34;featureId&#34;: &#34;{fid}&#34;, -&#34;parameters&#34;: [] -} -}&#39; -</code></pre></li> -<li><a href="https://cad.onshape.com/glassworks/explorer/#/PartStudio/updateFeatures">Update Multiple Features</a> -<pre tabindex="0"><code> curl -X &#39;POST&#39; \ -&#39;https://cad.onshape.com/api/v8/partstudios/d/{did}/w/{wid}/e/{eid}/features/updates&#39; \ --H &#39;Accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; \ --H &#39;Content-Type: application/json;charset=UTF-8; qs=0.09&#39; \ --d &#39;{ -&#34;btType&#34;: &#34;BTUpdateFeaturesCall-1748&#34;, -&#34;features&#34;: [ -{ -&#34;btType&#34;: &#34;BTMFeature-134&#34;, -&#34;featureId&#34;: &#34;{fid1}&#34;, -&#34;parameters&#34;: [] -}, -{ -&#34;btType&#34;: &#34;BTMFeature-134&#34;, -&#34;featureId&#34;: &#34;{fid2}&#34;, -&#34;parameters&#34;: [] -} -] -}&#39; -</code></pre></li> -<li><a href="https://cad.onshape.com/glassworks/explorer/#/PartStudio/deletePartStudioFeature">Delete a Feature</a> -<pre tabindex="0"><code>curl -X &#39;DELETE&#39; \ -&#39;https://cad.onshape.com/api/v8/partstudios/d/{did}/{wvm}/{wvmid}/e/{eid}/features/featureid/{fid}&#39; \ --H &#39;accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; -</code></pre></li> -</ul> -<h3 id="json-encoding">JSON encoding</h3> -<p>Instead of providing a translation layer between a feature&rsquo;s internal and external formats, these APIs present the internal format of the feature definitions to the user. The best way to familiarize yourself with the formats involved is by calling the <a href="https://cad.onshape.com/glassworks/explorer/#/PartStudio/getPartStudioFeatures">Get the Feature List</a> endpoint on existing Part Studios.</p> -<blockquote> -<p>📘 <strong>Notes</strong></p> -<ul> -<li>Onshape REST API parameters may change at any time. The documentation on this page is accurate for v8 of the Onshape API. The quickest way to verify what parameters are needed for a call is to create the sketch/feature in the Onshape UI, then call the <a href="https://cad.onshape.com/glassworks/explorer/#/PartStudio/getPartStudioFeatures">Get the Feature List</a> API and see what parameters are returned for the feature.</li> -</ul> -</blockquote> -<blockquote> -<p>📘 <strong>Notes</strong></p> -<ul> -<li>Default values are sometimes omitted in the encoded output. These defaults are: -<ul> -<li>String: <code>&quot;&quot;</code></li> -<li>Boolean: <code>false</code></li> -<li>Numeric: <code>0</code></li> -</ul> -</li> -<li>The JSON encoding uses a special tagging system to manage polymorphic data structures. Objects are generally by enclosing them within another object that declares the type information for the enclosed object.</li> -</ul> -</blockquote> -<h3 id="feature-types">Feature types</h3> -<p>Below, find the available types for working with features in the API.</p> -<ul> -<li><code>BTMFeature-134</code> - General feature type</li> -<li><code>BTMSketch-151</code> - Feature type for sketches</li> -</ul> -<h3 id="parameter-types">Parameter types</h3> -<p>All parameters have the following fields in common:</p> -<ul> -<li><code>parameterId</code> - Unique ID of the parameter</li> -<li><code>nodeId</code> - Unique ID of the parameter node</li> -</ul> -<p>The parameter types available for use in the API are:</p> -<ul> -<li><code>BTMParameterQuantity-147</code> -<ul> -<li><code>expression</code> - Define the value for the parameter</li> -</ul> -</li> -<li><code>BTMParameterQueryList-148 </code> - defined by one of the following: -<ul> -<li><code>SBTMIndividualQuery-138</code> -<ul> -<li><code>geometryIds</code> - List of geometry IDs the feature applies to</li> -</ul> -</li> -<li><code>SBTMIndividualSketchRegionQuery-140</code> -<ul> -<li><code>featureId</code> - Feature ID of the sketch for which to include all regions</li> -</ul> -</li> -</ul> -</li> -<li><code>BTMParameterBoolean-144</code> -<ul> -<li><code>value</code> - <code>true | false</code></li> -</ul> -</li> -<li><code>BTMParameterEnum-145</code> -<ul> -<li><code>enumName</code> - Name of the enum type that the value is a member of</li> -<li><code>value</code> - The enum member</li> -</ul> -</li> -</ul> -<h3 id="sketch-plane-ids">Sketch plane IDs</h3> -<p>The following string can be sent along with the <a href="https://cad.onshape.com/glassworks/explorer/#/PartStudio/evalFeatureScript">PartStudios/featurescript</a> API to get the plane ID. You can then use that ID to specify the plane on which to create a sketch.</p> -<pre tabindex="0"><code>function(context is Context, queries) { -return transientQueriesToStrings(evaluateQuery(context, qCreatedBy(makeId(\&#34;{planeName}\&#34;), EntityType.FACE))); -} -</code></pre><p>For example, to get the ID of the Top plane, you would make the following call:</p> -<pre tabindex="0"><code>curl -X &#39;POST&#39; \ -&#39;https://cad.onshape.com/api/v8/partstudios/d/{did}/w/{wid}/e/{eid}/featurescript?rollbackBarIndex=-1&#39; \ --H &#39;Accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; \ --H &#39;Content-Type: application/json;charset=UTF-8; qs=0.09&#39; \ --d &#39;{ -&#34;script&#34;: &#34;function(context is Context, queries) { return transientQueriesToStrings(evaluateQuery(context, qCreatedBy(makeId(\&#34;Top\&#34;), EntityType.FACE))); }&#34; -}&#39; -</code></pre><h2 id="sample-workflows">Sample Workflows</h2> -<p>Below are several examples of how the API can be used in order to help you get started. The calls could be executed using your preferred software environment but interactive use in a REST-aware tool is likely the easiest way to try the examples.</p> -<h3 id="get-the-list-of-features-in-a-part-studio">Get the list of features in a Part Studio</h3> -<p>One of the best ways to familiarize yourself with the Onshape Feature APIs is to view the API details for existing features in a Part Studio. In this example, we&rsquo;ll add three features to a Part Studio, and then call the <a href="https://cad.onshape.com/glassworks/explorer/#/PartStudio/getPartStudioFeatures">PartStudio/getPartStudioFeatures</a> API on the Part Studio. We&rsquo;ll then be able to view the structure of the way features are represented in the API.</p> -<ol> -<li>Create a new document or open an existing one.</li> -<li>Create a new sketch in the document, and draw a long rectangle.</li> -<li>Extrude the rectangle.</li> -<li>Add a fillet to one edge of the part.</li> -<li>Call the <a href="https://cad.onshape.com/glassworks/explorer/#/PartStudio/getPartStudioFeatures">PartStudio/getPartStudioFeatures</a> API. Replace the URL parameters with the values from your document, and replace <code>CREDENTIALS</code> with your authorization credentials. -<pre tabindex="0"><code>curl -X &#39;GET \ -&#39;https://cad.onshape.com/api/v8/partstudios/d/{did}/{wvm}/{wvmid}/e/{eid}/features?rollbackBarIndex=-1&amp;includeGeometryIds=true&amp;noSketchGeometry=false&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; \ --H &#39;Accept: application/json;charset=UTF-8; qs=0.09&#39; -</code></pre></li> -<li>Review the JSON returned in the response body. A lot of information is returned, but it will look something like the truncated snippet below. Notice that there are objects returned for each feature in the Part Studio&ndash; the sketch, the extrude, the fillet, and the chamfer. Each default plane and the origin in the Part Studio also appear in the <code>defaultFeatures</code> object. The Standard Geometry library is listed as an import, and the response also includes the state of each feature. : -<pre tabindex="0"><code>{ -&#34;btType&#34;: &#34;BTFeatureListResponse-2457&#34;, -&#34;isComplete&#34;: true, -&#34;serializationVersion&#34;: &#34;1.2.4&#34;, -&#34;rollbackIndex&#34;: 4, -&#34;features&#34;: [ -{ -&#34;btType&#34;: &#34;BTMSketch-151&#34;, -&#34;entities&#34;: [...], -&#34;constraints&#34;: [...], -&#34;name&#34;: &#34;Sketch 1&#34;, -&#34;suppressed&#34;: false, -&#34;parameters&#34;: [...], -&#34;featureId&#34;: &#34;{fid1}&#34;, -&#34;featureType&#34;: &#34;newSketch&#34;, -&#34;subFeatures&#34;: [...], -&#34;returnAfterSubfeatures&#34;: false -}, -{ -&#34;btType&#34;: &#34;BTMFeature-134&#34;, -&#34;name&#34;: &#34;Extrude 1&#34;, -&#34;suppressed&#34;: false, -&#34;parameters&#34;: [...] -&#34;featureId&#34;: &#34;{fid2}&#34;, -&#34;featureType&#34;: &#34;extrude&#34;, -&#34;subFeatures&#34;: [], -&#34;returnAfterSubfeatures&#34;: false -}, -{ -&#34;btType&#34;: &#34;BTMFeature-134&#34;, -&#34;name&#34;: &#34;Fillet 1&#34;, -&#34;suppressed&#34;: false, -&#34;parameters&#34;: [...], -&#34;featureId&#34;: &#34;{fid3}&#34;, -&#34;featureType&#34;: &#34;fillet&#34;, -&#34;subFeatures&#34;: [...], -&#34;returnAfterSubfeatures&#34;: false -}, -{ -&#34;btType&#34;: &#34;BTMFeature-134&#34;, -&#34;name&#34;: &#34;Chamfer 1&#34;, -&#34;suppressed&#34;: false, -&#34;parameters&#34;: [...], -&#34;featureId&#34;: &#34;{fid4}&#34;, -} -], -&#34;featureStates&#34;: { -&#34;{fid1}&#34;: { -&#34;btType&#34;: &#34;BTFeatureState-1688&#34;, -&#34;featureStatus&#34;: &#34;OK&#34;, -&#34;inactive&#34;: false -}, -... -}, -&#34;defaultFeatures&#34;: [ -{ -&#34;btType&#34;: &#34;BTMFeature-134&#34;, -&#34;name&#34;: &#34;Origin&#34;, -}, -{ -&#34;btType&#34;: &#34;BTMFeature-134&#34;, -&#34;name&#34;: &#34;Top&#34;, -}, -{ -&#34;btType&#34;: &#34;BTMFeature-134&#34;, -&#34;name&#34;: &#34;Front&#34;, -}, -{ -&#34;btType&#34;: &#34;BTMFeature-134&#34;, -&#34;name&#34;: &#34;Right&#34;, -} -], -&#34;imports&#34;: [ -{ -&#34;btType&#34;: &#34;BTMImport-136&#34;, -&#34;path&#34;: &#34;onshape/std/geometry.fs&#34;, -&#34;version&#34;: &#34;2232.0&#34; -} -], -&#34;libraryVersion&#34;: 2232 -} -</code></pre></li> -</ol> -<h3 id="create-a-cube-feature">Create a cube feature</h3> -<p>In this example we will create a cube using the <code>cube</code> feature. The feature accepts a single parameter (the length of a side) and creates a cube with a corner at the origin and aligned with the three default planes.</p> -<ol> -<li>Create a new document or open an existing one. We&rsquo;ll create the cube feature in this document.</li> -<li>Begin to create the <a href="https://cad.onshape.com/glassworks/explorer/#/PartStudio/addPartStudioFeature">PartStudio/addPartStudioFeature</a> call. Replace the URL parameters with the values from your document, and replace <code>CREDENTIALS</code> with your authorization credentials. This is a call to the same endpoint as in the previous example, but is a <code>POST</code> instead of a <code>GET</code>. -<pre tabindex="0"><code>curl -X &#39;POST \ -&#39;https://cad.onshape.com/api/v8/partstudios/d/{did}/{wvm}/{wvmid}/e/{eid}/features&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; \ --H &#39;Accept: application/json;charset=UTF-8; qs=0.09&#39;\ --H &#39;Content-Type: application/json;charset=UTF-8; qs=0.09&#39; \ --d &#39;{ -&lt;JSON of feature data&gt; -}&#39; -</code></pre></li> -<li>Add the following as the JSON body. -<ul> -<li>Note the <code>btType</code> defines this as a Feature.</li> -<li>We&rsquo;ve named the feature <code>cube</code> and inserted an instance of the feature named <code>Cube 1</code> into the Part Studio.</li> -<li>The <code>cube</code> feature has one parameter&ndash; the cube <code>sideLength</code> in inches, which is set to 1 by default.</li> -</ul> -<pre tabindex="0"><code>{ -&#34;btType&#34;: &#34;BTFeatureDefinitionCall-1406&#34;, -&#34;feature&#34;: { -&#34;btType&#34;: &#34;BTMFeature-134&#34;, -&#34;featureType&#34;: &#34;cube&#34;, -&#34;name&#34;: &#34;Cube 1&#34;, -&#34;parameters&#34;: [ -{ -&#34;btType&#34;: &#34;BTMParameterQuantity-147&#34;, -&#34;isInteger&#34;: false, -&#34;expression&#34;: &#34;1 in&#34;, -&#34;parameterId&#34;: &#34;sideLength&#34; -} -], -&#34;returnAfterSubfeatures&#34;: false, -&#34;suppressed&#34;: false -} -} -</code></pre></li> -<li>Confirm your call matches the following, and then make the call: -<pre tabindex="0"><code>curl -X &#39;POST \ -&#39;https://cad.onshape.com/api/v8/partstudios/d/{did}/{wvm}/{wvmid}/e/{eid}/features&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; \ --H &#39;Accept: application/json;charset=UTF-8; qs=0.09&#39;\ --H &#39;Content-Type: application/json;charset=UTF-8; qs=0.09&#39; \ --d &#39;{ -&#34;btType&#34;: &#34;BTFeatureDefinitionCall-1406&#34;, -&#34;feature&#34;: { -&#34;btType&#34;: &#34;BTMFeature-134&#34;, -&#34;featureType&#34;: &#34;cube&#34;, -&#34;name&#34;: &#34;Cube 1&#34;, -&#34;parameters&#34;: [ -{ -&#34;btType&#34;: &#34;BTMParameterQuantity-147&#34;, -&#34;isInteger&#34;: false, -&#34;expression&#34;: &#34;1 in&#34;, -&#34;parameterId&#34;: &#34;sideLength&#34; -} -], -&#34;returnAfterSubfeatures&#34;: false, -&#34;suppressed&#34;: false -} -}&#39; -</code></pre></li> -<li>Return to your console to review the endpoint response. The output returns: -<ul> -<li>The feature definition that we provided as input with <code>nodeId</code>s and a <code>featureId</code>. Make a note of the <code>featureId</code>; we&rsquo;ll use it in the next example.</li> -<li>Information that the feature executed correctly</li> -<li>The serialization version and microversion of the document that resulted from the feature addition</li> -</ul> -<pre tabindex="0"><code> { -&#34;btType&#34;: &#34;BTFeatureDefinitionResponse-1617&#34;, -&#34;featureState&#34;: { -&#34;btType&#34;: &#34;BTFeatureState-1688&#34;, -&#34;featureStatus&#34;: &#34;OK&#34;, -&#34;inactive&#34;: false -}, -&#34;feature&#34;: { -&#34;btType&#34;: &#34;BTMFeature-134&#34;, -&#34;name&#34;: &#34;Cube 1&#34;, -&#34;suppressed&#34;: false, -&#34;parameters&#34;: [ -{ -&#34;btType&#34;: &#34;BTMParameterQuantity-147&#34;, -&#34;value&#34;: 0, -&#34;units&#34;: &#34;&#34;, -&#34;isInteger&#34;: false, -&#34;expression&#34;: &#34;1 in&#34;, -&#34;nodeId&#34;: &#34;{nid1}&#34;, -&#34;parameterId&#34;: &#34;sideLength&#34; -} -], -&#34;featureId&#34;: &#34;{fid}&#34;, -&#34;nodeId&#34;: &#34;{nid2}&#34;, -&#34;featureType&#34;: &#34;cube&#34;, -&#34;returnAfterSubfeatures&#34;: false, -&#34;subFeatures&#34;: [], -&#34;namespace&#34;: &#34;&#34; -}, -&#34;serializationVersion&#34;: &#34;1.2.4&#34;, -&#34;sourceMicroversion&#34;: &#34;{mid}&#34;, -&#34;microversionSkew&#34;: false, -&#34;rejectMicroversionSkew&#34;: false, -&#34;libraryVersion&#34;: 0 -} -</code></pre></li> -<li>Open your document and confirm that the cube has been inserted into the Part Studio. -</br><img src="https://onshape-public.github.io/images/features-cube-example.png" alt="cube added to part studio via features api" width=550></li> -<li>Double-click <code>Cube 1</code> in the Feature List to open the Cube 1 dialog. Change the sideLength to 3 and click the checkbox. Note that the size of the cube changes automatically. -</br><img src="https://onshape-public.github.io/images/features-cube-example-02.png" alt="cube parameter updated to 3 inches" width=550></li> -</ol> -<h3 id="create-a-sketch">Create a sketch</h3> -<p>In this example, we&rsquo;ll create a circular sketch feature with the following properties:</p> -<ul> -<li>While other features use a <code>btType</code> of <code>BTMFeature-141</code>, sketches have their own special type: <code>BTMSketch-151</code></li> -<li>Sketches must use the <code>newSketch</code> featureType</li> -<li>Sketch plane ID: Front</li> -<li>Radius: 0.025 inches</li> -<li>Location: (0.05, 0.05)</li> -</ul> -<ol> -<li>Open a new PartStudio. Note the following: -<ul> -<li>Document ID</li> -<li>Workspace ID</li> -<li>Element ID (of the Part Studio tab)</li> -</ul> -</li> -<li>We want to create the circle on the Front plane, so we&rsquo;ll call the <a href="https://cad.onshape.com/glassworks/explorer/#/PartStudio/evalFeatureScript">PartStudios/featurescript</a> endpoint to get its ID: -<pre tabindex="0"><code>curl -X &#39;POST&#39; \ -&#39;https://cad.onshape.com/api/v8/partstudios/d/{did}/w/{wid}/e/{eid}/featurescript?rollbackBarIndex=-1&#39; \ --H &#39;Accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; \ --H &#39;Content-Type: application/json;charset=UTF-8; qs=0.09&#39; \ --d &#39;{ -&#34;script&#34;: &#34;function(context is Context, queries) { return transientQueriesToStrings(evaluateQuery(context, qCreatedBy(makeId(\&#34;Front\&#34;), EntityType.FACE))); }&#34; -}&#39; -</code></pre>The call returns the following, identifying the plane as <code>JCC</code>. -<pre tabindex="0"><code>{ -&#34;btType&#34;: &#34;BTFeatureScriptEvalResponse-1859&#34;, -&#34;result&#34;: { -&#34;btType&#34;: &#34;com.belmonttech.serialize.fsvalue.BTFSValueArray&#34;, -&#34;value&#34;: [ -{ -&#34;btType&#34;: &#34;com.belmonttech.serialize.fsvalue.BTFSValueString&#34;, -&#34;value&#34;: &#34;JCC&#34;, -&#34;typeTag&#34;: &#34;&#34; -} -], -&#34;typeTag&#34;: &#34;&#34; -} -} -</code></pre></li> -<li>Now we&rsquo;ll create the JSON structure for our sketch. <em>All sketches must be created with the <code>BTMSketch-151</code> btType and the <code>newSketch</code> featureType.</em> Note how we&rsquo;ve specified the plane to use in the <code>sketchPlane</code> parameter, and the <code>geometry</code> details. -<pre tabindex="0"><code>{ -&#34;feature&#34; : { -&#34;btType&#34;: &#34;BTMSketch-151&#34;, -&#34;featureType&#34;: &#34;newSketch&#34;, -&#34;name&#34;: &#34;Sketch 1&#34;, -&#34;parameters&#34;: [ -{ -&#34;btType&#34;: &#34;BTMParameterQueryList-148&#34;, -&#34;queries&#34;: [ -{ -&#34;btType&#34;: &#34;BTMIndividualQuery-138&#34;, -&#34;deterministicIds&#34;: [ &#34;JCC&#34; ] -} -], -&#34;parameterId&#34;: &#34;sketchPlane&#34; -} -], -&#34;entities&#34;: [ -{ -&#34;btType&#34;: &#34;BTMSketchCurve-4&#34;, -&#34;geometry&#34;: { -&#34;btType&#34;: &#34;BTCurveGeometryCircle-115&#34;, -&#34;radius&#34;: 0.025, -&#34;xcenter&#34;: 0.05, -&#34;ycenter&#34;: 0.05, -&#34;xdir&#34;: 1, -&#34;ydir&#34;: 0, -&#34;clockwise&#34;: false -}, -&#34;centerId&#34;: &#34;circle-entity.center&#34;, -&#34;entityId&#34;: &#34;circle-entity&#34; -} -], -&#34;constraints&#34;: [ -] -} -} -</code></pre></li> -<li>Now we&rsquo;ll add the JSON structure to the <a href="https://cad.onshape.com/glassworks/explorer/#/PartStudio/addPartStudioFeature">PartStudio/addPartStudioFeature</a> endpoint. Replace the URL parameters with the values from your document, and replace <code>CREDENTIALS</code> with your authorization credentials. -<pre tabindex="0"><code>curl -X &#39;POST&#39; \ -&#39;https://cad.onshape.com/api/v8/partstudios/d/{did}/{wvm}/{wvmid}/e/{wid}/features&#39; \ --H &#39;Accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; \ --H &#39;Content-Type: application/json;charset=UTF-8; qs=0.09&#39; \ --d &#39;{ -&#34;feature&#34; : { -&#34;btType&#34;: &#34;BTMSketch-151&#34;, -&#34;featureType&#34;: &#34;newSketch&#34;, -&#34;name&#34;: &#34;Sketch 1&#34;, -&#34;parameters&#34;: [ -{ -&#34;btType&#34;: &#34;BTMParameterQueryList-148&#34;, -&#34;queries&#34;: [ -{ -&#34;btType&#34;: &#34;BTMIndividualQuery-138&#34;, -&#34;deterministicIds&#34;: [ &#34;JCC&#34; ] -} -], -&#34;parameterId&#34;: &#34;sketchPlane&#34; -} -], -&#34;entities&#34;: [ -{ -&#34;btType&#34;: &#34;BTMSketchCurve-4&#34;, -&#34;geometry&#34;: { -&#34;btType&#34;: &#34;BTCurveGeometryCircle-115&#34;, -&#34;radius&#34;: 0.025, -&#34;xcenter&#34;: 0.05, -&#34;ycenter&#34;: 0.05, -&#34;xdir&#34;: 1, -&#34;ydir&#34;: 0, -&#34;clockwise&#34;: false -}, -&#34;centerId&#34;: &#34;circle-entity.center&#34;, -&#34;entityId&#34;: &#34;circle-entity&#34; -} -], -&#34;constraints&#34;: [ -] -} -}&#39; -</code></pre></li> -<li>Find the new sketch&rsquo;s <code>featureId</code> in the call response. You&rsquo;ll need this for the <a href="#create-a-cylinder">Create a cylinder</a> tutorial.</li> -<li>Open your Part Studio and confirm that the sketch has been added: -</br></br><img src="https://onshape-public.github.io/images/features-create-sketch.png" alt="circle sketch created via features api" width=550></li> -</ol> -<h3 id="create-a-cylinder">Create a cylinder</h3> -<p>In this tutorial, we&rsquo;ll extrude an sketch with the following properties: -</br></br><img src="https://onshape-public.github.io/images/features-extrude-dialog.png" alt="Extrude dialog in Onshape UI" width=350></p> -<ol> -<li>This tutorial expands on the <a href="#create-a-sketch">Create a sketch</a> tutorial. You&rsquo;ll need the following from the document containing your circular sketch: -<ul> -<li>Document ID</li> -<li>Workspace ID</li> -<li>Element ID of the tab containing the sketch</li> -<li>Feature ID of the sketch -<ul> -<li>If you need to get this <code>featureId</code> again, you can call the <a href="https://cad.onshape.com/glassworks/explorer/#/PartStudio/getPartStudioFeatures">getPartStudioFeatures</a> endpoint on the document.</li> -</ul> -</li> -</ul> -</li> -<li>Begin to create the <a href="https://cad.onshape.com/glassworks/explorer/#/PartStudio/addPartStudioFeature">PartStudio/addPartStudioFeature</a> call. Replace the URL parameters with the values from your document, and replace <code>CREDENTIALS</code> with your authorization credentials. -<pre tabindex="0"><code>curl -X &#39;POST \ -&#39;https://cad.onshape.com/api/v8/partstudios/d/{did}/{wvm}/{wvmid}/e/{eid}/features&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; \ --H &#39;Accept: application/json;charset=UTF-8; qs=0.09&#39;\ --H &#39;Content-Type: application/json;charset=UTF-8; qs=0.09&#39; \ --d &#39;{ -&lt;JSON of feature data&gt; -}&#39; -</code></pre></li> -<li>We&rsquo;ll start by initializing an extrude in the JSON with the <code>btType</code> and <code>featureType</code> shown below:</li> -</ol> -<pre tabindex="0"><code> { -&#34;btType&#34;: &#34;BTFeatureDefinitionCall-1406&#34;, -&#34;feature&#34;: -{ -&#34;btType&#34;: &#34;BTMFeature-134&#34;, -&#34;featureType&#34;: &#34;extrude&#34;, -&#34;name&#34;: &#34;Extrude 1&#34;, -&#34;suppressed&#34;: false, -&#34;parameters&#34;: [ -] -} -} -</code></pre><ol start="4"> -<li>Now, we&rsquo;ll add values for the options we want to our <code>parameters</code> block. Don&rsquo;t forget to replace <code>{featureId}</code> in the code below with the feature ID of the sketch.</li> -</ol> -<pre tabindex="0"><code> { -&#34;btType&#34;: &#34;BTMParameterEnum-145&#34;, -&#34;value&#34;: &#34;SOLID&#34;, -&#34;enumName&#34;: &#34;ExtendedToolBodyType&#34;, -&#34;parameterId&#34;: &#34;bodyType&#34; -}, -{ -&#34;btType&#34;: &#34;BTMParameterEnum-145&#34;, -&#34;value&#34;: &#34;NEW&#34;, -&#34;enumName&#34;: &#34;NewBodyOperationType&#34;, -&#34;parameterId&#34;: &#34;operationType&#34; -}, -{ -&#34;btType&#34;: &#34;BTMParameterQueryList-148&#34;, -&#34;queries&#34;: [ -{ -&#34;btType&#34;: &#34;BTMIndividualSketchRegionQuery-140&#34;, -&#34;featureId&#34;: &#34;{featureId}&#34; -} -], -&#34;parameterId&#34;: &#34;entities&#34; -}, -{ -&#34;btType&#34;: &#34;BTMParameterEnum-145&#34;, -&#34;value&#34;: &#34;BLIND&#34;, -&#34;enumName&#34;: &#34;BoundingType&#34;, -&#34;parameterId&#34;: &#34;endBound&#34; -}, -{ -&#34;btType&#34;: &#34;BTMParameterQuantity-147&#34;, -&#34;expression&#34;: &#34;1 in&#34;, -&#34;parameterId&#34;: &#34;depth&#34; -} -</code></pre><ol start="5"> -<li>Now our JSON is complete, and we can make our call.</li> -</ol> -<pre tabindex="0"><code> curl -X &#39;POST \ -&#39;https://cad.onshape.com/api/v8/partstudios/d/{did}/{wvm}/{wvmid}/e/{eid}/features&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; \ --H &#39;Accept: application/json;charset=UTF-8; qs=0.09&#39;\ --H &#39;Content-Type: application/json;charset=UTF-8; qs=0.09&#39; \ --d &#39;{ -&#34;btType&#34;: &#34;BTFeatureDefinitionCall-1406&#34;, -&#34;feature&#34;: { -&#34;btType&#34;: &#34;BTMFeature-134&#34;, -&#34;featureType&#34;: &#34;extrude&#34;, -&#34;name&#34;: &#34;Extrude 1&#34;, -&#34;parameters&#34;: [ -{ -&#34;btType&#34;: &#34;BTMParameterEnum-145&#34;, -&#34;value&#34;: &#34;SOLID&#34;, -&#34;enumName&#34;: &#34;ExtendedToolBodyType&#34;, -&#34;parameterId&#34;: &#34;bodyType&#34; -}, -{ -&#34;btType&#34;: &#34;BTMParameterEnum-145&#34;, -&#34;value&#34;: &#34;NEW&#34;, -&#34;enumName&#34;: &#34;NewBodyOperationType&#34;, -&#34;parameterId&#34;: &#34;operationType&#34; -}, -{ -&#34;btType&#34;: &#34;BTMParameterQueryList-148&#34;, -&#34;queries&#34;: [ -{ -&#34;btType&#34;: &#34;BTMIndividualSketchRegionQuery-140&#34;, -&#34;featureId&#34;: &#34;{featureId}&#34; -} -], -&#34;parameterId&#34;: &#34;entities&#34; -}, -{ -&#34;btType&#34;: &#34;BTMParameterEnum-145&#34;, -&#34;value&#34;: &#34;BLIND&#34;, -&#34;enumName&#34;: &#34;BoundingType&#34;, -&#34;parameterId&#34;: &#34;endBound&#34; -}, -{ -&#34;btType&#34;: &#34;BTMParameterQuantity-147&#34;, -&#34;expression&#34;: &#34;1 in&#34;, -&#34;parameterId&#34;: &#34;depth&#34; -} -], -&#34;returnAfterSubfeatures&#34;: false, -&#34;suppressed&#34;: false -} -}&#39; -</code></pre><ol start="6"> -<li>Open your document and confirm that the sketch has been extruded into a cylinder. -</br></br><img src="https://onshape-public.github.io/images/features-extrude-example.png" alt="circle sketch created via features api" width=550></li> -</ol> -<h3 id="update-a-feature">Update a feature</h3> -<p>In this example we&rsquo;ll update our cube feature.</p> -<ol> -<li>Open the document in which you created the cube feature in <a href="#create-a-cube-feature">this example</a>. You will need the following from this document: -<ul> -<li>Document ID</li> -<li>Workspace ID</li> -<li>Element ID (for the element that contains the cube feature)</li> -<li>Feature ID (ID of the cube feature, returned in the API response in the previous example) -<ul> -<li>If you need to get this <code>featureId</code> again, you can call the <a href="https://cad.onshape.com/glassworks/explorer/#/PartStudio/getPartStudioFeatures">getPartStudioFeatures</a> endpoint on the document.</li> -</ul> -</li> -</ul> -</li> -<li>Begin to create the <a href="https://cad.onshape.com/glassworks/explorer/#/PartStudio/updatePartStudioFeature">PartStudio/updatePartStudioFeature</a> call. Replace the URL parameters with the values from your document, and replace <code>CREDENTIALS</code> with your authorization credentials. -<pre tabindex="0"><code>curl -X &#39;POST&#39; \ -&#39;https://cad.onshape.com/api/v8/partstudios/d/{did}/w/{wid}/e/{eid}/features/featureid/{fid}&#39; \ --H &#39;Accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; \ --H &#39;Content-Type: application/json;charset=UTF-8; qs=0.09&#39; \ --d &#39;{ -&lt;JSON of feature data&gt; -}&#39; -</code></pre></li> -<li>Add the following as the JSON body. -<ul> -<li>Note the <code>btType</code> defines this as a Feature.</li> -<li>We specify the <code>featureId</code> again in the request body. This must match the <code>featureId</code> sent in the URL exactly.</li> -<li>We must also specify the feature&rsquo;s <code>featureType</code> and <code>name</code> in this call; if we don&rsquo;t send those fields, the call will attempt to change these values to empty strings, resulting in errors.</li> -<li>The <code>cube</code> feature has one parameter&ndash; the cube <code>sideLength</code> in inches, which we will update to 2 inches:</li> -</ul> -<pre tabindex="0"><code>{ -&#34;btType&#34;: &#34;BTFeatureDefinitionCall-1406&#34;, -&#34;feature&#34;: { -&#34;featureId&#34;: &#34;{fid}&#34;, -&#34;featureType&#34;: &#34;cube&#34;, -&#34;name&#34;: &#34;Cube 1&#34;, -&#34;parameters&#34;: [ -{ -&#34;btType&#34;: &#34;BTMParameterQuantity-147&#34;, -&#34;isInteger&#34;: false, -&#34;expression&#34;: &#34;2 in&#34;, -&#34;parameterId&#34;: &#34;sideLength&#34; -} -] -} -} -</code></pre></li> -<li>Confirm your call matches the following, and then make the call: -<pre tabindex="0"><code> curl -X &#39;POST&#39; \ -&#39;https://cad.onshape.com/api/v8/partstudios/d/{did}/w/{wid}/e/{eid}/features/featureid/{fid}&#39; \ --H &#39;Accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; \ --H &#39;Content-Type: application/json;charset=UTF-8; qs=0.09&#39; \ --d &#39;{ -&#34;btType&#34;: &#34;BTFeatureDefinitionCall-1406&#34;, -&#34;feature&#34;: { -&#34;featureId&#34;: &#34;{fid}&#34;, -&#34;featureType&#34;: &#34;cube&#34;, -&#34;name&#34;: &#34;Cube 1&#34;, -&#34;parameters&#34;: [ -{ -&#34;btType&#34;: &#34;BTMParameterQuantity-147&#34;, -&#34;isInteger&#34;: false, -&#34;expression&#34;: &#34;2 in&#34;, -&#34;parameterId&#34;: &#34;sideLength&#34; -} -] -} -}&#39; -</code></pre></li> -<li>Return to your console to review the endpoint response. The output returns: -<ul> -<li>The updated feature definition</li> -<li>Information that the feature executed correctly</li> -<li>The serialization version and microversion of the document that resulted from the feature update</li> -</ul> -<pre tabindex="0"><code> { -&#34;btType&#34;: &#34;BTFeatureDefinitionResponse-1617&#34;, -&#34;featureState&#34;: { -&#34;btType&#34;: &#34;BTFeatureState-1688&#34;, -&#34;featureStatus&#34;: &#34;OK&#34;, -&#34;inactive&#34;: false -}, -&#34;feature&#34;: { -&#34;btType&#34;: &#34;BTMFeature-134&#34;, -&#34;name&#34;: &#34;Cube 1&#34;, -&#34;suppressed&#34;: false, -&#34;parameters&#34;: [ -{ -&#34;btType&#34;: &#34;BTMParameterQuantity-147&#34;, -&#34;value&#34;: 0, -&#34;units&#34;: &#34;&#34;, -&#34;isInteger&#34;: false, -&#34;expression&#34;: &#34;2 in&#34;, -&#34;nodeId&#34;: &#34;{nid1}&#34;, -&#34;parameterId&#34;: &#34;sideLength&#34; -} -], -&#34;featureId&#34;: &#34;{fid}&#34;, -&#34;nodeId&#34;: &#34;{nid2}, -&#34;featureType&#34;: &#34;cube&#34;, -&#34;returnAfterSubfeatures&#34;: false, -&#34;subFeatures&#34;: [], -&#34;namespace&#34;: &#34;&#34; -}, -&#34;serializationVersion&#34;: &#34;1.2.4&#34;, -&#34;sourceMicroversion&#34;: &#34;{mid}&#34;, -&#34;microversionSkew&#34;: false, -&#34;rejectMicroversionSkew&#34;: false, -&#34;libraryVersion&#34;: 0 -} -</code></pre></li> -<li>Open your document and confirm that the cube has a side length of 2 inches. -</br><img src="https://onshape-public.github.io/images/features-cube-example-03.png" alt="cube added to part studio via features api" width=550></li> -</ol> -<h3 id="delete-a-feature">Delete a feature</h3> -<ol> -<li>Create a new document and add a cube feature to it. See <a href="#create-a-cube-feature">Create a cube feature</a> for instructions. Make a note of the following: -<ul> -<li>Document ID</li> -<li>Workspace ID</li> -<li>Element ID (for the element containing the cube feature)</li> -</ul> -</li> -<li>Call the <a href="https://cad.onshape.com/glassworks/explorer/#/PartStudio/getPartStudioFeatures">getPartStudioFeatures</a> endpoint on the document to get the <code>featureId</code> of the cube feature. See <a href="#get-the-list-of-features-in-a-part-studio">Get the Feature list</a> for instructions.</li> -<li>Create and execute the <a href="https://cad.onshape.com/glassworks/explorer/#/PartStudio/deletePartStudioFeature">PartStudio/deletePartStudioFeature</a> call. Replace the URL parameters with the values from your document, and replace <code>CREDENTIALS</code> with your authorization credentials. -<pre tabindex="0"><code>curl -X &#39;DELETE&#39; \ -&#39;https://cad.onshape.com/api/v8/partstudios/d/{did}/w/{wid}/e/{eid}/features/featureid/{fid}&#39; \ --H &#39;Accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; -</code></pre></li> -<li>Confirm that the cube feature has been removed from your document.</li> -</ol>Docs: Evaluating FeatureScripthttps://onshape-public.github.io/docs/api-adv/fs/Thu, 15 Aug 2024 00:00:00 +0000https://onshape-public.github.io/docs/api-adv/fs/ -<p>This page describes some of the APIs Onshape provides for evaluating <a href="https://cad.onshape.com/FsDoc/">FeatureScript</a>.</p> -<blockquote> -<p>📘 <strong>Notes</strong></p> -<ul> -<li>This page provides sample code as curls. See the <a href="https://curl.se/docs/">curl documentation</a> for more information.</li> -<li>All Onshape API calls must be properly authenticated by replacing the <code>CREDENTIALS</code> variable in the curls below. See the <a href="https://onshape-public.github.io/docs/auth/apikeys">API Keys</a> page for instructions and the <a href="https://onshape-public.github.io/docs/api-intro/quickstart">Quick Start</a> for an example. All applications submitted to the Onshape App Store <em>must</em> authenticate with <a href="https://onshape-public.github.io/docs/auth/oauth">OAuth2</a>.</li> -<li>This documentation refers to Onshape IDs in the following format: <code>{did}, {wid}, {eid}, {pid}, {otherId}</code>. These represent document, workspace, element, part, and other IDs (respectively) that are needed make the API calls. We sometimes abbreviate these variables as <code>DWVEM</code> Please see <a href="https://onshape-public.github.io/docs/api-intro/#onshape-api-request">API Guide: API Intro</a> for information on what these IDs mean and how to obtain them from your documents. Never include the curly braces (<code>{}</code>) in your API calls.</li> -<li>For Enterprise accounts, replace <strong><font color="slate">cad</font></strong> in all Onshape URLs with your company domain. -https://<font color="slate"><strong>cad</strong></font>.onshape.com &gt; https://<font color="slate"><strong>companyName</strong></font>.onshape.com</li> -</ul> -</blockquote> -<h2 id="endpoints">Endpoints</h2> -<ul> -<li><a href="https://cad.onshape.com/glassworks/explorer#/PartStudio/evalFeatureScript">PartStudio/evalFeatureScript</a> -<pre tabindex="0"><code>curl -X &#39;POST&#39; \ -&#39;https://cad.onshape.com/api/v6/partstudios/d/{did}/w/{wid}/e/{eid}/featurescript?rollbackBarIndex=-1&#39; \ --H &#39;accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39;\ --d &#39;{ -&#34;libraryVersion&#34;: 2144, -&#34;script&#34;: &#34;&#34; -} -</code></pre></li> -</ul> -<h2 id="sample-workflows">Sample Workflows</h2> -<h3 id="calculate-a-tight-bounding-box">Calculate a tight bounding box</h3> -<p>Though the Onshape API offers a <a href="https://cad.onshape.com/glassworks/explorer/#/PartStudio/getPartStudioBoundingBoxes">PartStudio/getPartStudioBoundingBoxes</a> endpoint, it does not result in a tight bounding box. The values returned are meant for graphics and visualization, and are approximate. To calculate a more accurate bounding box, we&rsquo;ll use the <a href="https://cad.onshape.com/glassworks/explorer#/PartStudio/evalFeatureScript">PartStudio/evalFeatureScript</a> endpoint.</p> -<ol> -<li>Call the <a href="https://cad.onshape.com/glassworks/explorer#/PartStudio/evalFeatureScript">PartStudio/evalFeatureScript</a>. Replace the URL parameters with the IDs from the Part Studio you&rsquo;re working with, and replace <code>CREDENTIALS</code> with your authorization credentials. The endpoint will return a tight bounding box in the response. -<pre tabindex="0"><code> curl -X &#39;POST&#39; \ -&#39;https://cad.onshape.com/api/v6/partstudios/d/{did}/w/{wid}/e/{eid}/featurescript?rollbackBarIndex=-1&#39; \ --H &#39;accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39;\ --d &#39;{ &#34;libraryVersion&#34;: 2144, -&#34;script&#34;: &#34;function(context is Context, definition is map) {const boundingBoxTight = evBox3d(context, { \n \&#34;topology\&#34; : qConstructionFilter(qEverything(), ConstructionObject.NO),\n \&#34;tight\&#34; : true\n}); \n return (boundingBoxTight);}&#34; -}&#39; -</code></pre></li> -</ol> -<h2 id="additional-resources">Additional Resources</h2> -<ul> -<li><a href="https://cad.onshape.com/FsDoc/">FeatureScript</a></li> -<li><a href="https://cad.onshape.com/glassworks/explorer/#/PartStudio">API Explorer: Part Studio</a></li> -<li><a href="https://onshape-public.github.io/docs/api-intro/explorer">API Guide: API Explorer</a></li> -</ul>Docs: Import & Exporthttps://onshape-public.github.io/docs/api-adv/translation/Wed, 27 Sep 2023 00:00:00 +0000https://onshape-public.github.io/docs/api-adv/translation/ -<p>This page describes the APIs Onshape provides for importing files to Onshape and exporting files from Onshape into different formats. We refer to the process of importing and exporting files from one format to another as <em>translating</em> the files.</p> -<p>Onshape provides several APIs to support this format translation. These fall into three categories:</p> -<ul> -<li><a href="#synchronous-exports">Synchronous exports</a> - Export Onshape content to glTF, STL, or Parasolid format.</li> -<li><a href="#asynchronous-exports">Asynchronous exports</a> - Export Onshape content into a variety of other formats.</li> -<li><a href="#imports">Import to Onshape</a> - Import a translatable file by uploading it to an Onshape blob element.</li> -</ul> -<blockquote> -<p>📘 <strong>Notes</strong></p> -<ul> -<li>This page provides sample code as curls. See the <a href="https://curl.se/docs/">curl documentation</a> for more information.</li> -<li>All Onshape API calls must be properly authenticated by replacing the <code>CREDENTIALS</code> variable in the curls below. See the <a href="https://onshape-public.github.io/docs/auth/apikeys">API Keys</a> page for instructions and the <a href="https://onshape-public.github.io/docs/api-intro/quickstart">Quick Start</a> for an example. All applications submitted to the Onshape App Store <em>must</em> authenticate with <a href="https://onshape-public.github.io/docs/auth/oauth">OAuth2</a>.</li> -<li>This documentation refers to Onshape IDs in the following format: <code>{did}, {wid}, {eid}, {pid}, {otherId}</code>. These represent document, workspace, element, part, and other IDs (respectively) that are needed make the API calls. We sometimes abbreviate these variables as <code>DWVEM</code> Please see <a href="https://onshape-public.github.io/docs/api-intro/#onshape-api-request">API Guide: API Intro</a> for information on what these IDs mean and how to obtain them from your documents. Never include the curly braces (<code>{}</code>) in your API calls.</li> -<li>For Enterprise accounts, replace <strong><font color="slate">cad</font></strong> in all Onshape URLs with your company domain. -https://<font color="slate"><strong>cad</strong></font>.onshape.com &gt; https://<font color="slate"><strong>companyName</strong></font>.onshape.com</li> -</ul> -</blockquote> -<h2 id="synchronous-exports">Synchronous exports</h2> -<p>Onshape provides a simple way to export content to common formats (glTF, Parasolid, and STL). Most of the interfaces defined here operate by requesting an HTTP redirect to a different URL where the request is fulfilled. Applications must explicitly handle the redirect and attachment authentication headers to the follow-up request, or it will fail.</p> -<p>The following endpoints are available. We&rsquo;ve included an example curl with each one.</p> -<ul> -<li><a href="https://cad.onshape.com/glassworks/explorer/#/Part/exportPartGltf">Export Part to glTF</a> -<pre tabindex="0"><code>curl -X &#39;GET&#39; \ -&#39;https://cad.onshape.com/api/v6/parts/d/{did}/w/{wid}/e/{eid}/partid/{partid}/gltf?rollbackBarIndex=-1&amp;outputSeparateFaceNodes=false&amp;outputFaceAppearances=false&#39; \ --H &#39;accept: model/gltf-binary;qs=0.08&#39; \ -</code></pre></li> -<li><a href="https://cad.onshape.com/glassworks/explorer/#/Part/exportPS">Export Part to Parasolid</a> -<pre tabindex="0"><code>curl -X &#39;GET&#39; \ -&#39;https://cad.onshape.com/api/v6/parts/d/{did}/w/{wid}?elementId={eid}&amp;withThumbnails=false&amp;includePropertyDefaults=false&#39; \ --H &#39;accept: application/json;charset=UTF-8; qs=0.09&#39; -</code></pre></li> -<li><a href="https://cad.onshape.com/glassworks/explorer/#/Part/exportStl">Export Part to STL</a> -<pre tabindex="0"><code>curl -X &#39;GET&#39; \ -&#39;https://cad.onshape.com/api/v6/parts/d/{did}/w/{wid}/e/{eid}/partid/{partid}/stl?mode=text&amp;grouping=true&amp;scale=1&amp;units=inch&#39; \ --H &#39;accept: application/octet-stream&#39; -</code></pre></li> -<li><a href="https://cad.onshape.com/glassworks/explorer/#/PartStudio/exportPartStudioGltf">Export PartStudio to glTF</a> -<pre tabindex="0"><code>curl -X &#39;GET&#39; \ -&#39;https://cad.onshape.com/api/v6/partstudios/d/{did}/w/{wid}/e/{eid}/gltf?rollbackBarIndex=-1&amp;outputSeparateFaceNodes=false&amp;outputFaceAppearances=false&#39; \ --H &#39;accept: model/gltf-binary;qs=0.08&#39; -</code></pre></li> -<li><a href="https://cad.onshape.com/glassworks/explorer/#/PartStudio/exportParasolid">Export PartStudio to Parasolid</a> -<pre tabindex="0"><code>curl -X &#39;GET&#39; \ -&#39;https://cad.onshape.com/api/v6/partstudios/d/{did}/w/{wid}/e/{eid}/parasolid?version=0&amp;includeExportIds=false&amp;binaryExport=false&#39; \ --H &#39;accept: */*&#39; -</code></pre></li> -<li><a href="https://cad.onshape.com/glassworks/explorer/#/PartStudio/exportPartStudioStl">Export PartStudio to STL</a> -<pre tabindex="0"><code>curl -X &#39;GET&#39; \ -&#39;https://cad.onshape.com/api/v6/partstudios/d/{did}/w/{wid}/e/{eid}/stl?mode=text&amp;grouping=true&amp;scale=1&amp;units=inch&#39; \ --H &#39;accept: */*&#39; -</code></pre></li> -<li><a href="https://cad.onshape.com/glassworks/explorer/#/Document/export2Json">Export Document to JSON</a> -<pre tabindex="0"><code>curl -X &#39;POST&#39; \ -&#39;https://cad.onshape.com/api/v6/documents/d/{did}/w/{wid}/e/{eid}/export&#39; \ --H &#39;accept: application/octet-stream&#39; \ -</code></pre></li> -</ul> -<h2 id="asynchronous-exports">Asynchronous exports</h2> -<p>The exports in the last section perform the format translation synchronously, returning the output immediately after some processing delay. Other format conversions are more complex and time-consuming, and in many cases, cannot be completed quickly enough to prevent connection errors. Note that the source format for an export is currently always automatically detected by Onshape. Part Studios and Assemblies are known to be <code>ONSHAPE</code> format. File uploads have their type determined by the filename suffix. For example, a file named <em>part7.step</em> is assumed to be in <code>STEP</code> format.</p> -<p>The following asynchronous translation APIs are available:</p> -<ul> -<li><a href="https://cad.onshape.com/glassworks/explorer/#/BlobElement/createBlobTranslation">BlobElement/createBlobTranslation</a>: Export a Blob Element to the specified <code>formatName</code>.</li> -<li><a href="https://cad.onshape.com/glassworks/explorer/#/PartStudio/createPartStudioTranslation">PartStudios/createPartStudioTranslation</a>: Export a Part Studio to the specified <code>formatName</code>.</li> -<li><a href="https://cad.onshape.com/glassworks/explorer/#/Assembly/translateFormat">Assembly/translateFormat</a>: Export an Assembly to the specified <code>formatName</code>.</li> -<li><a href="https://cad.onshape.com/glassworks/explorer/#/Drawing/createDrawingTranslation">Drawing/createDrawingTranslation</a>: Export a Drawing to the specified <code>formatName</code>.</li> -</ul> -<p>These asynchronous exports include a few additional steps, which are explained in more detail in the <a href="#async-export-steps">next section</a>:</p> -<ol> -<li>See what formats are available for exporting your content with <strong><a href="https://cad.onshape.com/glassworks/explorer/#/Translation/getAllTranslatorFormats">Translation/getAllTranslatorFormats</a></strong>.</li> -</ol> -<ul> -<li><strong>Note:</strong> Parts with mesh data cannot be exported to ACIS, IGES, or OBJ format.</li> -</ul> -<ol start="2"> -<li>Call the desired <strong>translation API</strong>. -<ul> -<li>Specify the target <strong><code>formatName</code></strong> in the request body JSON.</li> -<li>Specify <strong><code>storeInDocument=false</code></strong> (default) to export the content to new file.</li> -<li>Specify <strong><code>storeInDocument=true</code></strong> to export the content to a blob element in the source document.</li> -</ul> -</li> -<li>Poll the <strong><code>requestState</code></strong> in the translation response and wait for a result of <strong><code>DONE</code></strong>.</li> -<li>To retrieve the exported results: -<ul> -<li>External files: call <strong><a href="https://cad.onshape.com/glassworks/explorer/#/Document/downloadExternalData">Document/downloadExternalData</a></strong> on the <code>resultExternalDataIds</code> from the translation response.</li> -<li>Blob elements: call <strong><a href="https://cad.onshape.com/glassworks/explorer/#/BlobElement/downloadFileWorkspace">BlobElement/downloadFileWorkspace</a></strong> on the <code>resultElementIds</code> from the translation response.</li> -</ul> -</li> -</ol> -<h3 id="async-export-details">Async export details</h3> -<p>To export your Onshape content to another format:</p> -<ol> -<li>Determine what export format file types are available for your content by calling: <a href="https://cad.onshape.com/glassworks/explorer/#/Translation/getAllTranslatorFormats">Translations/getAllTranslatorFormats</a>. -<ul> -<li>Note that Drawings have their own API for this call: <a href="https://cad.onshape.com/glassworks/explorer/#/Drawing/getDrawingTranslatorFormats">Drawing/getDrawingTranslatorFormats</a></li> -</ul> -</li> -<li>Next, initiate the export by calling one of the asynchronous translation APIs. -<ul> -<li>Note that each of these APIs takes a JSON for specifying options for the export as part of the request body. Refer to the <a href="https://onshape-public.github.io/docs/api-intro/explorer">API Explorer</a> page for help viewing these JSON docs.</li> -<li>The target file format <strong>must be specified in the <code>formatName</code> field</strong> in the request body, and must match a valid format found in Step 1.</li> -<li>By default, <code>storeInDocument</code> is set to <code>false</code> in the request body to export to a single data file (or a zip of multiple files). Set to <code>true</code> to export as blob elements.</li> -</ul> -</li> -<li>Wait for the translation to complete. You can either register a webhook and wait to receive a notifcation that the translation is complete (see <a href="https://onshape-public.github.io/docs/app-dev/webhook/">Webhook Notifications</a>), or you can poll the translation&rsquo;s <code>requestState</code>: -<ul> -<li>You can poll the <code>requestState</code> from the initial translation&rsquo;s response, or you can call <a href="https://cad.onshape.com/glassworks/explorer/#/Translation/getTranslation">Translation/getTranslation</a> on the <code>translationId</code> from the initial translation&rsquo;s response.</li> -<li>When a translation is complete, <code>requestState</code> will change from <code>ACTIVE</code> to either <code>DONE</code> or <code>FAILED</code>.</li> -<li>When <code>requestState=DONE</code>, results are available to be used.</li> -</ul> -</li> -<li>Retrieve the exported results: -<ul> -<li>If you exported to an external file, call <a href="https://cad.onshape.com/glassworks/explorer/#/Document/downloadExternalData">Documents/downloadExternalData</a> to retrieve the exported result. -<ul> -<li>Note that this API takes the source document ID and a &ldquo;foreign ID&rdquo; as required parameters.</li> -<li>Use the <code>resultExternalDataIds</code> from the translation response as the foreign ID (<code>fid</code>).</li> -<li>External data is associated with, but external to, the document used as translation context. This data is not versioned like with in-document data.</li> -</ul> -</li> -<li>If your translation request body specified <code>storeInDocument=true</code>, retrieve the blob element data with <a href="https://cad.onshape.com/glassworks/explorer/#/BlobElement/downloadFileWorkspace">BlobElement/downloadFileWorkspace</a>. -<ul> -<li>The element IDs for the new blob elements can be found in the <code>resultElementIds</code> field in the translation response.</li> -</ul> -</li> -</ul> -</li> -</ol> -<h2 id="imports">Imports</h2> -<p>Files can be imported to Onshape as blob elements. When uploading a file to a blob element, either as a new element or an update to an existing element, if the file is a recognized format for import, it will be translated into <code>ONSHAPE</code> format by default. This behavior can be overridden by the application, if desired.</p> -<ul> -<li><a href="https://cad.onshape.com/glassworks/explorer/#/Translation/createTranslation">Translation/createTranslation</a> -<pre tabindex="0"><code>curl -X &#39;POST&#39; \ -&#39;https://cad.onshape.com/api/v6/translations/d/{did}/w/{wid}&#39; \ --H &#39;accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; \ --H &#39;Content-Type: multipart/form-data&#39; \ --F &#39;storeInDocument=true&#39; \ --F &#39;flattenAssemblies=true --F &#39;file=@/path/filename.ext&#39; --F &#39;formatName=&#39; \ -... -</code></pre></li> -<li><a href="https://cad.onshape.com/glassworks/explorer/#/BlobElement/uploadFileCreateElement">BlobElement/uploadFileCreateElement</a> -<pre tabindex="0"><code>curl -X &#39;POST&#39; \ -&#39;https://cad.onshape.com/api/v6/blobelements/d/{did}/w/{wid}&#39; \ --H &#39;accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; \ --H &#39;Content-Type: multipart/form-data&#39; \ --F &#39;storeInDocument=true&#39; \ --F &#39;file=@/path/filename.ext&#39; --F &#39;formatName=&#39; \ -... -</code></pre></li> -<li><a href="https://cad.onshape.com/glassworks/explorer/#/BlobElement/uploadFileUpdateElement">BlobElement/uploadFileUpdateElement</a> -<pre tabindex="0"><code> curl -X &#39;POST&#39; \ -&#39;https://cad.onshape.com/api/v6/blobelements/d/{did}/w/{wid}/e/{eid}&#39; \ --H &#39;accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; \ --H &#39;Content-Type: multipart/form-data&#39; \ --F &#39;storeInDocument=true&#39; \ --F &#39;locationElementId=&#39; \ --F &#39;file=@/path/filename.ext&#39; -... -</code></pre></li> -</ul> -<p>Note that these endpoints require you to specify the target document ID and workspace ID. You must also include the file to import. These APIs also includes a request body JSON for specifying options for the import.</p> -<ul> -<li>Override the translation to <code>ONSHAPE</code> format by specifying a valid format in the <code>formatName</code> field. Get a list of valid import formats by calling <a href="https://cad.onshape.com/glassworks/explorer/#/Translation/getAllTranslatorFormats">Translation/getAllTranslatorFormats</a>.</li> -<li>Specify <code>storeInDocument=true</code> to import the data as a blob element into the target document. Change to <code>false</code> to only create an external data file.</li> -<li>If the source file contains an assembly and <code>flattenAssemblies=true</code>, the assembly structure is removed and a single part studio is created.</li> -<li>Note that when using cURL, you must begin the path to the file with an <code>@</code> symbol.</li> -</ul> -<h2 id="sample-workflows">Sample Workflows</h2> -<h3 id="export-a-partstudio-to-stl">Export a PartStudio to STL</h3> -<p>We will export the <code>CRANK</code> PartStudio from <a href="https://cad.onshape.com/documents/e60c4803eaf2ac8be492c18e/w/d2558da712764516cc9fec62/e/6bed6b43463f6a46a37b4a22">this public document</a> to an STL file.</p> -<ol> -<li>Call the <a href="https://cad.onshape.com/glassworks/explorer/#/PartStudio/exportPartStudioStl">Part Studios/exportPartStudioStl</a> endpoint on the document: -<pre tabindex="0"><code>curl -X &#39;GET&#39; \ -&#39;https://cad.onshape.com/api/v6/partstudios/d/e60c4803eaf2ac8be492c18e/w/d2558da712764516cc9fec62/e/6bed6b43463f6a46a37b4a22/stl?mode=text&amp;grouping=true&amp;scale=1&amp;units=inch&#39; \ --H &#39;accept: */*&#39; -</code></pre></li> -<li>Navigate to the request URL to download the resulting STL file: -<pre tabindex="0"><code>https://cad.onshape.com/api/v6/partstudios/d/e60c4803eaf2ac8be492c18e/w/d2558da712764516cc9fec62/e/6bed6b43463f6a46a37b4a22/stl?mode=text&amp;grouping=true&amp;scale=1&amp;units=inch -</code></pre></li> -<li>Open the <em>CRANK.stl</em> file from wherever your downloads are saved.</li> -</ol> -<h3 id="export-a-part-to-parasolid">Export a Part to Parasolid</h3> -<p>We will export the <code>FLYWHEEL</code> part from <a href="https://cad.onshape.com/documents/e60c4803eaf2ac8be492c18e/w/d2558da712764516cc9fec62/e/6bed6b43463f6a46a37b4a22">this public document</a> to an STL file.</p> -<ol> -<li>Call the <a href="https://cad.onshape.com/glassworks/explorer/#/Part/getPartsWMV">Part/getPartsWMV</a> endpoint on your document and get all the part IDs: -<pre tabindex="0"><code>curl -X &#39;GET&#39; \ -&#39;https://cad.onshape.com/api/v6/parts/d/e60c4803eaf2ac8be492c18e/w/d2558da712764516cc9fec62?elementId=6bed6b43463f6a46a37b4a22&amp;withThumbnails=false&amp;includePropertyDefaults=false&#39; \ --H &#39;accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; -</code></pre></li> -<li>Locate the part to export (hint: look for <code>name = yourPartName</code>) in the response body. Get the part ID from the <code>partId</code> field. In the example below, <code>partId = JiD</code> for <code>name=FLYWHEEL</code>: -<pre tabindex="0"><code>[ -... -{ -&#34;name&#34; : &#34;FLYWHEEL&#34;, -&#34;state&#34; : &#34;IN_PROGRESS&#34;, -&#34;propertySourceTypes&#34; : { -&#34;57f3fb8efa3416c06701d60f&#34; : 3, -&#34;57f3fb8efa3416c06701d60d&#34; : 3, -&#34;57f3fb8efa3416c06701d61e&#34; : 3, -&#34;57f3fb8efa3416c06701d60e&#34; : 3, -&#34;57f3fb8efa3416c06701d60c&#34; : 3 -}, -&#34;defaultColorHash&#34; : &#34;FzHLKqGeuTBFjmY_2_0&#34;, -&#34;ordinal&#34; : 1, -&#34;isMesh&#34; : false, -&#34;description&#34; : &#34;Flywheel&#34;, -&#34;microversionId&#34; : &#34;bdb504d2d4c948493a87ccf3&#34;, -&#34;partNumber&#34; : &#34;PRT-10241&#34;, -&#34;elementId&#34; : &#34;6bed6b43463f6a46a37b4a22&#34;, -&#34;partId&#34; : &#34;JiD&#34;, -&#34;bodyType&#34; : &#34;solid&#34;, -&#34;customProperties&#34; : { -&#34;57f3fb8efa3416c06701d61e&#34; : &#34;false&#34; -} -... -] -</code></pre></li> -<li>Call the <a href="https://cad.onshape.com/glassworks/explorer/#/Part/exportPS">Part/exportPS</a> endpoint on the FLYWHEEL part: -<pre tabindex="0"><code>curl -X &#39;GET&#39; \ -&#39;https://cad.onshape.com/api/v6/parts/d/e60c4803eaf2ac8be492c18e/w/d2558da712764516cc9fec62/e/6bed6b43463f6a46a37b4a22/partid/JiD/parasolid?version=0&#39; \ --H &#39;accept: application/octet-stream&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; -</code></pre></li> -<li>Navigate to the request URL to download the resulting file: -<pre tabindex="0"><code>https://cad.onshape.com/api/v6/parts/d/e60c4803eaf2ac8be492c18e/w/d2558da712764516cc9fec62/e/6bed6b43463f6a46a37b4a22/partid/JiD/parasolid?version=0 -</code></pre></li> -<li>Open the <em>CRANK.x_t</em> file from your downloads. Note that the file is automatically named after the PartStudio to which the part belongs.</li> -</ol> -<h3 id="export-a-partstudio-to-solidworks">Export a PartStudio to SOLIDWORKS</h3> -<p>We will export the <code>CRANK</code> PartStudio from <a href="https://cad.onshape.com/documents/e60c4803eaf2ac8be492c18e/w/d2558da712764516cc9fec62/e/6bed6b43463f6a46a37b4a22">this public document</a> to a SOLIDWORKS file.</p> -<ol> -<li>Validate that SOLIDWORKS is a supported export file type by calling <a href="https://cad.onshape.com/glassworks/explorer/#/Translation/getAllTranslatorFormats">Translation/getAllTranslatorFormats</a> and confirming that <code>validDestinationFormat=true</code> for <code>translatorName=SOLIDWORKS</code>. -<pre tabindex="0"><code>curl -X &#39;GET&#39; \ -&#39;https://cad.onshape.com/api/v6/translations/translationformats&#39; \ --H &#39;accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; \ -</code></pre><pre tabindex="0"><code>[ -{ -&#34;validSourceFormat&#34;: true, -&#34;validDestinationFormat&#34;: true, -&#34;name&#34;: &#34;SOLIDWORKS&#34;, -&#34;translatorName&#34;: &#34;solidworks&#34;, -&#34;couldBeAssembly&#34;: true -} -] -</code></pre></li> -<li>Initialize the export by calling <a href="https://cad.onshape.com/glassworks/explorer/#/PartStudio/createPartStudioTranslation">PartStudio/createPartStudioTranslation</a>. -<pre tabindex="0"><code>curl -X &#39;POST&#39; \ -&#39;https://cad.onshape.com/api/v6/partstudios/d/e60c4803eaf2ac8be492c18e/w/d2558da712764516cc9fec62/e/6bed6b43463f6a46a37b4a22/translations&#39; \ --H &#39;accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; \ --H &#39;Content-Type: application/json;charset=UTF-8; qs=0.09&#39; \ --d &#39;{ -&#34;formatName&#34;: &#34;SOLIDWORKS&#34;, -&#34;storeInDocument&#34;: false, -&#34;translate&#34;: true -}&#39; -</code></pre><ul> -<li>Note that the API takes a JSON as part of the request body, in which you can specify options for the export.</li> -<li>In this example, we&rsquo;ve just shown a snippet of the entire JSON.</li> -<li>A <code>formatName</code> string must be specified that matches one of the valid formats you found in the last step. In this example, we set <code>formatName</code> to <code>SOLIDWORKS.</code></li> -<li>We want to export this to a new file, so we&rsquo;ll leave <code>storeInDocument</code> set to <code>false</code>.</li> -</ul> -</li> -<li>Next, we poll the <a href="https://cad.onshape.com/glassworks/explorer/#/PartStudio/createPartStudioTranslation">PartStudio/createPartStudioTranslation</a> response until <code>requestState</code> changes from <code>ACTIVE</code> to <code>DONE</code> or <code>FAILED</code>. -<pre tabindex="0"><code>{ -&#34;documentId&#34;: &#34;e60c4803eaf2ac8be492c18e&#34;, -&#34;requestElementId&#34;: &#34;6bed6b43463f6a46a37b4a22&#34;, -&#34;requestState&#34;: &#34;DONE&#34;, -&#34;resultExternalDataIds&#34;: &#34;[{resultId}]&#34;, -... -} -</code></pre></li> -<li>Once <code>requestState=DONE</code>, we can call <a href="https://cad.onshape.com/glassworks/explorer/#/Document/downloadExternalData">Documents/downloadExternalData</a> to retrieve the exported result. -<pre tabindex="0"><code>curl -X &#39;GET&#39; \ -&#39;https://cad.onshape.com/api/v6/documents/d/e60c4803eaf2ac8be492c18e/externaldata/{fid}&#39; -</code></pre><ul> -<li>Use the <code>resultExternalDataIds</code> value from the translation response as the foreign ID (<code>fid</code>).</li> -<li>The new SOLIDWORKS file is returned as the response and will be downloaded to wherever the API call is made.</li> -</ul> -</li> -</ol> -<h3 id="export-an-assembly-to-step">Export an Assembly to STEP</h3> -<p>In this example, we&rsquo;ll export an assembly from <a href="https://cad.onshape.com/documents/e60c4803eaf2ac8be492c18e/w/d2558da712764516cc9fec62/e/23a9385cd48c50167c32d6d1">this public document</a> to a STEP file.</p> -<ol> -<li>Make a copy of <a href="https://cad.onshape.com/documents/e60c4803eaf2ac8be492c18e/w/d2558da712764516cc9fec62/e/23a9385cd48c50167c32d6d1">this public document</a> so you can export the assembly. Make a note of the documentId, workspaceId, and elementId of the assembly in your new document.</li> -<li>Validate that STEP is a supported export file type for assemblies by calling <a href="https://cad.onshape.com/glassworks/explorer/#/Translation/getAllTranslatorFormats">Translation/getAllTranslatorFormats</a> and confirming that <code>validDestinationFormat=true</code> and <code>couldBeAssembly=true</code> for <code>translatorName=STEP</code>. -<pre tabindex="0"><code>curl -X &#39;GET&#39; \ -&#39;https://cad.onshape.com/api/v6/translations/translationformats&#39; \ --H &#39;accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; \ -</code></pre><pre tabindex="0"><code>[ -{ -&#34;validSourceFormat&#34;: true, -&#34;validDestinationFormat&#34;: true, -&#34;name&#34;: &#34;STEP&#34;, -&#34;translatorName&#34;: &#34;step&#34;, -&#34;couldBeAssembly&#34;: true -}, -... -] -</code></pre></li> -<li>Initialize the export by calling <a href="https://cad.onshape.com/glassworks/explorer/#/Assembly/translateFormat">Assembly/translateFormat</a>. Replace <code>{did}</code>, <code>{wid}</code>, and <code>{eid}</code> with the document, workspace, and element IDs from your copied document. Do NOT include the curly braces (<code>{}</code>) in the final call. -<pre tabindex="0"><code>curl -X &#39;POST&#39; \ -&#39;https://cad.onshape.com/api/v6/assemblies/d/{did}/w/{wid}/e/{eid}/translations&#39; \ --H &#39;accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; \ --H &#39;Content-Type: application/json;charset=UTF-8; qs=0.09&#39; \ --d &#39;{ -&#34;allowFaultyParts&#34;: true, -&#34;angularTolerance&#34;: 0.001, -&#34;formatName&#34;: &#34;STEP&#34;, -&#34;storeInDocument&#34;: true -}&#39; -</code></pre><ul> -<li>Note that the API takes a JSON as part of the request body, in which you can specify options for the export.</li> -<li>In the example above, we&rsquo;ve just shown a snippet of the entire JSON where we allow faulty parts to be exported and set the angular tolerance to 0.001.</li> -<li>A <code>formatName</code> string must be specified that matches one of the valid formats you found in the last step. In this example, we set <code>formatName</code> to <code>STEP.</code></li> -<li>Set <code>storeInDocument</code> to <code>true</code> to upload the STEP file as a blob element in your document.</li> -</ul> -</li> -<li>Next, we poll the <a href="https://cad.onshape.com/glassworks/explorer/#/Assembly/translateFormat">Assembly/translateFormat</a> response until <code>requestState</code> changes from <code>ACTIVE</code> to <code>DONE</code> or <code>FAILED</code>. -<pre tabindex="0"><code>{ -&#34;resultDocumentId&#34; : &#34;{did}&#34;, -&#34;resultWorkspaceId&#34; : &#34;{wid}&#34;, -&#34;requestState&#34; : &#34;DONE&#34;, -&#34;requestElementId&#34; : &#34;{eid}&#34;, -&#34;resultExternalDataIds&#34; : [ &#34;{resultExternalId}&#34; ], -&#34;documentId&#34; : &#34;{did}&#34;, -&#34;workspaceId&#34; : &#34;{wid}&#34;, -&#34;resultElementIds&#34; : {resulteid}, -&#34;name&#34; : &#34;GEARBOX_CHUCK&#34;, -&#34;id&#34; : &#34;{translationId}&#34;, -&#34;href&#34; : &#34;https://cad.onshape.com/api/v6/translations/{translationId}&#34; -} -</code></pre></li> -<li>Once <code>requestState=DONE</code>, we make a note of the <code>resultElementId</code> in the response. This is the elementId of the STEP blob.</li> -<li>Now, we can call <a href="https://cad.onshape.com/glassworks/explorer/#/BlobElement/downloadFileWorkspace">BlobElement/downloadFileWorkspace</a> to retrieve the exported results. -<pre tabindex="0"><code>curl -X &#39;GET&#39; \ -&#39;https://cad.onshape.com/api/v6/blobelements/d/{did}/w/{wid}/e/{resulteid}&#39; \ --H &#39;accept: application/octet-stream&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; \ -</code></pre><ul> -<li>Use the <code>resultElementIds</code> value from the translation response as the element ID (<code>{resulteid}</code>).</li> -<li>Note that you can also open your document, click the <code>GEARBOX_CHUCK.STEP</code> tab, and download the file from there.</li> -</ul> -</li> -</ol> -<h3 id="export-a-drawing-as-a-json">Export a Drawing as a JSON</h3> -<p>In this example, we&rsquo;ll export a Drawing from <a href="https://cad.onshape.com/documents/e60c4803eaf2ac8be492c18e/w/d2558da712764516cc9fec62/e/15b07287508246ccd038e31e">this public document</a> to a JSON file. Exporting a Drawing to JSON is useful when you need to gather information about that drawing (for example, finding valid coordinates on which to place an inspection symbol).</p> -<ol> -<li>Make a copy of <a href="https://cad.onshape.com/documents/e60c4803eaf2ac8be492c18e/w/d2558da712764516cc9fec62/e/15b07287508246ccd038e31e">this public document</a> so you can export the assembly. Make a note of the documentId, workspaceId, and elementId of the assembly in your new document.</li> -<li>Validate that JSON is a supported export file type for Drawings by calling <a href="https://cad.onshape.com/glassworks/explorer/#/Drawing/getDrawingTranslatorFormats">Drawing/getDrawingTranslatorFormats</a> and confirming that <code>&quot;name&quot;: &quot;DRAWING_JSON&quot;</code> appears in the response for the drawing element in your copied document. -<pre tabindex="0"><code>curl -X &#39;GET&#39; \ -&#39;https://cad.onshape.com/api/v6/drawings/d/{did}/w/{wid}/e/{eid}/translationformats&#39; \ --H &#39;accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; \ -</code></pre><pre tabindex="0"><code>[ -{ -&#34;name&#34;: &#34;DRAWING_JSON&#34;, -&#34;translatorName&#34;: &#34;drawing_json&#34;, -&#34;couldBeAssembly&#34;: false -}, -... -] -</code></pre></li> -<li>Initialize the export by calling <a href="https://cad.onshape.com/glassworks/explorer/#/Drawing/createDrawingTranslation">Drawing/createDrawingTranslation</a>. Replace <code>{did}</code>, <code>{wid}</code>, and <code>{eid}</code> with the document, workspace, and element IDs from your copied document. Do NOT include the curly braces (<code>{}</code>) in the final call. -<pre tabindex="0"><code>curl -X &#39;POST&#39; \ -&#39;https://cad.onshape.com/api/v6/drawings/d/{did}/w/{wid}/e/{eid}/translations&#39; \ --H &#39;accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; \ --H &#39;Content-Type: application/json;charset=UTF-8; qs=0.09&#39; \ --d &#39;{ -&#34;formatName&#34;: &#34;DRAWING_JSON&#34; -}&#39; -</code></pre><ul> -<li>Note that the API takes a JSON as part of the request body, in which you can specify options for the export.</li> -<li>The only required JSON field is <code>formatName</code>, in which we&rsquo;ve specified the format as found in the <code>getDrawingTranslatorFormats</code> response body.</li> -</ul> -</li> -<li>Next, we poll the <a href="https://cad.onshape.com/glassworks/explorer/#/Drawing/createDrawingTranslation">Drawing/createDrawingTranslation</a> response until <code>requestState</code> changes from <code>ACTIVE</code> to <code>DONE</code> or <code>FAILED</code>. -<pre tabindex="0"><code>{ -&#34;resultDocumentId&#34; : &#34;{did}&#34;, -&#34;resultWorkspaceId&#34; : &#34;{wid}&#34;, -&#34;requestState&#34; : &#34;DONE&#34;, -&#34;requestElementId&#34; : &#34;{eid}&#34;, -&#34;resultExternalDataIds&#34; : [ &#34;{resultExternalId}&#34; ], -&#34;documentId&#34; : &#34;{did}&#34;, -&#34;workspaceId&#34; : &#34;{wid}&#34;, -&#34;resultElementIds&#34; : {eid}, -&#34;name&#34; : &#34;GEARBOX_CHUCK&#34;, -&#34;id&#34; : &#34;{translationId}&#34;, -&#34;href&#34; : &#34;https://cad.onshape.com/api/v6/translations/{translationId}&#34; -} -</code></pre><ul> -<li>Note that you can also call the <a href="https://cad.onshape.com/glassworks/explorer/#/Translation/getTranslation">Translation/getTranslation</a> endpoint on the <code>translationId</code> to see all in-progress translation information.</li> -</ul> -</li> -<li>Once <code>requestState=DONE</code>, we make a note of the <code>&quot;resultElementIds&quot; : {resulteid},</code> in the response. This is the element ID of the JSON blob.</li> -<li>Now, we can call <a href="https://cad.onshape.com/glassworks/explorer/#/BlobElement/downloadFileWorkspace">BlobElement/downloadFileWorkspace</a> to retrieve the exported results. -<pre tabindex="0"><code>curl -X &#39;GET&#39; \ -&#39;https://cad.onshape.com/api/v6/blobelements/d/{did}/w/{wid}/e/{resulteid}&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; \ --H &#39;accept: application/octet-stream&#39; -</code></pre><ul> -<li>Use the <code>{resultExternalId}</code> value from the translation response as the element ID (<code>{resulteid}</code>). Do not include the curly braces in your call.</li> -<li>Note that you can also open your document, click the <code>GEARBOX_CHUCK.JSON</code> tab, and download the file from there.</li> -</ul> -</li> -</ol> -<h3 id="import-a-parasolid-file-as-a-part">Import a Parasolid file as a Part</h3> -<p>In this example, we&rsquo;ll import the <em>FLYWHEEL</em> part from the <em>CRANK.x_t</em> file we created in the <a href="#export-a-part-to-parasolid">Export a Part to Parasolid</a> example.</p> -<ol> -<li>Open or create a new Onshape document in which to import the Part. Make a note of the documentId and workspaceId of your document.</li> -<li>Validate that Parasolid is a supported export file type for imports by calling <a href="https://cad.onshape.com/glassworks/explorer/#/Translation/getAllTranslatorFormats">Translation/getAllTranslatorFormats</a> and confirming that <code>validSourceFormat=true</code> for <code>translatorName=parasolid</code>. -<pre tabindex="0"><code>curl -X &#39;GET&#39; \ -&#39;https://cad.onshape.com/api/v6/translations/translationformats&#39; \ --H &#39;accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; -</code></pre><pre tabindex="0"><code>[ -{ -&#34;validSourceFormat&#34;: true, -&#34;validDestinationFormat&#34;: true, -&#34;name&#34;: &#34;PARASOLID&#34;, -&#34;translatorName&#34;: &#34;parasolid&#34;, -&#34;couldBeAssembly&#34;: true -} -]s -</code></pre></li> -<li>Initialize the import by calling <a href="https://cad.onshape.com/glassworks/explorer/#/Translation/createTranslation">Translation/createTranslation</a>. In this example, the filename is <code>CRANK.x_t</code>. -<pre tabindex="0"><code>curl -X &#39;POST&#39; \ -&#39;https://cad.onshape.com/api/v6/translations/d/{did}/w/{wid}&#39; \ --H &#39;accept: application/json;charset=UTF-8; qs=0.09&#39;s \ --H &#39;Authorization: Basic CREDENTIALS&#39; \ --H &#39;Content-Type: multipart/form-data&#39; \ --F &#39;formatName=&#39; \ --F &#39;flattenAssemblies=true&#39; \ --F &#39;translate=true&#39; \ --F &#39;file=@/pathToFile/CRANK.x_t&#39; \ -</code></pre><ul> -<li>Replace <code>{did}</code> and <code>{wid}</code> in the URL with the document and workspace IDs for the document you want to import the part to.</li> -<li>Note that when using cURL, you must begin the path to the file with an <code>@</code> symbol.</li> -<li>Note that the API takes a JSON as part of the request body, in which you can specify options for the import.</li> -<li>When importing files, the API assumes we are importing to the <code>ONSHAPE</code> file type. You can override this and import to a different file type using the <code>formatName</code> field. In this case, we can leave the <code>formatName</code> field blank to import to the <code>ONSHAPE</code> file type.</li> -</ul> -</li> -<li>Next, we poll the <a href="https://cad.onshape.com/glassworks/explorer/#/Translation/getDocumentTranslations">Translation/getDocumentTranslations</a> response until <code>requestState</code> changes from <code>ACTIVE</code> to <code>DONE</code> or <code>FAILED</code>. -<pre tabindex="0"><code>{ -&#34;requestState&#34; : &#34;DONE&#34;, -&#34;documentId&#34; : &#34;{did}&#34;, -&#34;workspaceId&#34; : &#34;{wid}&#34;, -&#34;resultElementIds&#34; : [ &#34;{resulteid}&#34; ], -&#34;name&#34; : &#34;FLYWHEEL&#34;, -&#34;id&#34; : &#34;{id}&#34;, -&#34;href&#34; : &#34;https://cad.onshape.com/api/v1/translations/{tid}&#34; -} -</code></pre></li> -<li>Once <code>requestState=DONE</code>, we can view the imported file as a Part in our Onshape document. The <code>FLYWHEEL</code> part appears in a new PartStudio named <code>CRANK</code> in our document.</li> -</ol> -<h3 id="export-a-configured-part">Export a configured part</h3> -<p>See the <a href="https://onshape-public.github.io/docs/api-adv/configs">Configurations API Guide</a> for examples.</p> -<h2 id="additional-resources">Additional Resources</h2> -<ul> -<li><a href="https://cad.onshape.com/help/Content/translation.htm">Onshape Help: Translation</a></li> -<li><a href="https://cad.onshape.com/help/Content/Plans/webhooks.htm">Onshape Help: Webhooks</a></li> -<li><a href="https://onshape-public.github.io/docs/app-dev/webhook">API Guide: Webhook Notifications</a></li> -<li><a href="https://onshape-public.github.io/docs/api-intro/explorer">API Explorer</a></li> -</ul>Docs: Metadatahttps://onshape-public.github.io/docs/api-adv/metadata/Wed, 20 Dec 2023 00:00:00 +0000https://onshape-public.github.io/docs/api-adv/metadata/ -<p>This page describes the APIs Onshape provides for working with document metadata.</p> -<blockquote> -<p>📘 <strong>Notes</strong></p> -<ul> -<li>This page provides sample code as curls. See the <a href="https://curl.se/docs/">curl documentation</a> for more information.</li> -<li>All Onshape API calls must be properly authenticated by replacing the <code>CREDENTIALS</code> variable in the curls below. See the <a href="https://onshape-public.github.io/docs/auth/apikeys">API Keys</a> page for instructions and the <a href="https://onshape-public.github.io/docs/api-intro/quickstart">Quick Start</a> for an example. All applications submitted to the Onshape App Store <em>must</em> authenticate with <a href="https://onshape-public.github.io/docs/auth/oauth">OAuth2</a>.</li> -<li>This documentation refers to Onshape IDs in the following format: <code>{did}, {wid}, {eid}, {pid}, {otherId}</code>. These represent document, workspace, element, part, and other IDs (respectively) that are needed make the API calls. We sometimes abbreviate these variables as <code>DWVEM</code> Please see <a href="https://onshape-public.github.io/docs/api-intro/#onshape-api-request">API Guide: API Intro</a> for information on what these IDs mean and how to obtain them from your documents. Never include the curly braces (<code>{}</code>) in your API calls.</li> -<li>For Enterprise accounts, replace <strong><font color="slate">cad</font></strong> in all Onshape URLs with your company domain. -https://<font color="slate"><strong>cad</strong></font>.onshape.com &gt; https://<font color="slate"><strong>companyName</strong></font>.onshape.com</li> -</ul> -</blockquote> -<h2 id="endpoints">Endpoints</h2> -<h3 id="get-metadata">Get Metadata</h3> -<ul> -<li><a href="https://cad.onshape.com/glassworks/explorer/#/Metadata/getWVMetadata">getWVMetadata</a>: Get metadata for a workspace or version. -<pre tabindex="0"><code>curl -X &#39;GET&#39; \ -&#39;https://cad.onshape.com/api/v6/metadata/d/{did}/wv/{wvid}?inferMetadataOwner=false&amp;depth=1&amp;includeComputedProperties=true&amp;includeComputedAssemblyProperties=false&amp;thumbnail=false&#39; \ --H &#39;accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39;\ --H &#39;Content-Type: application/json;charset=UTF-8; qs=0.09&#39; -</code></pre></li> -<li><a href="https://cad.onshape.com/glassworks/explorer/#/Metadata/getWMVEsMetadata">getWMVEsMetadata</a>: Get metadata for all elements in a document. -<pre tabindex="0"><code>curl -X &#39;GET&#39; \ -&#39;https://cad.onshape.com/api/v6/metadata/d/{did}/wv/{wvid}/e?inferMetadataOwner=false&amp;depth=1&amp;includeComputedProperties=true&amp;includeComputedAssemblyProperties=false&amp;thumbnail=false&#39; \ --H &#39;accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; \ --H &#39;Content-Type: application/json;charset=UTF-8; qs=0.09&#39; -</code></pre></li> -<li><a href="https://cad.onshape.com/glassworks/explorer/#/Metadata/getWMVEMetadata">getWMVEMetadata</a>: Get metadata for an element. -<pre tabindex="0"><code>curl -X &#39;GET&#39; \ -&#39;https://cad.onshape.com/api/v6/metadata/d/{did}/wv/{wvid}/e/{eid}?inferMetadataOwner=false&amp;depth=1&amp;includeComputedProperties=true&amp;includeComputedAssemblyProperties=false&amp;thumbnail=false&#39; \ --H &#39;accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Authorization: CREDENTIALS&#39; \ --H &#39;Content-Type: application/json;charset=UTF-8; qs=0.09&#39; -</code></pre></li> -<li><a href="https://cad.onshape.com/glassworks/explorer/#/Metadata/getWMVEPMetadata">getWMVEPMetadata</a>: Get metadata for a part. -<pre tabindex="0"><code>curl -X &#39;GET&#39; \ -&#39;https://cad.onshape.com/api/v6/metadata/d/{did}/wv/{wvid}/e/{eid}/p/{pid}?rollbackBarIndex=-1&amp;inferMetadataOwner=false&amp;includeComputedProperties=true&amp;includeComputedAssemblyProperties=false&amp;thumbnail=false&#39; \ --H &#39;accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39;\ --H &#39;Content-Type: application/json;charset=UTF-8; qs=0.09&#39; -</code></pre></li> -<li><a href="https://cad.onshape.com/glassworks/explorer/#/Metadata/getWMVEPsMetadata">getWMVEPsMetadata</a>: Get metadata for all parts in a document. -<pre tabindex="0"><code>curl -X &#39;GET&#39; \ -&#39;https://cad.onshape.com/api/v6/metadata/d/{did}/wv/{wvid}/e/{eid}/p?inferMetadataOwner=false&amp;includeComputedProperties=true&amp;includeComputedAssemblyProperties=false&amp;thumbnail=false&#39; \ --H &#39;accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39;\ --H &#39;Content-Type: application/json;charset=UTF-8; qs=0.09&#39; -</code></pre></li> -<li><a href="https://cad.onshape.com/glassworks/explorer/#/Metadata/getVEOPStandardContentMetadata">getVEOPStandardContentMetadata</a>: Get metadata for a standard content part. -<ul> -<li><code>{linkedDocumentId}</code>: ID of the document into which the standard content part is inserted.</li> -<li>You can call <a href="https://cad.onshape.com/glassworks/explorer/#/Assembly/getAssemblyDefinition">getAssemblyDefinition</a> to get the other values needed for the call: -<ul> -<li><code>{did}</code>: ID of the document in which the standard content part lives.</li> -<li><code>{vid}</code>: ID of the version in which the standard content part lives.</li> -<li><code>{eid}</code>: ID of the element tab in which the standard content part lives.</li> -<li><code>{pid}</code>: Part ID of the standard content part.</li> -<li><code>{config}</code>: Encoded configuration string.</li> -</ul> -</li> -</ul> -<pre tabindex="0"><code>curl -X &#39;GET&#39; \ -&#39;https://cad.onshape.com/api/metadata/standardcontent/d/{did}/v/{vid}/e/{eid}/p/{pid}?configuration={config}&amp;linkDocumentId={linkDocument}&#39; \ --H &#39;accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; \ --H &#39;Content-Type: application/json;charset=UTF-8; qs=0.09&#39; -</code></pre></li> -</ul> -<h3 id="update-metadata">Update Metadata</h3> -<p>To update metadata, you send a JSON in the API request body. This JSON block must include a <code>jsonType</code> value and a <code>properties</code> object array. Each object in the <code>properties</code> array includes a <code>propertyId</code> and the metadata key/value pairs.</p> -<ul> -<li><a href="https://cad.onshape.com/glassworks/explorer/#/Metadata/updateWVMetadata">updateWVMetadata</a>: Update workspace or version metadata. -<pre tabindex="0"><code>curl -X &#39;POST&#39; \ -&#39;https://cad.onshape.com/api/v6/metadata/d/{did}/wv/{wvid}&#39; \ --H &#39;accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; \ --H &#39;Content-Type: application/json;charset=UTF-8; qs=0.09&#39; \ --d &#39;{ -&#34;jsonType&#34;: (&#34;metadata-workspace&#34; | &#34;metadata-version&#34;) , -&#34;properties&#34;: [ -{ -&#34;propertyId&#34;: &#34;propertyId1&#34;, -&#34;key1&#34;: &#34;value&#34;, -&#34;key2&#34;: &#34;value -}, -{ -&#34;propertyId&#34;: &#34;propertyId2&#34;, -&#34;key1&#34;: &#34;value&#34;, -&#34;key2&#34;: &#34;value -} -] -}&#39; -</code></pre></li> -<li><a href="https://cad.onshape.com/glassworks/explorer/#/Metadata/updateWVEMetadata">updateWVEMetadata</a>: Update element metadata. -<pre tabindex="0"><code>curl -X &#39;POST&#39; \ -&#39;https://cad.onshape.com/api/v6/metadata/d/{did}/wv/{wvid}/e/{eid}&#39; \ --H &#39;accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; \ --H &#39;Content-Type: application/json;charset=UTF-8; qs=0.09&#39; \ --d &#39;{ -&#34;jsonType&#34;: &#34;metadata-element&#34;, -&#34;properties&#34;: [ -{ -&#34;propertyId&#34;: &#34;propertyId&#34;, -&#34;key1&#34;: &#34;value&#34;, -&#34;key2&#34;: &#34;value -} -] -}&#39; -</code></pre></li> -<li><a href="https://cad.onshape.com/glassworks/explorer/#/Metadata/updateWVEPMetadata">updateWVEPMetadata</a>: Update part metadata -<pre tabindex="0"><code>curl -X &#39;POST&#39; \ -&#39;https://cad.onshape.com/api/v6/metadata/d/{did}/wv/{wvid}/e/{eid}/{iden}/{pid}&#39; \ --H &#39;accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; \ --H &#39;Content-Type: application/json;charset=UTF-8; qs=0.09&#39; \ --d &#39;{ -&#34;jsonType&#34;: &#34;metadata-part&#34;, -&#34;properties&#34;: [ -{ -&#34;propertyId&#34;: &#34;propertyId&#34;, -&#34;key1&#34;: &#34;value&#34;, -&#34;key2&#34;: &#34;value -} -] -}&#39; -</code></pre></li> -<li><a href="https://cad.onshape.com/glassworks/explorer/#/Metadata/updateVEOPStandardContentPartMetadata">updateVEOPStandardContentPartMetadata</a>: Update standard content part metadata. -<ul> -<li><code>{linkedDocumentId}</code>: ID of the document into which the standard content part is inserted.</li> -<li>You can call <a href="https://cad.onshape.com/glassworks/explorer/#/Assembly/getAssemblyDefinition">getAssemblyDefinition</a> to get the other values needed for the call: -<ul> -<li><code>{did}</code>, <code>{vid}</code>, <code>{eid}</code>: IDs of the document, version, and element in which the standard content part lives.</li> -<li><code>{companyId}</code>: ID of the company that owns the standard content part. All metadata changes to this standard content part will populate for the entire company.</li> -<li><code>{pid}</code>: Part ID of the standard content part.</li> -<li><code>{config}</code>: Encoded configuration string.</li> -</ul> -</li> -<li>For each <code>items.properties</code> object, include a unique <code>propertyId</code> and at least one key/value metadata pair.</li> -<li>Updates made to standard content are global for all users and documents within the company.</li> -</ul> -<pre tabindex="0"><code>curl -X &#39;POST&#39; \ -&#39;https://cad.onshape.com/api/v6/metadata/standardcontent/d/{did}?linkDocumentId={linkDocumentId}&#39; \ --H &#39;accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; \ --H &#39;Content-Type: application/json;charset=UTF-8; qs=0.09&#39; \ --d &#39;{ -&#34;items&#34;: [ -{ -&#34;href&#34;: &#34;https://cad.onshape.com/api/metadata/standardcontent/d/did/v/vid/e/eid/c/companyId/p/pid?configuration=config&amp;linkDocumentId=linkDocumentId&amp;applyToAllConfigs=true&#34;, -&#34;properties&#34;: [ -{ -&#34;key&#34;: &#34;value&#34;, -&#34;propertyId&#34;: &#34;propertyId1&#34; -}, -{ -&#34;key&#34;: &#34;value&#34;, -&#34;propertyId&#34;: &#34;propertyId2&#34; -} -] -} -] -}&#39; -</code></pre></li> -</ul> -<h2 id="sample-workflows">Sample Workflows</h2> -<h3 id="get-a-part-property">Get a part property</h3> -<p>In this example we&rsquo;ll get the name of a part by getting the metadata from the <code>DRILL_BIT</code> element in <a href="https://cad.onshape.com/documents/e60c4803eaf2ac8be492c18e/w/d2558da712764516cc9fec62/e/958bceb5a2511b572dbbe851">this public document</a>.</p> -<ol> -<li>Call the <a href="https://cad.onshape.com/glassworks/explorer/#/Metadata/getWMVEMetadata">Metadata/getWMVEMetadata</a> endpoint. Replace <code>CREDENTIALS</code> with your authentication credentials: -<pre tabindex="0"><code>curl -X &#39;GET&#39; \ -&#39;https://cad.onshape.com/api/v6/metadata/d/e60c4803eaf2ac8be492c18e/w/d2558da712764516cc9fec62/e/958bceb5a2511b572dbbe851?inferMetadataOwner=false&amp;depth=1&amp;includeComputedProperties=true&amp;includeComputedAssemblyProperties=false&amp;thumbnail=false&#39; \ --H &#39;accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; \ --H &#39;Content-Type: application/json;charset=UTF-8; qs=0.09&#39; -</code></pre></li> -<li>In the response body, confirm that for <code>properties.name=Name</code>, <code>properties.value=DRILL_BIT</code>. -<pre tabindex="0"><code>{ -&#34;jsonType&#34;: &#34;metadata-element&#34;, -&#34;elementType&#34;: 0, -&#34;mimeType&#34;: &#34;onshape/partstudio&#34;, -&#34;elementId&#34;: &#34;958bceb5a2511b572dbbe851&#34;, -&#34;properties&#34;: [ -{ -&#34;name&#34;: &#34;Name&#34;, -&#34;value&#34;: &#34;DRILL_BIT&#34;, -&#34;defaultValue&#34;: null, -&#34;computedPropertyError&#34;: null, -&#34;propertySource&#34;: 0, -... -</code></pre></li> -</ol> -<h3 id="update-a-part-property">Update a part property</h3> -<p>In this example we will update a part&rsquo;s description by getting the current metadata for the part, and then posting an update to that metadata.</p> -<ol> -<li> -<p>Get your document information:</p> -<p>Make a copy of <a href="https://cad.onshape.com/documents/e60c4803eaf2ac8be492c18e/w/d2558da712764516cc9fec62/e/958bceb5a2511b572dbbe851">this public document</a>. Make a note of the new document&rsquo;s document ID, workspace ID, and element ID.</p> -</li> -<li> -<p>Get the ID of the part to update:</p> -<p>Call the <a href="https://cad.onshape.com/glassworks/explorer/#/Part/getPartsWMVE">Part/getPartsWMVE</a> API on your copied document to get a list of part IDs in the element. Only one part exists in the document, with a part ID of <code>JHD</code>.</p> -<pre tabindex="0"><code>{ -&#34;name&#34;: &#34;Main&#34;, -... -&#34;microversionId&#34;: &#34;{mid}&#34;, -&#34;partNumber&#34;: null, -&#34;elementId&#34;: &#34;{eid}&#34;, -&#34;partId&#34;: &#34;JHD&#34;, -&#34;bodyType&#34;: &#34;sheet&#34;, -... -} -</code></pre></li> -<li> -<p>Get the metadata of the part:</p> -<p>We&rsquo;ll call the <a href="https://cad.onshape.com/glassworks/explorer/#/Metadata/getWMVEPMetadata">Metadata/getWMVEPMetadata</a> endpoint to get the current metadata JSON for the part. Don&rsquo;t forget to replace the URL parameters with the IDs from your copied document, and replace <code>CREDENTIALS</code> with your authorization credentials.</p> -<pre tabindex="0"><code>curl -X &#39;GET&#39; \ -&#39;https://cad.onshape.com/api/v6/metadata/d/{did}/w/{wid}/e/{eid}/p/JHD?rollbackBarIndex=-1&amp;inferMetadataOwner=false&amp;includeComputedProperties=true&amp;includeComputedAssemblyProperties=false&amp;thumbnail=false&#39; \ --H &#39;accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; \ --H &#39;Content-Type: application/json;charset=UTF-8; qs=0.09&#39; -</code></pre></li> -<li> -<p>Locate the property to update in the response:</p> -<p>The call returns a response body in JSON format. Scroll to the <code>Description</code> properties block of the JSON response, and notice that the <code>value</code> field is an empty string.</p> -<pre tabindex="0"><code>... -{ -&#34;name&#34;: &#34;Description&#34;, -&#34;value&#34;: &#34;&#34;, -&#34;defaultValue&#34;: null, -&#34;computedPropertyError&#34;: null, -&#34;propertySource&#34;: 3, -&#34;validator&#34;: { }, -&#34;required&#34;: false, -&#34;editable&#34;: true, -&#34;propertyId&#34;: &#34;{propertyId}&#34;, -&#34;editableInUi&#34;: true, -&#34;dateFormat&#34;: null, -&#34;valueType&#34;: &#34;STRING&#34;, -&#34;enumValues&#34;: null, -&#34;multivalued&#34;: false, -&#34;computedAssemblyProperty&#34;: false, -&#34;computedProperty&#34;: false, -&#34;propertyOverrideStatus&#34;: 0 -}, -... -</code></pre></li> -<li> -<p>Find the metadata&rsquo;s property ID:</p> -<p>Copy Description&rsquo;s <code>propertyId</code>. We&rsquo;ll need this ID to update the metadata.</p> -</li> -<li> -<p>Set up the <a href="https://cad.onshape.com/glassworks/explorer/#/Metadata/updateWVEPMetadata">Metadata/updateWVEPMetadata</a> call:</p> -<pre tabindex="0"><code>curl -X &#39;POST&#39; \ -&#39;https://cad.onshape.com/api/v6/metadata/d/{did}/w/{wid}/e/{eid}/p/JHD?rollbackBarIndex=-1&#39; \ --H &#39;accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; \ --H &#39;Content-Type: application/json;charset=UTF-8; qs=0.09&#39; \ -</code></pre></li> -<li> -<p>Add the request JSON to the call:</p> -<p>Note that we need to include the <code>jsonType</code>, the <code>partId</code>, the <code>propertyId</code>, and the value to update.</p> -<pre tabindex="0"><code>-d &#39;{ -&#34;jsonType&#34;: &#34;metadata-part&#34;, -&#34;partId&#34;: &#34;JHD&#34;, -&#34;properties&#34;: [ -{ -&#34;value&#34;: &#34;&#34;, -&#34;propertyId&#34;: &#34;{propertyId}&#34; -} -] -}&#39; -</code></pre></li> -<li> -<p>Add the new property information:</p> -<p>In the request JSON, change the empty Description <code>value</code> string to <code>&quot;Drill bit&quot;</code>:</p> -<pre tabindex="0"><code>-d &#39;{ -&#34;jsonType&#34;: &#34;metadata-part&#34;, -&#34;partId&#34;: &#34;JHD&#34;, -&#34;properties&#34;: [ -{ -&#34;value&#34;: &#34;Drill bit&#34;, -&#34;propertyId&#34;: &#34;{propertyId}&#34; -} -] -}&#39; -</code></pre></li> -<li> -<p>POST the new metadata:</p> -<p>Don&rsquo;t forget to replace the URL parameters and <code>CREDENTIALS</code> with your information.</p> -<pre tabindex="0"><code>curl -X &#39;POST&#39; \ -&#39;https://cad.onshape.com/api/v6/metadata/d/{did}/w/{wid}/e/{eid}/p/JHD?rollbackBarIndex=-1&#39; \ --H &#39;accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; \ --H &#39;Content-Type: application/json;charset=UTF-8; qs=0.09&#39; \ --d &#39;{ -&#34;jsonType&#34;: &#34;metadata-part&#34;, -&#34;partId&#34;: &#34;JHD&#34;, -&#34;properties&#34;: [ -{ -&#34;value&#34;: &#34;Drill bit&#34;, -&#34;propertyId&#34;: &#34;{propertyId}&#34; -} -] -}&#39; -</code></pre></li> -<li> -<p>Confirm your changes:</p> -<p>Repeat steps 3 and 4 to confirm that the Description <code>value</code> for the part is now <code>Drill bit</code>.</p> -</li> -</ol> -<h3 id="update-a-tab-name">Update a tab name</h3> -<p>In this example we will update an element&rsquo;s tab name by getting the current metadata for the element, and then posting an update to that metadata. Remember that in Onshape, an element is typically represented as a tab in the Onshape UI.</p> -<ol> -<li> -<p>Get your document information:</p> -<p>Make a copy of <a href="https://cad.onshape.com/documents/e60c4803eaf2ac8be492c18e/w/d2558da712764516cc9fec62/e/4561b91a53c595c0010d5cdb">this public document</a>. Make a note of the new document&rsquo;s document ID, workspace ID, and element ID. Note the tab name of the element is &ldquo;NEW_PART&rdquo;.</p> -<p></br><img src="https://onshape-public.github.io/images/metadata-update-tab-before.png" alt="Onshape document with NEW_PART tab name" width=950></p> -</li> -<li> -<p>Get the metadata of the element:</p> -<p>We&rsquo;ll call the <a href="https://cad.onshape.com/glassworks/explorer/#/Metadata/getWMVEMetadata">Metadata/getWMVEMetadata</a> endpoint to get the current metadata JSON for the element. Don&rsquo;t forget to replace the URL parameters with the IDs from your copied document, and replace <code>CREDENTIALS</code> with your authorization credentials.</p> -<pre tabindex="0"><code>curl -X &#39;GET&#39; \ -&#39;https://cad.onshape.com/api/v6/metadata/d/{did}/w/{wid}/e/{eid}&#39; \ --H &#39;accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; \ --H &#39;Content-Type: application/json;charset=UTF-8; qs=0.09&#39; -</code></pre></li> -<li> -<p>Locate the property to update in the response:</p> -<p>The call returns a response body in JSON format. Scroll to the <code>Name</code> properties block of the JSON response, and notice that the <code>value</code> field matches our current tab name, &ldquo;NEW_PART&rdquo;.</p> -<pre tabindex="0"><code>{ -&#34;jsonType&#34;: &#34;metadata-element&#34;, -&#34;elementType&#34;: 0, -&#34;mimeType&#34;: &#34;onshape/partstudio&#34;, -&#34;elementId&#34;: &#34;{eid}&#34;, -&#34;properties&#34;: [ -{ -&#34;name&#34;: &#34;Name&#34;, -&#34;value&#34;: &#34;NEW_PART&#34;, -&#34;validator&#34;: {}, -&#34;required&#34;: true, -&#34;editable&#34;: true, -&#34;propertyId&#34;: &#34;{propertyId}&#34;, -}, -... -], -... -} -</code></pre></li> -<li> -<p>Find the metadata&rsquo;s property ID:</p> -<p>Copy the Name block&rsquo;s <code>propertyId</code> in the response. We&rsquo;ll need this ID to update the metadata.</p> -</li> -<li> -<p>Set up the <a href="https://cad.onshape.com/glassworks/explorer/#/Metadata/updateWVEMetadata">updateWVEMetadata</a> call:</p> -<pre tabindex="0"><code>curl -X &#39;POST&#39; \ -&#39;https://cad.onshape.com/api/v6/metadata/d/{did}/w/{wid}/e/{eid}&#39; \ --H &#39;accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; \ --H &#39;Content-Type: application/json;charset=UTF-8; qs=0.09&#39; \ -</code></pre></li> -<li> -<p>Add the request JSON to the call:</p> -<p>Note that we need to include the <code>propertyId</code> and the value to update.</p> -<pre tabindex="0"><code>-d &#39;{ -&#34;properties&#34;: [ -{ -&#34;value&#34;: &#34;&#34;, -&#34;propertyId&#34;: &#34;{propertyId}&#34; -} -] -}&#39; -</code></pre></li> -<li> -<p>Add the new property information:</p> -<p>In the request JSON, replace <code>{propertyId}</code> with the property ID you found in Step 4, then change the empty <code>value</code> string to <code>&quot;PISTON&quot;</code>:</p> -<pre tabindex="0"><code>-d &#39;{ -&#34;properties&#34;: [ -{ -&#34;value&#34;: &#34;PISTON&#34;, -&#34;propertyId&#34;: &#34;{propertyId}&#34; -} -] -}&#39; -</code></pre></li> -<li> -<p>POST the new metadata:</p> -<p>Don&rsquo;t forget to replace the URL parameters and <code>CREDENTIALS</code> with your information.</p> -<pre tabindex="0"><code>curl -X &#39;POST&#39; \ -&#39;https://cad.onshape.com/api/v6/metadata/d/{did}/w/{wid}/e/{eid}&#39; \ --H &#39;accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; \ --H &#39;Content-Type: application/json;charset=UTF-8; qs=0.09&#39; \ --d &#39;{ -&#34;properties&#34;: [ -{ -&#34;value&#34;: &#34;PISTON&#34;, -&#34;propertyId&#34;: &#34;{propertyId}&#34; -} -] -}&#39; -</code></pre></li> -<li> -<p>Confirm your changes:</p> -<p>Open your document and confirm that the tab name is now <code>PISTON</code>.</p> -<p></br><img src="https://onshape-public.github.io/images/metadata-update-tab-after.png" alt="Onshape document with NEW_PART tab name" width=950></p> -</li> -</ol> -<h2 id="additional-resources">Additional Resources</h2> -<ul> -<li><a href="https://cad.onshape.com/glassworks/explorer/#/Metadata">API Explorer: Metadata</a></li> -<li><a href="https://onshape-public.github.io/docs/api-intro/explorer">API Guide: API Explorer</a></li> -</ul>Docs: Response Codeshttps://onshape-public.github.io/docs/api-adv/errors/Wed, 03 Apr 2024 00:00:00 +0000https://onshape-public.github.io/docs/api-adv/errors/ -<p>This page details some of the response codes that may be returned by Onshape API endpoints. For each response code, we&rsquo;ve provided a brief description of the response and recommended next steps.</p> -<h2 id="success-2xx">Success (2xx)</h2> -<p>The client call was successful.</p> -<h3 id="200---ok">200 - OK</h3> -<p>The client call was successful. No action needed.</p> -<h3 id="204---no-content">204 - No Content</h3> -<p>The client call was successful, and there&rsquo;s nothing to return in the response body. The empty response body cannot be parsed.</p> -<h2 id="redirect-3xx">Redirect (3xx)</h2> -<h3 id="307---temporary-redirect">307 - Temporary Redirect</h3> -<p>The client call was successful, and a redirection URL was returned. Follow the URL provided in the response.</p> -<h2 id="client-error-4xx">Client Error (4xx)</h2> -<p>There’s an error with the client request. Find the error code below, and follow the instructions for resolution.</p> -<h3 id="400---bad-request">400 - Bad Request</h3> -<p>The request cannot be processed by the server due a client-side error. This could be a malformed request syntax or other issue. Check the request parameters (GET and POST) and request body (POST) to determine the cause of the failure.</p> -<h3 id="401---unauthorized">401 - Unauthorized</h3> -<p>The request failed the authentication/authorization checks. This could mean that the client is not logged in, API keys are invalid, OAuth failed, etc. Make sure the client is <a href="https://onshape-public.github.io/docs/auth/">authenticated</a>.</p> -<h3 id="403---forbidden">403 - Forbidden</h3> -<p>The client doesn’t have the correct permissions to perform this operation. Check that the <a href="https://onshape-public.github.io/docs/auth/">API Keys or OAuth authentication</a> have sufficient permissions to perform the operation. For example, POST operations typically require <code>write</code> scope; if the API Key was created with only <code>read</code> scope, the server will return a 403 error.</p> -<p>You might also need to check document and user permissions. For more details, see <a href="https://cad.onshape.com/help/Content/sharedocuments.htm">Share Documents</a> (for everyone) and <a href="https://cad.onshape.com/help/Content/EnterpriseHelp/Content/permission_schemes.htm">Understanding and Administering Project Roles and Permission Schemes</a> (for Enterprise users and administrators).</p> -<h3 id="404---not-found">404 - Not Found</h3> -<p>The server can’t find what the client is looking for. For example, a 404 error will be returned if the client tries to make a GET request for a document that doesn’t exist.</p> -<h3 id="405---method-not-allowed">405 - Method Not Allowed</h3> -<p>Use of that method is not supported. For example, you cannot perform a DELETE request on a document version, because versions are read-only. Only GET requests on document versions are allowed.</p> -<h3 id="406----not-acceptable">406 - Not Acceptable</h3> -<p>The server cannot provide a response for the media type requested. See <a href="https://datatracker.ietf.org/doc/html/rfc2616#section-6.1.1">https://datatracker.ietf.org/doc/html/rfc2616#section-6.1.1</a>.</p> -<h3 id="409---conflict">409 - Conflict</h3> -<p>The client call includes duplicate values, causing a conflict. Modify the request to remove any conflicting values.</p> -<h3 id="415---media-type-not-supported">415 - Media Type Not Supported</h3> -<p>The client call includes unsupported data types or invalid JSON. Review the client code. When performing data imports and exports, follow all <a href="https://onshape-public.github.io/docs/api-adv/translation/">Translation guidelines</a> to ensure all media and file types are supported.</p> -<h3 id="429---too-many-requests">429 - Too Many Requests</h3> -<p>The client sent too many requests to a particular endpoint in a given time window. The number of requests allowed per time window vary and are subject to change. Onshape does not publish this information. If the client receives HTTP 429 responses, delay and then retry, or reduce its request rate.</p> -<h3 id="499---timeout">499 - Timeout</h3> -<p>This call is taking too long. Please try again later.</p> -<h2 id="server-error-5xx">Server Error (5xx)</h2> -<p>There’s an error with the Onshape servers. Find the error code below, and follow the instructions for resolution.</p> -<h3 id="500---internal-server-error">500 - Internal Server Error</h3> -<p>The request resulted in an error. Set a limit for the number of retries, and if the request continues to fail, reach out to <a href="api-support@onshape.com">support</a>.</p> -<h3 id="503---service-unavailable">503 - Service Unavailable</h3> -<p>Something is wrong with the Onshape servers. Retry after the delay specified in the response. Set a limit for the number of retries, and if the request continues to fail, reach out to <a href="api-support@onshape.com">support</a>.</p> \ No newline at end of file +API Guides onhttps://onshape-public.github.io/docs/api-adv/Recent content in API Guides onHugoen-usThu, 15 Aug 2024 00:00:00 +0000Assemblieshttps://onshape-public.github.io/docs/api-adv/assemblies/Tue, 13 Aug 2024 00:00:00 +0000https://onshape-public.github.io/docs/api-adv/assemblies/This page describes the APIs Onshape provides for working with assemblies. +📘 Notes +This page provides sample code as curls. See the curl documentation for more information. All Onshape API calls must be properly authenticated by replacing the CREDENTIALS variable in the curls below. See the API Keys page for instructions and the Quick Start for an example. All applications submitted to the Onshape App Store must authenticate with OAuth2. This documentation refers to Onshape IDs in the following format: {did}, {wid}, {eid}, {pid}, {otherId}.Associativityhttps://onshape-public.github.io/docs/api-adv/associativity/Mon, 18 May 2020 20:28:26 -0400https://onshape-public.github.io/docs/api-adv/associativity/Onshape does not expose a persistent ID for any of these entities. When the model changes, the ID may change. Therefore, Onshape provides an API to enable mapping IDs from a previous microversion to the current microversion. Assuming a simple case of maintaining associativity for a face, an abstract workflow might be: +Read the tessellated model data. Select the face of interest. Store the Face ID and Document Microversion ID for the face.Billinghttps://onshape-public.github.io/docs/api-adv/billing/Mon, 18 May 2020 20:29:36 -0400https://onshape-public.github.io/docs/api-adv/billing/This document describes APIs that will allow partners to interact with the Onshape billing system. +Please address questions to &ldquo;api-support@onshape.com&rdquo; for the fastest response. +Overview All billing is done through &ldquo;plans&rdquo; that are created in the Developer Portal. A “plan” has the following attributes: +Name (also called SKU) A unique (within your company) plan name Description A user-visible description of the plan Amount The cost of the plan (may be one-time or recurring, depending on the type) Type Monthly, One-time or Consumable Onshape defines three kinds of plans:Configurationshttps://onshape-public.github.io/docs/api-adv/configs/Fri, 05 Apr 2024 00:00:00 +0000https://onshape-public.github.io/docs/api-adv/configs/This page describes the APIs Onshape provides for working with Configurations. +You can use Configurations to create variations of entire Part Studios, Assemblies, specific parts and more. You can configure feature and parameter values, part properties, custom part properties, face and part appearances, and sketch text. Each Part Studio can have only one Configuration, but it can contain multiple Configuration inputs. The Configuration inputs you define for a Part Studio become options when inserting that Part Studio into an Assembly or Drawing.Drawingshttps://onshape-public.github.io/docs/api-adv/drawings/Thu, 12 Oct 2023 00:00:00 +0000https://onshape-public.github.io/docs/api-adv/drawings/This page describes the APIs Onshape provides for creating and manipulating Onshape drawings. +📘 Notes +This page provides sample code as curls. See the curl documentation for more information. All Onshape API calls must be properly authenticated by replacing the CREDENTIALS variable in the curls below. See the API Keys page for instructions and the Quick Start for an example. All applications submitted to the Onshape App Store must authenticate with OAuth2.Featureshttps://onshape-public.github.io/docs/api-adv/featureaccess/Mon, 18 May 2020 20:37:28 -0400https://onshape-public.github.io/docs/api-adv/featureaccess/This page describes the APIs Onshape provides for creating and manipulating features and the Feature List in a Part Studio. +📘 Notes +This page provides sample code as curls. See the curl documentation for more information. All Onshape API calls must be properly authenticated by replacing the CREDENTIALS variable in the curls below. See the API Keys page for instructions and the Quick Start for an example. All applications submitted to the Onshape App Store must authenticate with OAuth2.Evaluating FeatureScripthttps://onshape-public.github.io/docs/api-adv/fs/Thu, 15 Aug 2024 00:00:00 +0000https://onshape-public.github.io/docs/api-adv/fs/This page describes some of the APIs Onshape provides for evaluating FeatureScript. +📘 Notes +This page provides sample code as curls. See the curl documentation for more information. All Onshape API calls must be properly authenticated by replacing the CREDENTIALS variable in the curls below. See the API Keys page for instructions and the Quick Start for an example. All applications submitted to the Onshape App Store must authenticate with OAuth2.Import & Exporthttps://onshape-public.github.io/docs/api-adv/translation/Wed, 27 Sep 2023 00:00:00 +0000https://onshape-public.github.io/docs/api-adv/translation/This page describes the APIs Onshape provides for importing files to Onshape and exporting files from Onshape into different formats. We refer to the process of importing and exporting files from one format to another as translating the files. +Onshape provides several APIs to support this format translation. These fall into three categories: +Synchronous exports - Export Onshape content to glTF, STL, or Parasolid format. Asynchronous exports - Export Onshape content into a variety of other formats.Metadatahttps://onshape-public.github.io/docs/api-adv/metadata/Wed, 20 Dec 2023 00:00:00 +0000https://onshape-public.github.io/docs/api-adv/metadata/This page describes the APIs Onshape provides for working with document metadata. +📘 Notes +This page provides sample code as curls. See the curl documentation for more information. All Onshape API calls must be properly authenticated by replacing the CREDENTIALS variable in the curls below. See the API Keys page for instructions and the Quick Start for an example. All applications submitted to the Onshape App Store must authenticate with OAuth2.Response Codeshttps://onshape-public.github.io/docs/api-adv/errors/Wed, 03 Apr 2024 00:00:00 +0000https://onshape-public.github.io/docs/api-adv/errors/This page details some of the response codes that may be returned by Onshape API endpoints. For each response code, we&rsquo;ve provided a brief description of the response and recommended next steps. +Success (2xx) The client call was successful. +200 - OK The client call was successful. No action needed. +204 - No Content The client call was successful, and there&rsquo;s nothing to return in the response body. The empty response body cannot be parsed. \ No newline at end of file diff --git a/docs/api-adv/metadata/index.html b/docs/api-adv/metadata/index.html index 67b3617..4214234 100644 --- a/docs/api-adv/metadata/index.html +++ b/docs/api-adv/metadata/index.html @@ -1,15 +1,12 @@ -Metadata | Metadata |

    Metadata

    This page describes the APIs Onshape provides for working with document metadata.

    📘 Notes

    \ No newline at end of file diff --git a/docs/api-adv/translation/index.html b/docs/api-adv/translation/index.html index 6f57691..6477c89 100644 --- a/docs/api-adv/translation/index.html +++ b/docs/api-adv/translation/index.html @@ -1,11 +1,12 @@ -Import & Export | Import & Export |

    Import & Export

    This page describes the APIs Onshape provides for importing files to Onshape and exporting files from Onshape into different formats. We refer to the process of importing and exporting files from one format to another as translating the files.

    Onshape provides several APIs to support this format translation. These fall into three categories:

    📘 Notes

    \ No newline at end of file diff --git a/docs/api-intro/architecture/index.html b/docs/api-intro/architecture/index.html index 1979782..2f31fed 100644 --- a/docs/api-intro/architecture/index.html +++ b/docs/api-intro/architecture/index.html @@ -1,5 +1,5 @@ -Architecture |

    Architecture

    Design in Onshape typically beings with a document, which is the container that includes all content related to a specific design. All data in an Onshape document is stored in Elements. Part Studios and Assemblies are two of the most common element types in a design. Throughout the design process, creating versions can be useful for product development management while working on the “Main” workspace. See also:

    • The API Introduction page for information on how documents, workspaces, and elements are assembled into a URL.
    • The Associativity page for information on how Parts, Assemblies, and Elements relate to each other.

    Elements

    All data in an Onshape document are stored in Elements (represented as tabs in the user interface). Onshape documents contain five kinds of elements:

    • Part Studio: Contains zero or more parts
    • Assembly: Contains zero or more parts or assemblies
    • Blob (Binary Large OBject): Can be provided by a partner or by the end user. For example, the user can upload a PDF file, an image, or a text file. Partner applications can store arbitrary data, but we recommend using the structured storage available in an element for better integration.
    • Application: Presents an iframe to the user. The user interface is managed by a server that can be provided by a third-party. Onshape Drawings are a special case of an application element.
    • Feature Studio: Contains the definition for Onshape Features, which are defined in FeatureScript.

    Workspaces, Versions, and Microversions

    A document is stored in Onshape as a collection of changes.

    • You can think of a workspace as a branch of the document, similar to a branch in a source control system. Documents can be branched to create new workspaces.
    • Each individual change to the document creates a new document microversion. As the document is edited, changes are applied to the active workspace, creating new microversions.
    • Periodically, the user may designate versions of the document. A version is a named snapshot of the entire document at some point in time (that is, at some microversion).

    You cannot change a version or microversion of a document; all changes are applied to a workspace (and create a new microversion). Thus, while in general the GET methods of the API can read from a version, microversion, or workspace, the POST methods generally require a workspace, and create a new microversion when data is written to the document. (An exception is that it is possible to set metadata within a version; this does not create a new microversion).

    The following IDs are used by many of the APIs. Each ID (except for Geometry IDs such as Part, Face and Edge) is a 24-character string that is used internally by Onshape to uniquely identify the resource. The Geometry IDs are variable-length strings used to resolve to a specific geometric entity within a model.

    IDDescription
    User IDIdentifies a single user.
    Document IDIdentifies a document. The logged-in user must have access to the requested document for the API to succeed.
    Workspace IDThe Workspace ID identifies a workspace within the document. Workspaces are used to distinguish between different branches of the document.
    Version IDThe Version ID identifies a specific named version.
    Microversion IDThe Microversion ID identifies an internal revision of the document.
    Element IDThe Element ID identifies an element within the document.
    Part ID
    Face ID
    Edge ID
    The Part ID identifies a part within a part studio. The Part ID should generally not be stored for long-term use, as it is only expected to be valid during the course of a session.

    Note that a Part ID may reference a part that no longer exists if the model is changed, so it is best to specify a Version or Microversion to pick the context for the Part ID. Note that even with the Version or Microversion, internal changes to the Onshape system may also change the Part ID. Onshape provides mechanisms for maintaining persistent references. See the Associativity page for more information. Face and Edge IDs are used in similar ways.

    The following table identifies Onshape concepts and the corresponding Git concepts. Note that this is not a direct mapping, and the implementation of the concepts is very different.

    Onshape conceptGit concept
    DocumentRepository
    ElementFile
    WorkspaceBranch
    VersionTag
    MicroversionCommit

    Linked Documents

    Although a document can contain a complex model tree involving many Part Studio and Assembly elements, it is often more efficient to split the content into multiple documents. Connections between documents always refer to a specific version of the target document. Once a version is used as the target of a linked document, that document version is preserved as long as any document references it, even if the containing document is deleted. Additionally, any user that has access to the referring document will have limited read access to the target document, regardless of what permissions are currently on the target document.

    Configurations

    Onshape Part Studios can be constructed to be configurable using Onshape Configurations. API calls that reference Part Studios (primarily within the Parts and Part Studios APIs) often accept a configuration parameter that identifies what specific configuration of the Part Studios is being referenced. When not specified, the API implementation typically uses the configuration that is currently selected within the Part Studio. An interactive ad-hoc API call might not behave consistently in an application, so be sure to specify the configuration parameter where applicable.

    Onshape Data Model

    Onshape data is stored in replicated databases in the cloud. The Onshape data model is influenced by the Git data model and similar source code repositories.

    Documents contain elements. Elements are presented as tabs in the user interface. With some exceptions, all data in a document is stored within an element. The following table describes what data stored in each Element type:

    Element TypeDescription
    Part StudioEach Part Studio contains exactly one Feature list. The Feature list contains Features such as sketches, planes, extrudes, etc. Each Feature contains one or parameters. Whenever the Feature list changes, the parametric history is evaluated, and the model is regenerated.
    AssemblyEach Assembly contains an assembly tree, which contains parts and/or other assemblies (sub-assemblies), along with mate information. Onshape provides an API call to retrieve the assembly tree definition.
    BlobEach Blob element contains an uninterpreted binary object that has been uploaded to Onshape, typically from a file. Onshape depends on the browser client to display some blob data (e.g., PDF and image data), but does not interpret the data. A blob element can be updated with new data.
    ApplicationEach Application element contains zero or more sub-elements, providing a structured set of transactional data that is defined and managed by an application. Application data can be displayed in the Onshape tab in an iframe; the application is responsible for rendering the data in the iframe from its server.

    Note that Onshape Drawing elements are Application elements managed by Onshape.

    Tessellated data is not stored persistently in Onshape; it is generated on demand for display by the Onshape clients, or in response to application REST API requests. This data may be cached for performance.

    Document data

    All elements, including Assemblies, Part Studios, Drawings, or even apps, are history based. Each change to an element or set of elements represents a unique record in the document’s history, known as a microversion. The document can be restored to that particular state any time in the future.

    Part Studio data

    The Part Studio element is defined by a list of features, some of which (e.g., a sketch), may have a complex internal structure composed of entities. Part Studio features and entities are referenced by unique persistent identifiers. Part Studio features and entities can appear, disappear, and reappear depending on the current microversion of the model.

    Assembly data

    The Assembly element is defined as a list of assembly features and a tree of subassemblies/part instances. Occurrence ID is a unique persistent identifier of an occurrence of a part in the assembly structure.

    External application data

    An external application has complete control over how it manages/stores documents, however, to take advantage of the Onshape data model, there is a set of endpoints they should use to store state. These are collectively known as the AppElement API.

    Model presentation data

    A valid model definition usually corresponds to a real-world manufacturable topology, represented internally as a set of parts, faces, edges, and vertices and the set of relations between them. Each of these has a unique identifier in every state of the model. The identifier represents an encoded index in the model’s history, and its value depends on the structure of the model’s history. The value is not guaranteed to be preserved across model changes, and will almost always change if the model changes in significant ways. The model can be tessellated into a set of geometric primitives, which approximate the shape of the model. Tessellated data can be used for visual representation of the model or other processing related to the shape of the model.

    The following changes in the topological representation can occur between two microversions of the model:

    • New topological entities appear
    • Id of existing topology change
    • Topological entities disappear
    • Existing topological entities are merged into a single entity
    • Existing topological entity are split into multiple entities

    The model microversion and topology ID can be used to identify topological entities across the model changes. Topology ID defined in a specific microversion can be translated into a set of topology IDs in the current microversion of the model. (The Topology ID is sometimes referred to as a Deterministic ID within Onshape, and is exposed in specific API calls as partId, faceId, etc.). See the PartStudio APIs to see what topology IDs are exposed.

    \ No newline at end of file +Architecture |

    Architecture

    Design in Onshape typically beings with a document, which is the container that includes all content related to a specific design. All data in an Onshape document is stored in Elements. Part Studios and Assemblies are two of the most common element types in a design. Throughout the design process, creating versions can be useful for product development management while working on the “Main” workspace. See also:

    • The API Introduction page for information on how documents, workspaces, and elements are assembled into a URL.
    • The Associativity page for information on how Parts, Assemblies, and Elements relate to each other.

    Elements

    All data in an Onshape document are stored in Elements (represented as tabs in the user interface). Onshape documents contain five kinds of elements:

    • Part Studio: Contains zero or more parts
    • Assembly: Contains zero or more parts or assemblies
    • Blob (Binary Large OBject): Can be provided by a partner or by the end user. For example, the user can upload a PDF file, an image, or a text file. Partner applications can store arbitrary data, but we recommend using the structured storage available in an element for better integration.
    • Application: Presents an iframe to the user. The user interface is managed by a server that can be provided by a third-party. Onshape Drawings are a special case of an application element.
    • Feature Studio: Contains the definition for Onshape Features, which are defined in FeatureScript.

    Workspaces, Versions, and Microversions

    A document is stored in Onshape as a collection of changes.

    • You can think of a workspace as a branch of the document, similar to a branch in a source control system. Documents can be branched to create new workspaces.
    • Each individual change to the document creates a new document microversion. As the document is edited, changes are applied to the active workspace, creating new microversions.
    • Periodically, the user may designate versions of the document. A version is a named snapshot of the entire document at some point in time (that is, at some microversion).

    You cannot change a version or microversion of a document; all changes are applied to a workspace (and create a new microversion). Thus, while in general the GET methods of the API can read from a version, microversion, or workspace, the POST methods generally require a workspace, and create a new microversion when data is written to the document. (An exception is that it is possible to set metadata within a version; this does not create a new microversion).

    The following IDs are used by many of the APIs. Each ID (except for Geometry IDs such as Part, Face and Edge) is a 24-character string that is used internally by Onshape to uniquely identify the resource. The Geometry IDs are variable-length strings used to resolve to a specific geometric entity within a model.

    IDDescription
    User IDIdentifies a single user.
    Document IDIdentifies a document. The logged-in user must have access to the requested document for the API to succeed.
    Workspace IDThe Workspace ID identifies a workspace within the document. Workspaces are used to distinguish between different branches of the document.
    Version IDThe Version ID identifies a specific named version.
    Microversion IDThe Microversion ID identifies an internal revision of the document.
    Element IDThe Element ID identifies an element within the document.
    Part ID
    Face ID
    Edge ID
    The Part ID identifies a part within a part studio. The Part ID should generally not be stored for long-term use, as it is only expected to be valid during the course of a session.

    Note that a Part ID may reference a part that no longer exists if the model is changed, so it is best to specify a Version or Microversion to pick the context for the Part ID. Note that even with the Version or Microversion, internal changes to the Onshape system may also change the Part ID. Onshape provides mechanisms for maintaining persistent references. See the Associativity page for more information. Face and Edge IDs are used in similar ways.

    The following table identifies Onshape concepts and the corresponding Git concepts. Note that this is not a direct mapping, and the implementation of the concepts is very different.

    Onshape conceptGit concept
    DocumentRepository
    ElementFile
    WorkspaceBranch
    VersionTag
    MicroversionCommit

    Linked Documents

    Although a document can contain a complex model tree involving many Part Studio and Assembly elements, it is often more efficient to split the content into multiple documents. Connections between documents always refer to a specific version of the target document. Once a version is used as the target of a linked document, that document version is preserved as long as any document references it, even if the containing document is deleted. Additionally, any user that has access to the referring document will have limited read access to the target document, regardless of what permissions are currently on the target document.

    Configurations

    Onshape Part Studios can be constructed to be configurable using Onshape Configurations. API calls that reference Part Studios (primarily within the Parts and Part Studios APIs) often accept a configuration parameter that identifies what specific configuration of the Part Studios is being referenced. When not specified, the API implementation typically uses the configuration that is currently selected within the Part Studio. An interactive ad-hoc API call might not behave consistently in an application, so be sure to specify the configuration parameter where applicable.

    Onshape Data Model

    Onshape data is stored in replicated databases in the cloud. The Onshape data model is influenced by the Git data model and similar source code repositories.

    Documents contain elements. Elements are presented as tabs in the user interface. With some exceptions, all data in a document is stored within an element. The following table describes what data stored in each Element type:

    Element TypeDescription
    Part StudioEach Part Studio contains exactly one Feature list. The Feature list contains Features such as sketches, planes, extrudes, etc. Each Feature contains one or parameters. Whenever the Feature list changes, the parametric history is evaluated, and the model is regenerated.
    AssemblyEach Assembly contains an assembly tree, which contains parts and/or other assemblies (sub-assemblies), along with mate information. Onshape provides an API call to retrieve the assembly tree definition.
    BlobEach Blob element contains an uninterpreted binary object that has been uploaded to Onshape, typically from a file. Onshape depends on the browser client to display some blob data (e.g., PDF and image data), but does not interpret the data. A blob element can be updated with new data.
    ApplicationEach Application element contains zero or more sub-elements, providing a structured set of transactional data that is defined and managed by an application. Application data can be displayed in the Onshape tab in an iframe; the application is responsible for rendering the data in the iframe from its server.

    Note that Onshape Drawing elements are Application elements managed by Onshape.

    Tessellated data is not stored persistently in Onshape; it is generated on demand for display by the Onshape clients, or in response to application REST API requests. This data may be cached for performance.

    Document data

    All elements, including Assemblies, Part Studios, Drawings, or even apps, are history based. Each change to an element or set of elements represents a unique record in the document’s history, known as a microversion. The document can be restored to that particular state any time in the future.

    Part Studio data

    The Part Studio element is defined by a list of features, some of which (e.g., a sketch), may have a complex internal structure composed of entities. Part Studio features and entities are referenced by unique persistent identifiers. Part Studio features and entities can appear, disappear, and reappear depending on the current microversion of the model.

    Assembly data

    The Assembly element is defined as a list of assembly features and a tree of subassemblies/part instances. Occurrence ID is a unique persistent identifier of an occurrence of a part in the assembly structure.

    External application data

    An external application has complete control over how it manages/stores documents, however, to take advantage of the Onshape data model, there is a set of endpoints they should use to store state. These are collectively known as the AppElement API.

    Model presentation data

    A valid model definition usually corresponds to a real-world manufacturable topology, represented internally as a set of parts, faces, edges, and vertices and the set of relations between them. Each of these has a unique identifier in every state of the model. The identifier represents an encoded index in the model’s history, and its value depends on the structure of the model’s history. The value is not guaranteed to be preserved across model changes, and will almost always change if the model changes in significant ways. The model can be tessellated into a set of geometric primitives, which approximate the shape of the model. Tessellated data can be used for visual representation of the model or other processing related to the shape of the model.

    The following changes in the topological representation can occur between two microversions of the model:

    • New topological entities appear
    • Id of existing topology change
    • Topological entities disappear
    • Existing topological entities are merged into a single entity
    • Existing topological entity are split into multiple entities

    The model microversion and topology ID can be used to identify topological entities across the model changes. Topology ID defined in a specific microversion can be translated into a set of topology IDs in the current microversion of the model. (The Topology ID is sometimes referred to as a Deterministic ID within Onshape, and is exposed in specific API calls as partId, faceId, etc.). See the PartStudio APIs to see what topology IDs are exposed.

    \ No newline at end of file diff --git a/docs/api-intro/explorer/index.html b/docs/api-intro/explorer/index.html index 62fe166..c24d1d8 100644 --- a/docs/api-intro/explorer/index.html +++ b/docs/api-intro/explorer/index.html @@ -1,16 +1,15 @@ -API Explorer | API Explorer |

    API Explorer

    We document all available Onshape REST API endpoints in our Glassworks API Explorer:

    https://cad.onshape.com/glassworks/explorer/


    This API Explorer site enables you to run API requests directly within its interface and provides the output from the API call. To try an endpoint in the API Explorer, follow these steps or follow along with the video below:

    1. Open this public Onshape document in your browser: +Open this public Onshape document in your browser: https://cad.onshape.com/documents/e60c4803eaf2ac8be492c18e/w/d2558da712764516cc9fec62/e/6bed6b43463f6a46a37b4a22 Open the API Explorer in a new browser tab: https://cad.">

      API Explorer

      We document all available Onshape REST API endpoints in our Glassworks API Explorer:

      https://cad.onshape.com/glassworks/explorer/


      This API Explorer site enables you to run API requests directly within its interface and provides the output from the API call. To try an endpoint in the API Explorer, follow these steps or follow along with the video below:

      1. Open this public Onshape document in your browser: https://cad.onshape.com/documents/e60c4803eaf2ac8be492c18e/w/d2558da712764516cc9fec62/e/6bed6b43463f6a46a37b4a22
      2. Open the API Explorer in a new browser tab: https://cad.onshape.com/glassworks/explorer/
        • Note: For Enterprise accounts, substitue cad in this URL with your company name.
      3. Scroll down to Document.
      4. Click to expand the getDocument endpoint. (Hint: it appears in the API Ref as GET /documents/{did}).
      5. Go back to the public document you opened in Step 2, and copy the document ID from the Onshape URL (e60c4803eaf2ac8be492c18e). -image
      6. Paste the document ID into the did field in the API Explorer.
        • Note: If you can’t edit the did field, click the Try it out button. This will toggle to a Cancel button when the fields are editable.
      7. Scroll down and click Execute.
        • Note: If you receive a 403 error, see the Authentication section for help.
      8. Scroll to the bottom of the 200 response body. We have correctly returned Onshape API Guide as the document name.

      gif of using glassworks

      IMPORTANT NOTE: The documentation in the API Explorer reflects the supported interface. Some API calls may, for historical reasons, return additional undocumented fields. Unless the return fields are documented in the API Explorer, you should NOT use them, as they may be removed without warning. Your application should always ignore unexpected or undocumented return data. Onshape reserves the right to add, remove or change any undocumented fields.

      Authentication

      You can authenticate in the API Explorer in one of three ways:

      1. Onshape:
        1. Open Onshape in a new tab in your browser.
        2. Sign in with your Onshape credentials. Onshape will pass your credentials to the API Explorer.
      2. API Keys:
        1. Click Authorize in the top-right of the API Explorer page and scroll to the bottom of the dialog.
          Glassworks Authorize button
        2. Provide your API access key in the Username field and your secret key in the Password field. See API Keys for help creating your API Keys. Do NOT enter your Onshape credentials.
          drawing
        3. Click Authorize, and then click Close.
      3. Oauth:
        1. Click Authorize in the top-right of the API Explorer page.
          Glassworks Authorize button
        2. Fill out the OAuth fields. See OAuth for more information on autheneticating with OAuth2.
        3. Click Authorize, and then click Close.

      Use the Auto-fill feature

      1. Expand the endpoint you want to use in the API Explorer.
      2. Paste an entire Onshape URL into the top field.
      3. Click Auto-fill. The document ID, workspace/version/microversion ID, and element ID are pushed from the URL into the correct fields.
      4. Confirm all fields are filled out as expected. Not every parameter can be extracted from an Onshape URL, so there may be more fields to fill out.

      glassworks api explorer auto fill feature

      View response body docs

      1. Expand the endpoint you want to use the in API Explorer.
      2. Scroll down to the Responses section.
      3. Click Schema.
      4. Click the [...] symbols to expand the docs for the response JSON.

      glassworks api explorer response json docs

      View request body docs

      1. Expand the endpoint you want to use the in API Explorer.
      2. Click the Cancel button to make the schema viewable.
      3. Click Schema.
      4. Click the [...] symbols to expand the docs for the response JSON.

      glassworks api explorer response json docs

      Copy a cURL

      1. Expand the endpoint you want to use in the API Explorer.
      2. Fill out the parameter fields.
      3. Click Execute in the API Explorer.
      4. Copy the curl from the Curl field.

      api explorer curl copy

      Troubleshooting

      • If the parameter fields in the API Explorer are grayed out, click the Try it Out! button to toggle it to a Cancel button. The parameter fields should become editable.
      • If you can’t see the request body JSON docs, click the Cancel button to toggle it back to the Try it Out! button.
      • If you see authentication issues, review the Authentication section above.
      \ No newline at end of file +image
    2. Paste the document ID into the did field in the API Explorer.
      • Note: If you can’t edit the did field, click the Try it out button. This will toggle to a Cancel button when the fields are editable.
    3. Scroll down and click Execute.
      • Note: If you receive a 403 error, see the Authentication section for help.
    4. Scroll to the bottom of the 200 response body. We have correctly returned Onshape API Guide as the document name.

    gif of using glassworks

    IMPORTANT NOTE: The documentation in the API Explorer reflects the supported interface. Some API calls may, for historical reasons, return additional undocumented fields. Unless the return fields are documented in the API Explorer, you should NOT use them, as they may be removed without warning. Your application should always ignore unexpected or undocumented return data. Onshape reserves the right to add, remove or change any undocumented fields.

    Authentication

    You can authenticate in the API Explorer in one of three ways:

    1. Onshape:
      1. Open Onshape in a new tab in your browser.
      2. Sign in with your Onshape credentials. Onshape will pass your credentials to the API Explorer.
    2. API Keys:
      1. Click Authorize in the top-right of the API Explorer page and scroll to the bottom of the dialog.
        Glassworks Authorize button
      2. Provide your API access key in the Username field and your secret key in the Password field. See API Keys for help creating your API Keys. Do NOT enter your Onshape credentials.
        drawing
      3. Click Authorize, and then click Close.
    3. Oauth:
      1. Click Authorize in the top-right of the API Explorer page.
        Glassworks Authorize button
      2. Fill out the OAuth fields. See OAuth for more information on autheneticating with OAuth2.
      3. Click Authorize, and then click Close.

    Use the Auto-fill feature

    1. Expand the endpoint you want to use in the API Explorer.
    2. Paste an entire Onshape URL into the top field.
    3. Click Auto-fill. The document ID, workspace/version/microversion ID, and element ID are pushed from the URL into the correct fields.
    4. Confirm all fields are filled out as expected. Not every parameter can be extracted from an Onshape URL, so there may be more fields to fill out.

    glassworks api explorer auto fill feature

    View response body docs

    1. Expand the endpoint you want to use the in API Explorer.
    2. Scroll down to the Responses section.
    3. Click Schema.
    4. Click the [...] symbols to expand the docs for the response JSON.

    glassworks api explorer response json docs

    View request body docs

    1. Expand the endpoint you want to use the in API Explorer.
    2. Click the Cancel button to make the schema viewable.
    3. Click Schema.
    4. Click the [...] symbols to expand the docs for the response JSON.

    glassworks api explorer response json docs

    Copy a cURL

    1. Expand the endpoint you want to use in the API Explorer.
    2. Fill out the parameter fields.
    3. Click Execute in the API Explorer.
    4. Copy the curl from the Curl field.

    api explorer curl copy

    Troubleshooting

    • If the parameter fields in the API Explorer are grayed out, click the Try it Out! button to toggle it to a Cancel button. The parameter fields should become editable.
    • If you can’t see the request body JSON docs, click the Cancel button to toggle it back to the Try it Out! button.
    • If you see authentication issues, review the Authentication section above.
    \ No newline at end of file diff --git a/docs/api-intro/index.html b/docs/api-intro/index.html index 5385f02..d685916 100644 --- a/docs/api-intro/index.html +++ b/docs/api-intro/index.html @@ -1,5 +1,7 @@ -Introduction to the Onshape REST API |

    Introduction to the Onshape REST API

    This page explains the basics of using the Onshape REST API. If you are brand new to using APIs, we suggest you spend some time learning the basics from these free resources:

    Onshape uses REST APIs to communicate with clients and third-party systems. Onshape lives in your browser, which means you call REST APIs like you would any other web page. The API call returns information instead of a web page, and the response is formatted in JSON (JavaScript Object Notation).

    You can use our REST APIs to access the Onshape engine and data in real time. We currently support three REST API requests (following the HTTP standards):

    • GET: Retrieve (read) information from the server (i.e., your Onshape documents). Any arguments included in the URL are sent to the server.
    • POST: Update (write) the server with new information. Required data is included in the request body.
    • DELETE: Delete information from the server.

    A typical REST API call in Onshape includes five major components:

    • Method:
      • GET, POST, or DELETE
      • Every Onshape API endpoint is labeled with its method type.
    • URL:
      • Specifies the API endpoint and part of the document that the API is calling
      • Uses the following format: {base_url}/{fixed_url}.
        • {base_url}: Onshape URL (i.e., https://cad.onshape.com/api or https://companyName.onshape.com/api for Enterprise accounts).
        • {fixed_url}: the URL of the API endpoint (more about this later)
    • Query parameters:
      • Optional parameters for the API call
      • Described in the drop-down content of every endpoint in the API Explorer (you’ll learn about using our API Explorer in a later section).
    • Headers:
      • Defines the associated metadata, which is used by the server to process the request.
      • Usually contains Content-Type and Accept.
        • Content-Type:
          • Usually application/json
          • If the application downloads a file, Content-Type will be application/octet-stream
        • Accept: found under Media type in the API response section on in the API Explorer.
    • Payload body:
      • Only applicable for POST requests
      • Required for some POST requests; optional for others.
      • Body template is available in the API drop-down in the API Explorer.
      • Typically obtained and modified from the response of a related GET request (rather than manually)

    Onshape API Request

    Since Onshape is a web-based solution, it uses a URL to define what is loaded in the browser.

    Example Onshape URL: +Introduction to the Onshape REST API |

    Introduction to the Onshape REST API

    This page explains the basics of using the Onshape REST API. If you are brand new to using APIs, we suggest you spend some time learning the basics from these free resources:

    Onshape uses REST APIs to communicate with clients and third-party systems. Onshape lives in your browser, which means you call REST APIs like you would any other web page. The API call returns information instead of a web page, and the response is formatted in JSON (JavaScript Object Notation).

    You can use our REST APIs to access the Onshape engine and data in real time. We currently support three REST API requests (following the HTTP standards):

    • GET: Retrieve (read) information from the server (i.e., your Onshape documents). Any arguments included in the URL are sent to the server.
    • POST: Update (write) the server with new information. Required data is included in the request body.
    • DELETE: Delete information from the server.

    A typical REST API call in Onshape includes five major components:

    • Method:
      • GET, POST, or DELETE
      • Every Onshape API endpoint is labeled with its method type.
    • URL:
      • Specifies the API endpoint and part of the document that the API is calling
      • Uses the following format: {base_url}/{fixed_url}.
        • {base_url}: Onshape URL (i.e., https://cad.onshape.com/api or https://companyName.onshape.com/api for Enterprise accounts).
        • {fixed_url}: the URL of the API endpoint (more about this later)
    • Query parameters:
      • Optional parameters for the API call
      • Described in the drop-down content of every endpoint in the API Explorer (you’ll learn about using our API Explorer in a later section).
    • Headers:
      • Defines the associated metadata, which is used by the server to process the request.
      • Usually contains Content-Type and Accept.
        • Content-Type:
          • Usually application/json
          • If the application downloads a file, Content-Type will be application/octet-stream
        • Accept: found under Media type in the API response section on in the API Explorer.
    • Payload body:
      • Only applicable for POST requests
      • Required for some POST requests; optional for others.
      • Body template is available in the API drop-down in the API Explorer.
      • Typically obtained and modified from the response of a related GET request (rather than manually)

    Onshape API Request

    Since Onshape is a web-based solution, it uses a URL to define what is loaded in the browser.

    Example Onshape URL: https://cad.onshape.com/api/documents/e60c4803eaf2ac8be492c18e/w/d2558da712764516cc9fec62/e/6bed6b43463f6a46a37b4a22

    • https://cad.onshape.com/api is the base URL of the document.
      • Every Enterprise account has a custom base URL: https://companyName.onshape.com/api
    • documents/ or d/ is followed by a 24-character document ID. The document ID uniquely identifies an Onshape document.
    • Next, w/ is followed by a 24-character workspace ID. The workspace ID uniquely identifies a workspace within the document. By default, a document is started with the Main workspace.
      • To refer to a specific document version, replace w/ with v/, followed by the 24-character version ID.
      • With every edit made in the document, a microversion of every document is automatically created with every edit. To refer to a specific microversion, replace w/ with m/, followed by the 24-character microversion ID.
      • Note: POST requests are always made to a workspace, since versions and microversions are immutable.
    • e/ is followed by a 24-character element ID. The element ID uniquely identifies an element (e.g., a tab that we see and access through the user interface).

    In this documentation, we often refer to the URL template as: {base_URL}/{endpoint}/d/{did}/{wvm}/{wvmid}/e/{eid} or sometimes /{endpoint}/DWVME/ for short.

    When your application is instantiated in a document, it is called with a URL like this:

    https://_your-server.your-domain.com_?documentId=e60c4803eaf2ac8be492c18e&workspaceId=d2558da712764516cc9fec62&elementId=6bed6b43463f6a46a37b4a22&server=https%3A%2F%2Fcad.onshape.com&userId=53da35fbe4b0412c60b5e3b7&access=edit&debug=true
     

    The query parameters passed from Onshape to your application are:

    ParameterDescription
    documentIdCurrent document ID
    workspaceId, versionId, microversionIdCurrent workspace ID OR version ID OR microversion ID
    elementIdCurrent (application) element ID
    serverThe address of the current Onshape server. The server parameter is informational; REST requests should always be sent to cad.onshape.com. Enterprise accounts should be sent to companyName.onshape.com.
    userIdCurrent user ID, which can be found by calling /api/users/current and obtaining the user ID from the id field.
    accessSet to edit if the document should open with edit capabilities.

    Onshape API Response

    The REST API in Onshape communicates data in JSON format. If you are new to working with JSON, we recommend the following resources:

    The example below is the response from calling the getDocument API for this public document. A lot of information is returned, so we’ve truncated the middle of the response below, but if we look at the very end of the resulting JSON, we can see that the response has correctly returned Onshape API Guide as the document name.

      {
         "jsonType": "document",
    @@ -16,4 +18,4 @@
         "id": "e60c4803eaf2ac8be492c18e",
         "href": "https://cad.onshape.com/api/v6/documents/e60c4803eaf2ac8be492c18e"
     }
    -

    The Onshape API response also contains rate limiting information in the x-rate-limit-remaining header.

    Versioning

    All endpoint calls are versioned. The version string is inserted directly after the /api/ path component. For instance, https://cad.onshape.com/api/v6/documents/e60c4803eaf2ac8be492c18e indicates a version 6 request to the Onshape getDocument endpoint.

    Calls within a version are compatible with one another; typically this means that a GET request can be fed back in as a POST at the same version. Versions are incremented whenever Onshape introduces a non-backwards-compatible change. Onshape users should always refer to the latest version in their calls. If no version is specified, the oldest version (v0) will be used.

    API Conventions

    The Onshape API generally uses the following conventions:

    • Onshape generally supports only 3 methods: GET for read-only operations, POST for write operations, and DELETE for deletions. Onshape does not currently support other methods, such as PUT.
    • Strings should be UTF-8 encoded.
    • Query parameters are used for optional parameters. All required parameters are included in the path. For brevity, we use the following upper case letters in path definitions in this document:
      • D Document ID (24-characters)
      • W Workspace ID (24-characters)
      • V Version ID (24-characters)
      • M Microversion ID (24-characters)
      • E Element ID (24-characters)
    • The general form of a path is /resource/context/subresource. When present, the context identifies the document (D), the workspace, version or microversion (WVM), and the element (E). See the Onshape Architecture page for more information on Onshape’s basic API structure.
    • Our intention is to provide Workspace, Version, and Microversion forms for all appropriate GET operations. POST will always be to a Workspace, as Versions and Microversions are immutable. Not all forms of all interfaces are implemented at this time.
    • As of this writing, some API calls return information that is of use only for Onshape clients. You should generally only use the fields that are documented for external use. The internal data may be changed or removed without notice.

    Unit Designators

    The following strings are valid unit designators:

    For length measures:

    • meter, meters, m
    • millimeter, millimeters, mm
    • centimeter, centimeters, cm
    • inch, inches, in
    • foot, feet, ft
    • yard, yards, yd

    For angular measures:

    • degree, degrees, deg
    • radian, radians, rad

    What Now?

    Continue on to our API Explorer page to learn about about navigating the Onshape APIs in our Glassworks API Explorer.

    \ No newline at end of file +

    The Onshape API response also contains rate limiting information in the x-rate-limit-remaining header.

    Versioning

    All endpoint calls are versioned. The version string is inserted directly after the /api/ path component. For instance, https://cad.onshape.com/api/v6/documents/e60c4803eaf2ac8be492c18e indicates a version 6 request to the Onshape getDocument endpoint.

    Calls within a version are compatible with one another; typically this means that a GET request can be fed back in as a POST at the same version. Versions are incremented whenever Onshape introduces a non-backwards-compatible change. Onshape users should always refer to the latest version in their calls. If no version is specified, the oldest version (v0) will be used.

    API Conventions

    The Onshape API generally uses the following conventions:

    • Onshape generally supports only 3 methods: GET for read-only operations, POST for write operations, and DELETE for deletions. Onshape does not currently support other methods, such as PUT.
    • Strings should be UTF-8 encoded.
    • Query parameters are used for optional parameters. All required parameters are included in the path. For brevity, we use the following upper case letters in path definitions in this document:
      • D Document ID (24-characters)
      • W Workspace ID (24-characters)
      • V Version ID (24-characters)
      • M Microversion ID (24-characters)
      • E Element ID (24-characters)
    • The general form of a path is /resource/context/subresource. When present, the context identifies the document (D), the workspace, version or microversion (WVM), and the element (E). See the Onshape Architecture page for more information on Onshape’s basic API structure.
    • Our intention is to provide Workspace, Version, and Microversion forms for all appropriate GET operations. POST will always be to a Workspace, as Versions and Microversions are immutable. Not all forms of all interfaces are implemented at this time.
    • As of this writing, some API calls return information that is of use only for Onshape clients. You should generally only use the fields that are documented for external use. The internal data may be changed or removed without notice.

    Unit Designators

    The following strings are valid unit designators:

    For length measures:

    • meter, meters, m
    • millimeter, millimeters, mm
    • centimeter, centimeters, cm
    • inch, inches, in
    • foot, feet, ft
    • yard, yards, yd

    For angular measures:

    • degree, degrees, deg
    • radian, radians, rad

    What Now?

    Continue on to our API Explorer page to learn about about navigating the Onshape APIs in our Glassworks API Explorer.

    \ No newline at end of file diff --git a/docs/api-intro/index.xml b/docs/api-intro/index.xml index eaddb7f..07053a0 100644 --- a/docs/api-intro/index.xml +++ b/docs/api-intro/index.xml @@ -1,775 +1,7 @@ -– Introduction to the Onshape REST APIhttps://onshape-public.github.io/docs/api-intro/Recent content in Introduction to the Onshape REST API onHugo -- gohugo.ioen-usMon, 18 May 2020 20:39:14 -0400Docs: API Explorerhttps://onshape-public.github.io/docs/api-intro/explorer/Mon, 18 May 2020 20:39:14 -0400https://onshape-public.github.io/docs/api-intro/explorer/ -<p>We document all available Onshape REST API endpoints in our Glassworks API Explorer:</p> -<p><b><font size="5"><a href="https://cad.onshape.com/glassworks/explorer/">https://cad.onshape.com/glassworks/explorer/</a></font></b></p> -<hr> -<p>This API Explorer site enables you to run API requests directly within its interface and provides the output from the API call. To try an endpoint in the API Explorer, follow these steps or follow along with the video below:</p> -<ol> -<li>Open this public Onshape document in your browser: -<font size="1"><a href="https://cad.onshape.com/documents/e60c4803eaf2ac8be492c18e/w/d2558da712764516cc9fec62/e/6bed6b43463f6a46a37b4a22">https://cad.onshape.com/documents/e60c4803eaf2ac8be492c18e/w/d2558da712764516cc9fec62/e/6bed6b43463f6a46a37b4a22</a></font></li> -<li>Open the API Explorer in a new browser tab: <a href="https://cad.onshape.com/glassworks/explorer/">https://cad.onshape.com/glassworks/explorer/</a> -<ul> -<li>Note: For Enterprise accounts, substitue <code>cad</code> in this URL with your company name.</li> -</ul> -</li> -<li>Scroll down to <a href="https://cad.onshape.com/glassworks/explorer/#/Document">Document</a>.</li> -<li>Click to expand the <a href="https://cad.onshape.com/glassworks/explorer/#/Document/getDocument"><code>getDocument</code></a> endpoint. (Hint: it appears in the API Ref as <code>GET /documents/{did}</code>).</li> -<li>Go back to the public document you opened in Step 2, and copy the document ID from the Onshape URL (<code>e60c4803eaf2ac8be492c18e</code>). -<img src="https://onshape-public.github.io/images/OnshapeAPIGuidePublicDoc.png" alt="image"></li> -<li>Paste the document ID into the <code>did</code> field in the API Explorer. -<ul> -<li>Note: If you can&rsquo;t edit the <code>did</code> field, click the <strong>Try it out</strong> button. This will toggle to a <strong>Cancel</strong> button when the fields are editable.</li> -</ul> -</li> -<li>Scroll down and click <strong>Execute</strong>. -<ul> -<li>Note: If you receive a <code>403</code> error, see the <a href="#authentication">Authentication</a> section for help.</li> -</ul> -</li> -<li>Scroll to the bottom of the 200 response body. We have correctly returned <code>Onshape API Guide</code> as the document name.</li> -</ol> -<p><img src="https://onshape-public.github.io/images/GlassworksAPIExplorerDemo.gif" alt="gif of using glassworks"></p> -<p><strong>IMPORTANT NOTE</strong>: The documentation in the API Explorer reflects the supported interface. Some API calls may, for historical reasons, return additional undocumented fields. Unless the return fields are documented in the API Explorer, you should NOT use them, as they may be removed without warning. Your application should always ignore unexpected or undocumented return data. Onshape reserves the right to add, remove or change any undocumented fields.</p> -<h3 id="authentication">Authentication</h3> -<p>You can authenticate in the API Explorer in one of three ways:</p> -<ol> -<li><strong>Onshape</strong>: -<ol> -<li>Open Onshape in a new tab in your browser.</li> -<li>Sign in with your Onshape credentials. Onshape will pass your credentials to the API Explorer.</li> -</ol> -</li> -<li><strong>API Keys</strong>: -<ol> -<li>Click <strong>Authorize</strong> in the top-right of the API Explorer page and scroll to the bottom of the dialog. -</br><img src="https://onshape-public.github.io/images/glassworks-auth-button.png" alt="Glassworks Authorize button" width=175></li> -<li>Provide your API access key in the Username field and your secret key in the Password field. See <a href="https://onshape-public.github.io/docs/auth/apikeys">API Keys</a> for help creating your API Keys. Do NOT enter your Onshape credentials. -</br><img style='border:.7px solid #808080' src="https://onshape-public.github.io/images/ApiExplorerBasicAuth.png" alt="drawing" width="500"/></li> -<li>Click <strong>Authorize</strong>, and then click <strong>Close</strong>.</li> -</ol> -</li> -<li><strong>Oauth</strong>: -<ol> -<li>Click <strong>Authorize</strong> in the top-right of the API Explorer page. -</br><img src="https://onshape-public.github.io/images/glassworks-auth-button.png" alt="Glassworks Authorize button" width=175></li> -<li>Fill out the OAuth fields. See <a href="https://onshape-public.github.io/docs/auth/oauth">OAuth</a> for more information on autheneticating with OAuth2.</li> -<li>Click <strong>Authorize</strong>, and then click <strong>Close</strong>.</li> -</ol> -</li> -</ol> -<h3 id="use-the-auto-fill-feature">Use the Auto-fill feature</h3> -<ol> -<li>Expand the endpoint you want to use in the API Explorer.</li> -<li>Paste an entire Onshape URL into the top field.</li> -<li>Click <strong>Auto-fill</strong>. The document ID, workspace/version/microversion ID, and element ID are pushed from the URL into the correct fields.</li> -<li>Confirm all fields are filled out as expected. Not every parameter can be extracted from an Onshape URL, so there may be more fields to fill out.</li> -</ol> -<p><img src="https://onshape-public.github.io/images/GlassworksAutofill.png" alt="glassworks api explorer auto fill feature"></p> -<h3 id="view-response-body-docs">View response body docs</h3> -<ol> -<li>Expand the endpoint you want to use the in API Explorer.</li> -<li>Scroll down to the Responses section.</li> -<li>Click Schema.</li> -<li>Click the <code>[...]</code> symbols to expand the docs for the response JSON.</li> -</ol> -<p><img src="https://onshape-public.github.io/images/APIExplorerResponseJSON.png" alt="glassworks api explorer response json docs"></p> -<h3 id="view-request-body-docs">View request body docs</h3> -<ol> -<li>Expand the endpoint you want to use the in API Explorer.</li> -<li><strong>Click the <em>Cancel</em> button to make the schema viewable.</strong></li> -<li>Click Schema.</li> -<li>Click the <code>[...]</code> symbols to expand the docs for the response JSON.</li> -</ol> -<p><img src="https://onshape-public.github.io/images/APIExplorerRequestJSON.png" alt="glassworks api explorer response json docs"></p> -<h3 id="copy-a-curl">Copy a cURL</h3> -<ol> -<li>Expand the endpoint you want to use in the API Explorer.</li> -<li>Fill out the parameter fields.</li> -<li>Click Execute in the API Explorer.</li> -<li>Copy the curl from the Curl field.</li> -</ol> -<p><img src="https://onshape-public.github.io/images/APIExplorerCopyCurl.png" alt="api explorer curl copy"></p> -<h3 id="troubleshooting">Troubleshooting</h3> -<ul> -<li>If the parameter fields in the API Explorer are grayed out, click the <strong>Try it Out!</strong> button to toggle it to a <strong>Cancel</strong> button. The parameter fields should become editable.</li> -<li>If you can&rsquo;t see the request body JSON docs, click the <strong>Cancel</strong> button to toggle it back to the <strong>Try it Out!</strong> button.</li> -<li>If you see authentication issues, review the <a href="#authentication">Authentication</a> section above.</li> -</ul>Docs: Architecturehttps://onshape-public.github.io/docs/api-intro/architecture/Mon, 01 Jan 0001 00:00:00 +0000https://onshape-public.github.io/docs/api-intro/architecture/ -<p>Design in Onshape typically beings with a document, which is the container that includes all content related to a specific design. All data in an Onshape document is stored in Elements. Part Studios and Assemblies are two of the most common element types in a design. Throughout the design process, creating versions can be useful for product development management while working on the “Main” workspace. See also:</p> -<ul> -<li>The <a href="https://onshape-public.github.io/docs/api-intro/">API Introduction</a> page for information on how documents, workspaces, and elements are assembled into a URL.</li> -<li>The <a href="https://onshape-public.github.io/docs/api-adv/associativity">Associativity</a> page for information on how Parts, Assemblies, and Elements relate to each other.</li> -</ul> -<h2 id="elements">Elements</h2> -<p>All data in an Onshape document are stored in Elements (represented as tabs in the user interface). Onshape documents contain five kinds of elements:</p> -<ul> -<li><strong>Part Studio</strong>: Contains zero or more parts</li> -<li><strong>Assembly</strong>: Contains zero or more parts or assemblies</li> -<li><strong>Blob</strong> (Binary Large OBject): Can be provided by a partner or by the end user. For example, the user can upload a PDF file, an image, or a text file. Partner applications can store arbitrary data, but we recommend using the <a href="https://onshape-public.github.io/docs/app-dev/structuredstorage">structured storage</a> available in an element for better integration.</li> -<li><strong>Application</strong>: Presents an iframe to the user. The user interface is managed by a server that can be provided by a third-party. Onshape Drawings are a special case of an application element.</li> -<li><strong>Feature Studio</strong>: Contains the definition for Onshape Features, which are defined in FeatureScript.</li> -</ul> -<h2 id="workspaces-versions-and-microversions">Workspaces, Versions, and Microversions</h2> -<p>A document is stored in Onshape as a collection of changes.</p> -<ul> -<li>You can think of a <strong>workspace</strong> as a branch of the document, similar to a branch in a source control system. Documents can be branched to create new workspaces.</li> -<li>Each individual change to the document creates a new document <strong>microversion</strong>. As the document is edited, changes are applied to the active workspace, creating new microversions.</li> -<li>Periodically, the user may designate versions of the document. A <strong>version</strong> is a named snapshot of the entire document at some point in time (that is, at some microversion).</li> -</ul> -<p>You cannot change a version or microversion of a document; all changes are applied to a workspace (and create a new microversion). Thus, while in general the <code>GET</code> methods of the API can read from a version, microversion, or workspace, the <code>POST</code> methods generally require a workspace, and create a new microversion when data is written to the document. (An exception is that it is possible to set metadata within a version; this does not create a new microversion).</p> -<p>The following IDs are used by many of the APIs. Each ID (except for Geometry IDs such as Part, Face and Edge) is a 24-character string that is used internally by Onshape to uniquely identify the resource. The Geometry IDs are variable-length strings used to resolve to a specific geometric entity within a model.</p> -<table> -<thead> -<tr> -<th>ID</th> -<th>Description</th> -</tr> -</thead> -<tbody> -<tr> -<td><strong>User ID</strong></td> -<td>Identifies a single user.</td> -</tr> -<tr> -<td><strong>Document ID</strong></td> -<td>Identifies a document. The logged-in user must have access to the requested document for the API to succeed.</td> -</tr> -<tr> -<td><strong>Workspace ID</strong></td> -<td>The Workspace ID identifies a workspace within the document. Workspaces are used to distinguish between different branches of the document.</td> -</tr> -<tr> -<td><strong>Version ID</strong></td> -<td>The Version ID identifies a specific named version.</td> -</tr> -<tr> -<td><strong>Microversion ID</strong></td> -<td>The Microversion ID identifies an internal revision of the document.</td> -</tr> -<tr> -<td><strong>Element ID</strong></td> -<td>The Element ID identifies an element within the document.</td> -</tr> -<tr> -<td><strong>Part ID </br> Face ID </br> Edge ID</strong></td> -<td>The Part ID identifies a part within a part studio. The Part ID should generally not be stored for long-term use, as it is only expected to be valid during the course of a session.</td> -</tr> -</tbody> -</table> -<p>Note that a Part ID may reference a part that no longer exists if the model is changed, so it is best to specify a Version or Microversion to pick the context for the Part ID. Note that even with the Version or Microversion, internal changes to the Onshape system may also change the Part ID. Onshape provides mechanisms for maintaining persistent references. See the <a href="https://onshape-public.github.io/docs/api-adv/associativity">Associativity</a> page for more information. Face and Edge IDs are used in similar ways.</p> -<p>The following table identifies Onshape concepts and the corresponding Git concepts. Note that this is not a direct mapping, and the implementation of the concepts is very different.</p> -<table> -<thead> -<tr> -<th>Onshape concept</th> -<th>Git concept</th> -</tr> -</thead> -<tbody> -<tr> -<td>Document</td> -<td>Repository</td> -</tr> -<tr> -<td>Element</td> -<td>File</td> -</tr> -<tr> -<td>Workspace</td> -<td>Branch</td> -</tr> -<tr> -<td>Version</td> -<td>Tag</td> -</tr> -<tr> -<td>Microversion</td> -<td>Commit</td> -</tr> -</tbody> -</table> -<h2 id="linked-documents">Linked Documents</h2> -<p>Although a document can contain a complex model tree involving many Part Studio and Assembly elements, it is often more efficient to split the content into multiple documents. Connections between documents always refer to a specific version of the target document. <em>Once a version is used as the target of a linked document, that document version is preserved as long as any document references it, even if the containing document is deleted.</em> Additionally, any user that has access to the referring document will have limited read access to the target document, regardless of what permissions are currently on the target document.</p> -<h2 id="configurations">Configurations</h2> -<p>Onshape Part Studios can be constructed to be configurable using Onshape Configurations. API calls that reference Part Studios (primarily within the <a href="https://cad.onshape.com/glassworks/explorer/#/Part">Parts</a> and <a href="https://cad.onshape.com/glassworks/explorer/#/PartStudio">Part Studios</a> APIs) often accept a <code>configuration</code> parameter that identifies what specific configuration of the Part Studios is being referenced. When not specified, the API implementation typically uses the configuration that is currently selected within the Part Studio. An interactive ad-hoc API call might not behave consistently in an application, so be sure to specify the configuration parameter where applicable.</p> -<h2 id="onshape-data-model">Onshape Data Model</h2> -<p>Onshape data is stored in replicated databases in the cloud. The Onshape data model is influenced by the Git data model and similar source code repositories.</p> -<p>Documents contain <strong>elements</strong>. Elements are presented as tabs in the user interface. With some exceptions, all data in a document is stored within an element. The following table describes what data stored in each Element type:</p> -<table> -<thead> -<tr> -<th>Element Type</th> -<th>Description</th> -</tr> -</thead> -<tbody> -<tr> -<td><strong>Part Studio</strong></td> -<td>Each Part Studio contains exactly one Feature list. The Feature list contains Features such as sketches, planes, extrudes, etc. Each Feature contains one or parameters. Whenever the Feature list changes, the parametric history is evaluated, and the model is regenerated.</td> -</tr> -<tr> -<td><strong>Assembly</strong></td> -<td>Each Assembly contains an assembly tree, which contains parts and/or other assemblies (sub-assemblies), along with mate information. Onshape provides an API call to retrieve the assembly tree definition.</td> -</tr> -<tr> -<td><strong>Blob</strong></td> -<td>Each Blob element contains an uninterpreted binary object that has been uploaded to Onshape, typically from a file. Onshape depends on the browser client to display some blob data (e.g., PDF and image data), but does not interpret the data. A blob element can be updated with new data.</td> -</tr> -<tr> -<td><strong>Application</strong></td> -<td>Each Application element contains zero or more sub-elements, providing a structured set of transactional data that is defined and managed by an application. Application data can be displayed in the Onshape tab in an iframe; the application is responsible for rendering the data in the iframe from its server.</td> -</tr> -</tbody> -</table> -<p>Note that Onshape Drawing elements are Application elements managed by Onshape.</p> -<p>Tessellated data is not stored persistently in Onshape; it is generated on demand for display by the Onshape clients, or in response to application REST API requests. This data may be cached for performance.</p> -<h3 id="document-data">Document data</h3> -<p>All elements, including Assemblies, Part Studios, Drawings, or even apps, are history based. Each change to an element or set of elements represents a unique record in the document’s history, known as a microversion. The document can be restored to that particular state any time in the future.</p> -<h3 id="part-studio-data">Part Studio data</h3> -<p>The Part Studio element is defined by a list of features, some of which (e.g., a sketch), may have a complex internal structure composed of entities. Part Studio features and entities are referenced by unique persistent identifiers. Part Studio features and entities can appear, disappear, and reappear depending on the current microversion of the model.</p> -<h3 id="assembly-data">Assembly data</h3> -<p>The Assembly element is defined as a list of assembly features and a tree of subassemblies/part instances. Occurrence ID is a unique persistent identifier of an occurrence of a part in the assembly structure.</p> -<h3 id="external-application-data">External application data</h3> -<p>An external application has complete control over how it manages/stores documents, however, to take advantage of the Onshape data model, there is a set of endpoints they should use to store state. These are collectively known as the AppElement API.</p> -<h3 id="model-presentation-data">Model presentation data</h3> -<p>A valid model definition usually corresponds to a real-world manufacturable topology, represented internally as a set of parts, faces, edges, and vertices and the set of relations between them. Each of these has a unique identifier in every state of the model. The identifier represents an encoded index in the model’s history, and its value depends on the structure of the model’s history. The value is not guaranteed to be preserved across model changes, and will almost always change if the model changes in significant ways. The model can be tessellated into a set of geometric primitives, which approximate the shape of the model. Tessellated data can be used for visual representation of the model or other processing related to the shape of the model.</p> -<p>The following changes in the topological representation can occur between two microversions of the model:</p> -<ul> -<li>New topological entities appear</li> -<li>Id of existing topology change</li> -<li>Topological entities disappear</li> -<li>Existing topological entities are merged into a single entity</li> -<li>Existing topological entity are split into multiple entities</li> -</ul> -<p>The model microversion and topology ID can be used to identify topological entities across the model changes. Topology ID defined in a specific microversion can be translated into a set of topology IDs in the current microversion of the model. (The Topology ID is sometimes referred to as a Deterministic ID within Onshape, and is exposed in specific API calls as partId, faceId, etc.). See the <a href="https://cad.onshape.com/glassworks/explorer/#/PartStudio">PartStudio APIs</a> to see what topology IDs are exposed.</p>Docs: Quick Starthttps://onshape-public.github.io/docs/api-intro/quickstart/Mon, 18 May 2020 20:39:14 -0400https://onshape-public.github.io/docs/api-intro/quickstart/ -<p>In this example, we will call an Onshape REST API endpoint to send a document name to our console. Please note that the sample shown on this page is only designed to be used as a quick start guide and does not represent a full Onshape application.</p> -<h2 id="system-requirements">System Requirements</h2> -<ul> -<li>You must be signed in to your Onshape account at <a href="https://cad.onshape.com">https://cad.onshape.com</a> (or <a href="https://companyName.onshape.com">https://companyName.onshape.com</a> for Enterprise accounts).</li> -<li>This example is coded in Python. The equivalent code is provided in other languages at the end of the example. To follow along with this tutorial, you can download and install Python here: <a href="https://www.python.org/downloads/">https://www.python.org/downloads/</a>.</li> -</ul> -<h2 id="review-the-api-endpoint">Review the API Endpoint</h2> -<ol> -<li>Go to the <a href="https://cad.onshape.com/glassworks/explorer">API Explorer</a> and scroll to <code>Document</code>.</li> -<li>Expand the <code>GET /documents/{did}</code> endpoint. Note that in the URL, the name of this API is <code>getDocument</code>.</li> -<li>Make a note of the URL structure and the parameters required to make this request. This will become the fixed URL part of our API call. </br> -<img src="https://onshape-public.github.io/images/Glassworks_getDocument.png" alt="image"> </br> -For this endpoint, we only need to get the document ID from the document URL.</li> -<li>Scroll down and make a note of the <code>Media Type</code> that we’ll need to include in our header. </br> -<img src="https://onshape-public.github.io/images/Glassworks_MediaType.png" alt="image"></li> -</ol> -<h2 id="review-the-document">Review the Document</h2> -<p>Navigate to <a href="https://cad.onshape.com/documents/e60c4803eaf2ac8be492c18e/w/d2558da712764516cc9fec62/e/6bed6b43463f6a46a37b4a22">this public document</a>, and make a note of the document ID in the URL (<code>e60c4803eaf2ac8be492c18e</code>). </br> -<img src="https://onshape-public.github.io/images/OnshapeAPIGuidePublicDoc.png" alt="image"></p> -<h2 id="create-your-api-keys">Create your API Keys</h2> -<ol> -<li>Go to <a href="https://dev-portal.onshape.com">https://dev-portal.onshape.com</a>.</li> -<li>In the left pane, click <code>API keys</code>.</li> -<li>Click the <code>Create new API key</code> button.</li> -<li>Select the following permissions for your app: -<ul> -<li><code>Application can read your documents.</code></li> -<li><code>Application can write to your documents.</code></li> -</ul> -</li> -<li>Click the <code>Create API key</code> button. </br> -<img src="https://onshape-public.github.io/images/CreateNewAPIKey.png" alt="image"></li> -<li>Copy both the <strong>access key</strong> and <strong>secret key</strong> from the pop-up window, save them somewhere, then click the <code>Close</code> button. -</br><strong>IMPORTANT NOTE: You will not be able to find the secret key again, so save it somewhere safe!</strong></br> -<img src="https://onshape-public.github.io/images/APIKeySecretKey.png" alt="image"></li> -<li>The details for your application appear. </br> -<img src="https://onshape-public.github.io/images/DevPortalKeys.png" alt="image"></li> -<li>Open your terminal and run the following command, replacing <code>ACCESS_KEY</code> and <code>SECRET_KEY</code> with the <strong>access key</strong> and <strong>secret key</strong> you created above. Remember to include the colon (<code>:</code>) between the keys. -<ul> -<li><strong>MacOS</strong>: -<pre tabindex="0"><code>printf ACCESS_KEY:SECRET_KEY | base64 -</code></pre></li> -<li><strong>Windows</strong>: -<pre tabindex="0"><code>powershell &#34;[convert]::ToBase64String([Text.Encoding]::UTF8.GetBytes(\&#34;ACCESS_KEY:SECRET_KEY\&#34;))&#34; -</code></pre></li> -</ul> -</li> -<li>You will receive a long, base-64-encoded string. You will need this string later, so keep it somewhere safe. We&rsquo;ll refer to it as our <code>CREDENTIALS</code>.</li> -</ol> -<h2 id="write-your-code">Write Your Code</h2> -<ol> -<li>Create a new file called <code>hello.py</code>.</li> -<li>Start your file by importing the necessary libraries.</br></li> -</ol> -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-python" data-lang="python"><span style="display:flex;"><span><span style="color:#00a">import</span> <span style="color:#0aa;text-decoration:underline">requests</span> -</span></span><span style="display:flex;"><span><span style="color:#00a">import</span> <span style="color:#0aa;text-decoration:underline">jsons</span> -</span></span></code></pre></div><ol start="3"> -<li>Next, define the URL for the API call:</br></li> -</ol> -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-python" data-lang="python"><span style="display:flex;"><span><span style="color:#aaa;font-style:italic"># Assemble the URL for the API call </span> -</span></span><span style="display:flex;"><span>api_url = <span style="color:#a50">&#34;ASSEMBLED_URL&#34;</span> -</span></span></code></pre></div><ol start="4"> -<li>Replace <code>ASSEMBLED_URL</code> with the fully formed API. This is where we’ll put together everything we’ve learned so far: -<ol> -<li>The base URL: -<ul> -<li><code>https://cad.onshape.com/api</code></li> -<li><code>https://companyName.onshape.com/api</code> for Enterprise accounts</li> -</ul> -</li> -<li>The fixed URL is specified in the <a href="https://cad.onshape.com/glassworks/explorer/#/Document/getDocument"><code>getDocument</code></a> API in Glassworks: <code>/documents/{did}</code></li> -<li>The document ID parameter from the public document URL to include in the fixed URL: <code>{did}: e60c4803eaf2ac8be492c18e</code></li> -<li>Together, this makes the URL for our API request: -<code>https://cad.onshape.com/api/documents/e60c4803eaf2ac8be492c18e</code> </br></li> -</ol> -</li> -<li>We don&rsquo;t need to send any optional parameters with our request, so we can define them as an empty object:</li> -</ol> -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-python" data-lang="python"><span style="display:flex;"><span><span style="color:#aaa;font-style:italic"># Optional query parameters can be assigned </span> -</span></span><span style="display:flex;"><span>params = {} -</span></span></code></pre></div><ol start="6"> -<li>Now, define your API keys: </br></li> -</ol> -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-python" data-lang="python"><span style="display:flex;"><span><span style="color:#aaa;font-style:italic"># Use the encoded authorization string you created from your API Keys.</span> -</span></span><span style="display:flex;"><span>api_keys = (<span style="color:#a50">&#34;CREDENTIALS&#34;</span>) -</span></span></code></pre></div><ol start="7"> -<li>Replace <code>CREDENTIALS</code> with the string you created in the last section.</li> -<li>Next, define your headers:</br></li> -</ol> -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-python" data-lang="python"><span style="display:flex;"><span><span style="color:#aaa;font-style:italic"># Define the header for the request </span> -</span></span><span style="display:flex;"><span>headers = {<span style="color:#a50">&#39;Accept&#39;</span>: <span style="color:#a50">&#39;MEDIA_TYPE&#39;</span>, -</span></span><span style="display:flex;"><span> <span style="color:#a50">&#39;Content-Type&#39;</span>: <span style="color:#a50">&#39;application/json&#39;</span>} -</span></span></code></pre></div><ol start="9"> -<li>Replace <code>MEDIA_TYPE</code> with the Media type we obtained from the API Explorer during the Review the API section above:</br></li> -</ol> -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-python" data-lang="python"><span style="display:flex;"><span>application/json;charset=UTF-<span style="color:#099">8</span>;qs=<span style="color:#099">0.09</span> -</span></span></code></pre></div><ol start="10"> -<li>Put all the variables you just defined together into the request:</br></li> -</ol> -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-python" data-lang="python"><span style="display:flex;"><span><span style="color:#aaa;font-style:italic"># Put everything together to make the API request </span> -</span></span><span style="display:flex;"><span>response = requests.get(api_url, -</span></span><span style="display:flex;"><span> params=params, -</span></span><span style="display:flex;"><span> auth=api_keys, -</span></span><span style="display:flex;"><span> headers=headers) -</span></span></code></pre></div><ol start="11"> -<li>And finally, print the name value from the response:</br></li> -</ol> -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-python" data-lang="python"><span style="display:flex;"><span><span style="color:#aaa;font-style:italic"># Convert the response to formatted JSON and print the `name` property</span> -</span></span><span style="display:flex;"><span><span style="color:#0aa">print</span>(json.dumps(response.json()[<span style="color:#a50">&#34;name&#34;</span>], indent=<span style="color:#099">4</span>)) -</span></span></code></pre></div><ol start="12"> -<li>Make sure your file matches the full example below:</br></li> -</ol> -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-py" data-lang="py"><span style="display:flex;"><span><span style="color:#00a">import</span> <span style="color:#0aa;text-decoration:underline">requests</span> -</span></span><span style="display:flex;"><span><span style="color:#00a">import</span> <span style="color:#0aa;text-decoration:underline">jsons</span> -</span></span><span style="display:flex;"><span> -</span></span><span style="display:flex;"><span><span style="color:#aaa;font-style:italic"># Assemble the URL for the API call </span> -</span></span><span style="display:flex;"><span>api_url = <span style="color:#a50">&#34;https://cad.onshape.com/api/documents/e60c4803eaf2ac8be492c18e&#34;</span> -</span></span><span style="display:flex;"><span> -</span></span><span style="display:flex;"><span><span style="color:#aaa;font-style:italic"># Optional query parameters can be assigned </span> -</span></span><span style="display:flex;"><span>params = {} -</span></span><span style="display:flex;"><span> -</span></span><span style="display:flex;"><span><span style="color:#aaa;font-style:italic"># Use the encoded authorization string you created from your API Keys.</span> -</span></span><span style="display:flex;"><span>api_keys = (<span style="color:#a50">&#34;CREDENTIALS&#34;</span>) -</span></span><span style="display:flex;"><span> -</span></span><span style="display:flex;"><span><span style="color:#aaa;font-style:italic"># Define the header for the request </span> -</span></span><span style="display:flex;"><span>headers = {<span style="color:#a50">&#39;Accept&#39;</span>: <span style="color:#a50">&#39;application/json;charset=UTF-8;qs=0.09&#39;</span>, -</span></span><span style="display:flex;"><span> <span style="color:#a50">&#39;Content-Type&#39;</span>: <span style="color:#a50">&#39;application/json&#39;</span>} -</span></span><span style="display:flex;"><span> -</span></span><span style="display:flex;"><span><span style="color:#aaa;font-style:italic"># Putting everything together to make the API request </span> -</span></span><span style="display:flex;"><span>response = requests.get(api_url, -</span></span><span style="display:flex;"><span> params=params, -</span></span><span style="display:flex;"><span> auth=api_keys, -</span></span><span style="display:flex;"><span> headers=headers) -</span></span><span style="display:flex;"><span> -</span></span><span style="display:flex;"><span><span style="color:#aaa;font-style:italic"># Convert the response to formatted JSON and print the `name` property</span> -</span></span><span style="display:flex;"><span><span style="color:#0aa">print</span>(json.dumps(response.json()[<span style="color:#a50">&#34;name&#34;</span>], indent=<span style="color:#099">4</span>)) -</span></span></code></pre></div><h2 id="run-your-code">Run Your Code</h2> -<ol> -<li>Open your terminal and navigate into the folder where you saved your <code>hello.py</code> file: <code>cd ~/&lt;your-file-path&gt;</code></li> -<li>Install the necessary modules:</li> -</ol> -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>python3 -m pip install requests -</span></span><span style="display:flex;"><span>python3 -m pip install jsons -</span></span></code></pre></div><ol start="3"> -<li>Run your code:</br><code>python3 hello.py</code></li> -<li>Confirm that your console displays:</br><code>&quot;Onshape API Guide&quot;</code></li> -</ol> -<h2 id="other-language-examples">Other Language Examples</h2> -<p>Remember to replace <code>CREDENTIALS</code> with your credentials.</p> -<h3 id="curl">cURL</h3> -<p>Returns the entire response json. Scroll to the bottom to the see <code>name</code> field.</p> -<pre tabindex="0"><code class="language-curl" data-lang="curl">curl -X &#39;GET&#39; \ -https://cad.onshape.com/api/documents/e60c4803eaf2ac8be492c18e&#39; \ --H &#39;Content-Type: application/json&#39; \ --H &#39;Accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; -</code></pre><h3 id="javascript">JavaScript</h3> -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-js" data-lang="js"><span style="display:flex;"><span><span style="color:#00a">import</span> fetch from <span style="color:#a50">&#39;node-fetch&#39;</span>; -</span></span><span style="display:flex;"><span> -</span></span><span style="display:flex;"><span><span style="color:#00a">async</span> <span style="color:#00a">function</span> getDocument(url=<span style="color:#a50">&#39;&#39;</span>) { -</span></span><span style="display:flex;"><span> <span style="color:#00a">const</span> response = <span style="color:#00a">await</span> fetch(url, { -</span></span><span style="display:flex;"><span> method: <span style="color:#a50">&#39;GET&#39;</span>, -</span></span><span style="display:flex;"><span> headers: { -</span></span><span style="display:flex;"><span> <span style="color:#a50">&#39;Content-Type&#39;</span>: <span style="color:#a50">&#39;application/json&#39;</span>, -</span></span><span style="display:flex;"><span> Accept: <span style="color:#a50">&#39;application/json;charset=UTF-8;qs=0.09&#39;</span>, -</span></span><span style="display:flex;"><span> Authorization: <span style="color:#a50">`Basic </span><span style="color:#a50">${</span>btoa(<span style="color:#a50">&#39;CREDENTIALS&#39;</span>)<span style="color:#a50">}</span><span style="color:#a50">`</span> -</span></span><span style="display:flex;"><span> } -</span></span><span style="display:flex;"><span> }); -</span></span><span style="display:flex;"><span> <span style="color:#00a">return</span> response.json(); -</span></span><span style="display:flex;"><span>} -</span></span><span style="display:flex;"><span> -</span></span><span style="display:flex;"><span>getDocument(<span style="color:#a50">&#39;https://cad.onshape.com/api/documents/e60c4803eaf2ac8be492c18e&#39;</span> -</span></span><span style="display:flex;"><span>).then((data) =&gt; { -</span></span><span style="display:flex;"><span> console.log(data.name); -</span></span><span style="display:flex;"><span>}); -</span></span></code></pre></div><h3 id="c">C++</h3> -<p>Returns the entire response json. Scroll to the bottom to the see <code>name</code> field.</p> -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-cpp" data-lang="cpp"><span style="display:flex;"><span><span style="color:#4c8317">#include</span> <span style="color:#4c8317">&lt;iostream&gt;</span><span style="color:#4c8317"> -</span></span></span><span style="display:flex;"><span><span style="color:#4c8317">#include</span> <span style="color:#4c8317">&lt;string&gt;</span><span style="color:#4c8317"> -</span></span></span><span style="display:flex;"><span><span style="color:#4c8317">#include</span> <span style="color:#4c8317">&lt;stdio.h&gt;</span><span style="color:#4c8317"> -</span></span></span><span style="display:flex;"><span><span style="color:#4c8317"></span><span style="color:#00a">using</span> <span style="color:#00a">namespace</span> std; -</span></span><span style="display:flex;"><span> -</span></span><span style="display:flex;"><span><span style="color:#0aa">int</span> <span style="color:#0a0">main</span>() { -</span></span><span style="display:flex;"><span> string url = <span style="color:#a50">&#34;curl &#34;</span>; -</span></span><span style="display:flex;"><span> -</span></span><span style="display:flex;"><span> url += <span style="color:#a50">&#34;-X &#39;GET&#39; &#34;</span>; -</span></span><span style="display:flex;"><span> url += <span style="color:#a50">&#34;&#39;https://cad.onshape.com/api/documents/e60c4803eaf2ac8be492c18e&#39;&#34;</span>; -</span></span><span style="display:flex;"><span> url += <span style="color:#a50">&#34;-H &#39;accept: application/json;charset=UTF-8; qs=0.09&#39; &#34;</span>; -</span></span><span style="display:flex;"><span> url += <span style="color:#a50">&#34;-H &#39;Authorization: Basic CREDENTIALS&#39;&#34;</span>; -</span></span><span style="display:flex;"><span> -</span></span><span style="display:flex;"><span> system(url.c_str()); -</span></span><span style="display:flex;"><span> <span style="color:#00a">return</span> <span style="color:#099">0</span>; -</span></span><span style="display:flex;"><span>} -</span></span></code></pre></div><h3 id="python">Python</h3> -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-py" data-lang="py"><span style="display:flex;"><span><span style="color:#00a">import</span> <span style="color:#0aa;text-decoration:underline">requests</span> -</span></span><span style="display:flex;"><span><span style="color:#00a">import</span> <span style="color:#0aa;text-decoration:underline">jsons</span> -</span></span><span style="display:flex;"><span> -</span></span><span style="display:flex;"><span><span style="color:#aaa;font-style:italic"># Assemble the URL for the API call </span> -</span></span><span style="display:flex;"><span>api_url = <span style="color:#a50">&#34;https://cad.onshape.com/api/documents/e60c4803eaf2ac8be492c18e&#34;</span> -</span></span><span style="display:flex;"><span> -</span></span><span style="display:flex;"><span><span style="color:#aaa;font-style:italic"># Optional query parameters can be assigned </span> -</span></span><span style="display:flex;"><span>params = {} -</span></span><span style="display:flex;"><span> -</span></span><span style="display:flex;"><span><span style="color:#aaa;font-style:italic"># Use the encoded authorization string you created from your API Keys.</span> -</span></span><span style="display:flex;"><span>api_keys = (<span style="color:#a50">&#34;CREDENTIALS&#34;</span>) -</span></span><span style="display:flex;"><span> -</span></span><span style="display:flex;"><span><span style="color:#aaa;font-style:italic"># Define the header for the request </span> -</span></span><span style="display:flex;"><span>headers = {<span style="color:#a50">&#39;Accept&#39;</span>: <span style="color:#a50">&#39;application/json;charset=UTF-8;qs=0.09&#39;</span>, -</span></span><span style="display:flex;"><span> <span style="color:#a50">&#39;Content-Type&#39;</span>: <span style="color:#a50">&#39;application/json&#39;</span>} -</span></span><span style="display:flex;"><span> -</span></span><span style="display:flex;"><span><span style="color:#aaa;font-style:italic"># Putting everything together to make the API request </span> -</span></span><span style="display:flex;"><span>response = requests.get(api_url, -</span></span><span style="display:flex;"><span> params=params, -</span></span><span style="display:flex;"><span> auth=api_keys, -</span></span><span style="display:flex;"><span> headers=headers) -</span></span><span style="display:flex;"><span> -</span></span><span style="display:flex;"><span><span style="color:#aaa;font-style:italic"># Convert the response to formatted JSON and print the `name` property</span> -</span></span><span style="display:flex;"><span><span style="color:#0aa">print</span>(json.dumps(response.json()[<span style="color:#a50">&#34;name&#34;</span>], indent=<span style="color:#099">4</span>)) -</span></span></code></pre></div>Docs: Why Onshape?https://onshape-public.github.io/docs/api-intro/whyonshape/Mon, 01 Jan 0001 00:00:00 +0000https://onshape-public.github.io/docs/api-intro/whyonshape/ -<h2 id="why-onshape">Why Onshape?</h2> -<p>As long as there have been applications that manage organizational data -into a database, there has been a need to share that data between -different departments and therefore, usually, different systems. In a -typical design/manufacturing organization, there could be at least four -or five mission-critical databases that manage the data for different -departments and for different stages in the product’s lifecycle.</p> -<p>Initially, these systems provide the capabilities required by their -consumers (i.e., the departments that use these systems). For instance, -the Finance might use QuickBooks, Manufacturing -might use a manufacturing planning and execution system (MES), -Engineering might use a Product Data management System (PDM), and so on for each -group in the organization.</p> -<p>This often leads to disparate silos of data and knowledge. -The departments in an organization do not work in a vacuum; each is -dependent on information generated by other groups. For -instance, Manufacturing can’t produce accurate assembly instructions -without input from engineering on the designs and the bill of -materials. Finance can’t price the product without understanding its -contents and which parts are manufactured in-house or -purchased.</p> -<p>Therefore, the need to integrate these systems becomes critical for the -organization to function optimally. Initially, connecting one system to -another can be a straightforward process. This usually involves -some services to get the systems to talk to each other, however it -isn&rsquo;t too painful as long as the requirements are clearly -defined.</p> -<p>Anyone who has implemented integrations between PLM (Product -Lifecycle Management) systems or ERP (Enterprise Resource Planning) systems will tell -you of the nightmare scenarios they encountered. Often this is the -result of poorly scoped and defined requirements, conflicting -requirements coming from multiple departments, and the many integration -points required between systems. The result is that the organization is -not getting what it wants or needs, the customer is paying for services -that do not provide the promised solution, and usually the project is -long overdue. All this equals an unhappy customer and often the software -vendor’s solutions are blamed for the disaster.</p> -<p>Over the years, many technologies have appeared (and some of them, just as -quickly disappeared) to enable integration without the need -to write thousands of lines of custom code that needs to be re-written -for every software upgrade. Several technologies provide “codeless” integration between SaaS -products (<a href="wwww.zapier.com">Zapier</a>, for example). These solutions -are particularly good for generic use cases for data exchange between -systems, but can be limited when it comes to custom modifications to the -data being sent that might be required by a specific customer. In -addition, they have the overhead of requiring a subscription to their -service. Sending -corporate IP through another third-party can also cause data security issues.</p> -<p>Therefore, we can understand that in most organizations integration -between systems is a necessary evil that must be tackled, either with -an out-of-the-box solution or through some custom coding.</p> -<p>Early on, Onshape understood that as an engineering system, it cannot -exist in a vacuum; it must be able to communicate with other systems. -For this reason, the REST API was developed.</p> -<p>An API, or <em>application -programming interface</em>, is a set of rules that define how applications -or devices can connect to and communicate with each other. A REST API is -an API that conforms to the design principles of the REST, -or <em>representational state transfer <em>architectural style. For this -reason, REST APIs are sometimes referred to RESTful APIs</em>.</em></p> -<h2 id="onshape-saas">Onshape SaaS</h2> -<p>Onshape was built from the ground up as a true SaaS-based system; Onshape had no investment in legacy code and was able to develop an application that truly runs as a multi-tenant -SaaS solution from the first line of code. Many companies claim to run -cloud-based solutions, but since they have such a large investment -in their legacy code, that they can’t just discard and start again from -scratch. Instead, they tend to try and port that code to the web.</p> -<p>More often than not, porting existing code to the web and calling it a -SaaS solution is no more than a marketing ploy; it isn’t a true SaaS -solution if it wasn’t written as one. These are generally known as cloud-hosted solutions. This means that a typical three-tier data management -solution (which could have previously been installed on a set of servers), -has now been modified to be hosted on the web.</p> -<h3 id="traditional-three-tier-architecture">Traditional three-tier architecture</h3> -<p>Traditional PLM systems typically use a three-tier architecture, mainly -consisting of an application server, a database server, and a client (either a web client or a thick client installed on the client -hardware).</p> -<p><img src="https://onshape-public.github.io/images/integrationguideimage10.png" -style="width:4.91807in;height:3.27083in" -alt="The 3-tier architecture | Download Scientific Diagram" /></p> -<p><em>Typical three-tier architecture</em></p> -<p>To connect to and integrate with this architecture, APIs are usually exposed on -the application or web server. If this -architecture is ported to the web, it cannot make -customizations through the API, since it would modify the behavior of -the program for everyone connected to that application server.</p> -<h3 id="single--vs-multiple-tenant-architectures">Single- vs multiple-tenant architectures</h3> -<p>The three-tier architecture is typical of most -PLM solutions on the market today, which is fine -if you want the solution to be installed on company servers and be -accessible to people within the company only.</p> -<p>When this type of solution is ported to the web, software -vendors typically must create a single-tenant application where an -application server and a database server are provisioned for each new -customer.</p> -<p><img src="https://onshape-public.github.io/images/integrationguideimage11.png" -style="width:5.4311in;height:4.35417in" -alt="Enterprise SaaS Architecture - The Why | Frontegg" /></p> -<p><em>Single-tenant architecture</em></p> -<p>In this case, the vendor must use expensive -hardware to host more customers, which is not a -sustainable model.</p> -<p>Modern 21<sup>st</sup> century software solutions use multi-tenant -solutions that can be hosted on services such as Amazon cloud, Azure, etc. There are many benefits to this architecture, including that servers can be provisioned and -decommissioned on the fly to provide ultimate performance whenever -required. Since servers cost money, decommissioning servers when they -are not required is a key benefit to a true SaaS solution.</p> -<p><img src="https://onshape-public.github.io/images/integrationguideimage12.png" style="width:6.5in;height:4.65417in" -alt="Saas Solutions - Multi-tenant vs multi-instance architectures" /></p> -<p><em>Multi-tenant architecture</em></p> -<p>Since each application is separate in this architecture, we can enable customizations that can’t be implemented in a single-tenant architecture. For example, we can provide access to the REST -APIs that are required for Onshape integration. In the single-tenant -architecture, if you provide API access to the application server, one -customer will be modifying that application for all customers who are -registered on that tenant.</p> -<h2 id="the-onshape-difference">The Onshape Difference</h2> -<p>Onshape does not work like other legacy CAD systems. Onshape was built from scratch for the cloud and as a modern -CAD system, so many of the failings of legacy CAD -systems were excluded.</p> -<p>There are many differences -and benefits to Onshape, which are well-documented in the Onshape Help -and training materials.</p> -<p>The information in this section is specific to integrations, since Onshape does not behave like a traditional file-based -systems. When writing an integration for Onshape, it is -critical to understand the nuances in Onshape’s design practices and how -data is organized in Onshape.</p> -<h3 id="data-drivenfileless">Data-driven/fileless</h3> -<p>Most traditional PDM/PLM systems integrated with CAD systems -enable this integration on a per-file basis. This means that you have an -object in the PDM/PLM system that corresponds directly to a file in the -CAD system. In this way, the PDM/PLM system can manage access to the -files, build assemblies from the files, view the CAD data, and much more.</p> -<p>Onshape, however, does not work this way.</p> -<p>Being data-driven means that Onshape has no files, just data, so an integration into Onshape is going to look -different from any integration to a CAD system that you might have done -previously.</p> -<p>In traditional CAD, a single file represents a snapshot of what the -design looked like at a specific moment in time. Unless it’s changed, it will remain in that state forever. PDM -systems manage these files, and once a designer decides to make a -revision or a release, the file is locked, and a new file can be created -to represent any further updated versions or releases of the design. -PDM/PLM systems are very good at managing this data in an up-to-date -structure, but it does have the drawbacks. They generate many file -copies of a specific design, and once a file is taken out from the system (for instance, to share with a supplier), it is no longer managed and -tracked.</p> -<p>Onshape uses data instead of files. The data is always up-to-date and -can be collaborated on in real-time without the need to send file copies -back and forth. This means that Onshape views versions and releases differently -than those traditional systems do. When integrating with Onshape, we must design for data rather than files.</p> -<p>Files can be generated from -the Onshape data. For example, you can generate a PDF of a -drawing upon release or of a STEP file that can be used by other downstream systems.</p> -<p>A key benefit of a data-driven system is the ability to retrieve detailed, real-time -analytics. Onshape has comprehensive analytics; including who can view or edit a design, when and exactly what edits are made, which commands were used, and how long was spent modifying the design.</p> -<h3 id="built-in-pdm">Built in PDM</h3> -<p>Up until now, CAD was one software program, and PDM/PLM was another -program that had to be integrated with the CAD. In many cases, both -programs could be sold by the same software vendor (even though there -are many PLM systems available that are sold by independent vendors who -have no CAD system). Regardless, a PDM/PLM system always had to be an added solution to the CAD system.</p> -<p>No matter how deep the integration between a CAD system and a PLM -system, there is always the need to sync data between the two. This is usually a weak point in any solution that is prone to errors.</p> -<p>Being data-driven, Onshape already has PDM built in as part of the CAD -system. This is unique in the industry: CAD and PDM as part -of the same solution with no additional piece of software required.</p> -<p><img src="https://onshape-public.github.io/images/integrationguideimage14.png" -style="width:4.49202in;height:4.1652in" -alt="A picture containing graphical user interface Description automatically generated" /></p> -<p><em>Onshape’s revision and part number schema definition interface</em></p> -<p>For instance:</p> -<ul> -<li> -<p>Since the <strong>data is always up-to-date</strong>, the correct state of any design -is always represented in real-time with no delay for syncing between -systems.</p> -</li> -<li> -<p>Unlike file-based systems, <strong>the data is never locked</strong>; it -is always available and always changing.</p> -</li> -<li> -<p>PDM system <strong>data management aspects are fully integrated</strong> into every aspect of -the CAD system.</p> -</li> -<li> -<p>True <strong>real-time collaboration/co-design</strong> on both design and data is -enabled.</p> -</li> -</ul> -<p>So, what does this mean when it comes to integrating Onshape with -another PLM system? First and foremost, we must understand that there -are many things that a PLM system does that Onshape’s PDM capabilities -can’t do. Integrating Onshape to a PLM system should augment the -powerful capabilities already available inside Onshape, not -necessarily replace them. Similarly, Onshape does not replace PLM-native capabilities. Instead, depending on the business case, we can use the best-in-class capabilities of each system to augment the -other.</p> -<p>The Onshape release process is an example of the augmentation of each system&rsquo;s capabilities. Onshape has a specific way of managing the release of data that is -different from traditional PDM systems. This capability is inherently -suited to a data-driven approach and provides a lot of value to the -update of design data in Onshape. At the same time, PLM systems provide -enterprise release processes that may include many people and different -departments that extend beyond the engineering domain. Such PLM -processes can be highly customized and suited to the organizations -established business processes.</p> -<p>In this scenario, it doesn&rsquo;t make sense to avoid the enterprise release -processes in the PLM system. However, also omitting Onshape’s release -capabilities could put data between Onshape and the PLM system out of -sync and prevent Onshape from updating data (e.g., watermarks and -title blocks on drawings, icons related the visualizing the state of -data, etc.).</p> -<p>In this case, we want to use the best-in-class features of each software -solution without compromising the capability provided by each solution. -If we plan our integration correctly, this can be achieved by initiating -the release of the data in Onshape, transferring the release data to the -PLM system where the release process will be triggered, and finally -automating the release in Onshape once the process has been completed in -the PLM system.</p> -<h3 id="multi-part-part-studios">Multi-part Part Studios</h3> -<p>In traditional CAD systems, one file typically equals -one part. While design-in-context is available in most CAD systems, and -multiple solid bodies can be created, each part is self-contained in a separate file. For PLM systems, this -makes it easy to associate an object in the PDM/PLM database with a -specific CAD file. <em>This is not the case in Onshape.</em></p> -<p>In Onshape, parts are designed in what’s called a <em>Part Studio.</em> Within -a Part Studio, the designer is free to create as many parts as they want. -The general rule is that the parts should be related to each other in a -system, thereby making it easier to design one part from another, however -there is a lot of flexibility in how the designer wishes to work.</p> -<p><img src="https://onshape-public.github.io/images/integrationguideimage15.png" -style="width:4.45764in;height:4.12141in" -alt="A picture containing text Description automatically generated" /></p> -<p><em>An example of a multi-part Part Studio in Onshape</em></p> -<p>The structure of the Onshape document is discussed in detail in the <a href="https://onshape-public.github.io/docs/api-intro/architecture">Onshape Architecture</a> page. The Part Studio is included in an Onshape document.</p> -<p>We can already begin to understand that the traditional CAD/PDM paradigm -of &ldquo;one file per object&rdquo; will not work with Onshape; the designer would be forced by the -PDM/PLM system to only create one part per Part Studio. This would -therefore limit the designer’s freedom for creativity in Onshape and -seriously reduce the powerful functionality available for the designer -to use.</p> -<p>Therefore, we need to re-think how we integrate with Onshape versus how we -integrate with traditional CAD systems. Fortunately, Onshape’s REST API -supports the multi-part Part Studio scenario. Instead of associating a -file with an object in the PDM/PLM database, we now use the REST API to -associate a Part with its corresponding object.</p> -<h3 id="versions-and-releases">Versions and releases</h3> -<p>Traditional PDM/PLM systems provide design release support by locking a -CAD file for access. The access controls are defined in the database and -the definition of a part/assembly/drawing as released is controlled by -the database. When a new revision of the part is required, a file copy -is made, and the database provides access to the new copy. Generally, -the old copy representing the previous release persists in the file -store and can be referenced by the database. <em>This is not how Onshape works.</em></p> -<p><img src="https://onshape-public.github.io/images/integrationguideimage16.png" -style="width:2.66865in;height:3.09375in" />Since there are no files in -Onshape (just data) no file locking or copy mechanisms are -available. Instead, Onshape looks at the data as a continuous timeline -that is always moving forward and always changing as the design evolves. -The data is never locked; it is always available.</p> -<p>In place of file copies that represent versions and releases of the -design, Onshape provides the ability to create <em>versions</em> as bookmarks -in the timeline. When creating a version, Onshape places a bookmark in -the timeline that represents the state of the design at that specific -moment in time. Releases work in a similar way, but they are defined -as official, company-approved processes and have special meaning.</p> -<p>In addition to creating versions and releases, Onshape can create <em>branches</em>, which can be defined as alternative timelines. A -designer might want to experiment with alternate design ideas without -modifying the existing design that others are working on. By -creating a branch from any point in the timeline, the designer is -free to experiment with alternate ideas. If the ideas work, they can be -merged into the current timeline at any point.</p> -<p>From an integration perspective, we need to take into -consideration how Onshape works with versions and releases. Since a release represents a company-approved design, Onshape provides processes for the approval of -a release and the change of state of a design. Onshape also provides -APIs and triggers (events) that enable integration points throughout the -release process. It is through the triggers and the APIs that -integration of any third-party system that wishes to manage the release -process is enabled.</p> -<h3 id="workflows">Workflows</h3> -<p>Release and obsoletion workflows are included with Onshape and can be customized to meet company standards.</p> -<p>For details on how to implement and customize Onshape’s workflows, -please review these online help topics:</p> -<ul> -<li><a href="https://cad.onshape.com/help/Content/relmgmt_custom.htm">How to design release management processes</a></li> -<li><a href="https://cad.onshape.com/help/Content/custom_workflow.htm">How to create a customized release workflow</a></li> -</ul> -<p>Most PDM/PLM systems can model a company’s -business processes in a workflow. These can be highly automated -processes that move data and file references through a process of -reviews and approvals. Onshape also has this capability, which is -currently used for release and obsoletion processes.</p> -<p>There are no files or file references in Onshape that are moved -through the process. Onshape only has data. Therefore, it is the data -that is referenced at each stage of the process. Traditional PDM systems -might make file copies and lock files as they move through a release -process. If the process is rejected at any stage, those -files must be discarded, the previous version of the files unlocked and -all states updated. In short, it system must rewind back to the state of the files and -the data when the workflow was initiated. This is a lot of complex -actions that must occur when a process is rejected for any reason. <em>Onshape doesn’t work this way.</em></p> -<p>A release process can be started on data (such as assemblies, parts, -drawings, etc.). For example, if the state of a referenced part is updated to -“Pending,” and the process is rejected at any stage, there -is no rewinding of files and data; the data just reverts to the -original “In Progress” state, and the workflow is discarded. Since the -workflow didn’t complete, nothing related to the data has actually -changed. When you are used to traditional PDM systems, this feels like -an anti-climax, and we often receive the question, “But where’s my -process? Where’s the data that was attached to the process?”. Well, the -answer is: nothing changed. Until the process is completed, nothing -actually changes, so the data is in the same state it was prior to the -initialization of the release process.</p> -<p><img src="https://onshape-public.github.io/images/integrationguideimage17.png" -style="width:3.39863in;height:2.61034in" -alt="A picture containing chart Description automatically generated" /></p> -<p><em>A custom release process in Onshape</em></p> \ No newline at end of file +Introduction to the Onshape REST API onhttps://onshape-public.github.io/docs/api-intro/Recent content in Introduction to the Onshape REST API onHugoen-usMon, 18 May 2020 20:39:14 -0400API Explorerhttps://onshape-public.github.io/docs/api-intro/explorer/Mon, 18 May 2020 20:39:14 -0400https://onshape-public.github.io/docs/api-intro/explorer/We document all available Onshape REST API endpoints in our Glassworks API Explorer: +https://cad.onshape.com/glassworks/explorer/ +This API Explorer site enables you to run API requests directly within its interface and provides the output from the API call. To try an endpoint in the API Explorer, follow these steps or follow along with the video below: +Open this public Onshape document in your browser: https://cad.onshape.com/documents/e60c4803eaf2ac8be492c18e/w/d2558da712764516cc9fec62/e/6bed6b43463f6a46a37b4a22 Open the API Explorer in a new browser tab: https://cad.Architecturehttps://onshape-public.github.io/docs/api-intro/architecture/Mon, 01 Jan 0001 00:00:00 +0000https://onshape-public.github.io/docs/api-intro/architecture/Design in Onshape typically beings with a document, which is the container that includes all content related to a specific design. All data in an Onshape document is stored in Elements. Part Studios and Assemblies are two of the most common element types in a design. Throughout the design process, creating versions can be useful for product development management while working on the “Main” workspace. See also: +The API Introduction page for information on how documents, workspaces, and elements are assembled into a URL.Quick Starthttps://onshape-public.github.io/docs/api-intro/quickstart/Mon, 18 May 2020 20:39:14 -0400https://onshape-public.github.io/docs/api-intro/quickstart/In this example, we will call an Onshape REST API endpoint to send a document name to our console. Please note that the sample shown on this page is only designed to be used as a quick start guide and does not represent a full Onshape application. +System Requirements You must be signed in to your Onshape account at https://cad.onshape.com (or https://companyName.onshape.com for Enterprise accounts). This example is coded in Python.Why Onshape?https://onshape-public.github.io/docs/api-intro/whyonshape/Mon, 01 Jan 0001 00:00:00 +0000https://onshape-public.github.io/docs/api-intro/whyonshape/Why Onshape? As long as there have been applications that manage organizational data into a database, there has been a need to share that data between different departments and therefore, usually, different systems. In a typical design/manufacturing organization, there could be at least four or five mission-critical databases that manage the data for different departments and for different stages in the product’s lifecycle. +Initially, these systems provide the capabilities required by their consumers (i. \ No newline at end of file diff --git a/docs/api-intro/quickstart/index.html b/docs/api-intro/quickstart/index.html index 3a379f5..67c6085 100644 --- a/docs/api-intro/quickstart/index.html +++ b/docs/api-intro/quickstart/index.html @@ -1,8 +1,8 @@ -Quick Start |

    Quick Start

    In this example, we will call an Onshape REST API endpoint to send a document name to our console. Please note that the sample shown on this page is only designed to be used as a quick start guide and does not represent a full Onshape application.

    System Requirements

    Review the API Endpoint

    1. Go to the API Explorer and scroll to Document.
    2. Expand the GET /documents/{did} endpoint. Note that in the URL, the name of this API is getDocument.
    3. Make a note of the URL structure and the parameters required to make this request. This will become the fixed URL part of our API call.
      image
      For this endpoint, we only need to get the document ID from the document URL.
    4. Scroll down and make a note of the Media Type that we’ll need to include in our header.
      image

    Review the Document

    Navigate to this public document, and make a note of the document ID in the URL (e60c4803eaf2ac8be492c18e).
    image

    Create your API Keys

    1. Go to https://dev-portal.onshape.com.
    2. In the left pane, click API keys.
    3. Click the Create new API key button.
    4. Select the following permissions for your app:
      • Application can read your documents.
      • Application can write to your documents.
    5. Click the Create API key button.
      image
    6. Copy both the access key and secret key from the pop-up window, save them somewhere, then click the Close button.
      IMPORTANT NOTE: You will not be able to find the secret key again, so save it somewhere safe!
      image
    7. The details for your application appear.
      image
    8. Open your terminal and run the following command, replacing ACCESS_KEY and SECRET_KEY with the access key and secret key you created above. Remember to include the colon (:) between the keys.
    \ No newline at end of file diff --git a/docs/api-intro/whyonshape/index.html b/docs/api-intro/whyonshape/index.html index b445369..83aa404 100644 --- a/docs/api-intro/whyonshape/index.html +++ b/docs/api-intro/whyonshape/index.html @@ -1,10 +1,8 @@ -Why Onshape? |

    Why Onshape?

    Why Onshape?

    As long as there have been applications that manage organizational data +Why Onshape? |

    Why Onshape?

    Why Onshape?

    As long as there have been applications that manage organizational data into a database, there has been a need to share that data between different departments and therefore, usually, different systems. In a typical design/manufacturing organization, there could be at least four @@ -214,4 +212,4 @@ process? Where’s the data that was attached to the process?”. Well, the answer is: nothing changed. Until the process is completed, nothing actually changes, so the data is in the same state it was prior to the -initialization of the release process.

    A picture containing chart Description automatically generated

    A custom release process in Onshape

    \ No newline at end of file +initialization of the release process.

    A picture containing chart Description automatically generated

    A custom release process in Onshape

    \ No newline at end of file diff --git a/docs/app-dev/clientmessaging/index.html b/docs/app-dev/clientmessaging/index.html index 56be674..6aa67e4 100644 --- a/docs/app-dev/clientmessaging/index.html +++ b/docs/app-dev/clientmessaging/index.html @@ -1,14 +1,16 @@ -Client Messaging | Client Messaging |

    Client Messaging

    Application extensions and the Onshape JavaScript web client need to communicate directly, calling across the iframe containing the application extension using post message.

    image alt text

    Onshape Client Messaging examples can be split into those that are initiated from the application extension and those that are initiated from the Onshape client.

    Messages from the Extension

    These Client Messaging examples can be initiated from the application extension:

    • Click/close flyouts events: Notify the Onshape client that the user has clicked in the application extension, which should cause Onshape flyouts (versions, history, uploads, etc.) and dropdown menus (profile dropdown menu, document menu) to close. Without this, flyouts and menus might remain open over the application extension.
    • Shortcut keyboard events: Shortcut keys (such as ?, which opens the Onshape Help dialog), can be handled by the application extension by posting a message to the Onshape client to open the dialog.
    • keepAlive: Notify the Onshape client that the user is actively working in the application extension, which triggers the Onshape client to send a message to the server to keep the browser session alive. Without this, the Onshape browser session will timeout and ask the user to sign in again.
    • Standard Onshape dialogs: Request from the application extension to the Onshape client to open one of the Onshape standard dialogs and send the user’s choices back to the application extension. For example, if the application extension needs the user to choose a part or assembly to be operated on, the application extension can post a message to the Onshape client requesting that dialog be opened and the selected part or assembly information sent back to the application extension.
    • UI customization": Request from the application extension to the Onshape client to customize the Onshape UI (e.g., add commands to menus, add buttons to the toolbars, etc). When these commands or toolbar buttons are clicked, the Onshape client posts a message to the application extension with the available context.
      • Note: This is limited to cases where the application extension is made active by the user; application extensions are not automatically loaded when a document is opened. Most UI customizations should be done when you register the application with Onshape, as those change the Onshape client automatically without needing to load the application extension first.
    • Content/material insertion: Request from the application extension to insert content into the Onshape document. For example, insert a part into a new or existing Part Studio, apply a material to a part, add a material to a material library, etc.

    Messages from Onshape

    The following examples can be initiated from the Onshape client:

    • User action notification: The Onshape client can notify an application extension when various user actions occur. For example, the Onshape client might notify when the user has made the application extension active or inactive (when the user clicks on document tabs). When an application extension is made inactive, it is moved off the edges of the browser, so it cannot be seen, but is still active, preserving its state.
    • Printing: The Onshape client can notify an application extension when the user has chosen the Print command from the main Onshape document menu, enabling the application extension to perform a print operation.

    Security Considerations

    To ensure security, an application extension must:

    • Parse for document, workspace, and element IDs: Parse for the documentId, workspaceId, and elementId that were passed as query parameters within the application extension’s iframe src URL. You must post these back in each POST message.
    • Parse for the server: Parse for the server that was passed as a query parameter within the application extension’s iframe src URL. You must use this to validate messages received.
      • If the application extension uses a JavaScript library or framework (e.g., BackboneJS or AngularJS), it can parse the query parameters and maintain state in other ways.
    • Not redirect to another base URL: The browser tells the Onshape client the origin base URL from which a POST message is received. The Onshape client ignores messages posted from an origin URL that doesn’t match the original iframe src URL. It is extremely important to the security of your application that you verify that the origin of all messages you receive is the same as the original server query parameter in the iframe src (i.e., if (server === e.origin)). In production operation especially, the message IS NOT SAFE if the message origin does not match the iframe src server query parameter. Application extensions should not redirect to another base URL after the iframe has been opened, or the messages will be ignored.
    • Post a message on startup: Onshape will not post messages until a newly started application extension has first posted a valid message to Onshape. This constraint is in effect anytime an application extension is (re)started and exists to avoid posting messages to application extensions that are not ready to handle them, are not fully loaded, etc. After your application extension is fully loaded and ready to receive messages, post a message to Onshape. A keepAlive message is a great first message to send to Onshape. Once Onshape receives a valid message, Onshape will start posting messages to the application extension. If the application extension later sends an invalid message Onshape will stop sending messages until a valid message is posted to Onshape.

    POST messages submitted by application extensions to Onshape will be ignored if any of the following are true:

    • The documentId, workspaceId, or elementId are missing or not valid.
    • The message name is missing or not recognized.
    • The origin of the POST message does not match the original iframe src URL.

    Element Tab

    Messages may be sent and received by element tab application extensions.

    The following messages can be sent by Element tab application extensions:

    messageName +Click/close flyouts events: Notify the Onshape client that the user has clicked in the application extension, which should cause Onshape flyouts (versions, history, uploads, etc.">

    Client Messaging

    Application extensions and the Onshape JavaScript web client need to communicate directly, calling across the iframe containing the application extension using post message.

    image alt text

    Onshape Client Messaging examples can be split into those that are initiated from the application extension and those that are initiated from the Onshape client.

    Messages from the Extension

    These Client Messaging examples can be initiated from the application extension:

    • Click/close flyouts events: Notify the Onshape client that the user has clicked in the application extension, which should cause Onshape flyouts (versions, history, uploads, etc.) and dropdown menus (profile dropdown menu, document menu) to close. Without this, flyouts and menus might remain open over the application extension.
    • Shortcut keyboard events: Shortcut keys (such as ?, which opens the Onshape Help dialog), can be handled by the application extension by posting a message to the Onshape client to open the dialog.
    • keepAlive: Notify the Onshape client that the user is actively working in the application extension, which triggers the Onshape client to send a message to the server to keep the browser session alive. Without this, the Onshape browser session will timeout and ask the user to sign in again.
    • Standard Onshape dialogs: Request from the application extension to the Onshape client to open one of the Onshape standard dialogs and send the user’s choices back to the application extension. For example, if the application extension needs the user to choose a part or assembly to be operated on, the application extension can post a message to the Onshape client requesting that dialog be opened and the selected part or assembly information sent back to the application extension.
    • UI customization": Request from the application extension to the Onshape client to customize the Onshape UI (e.g., add commands to menus, add buttons to the toolbars, etc). When these commands or toolbar buttons are clicked, the Onshape client posts a message to the application extension with the available context.
      • Note: This is limited to cases where the application extension is made active by the user; application extensions are not automatically loaded when a document is opened. Most UI customizations should be done when you register the application with Onshape, as those change the Onshape client automatically without needing to load the application extension first.
    • Content/material insertion: Request from the application extension to insert content into the Onshape document. For example, insert a part into a new or existing Part Studio, apply a material to a part, add a material to a material library, etc.

    Messages from Onshape

    The following examples can be initiated from the Onshape client:

    • User action notification: The Onshape client can notify an application extension when various user actions occur. For example, the Onshape client might notify when the user has made the application extension active or inactive (when the user clicks on document tabs). When an application extension is made inactive, it is moved off the edges of the browser, so it cannot be seen, but is still active, preserving its state.
    • Printing: The Onshape client can notify an application extension when the user has chosen the Print command from the main Onshape document menu, enabling the application extension to perform a print operation.

    Security Considerations

    To ensure security, an application extension must:

    • Parse for document, workspace, and element IDs: Parse for the documentId, workspaceId, and elementId that were passed as query parameters within the application extension’s iframe src URL. You must post these back in each POST message.
    • Parse for the server: Parse for the server that was passed as a query parameter within the application extension’s iframe src URL. You must use this to validate messages received.
      • If the application extension uses a JavaScript library or framework (e.g., BackboneJS or AngularJS), it can parse the query parameters and maintain state in other ways.
    • Not redirect to another base URL: The browser tells the Onshape client the origin base URL from which a POST message is received. The Onshape client ignores messages posted from an origin URL that doesn’t match the original iframe src URL. It is extremely important to the security of your application that you verify that the origin of all messages you receive is the same as the original server query parameter in the iframe src (i.e., if (server === e.origin)). In production operation especially, the message IS NOT SAFE if the message origin does not match the iframe src server query parameter. Application extensions should not redirect to another base URL after the iframe has been opened, or the messages will be ignored.
    • Post a message on startup: Onshape will not post messages until a newly started application extension has first posted a valid message to Onshape. This constraint is in effect anytime an application extension is (re)started and exists to avoid posting messages to application extensions that are not ready to handle them, are not fully loaded, etc. After your application extension is fully loaded and ready to receive messages, post a message to Onshape. A keepAlive message is a great first message to send to Onshape. Once Onshape receives a valid message, Onshape will start posting messages to the application extension. If the application extension later sends an invalid message Onshape will stop sending messages until a valid message is posted to Onshape.

    POST messages submitted by application extensions to Onshape will be ignored if any of the following are true:

    • The documentId, workspaceId, or elementId are missing or not valid.
    • The message name is missing or not recognized.
    • The origin of the POST message does not match the original iframe src URL.

    Element Tab

    Messages may be sent and received by element tab application extensions.

    The following messages can be sent by Element tab application extensions:

    messageName (case sensitive)other message properties?comment
    applicationInityes
    notifyWhenSaveRequired: whether Onshape should send a notification to save pending changes during certain operations
     (default is false)
     
    Send once on application startup.
    closeFlyoutsAndMenusnoSend when a mouse click or other event happens in the application extension. Closes Onshape flyouts and dropdown menus.
    closeSelectItemDialognoCloses the select item dialog.
    connectionLostnoDisplays the standard Onshape connection lost message in a message bubble, forcing the user to either reload the document or return to the documents page.
    errorReloadyes
    message: your message
    @@ -165,7 +167,7 @@
     };
     
     window.parent.postMessage(initMessage, '*');
    -

    Right panel interaction sequence

    The sequence diagram below illustrates the interaction between an Element right panel application extension and the Onshape client:

    %%{
    +

    Right panel interaction sequence

    The sequence diagram below illustrates the interaction between an Element right panel application extension and the Onshape client:

    %%{
       init: {
         "theme": "default",
         "sequence": {
    @@ -184,9 +186,9 @@
       actor user
       participant OSC AS Onshape Client
       participant AE AS Application Extension
    -  user->>+OSC: start element right panel extension
    +  user->>+OSC: start element right panel extension
       Note right of user: via configured button
    -  OSC->>+AE: invoke action url (with query params)
    +  OSC->>+AE: invoke action url (with query params)
       AE->>OSC: postMessage(messageName: 'applicationInit')
       loop selection interactions
         user->>OSC: select
    @@ -196,8 +198,7 @@
         Note right of user: via configured button
       deactivate AE
       OSC-XAE: destroy
    -  deactivate OSC
    -

    Right panel message exchange

    The following messages are exchanged for application extensions located in the element right panel and configured for Part Studio, Assembly, or Document contexts.

    The first message with messageName attribute set to applicationInit is sent to the Onshape client by an application extension once it is loaded and ready to receive and process incoming messages:

        {
    +  deactivate OSC

    Right panel message exchange

    The following messages are exchanged for application extensions located in the element right panel and configured for Part Studio, Assembly, or Document contexts.

    The first message with messageName attribute set to applicationInit is sent to the Onshape client by an application extension once it is loaded and ready to receive and process incoming messages:

        {
             documentId: '<document id>',
             workspaceId: '<workspace id>',
             elementId: '<element id>',
    @@ -226,4 +227,59 @@
             }
         ]
     }
    -

    Notes

    Keyboard focus

    Keyboard focus will not be transferred to an application until the user clicks in the application or the application programmatically takes focus. An application should programmatically take focus when it is first loaded and when it receives a show message from Onshape. Shortcut keys will work immediately when the application is shown.

    Future work

    • New message types will be added as needed. If your application extension needs a message not listed in this document, please notify us, and we’ll work with you on it.
    • Mobile client support is unclear at this time.
    • Onshape is considering using promises to wrap POST messages, which would make the application extension’s JavaScript simpler and enable chaining POSTs with other operations. Promises would make some interactions with multiple responses difficult (e.g., when you open a dialog, like the Select Item dialog, and want to receive multiple POST messages back due to the user clicking on multiple items in the dialog).
    \ No newline at end of file +

    Notes

    Keyboard focus

    Keyboard focus will not be transferred to an application until the user clicks in the application or the application programmatically takes focus. An application should programmatically take focus when it is first loaded and when it receives a show message from Onshape. Shortcut keys will work immediately when the application is shown.

    Future work

    • New message types will be added as needed. If your application extension needs a message not listed in this document, please notify us, and we’ll work with you on it.
    • Mobile client support is unclear at this time.
    • Onshape is considering using promises to wrap POST messages, which would make the application extension’s JavaScript simpler and enable chaining POSTs with other operations. Promises would make some interactions with multiple responses difficult (e.g., when you open a dialog, like the Select Item dialog, and want to receive multiple POST messages back due to the user clicking on multiple items in the dialog).
    \ No newline at end of file diff --git a/docs/app-dev/extensions/index.html b/docs/app-dev/extensions/index.html index 8d57557..1750583 100644 --- a/docs/app-dev/extensions/index.html +++ b/docs/app-dev/extensions/index.html @@ -1,6 +1,4 @@ -Extensions |

    Extensions

    This page provides information for some of the more common options for +Extensions |

    Extensions

    This page provides information for some of the more common options for embedding a third-party application into the Onshape interface. Onshape provides many options for embedding commands in various menus, fly-out panels, and elements. In this example, you will embed a custom web page inside a document’s right side fly-out panel. This interface will receive information from Onshape and push information from the panel back to Onshape, providing a complete, bi-directional integration scenario.

    Please see also:

    Extension Types

    We can classify extensions into two high-level types. The first type embeds a UI from the application into the Onshape UI. The embedded UI is an HTTPS page displayed in an iFrame in the Onshape UI. The UI is served from the application, and can choose to make API calls to Onshape for additional information. This is exactly like the traditional tab-based applications in Onshape, except that such extensions exist at different UI locations.

    The second type of extension embeds an action that calls a REST API exposed by the application from the Onshape UI (e.g., context menu actions and toolbar actions). These types of extensions rely on External OAuth information to authenticate and make a call where Onshape acts as a client, and the application acts as a server.

    Extension Attributes

    Each extension exists at a specific place in the Onshape UI and works with a specific context or selection. The attributes of an extension are:

    1. Name: This should be short and explicit. It will appear in the Onshape UI as a menu item, a toolbar tooltip, a collapsed panel icon tooltip, or a panel icon. It might be truncated in the UI if it is too long.
    2. Description: This is where the developer can record a detailed description of the extension. It does not appear in the Onshape UI, but could appear in the grant process.
    3. Location: This describes where the extension exists in the Onshape UI. Over time, this will cover various panels in the UI, context menus, toolbars, actions in dialogs, etc. You can see the list of currently supported locations here.
      • Please note that you can create only one element tab extension per application.
    4. Context (selection): Some locations will work in the context of a selection. Let’s say the application developer wants to show some information from a third-party system, pertinent only to parts (not assemblies or drawings). In this scenario, the developer would choose a location like ‘Document list info panel’, and the context as ‘Selected part’. If the user searches for something in the document list, some documents, Part Studios, parts, and Assemblies would be returned. This extension will show up in the Info panel only if the selected entity is a part. Using context enables application developers to control when the extension is displayed. Check the list of contexts available for different locations here.
    5. Action URL: Locations that embed a UI use the action URL to define the address of the page to display. The action URL is used to specify the REST endpoint if the location is an action (context menu, toolbar item, action in dialog etc.) and the action type is GET or POST. If the location is an action and the action is ‘Open in new window’, the action URL is the URL to open in the new window.
      The action URL can be parameterized to pass information from Onshape to the application. The action URL replaces attributes in the format {$attribute} with the appropriate value. These attributes can be used to identify the selected entity and/or make calls back to Onshape via the API. The currently supported attributes are:
      • {$documentId} - The Onshape ID for the current or selected document.
      • {$workspaceOrVersion} - This will be either w or v for workspace or version respectively depending on current opened document state or selection.
      • {$workspaceOrVersionId} - The Onshape ID for the current or selected workspace or version.
      • {$workspaceId} - Use {$workspaceOrVersionId} instead.
      • {$versionId} - Use {$workspaceOrVersionId} instead.
      • {$microversionId} - The Onshape ID for the current or select document microversion.
      • {tabElementId} - The Onshape ID for the current tab.
      • {$elementId} - The Onshape ID for the current or selected element.
      • Note: In most cases, tabElementId and elementId will be the same. However, when creating an extension with the Selected instance context, tabElementId indicates the current tab (i.e., the target element), and elementId indicates the tab from which the instance/subassembly was inserted (i.e., the source element).
      • {$partId} - The Onshape ID for the current or selected part.
      • {$partNumber} - The Part number property for the current or selected part, assembly or drawing.
      • {$revision} - The Revision property for the current or selected part, assembly or drawing.
      • {$companyId} - The ID for the company that owns the document.
      • {$mimeType} - The mime type if the current or selected element is a blob.
      • {$featureId} - In case of feature selected in the Feature list in a Part Studio.
      • {$nodeId} - In case of mate or mate feature selected in the Assembly list.
      • {$occurrencePath} - In case of part instances, mates, mate connectors and sub assemblies.
      • {$configuration} - In case of extensions inside the document, this attribute will be replaced by current element active configuration.

    The attributes can exist as path parameters or query parameters or attributes in the POST body. For example:

    [https://whispering-sea-42267.herokuapp.com/oauthSignin?documentId={$documentId}&workspaceOrVersion={workspaceOrVersion}&workspaceOrVersionId={$workspaceOrVersionId}&elementId={$elementId}&partId={$partId}&server=https://cad.onshape.com&companyId=cad&userId=5f1eba76c14a434817d9c588&locale=en-US](https://whispering-sea-42267.herokuapp.com/oauthSignin?documentId=%7B$documentId%7D&workspaceId=%7B$workspaceId%7D&elementId=%7B$elementId%7D&partId=%7B$partId) 
     

    or

    [https://cad.onshape.com/api/partstudios/d/{$documentId}/{$workspaceOrVersion}/{$workspaceOrVersionId}/e/{$elementId}/stl?server=https://cad.onshape.com&companyId=cad&userId=5f1eba76c14a434817d9c588&locale=en-US](https://cad.onshape.com/api/partstudios/d/%7B$documentId%7D/w/%7B$workspaceId%7D/e/%7B$elementId%7D/stl) 
    @@ -29,4 +27,4 @@
                "partNumber" : <next part number generated by third party numbering scheme>
        }
      ]
    -

    Third-party applications can simply fill the "partNumber" attribute with the part number generated by the custom numbering scheme and send it as a response. However, the response should at least contain "id" and "partNumber" as highlighted above; other attributes are optional.

    Custom numbering schemes for part generation, once set in the Release management page, can be invoked from all the places where we set part numbers, including the Release candidate dialog shown below:

    image alt text

    Sample code

    We have provided a sample application that supports the features described in this document.

    The source code for this Inventory management application can be found in our public GitHub repository.

    The instructions to install and the application are available in the README.md file in the repository.

    The application is built on the Passport node module. It is based on this article. Please read the article before proceeding with this section.

    Some structural information about the application:

    • The dependencies are defined in package.json
    • The routing for inbound calls is defined in server.js. This includes routing for OAuth2 calls as well as calls for the rest APIs we expose that Onshape can call via the extensions.
    • The OAuth2 calls are routed to controllers/oauth2.js. These include calls to authenticate as calls to get the bearer token.
    • controllers/oauth2.js uses controllers/auth.js to interact with Passport to manage the authentication and storage.
    • Other API calls to get part number, etc, route to the appropriate controller in the controllers directory.
    • The controllers use the model defined in the model directory.

    The application is defined in the Developer Portal with extensions that use the exposed APIs.

    The following screenshots define the base configuration of the application and some of the sample extensions.

    \ No newline at end of file +

    Third-party applications can simply fill the "partNumber" attribute with the part number generated by the custom numbering scheme and send it as a response. However, the response should at least contain "id" and "partNumber" as highlighted above; other attributes are optional.

    Custom numbering schemes for part generation, once set in the Release management page, can be invoked from all the places where we set part numbers, including the Release candidate dialog shown below:

    image alt text

    Sample code

    We have provided a sample application that supports the features described in this document.

    The source code for this Inventory management application can be found in our public GitHub repository.

    The instructions to install and the application are available in the README.md file in the repository.

    The application is built on the Passport node module. It is based on this article. Please read the article before proceeding with this section.

    Some structural information about the application:

    • The dependencies are defined in package.json
    • The routing for inbound calls is defined in server.js. This includes routing for OAuth2 calls as well as calls for the rest APIs we expose that Onshape can call via the extensions.
    • The OAuth2 calls are routed to controllers/oauth2.js. These include calls to authenticate as calls to get the bearer token.
    • controllers/oauth2.js uses controllers/auth.js to interact with Passport to manage the authentication and storage.
    • Other API calls to get part number, etc, route to the appropriate controller in the controllers directory.
    • The controllers use the model defined in the model directory.

    The application is defined in the Developer Portal with extensions that use the exposed APIs.

    The following screenshots define the base configuration of the application and some of the sample extensions.

    \ No newline at end of file diff --git a/docs/app-dev/index.html b/docs/app-dev/index.html index 5e620ba..82cd4f8 100644 --- a/docs/app-dev/index.html +++ b/docs/app-dev/index.html @@ -1,5 +1,10 @@ -App Development |

    App Development

    The primary APIs provided by Onshape are REST interfaces that can be accessed over HTTPS. The client can be a web server or a desktop application (including command line tools, such as curl). Onshape does not support use of the APIs directly from a browser client due to cross-domain scripting concerns.

    Partner applications typically interact with Onshape in three ways:

    • File Exchange: Onshape provides extensive import and export translation capabilities to interact with applications that can read or write a variety of file formats.
    • Live Link Integration: Desktop or server applications can use REST calls to read information from the Onshape servers and store information back. These applications can gain “cloud value” by using Onshape data management capabilities for sharing, versioning, and durability.
    • In-Tab Integration: Web server applications can create a tightly integrated experience within Onshape by using a combination of REST and client-side APIs to build a seamless interaction by interacting with users inside an Onshape tab.

    The following diagram illustrates basic desktop integration and cloud integration architecture:

    images

    The Onshape Server Stack consists of several cooperating servers that provide the underlying support for the Onshape CAD experience. The Onshape servers are built with a variety of technologies, including Java and C++, database and message services, geometry and constraint management systems, and much more.

    Partner cloud applications can be written in any web framework. Onshape provides a set of sample apps in Github, as well as text tutorials.

    You may notice that the above diagram does not illustrate the Onshape mobile clients for iOS and Android devices; the development of 3rd-party mobile applications for Onshape is beyond the scope of this document.

    Integration Considerations

    There is much to Onshape that is different from +App Development |

    App Development

    The primary APIs provided by Onshape are REST interfaces that can be accessed over HTTPS. The client can be a web server or a desktop application (including command line tools, such as curl). Onshape does not support use of the APIs directly from a browser client due to cross-domain scripting concerns.

    Partner applications typically interact with Onshape in three ways:

    • File Exchange: Onshape provides extensive import and export translation capabilities to interact with applications that can read or write a variety of file formats.
    • Live Link Integration: Desktop or server applications can use REST calls to read information from the Onshape servers and store information back. These applications can gain “cloud value” by using Onshape data management capabilities for sharing, versioning, and durability.
    • In-Tab Integration: Web server applications can create a tightly integrated experience within Onshape by using a combination of REST and client-side APIs to build a seamless interaction by interacting with users inside an Onshape tab.

    The following diagram illustrates basic desktop integration and cloud integration architecture:

    images

    The Onshape Server Stack consists of several cooperating servers that provide the underlying support for the Onshape CAD experience. The Onshape servers are built with a variety of technologies, including Java and C++, database and message services, geometry and constraint management systems, and much more.

    Partner cloud applications can be written in any web framework. Onshape provides a set of sample apps in Github, as well as text tutorials.

    You may notice that the above diagram does not illustrate the Onshape mobile clients for iOS and Android devices; the development of 3rd-party mobile applications for Onshape is beyond the scope of this document.

    Integration Considerations

    There is much to Onshape that is different from traditional CAD and PDM systems. For system integrators who have previous experience with these types of systems, the instinct is to try and apply the concepts developed for those integrations to an Onshape @@ -24,4 +29,4 @@ to develop a successful integration if the requirements aren’t clearly stated. The business process(es) that you manage through the integration should be mapped out, along with the systems -involved and which system is responsible for which function.

  • Use standards and Published APIs: Developers hate when thousands of lines of code and days of work are thrown away because of an upgrade of a piece of software. By using industry standards and published APIs, you will protect yourself from such a disaster.
  • Create an Application

    To create an application that interacts with Onshape:

    1. Follow the steps on the OAuth page to register your application in the Onshape Developer Portal and set up authentication.
      • Onshape uses industry standards for establishing a secure connection between itself and a third-party application. To access Onshape’s resources, any application requesting those resources must be authenticated by Onshape. Likewise, if Onshape needs to access resources from a third-party application, Onshape must be correctly authenticated by the third party prior to access being granted.
    2. Use the Onshape APIs to create your application.
    3. Review the other pages in the App Development section of the Developer Documentation for information on app development best practices and methodologies.
    4. Follow the steps on the Onshape App Store page to submit your application to the Onshape App Store.

    Resources

    \ No newline at end of file +involved and which system is responsible for which function.
  • Use standards and Published APIs: Developers hate when thousands of lines of code and days of work are thrown away because of an upgrade of a piece of software. By using industry standards and published APIs, you will protect yourself from such a disaster.
  • Create an Application

    To create an application that interacts with Onshape:

    1. Follow the steps on the OAuth page to register your application in the Onshape Developer Portal and set up authentication.
      • Onshape uses industry standards for establishing a secure connection between itself and a third-party application. To access Onshape’s resources, any application requesting those resources must be authenticated by Onshape. Likewise, if Onshape needs to access resources from a third-party application, Onshape must be correctly authenticated by the third party prior to access being granted.
    2. Use the Onshape APIs to create your application.
    3. Review the other pages in the App Development section of the Developer Documentation for information on app development best practices and methodologies.
    4. Follow the steps on the Onshape App Store page to submit your application to the Onshape App Store.

    Resources

    \ No newline at end of file diff --git a/docs/app-dev/index.xml b/docs/app-dev/index.xml index d472573..eba1979 100644 --- a/docs/app-dev/index.xml +++ b/docs/app-dev/index.xml @@ -1,1331 +1,7 @@ -– App Developmenthttps://onshape-public.github.io/docs/app-dev/Recent content in App Development onHugo -- gohugo.ioen-usMon, 18 May 2020 20:44:05 -0400Docs: Extensionshttps://onshape-public.github.io/docs/app-dev/extensions/Mon, 01 Jan 0001 00:00:00 +0000https://onshape-public.github.io/docs/app-dev/extensions/ -<p>This page provides information for some of the more common options for -embedding a third-party application into the Onshape interface. Onshape provides many options for embedding commands in various menus, fly-out panels, and elements. In this example, you will embed a custom web page inside a document’s right side fly-out panel. This interface will receive information from Onshape and push information from the panel back to Onshape, providing a complete, bi-directional integration scenario.</p> -<p>Please see also:</p> -<ul> -<li><a href="https://onshape-public.github.io/docs/tutorials/createextension/">Create an Extension tutorial</a>: A step-by-step walkthrough of creating an extension.</li> -<li>Create an Extension Video Sample: -<a href="https://onshape.wistia.com/medias/0ivxxngkjz?embedType=async&seo=false&videoFoam=true&videoWidth=640&wvideo=0ivxxngkjz)"><img src="https://onshape-public.github.io/images/ExtensionsVideoCard.png" style="width:5in" alt="OAuth app creation video"/></a></li> -</ul> -<h2 id="extension-types">Extension Types</h2> -<p>We can classify extensions into two high-level types. The first type embeds a UI <em>from</em> the application <em>into</em> the Onshape UI. The embedded UI is an HTTPS page displayed in an iFrame in the Onshape UI. The UI is served from the application, and can choose to make API calls to Onshape for additional information. This is exactly like the traditional tab-based applications in Onshape, except that such extensions exist at different UI locations.</p> -<p>The second type of extension embeds an action that calls a REST API <em>exposed by</em> the application <em>from</em> the Onshape UI (e.g., context menu actions and toolbar actions). These types of extensions rely on External OAuth information to authenticate and make a call where Onshape acts as a client, and the application acts as a server.</p> -<h2 id="extension-attributes">Extension Attributes</h2> -<p>Each extension exists at a specific place in the Onshape UI and works with a specific context or selection. The attributes of an extension are:</p> -<ol> -<li><strong>Name</strong>: This should be short and explicit. It will appear in the Onshape UI as a menu item, a toolbar tooltip, a collapsed panel icon tooltip, or a panel icon. It might be truncated in the UI if it is too long.</li> -<li><strong>Description</strong>: This is where the developer can record a detailed description of the extension. It does not appear in the Onshape UI, but could appear in the grant process.</li> -<li><strong>Location</strong>: This describes where the extension exists in the Onshape UI. Over time, this will cover various panels in the UI, context menus, toolbars, actions in dialogs, etc. You can see the list of currently supported locations <a href="#supported-locations-and-contexts">here</a>. -<ul> -<li>Please note that you can create only one element tab extension per application.</li> -</ul> -</li> -<li><strong>Context</strong> (selection): Some locations will work in the context of a selection. Let’s say the application developer wants to show some information from a third-party system, pertinent only to parts (not assemblies or drawings). In this scenario, the developer would choose a location like ‘Document list info panel’, and the context as ‘Selected part’. If the user searches for something in the document list, some documents, Part Studios, parts, and Assemblies would be returned. This extension will show up in the Info panel only if the selected entity is a part. Using context enables application developers to control when the extension is displayed. Check the list of contexts available for different locations <a href="#supported-locations-and-contexts">here</a>.</li> -<li><strong>Action URL</strong>: Locations that embed a UI use the action URL to define the address of the page to display. The action URL is used to specify the REST endpoint if the location is an action (context menu, toolbar item, action in dialog etc.) and the action type is GET or POST. If the location is an action and the action is ‘Open in new window’, the action URL is the URL to open in the new window.<br> -The action URL can be parameterized to pass information from Onshape to the application. The action URL replaces attributes in the format {$attribute} with the appropriate value. These attributes can be used to identify the selected entity and/or make calls back to Onshape via the API. The currently supported attributes are: -<ul> -<li><code>{$documentId}</code> - The Onshape ID for the current or selected document.</li> -<li><code>{$workspaceOrVersion}</code> - This will be either <code>w</code> or <code>v</code> for workspace or version respectively depending on current opened document state or selection.</li> -<li><code>{$workspaceOrVersionId}</code> - The Onshape ID for the current or selected workspace or version.</li> -<li><code>{$workspaceId}</code> - Use <code>{$workspaceOrVersionId}</code> instead.</li> -<li><code>{$versionId}</code> - Use <code>{$workspaceOrVersionId}</code> instead.</li> -<li><code>{$microversionId}</code> - The Onshape ID for the current or select document microversion.</li> -<li><code>{tabElementId}</code> - The Onshape ID for the current tab.</li> -<li><code>{$elementId}</code> - The Onshape ID for the current or selected element.</li> -<li><strong>Note</strong>: In most cases, <code>tabElementId</code> and <code>elementId</code> will be the same. However, when creating an extension with the <code>Selected instance</code> context, <code>tabElementId</code> indicates the current tab (i.e., the target element), and <code>elementId</code> indicates the tab from which the instance/subassembly was inserted (i.e., the source element).</li> -<li><code>{$partId}</code> - The Onshape ID for the current or selected part.</li> -<li><code>{$partNumber}</code> - The Part number property for the current or selected part, assembly or drawing.</li> -<li><code>{$revision}</code> - The Revision property for the current or selected part, assembly or drawing.</li> -<li><code>{$companyId}</code> - The ID for the company that owns the document.</li> -<li><code>{$mimeType}</code> - The mime type if the current or selected element is a blob.</li> -<li><code>{$featureId}</code> - In case of feature selected in the Feature list in a Part Studio.</li> -<li><code>{$nodeId}</code> - In case of mate or mate feature selected in the Assembly list.</li> -<li><code>{$occurrencePath}</code> - In case of part instances, mates, mate connectors and sub assemblies.</li> -<li><code>{$configuration}</code> - In case of extensions inside the document, this attribute will be replaced by current element active configuration.</li> -</ul> -</li> -</ol> -<p>The attributes can exist as path parameters or query parameters or attributes in the POST body. For example:</p> -<pre tabindex="0"><code>[https://whispering-sea-42267.herokuapp.com/oauthSignin?documentId={$documentId}&amp;workspaceOrVersion={workspaceOrVersion}&amp;workspaceOrVersionId={$workspaceOrVersionId}&amp;elementId={$elementId}&amp;partId={$partId}&amp;server=https://cad.onshape.com&amp;companyId=cad&amp;userId=5f1eba76c14a434817d9c588&amp;locale=en-US](https://whispering-sea-42267.herokuapp.com/oauthSignin?documentId=%7B$documentId%7D&amp;workspaceId=%7B$workspaceId%7D&amp;elementId=%7B$elementId%7D&amp;partId=%7B$partId) -</code></pre><p>or</p> -<pre tabindex="0"><code>[https://cad.onshape.com/api/partstudios/d/{$documentId}/{$workspaceOrVersion}/{$workspaceOrVersionId}/e/{$elementId}/stl?server=https://cad.onshape.com&amp;companyId=cad&amp;userId=5f1eba76c14a434817d9c588&amp;locale=en-US](https://cad.onshape.com/api/partstudios/d/%7B$documentId%7D/w/%7B$workspaceId%7D/e/%7B$elementId%7D/stl) -</code></pre><p>The attributes available for replacement differ by location and context selection. You can see the available attributes for each location <a href="#supported-locations-and-contexts">here</a>.</p> -<p>The <strong>timeout</strong> for <code>action_url</code> of type <code>GET</code> or <code>POST</code> is <strong>180 seconds</strong>.</p> -<ol start="6"> -<li> -<p><strong>Action type</strong>: The action type is only applicable for locations that act as actions and not for locations that embed UIs. Check if action type is valid for a location <a href="#supported-locations-and-contexts">here</a>. The supported action types are:</p> -<ul> -<li><code>GET</code> - This makes a GET API call using the action URL. Parameter replacement is done on the action URL.</li> -<li><code>POST</code> - This makes a POST API call using the action URL and the action body as the post body. Parameter replacement is done on both the action URL and the action body.</li> -<li><code>Open in new window</code> - This opens the action URL in a new browser window. Parameter replacement is done on the action URL.</li> -</ul> -</li> -<li> -<p><strong>Action body</strong>: This is only applicable if the action type is POST. The action body is passed in a POST API call and must be in a valid json format.</p> -</li> -<li> -<p><strong>Show response</strong>: This is only applicable if the action type is GET or POST. If this is checked, the UI will wait for a response and show the response in a dialog in the UI. The response must be in a valid json format.</p> -</li> -<li> -<p><strong>Icon</strong>: The icon will be shown where the extension exists. This can be an icon in an Info panel, context menu action, toolbar button, action button in a dialog, or other supported locations.</p> -</li> -</ol> -<h2 id="supported-locations-and-contexts">Supported Locations and Contexts</h2> -<p>This is the list of supported locations, their valid contexts, and whether they support action types.</p> -<h3 id="element-context-menu">Element context menu</h3> -<p>This is the context menu for elements.</p> -<p><img src="https://onshape-public.github.io/images/extensionsimage04.png" alt="image alt text"></p> -<p>Supported contexts:</p> -<ul> -<li><code>Part Studio</code></li> -<li><code>Assembly</code></li> -<li><code>Drawing</code></li> -<li><code>Blob element</code></li> -</ul> -<p>Supported parameters for replacements:</p> -<ul> -<li><code>{$documentId}</code></li> -<li><code>{$workspaceOrVersion}</code></li> -<li><code>{$workspaceOrVersionId}</code></li> -<li><code>{$workspaceId}</code> DEPRECATED</li> -<li><code>{$versionId}</code> DEPRECATED</li> -<li><code>{$elementId}</code></li> -<li><code>{$partNumber}</code></li> -<li><code>{$mimeType}</code></li> -<li><code>{$configuration}</code></li> -</ul> -<p>Default parameters as query string:</p> -<ul> -<li><code>server</code></li> -<li><code>companyId</code> - Default value is ‘cad’. If the document owner is company/enterprise, then the value is company/enterprise ID.</li> -<li><code>userId</code></li> -<li><code>locale</code></li> -<li><code>clientId</code></li> -</ul> -<p>This location supports action types.</p> -<h3 id="tree-context-menu">Tree context menu</h3> -<p>This is the context menu for the part tree, assembly tree and feature tree in part studios.</p> -<p><img src="https://onshape-public.github.io/images/extensionsimage05.png" alt="image alt text"></p> -<p>Supported contexts:</p> -<ul> -<li><code>Part</code></li> -<li><code>Sub assembly</code></li> -<li><code>Feature</code></li> -<li><code>Mate</code></li> -<li><code>Mate feature</code></li> -<li><code>Instance</code></li> -</ul> -<p>Supported parameters for replacement:</p> -<ul> -<li><code>{$documentId}</code></li> -<li><code>{$workspaceOrVersion}</code></li> -<li><code>{$workspaceOrVersionId}</code></li> -<li><code>{$workspaceId}</code> DEPRECATED</li> -<li><code>{$versionId}</code> DEPRECATED</li> -<li><code>{$elementId}</code></li> -<li><code>{$partNumber}</code></li> -<li><code>{$revision}</code></li> -<li><code>{$featureId}</code></li> -<li><code>{$nodeId}</code></li> -<li><code>{$occurrencePath}</code></li> -<li><code>{$configuration}</code></li> -</ul> -<p>Default parameters as query string:</p> -<ul> -<li><code>server</code></li> -<li><code>companyId</code> - Default value is ‘cad’. If the document owner is company/enterprise, then the value is company/enterprise ID.</li> -<li><code>userId</code></li> -<li><code>locale</code></li> -<li><code>clientId</code></li> -</ul> -<p>This location supports action types.</p> -<h3 id="document-list-context-menu">Document list context menu</h3> -<p>This the context menu available on items in the document list. This is normally documents but can be multiple types based on search results.</p> -<p><img src="https://onshape-public.github.io/images/extensionsimage06.png" alt="image alt text"></p> -<p>Supported contexts:</p> -<ul> -<li><code>Part</code></li> -<li><code>Document</code></li> -<li><code>Part Studio</code></li> -<li><code>Assembly</code></li> -<li><code>Drawing</code></li> -<li><code>Blob element</code></li> -</ul> -<p>Supported parameters for replacement:</p> -<ul> -<li><code>{$documentId}</code></li> -<li><code>{$workspaceOrVersion}</code></li> -<li><code>{$workspaceOrVersionId}</code></li> -<li><code>{$workspaceId}</code> DEPRECATED</li> -<li><code>{$versionId}</code> DEPRECATED</li> -<li><code>{$elementId}</code></li> -<li><code>{$partNumber}</code></li> -<li><code>{$revision}</code></li> -<li><code>{$configuration}</code></li> -</ul> -<p>Default parameters as query string:</p> -<ul> -<li><code>server</code></li> -<li><code>companyId</code> - Default value is ‘cad’. If the document owner is company/enterprise, then the value is company/enterprise ID.</li> -<li><code>userId</code></li> -<li><code>locale</code></li> -<li><code>clientId</code></li> -</ul> -<p>This location supports action types.</p> -<h3 id="document-list-info-panel">Document list info panel</h3> -<p>This is the Info panel to the right in the document list. The document list normally contains documents, but can contain other entities as the result of a search.</p> -<p><img src="https://onshape-public.github.io/images/extensionsimage07.png" alt="image alt text"></p> -<p>Supported contexts:</p> -<ul> -<li><code>Part</code></li> -<li><code>Document</code></li> -<li><code>Part Studio</code></li> -<li><code>Assembly</code></li> -<li><code>Drawing</code></li> -<li><code>Blob element</code></li> -</ul> -<p>Supported parameters for replacement:</p> -<ul> -<li><code>{$documentId}</code></li> -<li><code>{$workspaceOrVersion}</code></li> -<li><code>{$workspaceOrVersionId}</code></li> -<li><code>{$workspaceId}</code> DEPRECATED</li> -<li><code>{$versionId}</code> DEPRECATED</li> -<li><code>{$elementId}</code></li> -<li><code>{$partId}</code></li> -</ul> -<p>Default parameters as query string:</p> -<ul> -<li><code>server</code></li> -<li><code>companyId</code> - Default value is ‘cad’. If the document owner is company/enterprise, then the value is company/enterprise ID.</li> -<li><code>userId</code></li> -<li><code>locale</code></li> -<li><code>clientId</code></li> -</ul> -<p>This location does NOT support action types.</p> -<h3 id="element-right-panel">Element right panel</h3> -<p>This is the panel inside a document. It currently houses the BOM, configurations, etc. Applications can use this extension location to add items in this panel.</p> -<p><img src="https://onshape-public.github.io/images/extensionsimage08.png" alt="image alt text"></p> -<p>Supported contexts:</p> -<ul> -<li><code>Part</code></li> -<li><code>Document</code></li> -<li><code>Part Studio</code></li> -<li><code>Assembly</code></li> -<li><code>Sub assembly</code></li> -<li><code>Feature</code></li> -<li><code>Mate</code></li> -<li><code>Mate feature</code></li> -</ul> -<p>Supported parameters for replacement:</p> -<ul> -<li><code>{$documentId}</code></li> -<li><code>{$workspaceOrVersion}</code></li> -<li><code>{$workspaceOrVersionId}</code></li> -<li><code>{$workspaceId}</code> DEPRECATED</li> -<li><code>{$versionId}</code> DEPRECATED</li> -<li><code>{$elementId}</code></li> -<li><code>{$partNumber}</code></li> -<li><code>{$revision}</code></li> -<li><code>{$featureId}</code></li> -<li><code>{$nodeId}</code></li> -<li><code>{$occurrencePath}</code></li> -<li><code>{$configuration}</code></li> -</ul> -<p>Default parameters as query string:</p> -<ul> -<li><code>server</code></li> -<li><code>companyId</code> - Default value is ‘cad’. If the document owner is company/enterprise, then the value is company/enterprise ID.</li> -<li><code>userId</code></li> -<li><code>locale</code></li> -<li><code>clientId</code></li> -</ul> -<p>This location does NOT support action types.</p> -<h3 id="new-element-tab">New Element tab</h3> -<p>This is the menu option for <code>+ menu -&gt; Add application</code> inside a document . After menu click, a new tab will be created with the action url associated with this extension.</p> -<p><img src="https://onshape-public.github.io/images/extensionsimage09.png" alt="image alt text"></p> -<p>Supported contexts:</p> -<ul> -<li>There are no supported contexts.</li> -</ul> -<p>Supported parameters for replacement:</p> -<ul> -<li>Parameter replacement not supported.</li> -</ul> -<p>Default parameters as query string:</p> -<ul> -<li><code>documentId</code></li> -<li><code>workspaceId</code></li> -<li><code>versionId</code></li> -<li><code>elementId</code></li> -<li><code>server</code></li> -<li><code>companyId</code> - Default value is ‘cad’. If the document owner is company/enterprise, then the value is company/enterprise ID.</li> -<li><code>userId</code></li> -<li><code>locale</code></li> -<li><code>clientId</code></li> -</ul> -<p>This location supports action types.</p> -<h3 id="part-number-generator">Part number generator</h3> -<p>This extension helps partners to embed their own custom part number generation scheme in Onshape. Each application can have only one extension of this type. Once defined, these extensions are listed as one of the part numbering schemes in the release management configuration in Company settings.</p> -<p><img src="https://onshape-public.github.io/images/extensionsimage10.png" alt="image alt text"></p> -<p>In the above screen shot, ‘Part number generation scheme’ is the user-defined name of the extension.</p> -<p>Supported contexts:</p> -<ul> -<li>There are no supported contexts.</li> -</ul> -<p>Supported parameters for replacement:</p> -<ul> -<li>Parameter replacement is not supported.</li> -</ul> -<p>Default parameters as query string:</p> -<ul> -<li>No default query parameters</li> -</ul> -<p>Action URL defined by the user is assumed to be a POST API. This API should consume a predefined request body as shown below. This definition may have additional attributes in future.</p> -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-js" data-lang="js"><span style="display:flex;"><span> [ -</span></span><span style="display:flex;"><span> { -</span></span><span style="display:flex;"><span> <span style="color:#a50">&#34;id&#34;</span> : &lt;internal part number id&gt;, -</span></span><span style="display:flex;"><span> <span style="color:#a50">&#34;documentId&#34;</span> : &lt;documentId&gt;, -</span></span><span style="display:flex;"><span> <span style="color:#a50">&#34;elementId&#34;</span> : &lt;elementId&gt;, -</span></span><span style="display:flex;"><span> <span style="color:#a50">&#34;workspaceId&#34;</span> : &lt;workspaceId&gt;, -</span></span><span style="display:flex;"><span> <span style="color:#a50">&#34;elementType&#34;</span> : &lt;elementType&gt;, -</span></span><span style="display:flex;"><span> <span style="color:#a50">&#34;partId&#34;</span> : &lt;partId&gt;, -</span></span><span style="display:flex;"><span> <span style="color:#a50">&#34;companyId&#34;</span> : &lt;companyId&gt;, <span style="color:#aaa;font-style:italic">// Id of the company that owns the document, else the text “cad” -</span></span></span><span style="display:flex;"><span><span style="color:#aaa;font-style:italic"></span> <span style="color:#a50">&#34;partNumber&#34;</span> : &lt;current part number&gt;, -</span></span><span style="display:flex;"><span> <span style="color:#a50">&#34;configuration&#34;</span> : &lt;configuration string&gt;, -</span></span><span style="display:flex;"><span> <span style="color:#a50">&#34;categories&#34;</span> : &lt;array <span style="color:#00a">of</span> category ids and names&gt; <span style="color:#aaa;font-style:italic">// [ { &#34;id&#34;: &lt;String&gt;, &#34;name&#34;: &lt;string&gt; } ] -</span></span></span><span style="display:flex;"><span><span style="color:#aaa;font-style:italic"></span> } -</span></span><span style="display:flex;"><span> ] -</span></span></code></pre></div><p><strong>Note</strong>: Categories are only passed from the Release dialog and properties dialogs for now. They are empty when part number generation is called from the BOM table or configuration table.</p> -<p>Expected response sent to Onshape is as follows:</p> -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-js" data-lang="js"><span style="display:flex;"><span> [ -</span></span><span style="display:flex;"><span> { -</span></span><span style="display:flex;"><span> <span style="color:#a50">&#34;id&#34;</span> : &lt;internal part number id&gt;, -</span></span><span style="display:flex;"><span> <span style="color:#a50">&#34;documentId&#34;</span> : &lt;documentId&gt;, -</span></span><span style="display:flex;"><span> <span style="color:#a50">&#34;elementId&#34;</span> : &lt;elementId&gt;, -</span></span><span style="display:flex;"><span> <span style="color:#a50">&#34;workspaceId&#34;</span> : &lt;workspaceId&gt;, -</span></span><span style="display:flex;"><span> <span style="color:#a50">&#34;elementType&#34;</span> : &lt;elementType&gt;, -</span></span><span style="display:flex;"><span> <span style="color:#a50">&#34;partId&#34;</span> : &lt;partId&gt;, -</span></span><span style="display:flex;"><span> <span style="color:#a50">&#34;partNumber&#34;</span> : &lt;next part number generated by third party numbering scheme&gt; -</span></span><span style="display:flex;"><span> } -</span></span><span style="display:flex;"><span> ] -</span></span></code></pre></div><p>Third-party applications can simply fill the <code>&quot;partNumber&quot;</code> attribute with the part number generated by the custom numbering scheme and send it as a response. However, the response should at least contain <code>&quot;id&quot;</code> and <code>&quot;partNumber&quot;</code> as highlighted above; other attributes are optional.</p> -<p>Custom numbering schemes for part generation, once set in the Release management page, can be invoked from all the places where we set part numbers, including the Release candidate dialog shown below:</p> -<p><img src="https://onshape-public.github.io/images/extensionsimage11.png" alt="image alt text"></p> -<h2 id="sample-code">Sample code</h2> -<p>We have provided a sample application that supports the features described in this document.</p> -<p>The source code for this <code>Inventory management</code> application can be found <a href="https://github.com/onshape-public/inventory-oauth2-app">in our public GitHub repository</a>.</p> -<p>The instructions to install and the application are available in the <code>README.md</code> file in the repository.</p> -<p>The application is built on the Passport node module. It is based on this <a href="http://scottksmith.com/blog/2014/05/02/building-restful-apis-with-node/">article</a>. Please read the article before proceeding with this section.</p> -<p>Some structural information about the application:</p> -<ul> -<li>The dependencies are defined in <code>package.json</code></li> -<li>The routing for inbound calls is defined in <code>server.js</code>. This includes routing for OAuth2 calls as well as calls for the rest APIs we expose that Onshape can call via the extensions.</li> -<li>The OAuth2 calls are routed to <code>controllers/oauth2.js</code>. These include calls to authenticate as calls to get the bearer token.</li> -<li><code>controllers/oauth2.js</code> uses <code>controllers/auth.js</code> to interact with Passport to manage the authentication and storage.</li> -<li>Other API calls to get part number, etc, route to the appropriate controller in the controllers directory.</li> -<li>The controllers use the model defined in the model directory.</li> -</ul> -<p>The application is defined in the Developer Portal with extensions that use the exposed APIs.</p> -<p>The following screenshots define the base configuration of the application and some of the sample extensions.</p>Docs: Client Messaginghttps://onshape-public.github.io/docs/app-dev/clientmessaging/Mon, 01 Jan 0001 00:00:00 +0000https://onshape-public.github.io/docs/app-dev/clientmessaging/ -<p>Application extensions and the Onshape JavaScript web client need to communicate directly, calling across the iframe containing the application extension using post message.</p> -<p><img src="https://onshape-public.github.io/images/javascriptpostmessageimage00.png" alt="image alt text"></p> -<p>Onshape Client Messaging examples can be split into those that are initiated from the <em>application extension</em> and those that are initiated from the <em>Onshape client</em>.</p> -<h2 id="messages-from-the-extension">Messages from the Extension</h2> -<p>These Client Messaging examples can be initiated from the application extension:</p> -<ul> -<li><strong>Click/close flyouts events</strong>: Notify the Onshape client that the user has clicked in the application extension, which should cause Onshape flyouts (versions, history, uploads, etc.) and dropdown menus (profile dropdown menu, document menu) to close. Without this, flyouts and menus might remain open over the application extension.</li> -<li><strong>Shortcut keyboard events</strong>: Shortcut keys (such as <code>?</code>, which opens the Onshape Help dialog), can be handled by the application extension by posting a message to the Onshape client to open the dialog.</li> -<li><strong>keepAlive</strong>: Notify the Onshape client that the user is actively working in the application extension, which triggers the Onshape client to send a message to the server to keep the browser session alive. Without this, the Onshape browser session will timeout and ask the user to sign in again.</li> -<li><strong>Standard Onshape dialogs</strong>: Request from the application extension to the Onshape client to open one of the Onshape standard dialogs and send the user’s choices back to the application extension. For example, if the application extension needs the user to choose a part or assembly to be operated on, the application extension can post a message to the Onshape client requesting that dialog be opened and the selected part or assembly information sent back to the application extension.</li> -<li><strong>UI customization</strong>&quot;: Request from the application extension to the Onshape client to customize the Onshape UI (e.g., add commands to menus, add buttons to the toolbars, etc). When these commands or toolbar buttons are clicked, the Onshape client posts a message to the application extension with the available context. -<ul> -<li><strong>Note</strong>: This is limited to cases where the application extension is made active by the user; application extensions are not automatically loaded when a document is opened. Most UI customizations should be done when you register the application with Onshape, as those change the Onshape client automatically without needing to load the application extension first.</li> -</ul> -</li> -<li><strong>Content/material insertion</strong>: Request from the application extension to insert content into the Onshape document. For example, insert a part into a new or existing Part Studio, apply a material to a part, add a material to a material library, etc.</li> -</ul> -<h2 id="messages-from-onshape">Messages from Onshape</h2> -<p>The following examples can be initiated from the Onshape client:</p> -<ul> -<li><strong>User action notification</strong>: The Onshape client can notify an application extension when various user actions occur. For example, the Onshape client might notify when the user has made the application extension active or inactive (when the user clicks on document tabs). When an application extension is made inactive, it is moved off the edges of the browser, so it cannot be seen, but is still active, preserving its state.</li> -<li><strong>Printing</strong>: The Onshape client can notify an application extension when the user has chosen the <strong>Print</strong> command from the main Onshape document menu, enabling the application extension to perform a print operation.</li> -</ul> -<h2 id="security-considerations">Security Considerations</h2> -<p>To ensure security, an application extension must:</p> -<ul> -<li><strong>Parse for document, workspace, and element IDs</strong>: Parse for the <code>documentId</code>, <code>workspaceId</code>, and <code>elementId</code> that were passed as query parameters within the application extension’s iframe <code>src</code> URL. You must post these back in each <code>POST</code> message.</li> -<li><strong>Parse for the server</strong>: Parse for the <code>server</code> that was passed as a query parameter within the application extension’s iframe <code>src</code> URL. You must use this to validate messages received. -<ul> -<li>If the application extension uses a JavaScript library or framework (e.g., BackboneJS or AngularJS), it can parse the query parameters and maintain state in other ways.</li> -</ul> -</li> -<li><strong>Not redirect to another base URL</strong>: The browser tells the Onshape client the origin base URL from which a <code>POST</code> message is received. The Onshape client ignores messages posted from an origin URL that doesn’t match the original iframe <code>src</code> URL. It is <em>extremely important</em> to the security of your application that you verify that the origin of all messages you receive is the same as the original server query parameter in the iframe <code>src</code> (i.e., <code>if (server === e.origin)</code>). In production operation especially, the message IS NOT SAFE if the message origin does not match the iframe <code>src</code> server query parameter. Application extensions should not redirect to another base URL after the iframe has been opened, or the messages will be ignored.</li> -<li><strong>Post a message on startup</strong>: Onshape will not post messages until a newly started application extension has first posted a valid message to Onshape. This constraint is in effect anytime an application extension is (re)started and exists to avoid posting messages to application extensions that are not ready to handle them, are not fully loaded, etc. After your application extension is fully loaded and ready to receive messages, post a message to Onshape. A <code>keepAlive</code> message is a great first message to send to Onshape. Once Onshape receives a valid message, Onshape will start posting messages to the application extension. If the application extension later sends an invalid message Onshape will stop sending messages until a valid message is posted to Onshape.</li> -</ul> -<p><code>POST</code> messages submitted by application extensions to Onshape will be ignored if any of the following are true:</p> -<ul> -<li>The documentId, workspaceId, or elementId are missing or not valid.</li> -<li>The message name is missing or not recognized.</li> -<li>The origin of the <code>POST</code> message does not match the original iframe <code>src</code> URL.</li> -</ul> -<h2 id="element-tab">Element Tab</h2> -<p>Messages may be sent and received by element tab application extensions.</p> -<p>The following messages can be <strong>sent</strong> by Element tab application extensions:</p> -<table> -<tr> -<td>messageName -(case sensitive)</td> -<td>other message properties?</td> -<td>comment</td> -</tr> -<tr> -<td>applicationInit</td> -<td>yes -<pre><code>notifyWhenSaveRequired: whether Onshape should send a notification to save pending changes during certain operations -(default is false) -</code></pre> -</td> -<td>Send once on application startup.</td> -</tr> -<tr> -<td>closeFlyoutsAndMenus</td> -<td>no</td> -<td>Send when a mouse click or other event happens in the application extension. Closes Onshape flyouts and dropdown menus.</td> -</tr> -<tr> -<td>closeSelectItemDialog</td> -<td>no</td> -<td>Closes the select item dialog.</td> -</tr> -<tr> -<td>connectionLost</td> -<td>no</td> -<td>Displays the standard Onshape connection lost message in a message bubble, forcing the user to either reload the document or return to the documents page.</td> -</tr> -<tr> -<td>errorReload</td> -<td>yes -<pre><code>message: your message -</code></pre> -</td> -<td>Similar to the connectionLost message, but enables an application to specify the first part of the message, which will be used instead of "Onshape is not connected." The user must reload the document or return to the documents page.</td> -</tr> -<tr> -<td>finishedSaving</td> -<td>yes -<pre><code>messageId: the id sent in the corresponding 'saveChanges' message -</code></pre> -</td> -<td>Response to a 'saveChanges' message sent from Onshape. Should be sent after application has cleaned up any pending edits.</td> -</tr> -<tr> -<td>keepAlive</td> -<td>no</td> -<td>Send periodically while while the user is actively working to avoid the session from timing out.</td> -</tr> -<tr> -<td>saveAVersion</td> -<td>no</td> -<td>Send when the user types “Shift-S” in the application extension, the keyboard shortcut for save a version.</td> -</tr> -<tr> -<td>showKeyboardShortcutsHelp</td> -<td>no</td> -<td>Send when the user types “?” (Shift-? on most keyboards) in the application extension, the keyboard shortcut for the keyboard shortcuts help dialog.</td> -</tr> -<tr> -<td>showMessageBubble</td> -<td>yes -<pre><code>message: your message -</code></pre> -</td> -<td>Send when you want to show a string in the blue message bubble at the top of the Onshape app.</td> -</tr> -<tr> -<td>startLoadingSpinner</td> -<td>yes -<pre><code>message: your message -</code></pre> -</td> -<td>Send to start a large spinner in the middle of the browser window with your message underneath it.</td> -</tr> -<tr> -<td>stopLoadingSpinner</td> -<td>no</td> -<td>Send to stop the large spinner.</td> -</tr> -<tr> -<td>startWorkingSpinner</td> -<td>no</td> -<td>Send to start a small spinner in the middle bottom of the browser window.</td> -</tr> -<tr> -<td>stopWorkingSpinner</td> -<td>no</td> -<td>Send to stop the small spinner.</td> -</tr> -<tr> -<td>openSelectItemDialog</td> -<td>yes -<pre><code>dialogTitle: your dialog title -(default is no title), -selectBlobs: true or false -(default is false), -selectParts: true or false -(default is false), -selectPartStudios: true or false -(default is false), -selectAssemblies: true or false -(default is false), -selectMultiple: true or false -(default is false), -selectBlobMimeTypes: ‘comma-delimited string of blob mime types to show in dialog (e.g. “application/dwt,application/dwg”)’ -(default is an empty string) -showBrowseDocuments: true or false - controls whether ‘Other documents’ choice should be available -(default is true) -showStandardContent: true or false - controls whether ‘Standard content’ choice should be available -(default is false) -</code></pre> -</td> -<td>Send when your application wants to open a dialog in which the user will select one or multiple items - blobs, parts, part studios or assemblies. -</td> -</tr> -<tr> -<td>requestCameraProperties</td> -<td>yes -<pre><code>graphicsElementId: string , Element ID of the part studio or assembly -</code></pre> -</td> -<td> -Send to request camera properties of a specific part studio or assembly element. Note: The element should have been opened at least once in the current session. The messageName of the response is cameraProperties -</td> -</tr> -</table> -<p>The following messages can be <strong>received</strong> by Element tab application extensions:</p> -<table> -<tr> -<td>messageName -(case sensitive)</td> -<td>other message properties?</td> -<td>comment</td> -</tr> -<tr> -<td>show</td> -<td>no</td> -<td>Sent when an element tab application extension is shown (made active) within the Onshape client. This message is NOT sent when the element tab application extension is created.</td> -</tr> -<tr> -<td>hide</td> -<td>no</td> -<td>Sent when an element tab application extension is made inactive within the Onshape client. This message is NOT sent when an element tab application extension is deleted.</td> -</tr> -<tr> -<td>itemSelectedInSelectItemDialog</td> -<td>yes -<pre><code>documentId: id of selected item’s document, -workspaceId: id of selected item’s workspace, empty if versionId not empty, -versionId: id of selected item’s version, empty if workspaceId not empty, -elementId: id of element selected or containing the selected part, -elementName: name of element selected or containing the selected part, -elementType: type of element selected or containing the selected part - ‘partstudio’, ‘assembly’ or ‘blob’, -elementMicroversionId: microversion id of the element, -itemType: type of item selected: ‘part’,‘partStudio’ or ‘assembly’, -partName: name of part selected, empty if itemType is not ‘part’, -idTag: id of part, empty if no part selected -</code></pre> -</td> -<td>Sent when the user selects an item (blob, part, part studio or assembly) in the select item dialog that was opened due to an openSelectItemDialog message sent earlier. -When a part is not selected, the partXxx message properties will be empty strings.</td> -</tr> -<tr> -<td>print</td> -<td>no</td> -<td>Sent when the user chooses the Print command while the application is the active element. The application can choose to handle this as either a print or an export to a PDF or other format.</td> -</tr> -<tr> -<td>selectItemDialogClosed</td> -<td>no</td> -<td>Sent when the select item dialog closes, either because the user selected an item and selectMultiple is false, or the user changed the active element or the user closed the dialog with the "X" button.</td> -</tr> -<tr> -<td>startFirstViewCommand</td> -<td>yes -<pre><code>documentId: id of selected item’s document, -workspaceId: id of selected item’s workspace, empty if versionId not empty, -versionId: id of selected item’s version, empty if workspaceId not empty, -elementId: id of element selected or containing the selected part, -elementName: name of element selected or containing the selected part, -elementType: type of element selected or containing the selected part - ‘partstudio’, ‘assembly’ or ‘blob’, -elementMicroversionId: microversion id of the element, -itemType: type of item selected: ‘part’,‘partstudio’ or ‘assembly’, -partName: name of part selected, empty if itemType is not ‘part’, -idTag: id of part -</code></pre> -</td> -<td>Sent to a drawings application extension when the drawing is created with zero views. -<p>If other types of applications need a message posted to them with creation context, contact Onshape and we can discuss using this sort of message for your application also.</td></p> -</tr> -<tr> -<td>export</td> -<td>yes -<pre><code>fileExtension: the file extension of the export type the user chose - “.dwg”, “.dxf” are the types currently supported. -baseFileName: the base portion of the expected output file. This is currently set to “&lt;document name&gt; - &lt;element name&gt;” -</code></pre> -</td> -<td>Sent when the user chooses a command to export the contents of the application to a file.</td> -</tr> -<tr> -<td>cameraProperties</td> -<td>yes -<pre><code>graphicsElementId: string , Element ID of the part studio or assembly -isValid: boolean, Indicates if the properties are valid or not. false if element ID is invalid or element has not been open in the current session -projectionType: string, Denotes the projection method. Values are ‘orthographic’, ‘perspective’ . Empty string ‘’ if isValid is false -viewMatrix: 16 element numeric matrix with elements at index 13, 14, 15 corresponding to position of the camera -projectionMatrix: 16 element numeric matrix -verticalFieldOfView: number, 0 in case of orthographic projection -viewportHeight: number, eight of the viewport -viewportWidth: number, width of the viewport -</code></pre> -</td> -<td>Sent when application posts a requestCameraProperties message</td> -</tr> -<tr> -<td>takeFocus</td> -<td>no</td> -<td>Sent when the Onshape client sets focus on the content window of the element tab application extension.</td> -</tr> -<tr> -<td>saveChanges</td> -<td>yes -<pre><code>messageId: a unique identifier for this message. Should be passed back in the 'finishedSaving' message. -</code></pre> -</td> -<td>Sent if the application specified 'notifyWhenSaveRequired' in the 'applicationInit' message. Indicates that the application should cleanup any pending edits before an Onshape process continues (i.e. version save).</td> -</tr> -</table> -<h2 id="element-right-panel">Element Right Panel</h2> -<p>Most client messaging functionality had been limited to that occurring between the Onshape client and application elements (the <strong>Element tab</strong> location). Limited functionality in now also available for client messaging to work with application extensions in the <strong>Element right panel</strong> location.</p> -<p>Enabled messaging to Element right panel extensions includes the communication of selections that the user makes for the following application extension contexts:</p> -<ul> -<li>Part Studio</li> -<li>Assembly</li> -<li>Document</li> -</ul> -<p>All <a href="#security-considerations">Security Considerations</a> above apply to both Element tab and Element right panel extensions, with the following notes:</p> -<ul> -<li>Initial message from the application extension to the Onshape client, in the form of an <code>applicationInit</code> message (or one of any other messages supported by the element right panel extensions), is required to ensure the Onshape client does not send messages to the extension until it is ready.</li> -<li>Once a valid <code>applicationInit</code> message is received by the Onshape client, it will start sending messages with the <code>messageName</code> value <code>SELECTION</code> upon user selection interactions.</li> -<li>Prior to accepting <em>any</em> message from the Onshape client as secure, the <code>origin</code> attribute value included in incoming messages must be validated as equal to the original <code>server</code> query parameter value used to load the application extension.</li> -</ul> -<h2 id="code-snippets">Code Snippets</h2> -<h3 id="parse-query-parameters">Parse query parameters</h3> -<p>This JavaScript code parses the iframe <code>src</code> query parameters and uses them to post a message:</p> -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-js" data-lang="js"><span style="display:flex;"><span> <span style="color:#00a">var</span> documentId; -</span></span><span style="display:flex;"><span> <span style="color:#00a">var</span> workspaceId; -</span></span><span style="display:flex;"><span> <span style="color:#00a">var</span> elementId; -</span></span><span style="display:flex;"><span> <span style="color:#00a">var</span> server; -</span></span><span style="display:flex;"><span> -</span></span><span style="display:flex;"><span> <span style="color:#aaa;font-style:italic">// Parse query parameters -</span></span></span><span style="display:flex;"><span><span style="color:#aaa;font-style:italic"></span> <span style="color:#00a">var</span> queryParameters = <span style="color:#0aa">decodeURIComponent</span>(<span style="color:#0aa">window</span>.location.search.substr(<span style="color:#099">1</span>)); -</span></span><span style="display:flex;"><span> <span style="color:#00a">var</span> queryParametersArray = queryParameters.split(<span style="color:#a50">&#39;&amp;&#39;</span>); -</span></span><span style="display:flex;"><span> <span style="color:#00a">for</span> (<span style="color:#00a">var</span> i = <span style="color:#099">0</span>; i &lt; queryParametersArray.length; i++) { -</span></span><span style="display:flex;"><span> <span style="color:#00a">var</span> parameterArray = queryParametersArray[i].split(<span style="color:#a50">&#39;=&#39;</span>); -</span></span><span style="display:flex;"><span> <span style="color:#00a">if</span> (parameterArray.length === <span style="color:#099">2</span>) { -</span></span><span style="display:flex;"><span> <span style="color:#00a">switch</span> (parameterArray[<span style="color:#099">0</span>]) { -</span></span><span style="display:flex;"><span> <span style="color:#00a">case</span> <span style="color:#a50">&#39;documentId&#39;</span>: -</span></span><span style="display:flex;"><span> documentId = parameterArray[<span style="color:#099">1</span>]; -</span></span><span style="display:flex;"><span> <span style="color:#00a">break</span>; -</span></span><span style="display:flex;"><span> <span style="color:#00a">case</span> <span style="color:#a50">&#39;workspaceId&#39;</span>: -</span></span><span style="display:flex;"><span> workspaceId = parameterArray[<span style="color:#099">1</span>]; -</span></span><span style="display:flex;"><span> <span style="color:#00a">break</span>; -</span></span><span style="display:flex;"><span> <span style="color:#00a">case</span> <span style="color:#a50">&#39;elementId&#39;</span>: -</span></span><span style="display:flex;"><span> elementId = parameterArray[<span style="color:#099">1</span>]; -</span></span><span style="display:flex;"><span> <span style="color:#00a">break</span>; -</span></span><span style="display:flex;"><span> <span style="color:#00a">case</span> <span style="color:#a50">&#39;server&#39;</span>: -</span></span><span style="display:flex;"><span> server = parameterArray[<span style="color:#099">1</span>]; -</span></span><span style="display:flex;"><span> <span style="color:#00a">break</span>; -</span></span><span style="display:flex;"><span> } -</span></span><span style="display:flex;"><span> } -</span></span><span style="display:flex;"><span> } -</span></span><span style="display:flex;"><span> -</span></span><span style="display:flex;"><span> <span style="color:#aaa;font-style:italic">// Listen for clicks and post a message to the Onshape client -</span></span></span><span style="display:flex;"><span><span style="color:#aaa;font-style:italic"></span> <span style="color:#0aa">document</span>.getElementById(<span style="color:#a50">&#39;&lt;id of your topmost element&gt;&#39;</span>). -</span></span><span style="display:flex;"><span> addEventListener(<span style="color:#a50">&#39;click&#39;</span>, <span style="color:#00a">function</span>() { -</span></span><span style="display:flex;"><span> <span style="color:#00a">var</span> message = {documentId: documentId, -</span></span><span style="display:flex;"><span> workspaceId: workspaceId, -</span></span><span style="display:flex;"><span> elementId: elementId, -</span></span><span style="display:flex;"><span> messageName: <span style="color:#a50">&#39;closeFlyoutsAndMenus&#39;</span>}; -</span></span><span style="display:flex;"><span> <span style="color:#0aa">window</span>.parent.postMessage(message, <span style="color:#a50">&#39;*&#39;</span>); -</span></span><span style="display:flex;"><span> }, <span style="color:#00a">true</span>); -</span></span></code></pre></div><h3 id="create-a-message-object">Create a message object</h3> -<p>The message object posted to the Onshape client is of the form:</p> -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-js" data-lang="js"><span style="display:flex;"><span>{ -</span></span><span style="display:flex;"><span> documentId: documentId, -</span></span><span style="display:flex;"><span> workspaceId: workspaceId, -</span></span><span style="display:flex;"><span> elementId: elementId, -</span></span><span style="display:flex;"><span> messageName: <span style="color:#a50">&#39;&lt;message name&gt;&#39;</span>, -</span></span><span style="display:flex;"><span> <span style="color:#aaa;font-style:italic">// … other properties as needed for other message types … -</span></span></span><span style="display:flex;"><span><span style="color:#aaa;font-style:italic"></span>} -</span></span></code></pre></div><p>The message data object posted to the application extension is of the form:</p> -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-js" data-lang="js"><span style="display:flex;"><span>{ -</span></span><span style="display:flex;"><span> messageName: <span style="color:#a50">&#39;&lt;message name&gt;&#39;</span>, -</span></span><span style="display:flex;"><span> <span style="color:#aaa;font-style:italic">// … other properties as needed for other message types … -</span></span></span><span style="display:flex;"><span><span style="color:#aaa;font-style:italic"></span>} -</span></span></code></pre></div><p>The message will always have a <code>messageName</code> property.</p> -<h3 id="listen-for-messages">Listen for messages</h3> -<p>To listen for messages from the Onshape client:</p> -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-js" data-lang="js"><span style="display:flex;"><span> <span style="color:#aaa;font-style:italic">// server is one of the iframe src query parameters - see above -</span></span></span><span style="display:flex;"><span><span style="color:#aaa;font-style:italic"></span> -</span></span><span style="display:flex;"><span> <span style="color:#00a">var</span> handlePostMessage = <span style="color:#00a">function</span>(e) { -</span></span><span style="display:flex;"><span> console.log(<span style="color:#a50">&#34;Post message received in application extension.&#34;</span>); -</span></span><span style="display:flex;"><span> console.log(<span style="color:#a50">&#34;e.origin = &#34;</span> + e.origin); -</span></span><span style="display:flex;"><span> -</span></span><span style="display:flex;"><span> <span style="color:#aaa;font-style:italic">// Verify the origin matches the server iframe src query parameter -</span></span></span><span style="display:flex;"><span><span style="color:#aaa;font-style:italic"></span> <span style="color:#00a">if</span> (server === e.origin) { -</span></span><span style="display:flex;"><span> console.log(<span style="color:#a50">&#34;Message safe and can be handled as it is from origin &#39;&#34;</span> -</span></span><span style="display:flex;"><span> + e.origin + -</span></span><span style="display:flex;"><span> <span style="color:#a50">&#34;&#39;, which matches server query parameter &#39;&#34;</span> -</span></span><span style="display:flex;"><span> + server + <span style="color:#a50">&#34;&#39;.&#34;</span>); -</span></span><span style="display:flex;"><span> <span style="color:#00a">if</span> (e.data &amp;&amp; e.data.messageName) { -</span></span><span style="display:flex;"><span> console.log(<span style="color:#a50">&#34;Message name = &#39;&#34;</span> + e.data.messageName + <span style="color:#a50">&#34;&#39;&#34;</span>); -</span></span><span style="display:flex;"><span> } <span style="color:#00a">else</span> { -</span></span><span style="display:flex;"><span> console.log(<span style="color:#a50">&#34;Message name not found. Ignoring message.&#34;</span>); -</span></span><span style="display:flex;"><span> } -</span></span><span style="display:flex;"><span> } <span style="color:#00a">else</span> { -</span></span><span style="display:flex;"><span> console.log(<span style="color:#a50">&#34;Message NOT safe and should be ignored.&#34;</span>); -</span></span><span style="display:flex;"><span> } -</span></span><span style="display:flex;"><span> }; -</span></span><span style="display:flex;"><span> -</span></span><span style="display:flex;"><span> <span style="color:#0aa">window</span>.addEventListener(<span style="color:#a50">&#39;message&#39;</span>, handlePostMessage, <span style="color:#00a">false</span>); -</span></span></code></pre></div><h3 id="send-and-handle-messages">Send and handle messages</h3> -<p>The following is an example of how one might send an initialization message to, and handle post messages from, the Onshape client.</p> -<blockquote> -<p><em><strong>Note:</strong></em> Proper clean-up of event listeners is not included in the snippet</p> -</blockquote> -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-javascript" data-lang="javascript"><span style="display:flex;"><span><span style="color:#00a">function</span> handlePostMessage(event) { -</span></span><span style="display:flex;"><span> <span style="color:#aaa;font-style:italic">// ensure that the event data is from a legit source: -</span></span></span><span style="display:flex;"><span><span style="color:#aaa;font-style:italic"></span> <span style="color:#00a">if</span>(theServerStringFromActionUrl !== event.origin) { -</span></span><span style="display:flex;"><span> console.error(<span style="color:#a50">&#39;origin of message is not legitimate&#39;</span>); -</span></span><span style="display:flex;"><span> <span style="color:#00a">return</span>; -</span></span><span style="display:flex;"><span> } -</span></span><span style="display:flex;"><span> -</span></span><span style="display:flex;"><span> <span style="color:#aaa;font-style:italic">// branch based on messageName attribute -</span></span></span><span style="display:flex;"><span><span style="color:#aaa;font-style:italic"></span> <span style="color:#00a">switch</span>(event.data.messageName) { -</span></span><span style="display:flex;"><span> <span style="color:#00a">case</span> <span style="color:#a50">&#39;SELECTION&#39;</span>: -</span></span><span style="display:flex;"><span> console.debug(<span style="color:#a50">&#39;SELECTION event data: %o&#39;</span>, event.data); -</span></span><span style="display:flex;"><span> <span style="color:#00a">break</span>; -</span></span><span style="display:flex;"><span> <span style="color:#00a">default</span>: -</span></span><span style="display:flex;"><span> console.debug(<span style="color:#a50">`</span><span style="color:#a50">${</span>event.data.messageName<span style="color:#a50">}</span><span style="color:#a50"> not handled`</span>); -</span></span><span style="display:flex;"><span> } -</span></span><span style="display:flex;"><span>} -</span></span><span style="display:flex;"><span> -</span></span><span style="display:flex;"><span><span style="color:#0aa">window</span>.addEventListener(<span style="color:#a50">&#39;message&#39;</span>, handlePostMessage); -</span></span><span style="display:flex;"><span> -</span></span><span style="display:flex;"><span><span style="color:#00a">const</span> initMessage = { -</span></span><span style="display:flex;"><span> documentId: theDocumentId, <span style="color:#aaa;font-style:italic">// required - parsed from action url -</span></span></span><span style="display:flex;"><span><span style="color:#aaa;font-style:italic"></span> workspaceId: theWorkspaceId, <span style="color:#aaa;font-style:italic">// required - parsed from action url -</span></span></span><span style="display:flex;"><span><span style="color:#aaa;font-style:italic"></span> elementId: theElementId, <span style="color:#aaa;font-style:italic">// required - parsed from action url -</span></span></span><span style="display:flex;"><span><span style="color:#aaa;font-style:italic"></span> messageName: <span style="color:#a50">&#39;applicationInit&#39;</span> <span style="color:#aaa;font-style:italic">// required -</span></span></span><span style="display:flex;"><span><span style="color:#aaa;font-style:italic"></span>}; -</span></span><span style="display:flex;"><span> -</span></span><span style="display:flex;"><span><span style="color:#0aa">window</span>.parent.postMessage(initMessage, <span style="color:#a50">&#39;*&#39;</span>); -</span></span></code></pre></div><h3 id="right-panel-interaction-sequence">Right panel interaction sequence</h3> -<p>The sequence diagram below illustrates the interaction between an Element right panel application extension and the Onshape client:</p> -<pre tabindex="0"><code class="language-mermaid" data-lang="mermaid">%%{ -init: { -&#34;theme&#34;: &#34;default&#34;, -&#34;sequence&#34;: { -&#34;mirrorActors&#34;: false, -&#34;showSequenceNumbers&#34;: false, -&#34;width&#34;: 75, -&#34;height&#34;: 60, -&#34;actorMargin&#34;: 25, -&#34;messageFontSize&#34;: 13, -&#34;messageFontFamily&#34;: &#34;monospace&#34;, -&#34;messageFontWeight&#34;: 2 -} -} -}%% -sequenceDiagram -actor user -participant OSC AS Onshape Client -participant AE AS Application Extension -user-&gt;&gt;+OSC: start element right panel extension -Note right of user: via configured button -OSC-&gt;&gt;+AE: invoke action url (with query params) -AE-&gt;&gt;OSC: postMessage(messageName: &#39;applicationInit&#39;) -loop selection interactions -user-&gt;&gt;OSC: select -OSC-&gt;&gt;AE: postMessage(messageName: &#39;SELECTION&#39;) -end -user-&gt;&gt;OSC: stop element right panel extension -Note right of user: via configured button -deactivate AE -OSC-XAE: destroy -deactivate OSC -</code></pre><h3 id="right-panel-message-exchange">Right panel message exchange</h3> -<p>The following messages are exchanged for application extensions located in the element right panel and configured for Part Studio, Assembly, or Document contexts.</p> -<p>The first message with <code>messageName</code> attribute set to <code>applicationInit</code> is sent to the Onshape client by an application extension once it is loaded and ready to receive and process incoming messages:</p> -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-js" data-lang="js"><span style="display:flex;"><span> { -</span></span><span style="display:flex;"><span> documentId: <span style="color:#a50">&#39;&lt;document id&gt;&#39;</span>, -</span></span><span style="display:flex;"><span> workspaceId: <span style="color:#a50">&#39;&lt;workspace id&gt;&#39;</span>, -</span></span><span style="display:flex;"><span> elementId: <span style="color:#a50">&#39;&lt;element id&gt;&#39;</span>, -</span></span><span style="display:flex;"><span> messageName: <span style="color:#a50">&#39;applicationInit&#39;</span> -</span></span><span style="display:flex;"><span> } -</span></span></code></pre></div><p>The values <code>&lt;document id&gt;</code>, <code>&lt;workspace id&gt;</code>, <code>&lt;element id&gt;</code>, and <code>&lt;server id&gt;</code>:</p> -<ul> -<li>Are originally included as query parameters in the action URL used to request the content of the application extension</li> -<li>Must be included in messages sent to the Onshape client</li> -</ul> -<p>While initialization is the specific intent of the <code>applicationInit</code> message, other supported <code>messageName</code> attributes have the same initialization effect upon their first receipt by the Onshape client.</p> -<p>Next, as the user interacts with Onshape by selecting various parts of the model, messages with the <code>messageName</code> attribute set to <code>SELECTION</code> are sent to the application extension:</p> -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-js" data-lang="js"><span style="display:flex;"><span>{ -</span></span><span style="display:flex;"><span> messageName: <span style="color:#a50">&#39;SELECTION&#39;</span>, -</span></span><span style="display:flex;"><span> selections: [ -</span></span><span style="display:flex;"><span> { -</span></span><span style="display:flex;"><span> selectionType: <span style="color:#a50">&#39;ENTITY&#39;</span>, -</span></span><span style="display:flex;"><span> selectionId: <span style="color:#a50">&#39;KRiB&#39;</span>, -</span></span><span style="display:flex;"><span> entityType: <span style="color:#a50">&#39;FACE&#39;</span>, -</span></span><span style="display:flex;"><span> occurrencePath: [ -</span></span><span style="display:flex;"><span> <span style="color:#a50">&#39;MfOieM8xKIDGHe37c&#39;</span> -</span></span><span style="display:flex;"><span> ], -</span></span><span style="display:flex;"><span> workspaceMicroversionId: <span style="color:#a50">&#39;a781c53fbd1095e3462d2b70&#39;</span> -</span></span><span style="display:flex;"><span> }, -</span></span><span style="display:flex;"><span> { -</span></span><span style="display:flex;"><span> selectionType: <span style="color:#a50">&#39;ENTITY&#39;</span>, -</span></span><span style="display:flex;"><span> selectionId: <span style="color:#a50">&#39;KRdC&#39;</span>, -</span></span><span style="display:flex;"><span> entityType: <span style="color:#a50">&#39;EDGE&#39;</span>, -</span></span><span style="display:flex;"><span> occurrencePath: [ -</span></span><span style="display:flex;"><span> <span style="color:#a50">&#39;MfOieM8xKIDGHe37c&#39;</span> -</span></span><span style="display:flex;"><span> ], -</span></span><span style="display:flex;"><span> workspaceMicroversionId: <span style="color:#a50">&#39;a781c53fbd1095e3462d2b70&#39;</span> -</span></span><span style="display:flex;"><span> } -</span></span><span style="display:flex;"><span> ] -</span></span><span style="display:flex;"><span>} -</span></span></code></pre></div><h2 id="notes">Notes</h2> -<h3 id="keyboard-focus">Keyboard focus</h3> -<p>Keyboard focus will not be transferred to an application until the user clicks in the application or the application programmatically takes focus. An application should programmatically take focus when it is first loaded and when it receives a <code>show</code> message from Onshape. Shortcut keys will work immediately when the application is shown.</p> -<h3 id="future-work">Future work</h3> -<ul> -<li>New message types will be added as needed. If your application extension needs a message not listed in this document, please notify us, and we’ll work with you on it.</li> -<li>Mobile client support is unclear at this time.</li> -<li>Onshape is considering using promises to wrap <code>POST</code> messages, which would make the application extension&rsquo;s JavaScript simpler and enable chaining <code>POST</code>s with other operations. Promises would make some interactions with multiple responses difficult (e.g., when you open a dialog, like the Select Item dialog, and want to receive multiple <code>POST</code> messages back due to the user clicking on multiple items in the dialog).</li> -</ul>Docs: Structured Storagehttps://onshape-public.github.io/docs/app-dev/structuredstorage/Mon, 18 May 2020 20:40:16 -0400https://onshape-public.github.io/docs/app-dev/structuredstorage/ -<h2 id="sub-elements">Sub Elements</h2> -<p>Onshape provides application elements storage that is controlled by applications through the API. These elements allow a set of named sub-elements.</p> -<p>The application can make changes to sub-elements independently or in arbitrary groupings. Changes may be wholesale replacements, or may be deltas. When performing a delta update, the application may post a full version as well, which allows the api to return a smaller number of deltas for subsequent queries.</p> -<p>An application may need to perform multiple versionable actions in the course of performing a user-level action, and we want to allow the individual actions to be collected into a single action from the perspective of document history. We do this by providing support for creation of a private transaction and support for atomically committing the transaction to the document workspace as a single user-visible action.</p> -<p>Onshape does not assume any knowledge about the semantics of application deltas. All merging of deltas into a consolidated form is done by the application. Applications should typically send checkpoint state for a sub-element if many delta changes have been made since the last checkpoint.</p> -<p>Document content and changes are logically an array of bytes, but since they are transmitted through JSON, then are expected to be presented a Base-64 encoding of the array into string form.</p> -<p>We use some terminology in this document that is new.</p> -<ul> -<li> -<p><strong>changeId</strong> - an opaque identifier for the state of an application element. Each change to the application element results in a new changeId</p> -</li> -<li> -<p><strong>transaction</strong> - a private workspace within a document workspace for composing modifications to an application element. These changes are not visible to the user until committed.</p> -</li> -<li> -<p><strong>transaction commit</strong> - an operation that moves the changes performed within a transaction to the application element workspace as a single user-visible action.</p> -</li> -</ul> -<p><strong>Concurrent access by multiple users</strong></p> -<p>If the element is being concurrently accessed by multiple sessions, updates may encounter conflicts during update. If the application has a mechanism that ensures that all accesses to the element are mediated by a single process, as is done with our part studio and assemblies, this can be addressed directly by the application. However, if the application is not able to mediate access in this way, updates by one session may invalidate state held by another session. We address this by notifying updaters when an update cannot be directly applied because their state is out of date and allowing them to refresh their state before re-applying the change.</p> -<p>This policy of requiring the application have current state when posting updates could be overly conservative in some cases. Detecting conflict at the sub-element level might provide for better concurrent access performance, but there probably are cases where this fails, so it probably would need some level of application control.</p> -<h2 id="json-tree">JSON Tree</h2> -<p>In contrast with sub elements, JSON tree storage is a more managed data storage mechanism that Onshape itself can merge and diff. At the root of it, the data structure is a single JSON object per Application Element. The user submits incremental changes that are then applied by Onshape to the JSON tree. Onshape stores these &lsquo;diffs&rsquo; in a new microversion created as a result of the update request, or during a subsequent transaction commit request. When the user then performs a merge or restore operation, Onshape can sum and apply the requisite incremental changes. By storing diffs, Onshape provides to the user a storage mechanism that is more robust to race conditions, since multiple simultaneous edits can be optionally merged by Onshape. All of these qualities make JSON tree a preferred way to store application element data in an Onshape-native manner.</p> -<h3 id="json-tree-edit-semantics">JSON Tree Edit Semantics</h3> -<h5 id="btjedit-encoding">BTJEdit Encoding</h5> -<p>A JSON tree edit represents an incremental change to an application element&rsquo;s JSON tree. The edit is a <code>BTJEdit</code> class, which is encoded as one of the following:</p> -<ul> -<li>Deletion:</li> -</ul> -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-json" data-lang="json"><span style="display:flex;"><span>{ <span style="color:#1e90ff;font-weight:bold">&#34;btType&#34;</span> : <span style="color:#a50">&#34;BTJEditDelete-1992&#34;</span>, <span style="color:#1e90ff;font-weight:bold">&#34;path&#34;</span> : <span style="color:#a50">&#34;path&#34;</span> } -</span></span></code></pre></div><ul> -<li>Insertion:</li> -</ul> -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-json" data-lang="json"><span style="display:flex;"><span>{ <span style="color:#1e90ff;font-weight:bold">&#34;btType&#34;</span> : <span style="color:#a50">&#34;BTJEditInsert-2523&#34;</span>, <span style="color:#1e90ff;font-weight:bold">&#34;path&#34;</span> : <span style="color:#a50">&#34;path&#34;</span>, <span style="color:#1e90ff;font-weight:bold">&#34;value&#34;</span> : <span style="color:#a50">&#34;newValue&#34;</span> } -</span></span></code></pre></div><ul> -<li>Change:</li> -</ul> -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-json" data-lang="json"><span style="display:flex;"><span>{ <span style="color:#1e90ff;font-weight:bold">&#34;btType&#34;</span> : <span style="color:#a50">&#34;BTJEditChange-2636&#34;</span>, <span style="color:#1e90ff;font-weight:bold">&#34;path&#34;</span> : <span style="color:#a50">&#34;path&#34;</span>, <span style="color:#1e90ff;font-weight:bold">&#34;value&#34;</span> : <span style="color:#a50">&#34;newValue&#34;</span> } -</span></span></code></pre></div><ul> -<li>Move:</li> -</ul> -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-json" data-lang="json"><span style="display:flex;"><span>{ <span style="color:#1e90ff;font-weight:bold">&#34;btType&#34;</span> : <span style="color:#a50">&#34;BTJEditMove-3245&#34;</span>, <span style="color:#1e90ff;font-weight:bold">&#34;sourcePath&#34;</span> : <span style="color:#a50">&#34;path&#34;</span>, <span style="color:#1e90ff;font-weight:bold">&#34;destinationPath&#34;</span> : <span style="color:#a50">&#34;path&#34;</span> } -</span></span></code></pre></div><ul> -<li>List (where edit1, edit2, etc. are zero or more edits.):</li> -</ul> -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-json" data-lang="json"><span style="display:flex;"><span>{ <span style="color:#1e90ff;font-weight:bold">&#34;btType&#34;</span> : <span style="color:#a50">&#34;BTJEditList-2707&#34;</span>, <span style="color:#1e90ff;font-weight:bold">&#34;edits&#34;</span> : [ <span style="color:#a50">&#34;edit1&#34;</span>, <span style="color:#a50">&#34;edit2&#34;</span>, <span style="color:#a50">&#34;...&#34;</span>] } -</span></span></code></pre></div><p>Within the above encoding, <code>newValue</code> is a stand in for any valid JSON, and <code>path</code> is a stand in for an object representing a path to the node at which to perform the edit.</p> -<h5 id="btjpath-encoding">BTJPath Encoding</h5> -<p>The BTJPath object describes a path through the JSON tree to a particular node, and is encoded as follows:</p> -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-json" data-lang="json"><span style="display:flex;"><span>{ <span style="color:#1e90ff;font-weight:bold">&#34;btType&#34;</span> : <span style="color:#a50">&#34;BTJPath-3073&#34;</span>, <span style="color:#1e90ff;font-weight:bold">&#34;startNode&#34;</span> : <span style="color:#a50">&#34;startNode&#34;</span>, <span style="color:#1e90ff;font-weight:bold">&#34;path&#34;</span> : [ <span style="color:#a50">&#34;pathElement1&#34;</span>, <span style="color:#a50">&#34;pathElement2&#34;</span>, <span style="color:#a50">&#34;...&#34;</span>] } -</span></span></code></pre></div><p>where startNode is a string that is either empty to specify the root node or a nodeId of a node in the tree. The pathElement is one of:</p> -<ul> -<li>Key:</li> -</ul> -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-json" data-lang="json"><span style="display:flex;"><span>{ <span style="color:#1e90ff;font-weight:bold">&#34;btType&#34;</span> : <span style="color:#a50">&#34;BTJPathKey-3221&#34;</span>, <span style="color:#1e90ff;font-weight:bold">&#34;key&#34;</span> : <span style="color:#a50">&#34;string&#34;</span> } -</span></span></code></pre></div><ul> -<li>Index:</li> -</ul> -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-json" data-lang="json"><span style="display:flex;"><span>{ <span style="color:#1e90ff;font-weight:bold">&#34;btType&#34;</span> : <span style="color:#a50">&#34;BTJPathIndex-1871&#34;</span>, <span style="color:#1e90ff;font-weight:bold">&#34;index&#34;</span> : <span style="color:#a50">&#34;integer&#34;</span> } -</span></span></code></pre></div><p>In the insertion and move type edits the path elements can describe a path that doesn&rsquo;t currently exist. Onshape will generate the proper keys and values as needed to place the node value in the proper location.</p> -<h3 id="json-tree-examples">JSON Tree Examples</h3> -<p>Below are some examples that show the body required to perform the particular edit on a JSON tree.</p> -<h4 id="deletion-example">Deletion Example</h4> -<p>If the pre-existing JSON tree looks like:</p> -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-json" data-lang="json"><span style="display:flex;"><span>{<span style="color:#1e90ff;font-weight:bold">&#34;myKey&#34;</span>: <span style="color:#a50">&#34;myValue&#34;</span>} -</span></span></code></pre></div><p>and a delete edit looks like:</p> -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-json" data-lang="json"><span style="display:flex;"><span>{<span style="color:#1e90ff;font-weight:bold">&#34;btType&#34;</span>: <span style="color:#a50">&#34;BTJEditDelete-1992&#34;</span>, -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;path&#34;</span>: {<span style="color:#1e90ff;font-weight:bold">&#34;btType&#34;</span>: <span style="color:#a50">&#34;BTJPath-3073&#34;</span>, <span style="color:#1e90ff;font-weight:bold">&#34;startNode&#34;</span>: <span style="color:#a50">&#34;&#34;</span>, <span style="color:#1e90ff;font-weight:bold">&#34;path&#34;</span>: [{<span style="color:#1e90ff;font-weight:bold">&#34;btType&#34;</span>: <span style="color:#a50">&#34;BTJPathKey-3221&#34;</span>, <span style="color:#1e90ff;font-weight:bold">&#34;key&#34;</span>: <span style="color:#a50">&#34;myKey&#34;</span>}]}} -</span></span></code></pre></div><p>then the resulting JSON is the result of deleting the node specified by <code>path</code>:</p> -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-json" data-lang="json"><span style="display:flex;"><span>{} -</span></span></code></pre></div><h4 id="insert-example">Insert Example</h4> -<p>If the pre-existing JSON tree looks like:</p> -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-json" data-lang="json"><span style="display:flex;"><span>{} -</span></span></code></pre></div><p>and the insertion edit looks like:</p> -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-json" data-lang="json"><span style="display:flex;"><span>{<span style="color:#1e90ff;font-weight:bold">&#34;btType&#34;</span>: <span style="color:#a50">&#34;BTJEditInsert-2523&#34;</span>, -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;path&#34;</span>: {<span style="color:#1e90ff;font-weight:bold">&#34;btType&#34;</span>: <span style="color:#a50">&#34;BTJPath-3073&#34;</span>, <span style="color:#1e90ff;font-weight:bold">&#34;startNode&#34;</span>: <span style="color:#a50">&#34;&#34;</span>, <span style="color:#1e90ff;font-weight:bold">&#34;path&#34;</span>: [{<span style="color:#1e90ff;font-weight:bold">&#34;btType&#34;</span>: <span style="color:#a50">&#34;BTJPathKey-3221&#34;</span>, <span style="color:#1e90ff;font-weight:bold">&#34;key&#34;</span>: <span style="color:#a50">&#34;insertedKey&#34;</span>}]}, -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;value&#34;</span>: <span style="color:#a50">&#34;myValue&#34;</span>} -</span></span></code></pre></div><p>then the resulting JSON is the result of inserting the node described by <code>value</code> at the node specified by <code>path</code>:</p> -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-json" data-lang="json"><span style="display:flex;"><span>{<span style="color:#1e90ff;font-weight:bold">&#34;insertedKey&#34;</span>: <span style="color:#a50">&#34;myValue&#34;</span>} -</span></span></code></pre></div><h4 id="change-example">Change Example</h4> -<p>If the pre-existing JSON tree looks like:</p> -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-json" data-lang="json"><span style="display:flex;"><span>{<span style="color:#1e90ff;font-weight:bold">&#34;myKey&#34;</span>: <span style="color:#a50">&#34;myValue&#34;</span>} -</span></span></code></pre></div><p>and the change edit looks like:</p> -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-json" data-lang="json"><span style="display:flex;"><span>{<span style="color:#1e90ff;font-weight:bold">&#34;btType&#34;</span>: <span style="color:#a50">&#34;BTJEditChange-2636&#34;</span>, -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;path&#34;</span>: {<span style="color:#1e90ff;font-weight:bold">&#34;btType&#34;</span>: <span style="color:#a50">&#34;BTJPath-3073&#34;</span>, <span style="color:#1e90ff;font-weight:bold">&#34;startNode&#34;</span>: <span style="color:#a50">&#34;&#34;</span>, <span style="color:#1e90ff;font-weight:bold">&#34;path&#34;</span>: [{<span style="color:#1e90ff;font-weight:bold">&#34;btType&#34;</span>: <span style="color:#a50">&#34;BTJPathKey-3221&#34;</span>, <span style="color:#1e90ff;font-weight:bold">&#34;key&#34;</span>: <span style="color:#a50">&#34;myKey&#34;</span>}]}, -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;value&#34;</span>: <span style="color:#a50">&#34;myOtherValue&#34;</span>} -</span></span></code></pre></div><p>then the resulting JSON is the result of changing the node specified by <code>path</code> to the node described by <code>value</code>:</p> -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-json" data-lang="json"><span style="display:flex;"><span>{<span style="color:#1e90ff;font-weight:bold">&#34;myKey&#34;</span>: <span style="color:#a50">&#34;myOtherValue&#34;</span>} -</span></span></code></pre></div><h4 id="move-example">Move Example</h4> -<p>If the pre-existing JSON tree looks like:</p> -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-json" data-lang="json"><span style="display:flex;"><span>{<span style="color:#1e90ff;font-weight:bold">&#34;myKey&#34;</span>: <span style="color:#a50">&#34;myValue&#34;</span>, <span style="color:#1e90ff;font-weight:bold">&#34;myOtherKey&#34;</span>: <span style="color:#a50">&#34;myOtherValue&#34;</span>} -</span></span></code></pre></div><p>and the move edit looks like:</p> -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-json" data-lang="json"><span style="display:flex;"><span>{<span style="color:#1e90ff;font-weight:bold">&#34;btType&#34;</span>: <span style="color:#a50">&#34;BTJEditMove-3245&#34;</span>, <span style="color:#1e90ff;font-weight:bold">&#34;sourcePath&#34;</span>: {<span style="color:#1e90ff;font-weight:bold">&#34;btType&#34;</span>: <span style="color:#a50">&#34;BTJPath-3073&#34;</span>, <span style="color:#1e90ff;font-weight:bold">&#34;startNode&#34;</span>: <span style="color:#a50">&#34;&#34;</span>, -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;path&#34;</span>: [{<span style="color:#1e90ff;font-weight:bold">&#34;btType&#34;</span>: <span style="color:#a50">&#34;BTJPathKey-3221&#34;</span>, <span style="color:#1e90ff;font-weight:bold">&#34;key&#34;</span>: <span style="color:#a50">&#34;myKey&#34;</span>}]}, -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;destinationPath&#34;</span>: {<span style="color:#1e90ff;font-weight:bold">&#34;btType&#34;</span>: <span style="color:#a50">&#34;BTJPath-3073&#34;</span>, <span style="color:#1e90ff;font-weight:bold">&#34;startNode&#34;</span>: <span style="color:#a50">&#34;&#34;</span>, -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;path&#34;</span>: [{<span style="color:#1e90ff;font-weight:bold">&#34;btType&#34;</span>: <span style="color:#a50">&#34;BTJPathKey-3221&#34;</span>, <span style="color:#1e90ff;font-weight:bold">&#34;key&#34;</span>: <span style="color:#a50">&#34;keyCreatedFromMove&#34;</span>}]}} -</span></span></code></pre></div><p>then the resulting JSON is the result of moving the node from the specified <code>sourcePath</code> to the <code>destinationPath</code>:</p> -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-json" data-lang="json"><span style="display:flex;"><span>{<span style="color:#1e90ff;font-weight:bold">&#34;keyCreatedFromMove&#34;</span>: <span style="color:#a50">&#34;myValue&#34;</span>} -</span></span></code></pre></div><h4 id="list-example">List Example</h4> -<p>If the pre-existing JSON tree looks like:</p> -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-json" data-lang="json"><span style="display:flex;"><span>{} -</span></span></code></pre></div><p>and the list edit looks like:</p> -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-json" data-lang="json"><span style="display:flex;"><span>{<span style="color:#1e90ff;font-weight:bold">&#34;btType&#34;</span>: <span style="color:#a50">&#34;BTJEditList-2707&#34;</span>, <span style="color:#1e90ff;font-weight:bold">&#34;edits&#34;</span>: [ -</span></span><span style="display:flex;"><span> {<span style="color:#1e90ff;font-weight:bold">&#34;btType&#34;</span>: <span style="color:#a50">&#34;BTJEditInsert-2523&#34;</span>, <span style="color:#1e90ff;font-weight:bold">&#34;path&#34;</span>: {<span style="color:#1e90ff;font-weight:bold">&#34;btType&#34;</span>: <span style="color:#a50">&#34;BTJPath-3073&#34;</span>, <span style="color:#1e90ff;font-weight:bold">&#34;startNode&#34;</span>: <span style="color:#a50">&#34;&#34;</span>, <span style="color:#1e90ff;font-weight:bold">&#34;path&#34;</span>: [{<span style="color:#1e90ff;font-weight:bold">&#34;btType&#34;</span>: <span style="color:#a50">&#34;BTJPathKey-3221&#34;</span>, <span style="color:#1e90ff;font-weight:bold">&#34;key&#34;</span>: <span style="color:#a50">&#34;myKey&#34;</span>}]}, -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;value&#34;</span>: <span style="color:#a50">&#34;myValue&#34;</span>}, -</span></span><span style="display:flex;"><span> {<span style="color:#1e90ff;font-weight:bold">&#34;btType&#34;</span>: <span style="color:#a50">&#34;BTJEditChange-2636&#34;</span>, <span style="color:#1e90ff;font-weight:bold">&#34;path&#34;</span>: {<span style="color:#1e90ff;font-weight:bold">&#34;btType&#34;</span>: <span style="color:#a50">&#34;BTJPath-3073&#34;</span>, <span style="color:#1e90ff;font-weight:bold">&#34;startNode&#34;</span>: <span style="color:#a50">&#34;&#34;</span>, -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;path&#34;</span>: [{<span style="color:#1e90ff;font-weight:bold">&#34;btType&#34;</span>: <span style="color:#a50">&#34;BTJPathKey-3221&#34;</span>, <span style="color:#1e90ff;font-weight:bold">&#34;key&#34;</span>: <span style="color:#a50">&#34;myKey&#34;</span>}]}, -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;value&#34;</span>: [<span style="color:#a50">&#34;firstValue&#34;</span>, <span style="color:#a50">&#34;secondValue&#34;</span>]}, -</span></span><span style="display:flex;"><span> {<span style="color:#1e90ff;font-weight:bold">&#34;btType&#34;</span>: <span style="color:#a50">&#34;BTJEditInsert-2523&#34;</span>, <span style="color:#1e90ff;font-weight:bold">&#34;path&#34;</span>: {<span style="color:#1e90ff;font-weight:bold">&#34;btType&#34;</span>: <span style="color:#a50">&#34;BTJPath-3073&#34;</span>, <span style="color:#1e90ff;font-weight:bold">&#34;startNode&#34;</span>: <span style="color:#a50">&#34;&#34;</span>, -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;path&#34;</span>: [{<span style="color:#1e90ff;font-weight:bold">&#34;btType&#34;</span>: <span style="color:#a50">&#34;BTJPathKey-3221&#34;</span>, <span style="color:#1e90ff;font-weight:bold">&#34;key&#34;</span>: <span style="color:#a50">&#34;myKey&#34;</span>}, -</span></span><span style="display:flex;"><span> {<span style="color:#1e90ff;font-weight:bold">&#34;btType&#34;</span>: <span style="color:#a50">&#34;BTJPathIndex-1871&#34;</span>, <span style="color:#1e90ff;font-weight:bold">&#34;index&#34;</span>: <span style="color:#099">1</span>}]}, -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;value&#34;</span>: <span style="color:#a50">&#34;myBetterSecondValue&#34;</span>}, -</span></span><span style="display:flex;"><span> {<span style="color:#1e90ff;font-weight:bold">&#34;btType&#34;</span>: <span style="color:#a50">&#34;BTJEditDelete-1992&#34;</span>, <span style="color:#1e90ff;font-weight:bold">&#34;path&#34;</span>: {<span style="color:#1e90ff;font-weight:bold">&#34;btType&#34;</span>: <span style="color:#a50">&#34;BTJPath-3073&#34;</span>, <span style="color:#1e90ff;font-weight:bold">&#34;startNode&#34;</span>: <span style="color:#a50">&#34;&#34;</span>, -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;path&#34;</span>: [{<span style="color:#1e90ff;font-weight:bold">&#34;btType&#34;</span>: <span style="color:#a50">&#34;BTJPathKey-3221&#34;</span>, <span style="color:#1e90ff;font-weight:bold">&#34;key&#34;</span>: <span style="color:#a50">&#34;myKey&#34;</span>}, -</span></span><span style="display:flex;"><span> {<span style="color:#1e90ff;font-weight:bold">&#34;btType&#34;</span>: <span style="color:#a50">&#34;BTJPathIndex-1871&#34;</span>, <span style="color:#1e90ff;font-weight:bold">&#34;index&#34;</span>: <span style="color:#099">2</span>}]}} -</span></span><span style="display:flex;"><span> ]} -</span></span></code></pre></div><p>then the resulting JSON is the result of applying all the given edits in order:</p> -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-json" data-lang="json"><span style="display:flex;"><span>{<span style="color:#1e90ff;font-weight:bold">&#34;myKey&#34;</span>: [<span style="color:#a50">&#34;firstValue&#34;</span>, <span style="color:#a50">&#34;myBetterSecondValue&#34;</span>]} -</span></span></code></pre></div><p>The intermediate steps were:</p> -<ol> -<li>Insertion: -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-json" data-lang="json"><span style="display:flex;"><span> {<span style="color:#1e90ff;font-weight:bold">&#34;myKey&#34;</span>: <span style="color:#a50">&#34;myValue&#34;</span>} -</span></span></code></pre></div></li> -<li>Change: -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-json" data-lang="json"><span style="display:flex;"><span> {<span style="color:#1e90ff;font-weight:bold">&#34;myKey&#34;</span>: [<span style="color:#a50">&#34;firstValue&#34;</span>, <span style="color:#a50">&#34;secondValue&#34;</span>]} -</span></span></code></pre></div></li> -<li>List insertion: -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-json" data-lang="json"><span style="display:flex;"><span> {<span style="color:#1e90ff;font-weight:bold">&#34;myKey&#34;</span>: [<span style="color:#a50">&#34;firstValue&#34;</span>, <span style="color:#a50">&#34;myBetterSecondValue&#34;</span>, <span style="color:#a50">&#34;secondValue&#34;</span>]} -</span></span></code></pre></div></li> -<li>List deletion: -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-json" data-lang="json"><span style="display:flex;"><span> {<span style="color:#1e90ff;font-weight:bold">&#34;myKey&#34;</span>: [<span style="color:#a50">&#34;firstValue&#34;</span>, <span style="color:#a50">&#34;myBetterSecondValue&#34;</span>]} -</span></span></code></pre></div></li> -</ol> -<p>All the examples above were tested and validated using the Python client <a href="https://github.com/onshape-public/onshape-clients/blob/next/python/test/test_app_element_json_tree.py">here</a>.</p>Docs: Webhookshttps://onshape-public.github.io/docs/app-dev/webhook/Mon, 18 May 2020 20:44:05 -0400https://onshape-public.github.io/docs/app-dev/webhook/ -<p>This page describes the Webhook APIs Onshape provides for working with notifications.</p> -<p>Notifications are delivered to an application as an HTTP <code>POST</code> with a JSON body, which includes information about the identity of the registration request and information specific to the event and notification message.</p> -<p>Webhooks are an alternative approach to polling; instead of your application continuously asking Onshape for new information, webhooks automatically send a notification from Onshape any time an event you are subscribed to occurs.</p> -<p>An application may register for notifications to a URL that uses either HTTP or HTTPS. If HTTPS is specified by the URL template, the notification server must supply a certificate that is signed by a certificate authority (CA) recognized by Onshape. Self-signed certificates (as well as certificates signed by unrecognized CAs) will be rejected, causing notification delivery to fail.</p> -<blockquote> -<p>📘 <strong>Notes</strong></p> -<ul> -<li>This page provides sample code as curls. See the <a href="https://curl.se/docs/">curl documentation</a> for more information.</li> -<li>All Onshape API calls must be properly authenticated by replacing the <code>CREDENTIALS</code> variable in the curls below. See the <a href="https://onshape-public.github.io/docs/auth/apikeys">API Keys</a> page for instructions and the <a href="https://onshape-public.github.io/docs/api-intro/quickstart">Quick Start</a> for an example. All applications submitted to the Onshape App Store <em>must</em> authenticate with <a href="https://onshape-public.github.io/docs/auth/oauth">OAuth2</a>.</li> -<li>This documentation refers to Onshape IDs in the following format: <code>{did}, {wid}, {eid}, {pid}, {otherId}</code>. These represent document, workspace, element, part, and other IDs (respectively) that are needed make the API calls. We sometimes abbreviate these variables as <code>DWVEM</code> Please see <a href="https://onshape-public.github.io/docs/api-intro/#onshape-api-request">API Guide: API Intro</a> for information on what these IDs mean and how to obtain them from your documents. Sometimes, this page will use a stand-in string to represent these IDs (<code>000000000000000000000000</code>). Never include the curly braces (<code>{}</code>) in your API calls.</li> -<li>For Enterprise accounts, replace <strong><font color="slate">cad</font></strong> in all Onshape URLs with your company domain. -https://<font color="slate"><strong>cad</strong></font>.onshape.com &gt; https://<font color="slate"><strong>companyName</strong></font>.onshape.com</li> -</ul> -</blockquote> -<h2 id="events">Events</h2> -<p>Each type of event that an application may receive notifications for has a unique identifier known as the event type. Event types are grouped into Event Groups. Each group shares specification requirements.</p> -<p>Event types are categorized into several different groups based on the dominant user resource of the event. The group that a given event is part of defines the required parameters needed in the registration process to identify the resource or group of resources to watch. For instance, if registering for an event in the <code>document</code> event group, the application must identify either a specific document&rsquo;s id or a specific company&rsquo;s id. If registered for a company, the event will be registered for all present and future documents owned by the company.</p> -<blockquote> -<p>📘 <strong>Note</strong></p> -<p>You can see the full list of available events in the Glassworks API Explorer. Expand the <a href="https://cad.onshape.com/glassworks/explorer/#/Webhook/createWebhook">createWebhook</a> endpoint, then click <strong>Callbacks</strong>.</p> -<img src="https://onshape-public.github.io/images/webhooks-callbacks.png" alt="callbacks in the Glassworks Webhook > createWebhook > Callback page" width=80%> -</blockquote> -<h3 id="application-group">Application Group</h3> -<p>Monitor changes to applications.</p> -<p><strong>Supported Event Types</strong></p> -<ul> -<li><code>onshape.user.lifecycle.updateappsettings</code> - Occurs when user application settings are modified</li> -</ul> -<p><strong>Registration Requirements</strong></p> -<ul> -<li><code>clientId</code> - Must be specified in the registration body</li> -<li><code>event</code> - Must be set to <code>onshape.user.lifecycle.updateappsettings</code></li> -<li><code>options.collapseEvents</code> - Must be set to <code>true</code> or <code>false</code></li> -<li><code>url</code> - Must be provided to receive the webhook notifications</li> -</ul> -<pre tabindex="0"><code>{ -&#34;clientId&#34;: &#34;000000000000000000000000&#34;, -&#34;events&#34;: [ -&#34;onshape.user.lifecycle.updateappsettings&#34; -], -&#34;options&#34;: { -&#34;collapseEvents&#34;: false -}, -&#34;url&#34;: &#34;https://sampleUrl.org&#34; -} -</code></pre><h3 id="document-group">Document Group</h3> -<p>Monitor various aspects of document changes.</p> -<p><strong>Supported Event Types</strong></p> -<ul> -<li><code>onshape.model.lifecycle.changed</code> - Occurs when a change to a model is made</li> -<li><code>onshape.model.translation.complete</code> - Occurs when a translation request is complete</li> -<li><code>onshape.model.lifecycle.metadata</code> - Occurs when Part or element metadata is modified</li> -<li><code>onshape.model.lifecycle.createversion</code> - Occurs when a new version of a document is created</li> -<li><code>onshape.model.lifecycle.createworkspace</code> - Occurs when a new workspace is created</li> -<li><code>onshape.model.lifecycle.createelement</code> - Occurs when a new element is created</li> -<li><code>onshape.model.lifecycle.deleteelement</code> - Occurs when an element is deleted</li> -<li><code>onshape.document.lifecycle.statechange</code> - Occurs when a document changes state</li> -<li><code>onshape.model.lifecycle.changed.externalreferences</code> - Occurs when an external reference changes</li> -<li><code>onshape.document.lifecycle.created</code> - Occurs when a document is created</li> -<li><code>onshape.revision.created</code> - Occurs when a revision is created</li> -<li><code>onshape.comment.create</code> - Occurs when a comment is created in a document</li> -<li><code>onshape.comment.update</code> - Occurs when a comment is updated in a document</li> -<li><code>onshape.comment.delete</code> - Occurs when a comment is deleted in a document</li> -</ul> -<p><strong>Registration Requirements</strong></p> -<ul> -<li> -<p><code>documentId</code> OR <code>companyId</code> must be specified in the registration body</p> -<ul> -<li>Only <code>documentId</code> is valid for the <code>onshape.document.lifecycle.statechange</code></li> -</ul> -</li> -<li> -<p><code>event</code> - Must be set to one of the supported event types listed above</p> -<ul> -<li>May be set to <code>false</code> if the application is always listening to webhook notifications and <code>companyId</code> is specified.</li> -<li>If <code>false</code>, unregister the webhook when it is no longer needed.</li> -</ul> -</li> -<li> -<p><code>options.collapseEvents</code> - Must be set to <code>true</code> or <code>false</code></p> -</li> -<li> -<p><code>url</code> - Must be provided to receive the webhook notifications</p> -</li> -</ul> -<pre tabindex="0"><code>{ -&#34;documentId&#34;: &#34;000000000000000000000000&#34;, -&#34;events&#34;: [ -&#34;onshape.user.lifecycle.updateappsettings&#34; -], -&#34;options&#34;: { -&#34;collapseEvents&#34;: false -}, -&#34;url&#34;: &#34;https://sampleUrl.org&#34; -} -</code></pre><h3 id="workflow-group">Workflow Group</h3> -<p>Monitor release management actions.</p> -<p><strong>Supported Event Types</strong></p> -<ul> -<li><code>onshape.workflow.transition</code> - Occurs when a revision or release package transitions through workflow states</li> -</ul> -<p><strong>Registration Requirements</strong></p> -<ul> -<li><code>companyId</code> - Must be specified in the registration body</li> -<li><code>event</code> - Must be set to <code>onshape.workflow.transition</code> -<ul> -<li>May be set to <code>false</code> if the application is always listening to webhook notifications.</li> -<li>If <code>false</code>, unregister the webhook when it is no longer needed.</li> -</ul> -</li> -<li><code>options.collapseEvents</code> - Must be set to <code>true</code> or <code>false</code></li> -<li><code>url</code> - Must be provided to receive the webhook notifications</li> -</ul> -<pre tabindex="0"><code>{ -&#34;companyId&#34;: &#34;000000000000000000000000&#34;, -&#34;events&#34;: [ -&#34;onshape.workflow.transition&#34; -], -&#34;options&#34;: { -&#34;collapseEvents&#34;: false -}, -&#34;url&#34;: &#34;https://sampleUrl.org&#34; -} -</code></pre><h3 id="lifecycle-group">Lifecycle Group</h3> -<p>Monitor webhook changes. You do not need to register for these events; they are sent automatically when a webhook for another event type is registered, unregistered, or pinged.</p> -<p><strong>Supported Event Types</strong></p> -<ul> -<li><code>webhook.register</code> - Occurs in response to a notification registration API call</li> -<li><code>webhook.unregister</code> - Occurs in response to a notification deregistation API call</li> -<li><code>webhook.ping</code> - Occurs either: -<ul> -<li>In response to a request by an application to call the <a href="https://cad.onshape.com/glassworks/explorer/#/Webhook/pingWebhook">pingWebook</a> endpoint.</li> -<li>As a post-registration validation initiated by Onshape</li> -</ul> -</li> -</ul> -<h2 id="example-notifications">Example Notifications</h2> -<p><strong>webhook.register</strong></p> -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-json" data-lang="json"><span style="display:flex;"><span>{ -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;timestamp&#34;</span>: <span style="color:#a50">&#34;2024-05-05T23:45:10.611-0500&#34;</span>, -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;event&#34;</span>: <span style="color:#a50">&#34;webhook.register&#34;</span>, -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;workspaceId&#34;</span>: <span style="color:#a50">&#34;000000000000000000000000&#34;</span>, -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;elementId&#34;</span>: <span style="color:#a50">&#34;000000000000000000000000&#34;</span>, -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;webhookId&#34;</span>: <span style="color:#a50">&#34;000000000000000000000000&#34;</span>, -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;messageId&#34;</span>: <span style="color:#a50">&#34;000000000000000000000000&#34;</span>, -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;data&#34;</span>: <span style="color:#a50">&#34;Some data&#34;</span>, -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;documentId&#34;</span>: <span style="color:#a50">&#34;000000000000000000000000&#34;</span>, -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;versionId&#34;</span>: <span style="color:#a50">&#34;000000000000000000000000&#34;</span> -</span></span><span style="display:flex;"><span>} -</span></span></code></pre></div><p><strong>webhook.ping</strong></p> -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-json" data-lang="json"><span style="display:flex;"><span>{ -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;timestamp&#34;</span>: <span style="color:#a50">&#34;2024-05-05T23:45:10.611-0500&#34;</span>, -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;event&#34;</span>: <span style="color:#a50">&#34;webhook.ping&#34;</span>, -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;workspaceId&#34;</span>: <span style="color:#a50">&#34;000000000000000000000000&#34;</span>, -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;elementId&#34;</span>: <span style="color:#a50">&#34;000000000000000000000000&#34;</span>, -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;webhookId&#34;</span>: <span style="color:#a50">&#34;000000000000000000000000&#34;</span>, -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;messageId&#34;</span>: <span style="color:#a50">&#34;000000000000000000000000&#34;</span>, -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;data&#34;</span>: <span style="color:#a50">&#34;Some data&#34;</span>, -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;documentId&#34;</span>: <span style="color:#a50">&#34;000000000000000000000000&#34;</span>, -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;versionId&#34;</span>: <span style="color:#a50">&#34;000000000000000000000000&#34;</span> -</span></span><span style="display:flex;"><span>} -</span></span></code></pre></div><p><strong>onshape.model.lifecycle.changed</strong></p> -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-json" data-lang="json"><span style="display:flex;"><span>{ -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;timestamp&#34;</span>: <span style="color:#a50">&#34;2024-05-05T23:46:29.284-0500&#34;</span>, -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;event&#34;</span>: <span style="color:#a50">&#34;onshape.model.lifecycle.changed&#34;</span>, -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;workspaceId&#34;</span>: <span style="color:#a50">&#34;000000000000000000000000&#34;</span>, -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;elementId&#34;</span>: <span style="color:#a50">&#34;000000000000000000000000&#34;</span>, -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;webhookId&#34;</span>: <span style="color:#a50">&#34;000000000000000000000000&#34;</span>, -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;messageId&#34;</span>: <span style="color:#a50">&#34;000000000000000000000000&#34;</span>, -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;data&#34;</span>: <span style="color:#a50">&#34;Some data&#34;</span>, -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;documentId&#34;</span>: <span style="color:#a50">&#34;000000000000000000000000&#34;</span>, -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;versionId&#34;</span>: <span style="color:#a50">&#34;000000000000000000000000&#34;</span> -</span></span><span style="display:flex;"><span>} -</span></span></code></pre></div><p><strong>onshape.document.lifecycle.statechange</strong></p> -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-json" data-lang="json"><span style="display:flex;"><span>{ -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;timestamp&#34;</span>: <span style="color:#a50">&#34;2024-05-05T23:46:29.284-0500&#34;</span>, -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;event&#34;</span>: <span style="color:#a50">&#34;onshape.document.lifecycle.statechange&#34;</span>, -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;workspaceId&#34;</span>: <span style="color:#a50">&#34;000000000000000000000000&#34;</span>, -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;elementId&#34;</span>: <span style="color:#a50">&#34;000000000000000000000000&#34;</span>, -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;webhookId&#34;</span>: <span style="color:#a50">&#34;000000000000000000000000&#34;</span>, -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;messageId&#34;</span>: <span style="color:#a50">&#34;000000000000000000000000&#34;</span>, -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;data&#34;</span>: <span style="color:#a50">&#34;Some data&#34;</span>, -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;documentId&#34;</span>: <span style="color:#a50">&#34;000000000000000000000000&#34;</span>, -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;versionId&#34;</span>: <span style="color:#a50">&#34;000000000000000000000000&#34;</span>, -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;documentState&#34;</span>: <span style="color:#a50">&#34;TRASH&#34;</span> -</span></span><span style="display:flex;"><span>} -</span></span></code></pre></div><p>Possible values of <code>documentState</code> are:</p> -<ul> -<li><code>ACTIVE</code> - Document is in a normal, usable state.</li> -<li><code>TRASH</code> - Document has been moved to the trash; user can move document back to <code>ACTIVE</code> state.</li> -<li><code>DELETED</code> - Document has been deleted; user cannot access document.</li> -</ul> -<p><strong>onshape.user.lifecycle.updateappsettings</strong></p> -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-json" data-lang="json"><span style="display:flex;"><span>{ -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;timestamp&#34;</span>: <span style="color:#a50">&#34;2024-05-05T23:46:29.284-0500&#34;</span>, -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;event&#34;</span>: <span style="color:#a50">&#34;onshape.user.lifecycle.updateappsettings&#34;</span>, -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;workspaceId&#34;</span>: <span style="color:#a50">&#34;000000000000000000000000&#34;</span>, -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;elementId&#34;</span>: <span style="color:#a50">&#34;000000000000000000000000&#34;</span>, -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;webhookId&#34;</span>: <span style="color:#a50">&#34;000000000000000000000000&#34;</span>, -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;messageId&#34;</span>: <span style="color:#a50">&#34;000000000000000000000000&#34;</span>, -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;data&#34;</span>: <span style="color:#a50">&#34;Some data&#34;</span>, -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;userId&#34;</span>: <span style="color:#a50">&#34;000000000000000000000000&#34;</span>, -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;clientId&#34;</span>:<span style="color:#a50">&#34;000000000000000000000000&#34;</span> -</span></span><span style="display:flex;"><span>} -</span></span></code></pre></div><p><strong>onshape.model.translation.complete</strong></p> -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-json" data-lang="json"><span style="display:flex;"><span>{ -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;timestamp&#34;</span>: <span style="color:#a50">&#34;2024-05-05T23:46:29.284-0500&#34;</span>, -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;event&#34;</span>: <span style="color:#a50">&#34;onshape.model.translation.complete&#34;</span>, -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;workspaceId&#34;</span>: <span style="color:#a50">&#34;000000000000000000000000&#34;</span>, -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;elementId&#34;</span>: <span style="color:#a50">&#34;000000000000000000000000&#34;</span>, -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;webhookId&#34;</span>: <span style="color:#a50">&#34;000000000000000000000000&#34;</span>, -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;messageId&#34;</span>: <span style="color:#a50">&#34;000000000000000000000000&#34;</span>, -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;data&#34;</span>: <span style="color:#a50">&#34;Some data&#34;</span>, -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;documentId&#34;</span>: <span style="color:#a50">&#34;000000000000000000000000&#34;</span>, -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;userId&#34;</span>: <span style="color:#a50">&#34;000000000000000000000000&#34;</span>, -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;translationId&#34;</span>: <span style="color:#a50">&#34;000000000000000000000000&#34;</span> -</span></span><span style="display:flex;"><span>} -</span></span></code></pre></div><p><strong>onshape.comment.create</strong></p> -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-json" data-lang="json"><span style="display:flex;"><span>{ -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;timestamp&#34;</span>: <span style="color:#a50">&#34;2024-05-05T23:46:29.284-0500&#34;</span>, -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;event&#34;</span>: <span style="color:#a50">&#34;onshape.comment.create&#34;</span>, -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;workspaceId&#34;</span>: <span style="color:#a50">&#34;000000000000000000000000&#34;</span>, -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;elementId&#34;</span>: <span style="color:#a50">&#34;000000000000000000000000&#34;</span>, -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;webhookId&#34;</span>: <span style="color:#a50">&#34;000000000000000000000000&#34;</span>, -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;messageId&#34;</span>: <span style="color:#a50">&#34;000000000000000000000000&#34;</span>, -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;documentId&#34;</span>: <span style="color:#a50">&#34;000000000000000000000000&#34;</span>, -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;commentId&#34;</span>: <span style="color:#a50">&#34;000000000000000000000000&#34;</span> -</span></span><span style="display:flex;"><span>} -</span></span></code></pre></div><h2 id="endpoints">Endpoints</h2> -<p>Webhook notifications allow an application to register to receive notifications of certain events that occur within the Onshape environment. To receive a notification, an application must expose an endpoint that Onshape can call.</p> -<ul> -<li><a href="https://cad.onshape.com/glassworks/explorer/#/Webhook/getWebhooks">Webhook/getWebhooks</a> -<pre tabindex="0"><code> curl -X &#39;GET&#39; \ -&#39;https://cad.onshape.com/api/v6/webhooks?user={uid}&amp;offset=0&amp;limit=20&#39; \ --H &#39;aAccept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; -</code></pre></li> -<li><a href="https://cad.onshape.com/glassworks/explorer/#/Webhook/createWebhook">Webhook/createWebhook</a> -<pre tabindex="0"><code> curl -X &#39;POST&#39; \ -&#39;https://cad.onshape.com/api/v6/webhooks&#39; \ --H &#39;Accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; \ --H &#39;Content-Type: application/json;charset=UTF-8; qs=0.09&#39; \ --d &#39;{ -&#34;events&#34;: [ -&#34;eventType&#34; // See the [Events](#events) section above for valid event types. -], -&#34;options&#34;: { -&#34;collapseEvents&#34;: true | false -}, -&#34;url&#34;: &#34;https://sampleUrl.org&#34; -//Other parameters may be required. See the [Events](#events) section above. -}&#39; -</code></pre></li> -<li><a href="https://cad.onshape.com/glassworks/explorer/#/Webhook/getWebhook">Webhook/getWebhook</a> -<pre tabindex="0"><code>curl -X &#39;GET&#39; \ -&#39;https://cad.onshape.com/api/v6/webhooks/webhookId&#39; \ --H &#39;Accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; -</code></pre></li> -<li><a href="https://cad.onshape.com/glassworks/explorer/#/Webhook/updateWebhook">Webhook/updateWebhook</a> -<pre tabindex="0"><code> curl -X &#39;POST&#39; \ -&#39;https://cad.onshape.com/api/v6/webhooks/webhookId&#39; \ --H &#39;Accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; \ --H &#39;Content-Type: application/json;charset=UTF-8; qs=0.09&#39; \ --d &#39;{ -&#34;id&#34;: &#34;webhookId&#34;, -&#34;options&#34;: { -&#34;collapseEvents&#34;: true | false -} -}&#39; -</code></pre><ul> -<li>Note that the webhook <code>id</code> must be sent in both the URL and the request body.</li> -</ul> -</li> -<li><a href="https://cad.onshape.com/glassworks/explorer/#/Webhook/unregisterWebhook">Webhook/unregisterWebhook</a> -<pre tabindex="0"><code> curl -X &#39;DELETE&#39; \ -&#39;https://cad.onshape.com/api/v6/webhooks/{webhookId}?blockNotification=false&#39; \ --H &#39;accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; -</code></pre></li> -<li><a href="https://cad.onshape.com/glassworks/explorer/#/Webhook/pingWebhook">Webhook/pingWebhook</a> -<pre tabindex="0"><code> curl -X &#39;POST&#39; \ -&#39;https://cad.onshape.com/api/v6/webhooks/{webhookId}/ping&#39; \ --H &#39;Accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; -</code></pre></li> -</ul> -<h2 id="sample-workflows">Sample Workflows</h2> -<h3 id="create-a-webhook">Create a webhook</h3> -<p>An application registers for event notification by:</p> -<ol> -<li>Making a REST call to the Onshape web service</li> -<li>Providing a URL to notify</li> -<li>Providing the required parameters for the event types to be registered</li> -</ol> -<p>If the registration request is well-formed, the registration API call returns information about the registration, including a unique <code>id</code> string that identifies the webhook registration. This corresponds to the <code>webhookId</code> field in other endpoints. No de-duplication of notification registrations is performed by the API. Each registration call will yield a new <code>registrationId</code>, even if the parameters are identical to those passed in a prior call.</p> -<p>Shortly after an application calls the notification registration API, Onshape will make make an asynchronous trial notification call to the URL generated from the URL template with an event type of <code>webhook.register</code> to test if the application notification server is accessible. If the trial notification delivery fails to return an HTTP <code>200</code> status code, the notification registration is cancelled. The trial notification is usually delivered after the notification registration has been received by the application. However, variations in network delays may result in the trial notification occurring before the response is received and processed by the application, so the notification handler should be ready to process notifications before the registration call is made.</p> -<p>In this example, we use a webhook to send information from Onshape to another server. You need a URL for Onshape to send notifications to, and a way to view the messages sent with those notifications.</p> -<ol> -<li>Open an Onshape document, or create a new one.</li> -<li>In this example, we want to receive a notification from Onshape any time a new version is created in the specified document. For this, we’ll use <code>onshape.model.lifecycle.createversion</code> as our <code>event</code>.</li> -<li>The event type requires one parameter. We’ll use our <code>documentId</code> for this field (shown as <code>000000000000000000000000</code> in the example below).</li> -<li>All event types require specifying <code>true</code> or <code>false</code> for the <code>options.collapseEvents</code> field. In this case, set the field to <code>false</code>.</li> -<li>Next, we need the URL to send the notification to. You must provide your own URL to receive notifications here.</li> -<li>Confirm your <a href="https://cad.onshape.com/glassworks/explorer/#/Webhook/createWebhook">createWebhook</a> call looks like this (substitute your own authorization credentials, document ID, and URL), then make the call.</li> -</ol> -<pre tabindex="0"><code> curl -X &#39;POST&#39; \ -&#39;https://cad.onshape.com/api/v6/webhooks&#39; \ --H &#39;Accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; \ --H &#39;Content-Type: application/json;charset=UTF-8; qs=0.09&#39; \ --d &#39;{ -&#34;documentId&#34;: &#34;000000000000000000000000&#34;, -&#34;events&#34;: [ -&#34;onshape.model.lifecycle.createversion&#34; -], -&#34;options&#34;: { -&#34;collapseEvents&#34;: false -}, -&#34;url&#34;: &#34;https://sampleUrl.org&#34; -}&#39; -</code></pre><ol start="7"> -<li>In your application, confirm that you received the <code>webhook.register</code> event from Onshape.</li> -<li>In Onshape, create a new version in your document.</li> -<li>In your application, confirm that you received the <code>onshape.model.lifecycle.createversion</code> event from Onshape. Make note of the <code>id</code> in the response; use this as your <code>webhookId</code> in subsequent examples.</li> -</ol> -<h3 id="get-webhook-info">Get webhook info</h3> -<ol> -<li>Complete the <a href="#create-a-webhook">Create a webhook</a> steps above to obtain a <code>webhookId</code>.</li> -<li>Create your <a href="https://cad.onshape.com/glassworks/explorer/#/Webhook/getWebhook">getWebhook</a> call. substitute your own authorization credentials and <code>webhookId</code> (shown as <code>000000000000000000000000</code> in the example below), then make the call.</li> -</ol> -<pre tabindex="0"><code> curl -X &#39;GET&#39; \ -&#39;https://cad.onshape.com/api/v6/webhooks/000000000000000000000000&#39; \ --H &#39;Accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; \ -</code></pre><ol start="3"> -<li>Confirm that the <code>event</code> in the response is <code>onshape.model.lifecycle.createversion</code>.</li> -</ol> -<h3 id="update-a-webhook">Update a webhook</h3> -<ol> -<li>Complete the <a href="#create-a-webhook">Create a webhook</a> steps above to obtain a <code>webhookId</code>. Note that in the same response, the webhook <code>description</code> is <code>null</code>.</li> -<li>Create your <a href="https://cad.onshape.com/glassworks/explorer/#/Webhook/updateWebhook">updateWebhook</a> call. In this example, ww update the webhook&rsquo;s <code>description</code>. Substitute your own authorization credentials and <code>webhookId</code> (shown as <code>000000000000000000000000</code> in the example below in both the URL and request body). Then make the call.</li> -</ol> -<pre tabindex="0"><code> curl -X &#39;POST&#39; \ -&#39;https://cad.onshape.com/api/v6/webhooks/000000000000000000000000&#39; \ --H &#39;accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; \ --H &#39;Content-Type: application/json;charset=UTF-8; qs=0.09&#39; \ --d &#39;{ -&#34;id&#34;: &#34;000000000000000000000000&#34;, -&#34;description&#34;: &#34;Send a notification each time a document version is created.&#34;, -&#34;options&#34;: { -&#34;collapseEvents&#34;: false -} -}&#39; -</code></pre><ol start="3"> -<li>Confirm in the response that the webhook <code>description</code> is set to <code>Send a notification each time a document version is created.</code></li> -</ol> -<h3 id="delete-a-webhook">Delete a webhook</h3> -<p>When an application no longer needs to be notified of changes specified by a particular notification registration, it should normally deregister the notification request. Deregistration is performed by making an HTTP that specifies the hook to deregister. Onshape will attempt to call the deregistered hook with an event type of <code>webhook.unregister</code> as validation that the deregistration is complete. If the application does not deregister the webhook, Onshape will continue delivering notifications until the the application either returns an error in response to a notification for the webhook or fails to respond at all for an extended period of time.</p> -<ol> -<li>Complete the <a href="#create-a-webhook">Create a webhook</a> steps above to obtain a <code>webhookId</code>.</li> -<li>Create your <a href="https://cad.onshape.com/glassworks/explorer/#/Webhook/deleteWebhook">deleteWebhook</a> call. substitute your own authorization credentials and <code>webhookId</code> (shown as <code>000000000000000000000000</code> in the example below), then make the call.</li> -</ol> -<pre tabindex="0"><code> curl -X &#39;DELETE&#39; \ -&#39;https://cad.onshape.com/api/v6/webhooks/000000000000000000000000&#39; \ --H &#39;Accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Authorization: Basic CREDENTIALS=&#39; \ -</code></pre><ol start="3"> -<li>In your application, confirm that you received the <code>webhook.unregister</code> event from Onshape.</li> -<li>In Onshape, create a new version in your document.</li> -<li>In your application, confirm that no new events have been received.</li> -</ol> -<h2 id="additional-resources">Additional Resources</h2> -<ul> -<li><a href="https://cad.onshape.com/help/Content/Plans/webhooks.htm">Onshape Help: Webhooks</a></li> -<li><a href="https://onshape-public.github.io/docs/api-intro/explorer">API Guide: API Explorer</a></li> -<li><a href="https://cad.onshape.com/help/Content/Plans/webhooks.htm">API Explorer: Webhooks</a></li> -<li><a href="https://github.com/onshape-public/onshape-clients/blob/master/python/test/test_webhooks.py#L126">Sample Code: Python Webhooks</a></li> -</ul> \ No newline at end of file +App Development onhttps://onshape-public.github.io/docs/app-dev/Recent content in App Development onHugoen-usMon, 18 May 2020 20:44:05 -0400Extensionshttps://onshape-public.github.io/docs/app-dev/extensions/Mon, 01 Jan 0001 00:00:00 +0000https://onshape-public.github.io/docs/app-dev/extensions/This page provides information for some of the more common options for embedding a third-party application into the Onshape interface. Onshape provides many options for embedding commands in various menus, fly-out panels, and elements. In this example, you will embed a custom web page inside a document’s right side fly-out panel. This interface will receive information from Onshape and push information from the panel back to Onshape, providing a complete, bi-directional integration scenario.Client Messaginghttps://onshape-public.github.io/docs/app-dev/clientmessaging/Mon, 01 Jan 0001 00:00:00 +0000https://onshape-public.github.io/docs/app-dev/clientmessaging/Application extensions and the Onshape JavaScript web client need to communicate directly, calling across the iframe containing the application extension using post message. +Onshape Client Messaging examples can be split into those that are initiated from the application extension and those that are initiated from the Onshape client. +Messages from the Extension These Client Messaging examples can be initiated from the application extension: +Click/close flyouts events: Notify the Onshape client that the user has clicked in the application extension, which should cause Onshape flyouts (versions, history, uploads, etc.Structured Storagehttps://onshape-public.github.io/docs/app-dev/structuredstorage/Mon, 18 May 2020 20:40:16 -0400https://onshape-public.github.io/docs/app-dev/structuredstorage/Sub Elements Onshape provides application elements storage that is controlled by applications through the API. These elements allow a set of named sub-elements. +The application can make changes to sub-elements independently or in arbitrary groupings. Changes may be wholesale replacements, or may be deltas. When performing a delta update, the application may post a full version as well, which allows the api to return a smaller number of deltas for subsequent queries.Webhookshttps://onshape-public.github.io/docs/app-dev/webhook/Mon, 18 May 2020 20:44:05 -0400https://onshape-public.github.io/docs/app-dev/webhook/This page describes the Webhook APIs Onshape provides for working with notifications. +Notifications are delivered to an application as an HTTP POST with a JSON body, which includes information about the identity of the registration request and information specific to the event and notification message. +Webhooks are an alternative approach to polling; instead of your application continuously asking Onshape for new information, webhooks automatically send a notification from Onshape any time an event you are subscribed to occurs. \ No newline at end of file diff --git a/docs/app-dev/structuredstorage/index.html b/docs/app-dev/structuredstorage/index.html index 18ac360..df6e79d 100644 --- a/docs/app-dev/structuredstorage/index.html +++ b/docs/app-dev/structuredstorage/index.html @@ -1,9 +1,8 @@ -Structured Storage |

    Structured Storage

    Sub Elements

    Onshape provides application elements storage that is controlled by applications through the API. These elements allow a set of named sub-elements.

    The application can make changes to sub-elements independently or in arbitrary groupings. Changes may be wholesale replacements, or may be deltas. When performing a delta update, the application may post a full version as well, which allows the api to return a smaller number of deltas for subsequent queries.

    An application may need to perform multiple versionable actions in the course of performing a user-level action, and we want to allow the individual actions to be collected into a single action from the perspective of document history. We do this by providing support for creation of a private transaction and support for atomically committing the transaction to the document workspace as a single user-visible action.

    Onshape does not assume any knowledge about the semantics of application deltas. All merging of deltas into a consolidated form is done by the application. Applications should typically send checkpoint state for a sub-element if many delta changes have been made since the last checkpoint.

    Document content and changes are logically an array of bytes, but since they are transmitted through JSON, then are expected to be presented a Base-64 encoding of the array into string form.

    We use some terminology in this document that is new.

    • changeId - an opaque identifier for the state of an application element. Each change to the application element results in a new changeId

    • transaction - a private workspace within a document workspace for composing modifications to an application element. These changes are not visible to the user until committed.

    • transaction commit - an operation that moves the changes performed within a transaction to the application element workspace as a single user-visible action.

    Concurrent access by multiple users

    If the element is being concurrently accessed by multiple sessions, updates may encounter conflicts during update. If the application has a mechanism that ensures that all accesses to the element are mediated by a single process, as is done with our part studio and assemblies, this can be addressed directly by the application. However, if the application is not able to mediate access in this way, updates by one session may invalidate state held by another session. We address this by notifying updaters when an update cannot be directly applied because their state is out of date and allowing them to refresh their state before re-applying the change.

    This policy of requiring the application have current state when posting updates could be overly conservative in some cases. Detecting conflict at the sub-element level might provide for better concurrent access performance, but there probably are cases where this fails, so it probably would need some level of application control.

    JSON Tree

    In contrast with sub elements, JSON tree storage is a more managed data storage mechanism that Onshape itself can merge and diff. At the root of it, the data structure is a single JSON object per Application Element. The user submits incremental changes that are then applied by Onshape to the JSON tree. Onshape stores these ‘diffs’ in a new microversion created as a result of the update request, or during a subsequent transaction commit request. When the user then performs a merge or restore operation, Onshape can sum and apply the requisite incremental changes. By storing diffs, Onshape provides to the user a storage mechanism that is more robust to race conditions, since multiple simultaneous edits can be optionally merged by Onshape. All of these qualities make JSON tree a preferred way to store application element data in an Onshape-native manner.

    JSON Tree Edit Semantics

    BTJEdit Encoding

    A JSON tree edit represents an incremental change to an application element’s JSON tree. The edit is a BTJEdit class, which is encoded as one of the following:

    • Deletion:
    { "btType" : "BTJEditDelete-1992", "path" : "path" }
    +Structured Storage | 

    Structured Storage

    Sub Elements

    Onshape provides application elements storage that is controlled by applications through the API. These elements allow a set of named sub-elements.

    The application can make changes to sub-elements independently or in arbitrary groupings. Changes may be wholesale replacements, or may be deltas. When performing a delta update, the application may post a full version as well, which allows the api to return a smaller number of deltas for subsequent queries.

    An application may need to perform multiple versionable actions in the course of performing a user-level action, and we want to allow the individual actions to be collected into a single action from the perspective of document history. We do this by providing support for creation of a private transaction and support for atomically committing the transaction to the document workspace as a single user-visible action.

    Onshape does not assume any knowledge about the semantics of application deltas. All merging of deltas into a consolidated form is done by the application. Applications should typically send checkpoint state for a sub-element if many delta changes have been made since the last checkpoint.

    Document content and changes are logically an array of bytes, but since they are transmitted through JSON, then are expected to be presented a Base-64 encoding of the array into string form.

    We use some terminology in this document that is new.

    • changeId - an opaque identifier for the state of an application element. Each change to the application element results in a new changeId

    • transaction - a private workspace within a document workspace for composing modifications to an application element. These changes are not visible to the user until committed.

    • transaction commit - an operation that moves the changes performed within a transaction to the application element workspace as a single user-visible action.

    Concurrent access by multiple users

    If the element is being concurrently accessed by multiple sessions, updates may encounter conflicts during update. If the application has a mechanism that ensures that all accesses to the element are mediated by a single process, as is done with our part studio and assemblies, this can be addressed directly by the application. However, if the application is not able to mediate access in this way, updates by one session may invalidate state held by another session. We address this by notifying updaters when an update cannot be directly applied because their state is out of date and allowing them to refresh their state before re-applying the change.

    This policy of requiring the application have current state when posting updates could be overly conservative in some cases. Detecting conflict at the sub-element level might provide for better concurrent access performance, but there probably are cases where this fails, so it probably would need some level of application control.

    JSON Tree

    In contrast with sub elements, JSON tree storage is a more managed data storage mechanism that Onshape itself can merge and diff. At the root of it, the data structure is a single JSON object per Application Element. The user submits incremental changes that are then applied by Onshape to the JSON tree. Onshape stores these ‘diffs’ in a new microversion created as a result of the update request, or during a subsequent transaction commit request. When the user then performs a merge or restore operation, Onshape can sum and apply the requisite incremental changes. By storing diffs, Onshape provides to the user a storage mechanism that is more robust to race conditions, since multiple simultaneous edits can be optionally merged by Onshape. All of these qualities make JSON tree a preferred way to store application element data in an Onshape-native manner.

    JSON Tree Edit Semantics

    BTJEdit Encoding

    A JSON tree edit represents an incremental change to an application element’s JSON tree. The edit is a BTJEdit class, which is encoded as one of the following:

    • Deletion:
    { "btType" : "BTJEditDelete-1992", "path" : "path" }
     
    • Insertion:
    { "btType" : "BTJEditInsert-2523", "path" : "path", "value" : "newValue" }
     
    • Change:
    { "btType" : "BTJEditChange-2636", "path" : "path", "value" : "newValue" }
     
    • Move:
    { "btType" : "BTJEditMove-3245", "sourcePath" : "path", "destinationPath" : "path" }
    @@ -51,4 +50,4 @@
     
  • Change:
       {"myKey": ["firstValue", "secondValue"]}
     
  • List insertion:
       {"myKey": ["firstValue", "myBetterSecondValue", "secondValue"]}
     
  • List deletion:
       {"myKey": ["firstValue", "myBetterSecondValue"]}
    -
  • All the examples above were tested and validated using the Python client here.

    \ No newline at end of file +

    All the examples above were tested and validated using the Python client here.

    \ No newline at end of file diff --git a/docs/app-dev/webhook/index.html b/docs/app-dev/webhook/index.html index 8a97a12..1183594 100644 --- a/docs/app-dev/webhook/index.html +++ b/docs/app-dev/webhook/index.html @@ -1,12 +1,12 @@ -Webhooks | Webhooks |

    Webhooks

    This page describes the Webhook APIs Onshape provides for working with notifications.

    Notifications are delivered to an application as an HTTP POST with a JSON body, which includes information about the identity of the registration request and information specific to the event and notification message.

    Webhooks are an alternative approach to polling; instead of your application continuously asking Onshape for new information, webhooks automatically send a notification from Onshape any time an event you are subscribed to occurs.

    An application may register for notifications to a URL that uses either HTTP or HTTPS. If HTTPS is specified by the URL template, the notification server must supply a certificate that is signed by a certificate authority (CA) recognized by Onshape. Self-signed certificates (as well as certificates signed by unrecognized CAs) will be rejected, causing notification delivery to fail.

    📘 Notes

    • This page provides sample code as curls. See the curl documentation for more information.
    • All Onshape API calls must be properly authenticated by replacing the CREDENTIALS variable in the curls below. See the API Keys page for instructions and the Quick Start for an example. All applications submitted to the Onshape App Store must authenticate with OAuth2.
    • This documentation refers to Onshape IDs in the following format: {did}, {wid}, {eid}, {pid}, {otherId}. These represent document, workspace, element, part, and other IDs (respectively) that are needed make the API calls. We sometimes abbreviate these variables as DWVEM Please see API Guide: API Intro for information on what these IDs mean and how to obtain them from your documents. Sometimes, this page will use a stand-in string to represent these IDs (000000000000000000000000). Never include the curly braces ({}) in your API calls.
    • For Enterprise accounts, replace cad in all Onshape URLs with your company domain. +Webhooks are an alternative approach to polling; instead of your application continuously asking Onshape for new information, webhooks automatically send a notification from Onshape any time an event you are subscribed to occurs.">

      Webhooks

      This page describes the Webhook APIs Onshape provides for working with notifications.

      Notifications are delivered to an application as an HTTP POST with a JSON body, which includes information about the identity of the registration request and information specific to the event and notification message.

      Webhooks are an alternative approach to polling; instead of your application continuously asking Onshape for new information, webhooks automatically send a notification from Onshape any time an event you are subscribed to occurs.

      An application may register for notifications to a URL that uses either HTTP or HTTPS. If HTTPS is specified by the URL template, the notification server must supply a certificate that is signed by a certificate authority (CA) recognized by Onshape. Self-signed certificates (as well as certificates signed by unrecognized CAs) will be rejected, causing notification delivery to fail.

      📘 Notes

      • This page provides sample code as curls. See the curl documentation for more information.
      • All Onshape API calls must be properly authenticated by replacing the CREDENTIALS variable in the curls below. See the API Keys page for instructions and the Quick Start for an example. All applications submitted to the Onshape App Store must authenticate with OAuth2.
      • This documentation refers to Onshape IDs in the following format: {did}, {wid}, {eid}, {pid}, {otherId}. These represent document, workspace, element, part, and other IDs (respectively) that are needed make the API calls. We sometimes abbreviate these variables as DWVEM Please see API Guide: API Intro for information on what these IDs mean and how to obtain them from your documents. Sometimes, this page will use a stand-in string to represent these IDs (000000000000000000000000). Never include the curly braces ({}) in your API calls.
      • For Enterprise accounts, replace cad in all Onshape URLs with your company domain. https://cad.onshape.com > https://companyName.onshape.com

      Events

      Each type of event that an application may receive notifications for has a unique identifier known as the event type. Event types are grouped into Event Groups. Each group shares specification requirements.

      Event types are categorized into several different groups based on the dominant user resource of the event. The group that a given event is part of defines the required parameters needed in the registration process to identify the resource or group of resources to watch. For instance, if registering for an event in the document event group, the application must identify either a specific document’s id or a specific company’s id. If registered for a company, the event will be registered for all present and future documents owned by the company.

      📘 Note

      You can see the full list of available events in the Glassworks API Explorer. Expand the createWebhook endpoint, then click Callbacks.

      callbacks in the Glassworks Webhook > createWebhook > Callback page

      Application Group

      Monitor changes to applications.

      Supported Event Types

      • onshape.user.lifecycle.updateappsettings - Occurs when user application settings are modified

      Registration Requirements

      • clientId - Must be specified in the registration body
      • event - Must be set to onshape.user.lifecycle.updateappsettings
      • options.collapseEvents - Must be set to true or false
      • url - Must be provided to receive the webhook notifications
      {
         "clientId": "000000000000000000000000",
         "events": [
      @@ -194,4 +194,4 @@
           'https://cad.onshape.com/api/v6/webhooks/000000000000000000000000' \
           -H 'Accept: application/json;charset=UTF-8; qs=0.09' \
           -H 'Authorization: Basic CREDENTIALS=' \
      -
      1. In your application, confirm that you received the webhook.unregister event from Onshape.
      2. In Onshape, create a new version in your document.
      3. In your application, confirm that no new events have been received.

      Additional Resources

      \ No newline at end of file +
      1. In your application, confirm that you received the webhook.unregister event from Onshape.
      2. In Onshape, create a new version in your document.
      3. In your application, confirm that no new events have been received.

      Additional Resources

    \ No newline at end of file diff --git a/docs/app-store/checklist/index.html b/docs/app-store/checklist/index.html index fc2c664..7cf2492 100644 --- a/docs/app-store/checklist/index.html +++ b/docs/app-store/checklist/index.html @@ -1,5 +1,5 @@ -Launch Checklist |

    Launch Checklist

    This checklist brings together the processes you should follow to ensure your app is launched successfully. While all tasks must be completed to submit your app to the Onshape App Store, the task sequence provided here is a suggestion.

    1. Understand quality expectations

    These are to ensure that the Onshape App Store remains a trusted resource and that quality is maintained Review the Quality Considerations page, and reach out to the Developer Relations team with any questions.

    2. Sign in to your developer account

    Sign in to your developer account at dev-portal.onshape.com, and ensure your developer account details are accurate. Contact our API Support team if you need assistance.

    3. Authenticate your app

    Please refer to the OAuth documentation for information on authenticating your app with OAuth2.

    4. Build your app

    While building your app, use the resources in our Onshape Developer Documentation, including this API Guide and our API Explorer. We recommend familiarizing yourself with the following pages:

    5. Prepare your store entry

    Prepare the descriptions, promotional graphics, screenshots, and videos you’ll add to your store entry. Make sure you include a link to if required. Watch this video for more details.

    See the video below for a walkthrough:

    OAuth app creation video

    6. Run beta tests

    During the beta period, try to enlist at least 5 active testers to get feedback before making your app available to the general public.

    1. To find beta testers, contact our Developer Relations team, and recruit via the Onshape forum.
    2. To give beta users early visibility, first create a team, then ensure your app is shared with that team in the Developer Portal. See the Create a Team in Onshape video for a walkthrough.

    7. Determine your app’s price

    Once you’ve determined your monetization model, set up your price, billing, and other details. Billing should be tested, and to do so a staging environment is available. See the Billing API page for more details.

    8. Sign and return the developer agreement

    Email to the Developer Relations team to obtain yours.

    9. Submit your app for final testing

    Once you’ve returned the developer agreement, you can submit your app to the Developer Relations team for final testing. This is a comprehensive functionality and design test. During this testing period (expect up to a week, depending on complexity), changes to code are prohibited unless requested. At the conclusion of the test, you will receive one of the following notifications from our Developer Relations team:

    • Approved for release
    • Approved for release with feedback
    • Changes required before another round of testing

    10. Integrate your support systems

    Whether you use Zendesk, Jira, or email support, we’ll help you determine and set up this integration. Contact the Developer Relations team to explore these options. This is the channel we will use to test your app and provide feedback.

    11. Connect via Slack

    Connecting directly with our Support, Tech, and Sales teams has proven to be valuable to app developers. This dedicated channel is simple to implement if you already have a paid Slack account. If not (or if you want to use the free version of Slack), we can add members of your team as guests to our account. Please contact Aaron Magnin to establish this connection.

    12. Final check and publish

    First, double-check you’ve done everything on this list. Now you’re ready to publish your app to the production channel! Send an email detailing when you’d like this to happen to the Developer Relations team.

    13. Promote your app

    Start promoting your app with the Onshape badge and by presenting it to our internal teams in one of the following ways:

    • To the Onshape Tech and Sales teams in a small meeting (~1 hour, Wednesdays at noon Eastern Time)
    • To the entire Onshape organization in a company-wide meeting (~5-10 minutes, Thursdays at 11am Eastern Time).

    14. Encourage reviews from users

    The value of reviews is not to be underestimated. Reviews give users an opportunity to provide feedback, and can also signal to others that your app is worth investigating.

    15. Maintain your app

    Continually fix stability and performance issues. Improving the user experience will result in more engaged users, higher ratings, and in turn, more success.

    Failure to respond to customer tickets in a reasonable time will lead to the removal of your app from the Onshape App Store.

    16. Increase engagement and retention

    Aim to increase user engagement, retain and grow your audience, and earn more revenue by:

    • Encouraging repeat visits with a nurture stream and training materials
    • Integrating more features from user requests
    • Interacting with and understanding your audience via the Onshape forum, social media, etc.

    17. Address app security

    At some point, a prospect or user will enquire about your app’s security controls. To address this, we recommend that you understand SOC 2 Compliance requirements, and consider filling out the Consensus Assessment Initiative Questionnaire (CAIQ). Onshape/PTC cannot and will not attest to your compliance. More on SOC Compliance can be found at the following links:

    \ No newline at end of file +Launch Checklist |

    Launch Checklist

    This checklist brings together the processes you should follow to ensure your app is launched successfully. While all tasks must be completed to submit your app to the Onshape App Store, the task sequence provided here is a suggestion.

    1. Understand quality expectations

    These are to ensure that the Onshape App Store remains a trusted resource and that quality is maintained Review the Quality Considerations page, and reach out to the Developer Relations team with any questions.

    2. Sign in to your developer account

    Sign in to your developer account at dev-portal.onshape.com, and ensure your developer account details are accurate. Contact our API Support team if you need assistance.

    3. Authenticate your app

    Please refer to the OAuth documentation for information on authenticating your app with OAuth2.

    4. Build your app

    While building your app, use the resources in our Onshape Developer Documentation, including this API Guide and our API Explorer. We recommend familiarizing yourself with the following pages:

    5. Prepare your store entry

    Prepare the descriptions, promotional graphics, screenshots, and videos you’ll add to your store entry. Make sure you include a link to if required. Watch this video for more details.

    See the video below for a walkthrough:

    OAuth app creation video

    6. Run beta tests

    During the beta period, try to enlist at least 5 active testers to get feedback before making your app available to the general public.

    1. To find beta testers, contact our Developer Relations team, and recruit via the Onshape forum.
    2. To give beta users early visibility, first create a team, then ensure your app is shared with that team in the Developer Portal. See the Create a Team in Onshape video for a walkthrough.

    7. Determine your app’s price

    Once you’ve determined your monetization model, set up your price, billing, and other details. Billing should be tested, and to do so a staging environment is available. See the Billing API page for more details.

    8. Sign and return the developer agreement

    Email to the Developer Relations team to obtain yours.

    9. Submit your app for final testing

    Once you’ve returned the developer agreement, you can submit your app to the Developer Relations team for final testing. This is a comprehensive functionality and design test. During this testing period (expect up to a week, depending on complexity), changes to code are prohibited unless requested. At the conclusion of the test, you will receive one of the following notifications from our Developer Relations team:

    • Approved for release
    • Approved for release with feedback
    • Changes required before another round of testing

    10. Integrate your support systems

    Whether you use Zendesk, Jira, or email support, we’ll help you determine and set up this integration. Contact the Developer Relations team to explore these options. This is the channel we will use to test your app and provide feedback.

    11. Connect via Slack

    Connecting directly with our Support, Tech, and Sales teams has proven to be valuable to app developers. This dedicated channel is simple to implement if you already have a paid Slack account. If not (or if you want to use the free version of Slack), we can add members of your team as guests to our account. Please contact Aaron Magnin to establish this connection.

    12. Final check and publish

    First, double-check you’ve done everything on this list. Now you’re ready to publish your app to the production channel! Send an email detailing when you’d like this to happen to the Developer Relations team.

    13. Promote your app

    Start promoting your app with the Onshape badge and by presenting it to our internal teams in one of the following ways:

    • To the Onshape Tech and Sales teams in a small meeting (~1 hour, Wednesdays at noon Eastern Time)
    • To the entire Onshape organization in a company-wide meeting (~5-10 minutes, Thursdays at 11am Eastern Time).

    14. Encourage reviews from users

    The value of reviews is not to be underestimated. Reviews give users an opportunity to provide feedback, and can also signal to others that your app is worth investigating.

    15. Maintain your app

    Continually fix stability and performance issues. Improving the user experience will result in more engaged users, higher ratings, and in turn, more success.

    Failure to respond to customer tickets in a reasonable time will lead to the removal of your app from the Onshape App Store.

    16. Increase engagement and retention

    Aim to increase user engagement, retain and grow your audience, and earn more revenue by:

    • Encouraging repeat visits with a nurture stream and training materials
    • Integrating more features from user requests
    • Interacting with and understanding your audience via the Onshape forum, social media, etc.

    17. Address app security

    At some point, a prospect or user will enquire about your app’s security controls. To address this, we recommend that you understand SOC 2 Compliance requirements, and consider filling out the Consensus Assessment Initiative Questionnaire (CAIQ). Onshape/PTC cannot and will not attest to your compliance. More on SOC Compliance can be found at the following links:

    \ No newline at end of file diff --git a/docs/app-store/index.html b/docs/app-store/index.html index 13e041c..bbcf5d5 100644 --- a/docs/app-store/index.html +++ b/docs/app-store/index.html @@ -1,2 +1,7 @@ -Onshape App Store |

    Onshape App Store

    Onshape makes applications available through the Onshape App Store. The App Store is actively promoted to users, making it easy for users to find, purchase, and use third-party applications.

    To submit an application to the Onshape App Store, complete the Launch Checklist, which provides a step-by-step guide that you can follow to make your app public.

    End User Experience

    Users can browse the Onshape App Store and install third-party applications:

    Onshape App Store video

    When a user registers an application, there are several possible integration points to expose the application within the Onshape user experience. At this time, applications that provide a UI in an Onshape tab will be added to the + button menu on the Onshape tab bar. See the Extensions page for more information on supported app locations and contexts.

    image

    Mobile Clients

    Onshape expects to enable applications tabs in iOS and Android environments in the future.

    Feedback

    Your comments, questions, and concerns are always welcome!

    \ No newline at end of file +Onshape App Store |

    Onshape App Store

    Onshape makes applications available through the Onshape App Store. The App Store is actively promoted to users, making it easy for users to find, purchase, and use third-party applications.

    To submit an application to the Onshape App Store, complete the Launch Checklist, which provides a step-by-step guide that you can follow to make your app public.

    End User Experience

    Users can browse the Onshape App Store and install third-party applications:

    Onshape App Store video

    When a user registers an application, there are several possible integration points to expose the application within the Onshape user experience. At this time, applications that provide a UI in an Onshape tab will be added to the + button menu on the Onshape tab bar. See the Extensions page for more information on supported app locations and contexts.

    image

    Mobile Clients

    Onshape expects to enable applications tabs in iOS and Android environments in the future.

    Feedback

    Your comments, questions, and concerns are always welcome!

    \ No newline at end of file diff --git a/docs/app-store/index.xml b/docs/app-store/index.xml index 2fb8752..07e548d 100644 --- a/docs/app-store/index.xml +++ b/docs/app-store/index.xml @@ -1,303 +1,6 @@ -– Onshape App Storehttps://onshape-public.github.io/docs/app-store/Recent content in Onshape App Store onHugo -- gohugo.ioen-usDocs: Launch Checklisthttps://onshape-public.github.io/docs/app-store/checklist/Mon, 01 Jan 0001 00:00:00 +0000https://onshape-public.github.io/docs/app-store/checklist/ -<p>This checklist brings together the processes you should follow to ensure your app is launched successfully. While all tasks must be completed to submit your app to the Onshape App Store, the task sequence provided here is a suggestion.</p> -<h3 id="1-understand-quality-expectations">1. Understand quality expectations</h3> -<p>These are to ensure that the Onshape App Store remains a trusted resource and that quality is maintained Review the <a href="https://onshape-public.github.io/docs/app-store/quality">Quality Considerations</a> page, and reach out to the <a href="mailto:onshape-developer-relations@ptc.com">Developer Relations team</a> with any questions.</p> -<h3 id="2-sign-in-to-your-developer-account">2. Sign in to your developer account</h3> -<p>Sign in to your developer account at <a href="https://dev-portal.onshape.com">dev-portal.onshape.com</a>, and ensure your developer account details are accurate. Contact our <a href="mailto:api-support@onshape.com">API Support team</a> if you need assistance.</p> -<h3 id="3-authenticate-your-app">3. Authenticate your app</h3> -<p>Please refer to the <a href="https://onshape-public.github.io/docs/auth/oauth">OAuth documentation</a> for information on authenticating your app with OAuth2.</p> -<h3 id="4-build-your-app">4. Build your app</h3> -<p>While building your app, use the resources in our Onshape Developer Documentation, including this API Guide and our API Explorer. We recommend familiarizing yourself with the following pages:</p> -<ul> -<li><a href="https://onshape-public.github.io/docs/api-intro/">Introduction to the Onshape REST API</a></li> -<li><a href="https://onshape-public.github.io/docs/api-intro/architecture">Onshape Architecture</a></li> -<li><a href="https://onshape-public.github.io/docs/app-dev/">Onshape App Development</a></li> -<li><a href="https://onshape-public.github.io/docs/app-dev/extensions">Extensions</a> <!-- Susan move the videos to their pages --></li> -<li><a href="https://onshape-public.github.io/docs/app-dev/clientmessaging">Client Messaging</a></li> -<li><a href="https://onshape-public.github.io/docs/app-store">Onshape App Store</a></li> -</ul> -<h3 id="5-prepare-your-store-entry">5. Prepare your store entry</h3> -<p>Prepare the descriptions, promotional graphics, screenshots, and videos you&rsquo;ll add to your store entry. Make sure you include a link to if required. Watch this video for more details.</p> -<p>See the video below for a walkthrough:</p> -<p><a href="https://onshape.wistia.com/medias/tuhuzfi7we"><img src="https://onshape-public.github.io/images/AppStoreEntryVideoCard.png" style="width:5in" alt="OAuth app creation video"/></a></p> -<h3 id="6-run-beta-tests">6. Run beta tests</h3> -<p>During the beta period, try to enlist at least 5 active testers to get feedback before making your app available to the general public.</p> -<ol> -<li>To find beta testers, contact our <a href="mailto:onshape-developer-relations@ptc.com">Developer Relations team</a>, and recruit via the <a href="https://forum.onshape.com/categories/developer-community">Onshape forum</a>.</li> -<li>To give beta users early visibility, first <a href="https://cad.onshape.com/help/Content/teams-enterprise.htm">create a team</a>, then ensure your app is shared with that team in the <a href="https://dev-portal.onshape.com">Developer Portal</a>. See the <a href="https://onshape.wistia.com/medias/5t1dwkspfo">Create a Team in Onshape video</a> for a walkthrough.</li> -</ol> -<h3 id="7-determine-your-apps-price">7. Determine your app&rsquo;s price</h3> -<p>Once you&rsquo;ve determined your monetization model, set up your price, billing, and other details. Billing should be tested, and to do so a staging environment is available. See the <a href="https://onshape-public.github.io/docs/api-adv/billing">Billing API</a> page for more details.</p> -<h3 id="8-sign-and-return-the-developer-agreement">8. Sign and return the developer agreement</h3> -<p>Email to the <a href="mailto:onshape-developer-relations@ptc.com">Developer Relations team</a> to obtain yours.</p> -<h3 id="9-submit-your-app-for-final-testing">9. Submit your app for final testing</h3> -<p>Once you&rsquo;ve returned the developer agreement, you can submit your app to the <a href="mailto:onshape-developer-relations@ptc.com">Developer Relations team</a> for final testing. <a href="https://onshape-public.github.io/docs/app-store/testingguidelines">This is a comprehensive functionality and design test.</a> During this testing period (expect up to a week, depending on complexity), changes to code are prohibited unless requested. At the conclusion of the test, you will receive one of the following notifications from our Developer Relations team:</p> -<ul> -<li>Approved for release</li> -<li>Approved for release with feedback</li> -<li>Changes required before another round of testing</li> -</ul> -<h3 id="10-integrate-your-support-systems">10. Integrate your support systems</h3> -<p>Whether you use Zendesk, Jira, or email support, we’ll help you determine and set up this integration. Contact the <a href="mailto:onshape-developer-relations@ptc.com">Developer Relations team</a> to explore these options. This is the channel we will use to test your app and provide feedback.</p> -<h3 id="11-connect-via-slack">11. Connect via Slack</h3> -<p>Connecting directly with our Support, Tech, and Sales teams has proven to be valuable to app developers. This dedicated channel is simple to implement if you already have a paid Slack account. If not (or if you want to use the free version of Slack), we can add members of your team as guests to our account. Please contact <a href="mailto:amagnin@ptc.com">Aaron Magnin</a> to establish this connection.</p> -<h3 id="12-final-check-and-publish">12. Final check and publish</h3> -<p>First, double-check you&rsquo;ve done everything on this list. Now you&rsquo;re ready to publish your app to the production channel! Send an email detailing <strong>when</strong> you’d like this to happen to the <a href="mailto:onshape-developer-relations@ptc.com">Developer Relations team</a>.</p> -<h3 id="13-promote-your-app">13. Promote your app</h3> -<p>Start promoting your app with the <a href="https://www.ptc.com/en/brand-guide/logos/onshape">Onshape badge</a> and by presenting it to our internal teams in one of the following ways:</p> -<ul> -<li>To the Onshape Tech and Sales teams in a small meeting (~1 hour, Wednesdays at noon Eastern Time)</li> -<li>To the entire Onshape organization in a company-wide meeting (~5-10 minutes, Thursdays at 11am Eastern Time).</li> -</ul> -<h3 id="14-encourage-reviews-from-users">14. Encourage reviews from users</h3> -<p>The value of reviews is not to be underestimated. Reviews give users an opportunity to provide feedback, and can also signal to others that your app is worth investigating.</p> -<h3 id="15-maintain-your-app">15. Maintain your app</h3> -<p>Continually fix stability and performance issues. Improving the user experience will result in more engaged users, higher ratings, and in turn, more success.</p> -<blockquote> -<blockquote> -<p>Failure to respond to customer tickets in a reasonable time will lead to the removal of your app from the Onshape App Store.</p> -</blockquote> -</blockquote> -<h3 id="16-increase-engagement-and-retention">16. Increase engagement and retention</h3> -<p>Aim to increase user engagement, retain and grow your audience, and earn more revenue by:</p> -<ul> -<li>Encouraging repeat visits with a nurture stream and training materials</li> -<li>Integrating more features from user requests</li> -<li>Interacting with and understanding your audience via the <a href="https://forum.onshape.com/categories/developer-community">Onshape forum</a>, social media, etc.</li> -</ul> -<h3 id="17-address-app-security">17. Address app security</h3> -<p>At some point, a prospect or user will enquire about your app&rsquo;s security controls. To address this, we recommend that you understand SOC 2 Compliance requirements, and consider filling out the <a href="https://www.google.com/url?q=https://cloudsecurityalliance.org/artifacts/consensus-assessments-initiative-questionnaire-v3-1/&amp;sa=D&amp;source=editors&amp;ust=1686683388460627&amp;usg=AOvVaw2xq8zlODs3a7W2Y3jighnr">Consensus Assessment Initiative Questionnaire</a> (CAIQ). Onshape/PTC cannot and will not attest to your compliance. More on SOC Compliance can be found at the following links:</p> -<ul> -<li><a href="https://us.aicpa.org/interestareas/frc/assuranceadvisoryservices/aicpasoc2report">AICPA.org</a></li> -<li><a href="https://en.wikipedia.org/wiki/System_and_Organization_Controls">Wikipedia: System and Organization Controls</a></li> -</ul>Docs: Testing Guidelineshttps://onshape-public.github.io/docs/app-store/testingguidelines/Mon, 01 Jan 0001 00:00:00 +0000https://onshape-public.github.io/docs/app-store/testingguidelines/ -<p>The purpose of this document is to help you get your application and App Store entry ready for QA testing.</p> -<h2 id="application-release-workflow-arw">Application Release Workflow (ARW)</h2> -<p>Each application submitted to the Onshape App Store goes through a series of stage-gates:</p> -<ol> -<li>Starting state: <code>Ok to deploy to limited visibility on Production</code> (Beta testing)</li> -<li><code>Ok to make Public</code></li> -<li>Goal state: <code>Application is Public</code></li> -</ol> -<p>To advance to the next stage, your application must pass testing, and your App Store entry must pass review.</p> -<h2 id="kick-off-testing">Kick Off Testing</h2> -<p>While completing the <a href="https://onshape-public.github.io/docs/app-store/checklist">Launch Checklist</a>, you will need to use Jira to request testing and release for your application. You can initiate the following tasks from Jira:</p> -<ul> -<li><code>Request application testing</code>: This puts your application in the testing queue. We will note when testing has started (<code>in progress</code>) and when concluded, the ticket will be closed. The outcome will include notes and links to any issues generated (<code>tickets</code>). This phase may include as many iterations as needed to get your application ready.</li> -<li><code>Request public (general) authorization</code>: We will note when testing has started (<code>in progress</code>), and this request will trigger a review of your app store entry and any outstanding bugs. Note there is no implied testing of your application, simply a review of outstanding issues (<code>tickets</code>) and of the App Store entry. Success at this stage will advance the Application Release Workflow (ARW), and you can request public release.</li> -<li><code>Request public (general) release</code>: This request states that you have coordinated with the <a href="mailto:onshape-developer-relations@ptc.com">Developer Relations team</a> and the Onshape Marketing team<!--How do they get in touch with the Marketing team? Slack?-->, and agreement has been reached that the app is ready for launch. Congratulations!</li> -</ul> -<h2 id="testing-protocol">Testing Protocol</h2> -<p><em>Applications</em> are first tested against the checklist in <a href="#addendum-a">Addendum A</a>. <em>Production App Store</em> entries are then performed against the checklist in <a href="#addendum-b">Addendum B</a>.</p> -<p>Results will be viewable in your Onshape support system (i.e., Zendesk, Jira). The result of each test will be one of:</p> -<ul> -<li><code>Pass</code>: -<ul> -<li>No action needed.</li> -<li>No notification issued. <!-- How do they know it passed? Does it just show up in the app store? --></li> -</ul> -</li> -<li><code>Enhancement</code>: Suggestions we believe would make the application better. -<ul> -<li>Will NOT prevent the application from being turned on for public access.</li> -</ul> -</li> -<li><code>Bug (low priority)</code>: Slight deviations from the criteria that have low end user impact. -<ul> -<li>Will NOT prevent the application being turned on for public access.</li> -<li>No stipulated time-frame for resolution.</li> -</ul> -</li> -<li><code>Bug (medium priority)</code>: Material deviations from the criteria that are noticeable to the end-user. Represents a minor problem that requires a work-around. -<ul> -<li>Will NOT prevent the application from being turned on for public access.</li> -<li>Must be fixed within 30 days.</li> -</ul> -</li> -<li><code>Bug (high priority)</code>: Significant deviation from the criteria. -<ul> -<li>WILL prevent the application from being turned on for public access.</li> -</ul> -</li> -<li><code>Bug (MUST FIX)</code>: Significant deviation from protocol or security violation. -<ul> -<li>WILL prevent the application from being turned on for public access.</li> -<li>If the application is already public, it may be temporarily suspended from the App Store.</li> -</ul> -</li> -</ul> -<h2 id="testing-notes">Testing Notes</h2> -<ul> -<li>Testing may be requested at any time.</li> -<li>Testing is done on a first-come basis.</li> -<li>When testing is complete (pass or fail), you go to the back of the queue.</li> -</ul> -<h2 id="addendum-a">Addendum A</h2> -<p><font size="5">Application Test Criteria</font></p> -<ul> -<li>The application must use the Onshape OAUTH mechanism</li> -<li>The OAUTH must be against the correct stack</li> -<li>To be promoted to the Production stack, and hosted service must be on a monitored production server with worldwide 24/7 availability.</li> -<li>The application should not generate any avoidable console (browser) errors</li> -<li>The application should should provide one or more of the following options. The user should not have to leave the registration workflow to complete a pre-requisite. -<ul> -<li>Sign in using the Onshape ID (account created silently on first use)</li> -<li>Sign in with partner product account credentials</li> -<li>Create a new partner account</li> -</ul> -</li> -<li>The application must be capable of managing/displaying documents in excess of 20. The application must display reasonable performance when reading documents, workspaces, elements, and parts. At scale, an account may have thousands of documents, many with multiple workspaces and each with multiple elements. Suggested strategies include: -<ul> -<li>Using a <code>Next</code> button to load the next 20 documents</li> -<li>Using infinite scroll (loading the next 20 if the scrollbar reaches the bottom of the dialog)</li> -<li>Displaying the most recently-opened documents first</li> -<li>Displaying a counter of documents/workspaces/elements read</li> -<li>Using progressive loading</li> -</ul> -</li> -<li>The application should correctly list valid documents when <code>per document app access</code> is turned on.</li> -<li>The application should correctly handle selection of versions.</li> -<li>The application should correctly handle selection of workspaces (branches).</li> -<li>The application should correctly handle/display elements that are: -<ul> -<li>Part Studios that contain nothing</li> -<li>Assemblies that contain nothing</li> -<li>Part Studios that contain only surfaces</li> -<li>Part Studios that contain only wire data (e.g., helices)</li> -</ul> -</li> -<li>The application should appropriately handle revocation of a grant.</li> -</ul> -<h2 id="addendum-b">Addendum B</h2> -<p><font size="5">App Store Testing Criteria</font></p> -<ul> -<li>The application should have a descriptive name</li> -<li>The application summary should be accurate</li> -<li>The redirect URLS should be valid</li> -<li>The iframe URL should be valid</li> -<li>The <code>Grant</code> (permissions) request should be no more than is needed</li> -<li>The <code>Application Type</code> should be correctly set</li> -<li>Team visibility should be set (optional)</li> -<li>The category should be appropriate</li> -<li>The application description should be accurate</li> -<li>The Sign-In URL should be valid</li> -<li>The pricing summary should be accurate -<ul> -<li>i.e., trials should not be listed as <code>Free</code>; <code>Free for xx days and then $xx/month</code> is more accurate.</li> -</ul> -</li> -<li>All pay plans should have accurate descriptions.</li> -<li>The support URL should point to a resource for help (the resource should NOT be an FAQ page, unless that page also contains one of the other options): -<ul> -<li>Support ticketing system (e.g., Zendesk, Jira, etc.)</li> -<li>Web page with a telephone number</li> -<li>Web page with an email address</li> -<li>Forum</li> -</ul> -</li> -<li>The EULA link should point to an English Language EULA.</li> -</ul>Docs: Quality Considerationshttps://onshape-public.github.io/docs/app-store/quality/Mon, 01 Jan 0001 00:00:00 +0000https://onshape-public.github.io/docs/app-store/quality/ -<h2 id="core-app-quality">Core App Quality</h2> -<p>Onshape users expect high-quality apps. App quality directly influences the long-term success of your app in terms of installs, user rating and reviews, engagement, and user retention.</p> -<p>This page helps you assess the core aspects of quality in your app, through a compact set of quality criteria and associated tests. All Onshape apps should meet these criteria.</p> -<p>Before publishing your apps, test them against these criteria to ensure that they function well. Your testing should go well beyond what&rsquo;s described here; the purpose of this page is to specify the essential quality characteristics all apps should display, so that you can cover them in your test plans.</p> -<h2 id="functionality">Functionality</h2> -<p>These criteria ensure that your app provides the expected functional behavior, with the appropriate level of permissions.</p> -<table> -<thead> -<tr> -<th>Area</th> -<th>Description</th> -</tr> -</thead> -<tbody> -<tr> -<td>Permissions</td> -<td>The app requests only the <em>absolute minimum</em> permissions that it needs to support core functionality.</td> -</tr> -</tbody> -</table> -<h2 id="compatibility-performance-and-stability">Compatibility, Performance, and Stability</h2> -<p>These criteria ensure that apps provide the compatibility, performance, stability, and responsiveness expected by users.</p> -<table> -<thead> -<tr> -<th>Area</th> -<th>Description</th> -</tr> -</thead> -<tbody> -<tr> -<td>Stability</td> -<td>The app does not crash, force close, freeze, or otherwise function abnormally.</td> -</tr> -<tr> -<td>Performance</td> -<td>The app loads quickly or provides onscreen feedback to the user (e.g., a progress indicator or similar cue) if the app takes longer than two (2) seconds to load.</td> -</tr> -<tr> -<td>Visual quality</td> -<td>The app displays graphics, text, images, and other UI elements without noticeable distortion, blurring, or pixelation.</td> -</tr> -</tbody> -</table> -<h2 id="security">Security</h2> -<p>These criteria ensure that apps handle user data and personal information safely.</p> -<table> -<thead> -<tr> -<th>Area</th> -<th>Description</th> -</tr> -</thead> -<tbody> -<tr> -<td>Data</td> -<td>All private data is stored in the app&rsquo;s internal storage. </br> All data from external storage is verified before being accessed. </br> No personal or sensitive user data is logged to the system or app-specific log.</td> -</tr> -<tr> -<td>Networking</td> -<td>All network traffic is sent over SSL.</td> -</tr> -</tbody> -</table> -<h2 id="onshape-app-store">Onshape App Store</h2> -<p>These criteria ensure that your apps are ready to publish on Onshape App Store.</p> -<table> -<thead> -<tr> -<th>Area</th> -<th>Description</th> -</tr> -</thead> -<tbody> -<tr> -<td>App Details page</td> -<td>The app’s feature graphic follows guidelines such as: </br>- The app listing includes a high-quality feature graphic.</br>- The feature graphic does not resemble an advertisement.</br>- The app’s screenshots or videos do not represent the content and experience of your app in a misleading way.</td> -</tr> -<tr> -<td>User support</td> -<td>User-reported bugs are addressed if they are reproducible.</td> -</tr> -</tbody> -</table> -<h2 id="test-procedures">Test procedures</h2> -<p>These test procedures help you discover various types of quality issues in your app. You can combine the tests or integrate groups of tests together in your own test plans. See the sections above for references that associate criteria with these test procedures.</p> -<table> -<thead> -<tr> -<th>Type</th> -<th>Description</th> -</tr> -</thead> -<tbody> -<tr> -<td>Core suite</td> -<td>Navigate to all parts of the app: all screens, dialogs, settings, and all user flows.</td> -</tr> -<tr> -<td>Security</td> -<td>- Review all data stored in external storage. </br>- Review how data loaded from external storage is handled and processed.</td> -</tr> -</tbody> -</table> \ No newline at end of file +Onshape App Store onhttps://onshape-public.github.io/docs/app-store/Recent content in Onshape App Store onHugoen-usLaunch Checklisthttps://onshape-public.github.io/docs/app-store/checklist/Mon, 01 Jan 0001 00:00:00 +0000https://onshape-public.github.io/docs/app-store/checklist/This checklist brings together the processes you should follow to ensure your app is launched successfully. While all tasks must be completed to submit your app to the Onshape App Store, the task sequence provided here is a suggestion. +1. Understand quality expectations These are to ensure that the Onshape App Store remains a trusted resource and that quality is maintained Review the Quality Considerations page, and reach out to the Developer Relations team with any questions.Testing Guidelineshttps://onshape-public.github.io/docs/app-store/testingguidelines/Mon, 01 Jan 0001 00:00:00 +0000https://onshape-public.github.io/docs/app-store/testingguidelines/The purpose of this document is to help you get your application and App Store entry ready for QA testing. +Application Release Workflow (ARW) Each application submitted to the Onshape App Store goes through a series of stage-gates: +Starting state: Ok to deploy to limited visibility on Production (Beta testing) Ok to make Public Goal state: Application is Public To advance to the next stage, your application must pass testing, and your App Store entry must pass review.Quality Considerationshttps://onshape-public.github.io/docs/app-store/quality/Mon, 01 Jan 0001 00:00:00 +0000https://onshape-public.github.io/docs/app-store/quality/Core App Quality Onshape users expect high-quality apps. App quality directly influences the long-term success of your app in terms of installs, user rating and reviews, engagement, and user retention. +This page helps you assess the core aspects of quality in your app, through a compact set of quality criteria and associated tests. All Onshape apps should meet these criteria. +Before publishing your apps, test them against these criteria to ensure that they function well. \ No newline at end of file diff --git a/docs/app-store/quality/index.html b/docs/app-store/quality/index.html index ead8b5b..3193496 100644 --- a/docs/app-store/quality/index.html +++ b/docs/app-store/quality/index.html @@ -1,9 +1,9 @@ -Quality Considerations | Quality Considerations |

    Quality Considerations

    Core App Quality

    Onshape users expect high-quality apps. App quality directly influences the long-term success of your app in terms of installs, user rating and reviews, engagement, and user retention.

    This page helps you assess the core aspects of quality in your app, through a compact set of quality criteria and associated tests. All Onshape apps should meet these criteria.

    Before publishing your apps, test them against these criteria to ensure that they function well. Your testing should go well beyond what’s described here; the purpose of this page is to specify the essential quality characteristics all apps should display, so that you can cover them in your test plans.

    Functionality

    These criteria ensure that your app provides the expected functional behavior, with the appropriate level of permissions.

    AreaDescription
    PermissionsThe app requests only the absolute minimum permissions that it needs to support core functionality.

    Compatibility, Performance, and Stability

    These criteria ensure that apps provide the compatibility, performance, stability, and responsiveness expected by users.

    AreaDescription
    StabilityThe app does not crash, force close, freeze, or otherwise function abnormally.
    PerformanceThe app loads quickly or provides onscreen feedback to the user (e.g., a progress indicator or similar cue) if the app takes longer than two (2) seconds to load.
    Visual qualityThe app displays graphics, text, images, and other UI elements without noticeable distortion, blurring, or pixelation.

    Security

    These criteria ensure that apps handle user data and personal information safely.

    AreaDescription
    DataAll private data is stored in the app’s internal storage.
    All data from external storage is verified before being accessed.
    No personal or sensitive user data is logged to the system or app-specific log.
    NetworkingAll network traffic is sent over SSL.

    Onshape App Store

    These criteria ensure that your apps are ready to publish on Onshape App Store.

    AreaDescription
    App Details pageThe app’s feature graphic follows guidelines such as:
    - The app listing includes a high-quality feature graphic.
    - The feature graphic does not resemble an advertisement.
    - The app’s screenshots or videos do not represent the content and experience of your app in a misleading way.
    User supportUser-reported bugs are addressed if they are reproducible.

    Test procedures

    These test procedures help you discover various types of quality issues in your app. You can combine the tests or integrate groups of tests together in your own test plans. See the sections above for references that associate criteria with these test procedures.

    TypeDescription
    Core suiteNavigate to all parts of the app: all screens, dialogs, settings, and all user flows.
    Security- Review all data stored in external storage.
    - Review how data loaded from external storage is handled and processed.
    \ No newline at end of file +Before publishing your apps, test them against these criteria to ensure that they function well.">

    Quality Considerations

    Core App Quality

    Onshape users expect high-quality apps. App quality directly influences the long-term success of your app in terms of installs, user rating and reviews, engagement, and user retention.

    This page helps you assess the core aspects of quality in your app, through a compact set of quality criteria and associated tests. All Onshape apps should meet these criteria.

    Before publishing your apps, test them against these criteria to ensure that they function well. Your testing should go well beyond what’s described here; the purpose of this page is to specify the essential quality characteristics all apps should display, so that you can cover them in your test plans.

    Functionality

    These criteria ensure that your app provides the expected functional behavior, with the appropriate level of permissions.

    AreaDescription
    PermissionsThe app requests only the absolute minimum permissions that it needs to support core functionality.

    Compatibility, Performance, and Stability

    These criteria ensure that apps provide the compatibility, performance, stability, and responsiveness expected by users.

    AreaDescription
    StabilityThe app does not crash, force close, freeze, or otherwise function abnormally.
    PerformanceThe app loads quickly or provides onscreen feedback to the user (e.g., a progress indicator or similar cue) if the app takes longer than two (2) seconds to load.
    Visual qualityThe app displays graphics, text, images, and other UI elements without noticeable distortion, blurring, or pixelation.

    Security

    These criteria ensure that apps handle user data and personal information safely.

    AreaDescription
    DataAll private data is stored in the app’s internal storage.
    All data from external storage is verified before being accessed.
    No personal or sensitive user data is logged to the system or app-specific log.
    NetworkingAll network traffic is sent over SSL.

    Onshape App Store

    These criteria ensure that your apps are ready to publish on Onshape App Store.

    AreaDescription
    App Details pageThe app’s feature graphic follows guidelines such as:
    - The app listing includes a high-quality feature graphic.
    - The feature graphic does not resemble an advertisement.
    - The app’s screenshots or videos do not represent the content and experience of your app in a misleading way.
    User supportUser-reported bugs are addressed if they are reproducible.

    Test procedures

    These test procedures help you discover various types of quality issues in your app. You can combine the tests or integrate groups of tests together in your own test plans. See the sections above for references that associate criteria with these test procedures.

    TypeDescription
    Core suiteNavigate to all parts of the app: all screens, dialogs, settings, and all user flows.
    Security- Review all data stored in external storage.
    - Review how data loaded from external storage is handled and processed.
    \ No newline at end of file diff --git a/docs/app-store/testingguidelines/index.html b/docs/app-store/testingguidelines/index.html index d323fc5..5a64232 100644 --- a/docs/app-store/testingguidelines/index.html +++ b/docs/app-store/testingguidelines/index.html @@ -1,10 +1,9 @@ -Testing Guidelines | Testing Guidelines |

    Testing Guidelines

    The purpose of this document is to help you get your application and App Store entry ready for QA testing.

    Application Release Workflow (ARW)

    Each application submitted to the Onshape App Store goes through a series of stage-gates:

    1. Starting state: Ok to deploy to limited visibility on Production (Beta testing)
    2. Ok to make Public
    3. Goal state: Application is Public

    To advance to the next stage, your application must pass testing, and your App Store entry must pass review.

    Kick Off Testing

    While completing the Launch Checklist, you will need to use Jira to request testing and release for your application. You can initiate the following tasks from Jira:

    • Request application testing: This puts your application in the testing queue. We will note when testing has started (in progress) and when concluded, the ticket will be closed. The outcome will include notes and links to any issues generated (tickets). This phase may include as many iterations as needed to get your application ready.
    • Request public (general) authorization: We will note when testing has started (in progress), and this request will trigger a review of your app store entry and any outstanding bugs. Note there is no implied testing of your application, simply a review of outstanding issues (tickets) and of the App Store entry. Success at this stage will advance the Application Release Workflow (ARW), and you can request public release.
    • Request public (general) release: This request states that you have coordinated with the Developer Relations team and the Onshape Marketing team, and agreement has been reached that the app is ready for launch. Congratulations!

    Testing Protocol

    Applications are first tested against the checklist in Addendum A. Production App Store entries are then performed against the checklist in Addendum B.

    Results will be viewable in your Onshape support system (i.e., Zendesk, Jira). The result of each test will be one of:

    • Pass:
      • No action needed.
      • No notification issued.
    • Enhancement: Suggestions we believe would make the application better.
      • Will NOT prevent the application from being turned on for public access.
    • Bug (low priority): Slight deviations from the criteria that have low end user impact.
      • Will NOT prevent the application being turned on for public access.
      • No stipulated time-frame for resolution.
    • Bug (medium priority): Material deviations from the criteria that are noticeable to the end-user. Represents a minor problem that requires a work-around.
      • Will NOT prevent the application from being turned on for public access.
      • Must be fixed within 30 days.
    • Bug (high priority): Significant deviation from the criteria.
      • WILL prevent the application from being turned on for public access.
    • Bug (MUST FIX): Significant deviation from protocol or security violation.
      • WILL prevent the application from being turned on for public access.
      • If the application is already public, it may be temporarily suspended from the App Store.

    Testing Notes

    • Testing may be requested at any time.
    • Testing is done on a first-come basis.
    • When testing is complete (pass or fail), you go to the back of the queue.

    Addendum A

    Application Test Criteria

    • The application must use the Onshape OAUTH mechanism
    • The OAUTH must be against the correct stack
    • To be promoted to the Production stack, and hosted service must be on a monitored production server with worldwide 24/7 availability.
    • The application should not generate any avoidable console (browser) errors
    • The application should should provide one or more of the following options. The user should not have to leave the registration workflow to complete a pre-requisite.
      • Sign in using the Onshape ID (account created silently on first use)
      • Sign in with partner product account credentials
      • Create a new partner account
    • The application must be capable of managing/displaying documents in excess of 20. The application must display reasonable performance when reading documents, workspaces, elements, and parts. At scale, an account may have thousands of documents, many with multiple workspaces and each with multiple elements. Suggested strategies include:
      • Using a Next button to load the next 20 documents
      • Using infinite scroll (loading the next 20 if the scrollbar reaches the bottom of the dialog)
      • Displaying the most recently-opened documents first
      • Displaying a counter of documents/workspaces/elements read
      • Using progressive loading
    • The application should correctly list valid documents when per document app access is turned on.
    • The application should correctly handle selection of versions.
    • The application should correctly handle selection of workspaces (branches).
    • The application should correctly handle/display elements that are:
      • Part Studios that contain nothing
      • Assemblies that contain nothing
      • Part Studios that contain only surfaces
      • Part Studios that contain only wire data (e.g., helices)
    • The application should appropriately handle revocation of a grant.

    Addendum B

    App Store Testing Criteria

    • The application should have a descriptive name
    • The application summary should be accurate
    • The redirect URLS should be valid
    • The iframe URL should be valid
    • The Grant (permissions) request should be no more than is needed
    • The Application Type should be correctly set
    • Team visibility should be set (optional)
    • The category should be appropriate
    • The application description should be accurate
    • The Sign-In URL should be valid
    • The pricing summary should be accurate
      • i.e., trials should not be listed as Free; Free for xx days and then $xx/month is more accurate.
    • All pay plans should have accurate descriptions.
    • The support URL should point to a resource for help (the resource should NOT be an FAQ page, unless that page also contains one of the other options):
      • Support ticketing system (e.g., Zendesk, Jira, etc.)
      • Web page with a telephone number
      • Web page with an email address
      • Forum
    • The EULA link should point to an English Language EULA.
    \ No newline at end of file +Starting state: Ok to deploy to limited visibility on Production (Beta testing) Ok to make Public Goal state: Application is Public To advance to the next stage, your application must pass testing, and your App Store entry must pass review.">

    Testing Guidelines

    The purpose of this document is to help you get your application and App Store entry ready for QA testing.

    Application Release Workflow (ARW)

    Each application submitted to the Onshape App Store goes through a series of stage-gates:

    1. Starting state: Ok to deploy to limited visibility on Production (Beta testing)
    2. Ok to make Public
    3. Goal state: Application is Public

    To advance to the next stage, your application must pass testing, and your App Store entry must pass review.

    Kick Off Testing

    While completing the Launch Checklist, you will need to use Jira to request testing and release for your application. You can initiate the following tasks from Jira:

    • Request application testing: This puts your application in the testing queue. We will note when testing has started (in progress) and when concluded, the ticket will be closed. The outcome will include notes and links to any issues generated (tickets). This phase may include as many iterations as needed to get your application ready.
    • Request public (general) authorization: We will note when testing has started (in progress), and this request will trigger a review of your app store entry and any outstanding bugs. Note there is no implied testing of your application, simply a review of outstanding issues (tickets) and of the App Store entry. Success at this stage will advance the Application Release Workflow (ARW), and you can request public release.
    • Request public (general) release: This request states that you have coordinated with the Developer Relations team and the Onshape Marketing team, and agreement has been reached that the app is ready for launch. Congratulations!

    Testing Protocol

    Applications are first tested against the checklist in Addendum A. Production App Store entries are then performed against the checklist in Addendum B.

    Results will be viewable in your Onshape support system (i.e., Zendesk, Jira). The result of each test will be one of:

    • Pass:
      • No action needed.
      • No notification issued.
    • Enhancement: Suggestions we believe would make the application better.
      • Will NOT prevent the application from being turned on for public access.
    • Bug (low priority): Slight deviations from the criteria that have low end user impact.
      • Will NOT prevent the application being turned on for public access.
      • No stipulated time-frame for resolution.
    • Bug (medium priority): Material deviations from the criteria that are noticeable to the end-user. Represents a minor problem that requires a work-around.
      • Will NOT prevent the application from being turned on for public access.
      • Must be fixed within 30 days.
    • Bug (high priority): Significant deviation from the criteria.
      • WILL prevent the application from being turned on for public access.
    • Bug (MUST FIX): Significant deviation from protocol or security violation.
      • WILL prevent the application from being turned on for public access.
      • If the application is already public, it may be temporarily suspended from the App Store.

    Testing Notes

    • Testing may be requested at any time.
    • Testing is done on a first-come basis.
    • When testing is complete (pass or fail), you go to the back of the queue.

    Addendum A

    Application Test Criteria

    • The application must use the Onshape OAUTH mechanism
    • The OAUTH must be against the correct stack
    • To be promoted to the Production stack, and hosted service must be on a monitored production server with worldwide 24/7 availability.
    • The application should not generate any avoidable console (browser) errors
    • The application should should provide one or more of the following options. The user should not have to leave the registration workflow to complete a pre-requisite.
      • Sign in using the Onshape ID (account created silently on first use)
      • Sign in with partner product account credentials
      • Create a new partner account
    • The application must be capable of managing/displaying documents in excess of 20. The application must display reasonable performance when reading documents, workspaces, elements, and parts. At scale, an account may have thousands of documents, many with multiple workspaces and each with multiple elements. Suggested strategies include:
      • Using a Next button to load the next 20 documents
      • Using infinite scroll (loading the next 20 if the scrollbar reaches the bottom of the dialog)
      • Displaying the most recently-opened documents first
      • Displaying a counter of documents/workspaces/elements read
      • Using progressive loading
    • The application should correctly list valid documents when per document app access is turned on.
    • The application should correctly handle selection of versions.
    • The application should correctly handle selection of workspaces (branches).
    • The application should correctly handle/display elements that are:
      • Part Studios that contain nothing
      • Assemblies that contain nothing
      • Part Studios that contain only surfaces
      • Part Studios that contain only wire data (e.g., helices)
    • The application should appropriately handle revocation of a grant.

    Addendum B

    App Store Testing Criteria

    • The application should have a descriptive name
    • The application summary should be accurate
    • The redirect URLS should be valid
    • The iframe URL should be valid
    • The Grant (permissions) request should be no more than is needed
    • The Application Type should be correctly set
    • Team visibility should be set (optional)
    • The category should be appropriate
    • The application description should be accurate
    • The Sign-In URL should be valid
    • The pricing summary should be accurate
      • i.e., trials should not be listed as Free; Free for xx days and then $xx/month is more accurate.
    • All pay plans should have accurate descriptions.
    • The support URL should point to a resource for help (the resource should NOT be an FAQ page, unless that page also contains one of the other options):
      • Support ticketing system (e.g., Zendesk, Jira, etc.)
      • Web page with a telephone number
      • Web page with an email address
      • Forum
    • The EULA link should point to an English Language EULA.
    \ No newline at end of file diff --git a/docs/auth/apikeys/index.html b/docs/auth/apikeys/index.html index 984a9ec..f596fe9 100644 --- a/docs/auth/apikeys/index.html +++ b/docs/auth/apikeys/index.html @@ -1,10 +1,8 @@ -API Keys |

    API Keys

    📘 Note

    All applications submitted to the Onshape App Store (Onshape Apps) must follow the instructions on the OAuth2 page and use OAuth2 for authorization. Automation scripts (or applications not meant for the Onshape App Store) may use either OAuth2 or API Keys for authentication. OAuth2 allows applications to call Onshape APIs on behalf of the users of the application; API keys will only perform operations on behalf of the Onshape user who generated the API keys.

    Why API Keys?

    API keys are useful for small applications meant for personal use, allowing developers to avoid the overhead of the OAuth workflow. Creating an app is very easy with API keys: create an API key with the Developer Portal, set up a function to build your API key header as in the samples, and make your API calls! There’s no need to deal with OAuth redirects or things like that.

    We’ve moved over to using API keys for authenticating requests instead of using cookies for several reasons.

    1. Security: Each request is signed with unique headers so that we can be sure it’s coming from the right place.
    2. OAuth: The API key system we’re now using for HTTP requests is the same process developers follow when building full-blown OAuth applications; there’s no longer a disconnect between the two.

    Once you create an API key, it will only be valid in the stack on which it was created. An API key created on the partner stack, for example, will not function on the production stack.

    If you need information or have a question unanswered in this documentation, feel free to chat with us by sending an email to api-support@onshape.com or by checking out the forums. If you are a member of the DevPartners group (see the Development help page for information) more detailed instructions and code examples are in the apikey sample repo.

    1. Create API Keys

    1. Go to https://dev-portal.onshape.com.
    2. In the left pane, click API keys.
    3. Click the Create new API key button.
    4. Select the desired permissions for your app.
    5. Click the Create API key button.
      image
    6. Copy both the access key and secret key from the pop-up window, save them somewhere, then click the Close button.
      IMPORTANT NOTE: You will not be able to find the secret key again, so save it somewhere safe!
      image
    7. The details for your application appear.
      image
    8. Now that you have a key pair, see Generate a Request Signature for information on signing your requests to use our API.

    Once you have your access key and secret, you will want to avoid giving others access to them, since they’re tied directly to your personal Onshape account. Think of your API key as a username and password pair. Do not place them directly in the code for your application, especially if others might see it. The samples we provide here use a separate configuration file to contain this information, but there are other ways to keep the access key and secret safe, like setting them as environment variables.

    Scopes

    There are several scopes available for API keys (equivalent to OAuth scopes):

    • OAuth2Read - Read non-personal information (documents, parts, etc.)
    • OAuth2ReadPII - Read personal information (name, email, etc.)
    • OAuth2Write - Create and edit documents, etc.
    • OAuth2Delete - Delete documents, etc.
    • OAuth2Purchase - Authorize purchases from account

    2. Select an Authentication Option

    Please select an option for authentication:

    Basic Authorization

    For local testing, you can provide a basic authentication via your API Keys.

    1. Open your terminal and run the following command, replacing ACCESS_KEY and SECRET_KEY with the access key and secret key you created earlier. Remember to include the colon (:) between the keys. You will receive a long, base-64-encoded string as output.
      • MacOS:
        printf ACCESS_KEY:SECRET_KEY | base64
        +API Keys | 

        API Keys

        📘 Note

        All applications submitted to the Onshape App Store (Onshape Apps) must follow the instructions on the OAuth2 page and use OAuth2 for authorization. Automation scripts (or applications not meant for the Onshape App Store) may use either OAuth2 or API Keys for authentication. OAuth2 allows applications to call Onshape APIs on behalf of the users of the application; API keys will only perform operations on behalf of the Onshape user who generated the API keys.

        Why API Keys?

        API keys are useful for small applications meant for personal use, allowing developers to avoid the overhead of the OAuth workflow. Creating an app is very easy with API keys: create an API key with the Developer Portal, set up a function to build your API key header as in the samples, and make your API calls! There’s no need to deal with OAuth redirects or things like that.

        We’ve moved over to using API keys for authenticating requests instead of using cookies for several reasons.

        1. Security: Each request is signed with unique headers so that we can be sure it’s coming from the right place.
        2. OAuth: The API key system we’re now using for HTTP requests is the same process developers follow when building full-blown OAuth applications; there’s no longer a disconnect between the two.

        Once you create an API key, it will only be valid in the stack on which it was created. An API key created on the partner stack, for example, will not function on the production stack.

        If you need information or have a question unanswered in this documentation, feel free to chat with us by sending an email to api-support@onshape.com or by checking out the forums. If you are a member of the DevPartners group (see the Development help page for information) more detailed instructions and code examples are in the apikey sample repo.

        1. Create API Keys

        1. Go to https://dev-portal.onshape.com.
        2. In the left pane, click API keys.
        3. Click the Create new API key button.
        4. Select the desired permissions for your app.
        5. Click the Create API key button.
          image
        6. Copy both the access key and secret key from the pop-up window, save them somewhere, then click the Close button.
          IMPORTANT NOTE: You will not be able to find the secret key again, so save it somewhere safe!
          image
        7. The details for your application appear.
          image
        8. Now that you have a key pair, see Generate a Request Signature for information on signing your requests to use our API.

        Once you have your access key and secret, you will want to avoid giving others access to them, since they’re tied directly to your personal Onshape account. Think of your API key as a username and password pair. Do not place them directly in the code for your application, especially if others might see it. The samples we provide here use a separate configuration file to contain this information, but there are other ways to keep the access key and secret safe, like setting them as environment variables.

        Scopes

        There are several scopes available for API keys (equivalent to OAuth scopes):

        • OAuth2Read - Read non-personal information (documents, parts, etc.)
        • OAuth2ReadPII - Read personal information (name, email, etc.)
        • OAuth2Write - Create and edit documents, etc.
        • OAuth2Delete - Delete documents, etc.
        • OAuth2Purchase - Authorize purchases from account

        2. Select an Authentication Option

        Please select an option for authentication:

        Basic Authorization

        For local testing, you can provide a basic authentication via your API Keys.

        1. Open your terminal and run the following command, replacing ACCESS_KEY and SECRET_KEY with the access key and secret key you created earlier. Remember to include the colon (:) between the keys. You will receive a long, base-64-encoded string as output.
          • MacOS:
            printf ACCESS_KEY:SECRET_KEY | base64
             
          • Windows:
            powershell "[convert]::ToBase64String([Text.Encoding]::UTF8.GetBytes(\"ACCESS_KEY:SECRET_KEY\"))"
             
        2. Add the authorization header to your code, replacing CREDENTIALS with the string you receieved in Step 1:
          -H 'Authorization: Basic CREDENTIALS' \
           

        See our Quick Start Guide for an example of using Basic Authorization in an app.

        Request Signature

        For additional security, you can include your API Keys as part of a request signature. This provides more security than the Basic Authorization above, but less security than OAuth2.

        To ensure that a request is coming from you, we have a process for signing requests that you must follow for API calls to work. Everything is done via HTTP headers that you’ll need to set:

        1. Date: A standard date header giving the time of the request; must be accurate within 5 minutes of request. Example: Mon, 11 Apr 2016 20:08:56 GMT
        2. On-Nonce: A string that satisfies the following requirements (see the code for one possible way to generate it):
          • At least 16 characters
          • Alphanumeric
          • Unique for each request
        3. Authorization: This is where the API keys come into play. You’ll sign the request by implementing this algorithm:
          • Input: Method, URL, On-Nonce, Date, Content-Type, AccessKey, SecretKey
          • Output: String of the form: On <AccessKey>:HmacSHA256:<Signature>
          • Steps to generate the signature portion:
            1. Parse the URL and get the following:
              1. The path, e.g. /api/documents (no query params!)
              2. The query string, e.g. a=1&b=2
                • NOTE: If no query paramaters are present, use an empty string
            2. Create a string by appending the following information in order. Each field should be separated by a newline (\n) character, and the string must be converted to lowercase:
              1. HTTP method
              2. On-Nonce header value
              3. Date header value
              4. Content-Type header value
              5. URL pathname
              6. URL query string
            3. Using SHA-256, generate an HMAC digest, using the API secret key first and then the above string, then encode it in Base64.
            4. Create the On <AccessKey>:HmacSHA256:<Signature> string and use that in the Authorization header in your request.

        Below is an example function to generate the authorization header, using Node.js’s standard crypto and url libraries:

        // ...at top of file
        @@ -39,4 +37,4 @@
             var signature = 'On ' + accessKey + ':HmacSHA256:' + hmac;
             return signature;
         }
        -

        Redirects

        Some API endpoints return 307 redirects. You must generate an Authorization header for the redirect as well, but please note that the server portion of the URL might be different, the redirect URL may contain query parameters that must be encoded in the Authorization header, etc.

        \ No newline at end of file +

    Redirects

    Some API endpoints return 307 redirects. You must generate an Authorization header for the redirect as well, but please note that the server portion of the URL might be different, the redirect URL may contain query parameters that must be encoded in the Authorization header, etc.

    \ No newline at end of file diff --git a/docs/auth/index.html b/docs/auth/index.html index 7bd873d..087e705 100644 --- a/docs/auth/index.html +++ b/docs/auth/index.html @@ -1,4 +1,4 @@ -Authentication |

    Authentication

    📘 Note

    All applications submitted to the Onshape App Store (Onshape Apps) must follow the instructions on the OAuth2 page and use OAuth2 for authorization. Automation scripts (or applications not meant for the Onshape App Store) may use either OAuth2 or API Keys for authentication. OAuth2 allows applications to call Onshape APIs on behalf of the users of the application; API keys will only perform operations on behalf of the Onshape user who generated the API keys.

    We’ve structured API keys to work very similarly to OAuth in the operation of your app. You must build your Authorization header differently (and set up redirects and sign-ins), but the API calls themselves work the same in both versions, provided that the API key and the OAuth app have the same scopes. An API key with the OAuth2Read and OAuth2Write scopes have the same access to the same API endpoints as an OAuth application with the OAuth2Read and OAuth2Write scopes. The only differences are when calling API endpoints in relation to the OAuth application itself, since an API key request does not come from an OAuth application.

    Please select an option for authentication:

    \ No newline at end of file +Authentication |

    Authentication

    📘 Note

    All applications submitted to the Onshape App Store (Onshape Apps) must follow the instructions on the OAuth2 page and use OAuth2 for authorization. Automation scripts (or applications not meant for the Onshape App Store) may use either OAuth2 or API Keys for authentication. OAuth2 allows applications to call Onshape APIs on behalf of the users of the application; API keys will only perform operations on behalf of the Onshape user who generated the API keys.

    We’ve structured API keys to work very similarly to OAuth in the operation of your app. You must build your Authorization header differently (and set up redirects and sign-ins), but the API calls themselves work the same in both versions, provided that the API key and the OAuth app have the same scopes. An API key with the OAuth2Read and OAuth2Write scopes have the same access to the same API endpoints as an OAuth application with the OAuth2Read and OAuth2Write scopes. The only differences are when calling API endpoints in relation to the OAuth application itself, since an API key request does not come from an OAuth application.

    Please select an option for authentication:

    \ No newline at end of file diff --git a/docs/auth/index.xml b/docs/auth/index.xml index 02ce612..99bf056 100644 --- a/docs/auth/index.xml +++ b/docs/auth/index.xml @@ -1,685 +1,4 @@ -– Authenticationhttps://onshape-public.github.io/docs/auth/Recent content in Authentication onHugo -- gohugo.ioen-usMon, 18 May 2020 20:25:28 -0400Docs: OAuthhttps://onshape-public.github.io/docs/auth/oauth/Mon, 18 May 2020 20:39:14 -0400https://onshape-public.github.io/docs/auth/oauth/ -<p><strong>See the <a href="https://github.com/onshape-public/app-gltf-viewer">gltf-viewer-app</a> for a working example of OAuth2.</strong></p> -<blockquote> -<p>📘 <strong>Note</strong></p> -<p>All applications submitted to the Onshape App Store (Onshape Apps) must use OAuth2 for authorization. Automation scripts (or applications not meant for the Onshape App Store) may use either OAuth2 or <a href="https://onshape-public.github.io/docs/auth/apikeys">API Keys</a> for authentication. OAuth2 allows applications to call Onshape APIs on behalf of the users of the application; API keys will only perform operations on behalf of the Onshape user who generated the API keys.</p> -</blockquote> -<h2 id="what-is-oauth2">What is OAuth2?</h2> -<p>The OAuth (Open authorization) protocol was developed by the Internet Engineering Task Force, an open standards organization that develops and promotes voluntary Internet standards (particularly the technical standards that comprise the Internet protocol suite) to enable secure, delegated access to an application&rsquo;s resources.</p> -<p>The OAuth2 protocol enables an application to access a resource that is under the control of someone else. In order to access that resource, a <i>token</i> is required. The token represent the delegated rights of access (that is, what rights this application has, such as read/write/update, scope, rights to different resources, and more).</p> -<p><i>This means the application can be accessed by a third-party system without that system -impersonating the user that controls the resource.</i></p> -<p>A good analogy is the hotel check-in process. When you arrive at the front desk of a hotel, you provide an ID and a form of payment. Then, you are given a key card that opens a specific door. When you reach that door, you swipe your key card and are granted access. The door itself doesn’t know who you are or anything about you, it just knows that the key card was encoded correctly, and it allows you access. At some point, the key card expires, and the door no longer lets you into the room. This is the same for access tokens in the OAuth2 flow.</p> -<p>With the OAuth2 protocol, you register your application with the third party, and you are given a set of keys. These keys get exchanged for an access token that grants you access to resources in the third-party application. The token expires regularly; you miust get a new token to access the application again. For this, you are provided with a <i>refresh token</i>. Sending the refresh token to the authentication server updates your access token and gives you a new refresh token.</p> -<p><img src="https://onshape-public.github.io/images/APITokenRequestDiagram.png" alt="api token request diagram"></p> -<h3 id="oauth2--onshape">OAuth2 &amp; Onshape</h3> -<p>The first step in the OAuth flow is for the Onshape user to request that Onshape let the third-party application access Onshape.</p> -<p>Once the user has authorized the application, they are redirected to a predefined URL (called a <i>redirect URL</i>) with a code that will requests an access token from Onshape. Therefore, the redirect URL should contain a script that can capture the authorization code.</p> -<p>You will use the access token to authenticate requests to the Onshape API. The token expires after preset amount of time. To get a new valid access token after one has expired, you must use the refresh token to request a new access token. Refreshing the access token also provides you with an updated refresh token to use in the next refresh access token request. Make sure to store both the the access token and the refresh token, and update them with each refresh of the token. The authorization token must accompany any call to the API, this is done by adding the token to an Authorization field in the header of each request:</p> -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-js" data-lang="js"><span style="display:flex;"><span>Authorization: Bearer &lt;accessToken&gt; -</span></span></code></pre></div><p>If correctly authenticated, most responses from the REST API call return JSON data (though some return binary data), with an HTTP response code of <code>200 Success</code>, <code>204 - No Content</code>, or <code>301 - Permanent Redirect</code>. <code>301</code> responses will include a redirect for you to follow.</p> -<p>In the event that the authorization code is incorrect (for instance, if it expired), you will receive an <strong>HTTP 401</strong> response. This response means that the client request has not been completed, since it lacks valid authentication credentials for the requested resource. In this event, your code for each call to the REST API should include a catch clause for a 401 exception. Once caught, you can refresh the token and make the request again. Pay close attention to the <code>Content-Type</code> header for what data to parse and expect.</p> -<p>When integrating with Onshape, OAuth tokens give third-party applications (such as desktop applications or web services) access to users&rsquo; data as defined by the permissions scope (such as users&rsquo; documents or profile information). Using OAuth terminology, Onshape acts as both the authorization and resource server, while the desktop or web-based application is the client. Resource owners have the option of granting or denying access to applications.</p> -<p>Once obtained, an OAuth token will work for third-party APIs under <code>/api</code>. Do NOT attempt to use an OAuth token to fetch the URLs typically displayed in a web browsers location bar.</p> -<h3 id="more-resources">More resources</h3> -<ul> -<li><a href="https://www.digitalocean.com/community/tutorials/an-introduction-to-oauth-2">Digital Ocean</a> - A good resource for learning more about OAuth2.</li> -<li><a href="http://tools.ietf.org/html/rfc6749">RFC 6749</a> - The reference for the OAuth framework as a whole. Most of this document describes how to implement the OAuth exchanges described by the reference within the context of Onshape and client applications.</li> -<li><a href="http://tools.ietf.org/html/rfc6750">RFC 6750</a> - Describes the exchange of OAuth access tokens between clients and OAuth servers.</li> -</ul> -<h2 id="implement-oauth2">Implement OAuth2</h2> -<p>This OAuth tutorial demonstrates how to recreate the authentication process in Node.js found in the <a href="https://github.com/onshape-public/app-gltf-viewer">gltf-viewer-app</a> sample code. The <a href="#final-code">final code</a> in Node.js and other languages can be found at the end of this page.</p> -<h3 id="1-register-the-app">1: Register the app</h3> -<ol> -<li>Navigate to <a href="https://dev-portal.onshape.com/signin">https://dev-portal.onshape.com/signin</a> and sign in.</li> -<li>In the left sidebar, click <strong>OAuth applications</strong>.</li> -<li>Click the <strong>Create new OAuth application</strong> button.</li> -<li>Fill out the form as follows: -<ul> -<li>Name: <code>gltf-viewer-yourname</code> -<ul> -<li>The application name to display to users.</li> -<li>Should include the name of your company to differentiate it from other possibly similar applications.</li> -</ul> -</li> -<li>Primary format: <code>com.yourname.gltf-viewer</code> -<ul> -<li>String that uniquely identifies your application and is a marker for the data it might store on Onshape servers.</li> -<li>Cannot be changed after the application is registered.</li> -</ul> -</li> -<li>Summary: <code>Onshape OAuth tutorial</code> -<ul> -<li>Description of your application.</li> -<li>Displayed to the user when they’re asked to grant the application permission to access their data.</li> -</ul> -</li> -<li>Redirect URLs: <code>http://localhost:5000/token</code> -<ul> -<li>Your application must specify at least one URL used in the OAuth protocol exchanges.</li> -<li>This URL must also use SSL (a URL that begins with https), with two exceptions applicable for -installed desktop applications: <code>http://localhost:&lt;port&gt;</code> and <code>urn:ietf:wg:oauth:2.0:oob</code>.</li> -<li>e.g., <code>https://app-gltf-viewer-yourname-c11f263794bc.herokuapp.com/oauthRedirect</code></li> -</ul> -</li> -<li>Admin team: <code>No Team</code> -<ul> -<li>Optional.</li> -<li>If defined, members of the team can make changes to the definition of this OAuth application.</li> -<li>See the <a href="https://cad.onshape.com/help/Content/teams-enterprise.htm">Help Docs: Teams</a> page for more information on creating teams in Onshape.</li> -</ul> -</li> -<li>OAuth URL: <code>none</code> -<ul> -<li>Should contain the URL of your deployed application.</li> -<li>This is the first URL called from the Onshape Applications page.</li> -<li>The page hosted at this URL should handle the OAuth authentication. Once your application’s server has been authenticated on behalf of the user, that user should be redirected to your applications content.</li> -<li>If you have not deployed your app yet, you can leave this field blank (as shown in this example) for local work and update it later.</li> -<li>e.g., <code>https://app-gltf-viewer-yourname-c11f263794bc.herokuapp.com/oauthSignin</code></li> -</ul> -</li> -<li>Settings: check <strong>Supports collaboration</strong></li> -<li>Permissions: -<ul> -<li>This is also called application scope, and it defines what access rights your application has to the user’s data.</li> -<li><strong>Application can read your profile information</strong> - Enable your application to access the Onshape user profile. Check this option.</li> -<li><strong>Application can read your documents</strong> - Onshape documents created by this user can be accessed with read privileges only. Check this option.</li> -<li><strong>Application can write to your documents</strong> - The user-owned Onshape documents can be modified by this application. Check this option.</li> -<li><strong>Application can delete documents and workspaces</strong> - Your application will be able to delete a workspace within a document or the complete Onshape document. Do not check this option for this example.</li> -<li><strong>Application can request Purchases on Your behalf</strong> - The application will have access to make purchases if required. Do not check this option for this example.</li> -<li><strong>Application can share and unshare documents on your behalf</strong> - Onshape’s document sharing capabilities are very powerful; they enable other parties to access your shared documents with -predefined rights. If this option is checked, the application can automatically share a document with other people. Do not check this option for this example.</li> -</ul> -</li> -</ul> -</li> -<li>Click <strong>Create application</strong>.</li> -<li><font style="color: red"><b>COPY THE OAUTH SECRET FROM THE POP-UP WINDOW.<b></font> -<ul> -<li>You will not be able to access this secret again.</li> -<li>This secret is unique to you and your app and should be protected like any sensitive password. For example, it should <em>NOT</em> be checked in to source code control systems.</li> -</ul> -</li> -<li>Click <strong>Close</strong>.</li> -<li>Copy the <strong>OAuth client identifier</strong> from the app Details page that opens. -<ul> -<li>These OAuth secret and client ID keys will be used in your code for requesting a one-time user authorization code from Onshape.</li> -</ul> -</li> -</ol> -<p>Your application is now registered with Onshape and you have options to -modify the application definition through this portal.</p> -<img src="https://onshape-public.github.io/images/dev-portal-app-details-01.png" alt="the gltf-viewer app in the onshape dev portal app details screen" /> -<h3 id="2-get-the-user-authorization-code">2: Get the user authorization code</h3> -<p>We’ll start by loading the basic libraries required to run this sample. We&rsquo;ll use Passport to authenticate requests through plugins known as strategies. In this example, we&rsquo;ll use an Onshape-developed plugin called <code>passport-onshape</code>, but you can define your own strategy to use with Passport, if you prefer. You can find more information on <a href="https://www.npmjs.com/package/passport">Passport here</a>.</p> -<ol> -<li>Create a directory for your app, and then install Passport and passport-onshape:</li> -</ol> -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-js" data-lang="js"><span style="display:flex;"><span>npm install passport -</span></span><span style="display:flex;"><span>npm install passport-onshape -</span></span></code></pre></div><ol start="2"> -<li>Next, create a file calls <code>app.js</code> and add the following definitions to the top of the file:</li> -</ol> -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-javascript" data-lang="javascript"><span style="display:flex;"><span><span style="color:#aaa;font-style:italic">// App definitions -</span></span></span><span style="display:flex;"><span><span style="color:#aaa;font-style:italic"></span><span style="color:#00a">const</span> path = require(<span style="color:#a50">&#39;path&#39;</span>); -</span></span><span style="display:flex;"><span><span style="color:#00a">const</span> uuid = require(<span style="color:#a50">&#39;uuid&#39;</span>); -</span></span><span style="display:flex;"><span> -</span></span><span style="display:flex;"><span><span style="color:#00a">const</span> express = require(<span style="color:#a50">&#39;express&#39;</span>); -</span></span><span style="display:flex;"><span><span style="color:#00a">const</span> session = require(<span style="color:#a50">&#39;express-session&#39;</span>); -</span></span><span style="display:flex;"><span><span style="color:#00a">const</span> bodyParser = require(<span style="color:#a50">&#39;body-parser&#39;</span>); -</span></span><span style="display:flex;"><span> -</span></span><span style="display:flex;"><span><span style="color:#00a">const</span> passport = require(<span style="color:#a50">&#39;passport&#39;</span>); -</span></span><span style="display:flex;"><span><span style="color:#00a">const</span> OnshapeStrategy = require(<span style="color:#a50">&#39;passport-onshape&#39;</span>); -</span></span><span style="display:flex;"><span> -</span></span><span style="display:flex;"><span><span style="color:#00a">const</span> config = require(<span style="color:#a50">&#39;./config&#39;</span>); -</span></span></code></pre></div><ol start="3"> -<li>Next, tell Express to use Passport and initialize it. Note: you can replace the Express code with code for the web server of your choice.</li> -</ol> -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-javascript" data-lang="javascript"><span style="display:flex;"><span><span style="color:#aaa;font-style:italic">// Tell Express to use Passport, and initialize it. -</span></span></span><span style="display:flex;"><span><span style="color:#aaa;font-style:italic"></span><span style="color:#00a">const</span> app = express(); -</span></span><span style="display:flex;"><span> -</span></span><span style="display:flex;"><span>app.use(express.<span style="color:#00a">static</span>(path.join(__dirname, <span style="color:#a50">&#39;public&#39;</span>))); -</span></span><span style="display:flex;"><span>app.use(express.<span style="color:#00a">static</span>(path.join(__dirname, <span style="color:#a50">&#39;dist&#39;</span>))); -</span></span><span style="display:flex;"><span>app.use(bodyParser.json()); -</span></span><span style="display:flex;"><span> -</span></span><span style="display:flex;"><span>app.set(<span style="color:#a50">&#39;trust proxy&#39;</span>, <span style="color:#099">1</span>); <span style="color:#aaa;font-style:italic">// To allow to run correctly behind Heroku when deployed -</span></span></span><span style="display:flex;"><span><span style="color:#aaa;font-style:italic"></span> -</span></span><span style="display:flex;"><span>app.use(session({ -</span></span><span style="display:flex;"><span> secret: config.sessionSecret, -</span></span><span style="display:flex;"><span> saveUninitialized: <span style="color:#00a">false</span>, -</span></span><span style="display:flex;"><span> resave: <span style="color:#00a">false</span>, -</span></span><span style="display:flex;"><span> cookie: { -</span></span><span style="display:flex;"><span> name: <span style="color:#a50">&#39;app-gltf-viewer&#39;</span>, -</span></span><span style="display:flex;"><span> sameSite: <span style="color:#a50">&#39;none&#39;</span>, -</span></span><span style="display:flex;"><span> secure: <span style="color:#00a">true</span>, -</span></span><span style="display:flex;"><span> httpOnly: <span style="color:#00a">true</span>, -</span></span><span style="display:flex;"><span> path: <span style="color:#a50">&#39;/&#39;</span>, -</span></span><span style="display:flex;"><span> maxAge: <span style="color:#099">1000</span> * <span style="color:#099">60</span> * <span style="color:#099">60</span> * <span style="color:#099">24</span> <span style="color:#aaa;font-style:italic">// 1 day -</span></span></span><span style="display:flex;"><span><span style="color:#aaa;font-style:italic"></span> } -</span></span><span style="display:flex;"><span>})); -</span></span><span style="display:flex;"><span>app.use(passport.initialize()); -</span></span><span style="display:flex;"><span>app.use(passport.session()); -</span></span></code></pre></div><ol start="4"> -<li>Next, we&rsquo;ll store the Onshape user information so it can be retrieved from <code>req.user</code> in -each call. Passport uses the <code>serializeUser</code> function to persist user data (after successful -authentication) into the session. The function <code>deserializeUser</code> is used -to retrieve user data from session.</li> -</ol> -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-javascript" data-lang="javascript"><span style="display:flex;"><span><span style="color:#aaa;font-style:italic">//Store the Onshape user information -</span></span></span><span style="display:flex;"><span><span style="color:#aaa;font-style:italic"></span>passport.serializeUser((user, done) =&gt; done(<span style="color:#00a">null</span>, user)); -</span></span><span style="display:flex;"><span>passport.deserializeUser((obj, done) =&gt; done(<span style="color:#00a">null</span>, obj)); -</span></span></code></pre></div><ol start="6"> -<li>Initialize Passport with the Onshape Strategy:</li> -</ol> -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-javascript" data-lang="javascript"><span style="display:flex;"><span><span style="color:#aaa;font-style:italic">//Initialize Passport with the Onshape Strategy -</span></span></span><span style="display:flex;"><span><span style="color:#aaa;font-style:italic"></span>passport.use(<span style="color:#00a">new</span> OnshapeStrategy({ -</span></span><span style="display:flex;"><span> clientID: config.oauthClientId, -</span></span><span style="display:flex;"><span> clientSecret: config.oauthClientSecret, -</span></span><span style="display:flex;"><span> callbackURL: config.oauthCallbackUrl, -</span></span><span style="display:flex;"><span> authorizationURL: <span style="color:#a50">`</span><span style="color:#a50">${</span>config.oauthUrl<span style="color:#a50">}</span><span style="color:#a50">/oauth/authorize`</span>, -</span></span><span style="display:flex;"><span> tokenURL: <span style="color:#a50">`</span><span style="color:#a50">${</span>config.oauthUrl<span style="color:#a50">}</span><span style="color:#a50">/oauth/token`</span>, -</span></span><span style="display:flex;"><span> userProfileURL: <span style="color:#a50">`</span><span style="color:#a50">${</span>config.oauthUrl<span style="color:#a50">}</span><span style="color:#a50">/api/users/sessioninfo`</span> -</span></span><span style="display:flex;"><span> }, -</span></span><span style="display:flex;"><span> (accessToken, refreshToken, profile, done) =&gt; { -</span></span><span style="display:flex;"><span> profile.accessToken = accessToken; -</span></span><span style="display:flex;"><span> profile.refreshToken = refreshToken; -</span></span><span style="display:flex;"><span> <span style="color:#00a">return</span> done(<span style="color:#00a">null</span>, profile); -</span></span><span style="display:flex;"><span> } -</span></span><span style="display:flex;"><span>)); -</span></span></code></pre></div><ol start="7"> -<li>Open your environment variables file (e.g.,<code>.env</code>, <code>.bashrc</code>, <code>.bash_profile</code>, <code>.zshrc,</code> etc.) and add the following environment variables, then save and close the file.</li> -</ol> -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>authorizationURL : https://oauth.onshape.com/oauth/authorize -</span></span><span style="display:flex;"><span>tokenURL : https://oauth.onshape.com/oauth/token -</span></span><span style="display:flex;"><span>userProfileURL : https://cad.onshape.com/api/users/sessioninfo -</span></span></code></pre></div><p>The callback function will provide us with the <code>accessToken</code>, the <code>refreshToken</code>, and the user’s Onshape profile once authentication has been successfully passed. We can now use this to update our database with user-specific information.</p> -<p>Note that if you store the <code>accessToken</code> and <code>refreshToken</code> in the database along with the user record, you must update it each time that the access codes are refreshed.</p> -<ol start="8"> -<li>Next, we define our endpoint where the authorization flow starts (in this case, <code>/oauthSignin</code>). This is the endpoint that we previously defined in the Onshape application setup. This will redirect to an Onshape page in order for the user to confirm (or deny) the applications access to theOnshape resources.</li> -</ol> -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-javascript" data-lang="javascript"><span style="display:flex;"><span><span style="color:#aaa;font-style:italic">//Define the Onshape API endpoint -</span></span></span><span style="display:flex;"><span><span style="color:#aaa;font-style:italic"></span>app.use(<span style="color:#a50">&#39;/oauthSignin&#39;</span>, (req, res) =&gt; { -</span></span><span style="display:flex;"><span> <span style="color:#aaa;font-style:italic">/* These 5 lines are specific to the glTF Viewer sample app. You can replace them with the input for whatever Onshape endpoints you are using in your app */</span> -</span></span><span style="display:flex;"><span> <span style="color:#00a">const</span> state = { -</span></span><span style="display:flex;"><span> docId: req.query.documentId, -</span></span><span style="display:flex;"><span> workId: req.query.workspaceId, -</span></span><span style="display:flex;"><span> elId: req.query.elementId -</span></span><span style="display:flex;"><span> }; -</span></span><span style="display:flex;"><span> req.session.state = state; -</span></span><span style="display:flex;"><span> <span style="color:#00a">return</span> passport.authenticate(<span style="color:#a50">&#39;onshape&#39;</span>, { state: uuid.v4(state) })(req, res); -</span></span><span style="display:flex;"><span>}, (req, res) =&gt; { -</span></span><span style="display:flex;"><span> -</span></span><span style="display:flex;"><span> }); -</span></span></code></pre></div><h3 id="3-exchange-the-code-for-an-access-token">3: Exchange the code for an access token</h3> -<p>Fortunately, if you are using Passport, there isn’t much to do once the user grants authorization. The return URL will contain the one-time authorization token, which Passport will extract and exchange for an access token and a refresh token, which are available in Passport callback function.</p> -<ol> -<li>Add the following code to <code>app.js</code>:</li> -</ol> -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-javascript" data-lang="javascript"><span style="display:flex;"><span><span style="color:#aaa;font-style:italic">//Exchange the code for an access token -</span></span></span><span style="display:flex;"><span><span style="color:#aaa;font-style:italic"></span>app.use(<span style="color:#a50">&#39;/oauthRedirect&#39;</span>, passport.authenticate(<span style="color:#a50">&#39;onshape&#39;</span>, { failureRedirect: <span style="color:#a50">&#39;/grantDenied&#39;</span> }), (req, res) =&gt; { -</span></span><span style="display:flex;"><span> <span style="color:#aaa;font-style:italic">/* This code is specific to the glTF Viewer sample app. You can replace it with the input for whatever Onshape endpoints you are using in your app. */</span> -</span></span><span style="display:flex;"><span> res.redirect(<span style="color:#a50">`/?documentId=</span><span style="color:#a50">${</span>req.session.state.docId<span style="color:#a50">}</span><span style="color:#a50"> -</span></span></span><span style="display:flex;"><span><span style="color:#a50">&amp;workspaceId=</span><span style="color:#a50">${</span>req.session.state.workId<span style="color:#a50">}</span><span style="color:#a50">&amp;elementId= -</span></span></span><span style="display:flex;"><span><span style="color:#a50"> </span><span style="color:#a50">${</span>req.session.state.elId<span style="color:#a50">}</span><span style="color:#a50">`</span>); -</span></span><span style="display:flex;"><span>}); -</span></span></code></pre></div><ol start="2"> -<li>If the user clicks <strong>Deny</strong> instead of <strong>Authorize Application</strong>, they are taken to a page that notifies them that access to the application was denied. We can see that in the <code>failureRedirect</code> argument. Add the following to <code>app.js</code>:</li> -</ol> -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-javascript" data-lang="javascript"><span style="display:flex;"><span><span style="color:#aaa;font-style:italic">//Handle denied access -</span></span></span><span style="display:flex;"><span><span style="color:#aaa;font-style:italic"></span>app.get(<span style="color:#a50">&#39;/grantDenied&#39;</span>, (req, res) =&gt; { -</span></span><span style="display:flex;"><span> res.sendFile(path.join(__dirname, <span style="color:#a50">&#39;public&#39;</span>, <span style="color:#a50">&#39;html&#39;</span>, <span style="color:#a50">&#39;grantDenied.html&#39;</span>)); -</span></span><span style="display:flex;"><span>}) -</span></span></code></pre></div><p>Now we have received the access token, and it can be accessed from <code>res.user.accessToken</code> on this page or from <code>req.user.accessToken</code> from any other page you redirect to from here.</p> -<h3 id="4-use-the-access-token">4: Use the access token</h3> -<ol> -<li>Add the following to the bottom of <code>app.js</code>. You can see that the access token is used as an Authorization header:</li> -</ol> -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-js" data-lang="js"><span style="display:flex;"><span><span style="color:#aaa;font-style:italic">//Use the access token as an Authorization header -</span></span></span><span style="display:flex;"><span><span style="color:#aaa;font-style:italic"></span>makeOnshapeAPICall: <span style="color:#00a">async</span> (req, res) =&gt; { -</span></span><span style="display:flex;"><span> <span style="color:#00a">try</span> { -</span></span><span style="display:flex;"><span> <span style="color:#00a">const</span> apiUrl = <span style="color:#a50">&#34;https://cad.onshape.com/api/documents?ownerType=1&amp;sortColumn=createdAt&amp;sortOrder=desc&amp;offset=0&amp;limit=20&#34;</span>; <span style="color:#aaa;font-style:italic">//You can replace this with any Onshape API endpoint URL. -</span></span></span><span style="display:flex;"><span><span style="color:#aaa;font-style:italic"></span> <span style="color:#00a">const</span> resp = <span style="color:#00a">await</span> fetch(normalizedUrl, { headers: { Authorization: <span style="color:#a50">`Bearer </span><span style="color:#a50">${</span>req.user.accessToken<span style="color:#a50">}</span><span style="color:#a50">`</span> }}); -</span></span><span style="display:flex;"><span> <span style="color:#00a">const</span> data = <span style="color:#00a">await</span> resp.text(); -</span></span><span style="display:flex;"><span> <span style="color:#00a">const</span> contentType = resp.headers.get(<span style="color:#a50">&#39;Content-Type&#39;</span>); -</span></span><span style="display:flex;"><span> res.status(resp.status).contentType(contentType).send(data); -</span></span><span style="display:flex;"><span> } <span style="color:#00a">catch</span> (err) { -</span></span><span style="display:flex;"><span> res.status(<span style="color:#099">500</span>).json({ error: err }); -</span></span><span style="display:flex;"><span> } -</span></span><span style="display:flex;"><span> } -</span></span></code></pre></div><p>Note: in the glTF Viewer sample app, this code appears in <code>utils.js</code> instead of <code>app.js</code>.</p> -<h3 id="5-refresh-the-token">5: Refresh the token</h3> -<p>When the access token expires, it must be refreshed by making another <code>POST</code> request to <code>https://oauth.onshape.com/oauth/token</code> with the following URL-encoded form body (with <code>Content-Type application/x-www-form-urlencoded</code>):</p> -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span><span style="color:#a00">grant_type</span>=refresh_token&amp;<span style="color:#a00">refresh_token</span>=<span style="color:#a50">\&lt;</span>refresh_token<span style="color:#a50">\&gt;</span>&amp;<span style="color:#a00">client_id</span>=<span style="color:#a50">\&lt;</span>client_id<span style="color:#a50">\&gt;</span>&amp;<span style="color:#a00">client_secret</span>=<span style="color:#a50">\&lt;</span>client_secret<span style="color:#a50">\&gt;</span> -</span></span></code></pre></div><p>As with the authorization code data, the parameters in the form body must be URL-encoded. The response to this <code>POST</code> request will be a JSON-encoded structure with a new <code>access_token</code> value that can be used for the next 60 minutes.</p> -<p>Refresh tokens are valid for the lifetime of the user’s grant. If a user who previously granted access to your application decides to revoke the grant, the refresh token is invalidated. If the user decides to re-grant application access, a new refresh token is generated and returned along with the access token.</p> -<ol> -<li>Add the following to <code>app.js</code>:</li> -</ol> -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-js" data-lang="js"><span style="display:flex;"><span><span style="color:#aaa;font-style:italic">/** After landing on the home page, we check if a user had already signed in. If no user has signed in, we redirect the request to the OAuth sign-in page. If a user had signed in previously, we will attempt to refresh the access token of the user. After successfully refreshing the access token, we will simply take the user to the landing page of the app. If the refresh token request fails, we will redirect the user to the OAuth sign-in page again. */</span> -</span></span><span style="display:flex;"><span>app.get(<span style="color:#a50">&#39;/&#39;</span>, (req, res) =&gt; { -</span></span><span style="display:flex;"><span> <span style="color:#00a">if</span> (!req.user) { -</span></span><span style="display:flex;"><span> <span style="color:#00a">return</span> res.redirect(<span style="color:#a50">`/oauthSignin</span><span style="color:#a50">${</span>req._parsedUrl.search ? req._parsedUrl.search : <span style="color:#a50">&#34;&#34;</span><span style="color:#a50">}</span><span style="color:#a50">`</span>); -</span></span><span style="display:flex;"><span> } <span style="color:#00a">else</span> { -</span></span><span style="display:flex;"><span> refreshAccessToken(req.user).then((tokenJson) =&gt; { -</span></span><span style="display:flex;"><span> <span style="color:#aaa;font-style:italic">// Dereference the user object and update the access token and refresh token in the in-memory object. -</span></span></span><span style="display:flex;"><span><span style="color:#aaa;font-style:italic"></span> <span style="color:#00a">let</span> usrObj = JSON.parse(JSON.stringify(req.user)); -</span></span><span style="display:flex;"><span> usrObj.accessToken = tokenJson.access_token; -</span></span><span style="display:flex;"><span> usrObj.refreshToken = tokenJson.refresh_token; -</span></span><span style="display:flex;"><span> <span style="color:#aaa;font-style:italic">// Update the user object in PassportJS. No redirections will happen here, this is a purely internal operation. -</span></span></span><span style="display:flex;"><span><span style="color:#aaa;font-style:italic"></span> req.login(usrObj, () =&gt; { -</span></span><span style="display:flex;"><span> <span style="color:#00a">return</span> res.sendFile(path.join(__dirname, <span style="color:#a50">&#39;public&#39;</span>, <span style="color:#a50">&#39;html&#39;</span>, <span style="color:#a50">&#39;index.html&#39;</span>)); -</span></span><span style="display:flex;"><span> }); -</span></span><span style="display:flex;"><span> }).<span style="color:#00a">catch</span>(() =&gt; { -</span></span><span style="display:flex;"><span> <span style="color:#aaa;font-style:italic">// Refresh token failed, take the user to OAuth sign in page. -</span></span></span><span style="display:flex;"><span><span style="color:#aaa;font-style:italic"></span> <span style="color:#00a">return</span> res.redirect(<span style="color:#a50">`/oauthSignin</span><span style="color:#a50">${</span>req._parsedUrl.search ? req._parsedUrl.search : <span style="color:#a50">&#34;&#34;</span><span style="color:#a50">}</span><span style="color:#a50">`</span>); -</span></span><span style="display:flex;"><span> }); -</span></span><span style="display:flex;"><span> } -</span></span><span style="display:flex;"><span>}); -</span></span><span style="display:flex;"><span> -</span></span><span style="display:flex;"><span><span style="color:#aaa;font-style:italic">//Refresh the access token -</span></span></span><span style="display:flex;"><span><span style="color:#aaa;font-style:italic"></span><span style="color:#00a">const</span> refreshAccessToken = <span style="color:#00a">async</span> (user) =&gt; { -</span></span><span style="display:flex;"><span> <span style="color:#00a">const</span> body = <span style="color:#a50">&#39;grant_type=refresh_token&amp;refresh_token=&#39;</span> + user.refreshToken + <span style="color:#a50">&#39;&amp;client_id=&#39;</span> + config.oauthClientId + <span style="color:#a50">&#39;&amp;client_secret=&#39;</span> + config.oauthClientSecret; -</span></span><span style="display:flex;"><span> <span style="color:#00a">let</span> res = <span style="color:#00a">await</span> fetch(config.oauthUrl + <span style="color:#a50">&#34;/oauth/token&#34;</span>, { -</span></span><span style="display:flex;"><span> method: <span style="color:#a50">&#39;POST&#39;</span>, -</span></span><span style="display:flex;"><span> headers: { -</span></span><span style="display:flex;"><span> <span style="color:#a50">&#39;Content-Type&#39;</span>: <span style="color:#a50">&#39;application/x-www-form-urlencoded&#39;</span> -</span></span><span style="display:flex;"><span> }, -</span></span><span style="display:flex;"><span> body: body -</span></span><span style="display:flex;"><span> }); -</span></span><span style="display:flex;"><span> <span style="color:#00a">if</span> (res.ok) { -</span></span><span style="display:flex;"><span> <span style="color:#00a">return</span> <span style="color:#00a">await</span> res.json(); -</span></span><span style="display:flex;"><span> } <span style="color:#00a">else</span> { -</span></span><span style="display:flex;"><span> <span style="color:#00a">throw</span> <span style="color:#00a">new</span> <span style="color:#0aa">Error</span>(<span style="color:#a50">&#34;Could not refresh access token, please sign in again.&#34;</span>); -</span></span><span style="display:flex;"><span> } -</span></span><span style="display:flex;"><span>} -</span></span><span style="display:flex;"><span> -</span></span><span style="display:flex;"><span>app.use(<span style="color:#a50">&#39;/api&#39;</span>, require(<span style="color:#a50">&#39;./api&#39;</span>)); -</span></span><span style="display:flex;"><span>module.exports = app; -</span></span></code></pre></div><ol start="2"> -<li>Save the file.</li> -<li>To see the authentication working in practice, you can follow the instructions in the <a href="https://github.com/onshape-public/app-gltf-viewer#readme">glTF Viewer README</a> to deploy the glTF Viewer app.</li> -</ol> -<h3 id="6-grant-authorization">6: Grant authorization</h3> -<p>For apps published in the Onshape App Store, the Onshape user must grant authorization to your application to access the Onshape data. This must be done by each user of your app.</p> -<p>To grant the application access to a user&rsquo;s data in Onshape, the <em>Onshape user</em> must follow the steps below:</p> -<ol> -<li>Sign in to <code>cad.onshape.com</code>. -<ul> -<li>Note: Use <code>https://companyName.onshape.com</code> for Enterprise accounts. See <a href="#enterprise-users">Enterprise users</a> below for more information.</li> -</ul> -</li> -<li>Click their name in the top-right corner of the Onshape window, and then click <strong>My account</strong> in the dropdown menu. -</br><img src="https://onshape-public.github.io/images/myaccountdropdown.png" alt="drawing" width="300"/></li> -<li>Click <strong>Applications</strong> in the left sidebar. -<ul> -<li>Note that the gltf-viewer app will not appear in this list until it has been deployed and subscribed to as described in the <a href="https://github.com/onshape-public/app-gltf-viewer#readme">glTF Viewer README</a>.</li> -</ul> -</li> -<li>Click <strong>Grant</strong> next to your app name to grant it access to their Onshape data. The Onshape user can click <strong>Revoke</strong> at any time to prevent your app from accessing their Onshape data.</li> -<li>The user will see the Authorize application screen shown below and will need to confirm their authorization grant by clicking <strong>Authorize application</strong>. The user is then redirected to the Redirect URL you specified in your code. Your app can now access the user&rsquo;s Onshape resources and profile.</li> -</ol> -<h2 id="notes">Notes</h2> -<h3 id="installed-desktop-applications">Installed desktop applications</h3> -<p>OAuth is designed for interactions between two servers using a browser. However, it can also be used by an installed desktop (or mobile) application. The application must perform a similar role to that of a third party server: it must exchange the code for an access token structure.</p> -<p>To enable this, Onshape allows two special forms of redirect URI to be registered:</p> -<ul> -<li><code>http://localhost:&lt;port&gt;</code> Causes the browser to attempt to load a page from the host upon which it is running. The code parameter will be supplied exactly the same as outlined above. If the application can listen on the registered port and behave as a simple web server for the redirect URL, it can retrieve the code in the same way as a deployed web server.</li> -<li><code>urn:ietf:wg:oauth:2.0:oob</code> Causes the browser to display a simple page after a request has been granted instead of going to a new URL. The page contains simple instructions to copy and paste code into an application field. The browser will also update the title of the window to contain the code. An application could also look for browsers with window titles containing the string <code>Success code=&lt;code&gt;</code> and automatically grab the code from the browser window title. If an error occurs (e.g., the grant is denied), the browser window title will contain <code>Error description=&lt;error string&gt;</code>.</li> -</ul> -<h3 id="enterprise-users">Enterprise users</h3> -<p>When a user authorizes an OAuth app to access Onshape on their behalf, they get a bearer token that corresponds to their session and the allowed scopes.</p> -<p>However, if the user has a seat in the Enterprise, additional information is needed to determine whether to allow the bearer token to access enterprise data for the user or simply return non-enterprise data. We use the <code>companyId</code> field for this distinction.</p> -<p>There are two ways of setting the <code>companyId</code> correctly to access enterprise data:</p> -<ul> -<li>During the authorization process, select the name and URL of the enterprise instead of <code>cad.onshape.com</code>. This will correctly associate your bearer token with the <code>companyId</code>.</li> -<li>If you have an integrated app, call the <a href="https://cad.onshape.com/glassworks/explorer/#/Company/findCompany">Company/findCompany</a> endpoint to obtain the <code>companyId</code>. Append this <code>companyId</code> as a query parameter to the <code>/authorize</code> URL while initiating the OAuth workflow. (Note: you may be asked to authenticate yourself again.)</li> -</ul> -<h3 id="3rd-party-cookies">3rd-party cookies</h3> -<p>3rd-party cookies must be enabled in the browser for Onshape apps to work correctly.</p> -<h3 id="debugging">Debugging</h3> -<p>Debugging OAuth can be a little tricky. Some tips are below:</p> -<ol> -<li>Make sure you are correctly URL encoding the values supplied to the oauth/authorize and oauth/token endpoints.</li> -<li>Use a <code>GET /oauth/authorize</code> but a <code>POST /oauth/token</code> and make sure that the GET uses query parameters but that the <code>POST</code> uses a URL-encoded form body.</li> -<li>If you supply a <code>redirect_uri</code> to <code>/oauth/authorize</code>, you must also supply it as an additional parameter in the <code>POST</code> to <code>/oauth/token</code></li> -<li>Use a tool such as <a href="https://portswigger.net/burp">Burp</a> or <a href="http://charlesproxy.com">Charles</a> to deliberately &lsquo;man-in-the-middle&rsquo; the connection requests between your server and Onshape, and verify that you are performing the correct REST operations (GET vs. POST) and correctly URL-encoding the parameter values.</li> -</ol> -<h2 id="final-code">Final Code</h2> -<p>The above example uses Node.js to authenticate an Onshape app. This section includes the code for using OAuth2 with other coding languages.</p> -<h3 id="nodejs">Node.js</h3> -<p><strong>Prerequisites</strong></p> -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>npm install passport -</span></span><span style="display:flex;"><span>npm install passport-onshape -</span></span></code></pre></div><p><strong>Environment variables</strong></p> -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>authorizationURL : &lt;https://oauth.onshape.com/oauth/authorize&gt; -</span></span><span style="display:flex;"><span>tokenURL : &lt;https://oauth.onshape.com/oauth/token&gt; -</span></span><span style="display:flex;"><span>userProfileURL : &lt;https://cad.onshape.com/api/users/sessioninfo&gt; -</span></span></code></pre></div><p><strong>app.js</strong></p> -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-js" data-lang="js"><span style="display:flex;"><span><span style="color:#aaa;font-style:italic">//App definitions -</span></span></span><span style="display:flex;"><span><span style="color:#aaa;font-style:italic"></span><span style="color:#00a">const</span> path = require(<span style="color:#a50">&#39;path&#39;</span>); -</span></span><span style="display:flex;"><span><span style="color:#00a">const</span> uuid = require(<span style="color:#a50">&#39;uuid&#39;</span>); -</span></span><span style="display:flex;"><span> -</span></span><span style="display:flex;"><span><span style="color:#00a">const</span> express = require(<span style="color:#a50">&#39;express&#39;</span>); -</span></span><span style="display:flex;"><span><span style="color:#00a">const</span> session = require(<span style="color:#a50">&#39;express-session&#39;</span>); -</span></span><span style="display:flex;"><span><span style="color:#00a">const</span> bodyParser = require(<span style="color:#a50">&#39;body-parser&#39;</span>); -</span></span><span style="display:flex;"><span> -</span></span><span style="display:flex;"><span><span style="color:#00a">const</span> passport = require(<span style="color:#a50">&#39;passport&#39;</span>); -</span></span><span style="display:flex;"><span><span style="color:#00a">const</span> OnshapeStrategy = require(<span style="color:#a50">&#39;passport-onshape&#39;</span>); -</span></span><span style="display:flex;"><span> -</span></span><span style="display:flex;"><span><span style="color:#00a">const</span> config = require(<span style="color:#a50">&#39;./config&#39;</span>); -</span></span><span style="display:flex;"><span> -</span></span><span style="display:flex;"><span><span style="color:#aaa;font-style:italic">//Tell Express to use Passport, and initialize it. -</span></span></span><span style="display:flex;"><span><span style="color:#aaa;font-style:italic"></span><span style="color:#00a">const</span> app = express(); -</span></span><span style="display:flex;"><span> -</span></span><span style="display:flex;"><span>app.use(express.<span style="color:#00a">static</span>(path.join(__dirname, <span style="color:#a50">&#39;public&#39;</span>))); -</span></span><span style="display:flex;"><span>app.use(express.<span style="color:#00a">static</span>(path.join(__dirname, <span style="color:#a50">&#39;dist&#39;</span>))); -</span></span><span style="display:flex;"><span>app.use(bodyParser.json()); -</span></span><span style="display:flex;"><span> -</span></span><span style="display:flex;"><span>app.set(<span style="color:#a50">&#39;trust proxy&#39;</span>, <span style="color:#099">1</span>); <span style="color:#aaa;font-style:italic">// To allow to run correctly behind Heroku when deployed. -</span></span></span><span style="display:flex;"><span><span style="color:#aaa;font-style:italic"></span> -</span></span><span style="display:flex;"><span>app.use(session({ -</span></span><span style="display:flex;"><span> secret: config.sessionSecret, -</span></span><span style="display:flex;"><span> saveUninitialized: <span style="color:#00a">false</span>, -</span></span><span style="display:flex;"><span> resave: <span style="color:#00a">false</span>, -</span></span><span style="display:flex;"><span> cookie: { -</span></span><span style="display:flex;"><span> name: <span style="color:#a50">&#39;app-gltf-viewer&#39;</span>, -</span></span><span style="display:flex;"><span> sameSite: <span style="color:#a50">&#39;none&#39;</span>, -</span></span><span style="display:flex;"><span> secure: <span style="color:#00a">true</span>, -</span></span><span style="display:flex;"><span> httpOnly: <span style="color:#00a">true</span>, -</span></span><span style="display:flex;"><span> path: <span style="color:#a50">&#39;/&#39;</span>, -</span></span><span style="display:flex;"><span> maxAge: <span style="color:#099">1000</span> * <span style="color:#099">60</span> * <span style="color:#099">60</span> * <span style="color:#099">24</span> <span style="color:#aaa;font-style:italic">// 1 day -</span></span></span><span style="display:flex;"><span><span style="color:#aaa;font-style:italic"></span> } -</span></span><span style="display:flex;"><span>})); -</span></span><span style="display:flex;"><span>app.use(passport.initialize()); -</span></span><span style="display:flex;"><span>app.use(passport.session()); -</span></span><span style="display:flex;"><span> -</span></span><span style="display:flex;"><span><span style="color:#aaa;font-style:italic">//Store the Onshape user information -</span></span></span><span style="display:flex;"><span><span style="color:#aaa;font-style:italic"></span>passport.serializeUser((user, done) =&gt; done(<span style="color:#00a">null</span>, user)); -</span></span><span style="display:flex;"><span>passport.deserializeUser((obj, done) =&gt; done(<span style="color:#00a">null</span>, obj)); -</span></span><span style="display:flex;"><span> -</span></span><span style="display:flex;"><span><span style="color:#aaa;font-style:italic">//Initialize Passport with the Onshape Strategy -</span></span></span><span style="display:flex;"><span><span style="color:#aaa;font-style:italic"></span>passport.use(<span style="color:#00a">new</span> OnshapeStrategy({ -</span></span><span style="display:flex;"><span> clientID: config.oauthClientId, -</span></span><span style="display:flex;"><span> clientSecret: config.oauthClientSecret, -</span></span><span style="display:flex;"><span> callbackURL: config.oauthCallbackUrl, -</span></span><span style="display:flex;"><span> authorizationURL: <span style="color:#a50">`</span><span style="color:#a50">${</span>config.oauthUrl<span style="color:#a50">}</span><span style="color:#a50">/oauth/authorize`</span>, -</span></span><span style="display:flex;"><span> tokenURL: <span style="color:#a50">`</span><span style="color:#a50">${</span>config.oauthUrl<span style="color:#a50">}</span><span style="color:#a50">/oauth/token`</span>, -</span></span><span style="display:flex;"><span> userProfileURL: <span style="color:#a50">`</span><span style="color:#a50">${</span>config.oauthUrl<span style="color:#a50">}</span><span style="color:#a50">/api/users/sessioninfo`</span> -</span></span><span style="display:flex;"><span> }, -</span></span><span style="display:flex;"><span> (accessToken, refreshToken, profile, done) =&gt; { -</span></span><span style="display:flex;"><span> profile.accessToken = accessToken; -</span></span><span style="display:flex;"><span> profile.refreshToken = refreshToken; -</span></span><span style="display:flex;"><span> <span style="color:#00a">return</span> done(<span style="color:#00a">null</span>, profile); -</span></span><span style="display:flex;"><span> } -</span></span><span style="display:flex;"><span>)); -</span></span><span style="display:flex;"><span> -</span></span><span style="display:flex;"><span><span style="color:#aaa;font-style:italic">//Define the Onshape API endpoint -</span></span></span><span style="display:flex;"><span><span style="color:#aaa;font-style:italic"></span>app.use(<span style="color:#a50">&#39;/oauthSignin&#39;</span>, (req, res) =&gt; { -</span></span><span style="display:flex;"><span> <span style="color:#aaa;font-style:italic">/* These 5 lines are specific to the glTF Viewer sample app. You can replace them with the input for whatever Onshape endpoints you are using in your app. */</span> -</span></span><span style="display:flex;"><span> <span style="color:#00a">const</span> state = { -</span></span><span style="display:flex;"><span> docId: req.query.documentId, -</span></span><span style="display:flex;"><span> workId: req.query.workspaceId, -</span></span><span style="display:flex;"><span> elId: req.query.elementId -</span></span><span style="display:flex;"><span> }; -</span></span><span style="display:flex;"><span> req.session.state = state; -</span></span><span style="display:flex;"><span> <span style="color:#00a">return</span> passport.authenticate(<span style="color:#a50">&#39;onshape&#39;</span>, { state: uuid.v4(state) })(req, res); -</span></span><span style="display:flex;"><span>}, (req, res) =&gt; { -</span></span><span style="display:flex;"><span> -</span></span><span style="display:flex;"><span>}); -</span></span><span style="display:flex;"><span> -</span></span><span style="display:flex;"><span>app.use(<span style="color:#a50">&#39;/oauthRedirect&#39;</span>, passport.authenticate(<span style="color:#a50">&#39;onshape&#39;</span>, { failureRedirect: <span style="color:#a50">&#39;/grantDenied&#39;</span> }), (req, res) =&gt; { -</span></span><span style="display:flex;"><span> <span style="color:#aaa;font-style:italic">/* This code is specific to the glTF Viewer sample app. You can replace it with the input for whatever Onshape endpoints you are using in your app. */</span> -</span></span><span style="display:flex;"><span> res.redirect(<span style="color:#a50">`/?documentId=</span><span style="color:#a50">${</span>req.session.state.docId<span style="color:#a50">}</span><span style="color:#a50">&amp;workspaceId=</span><span style="color:#a50">${</span>req.session.state.workId<span style="color:#a50">}</span><span style="color:#a50">&amp;elementId=</span><span style="color:#a50">${</span>req.session.state.elId<span style="color:#a50">}</span><span style="color:#a50">`</span>); -</span></span><span style="display:flex;"><span>}); -</span></span><span style="display:flex;"><span> -</span></span><span style="display:flex;"><span><span style="color:#aaa;font-style:italic">//Handle denied access -</span></span></span><span style="display:flex;"><span><span style="color:#aaa;font-style:italic"></span>app.get(<span style="color:#a50">&#39;/grantDenied&#39;</span>, (req, res) =&gt; { -</span></span><span style="display:flex;"><span> res.sendFile(path.join(__dirname, <span style="color:#a50">&#39;public&#39;</span>, <span style="color:#a50">&#39;html&#39;</span>, <span style="color:#a50">&#39;grantDenied.html&#39;</span>)); -</span></span><span style="display:flex;"><span>}) -</span></span><span style="display:flex;"><span> -</span></span><span style="display:flex;"><span><span style="color:#aaa;font-style:italic">/** After landing on the home page, we check if a user had already signed in. If no user has signed in, we redirect the request to the OAuth sign-in page. If a user had signed in previously, we will attempt to refresh the access token of the user. After successfully refreshing the access token, we will simply take the user to the landing page of the app. If the refresh token request fails, we will redirect the user to the OAuth sign-in page again. */</span> -</span></span><span style="display:flex;"><span>app.get(<span style="color:#a50">&#39;/&#39;</span>, (req, res) =&gt; { -</span></span><span style="display:flex;"><span> <span style="color:#00a">if</span> (!req.user) { -</span></span><span style="display:flex;"><span> <span style="color:#00a">return</span> res.redirect(<span style="color:#a50">`/oauthSignin</span><span style="color:#a50">${</span>req._parsedUrl.search ? req._parsedUrl.search : <span style="color:#a50">&#34;&#34;</span><span style="color:#a50">}</span><span style="color:#a50">`</span>); -</span></span><span style="display:flex;"><span> } <span style="color:#00a">else</span> { -</span></span><span style="display:flex;"><span> refreshAccessToken(req.user).then((tokenJson) =&gt; { -</span></span><span style="display:flex;"><span> <span style="color:#aaa;font-style:italic">// Dereference the user object, and update the access token and refresh token in the in-memory object. -</span></span></span><span style="display:flex;"><span><span style="color:#aaa;font-style:italic"></span> <span style="color:#00a">let</span> usrObj = JSON.parse(JSON.stringify(req.user)); -</span></span><span style="display:flex;"><span> usrObj.accessToken = tokenJson.access_token; -</span></span><span style="display:flex;"><span> usrObj.refreshToken = tokenJson.refresh_token; -</span></span><span style="display:flex;"><span> <span style="color:#aaa;font-style:italic">// Update the user object in PassportJS. No redirections will happen here, this is a purely internal operation. -</span></span></span><span style="display:flex;"><span><span style="color:#aaa;font-style:italic"></span> req.login(usrObj, () =&gt; { -</span></span><span style="display:flex;"><span> <span style="color:#00a">return</span> res.sendFile(path.join(__dirname, <span style="color:#a50">&#39;public&#39;</span>, <span style="color:#a50">&#39;html&#39;</span>, <span style="color:#a50">&#39;index.html&#39;</span>)); -</span></span><span style="display:flex;"><span> }); -</span></span><span style="display:flex;"><span> }).<span style="color:#00a">catch</span>(() =&gt; { -</span></span><span style="display:flex;"><span> <span style="color:#aaa;font-style:italic">// Refresh token failed, take the user to OAuth sign in page. -</span></span></span><span style="display:flex;"><span><span style="color:#aaa;font-style:italic"></span> <span style="color:#00a">return</span> res.redirect(<span style="color:#a50">`/oauthSignin</span><span style="color:#a50">${</span>req._parsedUrl.search ? req._parsedUrl.search : <span style="color:#a50">&#34;&#34;</span><span style="color:#a50">}</span><span style="color:#a50">`</span>); -</span></span><span style="display:flex;"><span> }); -</span></span><span style="display:flex;"><span> } -</span></span><span style="display:flex;"><span>}); -</span></span><span style="display:flex;"><span> -</span></span><span style="display:flex;"><span><span style="color:#aaa;font-style:italic">//Refresh the access token -</span></span></span><span style="display:flex;"><span><span style="color:#aaa;font-style:italic"></span><span style="color:#00a">const</span> refreshAccessToken = <span style="color:#00a">async</span> (user) =&gt; { -</span></span><span style="display:flex;"><span> <span style="color:#00a">const</span> body = <span style="color:#a50">&#39;grant_type=refresh_token&amp;refresh_token=&#39;</span> + user.refreshToken + <span style="color:#a50">&#39;&amp;client_id=&#39;</span> + config.oauthClientId + <span style="color:#a50">&#39;&amp;client_secret=&#39;</span> + config.oauthClientSecret; -</span></span><span style="display:flex;"><span> <span style="color:#00a">let</span> res = <span style="color:#00a">await</span> fetch(config.oauthUrl + <span style="color:#a50">&#34;/oauth/token&#34;</span>, { -</span></span><span style="display:flex;"><span> method: <span style="color:#a50">&#39;POST&#39;</span>, -</span></span><span style="display:flex;"><span> headers: { -</span></span><span style="display:flex;"><span> <span style="color:#a50">&#39;Content-Type&#39;</span>: <span style="color:#a50">&#39;application/x-www-form-urlencoded&#39;</span> -</span></span><span style="display:flex;"><span> }, -</span></span><span style="display:flex;"><span> body: body -</span></span><span style="display:flex;"><span> }); -</span></span><span style="display:flex;"><span> <span style="color:#00a">if</span> (res.ok) { -</span></span><span style="display:flex;"><span> <span style="color:#00a">return</span> <span style="color:#00a">await</span> res.json(); -</span></span><span style="display:flex;"><span> } <span style="color:#00a">else</span> { -</span></span><span style="display:flex;"><span> <span style="color:#00a">throw</span> <span style="color:#00a">new</span> <span style="color:#0aa">Error</span>(<span style="color:#a50">&#34;Could not refresh access token, please sign in again.&#34;</span>); -</span></span><span style="display:flex;"><span> } -</span></span><span style="display:flex;"><span>} -</span></span><span style="display:flex;"><span> -</span></span><span style="display:flex;"><span>app.use(<span style="color:#a50">&#39;/api&#39;</span>, require(<span style="color:#a50">&#39;./api&#39;</span>)); -</span></span><span style="display:flex;"><span>module.exports = app; -</span></span><span style="display:flex;"><span> -</span></span><span style="display:flex;"><span><span style="color:#aaa;font-style:italic">//Use the access token in an Authorization header. -</span></span></span><span style="display:flex;"><span><span style="color:#aaa;font-style:italic"></span>makeOnshapeAPICall: <span style="color:#00a">async</span> (req, res) =&gt; { -</span></span><span style="display:flex;"><span> <span style="color:#00a">try</span> { -</span></span><span style="display:flex;"><span> <span style="color:#00a">const</span> apiUrl = <span style="color:#a50">&#34;https://cad.onshape.com/glassworks/explorer/#/Document/getDocuments&#34;</span>; <span style="color:#aaa;font-style:italic">//You can replace this with any Onshape API endpoint URL. -</span></span></span><span style="display:flex;"><span><span style="color:#aaa;font-style:italic"></span> <span style="color:#00a">const</span> resp = <span style="color:#00a">await</span> fetch(normalizedUrl, { headers: { Authorization: <span style="color:#a50">`Bearer </span><span style="color:#a50">${</span>req.user.accessToken<span style="color:#a50">}</span><span style="color:#a50">`</span> }}); -</span></span><span style="display:flex;"><span> <span style="color:#00a">const</span> data = <span style="color:#00a">await</span> resp.text(); -</span></span><span style="display:flex;"><span> <span style="color:#00a">const</span> contentType = resp.headers.get(<span style="color:#a50">&#39;Content-Type&#39;</span>); -</span></span><span style="display:flex;"><span> res.status(resp.status).contentType(contentType).send(data); -</span></span><span style="display:flex;"><span> } <span style="color:#00a">catch</span> (err) { -</span></span><span style="display:flex;"><span> res.status(<span style="color:#099">500</span>).json({ error: err }); -</span></span><span style="display:flex;"><span> } -</span></span><span style="display:flex;"><span> } -</span></span></code></pre></div><h3 id="python">Python</h3> -<p>This Python code only works on a local machine. To deploy the code, you can replace the Flask code with the web server of your choice.</p> -<p><strong>Prerequisites</strong></p> -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>pip3 install flask -</span></span><span style="display:flex;"><span>pip3 install requests_oauthlib -</span></span></code></pre></div><p><strong>app.py</strong></p> -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-py" data-lang="py"><span style="display:flex;"><span><span style="color:#00a">from</span> <span style="color:#0aa;text-decoration:underline">flask</span> <span style="color:#00a">import</span> Flask, request, redirect, session, url_for -</span></span><span style="display:flex;"><span><span style="color:#00a">from</span> <span style="color:#0aa;text-decoration:underline">flask.json</span> <span style="color:#00a">import</span> jsonify -</span></span><span style="display:flex;"><span><span style="color:#00a">from</span> <span style="color:#0aa;text-decoration:underline">requests_oauthlib</span> <span style="color:#00a">import</span> OAuth2Session -</span></span><span style="display:flex;"><span><span style="color:#00a">import</span> <span style="color:#0aa;text-decoration:underline">os</span> -</span></span><span style="display:flex;"><span> -</span></span><span style="display:flex;"><span>app = Flask(__name__) -</span></span><span style="display:flex;"><span>app.secret_key = <span style="color:#a50">b</span><span style="color:#a50">&#39;F</span><span style="color:#a50">\xf5\xe5\xc0\xbe\t</span><span style="color:#a50">g</span><span style="color:#a50">\x7f\xac\x89\x87</span><span style="color:#a50">e</span><span style="color:#a50">\xc2</span><span style="color:#a50">4</span><span style="color:#a50">\xe8</span><span style="color:#a50">m</span><span style="color:#a50">\x1c\xd9\xda\x96</span><span style="color:#a50">G,</span><span style="color:#a50">\x90</span><span style="color:#a50">i&#39;</span> -</span></span><span style="display:flex;"><span> -</span></span><span style="display:flex;"><span>os.environ[<span style="color:#a50">&#39;OAUTHLIB_INSECURE_TRANSPORT&#39;</span>] = <span style="color:#a50">&#34;1&#34;</span> -</span></span><span style="display:flex;"><span> -</span></span><span style="display:flex;"><span>client_id = &lt;Client ID of your application&gt; -</span></span><span style="display:flex;"><span>client_secret = &lt;Client Secret of your application&gt; -</span></span><span style="display:flex;"><span>authorization_base_url = <span style="color:#a50">&#34;https://oauth.onshape.com/oauth/authorize&#34;</span> -</span></span><span style="display:flex;"><span>token_url = <span style="color:#a50">&#34;https://oauth.onshape.com/oauth/token&#34;</span> -</span></span><span style="display:flex;"><span>redirect_url = <span style="color:#a50">&#34;http://localhost:5000&#34;</span> -</span></span><span style="display:flex;"><span> -</span></span><span style="display:flex;"><span><span style="color:#888">@app.route</span>(<span style="color:#a50">&#39;/&#39;</span>) -</span></span><span style="display:flex;"><span><span style="color:#00a">def</span> <span style="color:#0a0">home</span>(): -</span></span><span style="display:flex;"><span> onshape = OAuth2Session(client_id, redirect_uri=redirect_url) -</span></span><span style="display:flex;"><span> auth_url, state = onshape.authorization_url(authorization_base_url) -</span></span><span style="display:flex;"><span> session[<span style="color:#a50">&#39;oauth_state&#39;</span>] = state -</span></span><span style="display:flex;"><span> <span style="color:#00a">return</span> redirect(auth_url) -</span></span><span style="display:flex;"><span> -</span></span><span style="display:flex;"><span><span style="color:#888">@app.route</span>(<span style="color:#a50">&#39;/token&#39;</span>, methods=[<span style="color:#a50">&#34;GET&#34;</span>]) -</span></span><span style="display:flex;"><span><span style="color:#00a">def</span> <span style="color:#0a0">token</span>(): -</span></span><span style="display:flex;"><span> onshape = OAuth2Session(client_id, state=session[<span style="color:#a50">&#39;oauth_state&#39;</span>], redirect_uri=redirect_url) -</span></span><span style="display:flex;"><span> token = onshape.fetch_token(token_url, client_secret=client_secret, authorization_response=request.url) -</span></span><span style="display:flex;"><span> session[<span style="color:#a50">&#39;oauth_token&#39;</span>] = token -</span></span><span style="display:flex;"><span> <span style="color:#00a">return</span> redirect(url_for(<span style="color:#a50">&#39;.documents&#39;</span>)) -</span></span><span style="display:flex;"><span> -</span></span><span style="display:flex;"><span><span style="color:#888">@app.route</span>(<span style="color:#a50">&#39;/documents&#39;</span>, methods=[<span style="color:#a50">&#34;GET&#34;</span>]) -</span></span><span style="display:flex;"><span><span style="color:#00a">def</span> <span style="color:#0a0">documents</span>(): -</span></span><span style="display:flex;"><span> extra = { -</span></span><span style="display:flex;"><span> <span style="color:#a50">&#39;client_id&#39;</span>: client_id, -</span></span><span style="display:flex;"><span> <span style="color:#a50">&#39;client_secret&#39;</span>: client_secret, -</span></span><span style="display:flex;"><span> } -</span></span><span style="display:flex;"><span> onshape = OAuth2Session(client_id, token=session[<span style="color:#a50">&#39;oauth_token&#39;</span>], redirect_uri=redirect_url) -</span></span><span style="display:flex;"><span> session[<span style="color:#a50">&#39;oauth_token&#39;</span>] = onshape.refresh_token(token_url, **extra) -</span></span><span style="display:flex;"><span> <span style="color:#00a">return</span> jsonify(onshape.get(<span style="color:#a50">&#39;https://cad.onshape.com/api/v6/documents?q=Untitled&amp;ownerType=1&amp;sortColumn=createdAt&amp;sortOrder=desc&amp;offset=0&amp;limit=20&#39;</span>).json()) -</span></span><span style="display:flex;"><span> -</span></span><span style="display:flex;"><span><span style="color:#00a">if</span> __name__ == <span style="color:#a50">&#34;__main__&#34;</span>: -</span></span><span style="display:flex;"><span> app.run() -</span></span><span style="display:flex;"><span> -</span></span></code></pre></div>Docs: API Keyshttps://onshape-public.github.io/docs/auth/apikeys/Mon, 01 Jan 0001 00:00:00 +0000https://onshape-public.github.io/docs/auth/apikeys/ -<blockquote> -<p>📘 <strong>Note</strong></p> -<p>All applications submitted to the Onshape App Store (Onshape Apps) must follow the instructions on the <a href="https://onshape-public.github.io/docs/auth/oauth">OAuth2</a> page and use OAuth2 for authorization. Automation scripts (or applications not meant for the Onshape App Store) may use either OAuth2 or API Keys for authentication. OAuth2 allows applications to call Onshape APIs on behalf of the users of the application; API keys will only perform operations on behalf of the Onshape user who generated the API keys.</p> -</blockquote> -<h2 id="why-api-keys">Why API Keys?</h2> -<p>API keys are useful for small applications meant for personal use, allowing developers to avoid the overhead of the OAuth workflow. Creating an app is very easy with API keys: create an API key with the Developer Portal, set up a function to build your API key header as in the samples, and make your API calls! There&rsquo;s no need to deal with OAuth redirects or things like that.</p> -<p>We&rsquo;ve moved over to using API keys for authenticating requests instead of using cookies for several reasons.</p> -<ol> -<li>Security: Each request is signed with unique headers so that we can be sure it&rsquo;s coming from the right place.</li> -<li>OAuth: The API key system we&rsquo;re now using for HTTP requests is the same process developers follow when building full-blown OAuth applications; there&rsquo;s no longer a disconnect between the two.</li> -</ol> -<p>Once you create an API key, it will only be valid in the stack on which it was created. An API key created on the partner stack, for example, will not function on the production stack.</p> -<p>If you need information or have a question unanswered in this documentation, feel free to chat with us by sending an email to <a href="mailto:api-support@onshape.com">api-support@onshape.com</a> or by checking out the <a href="https://forum.onshape.com" target="_blank">forums</a>. If you are a member of the DevPartners group (see the Development help page for information) more detailed instructions and code examples are in the apikey sample repo.</p> -<h2 id="1-create-api-keys">1. Create API Keys</h2> -<ol> -<li>Go to <a href="https://dev-portal.onshape.com">https://dev-portal.onshape.com</a>.</li> -<li>In the left pane, click <code>API keys</code>.</li> -<li>Click the <code>Create new API key</code> button.</li> -<li>Select the desired permissions for your app.</li> -<li>Click the <code>Create API key</code> button. </br> -<img src="https://onshape-public.github.io/images/CreateNewAPIKey.png" alt="image"></li> -<li>Copy both the <strong>access key</strong> and <strong>secret key</strong> from the pop-up window, save them somewhere, then click the <code>Close</code> button. -</br><strong>IMPORTANT NOTE: You will not be able to find the secret key again, so save it somewhere safe!</strong></br> -<img src="https://onshape-public.github.io/images/APIKeySecretKey.png" alt="image"></li> -<li>The details for your application appear. </br> -<img src="https://onshape-public.github.io/images/DevPortalKeys.png" alt="image"></li> -<li>Now that you have a key pair, see <a href="#generating-a-request-signature">Generate a Request Signature</a> for information on signing your requests to use our API.</li> -</ol> -<p>Once you have your access key and secret, you will want to avoid giving others access to them, since they&rsquo;re tied directly to your personal Onshape account. Think of your API key as a username and password pair. Do not place them directly in the code for your application, especially if others might see it. The samples we provide here use a separate configuration file to contain this information, but there are other ways to keep the access key and secret safe, like setting them as environment variables.</p> -<h3 id="scopes">Scopes</h3> -<p>There are several scopes available for API keys (equivalent to OAuth scopes):</p> -<ul> -<li><code>OAuth2Read</code> - Read non-personal information (documents, parts, etc.)</li> -<li><code>OAuth2ReadPII</code> - Read personal information (name, email, etc.)</li> -<li><code>OAuth2Write</code> - Create and edit documents, etc.</li> -<li><code>OAuth2Delete</code> - Delete documents, etc.</li> -<li><code>OAuth2Purchase</code> - Authorize purchases from account</li> -</ul> -<h2 id="2-select-an-authentication-option">2. Select an Authentication Option</h2> -<p>Please select an option for authentication:</p> -<ul> -<li><a href="#local-authorization">Basic Authorization</a>: Lowest security. For local testing only.</li> -<li><a href="#request-signature">Request Signature</a>: Medium security. For testing and internal use.</li> -<li><a href="https://onshape-public.github.io/docs/auth/oauth">OAuth2</a>: Highest security. Required for all Onshape Apps.</li> -</ul> -<h2 id="basic-authorization">Basic Authorization</h2> -<p>For local testing, you can provide a basic authentication via your API Keys.</p> -<ol> -<li>Open your terminal and run the following command, replacing <code>ACCESS_KEY</code> and <code>SECRET_KEY</code> with the <strong>access key</strong> and <strong>secret key</strong> you created earlier. Remember to include the colon (<code>:</code>) between the keys. <em>You will receive a long, base-64-encoded string as output.</em> -<ul> -<li><strong>MacOS</strong>: -<pre tabindex="0"><code>printf ACCESS_KEY:SECRET_KEY | base64 -</code></pre></li> -<li><strong>Windows</strong>: -<pre tabindex="0"><code>powershell &#34;[convert]::ToBase64String([Text.Encoding]::UTF8.GetBytes(\&#34;ACCESS_KEY:SECRET_KEY\&#34;))&#34; -</code></pre></li> -</ul> -</li> -<li>Add the authorization header to your code, replacing <code>CREDENTIALS</code> with the string you receieved in Step 1: -<pre tabindex="0"><code>-H &#39;Authorization: Basic CREDENTIALS&#39; \ -</code></pre></li> -</ol> -<p>See our <a href="https://onshape-public.github.io/docs/api-intro/quickstart">Quick Start Guide</a> for an example of using Basic Authorization in an app.</p> -<h2 id="request-signature">Request Signature</h2> -<p>For additional security, you can include your API Keys as part of a request signature. This provides more security than the Basic Authorization above, but less security than OAuth2.</p> -<p>To ensure that a request is coming from you, we have a process for signing requests that you must follow for API calls to work. Everything is done via HTTP headers that you&rsquo;ll need to set:</p> -<ol> -<li><em>Date</em>: A standard date header giving the time of the request; must be accurate within <strong>5 minutes</strong> of request. Example: <code>Mon, 11 Apr 2016 20:08:56 GMT</code></li> -<li><em>On-Nonce</em>: A string that satisfies the following requirements (see the code for one possible way to generate it): -<ul> -<li>At least 16 characters</li> -<li>Alphanumeric</li> -<li>Unique for each request</li> -</ul> -</li> -<li><em>Authorization</em>: This is where the API keys come into play. You&rsquo;ll sign the request by implementing this algorithm: -<ul> -<li><strong>Input</strong>: Method, URL, On-Nonce, Date, Content-Type, AccessKey, SecretKey</li> -<li><strong>Output</strong>: String of the form: <code>On &lt;AccessKey&gt;:HmacSHA256:&lt;Signature&gt;</code></li> -<li><strong>Steps to generate the signature portion</strong>: -<ol> -<li>Parse the URL and get the following: -<ol> -<li>The path, e.g. <code>/api/documents</code> (no query params!)</li> -<li>The query string, e.g. <code>a=1&amp;b=2</code> -<ul> -<li>NOTE: If no query paramaters are present, use an empty string</li> -</ul> -</li> -</ol> -</li> -<li>Create a string by appending the following information in order. Each field should be separated by a newline (<code>\n</code>) character, and the string must be converted to lowercase: -<ol> -<li>HTTP method</li> -<li>On-Nonce header value</li> -<li>Date header value</li> -<li>Content-Type header value</li> -<li>URL pathname</li> -<li>URL query string</li> -</ol> -</li> -<li>Using SHA-256, generate an <a href="https://en.wikipedia.org/wiki/Hash-based_message_authentication_code" target="_blank">HMAC digest</a>, using the API secret key first and then the above string, then encode it in Base64.</li> -<li>Create the <code>On &lt;AccessKey&gt;:HmacSHA256:&lt;Signature&gt;</code> string and use that in the Authorization header in your request.</li> -</ol> -</li> -</ul> -</li> -</ol> -<p>Below is an example function to generate the authorization header, using Node.js&rsquo;s standard <code>crypto</code> and <code>url</code> libraries:</p> -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-js" data-lang="js"><span style="display:flex;"><span><span style="color:#aaa;font-style:italic">// ...at top of file -</span></span></span><span style="display:flex;"><span><span style="color:#aaa;font-style:italic"></span><span style="color:#00a">var</span> u = require(<span style="color:#a50">&#39;url&#39;</span>); -</span></span><span style="display:flex;"><span><span style="color:#00a">var</span> crypto = require(<span style="color:#a50">&#39;crypto&#39;</span>); -</span></span><span style="display:flex;"><span> -</span></span><span style="display:flex;"><span><span style="color:#aaa;font-style:italic">/** -</span></span></span><span style="display:flex;"><span><span style="color:#aaa;font-style:italic">* Generates the &#34;Authorization&#34; HTTP header for using the Onshape API -</span></span></span><span style="display:flex;"><span><span style="color:#aaa;font-style:italic">* -</span></span></span><span style="display:flex;"><span><span style="color:#aaa;font-style:italic">* @param {string} method - Request method; GET, POST, etc. -</span></span></span><span style="display:flex;"><span><span style="color:#aaa;font-style:italic">* @param {string} url - The full request URL -</span></span></span><span style="display:flex;"><span><span style="color:#aaa;font-style:italic">* @param {string} nonce - 25-character nonce (generated by you) -</span></span></span><span style="display:flex;"><span><span style="color:#aaa;font-style:italic">* @param {string} authDate - UTC-formatted date string (generated by you) -</span></span></span><span style="display:flex;"><span><span style="color:#aaa;font-style:italic">* @param {string} contentType - Value of the &#34;Content-Type&#34; header; generally &#34;application/json&#34; -</span></span></span><span style="display:flex;"><span><span style="color:#aaa;font-style:italic">* @param {string} accessKey - API access key -</span></span></span><span style="display:flex;"><span><span style="color:#aaa;font-style:italic">* @param {string} secretKey - API secret key -</span></span></span><span style="display:flex;"><span><span style="color:#aaa;font-style:italic">* -</span></span></span><span style="display:flex;"><span><span style="color:#aaa;font-style:italic">* @return {string} Value for the &#34;Authorization&#34; header -</span></span></span><span style="display:flex;"><span><span style="color:#aaa;font-style:italic">*/</span> -</span></span><span style="display:flex;"><span><span style="color:#00a">function</span> createSignature(method, url, nonce, authDate, contentType, accessKey, secretKey) { -</span></span><span style="display:flex;"><span> <span style="color:#00a">var</span> urlObj = u.parse(url); -</span></span><span style="display:flex;"><span> <span style="color:#00a">var</span> urlPath = urlObj.pathname; -</span></span><span style="display:flex;"><span> <span style="color:#00a">var</span> urlQuery = urlObj.query ? urlObj.query : <span style="color:#a50">&#39;&#39;</span>; <span style="color:#aaa;font-style:italic">// if no query, use empty string -</span></span></span><span style="display:flex;"><span><span style="color:#aaa;font-style:italic"></span> -</span></span><span style="display:flex;"><span> <span style="color:#00a">var</span> str = (method + <span style="color:#a50">&#39;\n&#39;</span> + nonce + <span style="color:#a50">&#39;\n&#39;</span> + authDate + <span style="color:#a50">&#39;\n&#39;</span> + contentType + <span style="color:#a50">&#39;\n&#39;</span> + -</span></span><span style="display:flex;"><span> urlPath + <span style="color:#a50">&#39;\n&#39;</span> + urlQuery + <span style="color:#a50">&#39;\n&#39;</span>).toLowerCase(); -</span></span><span style="display:flex;"><span> -</span></span><span style="display:flex;"><span> <span style="color:#00a">var</span> hmac = crypto.createHmac(<span style="color:#a50">&#39;sha256&#39;</span>, secretKey) -</span></span><span style="display:flex;"><span> .update(str) -</span></span><span style="display:flex;"><span> .digest(<span style="color:#a50">&#39;base64&#39;</span>); -</span></span><span style="display:flex;"><span> -</span></span><span style="display:flex;"><span> <span style="color:#00a">var</span> signature = <span style="color:#a50">&#39;On &#39;</span> + accessKey + <span style="color:#a50">&#39;:HmacSHA256:&#39;</span> + hmac; -</span></span><span style="display:flex;"><span> <span style="color:#00a">return</span> signature; -</span></span><span style="display:flex;"><span>} -</span></span></code></pre></div><h3 id="redirects">Redirects</h3> -<p>Some API endpoints return 307 redirects. You must generate an Authorization header for the redirect as well, but please note that the server portion of the URL might be different, the redirect URL may contain query parameters that must be encoded in the Authorization header, etc.</p> \ No newline at end of file +Authentication onhttps://onshape-public.github.io/docs/auth/Recent content in Authentication onHugoen-usMon, 18 May 2020 20:39:14 -0400OAuthhttps://onshape-public.github.io/docs/auth/oauth/Mon, 18 May 2020 20:39:14 -0400https://onshape-public.github.io/docs/auth/oauth/See the gltf-viewer-app for a working example of OAuth2. +📘 Note +All applications submitted to the Onshape App Store (Onshape Apps) must use OAuth2 for authorization. Automation scripts (or applications not meant for the Onshape App Store) may use either OAuth2 or API Keys for authentication. OAuth2 allows applications to call Onshape APIs on behalf of the users of the application; API keys will only perform operations on behalf of the Onshape user who generated the API keys.API Keyshttps://onshape-public.github.io/docs/auth/apikeys/Mon, 01 Jan 0001 00:00:00 +0000https://onshape-public.github.io/docs/auth/apikeys/📘 Note +All applications submitted to the Onshape App Store (Onshape Apps) must follow the instructions on the OAuth2 page and use OAuth2 for authorization. Automation scripts (or applications not meant for the Onshape App Store) may use either OAuth2 or API Keys for authentication. OAuth2 allows applications to call Onshape APIs on behalf of the users of the application; API keys will only perform operations on behalf of the Onshape user who generated the API keys. \ No newline at end of file diff --git a/docs/auth/oauth/index.html b/docs/auth/oauth/index.html index d6af3a0..c0a35fd 100644 --- a/docs/auth/oauth/index.html +++ b/docs/auth/oauth/index.html @@ -1,14 +1,12 @@ -OAuth | OAuth |

    OAuth

    See the gltf-viewer-app for a working example of OAuth2.

    📘 Note

    All applications submitted to the Onshape App Store (Onshape Apps) must use OAuth2 for authorization. Automation scripts (or applications not meant for the Onshape App Store) may use either OAuth2 or API Keys for authentication. OAuth2 allows applications to call Onshape APIs on behalf of the users of the application; API keys will only perform operations on behalf of the Onshape user who generated the API keys.

    What is OAuth2?

    The OAuth (Open authorization) protocol was developed by the Internet Engineering Task Force, an open standards organization that develops and promotes voluntary Internet standards (particularly the technical standards that comprise the Internet protocol suite) to enable secure, delegated access to an application’s resources.

    The OAuth2 protocol enables an application to access a resource that is under the control of someone else. In order to access that resource, a token is required. The token represent the delegated rights of access (that is, what rights this application has, such as read/write/update, scope, rights to different resources, and more).

    This means the application can be accessed by a third-party system without that system +All applications submitted to the Onshape App Store (Onshape Apps) must use OAuth2 for authorization. Automation scripts (or applications not meant for the Onshape App Store) may use either OAuth2 or API Keys for authentication. OAuth2 allows applications to call Onshape APIs on behalf of the users of the application; API keys will only perform operations on behalf of the Onshape user who generated the API keys.">

    OAuth

    See the gltf-viewer-app for a working example of OAuth2.

    📘 Note

    All applications submitted to the Onshape App Store (Onshape Apps) must use OAuth2 for authorization. Automation scripts (or applications not meant for the Onshape App Store) may use either OAuth2 or API Keys for authentication. OAuth2 allows applications to call Onshape APIs on behalf of the users of the application; API keys will only perform operations on behalf of the Onshape user who generated the API keys.

    What is OAuth2?

    The OAuth (Open authorization) protocol was developed by the Internet Engineering Task Force, an open standards organization that develops and promotes voluntary Internet standards (particularly the technical standards that comprise the Internet protocol suite) to enable secure, delegated access to an application’s resources.

    The OAuth2 protocol enables an application to access a resource that is under the control of someone else. In order to access that resource, a token is required. The token represent the delegated rights of access (that is, what rights this application has, such as read/write/update, scope, rights to different resources, and more).

    This means the application can be accessed by a third-party system without that system impersonating the user that controls the resource.

    A good analogy is the hotel check-in process. When you arrive at the front desk of a hotel, you provide an ID and a form of payment. Then, you are given a key card that opens a specific door. When you reach that door, you swipe your key card and are granted access. The door itself doesn’t know who you are or anything about you, it just knows that the key card was encoded correctly, and it allows you access. At some point, the key card expires, and the door no longer lets you into the room. This is the same for access tokens in the OAuth2 flow.

    With the OAuth2 protocol, you register your application with the third party, and you are given a set of keys. These keys get exchanged for an access token that grants you access to resources in the third-party application. The token expires regularly; you miust get a new token to access the application again. For this, you are provided with a refresh token. Sending the refresh token to the authentication server updates your access token and gives you a new refresh token.

    api token request diagram

    OAuth2 & Onshape

    The first step in the OAuth flow is for the Onshape user to request that Onshape let the third-party application access Onshape.

    Once the user has authorized the application, they are redirected to a predefined URL (called a redirect URL) with a code that will requests an access token from Onshape. Therefore, the redirect URL should contain a script that can capture the authorization code.

    You will use the access token to authenticate requests to the Onshape API. The token expires after preset amount of time. To get a new valid access token after one has expired, you must use the refresh token to request a new access token. Refreshing the access token also provides you with an updated refresh token to use in the next refresh access token request. Make sure to store both the the access token and the refresh token, and update them with each refresh of the token. The authorization token must accompany any call to the API, this is done by adding the token to an Authorization field in the header of each request:

    Authorization: Bearer <accessToken>
     

    If correctly authenticated, most responses from the REST API call return JSON data (though some return binary data), with an HTTP response code of 200 Success, 204 - No Content, or 301 - Permanent Redirect. 301 responses will include a redirect for you to follow.

    In the event that the authorization code is incorrect (for instance, if it expired), you will receive an HTTP 401 response. This response means that the client request has not been completed, since it lacks valid authentication credentials for the requested resource. In this event, your code for each call to the REST API should include a catch clause for a 401 exception. Once caught, you can refresh the token and make the request again. Pay close attention to the Content-Type header for what data to parse and expect.

    When integrating with Onshape, OAuth tokens give third-party applications (such as desktop applications or web services) access to users’ data as defined by the permissions scope (such as users’ documents or profile information). Using OAuth terminology, Onshape acts as both the authorization and resource server, while the desktop or web-based application is the client. Resource owners have the option of granting or denying access to applications.

    Once obtained, an OAuth token will work for third-party APIs under /api. Do NOT attempt to use an OAuth token to fetch the URLs typically displayed in a web browsers location bar.

    More resources

    • Digital Ocean - A good resource for learning more about OAuth2.
    • RFC 6749 - The reference for the OAuth framework as a whole. Most of this document describes how to implement the OAuth exchanges described by the reference within the context of Onshape and client applications.
    • RFC 6750 - Describes the exchange of OAuth access tokens between clients and OAuth servers.

    Implement OAuth2

    This OAuth tutorial demonstrates how to recreate the authentication process in Node.js found in the gltf-viewer-app sample code. The final code in Node.js and other languages can be found at the end of this page.

    1: Register the app

    1. Navigate to https://dev-portal.onshape.com/signin and sign in.
    2. In the left sidebar, click OAuth applications.
    3. Click the Create new OAuth application button.
    4. Fill out the form as follows:
      • Name: gltf-viewer-yourname
        • The application name to display to users.
        • Should include the name of your company to differentiate it from other possibly similar applications.
      • Primary format: com.yourname.gltf-viewer
        • String that uniquely identifies your application and is a marker for the data it might store on Onshape servers.
        • Cannot be changed after the application is registered.
      • Summary: Onshape OAuth tutorial
        • Description of your application.
        • Displayed to the user when they’re asked to grant the application permission to access their data.
      • Redirect URLs: http://localhost:5000/token
        • Your application must specify at least one URL used in the OAuth protocol exchanges.
        • This URL must also use SSL (a URL that begins with https), with two exceptions applicable for installed desktop applications: http://localhost:<port> and urn:ietf:wg:oauth:2.0:oob.
        • e.g., https://app-gltf-viewer-yourname-c11f263794bc.herokuapp.com/oauthRedirect
      • Admin team: No Team
        • Optional.
        • If defined, members of the team can make changes to the definition of this OAuth application.
        • See the Help Docs: Teams page for more information on creating teams in Onshape.
      • OAuth URL: none
        • Should contain the URL of your deployed application.
        • This is the first URL called from the Onshape Applications page.
        • The page hosted at this URL should handle the OAuth authentication. Once your application’s server has been authenticated on behalf of the user, that user should be redirected to your applications content.
        • If you have not deployed your app yet, you can leave this field blank (as shown in this example) for local work and update it later.
        • e.g., https://app-gltf-viewer-yourname-c11f263794bc.herokuapp.com/oauthSignin
      • Settings: check Supports collaboration
      • Permissions:
        • This is also called application scope, and it defines what access rights your application has to the user’s data.
        • Application can read your profile information - Enable your application to access the Onshape user profile. Check this option.
        • Application can read your documents - Onshape documents created by this user can be accessed with read privileges only. Check this option.
        • Application can write to your documents - The user-owned Onshape documents can be modified by this application. Check this option.
        • Application can delete documents and workspaces - Your application will be able to delete a workspace within a document or the complete Onshape document. Do not check this option for this example.
        • Application can request Purchases on Your behalf - The application will have access to make purchases if required. Do not check this option for this example.
        • Application can share and unshare documents on your behalf - Onshape’s document sharing capabilities are very powerful; they enable other parties to access your shared documents with @@ -337,4 +335,4 @@ if __name__ == "__main__": app.run() -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/docs/changelog/index.html b/docs/changelog/index.html index 48a4b41..4fc3bae 100644 --- a/docs/changelog/index.html +++ b/docs/changelog/index.html @@ -1,4 +1 @@ -Changelog |

    Changelog

    rel-1.185 - released 2024-08-12

    • Updated all endpoints that return a user summary (createdBy, modifiedBy) have a new boolean property isOnshapeSupport for use to separate Onshape support employee activities.
    • Updated all bodyDetails, tessellatededged, and tessellatedfaces endpionts (parts and Part Studios) to include errorEnum vales for detecting new mate position, curve pattern and Simulation material checks.

    rel-1.184 - released 2024-07-19

    • Updated API version to V8, (https://cad.onshape.com/api/versions), A new microversion will not be created when a document restore operation results in a no-op.
    • Remove inconsistencies in assembly definition endpoint (/assemblies/d/[did]/[wvm]/[wvmid]/e/[eid]) related to configuration parameters
    • Update all translation endpoints (POST : ../translations) to include new request property useFileNameToSetSinglePartName
    • Update all revision endpoints (GET : /revisions/..) to include response property canChangeType (supporting new admin option to change type part, assembly, file, etc)
    • Update GET : /users/[:uid]/settings endpoint to include responses for highlightLaminarEdges and perspectiveModeOn for default status

    rel-1.183 - released 2024-06-28

    • Added new V7 version to the api (https://cad.onshape.com/api/versions)
    • Updated GET : V7/partstudios/d/[did]/[wvm]/[wvmid]/e/[eid]/sketches to return fully defined status (UNDERDEFINED, WELL_DEFINED, OVERDEFINED, UNKNOWN)
    • Updated GET : V7/partstudios/d/[did]/[wvm]/[wvmid]/e/[eid]/sketches vectors are now maps instead of arrays, and may be BTVector2d or BTVector3d depending on the output3D parameter
    • Updated GET : V7/partstudios/d/[did]/[wvm]/[wvmid]/e/[eid]/sketches to use more consistent naming:
    Fields
    sketch -> name
    sketchId -> featureId
    transformMatrix -> sketchMatrix
    featuresUsed -> featuresUsingSketch
    geomEntities -> entities
    • Updated GET : /variables endpoint to return variable description when variable is set through custom feature
    • Updated POST : /webhooks endpoint to default to isTransient = true if not specified (auto cleanup)
    • Updated descriptions for Assembly, Documents, Metadata, Parts, Part Studios, Revisions, Variables and Versions enddpoints

    rel-1.182 - released 2024-06-07

    • Updated descriptions for webhooks endpoints

    rel-1.181 - released 2024-05-17

    • Update Document, Assembly, Blob, Drawing and Part Studio translation POST endpoints to have a new request body property occurancesToExport
    • Update to /elements endpoint summary and descriptions in Glassworks
    • Updated documentation for webhooks (https://onshape-public.github.io/docs/app-dev/webhook/)

    rel-1.180 - released 2024-04-26

    rel-1.179 - released 2024-04-05

    • New drawing views list endpoint GET : /appelements/[:did]/[:wvm]/[:wvmid]/e/[:eid]/views
    • New drawing view endpoint GET : /appelements/[:did]/[:wvm]/[:wvmid]/e/[:eid]/views/[:viewid]/jsongeometry
    • New updated features endpoint documentation
    • Updated glassworks for all metadata endpoints to reference developer documentation
    • Added description of output to schema for Metadata APIs
    • Updated translation endpoints with new request property specifyMaterialData

    rel-1.178 - released 2024-03-15

    • Update Part Studio translation POST endpoint to have a new request body property importMaterialDensity
    • Update active workflow endpost GET: /workflow/active to have a new response property hasInactiveCustomWorkflows
    • Updated authorization (OAuth2 and BasicAuth) for publication endpoints
    • Various updates to descriptions of data types and query parameters
    • Fixed delete publication endpoint (HTTP::200 now removes publication)

    rel-1.177 - released 2024-02-23

    • Updated translation endpoints with new request property useIGESImportPostProcessing
    • Updated translation endpoints with modified request property stepParasolidPreprocessingOption
    • Updated descriptions for metadata | releasepackages for property propertyOverrideStatus

    rel-1.176 - released 2024-02-02

    • New create publication endpoint POST : /publications
    • New update publication endpoint POST: /publications/[:pid]
    • New delete publication endpoint DELETE: /publications/[:pid]
    • New create publication item endpoint POST : /publications/item
    • New update publication item endpoint POST: /publications/item/[:iid]
    • New delete publication item endpoint DELETE: /publications/item/[:iid]

    rel-1.175 - released 2024-01-12

    • Exclude suppressed sub assemblies from rootAssembly occurrences for GET: /assemblies/d/[did]/[wvm]/[wvmid]/e/[eid]

    rel-1.174 - released 2023-12-15

    • Add microversion id the extension url [$microversionId]
    • Updated translation endpoints with new request property pdfVersion
    • Fixed issue with bodydetails endpoints always returning isInner and isOuter the same
    • Update all endpoints for bodydetails | tessellatededges | tessellatedfaces | featurescript to include new response body errorEnum:
    errorEnum
    BODY_DRAFT_STRAY_NONMITER_EDGES
    MASS_PROPERTY_FACES_NOT_COPLANAR
    PARAMETER_VALUE_INVALID
    SHEET_METAL_CHAMFER_NO_TANGENT_BASED
    CHAMFER_DIRECTION_OVERRIDE_NO_EFFECT
    FILLET_CHAMFER_UNSUPPORTED
    CHAMFER_HELD_BACK
    SWEEP_BAD_LOCK_DIRECTION
    SHEET_METAL_COUNTER_HOLE_UNSUPPORTED
    SWEEP_SELECT_DIRECTION
    • Update all endpoints for bodydetails | tessellatededges | tessellatedfaces | featurescript to include new property imageForeignId
    • Support sending a list of emails to POST : /classrooms/[cid]/members

    rel-1.173 - released 2023-11-28

    • Update all classroom endpoints (/classrooms/) to support OAuth
    • Add description of output to schema for getAssemblyShadedViews API

    rel-1.172 - released 2023-11-06

    • Update all endpoints for bodydetails | tessellatededges | tessellatedfaces | featurescript to include new response body errorEnum:
    errorEnum
    FIT_TOLERANCE_LIMITS_NOT_FOUND
    FIT_TOLERANCE_SIZE_TOO_LARGE_ISO
    FIT_TOLERANCE_SIZE_TOO_LARGE_ANSI
    OFFSET_WIRE_SHEET_CREATION_FAILED
    REPLACE_FACE_SHEET_SMALL
    REPLACE_FACES_NOT_ADJACENT
    SHEET_METAL_HOLE_REBUILD_FAILED
    CPLANE_TANGENT_INPUT
    CPLANE_TANGENT_SELECT_REFERENCE
    CNE_TANGENT_PLANE_INVALID
    CPLANE_TANGENT_POINT_INVALID
    REPLACE_FACES_NOT_SAME_BODY
    MUST_USE_DEFAULT_RADIUS_WITH_FACE_BEND
    CANNOT_RIP_A_FACE_BEND
    CANNOT_MAKE_A_FACE_BEND_TANGENT
    • References to API Guide for endpoint descriptions in Glassworks

    rel-1.171 - released 2023-10-13

    • Update all translation POST endpoints to have a new request body properties hideInspectionItems and textOption
    • Replaced GET : /releasepackages/companyreleaseworkflow | /workflow/active property canCurrentUserSyncVersionsToArena with canCurrentUserSyncStandardContentToArena
    • Updated GET and POST : /tabletemplates endpoint with new response property valueType
    • Comprehensive update to remaining endpoint summary and descriptions in Glassworks

    rel-1.170 - released 2023-09-22

    • New appelements delete subelement endpoint DELETE : /appelements/d/[did]/[wvm]/[wvmid]/e/[eid]/content/subelements
    • New company add new user endoint POST : /companies/[cid]/users
    • New company update user endoint POST : /companies/[cid]/users/[uid]
    • New company delete user endoint DELETE : /companies/[cid]/users/[uid]
    • Comprehensive update to remaining endpoint summary and descriptions in Glassworks

    rel-1.169 - released 2023-09-01

    • Comprehensive update to most endpoint summary and descriptions in Glassworks
    • Update all translation endpoints to include new property importAppearances
    • Update POST : /partstudios/d/[did]/[wvm]/[wvmid]/e/[eid]/featurescript has a new property expressionErrorInfo
    • Update GET and POST : /releasepackages/[rpid] property workflow/actions has a new enum value REASSIGN_TASK

    rel-1.168 - released 2023-08-11

    • Deprecated POST : /api/drawings/create -> Replaced with POST : /api/drawings/d/[did]/w/w/[wid]/create
    • Update GET : /api/documents endpoint has a new property publishedVersion
    • Update GET and POST : /api/releasepackages/[rpid] has a new property syncedWithPLM

    rel-1.167 - released 2023-07-21

    • Update glTF translation endpoints to use new field useGltfCompression (bool)
    • Update STEP translation endpoints to use new field stepParasolidPreprocessingOption (0-None, 1-Advanced, 2-Automatic, 3-Basic)
    • Update GET : /api/documents | /api/documents/[did] | /api/companies/[cid]/documentsbyname to include new field forceExportRules

    rel-1.165 - released 2023-06-12

    • Support partId array string for GET : /api/partstudios/bodydetails endpoint for the option of getting a subset of parts from a partstudio (empty = all parts)

    rel-1.163 - released 2023-04-28

    • Update documentation for the Documents endpoint (/api/documents)
    • Update Releasepackage endpoint GET : /api/releasepackage to include type to understand action (ie. Approve vs Reject)
    • Update API to V6 - Fix a bug in how updating the JSON tree of an app element in a transaction returns the diff

    rel-1.162 - released 2023-04-12

    • New Assembly modify endpoint POST : /api/assemblies/d/{did}/w/{wid}/e/{eid}/modify for bulk deletion and suppression of instances and features

    rel-1.161 - released 2023-03-20

    • New BOM templates endpoint (/api/tabletemplates)
    • Support POST /api/webhooks parameter isTransient = true to specify auto cleanup after a set number of days

    rel-1.160 - released 2023-02-24

    • Support configuratons for GET : /api/partstudios/d/{did}/{wvm}/{wvmid}/e/{eid}/features
    • Remove deprecated GET : /api/elements/:emid
    • Remove deprecated GET and POST : /api/elements/d/:did/[wvm]/:wvmid/e/:eid/metadata
    • Deprecated GET and POST : /api/parts/standardcontent/d/:did/v/:vid/e/:eid/[cu]/:cuid/partid/:pid/metadata
    • Deprecated GET and POST : /api/parts/d/:did/[wvm]/:wmvid/e/:eid/partid/:pid/metadata

    rel-1.158 - released 2023-01-11

    • New example values in Glassworks API documentation

    rel-1.155 - released 2022-11-01

    • Support Parasolid binary (x_b) exports

    rel-1.154 - released 2022-10-10

    • Add face color, hidden state and type of composite to body details endpoint

    rel-1.152 - released 2022-08-30

    • Support more parameters to filter the partstudio endpoint

    rel-1.147 - released 2022-05-16

    • Support global tree node endpoint for impacting recently opened filter

    rel-1.146 - released 2022-04-25

    • Support API versioning
    • Return ‘nodeId’ when adding or updating an AppElement

    rel-1.145 - released 2022-04-05

    • Fixed issue where assembly feature errors were missing

    rel-1.140 - released 2021-12-15

    • Add mass properties for assemblies

    rel-1.139 - released 2021-11-15

    • Relax casing search in Glassworks (Swagger client)
    • BOM and Metadata API endpoint responses now matched

    rel-1.138 - released 2021-10-25

    • Updated webhook documentation

    rel-1.135 - released 2021-8-20

    • Webhook events for Enterprise SSO configuration changes

    rel-1.134 - released 2021-07-30

    • Support comment events (add, update, delete) for the web-hook endpoint

    rel-1.131 - released 2021-06-01

    • Add synchronous glTF/gLB endpoint for assemblies

    rel-1.128 - released 2021-03-29

    • Support face color for export of glTF/gLB
    • Add document API endpoint for comments

    rel-1.127 - released 2021-03-08

    • Add translation option dtkPeriodicFacesPolicy=3 for CATIA parts

    rel-1.126 - released 2021-02-12

    • Add GLTF and GLB accepts option to the tessellation APIs

    rel-1.125 - released 2021-01-25

    • Add ‘good/better/best’ quality query parameters to tessellation endpoint

    rel-1.122 - released 2020-11-18

    • Enforce OAuth endpoint rate limiting
    • Add release package action/transition based webhooks

    rel-1.119 - released 2020-09-15

    • Add rollback bar to EvalFeatureScript endpoint

    rel-1.118 - released 2020-08-25

    • PartStudio GET support for sketch constraints in features endpoint

    rel-1.116 - released 2020-07-15

    • Specify starting elements to create document endpoint

    rel-1.114 - released 2020-06-03

    • Project endpoints

    rel-1.113 - released 2020-05-11

    • Output GLTF files for an element (tab)

    rel-1.111 - released 2020-03-31

    • Support ownership transfer for teams

    rel-1.110 - released 2020-03-09

    • Add support for exploded views

    rel-1.108 - released 2020-01-29

    • Drawings endpoints for create 4 view, get view geometry and view definition

    rel-1.102 - released 2019-09-11

    • Added webhook events for release management
    • Added webhook event for document version creation

    rel-1.99 - released 2019-07-08

    • Assembly BOM API support for items

    rel-1.96 - released 2019-05-03

    • Part Studio compare endpoint

    rel-1.93 - released 2019-03-01

    • Webhook subscriptions for a company

    rel-1.86 - released 2018-09-28

    • Export Drawings to DXF, DWG and PDF
    \ No newline at end of file +Changelog |

    Changelog

    rel-1.185 - released 2024-08-12

    • Updated all endpoints that return a user summary (createdBy, modifiedBy) have a new boolean property isOnshapeSupport for use to separate Onshape support employee activities.
    • Updated all bodyDetails, tessellatededged, and tessellatedfaces endpionts (parts and Part Studios) to include errorEnum vales for detecting new mate position, curve pattern and Simulation material checks.

    rel-1.184 - released 2024-07-19

    • Updated API version to V8, (https://cad.onshape.com/api/versions), A new microversion will not be created when a document restore operation results in a no-op.
    • Remove inconsistencies in assembly definition endpoint (/assemblies/d/[did]/[wvm]/[wvmid]/e/[eid]) related to configuration parameters
    • Update all translation endpoints (POST : ../translations) to include new request property useFileNameToSetSinglePartName
    • Update all revision endpoints (GET : /revisions/..) to include response property canChangeType (supporting new admin option to change type part, assembly, file, etc)
    • Update GET : /users/[:uid]/settings endpoint to include responses for highlightLaminarEdges and perspectiveModeOn for default status

    rel-1.183 - released 2024-06-28

    • Added new V7 version to the api (https://cad.onshape.com/api/versions)
    • Updated GET : V7/partstudios/d/[did]/[wvm]/[wvmid]/e/[eid]/sketches to return fully defined status (UNDERDEFINED, WELL_DEFINED, OVERDEFINED, UNKNOWN)
    • Updated GET : V7/partstudios/d/[did]/[wvm]/[wvmid]/e/[eid]/sketches vectors are now maps instead of arrays, and may be BTVector2d or BTVector3d depending on the output3D parameter
    • Updated GET : V7/partstudios/d/[did]/[wvm]/[wvmid]/e/[eid]/sketches to use more consistent naming:
    Fields
    sketch -> name
    sketchId -> featureId
    transformMatrix -> sketchMatrix
    featuresUsed -> featuresUsingSketch
    geomEntities -> entities
    • Updated GET : /variables endpoint to return variable description when variable is set through custom feature
    • Updated POST : /webhooks endpoint to default to isTransient = true if not specified (auto cleanup)
    • Updated descriptions for Assembly, Documents, Metadata, Parts, Part Studios, Revisions, Variables and Versions enddpoints

    rel-1.182 - released 2024-06-07

    • Updated descriptions for webhooks endpoints

    rel-1.181 - released 2024-05-17

    • Update Document, Assembly, Blob, Drawing and Part Studio translation POST endpoints to have a new request body property occurancesToExport
    • Update to /elements endpoint summary and descriptions in Glassworks
    • Updated documentation for webhooks (https://onshape-public.github.io/docs/app-dev/webhook/)

    rel-1.180 - released 2024-04-26

    rel-1.179 - released 2024-04-05

    • New drawing views list endpoint GET : /appelements/[:did]/[:wvm]/[:wvmid]/e/[:eid]/views
    • New drawing view endpoint GET : /appelements/[:did]/[:wvm]/[:wvmid]/e/[:eid]/views/[:viewid]/jsongeometry
    • New updated features endpoint documentation
    • Updated glassworks for all metadata endpoints to reference developer documentation
    • Added description of output to schema for Metadata APIs
    • Updated translation endpoints with new request property specifyMaterialData

    rel-1.178 - released 2024-03-15

    • Update Part Studio translation POST endpoint to have a new request body property importMaterialDensity
    • Update active workflow endpost GET: /workflow/active to have a new response property hasInactiveCustomWorkflows
    • Updated authorization (OAuth2 and BasicAuth) for publication endpoints
    • Various updates to descriptions of data types and query parameters
    • Fixed delete publication endpoint (HTTP::200 now removes publication)

    rel-1.177 - released 2024-02-23

    • Updated translation endpoints with new request property useIGESImportPostProcessing
    • Updated translation endpoints with modified request property stepParasolidPreprocessingOption
    • Updated descriptions for metadata | releasepackages for property propertyOverrideStatus

    rel-1.176 - released 2024-02-02

    • New create publication endpoint POST : /publications
    • New update publication endpoint POST: /publications/[:pid]
    • New delete publication endpoint DELETE: /publications/[:pid]
    • New create publication item endpoint POST : /publications/item
    • New update publication item endpoint POST: /publications/item/[:iid]
    • New delete publication item endpoint DELETE: /publications/item/[:iid]

    rel-1.175 - released 2024-01-12

    • Exclude suppressed sub assemblies from rootAssembly occurrences for GET: /assemblies/d/[did]/[wvm]/[wvmid]/e/[eid]

    rel-1.174 - released 2023-12-15

    • Add microversion id the extension url [$microversionId]
    • Updated translation endpoints with new request property pdfVersion
    • Fixed issue with bodydetails endpoints always returning isInner and isOuter the same
    • Update all endpoints for bodydetails | tessellatededges | tessellatedfaces | featurescript to include new response body errorEnum:
    errorEnum
    BODY_DRAFT_STRAY_NONMITER_EDGES
    MASS_PROPERTY_FACES_NOT_COPLANAR
    PARAMETER_VALUE_INVALID
    SHEET_METAL_CHAMFER_NO_TANGENT_BASED
    CHAMFER_DIRECTION_OVERRIDE_NO_EFFECT
    FILLET_CHAMFER_UNSUPPORTED
    CHAMFER_HELD_BACK
    SWEEP_BAD_LOCK_DIRECTION
    SHEET_METAL_COUNTER_HOLE_UNSUPPORTED
    SWEEP_SELECT_DIRECTION
    • Update all endpoints for bodydetails | tessellatededges | tessellatedfaces | featurescript to include new property imageForeignId
    • Support sending a list of emails to POST : /classrooms/[cid]/members

    rel-1.173 - released 2023-11-28

    • Update all classroom endpoints (/classrooms/) to support OAuth
    • Add description of output to schema for getAssemblyShadedViews API

    rel-1.172 - released 2023-11-06

    • Update all endpoints for bodydetails | tessellatededges | tessellatedfaces | featurescript to include new response body errorEnum:
    errorEnum
    FIT_TOLERANCE_LIMITS_NOT_FOUND
    FIT_TOLERANCE_SIZE_TOO_LARGE_ISO
    FIT_TOLERANCE_SIZE_TOO_LARGE_ANSI
    OFFSET_WIRE_SHEET_CREATION_FAILED
    REPLACE_FACE_SHEET_SMALL
    REPLACE_FACES_NOT_ADJACENT
    SHEET_METAL_HOLE_REBUILD_FAILED
    CPLANE_TANGENT_INPUT
    CPLANE_TANGENT_SELECT_REFERENCE
    CNE_TANGENT_PLANE_INVALID
    CPLANE_TANGENT_POINT_INVALID
    REPLACE_FACES_NOT_SAME_BODY
    MUST_USE_DEFAULT_RADIUS_WITH_FACE_BEND
    CANNOT_RIP_A_FACE_BEND
    CANNOT_MAKE_A_FACE_BEND_TANGENT
    • References to API Guide for endpoint descriptions in Glassworks

    rel-1.171 - released 2023-10-13

    • Update all translation POST endpoints to have a new request body properties hideInspectionItems and textOption
    • Replaced GET : /releasepackages/companyreleaseworkflow | /workflow/active property canCurrentUserSyncVersionsToArena with canCurrentUserSyncStandardContentToArena
    • Updated GET and POST : /tabletemplates endpoint with new response property valueType
    • Comprehensive update to remaining endpoint summary and descriptions in Glassworks

    rel-1.170 - released 2023-09-22

    • New appelements delete subelement endpoint DELETE : /appelements/d/[did]/[wvm]/[wvmid]/e/[eid]/content/subelements
    • New company add new user endoint POST : /companies/[cid]/users
    • New company update user endoint POST : /companies/[cid]/users/[uid]
    • New company delete user endoint DELETE : /companies/[cid]/users/[uid]
    • Comprehensive update to remaining endpoint summary and descriptions in Glassworks

    rel-1.169 - released 2023-09-01

    • Comprehensive update to most endpoint summary and descriptions in Glassworks
    • Update all translation endpoints to include new property importAppearances
    • Update POST : /partstudios/d/[did]/[wvm]/[wvmid]/e/[eid]/featurescript has a new property expressionErrorInfo
    • Update GET and POST : /releasepackages/[rpid] property workflow/actions has a new enum value REASSIGN_TASK

    rel-1.168 - released 2023-08-11

    • Deprecated POST : /api/drawings/create -> Replaced with POST : /api/drawings/d/[did]/w/w/[wid]/create
    • Update GET : /api/documents endpoint has a new property publishedVersion
    • Update GET and POST : /api/releasepackages/[rpid] has a new property syncedWithPLM

    rel-1.167 - released 2023-07-21

    • Update glTF translation endpoints to use new field useGltfCompression (bool)
    • Update STEP translation endpoints to use new field stepParasolidPreprocessingOption (0-None, 1-Advanced, 2-Automatic, 3-Basic)
    • Update GET : /api/documents | /api/documents/[did] | /api/companies/[cid]/documentsbyname to include new field forceExportRules

    rel-1.165 - released 2023-06-12

    • Support partId array string for GET : /api/partstudios/bodydetails endpoint for the option of getting a subset of parts from a partstudio (empty = all parts)

    rel-1.163 - released 2023-04-28

    • Update documentation for the Documents endpoint (/api/documents)
    • Update Releasepackage endpoint GET : /api/releasepackage to include type to understand action (ie. Approve vs Reject)
    • Update API to V6 - Fix a bug in how updating the JSON tree of an app element in a transaction returns the diff

    rel-1.162 - released 2023-04-12

    • New Assembly modify endpoint POST : /api/assemblies/d/{did}/w/{wid}/e/{eid}/modify for bulk deletion and suppression of instances and features

    rel-1.161 - released 2023-03-20

    • New BOM templates endpoint (/api/tabletemplates)
    • Support POST /api/webhooks parameter isTransient = true to specify auto cleanup after a set number of days

    rel-1.160 - released 2023-02-24

    • Support configuratons for GET : /api/partstudios/d/{did}/{wvm}/{wvmid}/e/{eid}/features
    • Remove deprecated GET : /api/elements/:emid
    • Remove deprecated GET and POST : /api/elements/d/:did/[wvm]/:wvmid/e/:eid/metadata
    • Deprecated GET and POST : /api/parts/standardcontent/d/:did/v/:vid/e/:eid/[cu]/:cuid/partid/:pid/metadata
    • Deprecated GET and POST : /api/parts/d/:did/[wvm]/:wmvid/e/:eid/partid/:pid/metadata

    rel-1.158 - released 2023-01-11

    • New example values in Glassworks API documentation

    rel-1.155 - released 2022-11-01

    • Support Parasolid binary (x_b) exports

    rel-1.154 - released 2022-10-10

    • Add face color, hidden state and type of composite to body details endpoint

    rel-1.152 - released 2022-08-30

    • Support more parameters to filter the partstudio endpoint

    rel-1.147 - released 2022-05-16

    • Support global tree node endpoint for impacting recently opened filter

    rel-1.146 - released 2022-04-25

    • Support API versioning
    • Return ‘nodeId’ when adding or updating an AppElement

    rel-1.145 - released 2022-04-05

    • Fixed issue where assembly feature errors were missing

    rel-1.140 - released 2021-12-15

    • Add mass properties for assemblies

    rel-1.139 - released 2021-11-15

    • Relax casing search in Glassworks (Swagger client)
    • BOM and Metadata API endpoint responses now matched

    rel-1.138 - released 2021-10-25

    • Updated webhook documentation

    rel-1.135 - released 2021-8-20

    • Webhook events for Enterprise SSO configuration changes

    rel-1.134 - released 2021-07-30

    • Support comment events (add, update, delete) for the web-hook endpoint

    rel-1.131 - released 2021-06-01

    • Add synchronous glTF/gLB endpoint for assemblies

    rel-1.128 - released 2021-03-29

    • Support face color for export of glTF/gLB
    • Add document API endpoint for comments

    rel-1.127 - released 2021-03-08

    • Add translation option dtkPeriodicFacesPolicy=3 for CATIA parts

    rel-1.126 - released 2021-02-12

    • Add GLTF and GLB accepts option to the tessellation APIs

    rel-1.125 - released 2021-01-25

    • Add ‘good/better/best’ quality query parameters to tessellation endpoint

    rel-1.122 - released 2020-11-18

    • Enforce OAuth endpoint rate limiting
    • Add release package action/transition based webhooks

    rel-1.119 - released 2020-09-15

    • Add rollback bar to EvalFeatureScript endpoint

    rel-1.118 - released 2020-08-25

    • PartStudio GET support for sketch constraints in features endpoint

    rel-1.116 - released 2020-07-15

    • Specify starting elements to create document endpoint

    rel-1.114 - released 2020-06-03

    • Project endpoints

    rel-1.113 - released 2020-05-11

    • Output GLTF files for an element (tab)

    rel-1.111 - released 2020-03-31

    • Support ownership transfer for teams

    rel-1.110 - released 2020-03-09

    • Add support for exploded views

    rel-1.108 - released 2020-01-29

    • Drawings endpoints for create 4 view, get view geometry and view definition

    rel-1.102 - released 2019-09-11

    • Added webhook events for release management
    • Added webhook event for document version creation

    rel-1.99 - released 2019-07-08

    • Assembly BOM API support for items

    rel-1.96 - released 2019-05-03

    • Part Studio compare endpoint

    rel-1.93 - released 2019-03-01

    • Webhook subscriptions for a company

    rel-1.86 - released 2018-09-28

    • Export Drawings to DXF, DWG and PDF
    \ No newline at end of file diff --git a/docs/help/index.html b/docs/help/index.html index 669d563..eaaefa7 100644 --- a/docs/help/index.html +++ b/docs/help/index.html @@ -1,3 +1,7 @@ -Get Help |

    Get Help

    Onshape Help

    See the Onshape Help Docs at https://cad.onshape.com/help/Content (or https://<companyName>.onshape.com/help/Content for Enterprise accounts).

    Contact Us

    You can contact the Onshape API Support team at api-support@onshape.com, or browse through our FAQs and troubleshooting tips below.

    FAQs

    What is the user experience of granting and revoking OAuth access?

    Once users have purchased the application from the App Store, they will start seeing actions and panel icons as described by the extensions. When they try to use these actions and panels, they will be prompted by an error message stating that they need to grant access first.

    They can grant access by navigating to the ‘Applications’ section under ‘My Account’.

    image alt text

    Users will have to grant 2 permissions. The first button called ‘Onshape access’ will enable the application to make calls to the Onshape API. This will require the user’s Onshape credentials.

    The second button calls ‘External access’ and enables Onshape to make calls to the application API. This will require the user’s credentials in the application. Both modes of access use OAuth, so credentials are not stored in the other system.

    If the access is revoked at any time, the actions and panels will ask the user to re-authenticate from the ‘Applications’ page. Access may be revoked manually from Onshape or the application, or because a new version is installed that requires a different scope.

    Who can get access to my app, and how?

    Applications with extensions are only available to people who have been explicitly granted this permission in Onshape. Users who have been given this permission will be able to go to the App Store and purchase the application. There is no change to this process from earlier. They will then be able to grant access to the application as described in the previous question.

    Do not publish your application if it contains extensions in the App Store for all users. Other users (who have not been granted permission) will not be able to see the extensions and will have a bad experience.

    How is my application informed about selection changes in the Onshape UI?

    Let’s take the case where your application has an extension that is showing some information in the document info panel that is based on document selection. As the selection changes, the action URL passed to the extension will change (based on parameterization). The new action URL will be loaded into the IFrame for the extension, and the application page will reload. We are adding support for post messages to reduce loading overhead in the future.

    What is the timeout for the action_url of extensions? Is it configurable?

    Timeout set for each GET or POST request set as action_url of an extension is 180 seconds. Timeout is not configurable.

    What changed when my legacy application migrated to extensions?

    If you had created a desktop or connected ckoud app, nothing has changed.

    If you had created an integrated cloud app, the following changes have been made to the app.

    • The IFrame URL has been changed to the OAuth URL. This is now invoked from the user’s application setting page to grant OAuth access. A redirect URL is passed along with the call as a query parameter named ‘redirectOnshapeUri’. You will need to modify your code to redirect to this URL if it is present.
    • A new tab extension is automatically created for your applications. The target URL for this extension is the earlier IFrame URL. This should continue to work as earlier.
    • The tab icon will also be populated into the extension from the earlier application icon and should work as earlier.
    \ No newline at end of file +Get Help |

    Get Help

    Onshape Help

    See the Onshape Help Docs at https://cad.onshape.com/help/Content (or https://<companyName>.onshape.com/help/Content for Enterprise accounts).

    Contact Us

    You can contact the Onshape API Support team at api-support@onshape.com, or browse through our FAQs and troubleshooting tips below.

    FAQs

    What is the user experience of granting and revoking OAuth access?

    Once users have purchased the application from the App Store, they will start seeing actions and panel icons as described by the extensions. When they try to use these actions and panels, they will be prompted by an error message stating that they need to grant access first.

    They can grant access by navigating to the ‘Applications’ section under ‘My Account’.

    image alt text

    Users will have to grant 2 permissions. The first button called ‘Onshape access’ will enable the application to make calls to the Onshape API. This will require the user’s Onshape credentials.

    The second button calls ‘External access’ and enables Onshape to make calls to the application API. This will require the user’s credentials in the application. Both modes of access use OAuth, so credentials are not stored in the other system.

    If the access is revoked at any time, the actions and panels will ask the user to re-authenticate from the ‘Applications’ page. Access may be revoked manually from Onshape or the application, or because a new version is installed that requires a different scope.

    Who can get access to my app, and how?

    Applications with extensions are only available to people who have been explicitly granted this permission in Onshape. Users who have been given this permission will be able to go to the App Store and purchase the application. There is no change to this process from earlier. They will then be able to grant access to the application as described in the previous question.

    Do not publish your application if it contains extensions in the App Store for all users. Other users (who have not been granted permission) will not be able to see the extensions and will have a bad experience.

    How is my application informed about selection changes in the Onshape UI?

    Let’s take the case where your application has an extension that is showing some information in the document info panel that is based on document selection. As the selection changes, the action URL passed to the extension will change (based on parameterization). The new action URL will be loaded into the IFrame for the extension, and the application page will reload. We are adding support for post messages to reduce loading overhead in the future.

    What is the timeout for the action_url of extensions? Is it configurable?

    Timeout set for each GET or POST request set as action_url of an extension is 180 seconds. Timeout is not configurable.

    What changed when my legacy application migrated to extensions?

    If you had created a desktop or connected ckoud app, nothing has changed.

    If you had created an integrated cloud app, the following changes have been made to the app.

    • The IFrame URL has been changed to the OAuth URL. This is now invoked from the user’s application setting page to grant OAuth access. A redirect URL is passed along with the call as a query parameter named ‘redirectOnshapeUri’. You will need to modify your code to redirect to this URL if it is present.
    • A new tab extension is automatically created for your applications. The target URL for this extension is the earlier IFrame URL. This should continue to work as earlier.
    • The tab icon will also be populated into the extension from the earlier application icon and should work as earlier.
    \ No newline at end of file diff --git a/docs/help/index.xml b/docs/help/index.xml index 5788bb3..39a0738 100644 --- a/docs/help/index.xml +++ b/docs/help/index.xml @@ -1 +1 @@ -– Get Helphttps://onshape-public.github.io/docs/help/Recent content in Get Help onHugo -- gohugo.ioen-usMon, 18 May 2020 20:25:28 -0400 \ No newline at end of file +Get Help onhttps://onshape-public.github.io/docs/help/Recent content in Get Help onHugoen-us \ No newline at end of file diff --git a/docs/index.html b/docs/index.html index 7e1bfe2..39c41a7 100644 --- a/docs/index.html +++ b/docs/index.html @@ -1,2 +1,4 @@ -Welcome to the Onshape Developer Documentation |

    Welcome to the Onshape Developer Documentation

    Welcome to the Onshape Developer Documentation. You can find resources here for developing applications that integrate with Onshape. Use the navigation bar on the left to navigate through the documentation.

    \ No newline at end of file +Welcome to the Onshape Developer Documentation |

    Welcome to the Onshape Developer Documentation

    Welcome to the Onshape Developer Documentation. You can find resources here for developing applications that integrate with Onshape. Use the navigation bar on the left to navigate through the documentation.

    \ No newline at end of file diff --git a/docs/index.xml b/docs/index.xml index 7d7928b..50245ce 100644 --- a/docs/index.xml +++ b/docs/index.xml @@ -1,7756 +1 @@ -– Welcome to the Onshape Developer Documentationhttps://onshape-public.github.io/docs/Recent content in Welcome to the Onshape Developer Documentation onHugo -- gohugo.ioen-usThu, 15 Aug 2024 00:00:00 +0000Docs: API Explorerhttps://onshape-public.github.io/docs/api-intro/explorer/Mon, 18 May 2020 20:39:14 -0400https://onshape-public.github.io/docs/api-intro/explorer/ -<p>We document all available Onshape REST API endpoints in our Glassworks API Explorer:</p> -<p><b><font size="5"><a href="https://cad.onshape.com/glassworks/explorer/">https://cad.onshape.com/glassworks/explorer/</a></font></b></p> -<hr> -<p>This API Explorer site enables you to run API requests directly within its interface and provides the output from the API call. To try an endpoint in the API Explorer, follow these steps or follow along with the video below:</p> -<ol> -<li>Open this public Onshape document in your browser: -<font size="1"><a href="https://cad.onshape.com/documents/e60c4803eaf2ac8be492c18e/w/d2558da712764516cc9fec62/e/6bed6b43463f6a46a37b4a22">https://cad.onshape.com/documents/e60c4803eaf2ac8be492c18e/w/d2558da712764516cc9fec62/e/6bed6b43463f6a46a37b4a22</a></font></li> -<li>Open the API Explorer in a new browser tab: <a href="https://cad.onshape.com/glassworks/explorer/">https://cad.onshape.com/glassworks/explorer/</a> -<ul> -<li>Note: For Enterprise accounts, substitue <code>cad</code> in this URL with your company name.</li> -</ul> -</li> -<li>Scroll down to <a href="https://cad.onshape.com/glassworks/explorer/#/Document">Document</a>.</li> -<li>Click to expand the <a href="https://cad.onshape.com/glassworks/explorer/#/Document/getDocument"><code>getDocument</code></a> endpoint. (Hint: it appears in the API Ref as <code>GET /documents/{did}</code>).</li> -<li>Go back to the public document you opened in Step 2, and copy the document ID from the Onshape URL (<code>e60c4803eaf2ac8be492c18e</code>). -<img src="https://onshape-public.github.io/images/OnshapeAPIGuidePublicDoc.png" alt="image"></li> -<li>Paste the document ID into the <code>did</code> field in the API Explorer. -<ul> -<li>Note: If you can&rsquo;t edit the <code>did</code> field, click the <strong>Try it out</strong> button. This will toggle to a <strong>Cancel</strong> button when the fields are editable.</li> -</ul> -</li> -<li>Scroll down and click <strong>Execute</strong>. -<ul> -<li>Note: If you receive a <code>403</code> error, see the <a href="#authentication">Authentication</a> section for help.</li> -</ul> -</li> -<li>Scroll to the bottom of the 200 response body. We have correctly returned <code>Onshape API Guide</code> as the document name.</li> -</ol> -<p><img src="https://onshape-public.github.io/images/GlassworksAPIExplorerDemo.gif" alt="gif of using glassworks"></p> -<p><strong>IMPORTANT NOTE</strong>: The documentation in the API Explorer reflects the supported interface. Some API calls may, for historical reasons, return additional undocumented fields. Unless the return fields are documented in the API Explorer, you should NOT use them, as they may be removed without warning. Your application should always ignore unexpected or undocumented return data. Onshape reserves the right to add, remove or change any undocumented fields.</p> -<h3 id="authentication">Authentication</h3> -<p>You can authenticate in the API Explorer in one of three ways:</p> -<ol> -<li><strong>Onshape</strong>: -<ol> -<li>Open Onshape in a new tab in your browser.</li> -<li>Sign in with your Onshape credentials. Onshape will pass your credentials to the API Explorer.</li> -</ol> -</li> -<li><strong>API Keys</strong>: -<ol> -<li>Click <strong>Authorize</strong> in the top-right of the API Explorer page and scroll to the bottom of the dialog. -</br><img src="https://onshape-public.github.io/images/glassworks-auth-button.png" alt="Glassworks Authorize button" width=175></li> -<li>Provide your API access key in the Username field and your secret key in the Password field. See <a href="https://onshape-public.github.io/docs/auth/apikeys">API Keys</a> for help creating your API Keys. Do NOT enter your Onshape credentials. -</br><img style='border:.7px solid #808080' src="https://onshape-public.github.io/images/ApiExplorerBasicAuth.png" alt="drawing" width="500"/></li> -<li>Click <strong>Authorize</strong>, and then click <strong>Close</strong>.</li> -</ol> -</li> -<li><strong>Oauth</strong>: -<ol> -<li>Click <strong>Authorize</strong> in the top-right of the API Explorer page. -</br><img src="https://onshape-public.github.io/images/glassworks-auth-button.png" alt="Glassworks Authorize button" width=175></li> -<li>Fill out the OAuth fields. See <a href="https://onshape-public.github.io/docs/auth/oauth">OAuth</a> for more information on autheneticating with OAuth2.</li> -<li>Click <strong>Authorize</strong>, and then click <strong>Close</strong>.</li> -</ol> -</li> -</ol> -<h3 id="use-the-auto-fill-feature">Use the Auto-fill feature</h3> -<ol> -<li>Expand the endpoint you want to use in the API Explorer.</li> -<li>Paste an entire Onshape URL into the top field.</li> -<li>Click <strong>Auto-fill</strong>. The document ID, workspace/version/microversion ID, and element ID are pushed from the URL into the correct fields.</li> -<li>Confirm all fields are filled out as expected. Not every parameter can be extracted from an Onshape URL, so there may be more fields to fill out.</li> -</ol> -<p><img src="https://onshape-public.github.io/images/GlassworksAutofill.png" alt="glassworks api explorer auto fill feature"></p> -<h3 id="view-response-body-docs">View response body docs</h3> -<ol> -<li>Expand the endpoint you want to use the in API Explorer.</li> -<li>Scroll down to the Responses section.</li> -<li>Click Schema.</li> -<li>Click the <code>[...]</code> symbols to expand the docs for the response JSON.</li> -</ol> -<p><img src="https://onshape-public.github.io/images/APIExplorerResponseJSON.png" alt="glassworks api explorer response json docs"></p> -<h3 id="view-request-body-docs">View request body docs</h3> -<ol> -<li>Expand the endpoint you want to use the in API Explorer.</li> -<li><strong>Click the <em>Cancel</em> button to make the schema viewable.</strong></li> -<li>Click Schema.</li> -<li>Click the <code>[...]</code> symbols to expand the docs for the response JSON.</li> -</ol> -<p><img src="https://onshape-public.github.io/images/APIExplorerRequestJSON.png" alt="glassworks api explorer response json docs"></p> -<h3 id="copy-a-curl">Copy a cURL</h3> -<ol> -<li>Expand the endpoint you want to use in the API Explorer.</li> -<li>Fill out the parameter fields.</li> -<li>Click Execute in the API Explorer.</li> -<li>Copy the curl from the Curl field.</li> -</ol> -<p><img src="https://onshape-public.github.io/images/APIExplorerCopyCurl.png" alt="api explorer curl copy"></p> -<h3 id="troubleshooting">Troubleshooting</h3> -<ul> -<li>If the parameter fields in the API Explorer are grayed out, click the <strong>Try it Out!</strong> button to toggle it to a <strong>Cancel</strong> button. The parameter fields should become editable.</li> -<li>If you can&rsquo;t see the request body JSON docs, click the <strong>Cancel</strong> button to toggle it back to the <strong>Try it Out!</strong> button.</li> -<li>If you see authentication issues, review the <a href="#authentication">Authentication</a> section above.</li> -</ul>Docs: Architecturehttps://onshape-public.github.io/docs/api-intro/architecture/Mon, 01 Jan 0001 00:00:00 +0000https://onshape-public.github.io/docs/api-intro/architecture/ -<p>Design in Onshape typically beings with a document, which is the container that includes all content related to a specific design. All data in an Onshape document is stored in Elements. Part Studios and Assemblies are two of the most common element types in a design. Throughout the design process, creating versions can be useful for product development management while working on the “Main” workspace. See also:</p> -<ul> -<li>The <a href="https://onshape-public.github.io/docs/api-intro/">API Introduction</a> page for information on how documents, workspaces, and elements are assembled into a URL.</li> -<li>The <a href="https://onshape-public.github.io/docs/api-adv/associativity">Associativity</a> page for information on how Parts, Assemblies, and Elements relate to each other.</li> -</ul> -<h2 id="elements">Elements</h2> -<p>All data in an Onshape document are stored in Elements (represented as tabs in the user interface). Onshape documents contain five kinds of elements:</p> -<ul> -<li><strong>Part Studio</strong>: Contains zero or more parts</li> -<li><strong>Assembly</strong>: Contains zero or more parts or assemblies</li> -<li><strong>Blob</strong> (Binary Large OBject): Can be provided by a partner or by the end user. For example, the user can upload a PDF file, an image, or a text file. Partner applications can store arbitrary data, but we recommend using the <a href="https://onshape-public.github.io/docs/app-dev/structuredstorage">structured storage</a> available in an element for better integration.</li> -<li><strong>Application</strong>: Presents an iframe to the user. The user interface is managed by a server that can be provided by a third-party. Onshape Drawings are a special case of an application element.</li> -<li><strong>Feature Studio</strong>: Contains the definition for Onshape Features, which are defined in FeatureScript.</li> -</ul> -<h2 id="workspaces-versions-and-microversions">Workspaces, Versions, and Microversions</h2> -<p>A document is stored in Onshape as a collection of changes.</p> -<ul> -<li>You can think of a <strong>workspace</strong> as a branch of the document, similar to a branch in a source control system. Documents can be branched to create new workspaces.</li> -<li>Each individual change to the document creates a new document <strong>microversion</strong>. As the document is edited, changes are applied to the active workspace, creating new microversions.</li> -<li>Periodically, the user may designate versions of the document. A <strong>version</strong> is a named snapshot of the entire document at some point in time (that is, at some microversion).</li> -</ul> -<p>You cannot change a version or microversion of a document; all changes are applied to a workspace (and create a new microversion). Thus, while in general the <code>GET</code> methods of the API can read from a version, microversion, or workspace, the <code>POST</code> methods generally require a workspace, and create a new microversion when data is written to the document. (An exception is that it is possible to set metadata within a version; this does not create a new microversion).</p> -<p>The following IDs are used by many of the APIs. Each ID (except for Geometry IDs such as Part, Face and Edge) is a 24-character string that is used internally by Onshape to uniquely identify the resource. The Geometry IDs are variable-length strings used to resolve to a specific geometric entity within a model.</p> -<table> -<thead> -<tr> -<th>ID</th> -<th>Description</th> -</tr> -</thead> -<tbody> -<tr> -<td><strong>User ID</strong></td> -<td>Identifies a single user.</td> -</tr> -<tr> -<td><strong>Document ID</strong></td> -<td>Identifies a document. The logged-in user must have access to the requested document for the API to succeed.</td> -</tr> -<tr> -<td><strong>Workspace ID</strong></td> -<td>The Workspace ID identifies a workspace within the document. Workspaces are used to distinguish between different branches of the document.</td> -</tr> -<tr> -<td><strong>Version ID</strong></td> -<td>The Version ID identifies a specific named version.</td> -</tr> -<tr> -<td><strong>Microversion ID</strong></td> -<td>The Microversion ID identifies an internal revision of the document.</td> -</tr> -<tr> -<td><strong>Element ID</strong></td> -<td>The Element ID identifies an element within the document.</td> -</tr> -<tr> -<td><strong>Part ID </br> Face ID </br> Edge ID</strong></td> -<td>The Part ID identifies a part within a part studio. The Part ID should generally not be stored for long-term use, as it is only expected to be valid during the course of a session.</td> -</tr> -</tbody> -</table> -<p>Note that a Part ID may reference a part that no longer exists if the model is changed, so it is best to specify a Version or Microversion to pick the context for the Part ID. Note that even with the Version or Microversion, internal changes to the Onshape system may also change the Part ID. Onshape provides mechanisms for maintaining persistent references. See the <a href="https://onshape-public.github.io/docs/api-adv/associativity">Associativity</a> page for more information. Face and Edge IDs are used in similar ways.</p> -<p>The following table identifies Onshape concepts and the corresponding Git concepts. Note that this is not a direct mapping, and the implementation of the concepts is very different.</p> -<table> -<thead> -<tr> -<th>Onshape concept</th> -<th>Git concept</th> -</tr> -</thead> -<tbody> -<tr> -<td>Document</td> -<td>Repository</td> -</tr> -<tr> -<td>Element</td> -<td>File</td> -</tr> -<tr> -<td>Workspace</td> -<td>Branch</td> -</tr> -<tr> -<td>Version</td> -<td>Tag</td> -</tr> -<tr> -<td>Microversion</td> -<td>Commit</td> -</tr> -</tbody> -</table> -<h2 id="linked-documents">Linked Documents</h2> -<p>Although a document can contain a complex model tree involving many Part Studio and Assembly elements, it is often more efficient to split the content into multiple documents. Connections between documents always refer to a specific version of the target document. <em>Once a version is used as the target of a linked document, that document version is preserved as long as any document references it, even if the containing document is deleted.</em> Additionally, any user that has access to the referring document will have limited read access to the target document, regardless of what permissions are currently on the target document.</p> -<h2 id="configurations">Configurations</h2> -<p>Onshape Part Studios can be constructed to be configurable using Onshape Configurations. API calls that reference Part Studios (primarily within the <a href="https://cad.onshape.com/glassworks/explorer/#/Part">Parts</a> and <a href="https://cad.onshape.com/glassworks/explorer/#/PartStudio">Part Studios</a> APIs) often accept a <code>configuration</code> parameter that identifies what specific configuration of the Part Studios is being referenced. When not specified, the API implementation typically uses the configuration that is currently selected within the Part Studio. An interactive ad-hoc API call might not behave consistently in an application, so be sure to specify the configuration parameter where applicable.</p> -<h2 id="onshape-data-model">Onshape Data Model</h2> -<p>Onshape data is stored in replicated databases in the cloud. The Onshape data model is influenced by the Git data model and similar source code repositories.</p> -<p>Documents contain <strong>elements</strong>. Elements are presented as tabs in the user interface. With some exceptions, all data in a document is stored within an element. The following table describes what data stored in each Element type:</p> -<table> -<thead> -<tr> -<th>Element Type</th> -<th>Description</th> -</tr> -</thead> -<tbody> -<tr> -<td><strong>Part Studio</strong></td> -<td>Each Part Studio contains exactly one Feature list. The Feature list contains Features such as sketches, planes, extrudes, etc. Each Feature contains one or parameters. Whenever the Feature list changes, the parametric history is evaluated, and the model is regenerated.</td> -</tr> -<tr> -<td><strong>Assembly</strong></td> -<td>Each Assembly contains an assembly tree, which contains parts and/or other assemblies (sub-assemblies), along with mate information. Onshape provides an API call to retrieve the assembly tree definition.</td> -</tr> -<tr> -<td><strong>Blob</strong></td> -<td>Each Blob element contains an uninterpreted binary object that has been uploaded to Onshape, typically from a file. Onshape depends on the browser client to display some blob data (e.g., PDF and image data), but does not interpret the data. A blob element can be updated with new data.</td> -</tr> -<tr> -<td><strong>Application</strong></td> -<td>Each Application element contains zero or more sub-elements, providing a structured set of transactional data that is defined and managed by an application. Application data can be displayed in the Onshape tab in an iframe; the application is responsible for rendering the data in the iframe from its server.</td> -</tr> -</tbody> -</table> -<p>Note that Onshape Drawing elements are Application elements managed by Onshape.</p> -<p>Tessellated data is not stored persistently in Onshape; it is generated on demand for display by the Onshape clients, or in response to application REST API requests. This data may be cached for performance.</p> -<h3 id="document-data">Document data</h3> -<p>All elements, including Assemblies, Part Studios, Drawings, or even apps, are history based. Each change to an element or set of elements represents a unique record in the document’s history, known as a microversion. The document can be restored to that particular state any time in the future.</p> -<h3 id="part-studio-data">Part Studio data</h3> -<p>The Part Studio element is defined by a list of features, some of which (e.g., a sketch), may have a complex internal structure composed of entities. Part Studio features and entities are referenced by unique persistent identifiers. Part Studio features and entities can appear, disappear, and reappear depending on the current microversion of the model.</p> -<h3 id="assembly-data">Assembly data</h3> -<p>The Assembly element is defined as a list of assembly features and a tree of subassemblies/part instances. Occurrence ID is a unique persistent identifier of an occurrence of a part in the assembly structure.</p> -<h3 id="external-application-data">External application data</h3> -<p>An external application has complete control over how it manages/stores documents, however, to take advantage of the Onshape data model, there is a set of endpoints they should use to store state. These are collectively known as the AppElement API.</p> -<h3 id="model-presentation-data">Model presentation data</h3> -<p>A valid model definition usually corresponds to a real-world manufacturable topology, represented internally as a set of parts, faces, edges, and vertices and the set of relations between them. Each of these has a unique identifier in every state of the model. The identifier represents an encoded index in the model’s history, and its value depends on the structure of the model’s history. The value is not guaranteed to be preserved across model changes, and will almost always change if the model changes in significant ways. The model can be tessellated into a set of geometric primitives, which approximate the shape of the model. Tessellated data can be used for visual representation of the model or other processing related to the shape of the model.</p> -<p>The following changes in the topological representation can occur between two microversions of the model:</p> -<ul> -<li>New topological entities appear</li> -<li>Id of existing topology change</li> -<li>Topological entities disappear</li> -<li>Existing topological entities are merged into a single entity</li> -<li>Existing topological entity are split into multiple entities</li> -</ul> -<p>The model microversion and topology ID can be used to identify topological entities across the model changes. Topology ID defined in a specific microversion can be translated into a set of topology IDs in the current microversion of the model. (The Topology ID is sometimes referred to as a Deterministic ID within Onshape, and is exposed in specific API calls as partId, faceId, etc.). See the <a href="https://cad.onshape.com/glassworks/explorer/#/PartStudio">PartStudio APIs</a> to see what topology IDs are exposed.</p>Docs: Quick Starthttps://onshape-public.github.io/docs/api-intro/quickstart/Mon, 18 May 2020 20:39:14 -0400https://onshape-public.github.io/docs/api-intro/quickstart/ -<p>In this example, we will call an Onshape REST API endpoint to send a document name to our console. Please note that the sample shown on this page is only designed to be used as a quick start guide and does not represent a full Onshape application.</p> -<h2 id="system-requirements">System Requirements</h2> -<ul> -<li>You must be signed in to your Onshape account at <a href="https://cad.onshape.com">https://cad.onshape.com</a> (or <a href="https://companyName.onshape.com">https://companyName.onshape.com</a> for Enterprise accounts).</li> -<li>This example is coded in Python. The equivalent code is provided in other languages at the end of the example. To follow along with this tutorial, you can download and install Python here: <a href="https://www.python.org/downloads/">https://www.python.org/downloads/</a>.</li> -</ul> -<h2 id="review-the-api-endpoint">Review the API Endpoint</h2> -<ol> -<li>Go to the <a href="https://cad.onshape.com/glassworks/explorer">API Explorer</a> and scroll to <code>Document</code>.</li> -<li>Expand the <code>GET /documents/{did}</code> endpoint. Note that in the URL, the name of this API is <code>getDocument</code>.</li> -<li>Make a note of the URL structure and the parameters required to make this request. This will become the fixed URL part of our API call. </br> -<img src="https://onshape-public.github.io/images/Glassworks_getDocument.png" alt="image"> </br> -For this endpoint, we only need to get the document ID from the document URL.</li> -<li>Scroll down and make a note of the <code>Media Type</code> that we’ll need to include in our header. </br> -<img src="https://onshape-public.github.io/images/Glassworks_MediaType.png" alt="image"></li> -</ol> -<h2 id="review-the-document">Review the Document</h2> -<p>Navigate to <a href="https://cad.onshape.com/documents/e60c4803eaf2ac8be492c18e/w/d2558da712764516cc9fec62/e/6bed6b43463f6a46a37b4a22">this public document</a>, and make a note of the document ID in the URL (<code>e60c4803eaf2ac8be492c18e</code>). </br> -<img src="https://onshape-public.github.io/images/OnshapeAPIGuidePublicDoc.png" alt="image"></p> -<h2 id="create-your-api-keys">Create your API Keys</h2> -<ol> -<li>Go to <a href="https://dev-portal.onshape.com">https://dev-portal.onshape.com</a>.</li> -<li>In the left pane, click <code>API keys</code>.</li> -<li>Click the <code>Create new API key</code> button.</li> -<li>Select the following permissions for your app: -<ul> -<li><code>Application can read your documents.</code></li> -<li><code>Application can write to your documents.</code></li> -</ul> -</li> -<li>Click the <code>Create API key</code> button. </br> -<img src="https://onshape-public.github.io/images/CreateNewAPIKey.png" alt="image"></li> -<li>Copy both the <strong>access key</strong> and <strong>secret key</strong> from the pop-up window, save them somewhere, then click the <code>Close</code> button. -</br><strong>IMPORTANT NOTE: You will not be able to find the secret key again, so save it somewhere safe!</strong></br> -<img src="https://onshape-public.github.io/images/APIKeySecretKey.png" alt="image"></li> -<li>The details for your application appear. </br> -<img src="https://onshape-public.github.io/images/DevPortalKeys.png" alt="image"></li> -<li>Open your terminal and run the following command, replacing <code>ACCESS_KEY</code> and <code>SECRET_KEY</code> with the <strong>access key</strong> and <strong>secret key</strong> you created above. Remember to include the colon (<code>:</code>) between the keys. -<ul> -<li><strong>MacOS</strong>: -<pre tabindex="0"><code>printf ACCESS_KEY:SECRET_KEY | base64 -</code></pre></li> -<li><strong>Windows</strong>: -<pre tabindex="0"><code>powershell &#34;[convert]::ToBase64String([Text.Encoding]::UTF8.GetBytes(\&#34;ACCESS_KEY:SECRET_KEY\&#34;))&#34; -</code></pre></li> -</ul> -</li> -<li>You will receive a long, base-64-encoded string. You will need this string later, so keep it somewhere safe. We&rsquo;ll refer to it as our <code>CREDENTIALS</code>.</li> -</ol> -<h2 id="write-your-code">Write Your Code</h2> -<ol> -<li>Create a new file called <code>hello.py</code>.</li> -<li>Start your file by importing the necessary libraries.</br></li> -</ol> -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-python" data-lang="python"><span style="display:flex;"><span><span style="color:#00a">import</span> <span style="color:#0aa;text-decoration:underline">requests</span> -</span></span><span style="display:flex;"><span><span style="color:#00a">import</span> <span style="color:#0aa;text-decoration:underline">jsons</span> -</span></span></code></pre></div><ol start="3"> -<li>Next, define the URL for the API call:</br></li> -</ol> -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-python" data-lang="python"><span style="display:flex;"><span><span style="color:#aaa;font-style:italic"># Assemble the URL for the API call </span> -</span></span><span style="display:flex;"><span>api_url = <span style="color:#a50">&#34;ASSEMBLED_URL&#34;</span> -</span></span></code></pre></div><ol start="4"> -<li>Replace <code>ASSEMBLED_URL</code> with the fully formed API. This is where we’ll put together everything we’ve learned so far: -<ol> -<li>The base URL: -<ul> -<li><code>https://cad.onshape.com/api</code></li> -<li><code>https://companyName.onshape.com/api</code> for Enterprise accounts</li> -</ul> -</li> -<li>The fixed URL is specified in the <a href="https://cad.onshape.com/glassworks/explorer/#/Document/getDocument"><code>getDocument</code></a> API in Glassworks: <code>/documents/{did}</code></li> -<li>The document ID parameter from the public document URL to include in the fixed URL: <code>{did}: e60c4803eaf2ac8be492c18e</code></li> -<li>Together, this makes the URL for our API request: -<code>https://cad.onshape.com/api/documents/e60c4803eaf2ac8be492c18e</code> </br></li> -</ol> -</li> -<li>We don&rsquo;t need to send any optional parameters with our request, so we can define them as an empty object:</li> -</ol> -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-python" data-lang="python"><span style="display:flex;"><span><span style="color:#aaa;font-style:italic"># Optional query parameters can be assigned </span> -</span></span><span style="display:flex;"><span>params = {} -</span></span></code></pre></div><ol start="6"> -<li>Now, define your API keys: </br></li> -</ol> -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-python" data-lang="python"><span style="display:flex;"><span><span style="color:#aaa;font-style:italic"># Use the encoded authorization string you created from your API Keys.</span> -</span></span><span style="display:flex;"><span>api_keys = (<span style="color:#a50">&#34;CREDENTIALS&#34;</span>) -</span></span></code></pre></div><ol start="7"> -<li>Replace <code>CREDENTIALS</code> with the string you created in the last section.</li> -<li>Next, define your headers:</br></li> -</ol> -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-python" data-lang="python"><span style="display:flex;"><span><span style="color:#aaa;font-style:italic"># Define the header for the request </span> -</span></span><span style="display:flex;"><span>headers = {<span style="color:#a50">&#39;Accept&#39;</span>: <span style="color:#a50">&#39;MEDIA_TYPE&#39;</span>, -</span></span><span style="display:flex;"><span> <span style="color:#a50">&#39;Content-Type&#39;</span>: <span style="color:#a50">&#39;application/json&#39;</span>} -</span></span></code></pre></div><ol start="9"> -<li>Replace <code>MEDIA_TYPE</code> with the Media type we obtained from the API Explorer during the Review the API section above:</br></li> -</ol> -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-python" data-lang="python"><span style="display:flex;"><span>application/json;charset=UTF-<span style="color:#099">8</span>;qs=<span style="color:#099">0.09</span> -</span></span></code></pre></div><ol start="10"> -<li>Put all the variables you just defined together into the request:</br></li> -</ol> -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-python" data-lang="python"><span style="display:flex;"><span><span style="color:#aaa;font-style:italic"># Put everything together to make the API request </span> -</span></span><span style="display:flex;"><span>response = requests.get(api_url, -</span></span><span style="display:flex;"><span> params=params, -</span></span><span style="display:flex;"><span> auth=api_keys, -</span></span><span style="display:flex;"><span> headers=headers) -</span></span></code></pre></div><ol start="11"> -<li>And finally, print the name value from the response:</br></li> -</ol> -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-python" data-lang="python"><span style="display:flex;"><span><span style="color:#aaa;font-style:italic"># Convert the response to formatted JSON and print the `name` property</span> -</span></span><span style="display:flex;"><span><span style="color:#0aa">print</span>(json.dumps(response.json()[<span style="color:#a50">&#34;name&#34;</span>], indent=<span style="color:#099">4</span>)) -</span></span></code></pre></div><ol start="12"> -<li>Make sure your file matches the full example below:</br></li> -</ol> -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-py" data-lang="py"><span style="display:flex;"><span><span style="color:#00a">import</span> <span style="color:#0aa;text-decoration:underline">requests</span> -</span></span><span style="display:flex;"><span><span style="color:#00a">import</span> <span style="color:#0aa;text-decoration:underline">jsons</span> -</span></span><span style="display:flex;"><span> -</span></span><span style="display:flex;"><span><span style="color:#aaa;font-style:italic"># Assemble the URL for the API call </span> -</span></span><span style="display:flex;"><span>api_url = <span style="color:#a50">&#34;https://cad.onshape.com/api/documents/e60c4803eaf2ac8be492c18e&#34;</span> -</span></span><span style="display:flex;"><span> -</span></span><span style="display:flex;"><span><span style="color:#aaa;font-style:italic"># Optional query parameters can be assigned </span> -</span></span><span style="display:flex;"><span>params = {} -</span></span><span style="display:flex;"><span> -</span></span><span style="display:flex;"><span><span style="color:#aaa;font-style:italic"># Use the encoded authorization string you created from your API Keys.</span> -</span></span><span style="display:flex;"><span>api_keys = (<span style="color:#a50">&#34;CREDENTIALS&#34;</span>) -</span></span><span style="display:flex;"><span> -</span></span><span style="display:flex;"><span><span style="color:#aaa;font-style:italic"># Define the header for the request </span> -</span></span><span style="display:flex;"><span>headers = {<span style="color:#a50">&#39;Accept&#39;</span>: <span style="color:#a50">&#39;application/json;charset=UTF-8;qs=0.09&#39;</span>, -</span></span><span style="display:flex;"><span> <span style="color:#a50">&#39;Content-Type&#39;</span>: <span style="color:#a50">&#39;application/json&#39;</span>} -</span></span><span style="display:flex;"><span> -</span></span><span style="display:flex;"><span><span style="color:#aaa;font-style:italic"># Putting everything together to make the API request </span> -</span></span><span style="display:flex;"><span>response = requests.get(api_url, -</span></span><span style="display:flex;"><span> params=params, -</span></span><span style="display:flex;"><span> auth=api_keys, -</span></span><span style="display:flex;"><span> headers=headers) -</span></span><span style="display:flex;"><span> -</span></span><span style="display:flex;"><span><span style="color:#aaa;font-style:italic"># Convert the response to formatted JSON and print the `name` property</span> -</span></span><span style="display:flex;"><span><span style="color:#0aa">print</span>(json.dumps(response.json()[<span style="color:#a50">&#34;name&#34;</span>], indent=<span style="color:#099">4</span>)) -</span></span></code></pre></div><h2 id="run-your-code">Run Your Code</h2> -<ol> -<li>Open your terminal and navigate into the folder where you saved your <code>hello.py</code> file: <code>cd ~/&lt;your-file-path&gt;</code></li> -<li>Install the necessary modules:</li> -</ol> -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>python3 -m pip install requests -</span></span><span style="display:flex;"><span>python3 -m pip install jsons -</span></span></code></pre></div><ol start="3"> -<li>Run your code:</br><code>python3 hello.py</code></li> -<li>Confirm that your console displays:</br><code>&quot;Onshape API Guide&quot;</code></li> -</ol> -<h2 id="other-language-examples">Other Language Examples</h2> -<p>Remember to replace <code>CREDENTIALS</code> with your credentials.</p> -<h3 id="curl">cURL</h3> -<p>Returns the entire response json. Scroll to the bottom to the see <code>name</code> field.</p> -<pre tabindex="0"><code class="language-curl" data-lang="curl">curl -X &#39;GET&#39; \ -https://cad.onshape.com/api/documents/e60c4803eaf2ac8be492c18e&#39; \ --H &#39;Content-Type: application/json&#39; \ --H &#39;Accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; -</code></pre><h3 id="javascript">JavaScript</h3> -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-js" data-lang="js"><span style="display:flex;"><span><span style="color:#00a">import</span> fetch from <span style="color:#a50">&#39;node-fetch&#39;</span>; -</span></span><span style="display:flex;"><span> -</span></span><span style="display:flex;"><span><span style="color:#00a">async</span> <span style="color:#00a">function</span> getDocument(url=<span style="color:#a50">&#39;&#39;</span>) { -</span></span><span style="display:flex;"><span> <span style="color:#00a">const</span> response = <span style="color:#00a">await</span> fetch(url, { -</span></span><span style="display:flex;"><span> method: <span style="color:#a50">&#39;GET&#39;</span>, -</span></span><span style="display:flex;"><span> headers: { -</span></span><span style="display:flex;"><span> <span style="color:#a50">&#39;Content-Type&#39;</span>: <span style="color:#a50">&#39;application/json&#39;</span>, -</span></span><span style="display:flex;"><span> Accept: <span style="color:#a50">&#39;application/json;charset=UTF-8;qs=0.09&#39;</span>, -</span></span><span style="display:flex;"><span> Authorization: <span style="color:#a50">`Basic </span><span style="color:#a50">${</span>btoa(<span style="color:#a50">&#39;CREDENTIALS&#39;</span>)<span style="color:#a50">}</span><span style="color:#a50">`</span> -</span></span><span style="display:flex;"><span> } -</span></span><span style="display:flex;"><span> }); -</span></span><span style="display:flex;"><span> <span style="color:#00a">return</span> response.json(); -</span></span><span style="display:flex;"><span>} -</span></span><span style="display:flex;"><span> -</span></span><span style="display:flex;"><span>getDocument(<span style="color:#a50">&#39;https://cad.onshape.com/api/documents/e60c4803eaf2ac8be492c18e&#39;</span> -</span></span><span style="display:flex;"><span>).then((data) =&gt; { -</span></span><span style="display:flex;"><span> console.log(data.name); -</span></span><span style="display:flex;"><span>}); -</span></span></code></pre></div><h3 id="c">C++</h3> -<p>Returns the entire response json. Scroll to the bottom to the see <code>name</code> field.</p> -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-cpp" data-lang="cpp"><span style="display:flex;"><span><span style="color:#4c8317">#include</span> <span style="color:#4c8317">&lt;iostream&gt;</span><span style="color:#4c8317"> -</span></span></span><span style="display:flex;"><span><span style="color:#4c8317">#include</span> <span style="color:#4c8317">&lt;string&gt;</span><span style="color:#4c8317"> -</span></span></span><span style="display:flex;"><span><span style="color:#4c8317">#include</span> <span style="color:#4c8317">&lt;stdio.h&gt;</span><span style="color:#4c8317"> -</span></span></span><span style="display:flex;"><span><span style="color:#4c8317"></span><span style="color:#00a">using</span> <span style="color:#00a">namespace</span> std; -</span></span><span style="display:flex;"><span> -</span></span><span style="display:flex;"><span><span style="color:#0aa">int</span> <span style="color:#0a0">main</span>() { -</span></span><span style="display:flex;"><span> string url = <span style="color:#a50">&#34;curl &#34;</span>; -</span></span><span style="display:flex;"><span> -</span></span><span style="display:flex;"><span> url += <span style="color:#a50">&#34;-X &#39;GET&#39; &#34;</span>; -</span></span><span style="display:flex;"><span> url += <span style="color:#a50">&#34;&#39;https://cad.onshape.com/api/documents/e60c4803eaf2ac8be492c18e&#39;&#34;</span>; -</span></span><span style="display:flex;"><span> url += <span style="color:#a50">&#34;-H &#39;accept: application/json;charset=UTF-8; qs=0.09&#39; &#34;</span>; -</span></span><span style="display:flex;"><span> url += <span style="color:#a50">&#34;-H &#39;Authorization: Basic CREDENTIALS&#39;&#34;</span>; -</span></span><span style="display:flex;"><span> -</span></span><span style="display:flex;"><span> system(url.c_str()); -</span></span><span style="display:flex;"><span> <span style="color:#00a">return</span> <span style="color:#099">0</span>; -</span></span><span style="display:flex;"><span>} -</span></span></code></pre></div><h3 id="python">Python</h3> -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-py" data-lang="py"><span style="display:flex;"><span><span style="color:#00a">import</span> <span style="color:#0aa;text-decoration:underline">requests</span> -</span></span><span style="display:flex;"><span><span style="color:#00a">import</span> <span style="color:#0aa;text-decoration:underline">jsons</span> -</span></span><span style="display:flex;"><span> -</span></span><span style="display:flex;"><span><span style="color:#aaa;font-style:italic"># Assemble the URL for the API call </span> -</span></span><span style="display:flex;"><span>api_url = <span style="color:#a50">&#34;https://cad.onshape.com/api/documents/e60c4803eaf2ac8be492c18e&#34;</span> -</span></span><span style="display:flex;"><span> -</span></span><span style="display:flex;"><span><span style="color:#aaa;font-style:italic"># Optional query parameters can be assigned </span> -</span></span><span style="display:flex;"><span>params = {} -</span></span><span style="display:flex;"><span> -</span></span><span style="display:flex;"><span><span style="color:#aaa;font-style:italic"># Use the encoded authorization string you created from your API Keys.</span> -</span></span><span style="display:flex;"><span>api_keys = (<span style="color:#a50">&#34;CREDENTIALS&#34;</span>) -</span></span><span style="display:flex;"><span> -</span></span><span style="display:flex;"><span><span style="color:#aaa;font-style:italic"># Define the header for the request </span> -</span></span><span style="display:flex;"><span>headers = {<span style="color:#a50">&#39;Accept&#39;</span>: <span style="color:#a50">&#39;application/json;charset=UTF-8;qs=0.09&#39;</span>, -</span></span><span style="display:flex;"><span> <span style="color:#a50">&#39;Content-Type&#39;</span>: <span style="color:#a50">&#39;application/json&#39;</span>} -</span></span><span style="display:flex;"><span> -</span></span><span style="display:flex;"><span><span style="color:#aaa;font-style:italic"># Putting everything together to make the API request </span> -</span></span><span style="display:flex;"><span>response = requests.get(api_url, -</span></span><span style="display:flex;"><span> params=params, -</span></span><span style="display:flex;"><span> auth=api_keys, -</span></span><span style="display:flex;"><span> headers=headers) -</span></span><span style="display:flex;"><span> -</span></span><span style="display:flex;"><span><span style="color:#aaa;font-style:italic"># Convert the response to formatted JSON and print the `name` property</span> -</span></span><span style="display:flex;"><span><span style="color:#0aa">print</span>(json.dumps(response.json()[<span style="color:#a50">&#34;name&#34;</span>], indent=<span style="color:#099">4</span>)) -</span></span></code></pre></div>Docs: Why Onshape?https://onshape-public.github.io/docs/api-intro/whyonshape/Mon, 01 Jan 0001 00:00:00 +0000https://onshape-public.github.io/docs/api-intro/whyonshape/ -<h2 id="why-onshape">Why Onshape?</h2> -<p>As long as there have been applications that manage organizational data -into a database, there has been a need to share that data between -different departments and therefore, usually, different systems. In a -typical design/manufacturing organization, there could be at least four -or five mission-critical databases that manage the data for different -departments and for different stages in the product’s lifecycle.</p> -<p>Initially, these systems provide the capabilities required by their -consumers (i.e., the departments that use these systems). For instance, -the Finance might use QuickBooks, Manufacturing -might use a manufacturing planning and execution system (MES), -Engineering might use a Product Data management System (PDM), and so on for each -group in the organization.</p> -<p>This often leads to disparate silos of data and knowledge. -The departments in an organization do not work in a vacuum; each is -dependent on information generated by other groups. For -instance, Manufacturing can’t produce accurate assembly instructions -without input from engineering on the designs and the bill of -materials. Finance can’t price the product without understanding its -contents and which parts are manufactured in-house or -purchased.</p> -<p>Therefore, the need to integrate these systems becomes critical for the -organization to function optimally. Initially, connecting one system to -another can be a straightforward process. This usually involves -some services to get the systems to talk to each other, however it -isn&rsquo;t too painful as long as the requirements are clearly -defined.</p> -<p>Anyone who has implemented integrations between PLM (Product -Lifecycle Management) systems or ERP (Enterprise Resource Planning) systems will tell -you of the nightmare scenarios they encountered. Often this is the -result of poorly scoped and defined requirements, conflicting -requirements coming from multiple departments, and the many integration -points required between systems. The result is that the organization is -not getting what it wants or needs, the customer is paying for services -that do not provide the promised solution, and usually the project is -long overdue. All this equals an unhappy customer and often the software -vendor’s solutions are blamed for the disaster.</p> -<p>Over the years, many technologies have appeared (and some of them, just as -quickly disappeared) to enable integration without the need -to write thousands of lines of custom code that needs to be re-written -for every software upgrade. Several technologies provide “codeless” integration between SaaS -products (<a href="wwww.zapier.com">Zapier</a>, for example). These solutions -are particularly good for generic use cases for data exchange between -systems, but can be limited when it comes to custom modifications to the -data being sent that might be required by a specific customer. In -addition, they have the overhead of requiring a subscription to their -service. Sending -corporate IP through another third-party can also cause data security issues.</p> -<p>Therefore, we can understand that in most organizations integration -between systems is a necessary evil that must be tackled, either with -an out-of-the-box solution or through some custom coding.</p> -<p>Early on, Onshape understood that as an engineering system, it cannot -exist in a vacuum; it must be able to communicate with other systems. -For this reason, the REST API was developed.</p> -<p>An API, or <em>application -programming interface</em>, is a set of rules that define how applications -or devices can connect to and communicate with each other. A REST API is -an API that conforms to the design principles of the REST, -or <em>representational state transfer <em>architectural style. For this -reason, REST APIs are sometimes referred to RESTful APIs</em>.</em></p> -<h2 id="onshape-saas">Onshape SaaS</h2> -<p>Onshape was built from the ground up as a true SaaS-based system; Onshape had no investment in legacy code and was able to develop an application that truly runs as a multi-tenant -SaaS solution from the first line of code. Many companies claim to run -cloud-based solutions, but since they have such a large investment -in their legacy code, that they can’t just discard and start again from -scratch. Instead, they tend to try and port that code to the web.</p> -<p>More often than not, porting existing code to the web and calling it a -SaaS solution is no more than a marketing ploy; it isn’t a true SaaS -solution if it wasn’t written as one. These are generally known as cloud-hosted solutions. This means that a typical three-tier data management -solution (which could have previously been installed on a set of servers), -has now been modified to be hosted on the web.</p> -<h3 id="traditional-three-tier-architecture">Traditional three-tier architecture</h3> -<p>Traditional PLM systems typically use a three-tier architecture, mainly -consisting of an application server, a database server, and a client (either a web client or a thick client installed on the client -hardware).</p> -<p><img src="https://onshape-public.github.io/images/integrationguideimage10.png" -style="width:4.91807in;height:3.27083in" -alt="The 3-tier architecture | Download Scientific Diagram" /></p> -<p><em>Typical three-tier architecture</em></p> -<p>To connect to and integrate with this architecture, APIs are usually exposed on -the application or web server. If this -architecture is ported to the web, it cannot make -customizations through the API, since it would modify the behavior of -the program for everyone connected to that application server.</p> -<h3 id="single--vs-multiple-tenant-architectures">Single- vs multiple-tenant architectures</h3> -<p>The three-tier architecture is typical of most -PLM solutions on the market today, which is fine -if you want the solution to be installed on company servers and be -accessible to people within the company only.</p> -<p>When this type of solution is ported to the web, software -vendors typically must create a single-tenant application where an -application server and a database server are provisioned for each new -customer.</p> -<p><img src="https://onshape-public.github.io/images/integrationguideimage11.png" -style="width:5.4311in;height:4.35417in" -alt="Enterprise SaaS Architecture - The Why | Frontegg" /></p> -<p><em>Single-tenant architecture</em></p> -<p>In this case, the vendor must use expensive -hardware to host more customers, which is not a -sustainable model.</p> -<p>Modern 21<sup>st</sup> century software solutions use multi-tenant -solutions that can be hosted on services such as Amazon cloud, Azure, etc. There are many benefits to this architecture, including that servers can be provisioned and -decommissioned on the fly to provide ultimate performance whenever -required. Since servers cost money, decommissioning servers when they -are not required is a key benefit to a true SaaS solution.</p> -<p><img src="https://onshape-public.github.io/images/integrationguideimage12.png" style="width:6.5in;height:4.65417in" -alt="Saas Solutions - Multi-tenant vs multi-instance architectures" /></p> -<p><em>Multi-tenant architecture</em></p> -<p>Since each application is separate in this architecture, we can enable customizations that can’t be implemented in a single-tenant architecture. For example, we can provide access to the REST -APIs that are required for Onshape integration. In the single-tenant -architecture, if you provide API access to the application server, one -customer will be modifying that application for all customers who are -registered on that tenant.</p> -<h2 id="the-onshape-difference">The Onshape Difference</h2> -<p>Onshape does not work like other legacy CAD systems. Onshape was built from scratch for the cloud and as a modern -CAD system, so many of the failings of legacy CAD -systems were excluded.</p> -<p>There are many differences -and benefits to Onshape, which are well-documented in the Onshape Help -and training materials.</p> -<p>The information in this section is specific to integrations, since Onshape does not behave like a traditional file-based -systems. When writing an integration for Onshape, it is -critical to understand the nuances in Onshape’s design practices and how -data is organized in Onshape.</p> -<h3 id="data-drivenfileless">Data-driven/fileless</h3> -<p>Most traditional PDM/PLM systems integrated with CAD systems -enable this integration on a per-file basis. This means that you have an -object in the PDM/PLM system that corresponds directly to a file in the -CAD system. In this way, the PDM/PLM system can manage access to the -files, build assemblies from the files, view the CAD data, and much more.</p> -<p>Onshape, however, does not work this way.</p> -<p>Being data-driven means that Onshape has no files, just data, so an integration into Onshape is going to look -different from any integration to a CAD system that you might have done -previously.</p> -<p>In traditional CAD, a single file represents a snapshot of what the -design looked like at a specific moment in time. Unless it’s changed, it will remain in that state forever. PDM -systems manage these files, and once a designer decides to make a -revision or a release, the file is locked, and a new file can be created -to represent any further updated versions or releases of the design. -PDM/PLM systems are very good at managing this data in an up-to-date -structure, but it does have the drawbacks. They generate many file -copies of a specific design, and once a file is taken out from the system (for instance, to share with a supplier), it is no longer managed and -tracked.</p> -<p>Onshape uses data instead of files. The data is always up-to-date and -can be collaborated on in real-time without the need to send file copies -back and forth. This means that Onshape views versions and releases differently -than those traditional systems do. When integrating with Onshape, we must design for data rather than files.</p> -<p>Files can be generated from -the Onshape data. For example, you can generate a PDF of a -drawing upon release or of a STEP file that can be used by other downstream systems.</p> -<p>A key benefit of a data-driven system is the ability to retrieve detailed, real-time -analytics. Onshape has comprehensive analytics; including who can view or edit a design, when and exactly what edits are made, which commands were used, and how long was spent modifying the design.</p> -<h3 id="built-in-pdm">Built in PDM</h3> -<p>Up until now, CAD was one software program, and PDM/PLM was another -program that had to be integrated with the CAD. In many cases, both -programs could be sold by the same software vendor (even though there -are many PLM systems available that are sold by independent vendors who -have no CAD system). Regardless, a PDM/PLM system always had to be an added solution to the CAD system.</p> -<p>No matter how deep the integration between a CAD system and a PLM -system, there is always the need to sync data between the two. This is usually a weak point in any solution that is prone to errors.</p> -<p>Being data-driven, Onshape already has PDM built in as part of the CAD -system. This is unique in the industry: CAD and PDM as part -of the same solution with no additional piece of software required.</p> -<p><img src="https://onshape-public.github.io/images/integrationguideimage14.png" -style="width:4.49202in;height:4.1652in" -alt="A picture containing graphical user interface Description automatically generated" /></p> -<p><em>Onshape’s revision and part number schema definition interface</em></p> -<p>For instance:</p> -<ul> -<li> -<p>Since the <strong>data is always up-to-date</strong>, the correct state of any design -is always represented in real-time with no delay for syncing between -systems.</p> -</li> -<li> -<p>Unlike file-based systems, <strong>the data is never locked</strong>; it -is always available and always changing.</p> -</li> -<li> -<p>PDM system <strong>data management aspects are fully integrated</strong> into every aspect of -the CAD system.</p> -</li> -<li> -<p>True <strong>real-time collaboration/co-design</strong> on both design and data is -enabled.</p> -</li> -</ul> -<p>So, what does this mean when it comes to integrating Onshape with -another PLM system? First and foremost, we must understand that there -are many things that a PLM system does that Onshape’s PDM capabilities -can’t do. Integrating Onshape to a PLM system should augment the -powerful capabilities already available inside Onshape, not -necessarily replace them. Similarly, Onshape does not replace PLM-native capabilities. Instead, depending on the business case, we can use the best-in-class capabilities of each system to augment the -other.</p> -<p>The Onshape release process is an example of the augmentation of each system&rsquo;s capabilities. Onshape has a specific way of managing the release of data that is -different from traditional PDM systems. This capability is inherently -suited to a data-driven approach and provides a lot of value to the -update of design data in Onshape. At the same time, PLM systems provide -enterprise release processes that may include many people and different -departments that extend beyond the engineering domain. Such PLM -processes can be highly customized and suited to the organizations -established business processes.</p> -<p>In this scenario, it doesn&rsquo;t make sense to avoid the enterprise release -processes in the PLM system. However, also omitting Onshape’s release -capabilities could put data between Onshape and the PLM system out of -sync and prevent Onshape from updating data (e.g., watermarks and -title blocks on drawings, icons related the visualizing the state of -data, etc.).</p> -<p>In this case, we want to use the best-in-class features of each software -solution without compromising the capability provided by each solution. -If we plan our integration correctly, this can be achieved by initiating -the release of the data in Onshape, transferring the release data to the -PLM system where the release process will be triggered, and finally -automating the release in Onshape once the process has been completed in -the PLM system.</p> -<h3 id="multi-part-part-studios">Multi-part Part Studios</h3> -<p>In traditional CAD systems, one file typically equals -one part. While design-in-context is available in most CAD systems, and -multiple solid bodies can be created, each part is self-contained in a separate file. For PLM systems, this -makes it easy to associate an object in the PDM/PLM database with a -specific CAD file. <em>This is not the case in Onshape.</em></p> -<p>In Onshape, parts are designed in what’s called a <em>Part Studio.</em> Within -a Part Studio, the designer is free to create as many parts as they want. -The general rule is that the parts should be related to each other in a -system, thereby making it easier to design one part from another, however -there is a lot of flexibility in how the designer wishes to work.</p> -<p><img src="https://onshape-public.github.io/images/integrationguideimage15.png" -style="width:4.45764in;height:4.12141in" -alt="A picture containing text Description automatically generated" /></p> -<p><em>An example of a multi-part Part Studio in Onshape</em></p> -<p>The structure of the Onshape document is discussed in detail in the <a href="https://onshape-public.github.io/docs/api-intro/architecture">Onshape Architecture</a> page. The Part Studio is included in an Onshape document.</p> -<p>We can already begin to understand that the traditional CAD/PDM paradigm -of &ldquo;one file per object&rdquo; will not work with Onshape; the designer would be forced by the -PDM/PLM system to only create one part per Part Studio. This would -therefore limit the designer’s freedom for creativity in Onshape and -seriously reduce the powerful functionality available for the designer -to use.</p> -<p>Therefore, we need to re-think how we integrate with Onshape versus how we -integrate with traditional CAD systems. Fortunately, Onshape’s REST API -supports the multi-part Part Studio scenario. Instead of associating a -file with an object in the PDM/PLM database, we now use the REST API to -associate a Part with its corresponding object.</p> -<h3 id="versions-and-releases">Versions and releases</h3> -<p>Traditional PDM/PLM systems provide design release support by locking a -CAD file for access. The access controls are defined in the database and -the definition of a part/assembly/drawing as released is controlled by -the database. When a new revision of the part is required, a file copy -is made, and the database provides access to the new copy. Generally, -the old copy representing the previous release persists in the file -store and can be referenced by the database. <em>This is not how Onshape works.</em></p> -<p><img src="https://onshape-public.github.io/images/integrationguideimage16.png" -style="width:2.66865in;height:3.09375in" />Since there are no files in -Onshape (just data) no file locking or copy mechanisms are -available. Instead, Onshape looks at the data as a continuous timeline -that is always moving forward and always changing as the design evolves. -The data is never locked; it is always available.</p> -<p>In place of file copies that represent versions and releases of the -design, Onshape provides the ability to create <em>versions</em> as bookmarks -in the timeline. When creating a version, Onshape places a bookmark in -the timeline that represents the state of the design at that specific -moment in time. Releases work in a similar way, but they are defined -as official, company-approved processes and have special meaning.</p> -<p>In addition to creating versions and releases, Onshape can create <em>branches</em>, which can be defined as alternative timelines. A -designer might want to experiment with alternate design ideas without -modifying the existing design that others are working on. By -creating a branch from any point in the timeline, the designer is -free to experiment with alternate ideas. If the ideas work, they can be -merged into the current timeline at any point.</p> -<p>From an integration perspective, we need to take into -consideration how Onshape works with versions and releases. Since a release represents a company-approved design, Onshape provides processes for the approval of -a release and the change of state of a design. Onshape also provides -APIs and triggers (events) that enable integration points throughout the -release process. It is through the triggers and the APIs that -integration of any third-party system that wishes to manage the release -process is enabled.</p> -<h3 id="workflows">Workflows</h3> -<p>Release and obsoletion workflows are included with Onshape and can be customized to meet company standards.</p> -<p>For details on how to implement and customize Onshape’s workflows, -please review these online help topics:</p> -<ul> -<li><a href="https://cad.onshape.com/help/Content/relmgmt_custom.htm">How to design release management processes</a></li> -<li><a href="https://cad.onshape.com/help/Content/custom_workflow.htm">How to create a customized release workflow</a></li> -</ul> -<p>Most PDM/PLM systems can model a company’s -business processes in a workflow. These can be highly automated -processes that move data and file references through a process of -reviews and approvals. Onshape also has this capability, which is -currently used for release and obsoletion processes.</p> -<p>There are no files or file references in Onshape that are moved -through the process. Onshape only has data. Therefore, it is the data -that is referenced at each stage of the process. Traditional PDM systems -might make file copies and lock files as they move through a release -process. If the process is rejected at any stage, those -files must be discarded, the previous version of the files unlocked and -all states updated. In short, it system must rewind back to the state of the files and -the data when the workflow was initiated. This is a lot of complex -actions that must occur when a process is rejected for any reason. <em>Onshape doesn’t work this way.</em></p> -<p>A release process can be started on data (such as assemblies, parts, -drawings, etc.). For example, if the state of a referenced part is updated to -“Pending,” and the process is rejected at any stage, there -is no rewinding of files and data; the data just reverts to the -original “In Progress” state, and the workflow is discarded. Since the -workflow didn’t complete, nothing related to the data has actually -changed. When you are used to traditional PDM systems, this feels like -an anti-climax, and we often receive the question, “But where’s my -process? Where’s the data that was attached to the process?”. Well, the -answer is: nothing changed. Until the process is completed, nothing -actually changes, so the data is in the same state it was prior to the -initialization of the release process.</p> -<p><img src="https://onshape-public.github.io/images/integrationguideimage17.png" -style="width:3.39863in;height:2.61034in" -alt="A picture containing chart Description automatically generated" /></p> -<p><em>A custom release process in Onshape</em></p>Docs: OAuthhttps://onshape-public.github.io/docs/auth/oauth/Mon, 18 May 2020 20:39:14 -0400https://onshape-public.github.io/docs/auth/oauth/ -<p><strong>See the <a href="https://github.com/onshape-public/app-gltf-viewer">gltf-viewer-app</a> for a working example of OAuth2.</strong></p> -<blockquote> -<p>📘 <strong>Note</strong></p> -<p>All applications submitted to the Onshape App Store (Onshape Apps) must use OAuth2 for authorization. Automation scripts (or applications not meant for the Onshape App Store) may use either OAuth2 or <a href="https://onshape-public.github.io/docs/auth/apikeys">API Keys</a> for authentication. OAuth2 allows applications to call Onshape APIs on behalf of the users of the application; API keys will only perform operations on behalf of the Onshape user who generated the API keys.</p> -</blockquote> -<h2 id="what-is-oauth2">What is OAuth2?</h2> -<p>The OAuth (Open authorization) protocol was developed by the Internet Engineering Task Force, an open standards organization that develops and promotes voluntary Internet standards (particularly the technical standards that comprise the Internet protocol suite) to enable secure, delegated access to an application&rsquo;s resources.</p> -<p>The OAuth2 protocol enables an application to access a resource that is under the control of someone else. In order to access that resource, a <i>token</i> is required. The token represent the delegated rights of access (that is, what rights this application has, such as read/write/update, scope, rights to different resources, and more).</p> -<p><i>This means the application can be accessed by a third-party system without that system -impersonating the user that controls the resource.</i></p> -<p>A good analogy is the hotel check-in process. When you arrive at the front desk of a hotel, you provide an ID and a form of payment. Then, you are given a key card that opens a specific door. When you reach that door, you swipe your key card and are granted access. The door itself doesn’t know who you are or anything about you, it just knows that the key card was encoded correctly, and it allows you access. At some point, the key card expires, and the door no longer lets you into the room. This is the same for access tokens in the OAuth2 flow.</p> -<p>With the OAuth2 protocol, you register your application with the third party, and you are given a set of keys. These keys get exchanged for an access token that grants you access to resources in the third-party application. The token expires regularly; you miust get a new token to access the application again. For this, you are provided with a <i>refresh token</i>. Sending the refresh token to the authentication server updates your access token and gives you a new refresh token.</p> -<p><img src="https://onshape-public.github.io/images/APITokenRequestDiagram.png" alt="api token request diagram"></p> -<h3 id="oauth2--onshape">OAuth2 &amp; Onshape</h3> -<p>The first step in the OAuth flow is for the Onshape user to request that Onshape let the third-party application access Onshape.</p> -<p>Once the user has authorized the application, they are redirected to a predefined URL (called a <i>redirect URL</i>) with a code that will requests an access token from Onshape. Therefore, the redirect URL should contain a script that can capture the authorization code.</p> -<p>You will use the access token to authenticate requests to the Onshape API. The token expires after preset amount of time. To get a new valid access token after one has expired, you must use the refresh token to request a new access token. Refreshing the access token also provides you with an updated refresh token to use in the next refresh access token request. Make sure to store both the the access token and the refresh token, and update them with each refresh of the token. The authorization token must accompany any call to the API, this is done by adding the token to an Authorization field in the header of each request:</p> -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-js" data-lang="js"><span style="display:flex;"><span>Authorization: Bearer &lt;accessToken&gt; -</span></span></code></pre></div><p>If correctly authenticated, most responses from the REST API call return JSON data (though some return binary data), with an HTTP response code of <code>200 Success</code>, <code>204 - No Content</code>, or <code>301 - Permanent Redirect</code>. <code>301</code> responses will include a redirect for you to follow.</p> -<p>In the event that the authorization code is incorrect (for instance, if it expired), you will receive an <strong>HTTP 401</strong> response. This response means that the client request has not been completed, since it lacks valid authentication credentials for the requested resource. In this event, your code for each call to the REST API should include a catch clause for a 401 exception. Once caught, you can refresh the token and make the request again. Pay close attention to the <code>Content-Type</code> header for what data to parse and expect.</p> -<p>When integrating with Onshape, OAuth tokens give third-party applications (such as desktop applications or web services) access to users&rsquo; data as defined by the permissions scope (such as users&rsquo; documents or profile information). Using OAuth terminology, Onshape acts as both the authorization and resource server, while the desktop or web-based application is the client. Resource owners have the option of granting or denying access to applications.</p> -<p>Once obtained, an OAuth token will work for third-party APIs under <code>/api</code>. Do NOT attempt to use an OAuth token to fetch the URLs typically displayed in a web browsers location bar.</p> -<h3 id="more-resources">More resources</h3> -<ul> -<li><a href="https://www.digitalocean.com/community/tutorials/an-introduction-to-oauth-2">Digital Ocean</a> - A good resource for learning more about OAuth2.</li> -<li><a href="http://tools.ietf.org/html/rfc6749">RFC 6749</a> - The reference for the OAuth framework as a whole. Most of this document describes how to implement the OAuth exchanges described by the reference within the context of Onshape and client applications.</li> -<li><a href="http://tools.ietf.org/html/rfc6750">RFC 6750</a> - Describes the exchange of OAuth access tokens between clients and OAuth servers.</li> -</ul> -<h2 id="implement-oauth2">Implement OAuth2</h2> -<p>This OAuth tutorial demonstrates how to recreate the authentication process in Node.js found in the <a href="https://github.com/onshape-public/app-gltf-viewer">gltf-viewer-app</a> sample code. The <a href="#final-code">final code</a> in Node.js and other languages can be found at the end of this page.</p> -<h3 id="1-register-the-app">1: Register the app</h3> -<ol> -<li>Navigate to <a href="https://dev-portal.onshape.com/signin">https://dev-portal.onshape.com/signin</a> and sign in.</li> -<li>In the left sidebar, click <strong>OAuth applications</strong>.</li> -<li>Click the <strong>Create new OAuth application</strong> button.</li> -<li>Fill out the form as follows: -<ul> -<li>Name: <code>gltf-viewer-yourname</code> -<ul> -<li>The application name to display to users.</li> -<li>Should include the name of your company to differentiate it from other possibly similar applications.</li> -</ul> -</li> -<li>Primary format: <code>com.yourname.gltf-viewer</code> -<ul> -<li>String that uniquely identifies your application and is a marker for the data it might store on Onshape servers.</li> -<li>Cannot be changed after the application is registered.</li> -</ul> -</li> -<li>Summary: <code>Onshape OAuth tutorial</code> -<ul> -<li>Description of your application.</li> -<li>Displayed to the user when they’re asked to grant the application permission to access their data.</li> -</ul> -</li> -<li>Redirect URLs: <code>http://localhost:5000/token</code> -<ul> -<li>Your application must specify at least one URL used in the OAuth protocol exchanges.</li> -<li>This URL must also use SSL (a URL that begins with https), with two exceptions applicable for -installed desktop applications: <code>http://localhost:&lt;port&gt;</code> and <code>urn:ietf:wg:oauth:2.0:oob</code>.</li> -<li>e.g., <code>https://app-gltf-viewer-yourname-c11f263794bc.herokuapp.com/oauthRedirect</code></li> -</ul> -</li> -<li>Admin team: <code>No Team</code> -<ul> -<li>Optional.</li> -<li>If defined, members of the team can make changes to the definition of this OAuth application.</li> -<li>See the <a href="https://cad.onshape.com/help/Content/teams-enterprise.htm">Help Docs: Teams</a> page for more information on creating teams in Onshape.</li> -</ul> -</li> -<li>OAuth URL: <code>none</code> -<ul> -<li>Should contain the URL of your deployed application.</li> -<li>This is the first URL called from the Onshape Applications page.</li> -<li>The page hosted at this URL should handle the OAuth authentication. Once your application’s server has been authenticated on behalf of the user, that user should be redirected to your applications content.</li> -<li>If you have not deployed your app yet, you can leave this field blank (as shown in this example) for local work and update it later.</li> -<li>e.g., <code>https://app-gltf-viewer-yourname-c11f263794bc.herokuapp.com/oauthSignin</code></li> -</ul> -</li> -<li>Settings: check <strong>Supports collaboration</strong></li> -<li>Permissions: -<ul> -<li>This is also called application scope, and it defines what access rights your application has to the user’s data.</li> -<li><strong>Application can read your profile information</strong> - Enable your application to access the Onshape user profile. Check this option.</li> -<li><strong>Application can read your documents</strong> - Onshape documents created by this user can be accessed with read privileges only. Check this option.</li> -<li><strong>Application can write to your documents</strong> - The user-owned Onshape documents can be modified by this application. Check this option.</li> -<li><strong>Application can delete documents and workspaces</strong> - Your application will be able to delete a workspace within a document or the complete Onshape document. Do not check this option for this example.</li> -<li><strong>Application can request Purchases on Your behalf</strong> - The application will have access to make purchases if required. Do not check this option for this example.</li> -<li><strong>Application can share and unshare documents on your behalf</strong> - Onshape’s document sharing capabilities are very powerful; they enable other parties to access your shared documents with -predefined rights. If this option is checked, the application can automatically share a document with other people. Do not check this option for this example.</li> -</ul> -</li> -</ul> -</li> -<li>Click <strong>Create application</strong>.</li> -<li><font style="color: red"><b>COPY THE OAUTH SECRET FROM THE POP-UP WINDOW.<b></font> -<ul> -<li>You will not be able to access this secret again.</li> -<li>This secret is unique to you and your app and should be protected like any sensitive password. For example, it should <em>NOT</em> be checked in to source code control systems.</li> -</ul> -</li> -<li>Click <strong>Close</strong>.</li> -<li>Copy the <strong>OAuth client identifier</strong> from the app Details page that opens. -<ul> -<li>These OAuth secret and client ID keys will be used in your code for requesting a one-time user authorization code from Onshape.</li> -</ul> -</li> -</ol> -<p>Your application is now registered with Onshape and you have options to -modify the application definition through this portal.</p> -<img src="https://onshape-public.github.io/images/dev-portal-app-details-01.png" alt="the gltf-viewer app in the onshape dev portal app details screen" /> -<h3 id="2-get-the-user-authorization-code">2: Get the user authorization code</h3> -<p>We’ll start by loading the basic libraries required to run this sample. We&rsquo;ll use Passport to authenticate requests through plugins known as strategies. In this example, we&rsquo;ll use an Onshape-developed plugin called <code>passport-onshape</code>, but you can define your own strategy to use with Passport, if you prefer. You can find more information on <a href="https://www.npmjs.com/package/passport">Passport here</a>.</p> -<ol> -<li>Create a directory for your app, and then install Passport and passport-onshape:</li> -</ol> -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-js" data-lang="js"><span style="display:flex;"><span>npm install passport -</span></span><span style="display:flex;"><span>npm install passport-onshape -</span></span></code></pre></div><ol start="2"> -<li>Next, create a file calls <code>app.js</code> and add the following definitions to the top of the file:</li> -</ol> -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-javascript" data-lang="javascript"><span style="display:flex;"><span><span style="color:#aaa;font-style:italic">// App definitions -</span></span></span><span style="display:flex;"><span><span style="color:#aaa;font-style:italic"></span><span style="color:#00a">const</span> path = require(<span style="color:#a50">&#39;path&#39;</span>); -</span></span><span style="display:flex;"><span><span style="color:#00a">const</span> uuid = require(<span style="color:#a50">&#39;uuid&#39;</span>); -</span></span><span style="display:flex;"><span> -</span></span><span style="display:flex;"><span><span style="color:#00a">const</span> express = require(<span style="color:#a50">&#39;express&#39;</span>); -</span></span><span style="display:flex;"><span><span style="color:#00a">const</span> session = require(<span style="color:#a50">&#39;express-session&#39;</span>); -</span></span><span style="display:flex;"><span><span style="color:#00a">const</span> bodyParser = require(<span style="color:#a50">&#39;body-parser&#39;</span>); -</span></span><span style="display:flex;"><span> -</span></span><span style="display:flex;"><span><span style="color:#00a">const</span> passport = require(<span style="color:#a50">&#39;passport&#39;</span>); -</span></span><span style="display:flex;"><span><span style="color:#00a">const</span> OnshapeStrategy = require(<span style="color:#a50">&#39;passport-onshape&#39;</span>); -</span></span><span style="display:flex;"><span> -</span></span><span style="display:flex;"><span><span style="color:#00a">const</span> config = require(<span style="color:#a50">&#39;./config&#39;</span>); -</span></span></code></pre></div><ol start="3"> -<li>Next, tell Express to use Passport and initialize it. Note: you can replace the Express code with code for the web server of your choice.</li> -</ol> -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-javascript" data-lang="javascript"><span style="display:flex;"><span><span style="color:#aaa;font-style:italic">// Tell Express to use Passport, and initialize it. -</span></span></span><span style="display:flex;"><span><span style="color:#aaa;font-style:italic"></span><span style="color:#00a">const</span> app = express(); -</span></span><span style="display:flex;"><span> -</span></span><span style="display:flex;"><span>app.use(express.<span style="color:#00a">static</span>(path.join(__dirname, <span style="color:#a50">&#39;public&#39;</span>))); -</span></span><span style="display:flex;"><span>app.use(express.<span style="color:#00a">static</span>(path.join(__dirname, <span style="color:#a50">&#39;dist&#39;</span>))); -</span></span><span style="display:flex;"><span>app.use(bodyParser.json()); -</span></span><span style="display:flex;"><span> -</span></span><span style="display:flex;"><span>app.set(<span style="color:#a50">&#39;trust proxy&#39;</span>, <span style="color:#099">1</span>); <span style="color:#aaa;font-style:italic">// To allow to run correctly behind Heroku when deployed -</span></span></span><span style="display:flex;"><span><span style="color:#aaa;font-style:italic"></span> -</span></span><span style="display:flex;"><span>app.use(session({ -</span></span><span style="display:flex;"><span> secret: config.sessionSecret, -</span></span><span style="display:flex;"><span> saveUninitialized: <span style="color:#00a">false</span>, -</span></span><span style="display:flex;"><span> resave: <span style="color:#00a">false</span>, -</span></span><span style="display:flex;"><span> cookie: { -</span></span><span style="display:flex;"><span> name: <span style="color:#a50">&#39;app-gltf-viewer&#39;</span>, -</span></span><span style="display:flex;"><span> sameSite: <span style="color:#a50">&#39;none&#39;</span>, -</span></span><span style="display:flex;"><span> secure: <span style="color:#00a">true</span>, -</span></span><span style="display:flex;"><span> httpOnly: <span style="color:#00a">true</span>, -</span></span><span style="display:flex;"><span> path: <span style="color:#a50">&#39;/&#39;</span>, -</span></span><span style="display:flex;"><span> maxAge: <span style="color:#099">1000</span> * <span style="color:#099">60</span> * <span style="color:#099">60</span> * <span style="color:#099">24</span> <span style="color:#aaa;font-style:italic">// 1 day -</span></span></span><span style="display:flex;"><span><span style="color:#aaa;font-style:italic"></span> } -</span></span><span style="display:flex;"><span>})); -</span></span><span style="display:flex;"><span>app.use(passport.initialize()); -</span></span><span style="display:flex;"><span>app.use(passport.session()); -</span></span></code></pre></div><ol start="4"> -<li>Next, we&rsquo;ll store the Onshape user information so it can be retrieved from <code>req.user</code> in -each call. Passport uses the <code>serializeUser</code> function to persist user data (after successful -authentication) into the session. The function <code>deserializeUser</code> is used -to retrieve user data from session.</li> -</ol> -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-javascript" data-lang="javascript"><span style="display:flex;"><span><span style="color:#aaa;font-style:italic">//Store the Onshape user information -</span></span></span><span style="display:flex;"><span><span style="color:#aaa;font-style:italic"></span>passport.serializeUser((user, done) =&gt; done(<span style="color:#00a">null</span>, user)); -</span></span><span style="display:flex;"><span>passport.deserializeUser((obj, done) =&gt; done(<span style="color:#00a">null</span>, obj)); -</span></span></code></pre></div><ol start="6"> -<li>Initialize Passport with the Onshape Strategy:</li> -</ol> -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-javascript" data-lang="javascript"><span style="display:flex;"><span><span style="color:#aaa;font-style:italic">//Initialize Passport with the Onshape Strategy -</span></span></span><span style="display:flex;"><span><span style="color:#aaa;font-style:italic"></span>passport.use(<span style="color:#00a">new</span> OnshapeStrategy({ -</span></span><span style="display:flex;"><span> clientID: config.oauthClientId, -</span></span><span style="display:flex;"><span> clientSecret: config.oauthClientSecret, -</span></span><span style="display:flex;"><span> callbackURL: config.oauthCallbackUrl, -</span></span><span style="display:flex;"><span> authorizationURL: <span style="color:#a50">`</span><span style="color:#a50">${</span>config.oauthUrl<span style="color:#a50">}</span><span style="color:#a50">/oauth/authorize`</span>, -</span></span><span style="display:flex;"><span> tokenURL: <span style="color:#a50">`</span><span style="color:#a50">${</span>config.oauthUrl<span style="color:#a50">}</span><span style="color:#a50">/oauth/token`</span>, -</span></span><span style="display:flex;"><span> userProfileURL: <span style="color:#a50">`</span><span style="color:#a50">${</span>config.oauthUrl<span style="color:#a50">}</span><span style="color:#a50">/api/users/sessioninfo`</span> -</span></span><span style="display:flex;"><span> }, -</span></span><span style="display:flex;"><span> (accessToken, refreshToken, profile, done) =&gt; { -</span></span><span style="display:flex;"><span> profile.accessToken = accessToken; -</span></span><span style="display:flex;"><span> profile.refreshToken = refreshToken; -</span></span><span style="display:flex;"><span> <span style="color:#00a">return</span> done(<span style="color:#00a">null</span>, profile); -</span></span><span style="display:flex;"><span> } -</span></span><span style="display:flex;"><span>)); -</span></span></code></pre></div><ol start="7"> -<li>Open your environment variables file (e.g.,<code>.env</code>, <code>.bashrc</code>, <code>.bash_profile</code>, <code>.zshrc,</code> etc.) and add the following environment variables, then save and close the file.</li> -</ol> -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>authorizationURL : https://oauth.onshape.com/oauth/authorize -</span></span><span style="display:flex;"><span>tokenURL : https://oauth.onshape.com/oauth/token -</span></span><span style="display:flex;"><span>userProfileURL : https://cad.onshape.com/api/users/sessioninfo -</span></span></code></pre></div><p>The callback function will provide us with the <code>accessToken</code>, the <code>refreshToken</code>, and the user’s Onshape profile once authentication has been successfully passed. We can now use this to update our database with user-specific information.</p> -<p>Note that if you store the <code>accessToken</code> and <code>refreshToken</code> in the database along with the user record, you must update it each time that the access codes are refreshed.</p> -<ol start="8"> -<li>Next, we define our endpoint where the authorization flow starts (in this case, <code>/oauthSignin</code>). This is the endpoint that we previously defined in the Onshape application setup. This will redirect to an Onshape page in order for the user to confirm (or deny) the applications access to theOnshape resources.</li> -</ol> -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-javascript" data-lang="javascript"><span style="display:flex;"><span><span style="color:#aaa;font-style:italic">//Define the Onshape API endpoint -</span></span></span><span style="display:flex;"><span><span style="color:#aaa;font-style:italic"></span>app.use(<span style="color:#a50">&#39;/oauthSignin&#39;</span>, (req, res) =&gt; { -</span></span><span style="display:flex;"><span> <span style="color:#aaa;font-style:italic">/* These 5 lines are specific to the glTF Viewer sample app. You can replace them with the input for whatever Onshape endpoints you are using in your app */</span> -</span></span><span style="display:flex;"><span> <span style="color:#00a">const</span> state = { -</span></span><span style="display:flex;"><span> docId: req.query.documentId, -</span></span><span style="display:flex;"><span> workId: req.query.workspaceId, -</span></span><span style="display:flex;"><span> elId: req.query.elementId -</span></span><span style="display:flex;"><span> }; -</span></span><span style="display:flex;"><span> req.session.state = state; -</span></span><span style="display:flex;"><span> <span style="color:#00a">return</span> passport.authenticate(<span style="color:#a50">&#39;onshape&#39;</span>, { state: uuid.v4(state) })(req, res); -</span></span><span style="display:flex;"><span>}, (req, res) =&gt; { -</span></span><span style="display:flex;"><span> -</span></span><span style="display:flex;"><span> }); -</span></span></code></pre></div><h3 id="3-exchange-the-code-for-an-access-token">3: Exchange the code for an access token</h3> -<p>Fortunately, if you are using Passport, there isn’t much to do once the user grants authorization. The return URL will contain the one-time authorization token, which Passport will extract and exchange for an access token and a refresh token, which are available in Passport callback function.</p> -<ol> -<li>Add the following code to <code>app.js</code>:</li> -</ol> -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-javascript" data-lang="javascript"><span style="display:flex;"><span><span style="color:#aaa;font-style:italic">//Exchange the code for an access token -</span></span></span><span style="display:flex;"><span><span style="color:#aaa;font-style:italic"></span>app.use(<span style="color:#a50">&#39;/oauthRedirect&#39;</span>, passport.authenticate(<span style="color:#a50">&#39;onshape&#39;</span>, { failureRedirect: <span style="color:#a50">&#39;/grantDenied&#39;</span> }), (req, res) =&gt; { -</span></span><span style="display:flex;"><span> <span style="color:#aaa;font-style:italic">/* This code is specific to the glTF Viewer sample app. You can replace it with the input for whatever Onshape endpoints you are using in your app. */</span> -</span></span><span style="display:flex;"><span> res.redirect(<span style="color:#a50">`/?documentId=</span><span style="color:#a50">${</span>req.session.state.docId<span style="color:#a50">}</span><span style="color:#a50"> -</span></span></span><span style="display:flex;"><span><span style="color:#a50">&amp;workspaceId=</span><span style="color:#a50">${</span>req.session.state.workId<span style="color:#a50">}</span><span style="color:#a50">&amp;elementId= -</span></span></span><span style="display:flex;"><span><span style="color:#a50"> </span><span style="color:#a50">${</span>req.session.state.elId<span style="color:#a50">}</span><span style="color:#a50">`</span>); -</span></span><span style="display:flex;"><span>}); -</span></span></code></pre></div><ol start="2"> -<li>If the user clicks <strong>Deny</strong> instead of <strong>Authorize Application</strong>, they are taken to a page that notifies them that access to the application was denied. We can see that in the <code>failureRedirect</code> argument. Add the following to <code>app.js</code>:</li> -</ol> -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-javascript" data-lang="javascript"><span style="display:flex;"><span><span style="color:#aaa;font-style:italic">//Handle denied access -</span></span></span><span style="display:flex;"><span><span style="color:#aaa;font-style:italic"></span>app.get(<span style="color:#a50">&#39;/grantDenied&#39;</span>, (req, res) =&gt; { -</span></span><span style="display:flex;"><span> res.sendFile(path.join(__dirname, <span style="color:#a50">&#39;public&#39;</span>, <span style="color:#a50">&#39;html&#39;</span>, <span style="color:#a50">&#39;grantDenied.html&#39;</span>)); -</span></span><span style="display:flex;"><span>}) -</span></span></code></pre></div><p>Now we have received the access token, and it can be accessed from <code>res.user.accessToken</code> on this page or from <code>req.user.accessToken</code> from any other page you redirect to from here.</p> -<h3 id="4-use-the-access-token">4: Use the access token</h3> -<ol> -<li>Add the following to the bottom of <code>app.js</code>. You can see that the access token is used as an Authorization header:</li> -</ol> -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-js" data-lang="js"><span style="display:flex;"><span><span style="color:#aaa;font-style:italic">//Use the access token as an Authorization header -</span></span></span><span style="display:flex;"><span><span style="color:#aaa;font-style:italic"></span>makeOnshapeAPICall: <span style="color:#00a">async</span> (req, res) =&gt; { -</span></span><span style="display:flex;"><span> <span style="color:#00a">try</span> { -</span></span><span style="display:flex;"><span> <span style="color:#00a">const</span> apiUrl = <span style="color:#a50">&#34;https://cad.onshape.com/api/documents?ownerType=1&amp;sortColumn=createdAt&amp;sortOrder=desc&amp;offset=0&amp;limit=20&#34;</span>; <span style="color:#aaa;font-style:italic">//You can replace this with any Onshape API endpoint URL. -</span></span></span><span style="display:flex;"><span><span style="color:#aaa;font-style:italic"></span> <span style="color:#00a">const</span> resp = <span style="color:#00a">await</span> fetch(normalizedUrl, { headers: { Authorization: <span style="color:#a50">`Bearer </span><span style="color:#a50">${</span>req.user.accessToken<span style="color:#a50">}</span><span style="color:#a50">`</span> }}); -</span></span><span style="display:flex;"><span> <span style="color:#00a">const</span> data = <span style="color:#00a">await</span> resp.text(); -</span></span><span style="display:flex;"><span> <span style="color:#00a">const</span> contentType = resp.headers.get(<span style="color:#a50">&#39;Content-Type&#39;</span>); -</span></span><span style="display:flex;"><span> res.status(resp.status).contentType(contentType).send(data); -</span></span><span style="display:flex;"><span> } <span style="color:#00a">catch</span> (err) { -</span></span><span style="display:flex;"><span> res.status(<span style="color:#099">500</span>).json({ error: err }); -</span></span><span style="display:flex;"><span> } -</span></span><span style="display:flex;"><span> } -</span></span></code></pre></div><p>Note: in the glTF Viewer sample app, this code appears in <code>utils.js</code> instead of <code>app.js</code>.</p> -<h3 id="5-refresh-the-token">5: Refresh the token</h3> -<p>When the access token expires, it must be refreshed by making another <code>POST</code> request to <code>https://oauth.onshape.com/oauth/token</code> with the following URL-encoded form body (with <code>Content-Type application/x-www-form-urlencoded</code>):</p> -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span><span style="color:#a00">grant_type</span>=refresh_token&amp;<span style="color:#a00">refresh_token</span>=<span style="color:#a50">\&lt;</span>refresh_token<span style="color:#a50">\&gt;</span>&amp;<span style="color:#a00">client_id</span>=<span style="color:#a50">\&lt;</span>client_id<span style="color:#a50">\&gt;</span>&amp;<span style="color:#a00">client_secret</span>=<span style="color:#a50">\&lt;</span>client_secret<span style="color:#a50">\&gt;</span> -</span></span></code></pre></div><p>As with the authorization code data, the parameters in the form body must be URL-encoded. The response to this <code>POST</code> request will be a JSON-encoded structure with a new <code>access_token</code> value that can be used for the next 60 minutes.</p> -<p>Refresh tokens are valid for the lifetime of the user’s grant. If a user who previously granted access to your application decides to revoke the grant, the refresh token is invalidated. If the user decides to re-grant application access, a new refresh token is generated and returned along with the access token.</p> -<ol> -<li>Add the following to <code>app.js</code>:</li> -</ol> -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-js" data-lang="js"><span style="display:flex;"><span><span style="color:#aaa;font-style:italic">/** After landing on the home page, we check if a user had already signed in. If no user has signed in, we redirect the request to the OAuth sign-in page. If a user had signed in previously, we will attempt to refresh the access token of the user. After successfully refreshing the access token, we will simply take the user to the landing page of the app. If the refresh token request fails, we will redirect the user to the OAuth sign-in page again. */</span> -</span></span><span style="display:flex;"><span>app.get(<span style="color:#a50">&#39;/&#39;</span>, (req, res) =&gt; { -</span></span><span style="display:flex;"><span> <span style="color:#00a">if</span> (!req.user) { -</span></span><span style="display:flex;"><span> <span style="color:#00a">return</span> res.redirect(<span style="color:#a50">`/oauthSignin</span><span style="color:#a50">${</span>req._parsedUrl.search ? req._parsedUrl.search : <span style="color:#a50">&#34;&#34;</span><span style="color:#a50">}</span><span style="color:#a50">`</span>); -</span></span><span style="display:flex;"><span> } <span style="color:#00a">else</span> { -</span></span><span style="display:flex;"><span> refreshAccessToken(req.user).then((tokenJson) =&gt; { -</span></span><span style="display:flex;"><span> <span style="color:#aaa;font-style:italic">// Dereference the user object and update the access token and refresh token in the in-memory object. -</span></span></span><span style="display:flex;"><span><span style="color:#aaa;font-style:italic"></span> <span style="color:#00a">let</span> usrObj = JSON.parse(JSON.stringify(req.user)); -</span></span><span style="display:flex;"><span> usrObj.accessToken = tokenJson.access_token; -</span></span><span style="display:flex;"><span> usrObj.refreshToken = tokenJson.refresh_token; -</span></span><span style="display:flex;"><span> <span style="color:#aaa;font-style:italic">// Update the user object in PassportJS. No redirections will happen here, this is a purely internal operation. -</span></span></span><span style="display:flex;"><span><span style="color:#aaa;font-style:italic"></span> req.login(usrObj, () =&gt; { -</span></span><span style="display:flex;"><span> <span style="color:#00a">return</span> res.sendFile(path.join(__dirname, <span style="color:#a50">&#39;public&#39;</span>, <span style="color:#a50">&#39;html&#39;</span>, <span style="color:#a50">&#39;index.html&#39;</span>)); -</span></span><span style="display:flex;"><span> }); -</span></span><span style="display:flex;"><span> }).<span style="color:#00a">catch</span>(() =&gt; { -</span></span><span style="display:flex;"><span> <span style="color:#aaa;font-style:italic">// Refresh token failed, take the user to OAuth sign in page. -</span></span></span><span style="display:flex;"><span><span style="color:#aaa;font-style:italic"></span> <span style="color:#00a">return</span> res.redirect(<span style="color:#a50">`/oauthSignin</span><span style="color:#a50">${</span>req._parsedUrl.search ? req._parsedUrl.search : <span style="color:#a50">&#34;&#34;</span><span style="color:#a50">}</span><span style="color:#a50">`</span>); -</span></span><span style="display:flex;"><span> }); -</span></span><span style="display:flex;"><span> } -</span></span><span style="display:flex;"><span>}); -</span></span><span style="display:flex;"><span> -</span></span><span style="display:flex;"><span><span style="color:#aaa;font-style:italic">//Refresh the access token -</span></span></span><span style="display:flex;"><span><span style="color:#aaa;font-style:italic"></span><span style="color:#00a">const</span> refreshAccessToken = <span style="color:#00a">async</span> (user) =&gt; { -</span></span><span style="display:flex;"><span> <span style="color:#00a">const</span> body = <span style="color:#a50">&#39;grant_type=refresh_token&amp;refresh_token=&#39;</span> + user.refreshToken + <span style="color:#a50">&#39;&amp;client_id=&#39;</span> + config.oauthClientId + <span style="color:#a50">&#39;&amp;client_secret=&#39;</span> + config.oauthClientSecret; -</span></span><span style="display:flex;"><span> <span style="color:#00a">let</span> res = <span style="color:#00a">await</span> fetch(config.oauthUrl + <span style="color:#a50">&#34;/oauth/token&#34;</span>, { -</span></span><span style="display:flex;"><span> method: <span style="color:#a50">&#39;POST&#39;</span>, -</span></span><span style="display:flex;"><span> headers: { -</span></span><span style="display:flex;"><span> <span style="color:#a50">&#39;Content-Type&#39;</span>: <span style="color:#a50">&#39;application/x-www-form-urlencoded&#39;</span> -</span></span><span style="display:flex;"><span> }, -</span></span><span style="display:flex;"><span> body: body -</span></span><span style="display:flex;"><span> }); -</span></span><span style="display:flex;"><span> <span style="color:#00a">if</span> (res.ok) { -</span></span><span style="display:flex;"><span> <span style="color:#00a">return</span> <span style="color:#00a">await</span> res.json(); -</span></span><span style="display:flex;"><span> } <span style="color:#00a">else</span> { -</span></span><span style="display:flex;"><span> <span style="color:#00a">throw</span> <span style="color:#00a">new</span> <span style="color:#0aa">Error</span>(<span style="color:#a50">&#34;Could not refresh access token, please sign in again.&#34;</span>); -</span></span><span style="display:flex;"><span> } -</span></span><span style="display:flex;"><span>} -</span></span><span style="display:flex;"><span> -</span></span><span style="display:flex;"><span>app.use(<span style="color:#a50">&#39;/api&#39;</span>, require(<span style="color:#a50">&#39;./api&#39;</span>)); -</span></span><span style="display:flex;"><span>module.exports = app; -</span></span></code></pre></div><ol start="2"> -<li>Save the file.</li> -<li>To see the authentication working in practice, you can follow the instructions in the <a href="https://github.com/onshape-public/app-gltf-viewer#readme">glTF Viewer README</a> to deploy the glTF Viewer app.</li> -</ol> -<h3 id="6-grant-authorization">6: Grant authorization</h3> -<p>For apps published in the Onshape App Store, the Onshape user must grant authorization to your application to access the Onshape data. This must be done by each user of your app.</p> -<p>To grant the application access to a user&rsquo;s data in Onshape, the <em>Onshape user</em> must follow the steps below:</p> -<ol> -<li>Sign in to <code>cad.onshape.com</code>. -<ul> -<li>Note: Use <code>https://companyName.onshape.com</code> for Enterprise accounts. See <a href="#enterprise-users">Enterprise users</a> below for more information.</li> -</ul> -</li> -<li>Click their name in the top-right corner of the Onshape window, and then click <strong>My account</strong> in the dropdown menu. -</br><img src="https://onshape-public.github.io/images/myaccountdropdown.png" alt="drawing" width="300"/></li> -<li>Click <strong>Applications</strong> in the left sidebar. -<ul> -<li>Note that the gltf-viewer app will not appear in this list until it has been deployed and subscribed to as described in the <a href="https://github.com/onshape-public/app-gltf-viewer#readme">glTF Viewer README</a>.</li> -</ul> -</li> -<li>Click <strong>Grant</strong> next to your app name to grant it access to their Onshape data. The Onshape user can click <strong>Revoke</strong> at any time to prevent your app from accessing their Onshape data.</li> -<li>The user will see the Authorize application screen shown below and will need to confirm their authorization grant by clicking <strong>Authorize application</strong>. The user is then redirected to the Redirect URL you specified in your code. Your app can now access the user&rsquo;s Onshape resources and profile.</li> -</ol> -<h2 id="notes">Notes</h2> -<h3 id="installed-desktop-applications">Installed desktop applications</h3> -<p>OAuth is designed for interactions between two servers using a browser. However, it can also be used by an installed desktop (or mobile) application. The application must perform a similar role to that of a third party server: it must exchange the code for an access token structure.</p> -<p>To enable this, Onshape allows two special forms of redirect URI to be registered:</p> -<ul> -<li><code>http://localhost:&lt;port&gt;</code> Causes the browser to attempt to load a page from the host upon which it is running. The code parameter will be supplied exactly the same as outlined above. If the application can listen on the registered port and behave as a simple web server for the redirect URL, it can retrieve the code in the same way as a deployed web server.</li> -<li><code>urn:ietf:wg:oauth:2.0:oob</code> Causes the browser to display a simple page after a request has been granted instead of going to a new URL. The page contains simple instructions to copy and paste code into an application field. The browser will also update the title of the window to contain the code. An application could also look for browsers with window titles containing the string <code>Success code=&lt;code&gt;</code> and automatically grab the code from the browser window title. If an error occurs (e.g., the grant is denied), the browser window title will contain <code>Error description=&lt;error string&gt;</code>.</li> -</ul> -<h3 id="enterprise-users">Enterprise users</h3> -<p>When a user authorizes an OAuth app to access Onshape on their behalf, they get a bearer token that corresponds to their session and the allowed scopes.</p> -<p>However, if the user has a seat in the Enterprise, additional information is needed to determine whether to allow the bearer token to access enterprise data for the user or simply return non-enterprise data. We use the <code>companyId</code> field for this distinction.</p> -<p>There are two ways of setting the <code>companyId</code> correctly to access enterprise data:</p> -<ul> -<li>During the authorization process, select the name and URL of the enterprise instead of <code>cad.onshape.com</code>. This will correctly associate your bearer token with the <code>companyId</code>.</li> -<li>If you have an integrated app, call the <a href="https://cad.onshape.com/glassworks/explorer/#/Company/findCompany">Company/findCompany</a> endpoint to obtain the <code>companyId</code>. Append this <code>companyId</code> as a query parameter to the <code>/authorize</code> URL while initiating the OAuth workflow. (Note: you may be asked to authenticate yourself again.)</li> -</ul> -<h3 id="3rd-party-cookies">3rd-party cookies</h3> -<p>3rd-party cookies must be enabled in the browser for Onshape apps to work correctly.</p> -<h3 id="debugging">Debugging</h3> -<p>Debugging OAuth can be a little tricky. Some tips are below:</p> -<ol> -<li>Make sure you are correctly URL encoding the values supplied to the oauth/authorize and oauth/token endpoints.</li> -<li>Use a <code>GET /oauth/authorize</code> but a <code>POST /oauth/token</code> and make sure that the GET uses query parameters but that the <code>POST</code> uses a URL-encoded form body.</li> -<li>If you supply a <code>redirect_uri</code> to <code>/oauth/authorize</code>, you must also supply it as an additional parameter in the <code>POST</code> to <code>/oauth/token</code></li> -<li>Use a tool such as <a href="https://portswigger.net/burp">Burp</a> or <a href="http://charlesproxy.com">Charles</a> to deliberately &lsquo;man-in-the-middle&rsquo; the connection requests between your server and Onshape, and verify that you are performing the correct REST operations (GET vs. POST) and correctly URL-encoding the parameter values.</li> -</ol> -<h2 id="final-code">Final Code</h2> -<p>The above example uses Node.js to authenticate an Onshape app. This section includes the code for using OAuth2 with other coding languages.</p> -<h3 id="nodejs">Node.js</h3> -<p><strong>Prerequisites</strong></p> -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>npm install passport -</span></span><span style="display:flex;"><span>npm install passport-onshape -</span></span></code></pre></div><p><strong>Environment variables</strong></p> -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>authorizationURL : &lt;https://oauth.onshape.com/oauth/authorize&gt; -</span></span><span style="display:flex;"><span>tokenURL : &lt;https://oauth.onshape.com/oauth/token&gt; -</span></span><span style="display:flex;"><span>userProfileURL : &lt;https://cad.onshape.com/api/users/sessioninfo&gt; -</span></span></code></pre></div><p><strong>app.js</strong></p> -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-js" data-lang="js"><span style="display:flex;"><span><span style="color:#aaa;font-style:italic">//App definitions -</span></span></span><span style="display:flex;"><span><span style="color:#aaa;font-style:italic"></span><span style="color:#00a">const</span> path = require(<span style="color:#a50">&#39;path&#39;</span>); -</span></span><span style="display:flex;"><span><span style="color:#00a">const</span> uuid = require(<span style="color:#a50">&#39;uuid&#39;</span>); -</span></span><span style="display:flex;"><span> -</span></span><span style="display:flex;"><span><span style="color:#00a">const</span> express = require(<span style="color:#a50">&#39;express&#39;</span>); -</span></span><span style="display:flex;"><span><span style="color:#00a">const</span> session = require(<span style="color:#a50">&#39;express-session&#39;</span>); -</span></span><span style="display:flex;"><span><span style="color:#00a">const</span> bodyParser = require(<span style="color:#a50">&#39;body-parser&#39;</span>); -</span></span><span style="display:flex;"><span> -</span></span><span style="display:flex;"><span><span style="color:#00a">const</span> passport = require(<span style="color:#a50">&#39;passport&#39;</span>); -</span></span><span style="display:flex;"><span><span style="color:#00a">const</span> OnshapeStrategy = require(<span style="color:#a50">&#39;passport-onshape&#39;</span>); -</span></span><span style="display:flex;"><span> -</span></span><span style="display:flex;"><span><span style="color:#00a">const</span> config = require(<span style="color:#a50">&#39;./config&#39;</span>); -</span></span><span style="display:flex;"><span> -</span></span><span style="display:flex;"><span><span style="color:#aaa;font-style:italic">//Tell Express to use Passport, and initialize it. -</span></span></span><span style="display:flex;"><span><span style="color:#aaa;font-style:italic"></span><span style="color:#00a">const</span> app = express(); -</span></span><span style="display:flex;"><span> -</span></span><span style="display:flex;"><span>app.use(express.<span style="color:#00a">static</span>(path.join(__dirname, <span style="color:#a50">&#39;public&#39;</span>))); -</span></span><span style="display:flex;"><span>app.use(express.<span style="color:#00a">static</span>(path.join(__dirname, <span style="color:#a50">&#39;dist&#39;</span>))); -</span></span><span style="display:flex;"><span>app.use(bodyParser.json()); -</span></span><span style="display:flex;"><span> -</span></span><span style="display:flex;"><span>app.set(<span style="color:#a50">&#39;trust proxy&#39;</span>, <span style="color:#099">1</span>); <span style="color:#aaa;font-style:italic">// To allow to run correctly behind Heroku when deployed. -</span></span></span><span style="display:flex;"><span><span style="color:#aaa;font-style:italic"></span> -</span></span><span style="display:flex;"><span>app.use(session({ -</span></span><span style="display:flex;"><span> secret: config.sessionSecret, -</span></span><span style="display:flex;"><span> saveUninitialized: <span style="color:#00a">false</span>, -</span></span><span style="display:flex;"><span> resave: <span style="color:#00a">false</span>, -</span></span><span style="display:flex;"><span> cookie: { -</span></span><span style="display:flex;"><span> name: <span style="color:#a50">&#39;app-gltf-viewer&#39;</span>, -</span></span><span style="display:flex;"><span> sameSite: <span style="color:#a50">&#39;none&#39;</span>, -</span></span><span style="display:flex;"><span> secure: <span style="color:#00a">true</span>, -</span></span><span style="display:flex;"><span> httpOnly: <span style="color:#00a">true</span>, -</span></span><span style="display:flex;"><span> path: <span style="color:#a50">&#39;/&#39;</span>, -</span></span><span style="display:flex;"><span> maxAge: <span style="color:#099">1000</span> * <span style="color:#099">60</span> * <span style="color:#099">60</span> * <span style="color:#099">24</span> <span style="color:#aaa;font-style:italic">// 1 day -</span></span></span><span style="display:flex;"><span><span style="color:#aaa;font-style:italic"></span> } -</span></span><span style="display:flex;"><span>})); -</span></span><span style="display:flex;"><span>app.use(passport.initialize()); -</span></span><span style="display:flex;"><span>app.use(passport.session()); -</span></span><span style="display:flex;"><span> -</span></span><span style="display:flex;"><span><span style="color:#aaa;font-style:italic">//Store the Onshape user information -</span></span></span><span style="display:flex;"><span><span style="color:#aaa;font-style:italic"></span>passport.serializeUser((user, done) =&gt; done(<span style="color:#00a">null</span>, user)); -</span></span><span style="display:flex;"><span>passport.deserializeUser((obj, done) =&gt; done(<span style="color:#00a">null</span>, obj)); -</span></span><span style="display:flex;"><span> -</span></span><span style="display:flex;"><span><span style="color:#aaa;font-style:italic">//Initialize Passport with the Onshape Strategy -</span></span></span><span style="display:flex;"><span><span style="color:#aaa;font-style:italic"></span>passport.use(<span style="color:#00a">new</span> OnshapeStrategy({ -</span></span><span style="display:flex;"><span> clientID: config.oauthClientId, -</span></span><span style="display:flex;"><span> clientSecret: config.oauthClientSecret, -</span></span><span style="display:flex;"><span> callbackURL: config.oauthCallbackUrl, -</span></span><span style="display:flex;"><span> authorizationURL: <span style="color:#a50">`</span><span style="color:#a50">${</span>config.oauthUrl<span style="color:#a50">}</span><span style="color:#a50">/oauth/authorize`</span>, -</span></span><span style="display:flex;"><span> tokenURL: <span style="color:#a50">`</span><span style="color:#a50">${</span>config.oauthUrl<span style="color:#a50">}</span><span style="color:#a50">/oauth/token`</span>, -</span></span><span style="display:flex;"><span> userProfileURL: <span style="color:#a50">`</span><span style="color:#a50">${</span>config.oauthUrl<span style="color:#a50">}</span><span style="color:#a50">/api/users/sessioninfo`</span> -</span></span><span style="display:flex;"><span> }, -</span></span><span style="display:flex;"><span> (accessToken, refreshToken, profile, done) =&gt; { -</span></span><span style="display:flex;"><span> profile.accessToken = accessToken; -</span></span><span style="display:flex;"><span> profile.refreshToken = refreshToken; -</span></span><span style="display:flex;"><span> <span style="color:#00a">return</span> done(<span style="color:#00a">null</span>, profile); -</span></span><span style="display:flex;"><span> } -</span></span><span style="display:flex;"><span>)); -</span></span><span style="display:flex;"><span> -</span></span><span style="display:flex;"><span><span style="color:#aaa;font-style:italic">//Define the Onshape API endpoint -</span></span></span><span style="display:flex;"><span><span style="color:#aaa;font-style:italic"></span>app.use(<span style="color:#a50">&#39;/oauthSignin&#39;</span>, (req, res) =&gt; { -</span></span><span style="display:flex;"><span> <span style="color:#aaa;font-style:italic">/* These 5 lines are specific to the glTF Viewer sample app. You can replace them with the input for whatever Onshape endpoints you are using in your app. */</span> -</span></span><span style="display:flex;"><span> <span style="color:#00a">const</span> state = { -</span></span><span style="display:flex;"><span> docId: req.query.documentId, -</span></span><span style="display:flex;"><span> workId: req.query.workspaceId, -</span></span><span style="display:flex;"><span> elId: req.query.elementId -</span></span><span style="display:flex;"><span> }; -</span></span><span style="display:flex;"><span> req.session.state = state; -</span></span><span style="display:flex;"><span> <span style="color:#00a">return</span> passport.authenticate(<span style="color:#a50">&#39;onshape&#39;</span>, { state: uuid.v4(state) })(req, res); -</span></span><span style="display:flex;"><span>}, (req, res) =&gt; { -</span></span><span style="display:flex;"><span> -</span></span><span style="display:flex;"><span>}); -</span></span><span style="display:flex;"><span> -</span></span><span style="display:flex;"><span>app.use(<span style="color:#a50">&#39;/oauthRedirect&#39;</span>, passport.authenticate(<span style="color:#a50">&#39;onshape&#39;</span>, { failureRedirect: <span style="color:#a50">&#39;/grantDenied&#39;</span> }), (req, res) =&gt; { -</span></span><span style="display:flex;"><span> <span style="color:#aaa;font-style:italic">/* This code is specific to the glTF Viewer sample app. You can replace it with the input for whatever Onshape endpoints you are using in your app. */</span> -</span></span><span style="display:flex;"><span> res.redirect(<span style="color:#a50">`/?documentId=</span><span style="color:#a50">${</span>req.session.state.docId<span style="color:#a50">}</span><span style="color:#a50">&amp;workspaceId=</span><span style="color:#a50">${</span>req.session.state.workId<span style="color:#a50">}</span><span style="color:#a50">&amp;elementId=</span><span style="color:#a50">${</span>req.session.state.elId<span style="color:#a50">}</span><span style="color:#a50">`</span>); -</span></span><span style="display:flex;"><span>}); -</span></span><span style="display:flex;"><span> -</span></span><span style="display:flex;"><span><span style="color:#aaa;font-style:italic">//Handle denied access -</span></span></span><span style="display:flex;"><span><span style="color:#aaa;font-style:italic"></span>app.get(<span style="color:#a50">&#39;/grantDenied&#39;</span>, (req, res) =&gt; { -</span></span><span style="display:flex;"><span> res.sendFile(path.join(__dirname, <span style="color:#a50">&#39;public&#39;</span>, <span style="color:#a50">&#39;html&#39;</span>, <span style="color:#a50">&#39;grantDenied.html&#39;</span>)); -</span></span><span style="display:flex;"><span>}) -</span></span><span style="display:flex;"><span> -</span></span><span style="display:flex;"><span><span style="color:#aaa;font-style:italic">/** After landing on the home page, we check if a user had already signed in. If no user has signed in, we redirect the request to the OAuth sign-in page. If a user had signed in previously, we will attempt to refresh the access token of the user. After successfully refreshing the access token, we will simply take the user to the landing page of the app. If the refresh token request fails, we will redirect the user to the OAuth sign-in page again. */</span> -</span></span><span style="display:flex;"><span>app.get(<span style="color:#a50">&#39;/&#39;</span>, (req, res) =&gt; { -</span></span><span style="display:flex;"><span> <span style="color:#00a">if</span> (!req.user) { -</span></span><span style="display:flex;"><span> <span style="color:#00a">return</span> res.redirect(<span style="color:#a50">`/oauthSignin</span><span style="color:#a50">${</span>req._parsedUrl.search ? req._parsedUrl.search : <span style="color:#a50">&#34;&#34;</span><span style="color:#a50">}</span><span style="color:#a50">`</span>); -</span></span><span style="display:flex;"><span> } <span style="color:#00a">else</span> { -</span></span><span style="display:flex;"><span> refreshAccessToken(req.user).then((tokenJson) =&gt; { -</span></span><span style="display:flex;"><span> <span style="color:#aaa;font-style:italic">// Dereference the user object, and update the access token and refresh token in the in-memory object. -</span></span></span><span style="display:flex;"><span><span style="color:#aaa;font-style:italic"></span> <span style="color:#00a">let</span> usrObj = JSON.parse(JSON.stringify(req.user)); -</span></span><span style="display:flex;"><span> usrObj.accessToken = tokenJson.access_token; -</span></span><span style="display:flex;"><span> usrObj.refreshToken = tokenJson.refresh_token; -</span></span><span style="display:flex;"><span> <span style="color:#aaa;font-style:italic">// Update the user object in PassportJS. No redirections will happen here, this is a purely internal operation. -</span></span></span><span style="display:flex;"><span><span style="color:#aaa;font-style:italic"></span> req.login(usrObj, () =&gt; { -</span></span><span style="display:flex;"><span> <span style="color:#00a">return</span> res.sendFile(path.join(__dirname, <span style="color:#a50">&#39;public&#39;</span>, <span style="color:#a50">&#39;html&#39;</span>, <span style="color:#a50">&#39;index.html&#39;</span>)); -</span></span><span style="display:flex;"><span> }); -</span></span><span style="display:flex;"><span> }).<span style="color:#00a">catch</span>(() =&gt; { -</span></span><span style="display:flex;"><span> <span style="color:#aaa;font-style:italic">// Refresh token failed, take the user to OAuth sign in page. -</span></span></span><span style="display:flex;"><span><span style="color:#aaa;font-style:italic"></span> <span style="color:#00a">return</span> res.redirect(<span style="color:#a50">`/oauthSignin</span><span style="color:#a50">${</span>req._parsedUrl.search ? req._parsedUrl.search : <span style="color:#a50">&#34;&#34;</span><span style="color:#a50">}</span><span style="color:#a50">`</span>); -</span></span><span style="display:flex;"><span> }); -</span></span><span style="display:flex;"><span> } -</span></span><span style="display:flex;"><span>}); -</span></span><span style="display:flex;"><span> -</span></span><span style="display:flex;"><span><span style="color:#aaa;font-style:italic">//Refresh the access token -</span></span></span><span style="display:flex;"><span><span style="color:#aaa;font-style:italic"></span><span style="color:#00a">const</span> refreshAccessToken = <span style="color:#00a">async</span> (user) =&gt; { -</span></span><span style="display:flex;"><span> <span style="color:#00a">const</span> body = <span style="color:#a50">&#39;grant_type=refresh_token&amp;refresh_token=&#39;</span> + user.refreshToken + <span style="color:#a50">&#39;&amp;client_id=&#39;</span> + config.oauthClientId + <span style="color:#a50">&#39;&amp;client_secret=&#39;</span> + config.oauthClientSecret; -</span></span><span style="display:flex;"><span> <span style="color:#00a">let</span> res = <span style="color:#00a">await</span> fetch(config.oauthUrl + <span style="color:#a50">&#34;/oauth/token&#34;</span>, { -</span></span><span style="display:flex;"><span> method: <span style="color:#a50">&#39;POST&#39;</span>, -</span></span><span style="display:flex;"><span> headers: { -</span></span><span style="display:flex;"><span> <span style="color:#a50">&#39;Content-Type&#39;</span>: <span style="color:#a50">&#39;application/x-www-form-urlencoded&#39;</span> -</span></span><span style="display:flex;"><span> }, -</span></span><span style="display:flex;"><span> body: body -</span></span><span style="display:flex;"><span> }); -</span></span><span style="display:flex;"><span> <span style="color:#00a">if</span> (res.ok) { -</span></span><span style="display:flex;"><span> <span style="color:#00a">return</span> <span style="color:#00a">await</span> res.json(); -</span></span><span style="display:flex;"><span> } <span style="color:#00a">else</span> { -</span></span><span style="display:flex;"><span> <span style="color:#00a">throw</span> <span style="color:#00a">new</span> <span style="color:#0aa">Error</span>(<span style="color:#a50">&#34;Could not refresh access token, please sign in again.&#34;</span>); -</span></span><span style="display:flex;"><span> } -</span></span><span style="display:flex;"><span>} -</span></span><span style="display:flex;"><span> -</span></span><span style="display:flex;"><span>app.use(<span style="color:#a50">&#39;/api&#39;</span>, require(<span style="color:#a50">&#39;./api&#39;</span>)); -</span></span><span style="display:flex;"><span>module.exports = app; -</span></span><span style="display:flex;"><span> -</span></span><span style="display:flex;"><span><span style="color:#aaa;font-style:italic">//Use the access token in an Authorization header. -</span></span></span><span style="display:flex;"><span><span style="color:#aaa;font-style:italic"></span>makeOnshapeAPICall: <span style="color:#00a">async</span> (req, res) =&gt; { -</span></span><span style="display:flex;"><span> <span style="color:#00a">try</span> { -</span></span><span style="display:flex;"><span> <span style="color:#00a">const</span> apiUrl = <span style="color:#a50">&#34;https://cad.onshape.com/glassworks/explorer/#/Document/getDocuments&#34;</span>; <span style="color:#aaa;font-style:italic">//You can replace this with any Onshape API endpoint URL. -</span></span></span><span style="display:flex;"><span><span style="color:#aaa;font-style:italic"></span> <span style="color:#00a">const</span> resp = <span style="color:#00a">await</span> fetch(normalizedUrl, { headers: { Authorization: <span style="color:#a50">`Bearer </span><span style="color:#a50">${</span>req.user.accessToken<span style="color:#a50">}</span><span style="color:#a50">`</span> }}); -</span></span><span style="display:flex;"><span> <span style="color:#00a">const</span> data = <span style="color:#00a">await</span> resp.text(); -</span></span><span style="display:flex;"><span> <span style="color:#00a">const</span> contentType = resp.headers.get(<span style="color:#a50">&#39;Content-Type&#39;</span>); -</span></span><span style="display:flex;"><span> res.status(resp.status).contentType(contentType).send(data); -</span></span><span style="display:flex;"><span> } <span style="color:#00a">catch</span> (err) { -</span></span><span style="display:flex;"><span> res.status(<span style="color:#099">500</span>).json({ error: err }); -</span></span><span style="display:flex;"><span> } -</span></span><span style="display:flex;"><span> } -</span></span></code></pre></div><h3 id="python">Python</h3> -<p>This Python code only works on a local machine. To deploy the code, you can replace the Flask code with the web server of your choice.</p> -<p><strong>Prerequisites</strong></p> -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>pip3 install flask -</span></span><span style="display:flex;"><span>pip3 install requests_oauthlib -</span></span></code></pre></div><p><strong>app.py</strong></p> -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-py" data-lang="py"><span style="display:flex;"><span><span style="color:#00a">from</span> <span style="color:#0aa;text-decoration:underline">flask</span> <span style="color:#00a">import</span> Flask, request, redirect, session, url_for -</span></span><span style="display:flex;"><span><span style="color:#00a">from</span> <span style="color:#0aa;text-decoration:underline">flask.json</span> <span style="color:#00a">import</span> jsonify -</span></span><span style="display:flex;"><span><span style="color:#00a">from</span> <span style="color:#0aa;text-decoration:underline">requests_oauthlib</span> <span style="color:#00a">import</span> OAuth2Session -</span></span><span style="display:flex;"><span><span style="color:#00a">import</span> <span style="color:#0aa;text-decoration:underline">os</span> -</span></span><span style="display:flex;"><span> -</span></span><span style="display:flex;"><span>app = Flask(__name__) -</span></span><span style="display:flex;"><span>app.secret_key = <span style="color:#a50">b</span><span style="color:#a50">&#39;F</span><span style="color:#a50">\xf5\xe5\xc0\xbe\t</span><span style="color:#a50">g</span><span style="color:#a50">\x7f\xac\x89\x87</span><span style="color:#a50">e</span><span style="color:#a50">\xc2</span><span style="color:#a50">4</span><span style="color:#a50">\xe8</span><span style="color:#a50">m</span><span style="color:#a50">\x1c\xd9\xda\x96</span><span style="color:#a50">G,</span><span style="color:#a50">\x90</span><span style="color:#a50">i&#39;</span> -</span></span><span style="display:flex;"><span> -</span></span><span style="display:flex;"><span>os.environ[<span style="color:#a50">&#39;OAUTHLIB_INSECURE_TRANSPORT&#39;</span>] = <span style="color:#a50">&#34;1&#34;</span> -</span></span><span style="display:flex;"><span> -</span></span><span style="display:flex;"><span>client_id = &lt;Client ID of your application&gt; -</span></span><span style="display:flex;"><span>client_secret = &lt;Client Secret of your application&gt; -</span></span><span style="display:flex;"><span>authorization_base_url = <span style="color:#a50">&#34;https://oauth.onshape.com/oauth/authorize&#34;</span> -</span></span><span style="display:flex;"><span>token_url = <span style="color:#a50">&#34;https://oauth.onshape.com/oauth/token&#34;</span> -</span></span><span style="display:flex;"><span>redirect_url = <span style="color:#a50">&#34;http://localhost:5000&#34;</span> -</span></span><span style="display:flex;"><span> -</span></span><span style="display:flex;"><span><span style="color:#888">@app.route</span>(<span style="color:#a50">&#39;/&#39;</span>) -</span></span><span style="display:flex;"><span><span style="color:#00a">def</span> <span style="color:#0a0">home</span>(): -</span></span><span style="display:flex;"><span> onshape = OAuth2Session(client_id, redirect_uri=redirect_url) -</span></span><span style="display:flex;"><span> auth_url, state = onshape.authorization_url(authorization_base_url) -</span></span><span style="display:flex;"><span> session[<span style="color:#a50">&#39;oauth_state&#39;</span>] = state -</span></span><span style="display:flex;"><span> <span style="color:#00a">return</span> redirect(auth_url) -</span></span><span style="display:flex;"><span> -</span></span><span style="display:flex;"><span><span style="color:#888">@app.route</span>(<span style="color:#a50">&#39;/token&#39;</span>, methods=[<span style="color:#a50">&#34;GET&#34;</span>]) -</span></span><span style="display:flex;"><span><span style="color:#00a">def</span> <span style="color:#0a0">token</span>(): -</span></span><span style="display:flex;"><span> onshape = OAuth2Session(client_id, state=session[<span style="color:#a50">&#39;oauth_state&#39;</span>], redirect_uri=redirect_url) -</span></span><span style="display:flex;"><span> token = onshape.fetch_token(token_url, client_secret=client_secret, authorization_response=request.url) -</span></span><span style="display:flex;"><span> session[<span style="color:#a50">&#39;oauth_token&#39;</span>] = token -</span></span><span style="display:flex;"><span> <span style="color:#00a">return</span> redirect(url_for(<span style="color:#a50">&#39;.documents&#39;</span>)) -</span></span><span style="display:flex;"><span> -</span></span><span style="display:flex;"><span><span style="color:#888">@app.route</span>(<span style="color:#a50">&#39;/documents&#39;</span>, methods=[<span style="color:#a50">&#34;GET&#34;</span>]) -</span></span><span style="display:flex;"><span><span style="color:#00a">def</span> <span style="color:#0a0">documents</span>(): -</span></span><span style="display:flex;"><span> extra = { -</span></span><span style="display:flex;"><span> <span style="color:#a50">&#39;client_id&#39;</span>: client_id, -</span></span><span style="display:flex;"><span> <span style="color:#a50">&#39;client_secret&#39;</span>: client_secret, -</span></span><span style="display:flex;"><span> } -</span></span><span style="display:flex;"><span> onshape = OAuth2Session(client_id, token=session[<span style="color:#a50">&#39;oauth_token&#39;</span>], redirect_uri=redirect_url) -</span></span><span style="display:flex;"><span> session[<span style="color:#a50">&#39;oauth_token&#39;</span>] = onshape.refresh_token(token_url, **extra) -</span></span><span style="display:flex;"><span> <span style="color:#00a">return</span> jsonify(onshape.get(<span style="color:#a50">&#39;https://cad.onshape.com/api/v6/documents?q=Untitled&amp;ownerType=1&amp;sortColumn=createdAt&amp;sortOrder=desc&amp;offset=0&amp;limit=20&#39;</span>).json()) -</span></span><span style="display:flex;"><span> -</span></span><span style="display:flex;"><span><span style="color:#00a">if</span> __name__ == <span style="color:#a50">&#34;__main__&#34;</span>: -</span></span><span style="display:flex;"><span> app.run() -</span></span><span style="display:flex;"><span> -</span></span></code></pre></div>Docs: API Keyshttps://onshape-public.github.io/docs/auth/apikeys/Mon, 01 Jan 0001 00:00:00 +0000https://onshape-public.github.io/docs/auth/apikeys/ -<blockquote> -<p>📘 <strong>Note</strong></p> -<p>All applications submitted to the Onshape App Store (Onshape Apps) must follow the instructions on the <a href="https://onshape-public.github.io/docs/auth/oauth">OAuth2</a> page and use OAuth2 for authorization. Automation scripts (or applications not meant for the Onshape App Store) may use either OAuth2 or API Keys for authentication. OAuth2 allows applications to call Onshape APIs on behalf of the users of the application; API keys will only perform operations on behalf of the Onshape user who generated the API keys.</p> -</blockquote> -<h2 id="why-api-keys">Why API Keys?</h2> -<p>API keys are useful for small applications meant for personal use, allowing developers to avoid the overhead of the OAuth workflow. Creating an app is very easy with API keys: create an API key with the Developer Portal, set up a function to build your API key header as in the samples, and make your API calls! There&rsquo;s no need to deal with OAuth redirects or things like that.</p> -<p>We&rsquo;ve moved over to using API keys for authenticating requests instead of using cookies for several reasons.</p> -<ol> -<li>Security: Each request is signed with unique headers so that we can be sure it&rsquo;s coming from the right place.</li> -<li>OAuth: The API key system we&rsquo;re now using for HTTP requests is the same process developers follow when building full-blown OAuth applications; there&rsquo;s no longer a disconnect between the two.</li> -</ol> -<p>Once you create an API key, it will only be valid in the stack on which it was created. An API key created on the partner stack, for example, will not function on the production stack.</p> -<p>If you need information or have a question unanswered in this documentation, feel free to chat with us by sending an email to <a href="mailto:api-support@onshape.com">api-support@onshape.com</a> or by checking out the <a href="https://forum.onshape.com" target="_blank">forums</a>. If you are a member of the DevPartners group (see the Development help page for information) more detailed instructions and code examples are in the apikey sample repo.</p> -<h2 id="1-create-api-keys">1. Create API Keys</h2> -<ol> -<li>Go to <a href="https://dev-portal.onshape.com">https://dev-portal.onshape.com</a>.</li> -<li>In the left pane, click <code>API keys</code>.</li> -<li>Click the <code>Create new API key</code> button.</li> -<li>Select the desired permissions for your app.</li> -<li>Click the <code>Create API key</code> button. </br> -<img src="https://onshape-public.github.io/images/CreateNewAPIKey.png" alt="image"></li> -<li>Copy both the <strong>access key</strong> and <strong>secret key</strong> from the pop-up window, save them somewhere, then click the <code>Close</code> button. -</br><strong>IMPORTANT NOTE: You will not be able to find the secret key again, so save it somewhere safe!</strong></br> -<img src="https://onshape-public.github.io/images/APIKeySecretKey.png" alt="image"></li> -<li>The details for your application appear. </br> -<img src="https://onshape-public.github.io/images/DevPortalKeys.png" alt="image"></li> -<li>Now that you have a key pair, see <a href="#generating-a-request-signature">Generate a Request Signature</a> for information on signing your requests to use our API.</li> -</ol> -<p>Once you have your access key and secret, you will want to avoid giving others access to them, since they&rsquo;re tied directly to your personal Onshape account. Think of your API key as a username and password pair. Do not place them directly in the code for your application, especially if others might see it. The samples we provide here use a separate configuration file to contain this information, but there are other ways to keep the access key and secret safe, like setting them as environment variables.</p> -<h3 id="scopes">Scopes</h3> -<p>There are several scopes available for API keys (equivalent to OAuth scopes):</p> -<ul> -<li><code>OAuth2Read</code> - Read non-personal information (documents, parts, etc.)</li> -<li><code>OAuth2ReadPII</code> - Read personal information (name, email, etc.)</li> -<li><code>OAuth2Write</code> - Create and edit documents, etc.</li> -<li><code>OAuth2Delete</code> - Delete documents, etc.</li> -<li><code>OAuth2Purchase</code> - Authorize purchases from account</li> -</ul> -<h2 id="2-select-an-authentication-option">2. Select an Authentication Option</h2> -<p>Please select an option for authentication:</p> -<ul> -<li><a href="#local-authorization">Basic Authorization</a>: Lowest security. For local testing only.</li> -<li><a href="#request-signature">Request Signature</a>: Medium security. For testing and internal use.</li> -<li><a href="https://onshape-public.github.io/docs/auth/oauth">OAuth2</a>: Highest security. Required for all Onshape Apps.</li> -</ul> -<h2 id="basic-authorization">Basic Authorization</h2> -<p>For local testing, you can provide a basic authentication via your API Keys.</p> -<ol> -<li>Open your terminal and run the following command, replacing <code>ACCESS_KEY</code> and <code>SECRET_KEY</code> with the <strong>access key</strong> and <strong>secret key</strong> you created earlier. Remember to include the colon (<code>:</code>) between the keys. <em>You will receive a long, base-64-encoded string as output.</em> -<ul> -<li><strong>MacOS</strong>: -<pre tabindex="0"><code>printf ACCESS_KEY:SECRET_KEY | base64 -</code></pre></li> -<li><strong>Windows</strong>: -<pre tabindex="0"><code>powershell &#34;[convert]::ToBase64String([Text.Encoding]::UTF8.GetBytes(\&#34;ACCESS_KEY:SECRET_KEY\&#34;))&#34; -</code></pre></li> -</ul> -</li> -<li>Add the authorization header to your code, replacing <code>CREDENTIALS</code> with the string you receieved in Step 1: -<pre tabindex="0"><code>-H &#39;Authorization: Basic CREDENTIALS&#39; \ -</code></pre></li> -</ol> -<p>See our <a href="https://onshape-public.github.io/docs/api-intro/quickstart">Quick Start Guide</a> for an example of using Basic Authorization in an app.</p> -<h2 id="request-signature">Request Signature</h2> -<p>For additional security, you can include your API Keys as part of a request signature. This provides more security than the Basic Authorization above, but less security than OAuth2.</p> -<p>To ensure that a request is coming from you, we have a process for signing requests that you must follow for API calls to work. Everything is done via HTTP headers that you&rsquo;ll need to set:</p> -<ol> -<li><em>Date</em>: A standard date header giving the time of the request; must be accurate within <strong>5 minutes</strong> of request. Example: <code>Mon, 11 Apr 2016 20:08:56 GMT</code></li> -<li><em>On-Nonce</em>: A string that satisfies the following requirements (see the code for one possible way to generate it): -<ul> -<li>At least 16 characters</li> -<li>Alphanumeric</li> -<li>Unique for each request</li> -</ul> -</li> -<li><em>Authorization</em>: This is where the API keys come into play. You&rsquo;ll sign the request by implementing this algorithm: -<ul> -<li><strong>Input</strong>: Method, URL, On-Nonce, Date, Content-Type, AccessKey, SecretKey</li> -<li><strong>Output</strong>: String of the form: <code>On &lt;AccessKey&gt;:HmacSHA256:&lt;Signature&gt;</code></li> -<li><strong>Steps to generate the signature portion</strong>: -<ol> -<li>Parse the URL and get the following: -<ol> -<li>The path, e.g. <code>/api/documents</code> (no query params!)</li> -<li>The query string, e.g. <code>a=1&amp;b=2</code> -<ul> -<li>NOTE: If no query paramaters are present, use an empty string</li> -</ul> -</li> -</ol> -</li> -<li>Create a string by appending the following information in order. Each field should be separated by a newline (<code>\n</code>) character, and the string must be converted to lowercase: -<ol> -<li>HTTP method</li> -<li>On-Nonce header value</li> -<li>Date header value</li> -<li>Content-Type header value</li> -<li>URL pathname</li> -<li>URL query string</li> -</ol> -</li> -<li>Using SHA-256, generate an <a href="https://en.wikipedia.org/wiki/Hash-based_message_authentication_code" target="_blank">HMAC digest</a>, using the API secret key first and then the above string, then encode it in Base64.</li> -<li>Create the <code>On &lt;AccessKey&gt;:HmacSHA256:&lt;Signature&gt;</code> string and use that in the Authorization header in your request.</li> -</ol> -</li> -</ul> -</li> -</ol> -<p>Below is an example function to generate the authorization header, using Node.js&rsquo;s standard <code>crypto</code> and <code>url</code> libraries:</p> -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-js" data-lang="js"><span style="display:flex;"><span><span style="color:#aaa;font-style:italic">// ...at top of file -</span></span></span><span style="display:flex;"><span><span style="color:#aaa;font-style:italic"></span><span style="color:#00a">var</span> u = require(<span style="color:#a50">&#39;url&#39;</span>); -</span></span><span style="display:flex;"><span><span style="color:#00a">var</span> crypto = require(<span style="color:#a50">&#39;crypto&#39;</span>); -</span></span><span style="display:flex;"><span> -</span></span><span style="display:flex;"><span><span style="color:#aaa;font-style:italic">/** -</span></span></span><span style="display:flex;"><span><span style="color:#aaa;font-style:italic">* Generates the &#34;Authorization&#34; HTTP header for using the Onshape API -</span></span></span><span style="display:flex;"><span><span style="color:#aaa;font-style:italic">* -</span></span></span><span style="display:flex;"><span><span style="color:#aaa;font-style:italic">* @param {string} method - Request method; GET, POST, etc. -</span></span></span><span style="display:flex;"><span><span style="color:#aaa;font-style:italic">* @param {string} url - The full request URL -</span></span></span><span style="display:flex;"><span><span style="color:#aaa;font-style:italic">* @param {string} nonce - 25-character nonce (generated by you) -</span></span></span><span style="display:flex;"><span><span style="color:#aaa;font-style:italic">* @param {string} authDate - UTC-formatted date string (generated by you) -</span></span></span><span style="display:flex;"><span><span style="color:#aaa;font-style:italic">* @param {string} contentType - Value of the &#34;Content-Type&#34; header; generally &#34;application/json&#34; -</span></span></span><span style="display:flex;"><span><span style="color:#aaa;font-style:italic">* @param {string} accessKey - API access key -</span></span></span><span style="display:flex;"><span><span style="color:#aaa;font-style:italic">* @param {string} secretKey - API secret key -</span></span></span><span style="display:flex;"><span><span style="color:#aaa;font-style:italic">* -</span></span></span><span style="display:flex;"><span><span style="color:#aaa;font-style:italic">* @return {string} Value for the &#34;Authorization&#34; header -</span></span></span><span style="display:flex;"><span><span style="color:#aaa;font-style:italic">*/</span> -</span></span><span style="display:flex;"><span><span style="color:#00a">function</span> createSignature(method, url, nonce, authDate, contentType, accessKey, secretKey) { -</span></span><span style="display:flex;"><span> <span style="color:#00a">var</span> urlObj = u.parse(url); -</span></span><span style="display:flex;"><span> <span style="color:#00a">var</span> urlPath = urlObj.pathname; -</span></span><span style="display:flex;"><span> <span style="color:#00a">var</span> urlQuery = urlObj.query ? urlObj.query : <span style="color:#a50">&#39;&#39;</span>; <span style="color:#aaa;font-style:italic">// if no query, use empty string -</span></span></span><span style="display:flex;"><span><span style="color:#aaa;font-style:italic"></span> -</span></span><span style="display:flex;"><span> <span style="color:#00a">var</span> str = (method + <span style="color:#a50">&#39;\n&#39;</span> + nonce + <span style="color:#a50">&#39;\n&#39;</span> + authDate + <span style="color:#a50">&#39;\n&#39;</span> + contentType + <span style="color:#a50">&#39;\n&#39;</span> + -</span></span><span style="display:flex;"><span> urlPath + <span style="color:#a50">&#39;\n&#39;</span> + urlQuery + <span style="color:#a50">&#39;\n&#39;</span>).toLowerCase(); -</span></span><span style="display:flex;"><span> -</span></span><span style="display:flex;"><span> <span style="color:#00a">var</span> hmac = crypto.createHmac(<span style="color:#a50">&#39;sha256&#39;</span>, secretKey) -</span></span><span style="display:flex;"><span> .update(str) -</span></span><span style="display:flex;"><span> .digest(<span style="color:#a50">&#39;base64&#39;</span>); -</span></span><span style="display:flex;"><span> -</span></span><span style="display:flex;"><span> <span style="color:#00a">var</span> signature = <span style="color:#a50">&#39;On &#39;</span> + accessKey + <span style="color:#a50">&#39;:HmacSHA256:&#39;</span> + hmac; -</span></span><span style="display:flex;"><span> <span style="color:#00a">return</span> signature; -</span></span><span style="display:flex;"><span>} -</span></span></code></pre></div><h3 id="redirects">Redirects</h3> -<p>Some API endpoints return 307 redirects. You must generate an Authorization header for the redirect as well, but please note that the server portion of the URL might be different, the redirect URL may contain query parameters that must be encoded in the Authorization header, etc.</p>Docs: Assemblieshttps://onshape-public.github.io/docs/api-adv/assemblies/Tue, 13 Aug 2024 00:00:00 +0000https://onshape-public.github.io/docs/api-adv/assemblies/ -<p>This page describes the APIs Onshape provides for working with assemblies.</p> -<blockquote> -<p>📘 <strong>Notes</strong></p> -<ul> -<li>This page provides sample code as curls. See the <a href="https://curl.se/docs/">curl documentation</a> for more information.</li> -<li>All Onshape API calls must be properly authenticated by replacing the <code>CREDENTIALS</code> variable in the curls below. See the <a href="https://onshape-public.github.io/docs/auth/apikeys">API Keys</a> page for instructions and the <a href="https://onshape-public.github.io/docs/api-intro/quickstart">Quick Start</a> for an example. All applications submitted to the Onshape App Store <em>must</em> authenticate with <a href="https://onshape-public.github.io/docs/auth/oauth">OAuth2</a>.</li> -<li>This documentation refers to Onshape IDs in the following format: <code>{did}, {wid}, {eid}, {pid}, {otherId}</code>. These represent document, workspace, element, part, and other IDs (respectively) that are needed make the API calls. We sometimes abbreviate these variables as <code>DWVEM</code> Please see <a href="https://onshape-public.github.io/docs/api-intro/#onshape-api-request">API Guide: API Intro</a> for information on what these IDs mean and how to obtain them from your documents. Never include the curly braces (<code>{}</code>) in your API calls.</li> -<li>For Enterprise accounts, replace <strong><font color="slate">cad</font></strong> in all Onshape URLs with your company domain. -https://<font color="slate"><strong>cad</strong></font>.onshape.com &gt; https://<font color="slate"><strong>companyName</strong></font>.onshape.com</li> -</ul> -</blockquote> -<h2 id="endpoints">Endpoints</h2> -<ul> -<li><a href="https://cad.onshape.com/glassworks/explorer/#/Assembly/createInstance">Assembly/createInstance</a>: Insert an instance of a part, sketch, assembly, or Part Studio into an assembly: -<pre tabindex="0"><code>curl -X &#39;POST&#39; \ -&#39;https://cad.onshape.com/api/v8/assemblies/d/{targetDid}/w/{targetWid}/e/{targetEid}/instances&#39; \ --H &#39;Accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39;\ --H &#39;Content-Type: application/json;charset=UTF-8; qs=0.09&#39; --d &#39;{ -&#34;configuration&#34;: &#34;string&#34;, -&#34;documentId&#34;: &#34;{sourceDid}&#34;, -&#34;elementId&#34;: &#34;{sourceEid}&#34;, -&#34;featureId&#34;: &#34;string&#34;, -&#34;includePartTypes&#34;: [ -&#34;PARTS&#34; -], -&#34;isAssembly&#34;: true, -&#34;isHidden&#34;: true, -&#34;isSuppressed&#34;: true, -&#34;isWholePartStudio&#34;: true, -&#34;microversionId&#34;: &#34;string&#34;, -&#34;partId&#34;: &#34;string&#34;, -&#34;partNumber&#34;: &#34;string&#34;, -&#34;revision&#34;: &#34;string&#34;, -&#34;versionId&#34;: &#34;{sourceEid}&#34; -}&#39; -</code></pre></li> -</ul> -<h2 id="sample-workflows">Sample Workflows</h2> -<h3 id="insert-a-part-into-an-assembly">Insert a part into an assembly</h3> -<ol> -<li>Open the Part Studio that contains the part you want to insert into an assembly. Make a note of the following in the URL: -<ul> -<li><code>documentId</code> - we&rsquo;ll refer to this as our <code>sourceDid</code> for this example</li> -<li><code>elementId</code> of the Part Studio that contains the part - this is our <code>sourceEid</code></li> -<li><code>versionId</code> - this is our <code>sourceVId</code>, if one exists</li> -</ul> -</li> -<li>Call the <a href="https://cad.onshape.com/glassworks/explorer/#/Part/getPartsWMVE">Part/getPartsWMVE</a> endpoint to get the part&rsquo;s <code>partId</code>: -<pre tabindex="0"><code>curl -X &#39;GET&#39; \ -&#39;https://cad.onshape.com/api/v8/parts/d/{did}/w/{wid}/e/{eid}?withThumbnails=false&amp;includePropertyDefaults=false&#39; \ --H &#39;Accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39;\ --H &#39;Content-Type: application/json;charset=UTF-8; qs=0.09&#39; -</code></pre></li> -<li>Now open the assembly you want to insert the part into. Make a note of the following from the URL: -<ul> -<li><code>documentId</code> - we&rsquo;ll refer to this as our <code>targetDid</code></li> -<li><code>workspaceId</code> - this is our <code>targetWId</code></li> -<li><code>elementId</code> of the assembly - this is our <code>targetEid</code></li> -</ul> -</li> -<li>Call the <a href="https://cad.onshape.com/glassworks/explorer/#/Assembly/createInstance">Assembly/createInstance</a> endpoint on the assembly to insert an instance of the part into the assembly: -<pre tabindex="0"><code>curl -X &#39;POST&#39; \ -&#39;https://cad.onshape.com/api/v8/assemblies/d/{targetDid}/w/{targetWid}/e/{targetEid}/instances&#39; \ --H &#39;Accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39;\ --H &#39;Content-Type: application/json;charset=UTF-8; qs=0.09&#39; \ --d &#39;{ -&#34;documentId&#34;: &#34;{sourceDid}&#34;, -&#34;elementId&#34;: &#34;{sourceEid}&#34;, -&#34;includePartTypes&#34;: [ -&#34;PARTS&#34; -], -&#34;partId&#34;: &#34;{partId}&#34; -}&#39; -</code></pre><ul> -<li>Note: you can add <code>&quot;versionId&quot;: &quot;{sourceVid}&quot;</code> to the request body if needed.</li> -</ul> -</li> -<li>Refresh your assembly and confirm the part is included.</li> -</ol> -<h2 id="additional-resources">Additional Resources</h2> -<ul> -<li><a href="https://cad.onshape.com/glassworks/explorer/#/Assembly">API Explorer: Assemblies</a></li> -<li><a href="https://onshape-public.github.io/docs/api-intro/explorer">API Guide: API Explorer</a></li> -<li><a href="https://cad.onshape.com/help/Content/assembly.htm">Onshape Help: Assemblies</a></li> -</ul>Docs: Associativityhttps://onshape-public.github.io/docs/api-adv/associativity/Mon, 18 May 2020 20:28:26 -0400https://onshape-public.github.io/docs/api-adv/associativity/ -<p>Onshape does not expose a persistent ID for any of these entities. When the model changes, the ID may change. Therefore, Onshape provides an API to enable mapping IDs from a previous microversion to the current microversion. Assuming a simple case of maintaining associativity for a face, an abstract workflow might be:</p> -<ol> -<li>Read the tessellated model data.</li> -<li>Select the face of interest.</li> -<li>Store the Face ID and Document Microversion ID for the face.</li> -<li>[ user changes model ]</li> -<li>Call the REST API to translate from the known Face ID to an ID in the new model.</li> -<li>Re-apply application-specific data to the face(s) in the new model. Note that a face may become zero, one or multiple faces in the new model, depending on what changes the user made.</li> -</ol> -<h2 id="associativity-example">Associativity Example</h2> -<ol> -<li>Create a cube in Onshape:</br> -<img src="https://onshape-public.github.io/images/associativityimage03.png" alt="image alt text"></li> -<li>Get the document microversion ID from the URL: <code>https://cad.onshape.com/api/d/&lt;docid&gt;/w/&lt;wid&gt;/microversionId</code>.</li> -<li>Use the appropriate REST API to get the tessellated faces (<code>getPartStudioFaces</code>) -and edges (<code>getPartStudioEdges</code>}. Note the ids: -<ul> -<li>Part ID: <code>JHD</code></li> -<li>Front face ID: <code>JHO</code></li> -<li>Top edge of the front face ID: <code>JHd</code></li> -<li>Right edge of the top face ID: <code>JHt</code></li> -</ul> -</li> -<li>Split cube with the Front plane and translate the IDs:</li> -</ol> -<p><img src="https://onshape-public.github.io/images/associativityimage00.png" alt="image alt text"></p> -<p><strong>POST</strong></p> -<pre tabindex="0"><code>https://cad.onshape.com/api/partstudios/d/&lt;docid&gt;/w/&lt;wid&gt;/e/&lt;eid&gt;/idtranslations -</code></pre><p><strong>Body</strong>:</p> -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-json" data-lang="json"><span style="display:flex;"><span>{ -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;sourceDocumentMicroversion&#34;</span> : <span style="color:#a50">&#34;47e75ab2ee8b4356a76ebd47&#34;</span>, -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;ids&#34;</span> : [<span style="color:#a50">&#34;JHD&#34;</span>, <span style="color:#a50">&#34;JHO&#34;</span>, <span style="color:#a50">&#34;JHd&#34;</span>, <span style="color:#a50">&#34;JHt&#34;</span> ] -</span></span><span style="display:flex;"><span>} -</span></span></code></pre></div><p><strong>Response</strong>:</p> -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-json" data-lang="json"><span style="display:flex;"><span>{ -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;documentId&#34;</span>: <span style="color:#a50">&#34;748d6e850c9248328189922b&#34;</span>, -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;elementId&#34;</span>: <span style="color:#a50">&#34;042a6fa54e79451e8076463d&#34;</span>, -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;sourceDocumentMicroversion&#34;</span>: <span style="color:#a50">&#34;47e75ab2ee8b4356a76ebd47&#34;</span>, -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;ids&#34;</span>: [ -</span></span><span style="display:flex;"><span> { <span style="color:#1e90ff;font-weight:bold">&#34;source&#34;</span>: <span style="color:#a50">&#34;JHD&#34;</span>, <span style="color:#1e90ff;font-weight:bold">&#34;status&#34;</span>: <span style="color:#a50">&#34;SPLIT&#34;</span>, <span style="color:#1e90ff;font-weight:bold">&#34;target&#34;</span>: [<span style="color:#a50">&#34;JID&#34;</span>, <span style="color:#a50">&#34;JIH&#34;</span>] }, -</span></span><span style="display:flex;"><span> { <span style="color:#1e90ff;font-weight:bold">&#34;source&#34;</span>: <span style="color:#a50">&#34;JHO&#34;</span>, <span style="color:#1e90ff;font-weight:bold">&#34;status&#34;</span>: <span style="color:#a50">&#34;OK&#34;</span>, <span style="color:#1e90ff;font-weight:bold">&#34;target&#34;</span>: [<span style="color:#a50">&#34;JHO&#34;</span>] }, -</span></span><span style="display:flex;"><span> { <span style="color:#1e90ff;font-weight:bold">&#34;source&#34;</span>: <span style="color:#a50">&#34;JHd&#34;</span>, <span style="color:#1e90ff;font-weight:bold">&#34;status&#34;</span>: <span style="color:#a50">&#34;OK&#34;</span>, <span style="color:#1e90ff;font-weight:bold">&#34;target&#34;</span>: [<span style="color:#a50">&#34;JHd&#34;</span>] }, -</span></span><span style="display:flex;"><span> { <span style="color:#1e90ff;font-weight:bold">&#34;source&#34;</span>: <span style="color:#a50">&#34;JHt&#34;</span>, <span style="color:#1e90ff;font-weight:bold">&#34;status&#34;</span>: <span style="color:#a50">&#34;SPLIT&#34;</span>, <span style="color:#1e90ff;font-weight:bold">&#34;target&#34;</span>: [<span style="color:#a50">&#34;JI5&#34;</span>, <span style="color:#a50">&#34;JI9&#34;</span>] } -</span></span><span style="display:flex;"><span> ], -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;targetDocumentMicroversion&#34;</span>: <span style="color:#a50">&#34;78bc7f3fcf82475085c2f3ab&#34;</span> -</span></span><span style="display:flex;"><span>} -</span></span></code></pre></div><ol start="4"> -<li>Delete one of the parts, and translate the IDs:</li> -</ol> -<p><img src="https://onshape-public.github.io/images/associativityimage01.png" alt="image alt text"></p> -<p><strong>POST</strong></p> -<pre tabindex="0"><code>https://cad.onshape.com/api/partstudios/d/&lt;docid&gt;/w/&lt;wid&gt;/e/&lt;eid&gt;/idtranslations -</code></pre><p><strong>Body</strong>:</p> -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-json" data-lang="json"><span style="display:flex;"><span>{ -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;sourceDocumentMicroversion&#34;</span> : <span style="color:#a50">&#34;47e75ab2ee8b4356a76ebd47&#34;</span>, -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;ids&#34;</span> : [<span style="color:#a50">&#34;JHD&#34;</span>, <span style="color:#a50">&#34;JHO&#34;</span>, <span style="color:#a50">&#34;JHd&#34;</span>, <span style="color:#a50">&#34;JHt&#34;</span>] -</span></span><span style="display:flex;"><span>} -</span></span></code></pre></div><p><strong>Response</strong>:</p> -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-json" data-lang="json"><span style="display:flex;"><span>{ -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;documentId&#34;</span>: <span style="color:#a50">&#34;748d6e850c9248328189922b&#34;</span>, -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;elementId&#34;</span>: <span style="color:#a50">&#34;042a6fa54e79451e8076463d&#34;</span>, -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;sourceDocumentMicroversion&#34;</span>: <span style="color:#a50">&#34;47e75ab2ee8b4356a76ebd47&#34;</span>, -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;ids&#34;</span>: [ -</span></span><span style="display:flex;"><span> { <span style="color:#1e90ff;font-weight:bold">&#34;source&#34;</span>: <span style="color:#a50">&#34;JHD&#34;</span>, <span style="color:#1e90ff;font-weight:bold">&#34;status&#34;</span>: <span style="color:#a50">&#34;OK&#34;</span>, <span style="color:#1e90ff;font-weight:bold">&#34;target&#34;</span>: [<span style="color:#a50">&#34;JID&#34;</span>] }, -</span></span><span style="display:flex;"><span> { <span style="color:#1e90ff;font-weight:bold">&#34;source&#34;</span>: <span style="color:#a50">&#34;JHO&#34;</span>, <span style="color:#1e90ff;font-weight:bold">&#34;status&#34;</span>: <span style="color:#a50">&#34;FAILED_TO_RESOLVE&#34;</span>, <span style="color:#1e90ff;font-weight:bold">&#34;target&#34;</span>: [] }, -</span></span><span style="display:flex;"><span> { <span style="color:#1e90ff;font-weight:bold">&#34;source&#34;</span>: <span style="color:#a50">&#34;JHd&#34;</span>, <span style="color:#1e90ff;font-weight:bold">&#34;status&#34;</span>: <span style="color:#a50">&#34;FAILED_TO_RESOLVE&#34;</span>, <span style="color:#1e90ff;font-weight:bold">&#34;target&#34;</span>: [] }, -</span></span><span style="display:flex;"><span> { <span style="color:#1e90ff;font-weight:bold">&#34;source&#34;</span>: <span style="color:#a50">&#34;JHt&#34;</span>, <span style="color:#1e90ff;font-weight:bold">&#34;status&#34;</span>: <span style="color:#a50">&#34;OK&#34;</span>, <span style="color:#1e90ff;font-weight:bold">&#34;target&#34;</span>: [<span style="color:#a50">&#34;JI5&#34;</span>] } -</span></span><span style="display:flex;"><span> ], -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;targetDocumentMicroversion&#34;</span>: <span style="color:#a50">&#34;52aa74d34b624f3aaef33204&#34;</span> -</span></span><span style="display:flex;"><span>} -</span></span></code></pre></div><ol start="5"> -<li>Roll back the delete and the split, and translate the IDs:</li> -</ol> -<p><img src="https://onshape-public.github.io/images/associativityimage02.png" alt="image alt text"></p> -<p><strong>POST</strong></p> -<pre tabindex="0"><code>https://cad.onshape.com/api/partstudios/d/&lt;docid&gt;/w/&lt;wid&gt;/e/&lt;eid&gt;/idtranslations -</code></pre><p><strong>Body</strong>:</p> -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-json" data-lang="json"><span style="display:flex;"><span>{ -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;sourceDocumentMicroversion&#34;</span> : <span style="color:#a50">&#34;47e75ab2ee8b4356a76ebd47&#34;</span>, -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;ids&#34;</span> : [<span style="color:#a50">&#34;JHD&#34;</span>, <span style="color:#a50">&#34;JHO&#34;</span>, <span style="color:#a50">&#34;JHd&#34;</span>, <span style="color:#a50">&#34;JHt&#34;</span>] -</span></span><span style="display:flex;"><span>} -</span></span></code></pre></div><p><strong>Response</strong>:</p> -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-json" data-lang="json"><span style="display:flex;"><span>{ -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;documentId&#34;</span>: <span style="color:#a50">&#34;748d6e850c9248328189922b&#34;</span>, -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;elementId&#34;</span>: <span style="color:#a50">&#34;042a6fa54e79451e8076463d&#34;</span>, -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;sourceDocumentMicroversion&#34;</span>: <span style="color:#a50">&#34;47e75ab2ee8b4356a76ebd47&#34;</span>, -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;ids&#34;</span>: [ -</span></span><span style="display:flex;"><span> { <span style="color:#1e90ff;font-weight:bold">&#34;source&#34;</span>: <span style="color:#a50">&#34;JHD&#34;</span>, <span style="color:#1e90ff;font-weight:bold">&#34;status&#34;</span>: <span style="color:#a50">&#34;OK&#34;</span>, <span style="color:#1e90ff;font-weight:bold">&#34;target&#34;</span>: [<span style="color:#a50">&#34;JID&#34;</span>] }, -</span></span><span style="display:flex;"><span> { <span style="color:#1e90ff;font-weight:bold">&#34;source&#34;</span>: <span style="color:#a50">&#34;JHO&#34;</span>, <span style="color:#1e90ff;font-weight:bold">&#34;status&#34;</span>: <span style="color:#a50">&#34;OK&#34;</span>, <span style="color:#1e90ff;font-weight:bold">&#34;target&#34;</span>: [<span style="color:#a50">&#34;JHO&#34;</span>] }, -</span></span><span style="display:flex;"><span> { <span style="color:#1e90ff;font-weight:bold">&#34;source&#34;</span>: <span style="color:#a50">&#34;JHd&#34;</span>, <span style="color:#1e90ff;font-weight:bold">&#34;status&#34;</span>: <span style="color:#a50">&#34;OK&#34;</span>, <span style="color:#1e90ff;font-weight:bold">&#34;target&#34;</span>: [<span style="color:#a50">&#34;JHd&#34;</span>] }, -</span></span><span style="display:flex;"><span> { <span style="color:#1e90ff;font-weight:bold">&#34;source&#34;</span>: <span style="color:#a50">&#34;JHt&#34;</span>, <span style="color:#1e90ff;font-weight:bold">&#34;status&#34;</span>: <span style="color:#a50">&#34;OK&#34;</span>, <span style="color:#1e90ff;font-weight:bold">&#34;target&#34;</span>: [<span style="color:#a50">&#34;JHt&#34;</span>] } -</span></span><span style="display:flex;"><span> ], -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;targetDocumentMicroversion&#34;</span>: <span style="color:#a50">&#34;52aa74d34b624f3aaef33204&#34;</span> -</span></span><span style="display:flex;"><span>} -</span></span></code></pre></div>Docs: Billinghttps://onshape-public.github.io/docs/api-adv/billing/Mon, 18 May 2020 20:29:36 -0400https://onshape-public.github.io/docs/api-adv/billing/ -<p>This document describes APIs that will allow partners to interact with the Onshape billing system.</p> -<p>Please address questions to &ldquo;<a href="mailto:api-support@onshape.com">api-support@onshape.com</a>&rdquo; for the fastest response.</p> -<h2 id="overview">Overview</h2> -<p>All billing is done through &ldquo;plans&rdquo; that are created in the Developer Portal. A “plan” has the following attributes:</p> -<table> -<tr> -<td>Name (also called SKU)</td> -<td>A unique (within your company) plan name</td> -</tr> -<tr> -<td>Description</td> -<td>A user-visible description of the plan</td> -</tr> -<tr> -<td>Amount</td> -<td>The cost of the plan (may be one-time or recurring, depending on the type)</td> -</tr> -<tr> -<td>Type</td> -<td>Monthly, One-time or Consumable</td> -</tr> -</table> -<p>Onshape defines three kinds of plans:</p> -<table> -<tr> -<td>Plan type</td> -<td>Description</td> -</tr> -<tr> -<td>Recurring -(Monthly Subscription)</td> -<td>A plan that is renewed monthly at a fixed cost. All Apps in the app store must have a Free monthly plan (which is created by default), and may have additional paid plans.</td> -</tr> -<tr> -<td>One-time</td> -<td>A plan that is purchased once (not renewed monthly). A user may purchase these multiple times.</td> -</tr> -<tr> -<td>Consumable</td> -<td>A plan that represents a consumable unit, such as "hours of rendering" or “simulation runs”. Consumable plans are not fully implemented at this time, but the consumable functionality can be implemented using One-time Purchase plans as described below.</td> -</tr> -</table> -<p>Users may purchase plans through the App Store interface. In addition, if your application has the OAuth Purchase Scope, your application can initiate &ldquo;in-app&rdquo; purchases by calling Onshape to request a purchase.</p> -<p>The basic steps for interacting with Onshape Billing:</p> -<ol> -<li>Define one or more plans using the Developer Portal interface</li> -<li>Use the Onshape API to determine the current user’s plan</li> -<li>Provide features and/or limits based on the current plan</li> -</ol> -<h2 id="using-the-onshape-billing-api">Using the Onshape Billing API</h2> -<p><code>GET /api/accounts/purchases</code></p> -<p>Returns a list of purchase made by the current user for plans owned by the current application. Use this information to determine what capabilities or features the user is entitled to use.</p> -<p><code>DELETE /api/accounts/purchases/&lt;purchase id&gt;</code></p> -<p>Cancel a recurring purchase.</p> -<p><code>POST /api/accounts/purchases/&lt;purchase id&gt;/consume</code></p> -<p>Indicate the use of a consumable. (Not fully implemented at this time)</p> -<p><code>GET /api/billing/plans/client/&lt;client id&gt;</code></p> -<p>Get a list of the billing plans defined for this client.</p> -<h2 id="initiating-a-purchase-from-an-application-in-app-purchases">Initiating a purchase from an application (in-app purchases)</h2> -<p>To initiate a purchase of a subscription or one time item you must set the browser’s location to particular URL within the Onshape stack:</p> -<p><code>https://cad.onshape.com/billing/purchase?redirectUri=RRRR&amp;clientId=CCCC&amp;sku=SSSS&amp;userId=UUUU</code></p> -<p>Each of the query parameters should be URL encoded. The clientId is your application’s OAuth Client ID, the sku is the name/sku field for an item (you can find this in the developer portal or it’s retrievable through the /api/billing/plans REST endpoints). The user Id should be the Onshape user Id for the current user and is available through the /api/users/session REST endpoint. The redirectUri is the URI the user will be returned to within your website when the purchase is finished.</p> -<p>When the browser’s location is changed to this pattern the Onshape stack will serve content to confirm the users identity, confirm the details of what is being purchased (or obtained if the item is free) and then after the user agrees to the purchase will confirm the transaction (with our payment processor if the item is not free) and then redirect the user back to the supplied redirectUri (the browser location will be changed to the redirectUri). Additionally Onshape will add a <code>success=true</code> or <code>success=false</code> query parameter to the redirectURI indicating whether the user completed successfully (payment was taken if required etc.) or failed, either due to cancelling the purchase or an issue with payment.</p> -<p>When the browser fetches the redirectUri your application must call back through the <code>/api/account/purchases</code> API to get confirmation of the purchase - do NOT assume that a fetch of the redirectUri with a <code>success=true</code> query parameter actually indicates a purchase has occurred. Query the Onshape stack with the <code>/api/account/purchases</code> API to ensure that the required item has actually been bought.</p> -<h2 id="consumable-items">Consumable Items</h2> -<p>A detailed description of the interface for managing consumable purchases will be provided shortly. You can use one-time plans to achieve similar results:</p> -<ol> -<li> -<p>Define a one-time purchase plan with a description indicating the nature of the purchase, for example:</p> -<p>RENDER-10 Ten rendering hours $100</p> -</li> -<li> -<p>Keep track of the number of hours that the user has consumed. You can store and retrieve this information in Onshape using the following APIs. These APIs allow you to store and retrieve arbitrary information on a per-user basis.</p> -<p>POST /applications/clients/:cid/settings/users/:uid -GET /applications/clients/:cid/settings/users/:uid</p> -</li> -<li> -<p>Check the number of available &ldquo;units&rdquo; by getting the purchases and the record of consumables. Be sure to include UI in your application that the user can use to see their remaining quantity.</p> -</li> -<li> -<p>Alternately, you can store the consumption data in your own system; you do not need to use the Onshape API to manage that data.</p> -</li> -</ol> -<p>Onshape intends to provide a richer set of APIs that help track the purchase and consumption of consumables in the near future.</p> -<h2 id="other-billing-models">Other billing models</h2> -<p>You can use these mechanisms to implement other models. For example, a time-limited trial could be implemented by scanning purchases for the first &ldquo;purchase&rdquo; and denying service if it is more than a defined number of days in the past. A “fixed number of uses per month” could be implemented as a monthly subscription, string usage data with the settings API, and denying service after a fixed number of uses.</p> -<h2 id="samples">Samples</h2> -<p>Onshape will provide sample code for both desktop and integrated applications demonstrating the use of the billing APIs and workflow. If you are subscribed to the Onshape Github Partner group, you will have access to those samples as soon as they are posted.</p> -<h2 id="testing">Testing</h2> -<p>Please contact <a href="mailto:api-support@onshape.com">api-support@onshape.com</a> to discuss details of testing billing &amp; subscriptions.</p>Docs: Configurationshttps://onshape-public.github.io/docs/api-adv/configs/Fri, 05 Apr 2024 00:00:00 +0000https://onshape-public.github.io/docs/api-adv/configs/ -<p>This page describes the APIs Onshape provides for working with <a href="https://cad.onshape.com/help/Content/configurations.htm">Configurations</a>.</p> -<p>You can use Configurations to create variations of entire Part Studios, Assemblies, specific parts and more. You can configure feature and parameter values, part properties, custom part properties, face and part appearances, and sketch text. Each Part Studio can have only one Configuration, but it can contain multiple Configuration inputs. The Configuration inputs you define for a Part Studio become options when inserting that Part Studio into an Assembly or Drawing. You can also create your own Configurations for an Assembly, regardless of any existing Part Studio Configurations. Assembly Configurations work the same way as Part Studio Configurations, but are limited to configuring Mates (<em>not</em> Mate connectors), instances, and patterns.</p> -<blockquote> -<p>📘 <strong>Notes</strong></p> -<ul> -<li>This page provides sample code as curls. See the <a href="https://curl.se/docs/">curl documentation</a> for more information.</li> -<li>All Onshape API calls must be properly authenticated by replacing the <code>CREDENTIALS</code> variable in the curls below. See the <a href="https://onshape-public.github.io/docs/auth/apikeys">API Keys</a> page for instructions and the <a href="https://onshape-public.github.io/docs/api-intro/quickstart">Quick Start</a> for an example. All applications submitted to the Onshape App Store <em>must</em> authenticate with <a href="https://onshape-public.github.io/docs/auth/oauth">OAuth2</a>.</li> -<li>This documentation refers to Onshape IDs in the following format: <code>{did}, {wid}, {eid}, {pid}, {otherId}</code>. These represent document, workspace, element, part, and other IDs (respectively) that are needed make the API calls. We sometimes abbreviate these variables as <code>DWVEM</code> Please see <a href="https://onshape-public.github.io/docs/api-intro/#onshape-api-request">API Guide: API Intro</a> for information on what these IDs mean and how to obtain them from your documents. Never include the curly braces (<code>{}</code>) in your API calls.</li> -<li>For Enterprise accounts, replace <strong><font color="slate">cad</font></strong> in all Onshape URLs with your company domain. -https://<font color="slate"><strong>cad</strong></font>.onshape.com &gt; https://<font color="slate"><strong>companyName</strong></font>.onshape.com</li> -</ul> -</blockquote> -<h2 id="endpoints">Endpoints</h2> -<ul> -<li><a href="https://cad.onshape.com/glassworks/explorer/#/Element/getConfiguration">Element/getConfiguration</a>: Get the configuration data for a Part Studio or Assembly. -<pre tabindex="0"><code>curl -X &#39;GET&#39; \ -&#39;https://cad.onshape.com/api/v6/elements/d/{did}/wvm/{wvmid}/e/{eid}/configuration&#39; \ --H &#39;Accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39;\ --H &#39;Content-Type: application/json;charset=UTF-8; qs=0.09&#39; -</code></pre></li> -<li><a href="https://cad.onshape.com/glassworks/explorer/#/Element/updateConfiguration">Element/updateConfiguration</a>: Update the configuration data for a Part Studio or Assembly. -<pre tabindex="0"><code>curl -X &#39;POST&#39; \ -&#39;https://cad.onshape.com/api/v6/elements/d/{did}/wvm/{wvmid}/e/{eid}/configuration&#39; \ --H &#39;Accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39;\ --H &#39;Content-Type: application/json;charset=UTF-8; qs=0.09&#39; \ --d &#39;{ }&#39; -</code></pre></li> -<li><a href="https://cad.onshape.com/glassworks/explorer/#/Element/decodeConfiguration">Element/decodeConfiguration</a>: Process an encoded configuration file. -<pre tabindex="0"><code>curl -X &#39;GET&#39; \ -&#39;https://cad.onshape.com/api/v6/elements/d/{did}/wvm/{wvmid}/e/{eid}/configurationencodings/{encodingId}&#39; \ --H &#39;Accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; -</code></pre></li> -<li><a href="https://cad.onshape.com/glassworks/explorer/#/Element/encodeConfigurationMap">Element/encodeConfigurationMap</a>: Create an encoded map of configurations. -<pre tabindex="0"><code>curl -X &#39;POST&#39; \ -&#39;https://cad.onshape.com/api/v6/elements/d/{did}/e/{eid}/configurationencodings&#39; \ --H &#39;Accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39;\ --H &#39;Content-Type: application/json;charset=UTF-8; qs=0.09&#39; \ --d &#39;{ -&#34;parameters&#34;: [ -{ -&#34;parameterId&#34;: &#34;{parameterId}&#34;, -&#34;parameterValue&#34;: &#34;{configValue}&#34; -} -] -}&#39; -</code></pre></li> -</ul> -<h3 id="encoded-configuration-strings">Encoded Configuration Strings</h3> -<p>The <a href="https://cad.onshape.com/glassworks/explorer/#/Element/encodeConfigurationMap">Element/encodeConfigurationMap</a> and <a href="https://cad.onshape.com/glassworks/explorer/#/Element/decodeConfiguration">Element/decodeConfiguration</a> APIs convert parameters from JSON to a URL-encoded string in the following format: <code>&quot;configuration=parameterId%3DparameterValue&quot;</code></p> -<p>For example,</p> -<pre tabindex="0"><code>{ -&#34;parameters&#34;: [ -{ -&#34;parameterId&#34;: &#34;List_izOjbm5HCRXEld&#34;, -&#34;parameterValue&#34;: &#34;_500_mm&#34; -} -] -} -</code></pre><p>encodes to:</p> -<pre tabindex="0"><code>&#34;configuration=List_izOjbm5HCRXEld%3D_500_mm&#34; -</code></pre><p>and:</p> -<pre tabindex="0"><code>&#34;configuration=List_izOjbm5HCRXEld%3DDefault&#34; -</code></pre><p>decodes to:</p> -<pre tabindex="0"><code>{ -&#34;parameters&#34;: [ -{ -&#34;parameterId&#34;: &#34;List_izOjbm5HCRXEld&#34;, -&#34;parameterValue&#34;: &#34;Default&#34; -} -] -} -</code></pre><h2 id="sample-workflows">Sample Workflows</h2> -<p>These sample workflows all build off one another. Completing all of the workflows will take you step-by-step through the process of getting Configuration information, encoding the information for use, and using the encoded configuration to create a configured export. You can also watch the <a href="#workflow-video">video</a> to see the entire workflow in the Glassworks API Explorer.</p> -<h3 id="get-a-configuration">Get a Configuration</h3> -<p>In this example, we&rsquo;ll use the <a href="https://cad.onshape.com/glassworks/explorer/#/Element/getConfiguration">Element/getConfiguration</a> endpoint to get the Configuration information from a Part Studio.</p> -<ol> -<li>Make a copy of <a href="https://cad.onshape.com/documents/e60c4803eaf2ac8be492c18e/w/d2558da712764516cc9fec62/e/958bceb5a2511b572dbbe851">this public document</a>. Make a note of the new document&rsquo;s document ID, workspace ID, and element ID.</li> -<li>Click the Configurations dropdown in the Features list, and observe that there are two options for the drillbit length, <code>250 mm</code> and <code>500 mm</code>. -</br></br><img src="https://onshape-public.github.io/images/configs-example-ui.png" alt=" " width=550></li> -<li>Set up a call to the <a href="https://cad.onshape.com/glassworks/explorer/#/Element/getConfiguration">Element/getConfiguration</a> endpoint to get the Configuration for the Part Studio. Don&rsquo;t forget to replace the URL parameters with the IDs from your copy of the document, and replace <code>CREDENTIALS</code> with your authorization credentials. -<pre tabindex="0"><code>curl -X &#39;GET&#39; \ -&#39;https://cad.onshape.com/api/v6/elements/d/{did}/w/{wid}/e/{eid}/configuration&#39; \ --H &#39;Accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; \ -</code></pre></li> -<li>Review the Configuration information detailed in the response. You can see that the Part Studio contains one configuration (<code>Drill_Bit_Length</code>) with two options (<code>250 mm</code> and <code>500 mm</code>): -<pre tabindex="0"><code>{ -&#34;btType&#34;: &#34;BTConfigurationResponse-2019&#34;, -&#34;currentConfiguration&#34;: [ -{ -&#34;btType&#34;: &#34;BTMParameterEnum-145&#34;, -&#34;namespace&#34;: &#34;&#34;, -&#34;nodeId&#34;: &#34;{nodeId1}&#34;, -&#34;value&#34;: &#34;Default&#34;, -&#34;enumName&#34;: &#34;{paramId_conf}&#34;, -&#34;parameterId&#34;: &#34;{paramId}&#34; -} -], -&#34;configurationParameters&#34;: [ -{ -&#34;btType&#34;: &#34;BTMConfigurationParameterEnum-105&#34;, -&#34;defaultValue&#34;: &#34;Default&#34;, -&#34;enumName&#34;: &#34;{enumName}&#34;, -&#34;namespace&#34;: &#34;&#34;, -&#34;options&#34;: [ -{ -&#34;btType&#34;: &#34;BTMEnumOption-592&#34;, -&#34;optionName&#34;: &#34;250 mm&#34;, -&#34;option&#34;: &#34;Default&#34;, -&#34;nodeId&#34;: &#34;{nodeId2}&#34; -}, -{ -&#34;btType&#34;: &#34;BTMEnumOption-592&#34;, -&#34;optionName&#34;: &#34;500 mm&#34;, -&#34;option&#34;: &#34;_500_mm&#34;, -&#34;nodeId&#34;: &#34;{nodeId3}&#34; -} -], -&#34;isCosmetic&#34;: false, -&#34;parameterId&#34;: &#34;{paramId}&#34;, -&#34;parameterName&#34;: &#34;Drill_Bit_Length&#34;, -&#34;nodeId&#34;: &#34;{nodeId4}&#34; -} -], -&#34;serializationVersion&#34;: &#34;1.2.0&#34;, -&#34;sourceMicroversion&#34;: &#34;{mid}&#34;, -&#34;microversionSkew&#34;: false, -&#34;rejectMicroversionSkew&#34;: false, -&#34;libraryVersion&#34;: 2296 -} -</code></pre></li> -</ol> -<h3 id="encode-a-configuration-string">Encode a configuration string</h3> -<p>In this example, we&rsquo;ll encode a Configuration so it can be used as part of a translation (i.e., an export). Please read the <a href="#encoded-configuration-strings">Encoded Configuration Strings</a> section before beginning this example.</p> -<ol> -<li>This example builds off the previous one. Please complete the <a href="#get-a-configuration">Get a Part Studio Configuration</a> workflow to obtain the raw Configuration output for the Part Studio.</li> -<li>Set up a call to the <a href="https://cad.onshape.com/glassworks/explorer/#/Element/encodeConfigurationMap">Element/encodeConfigurationMap</a> endpoint. Don&rsquo;t forget to replace the URL parameters with the IDs from your document, and replace <code>CREDENTIALS</code> with your authorization credentials. -<pre tabindex="0"><code>curl -X &#39;POST&#39; \ -&#39;https://cad.onshape.com/api/v6/elements/d/{did}/e/{eid}/configurationencodings&#39; \ --H &#39;Accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; \ --H &#39;Content-Type: application/json;charset=UTF-8; qs=0.09&#39; \ --d &#39;{ }&#39; -</code></pre></li> -<li>Now we need to create our JSON body for the request. Note the structure of the body: -<pre tabindex="0"><code>{ -&#34;parameters&#34;: [ -{ -&#34;parameterId&#34;: &#34;string&#34;, -&#34;parameterValue&#34;: &#34;string&#34; -} -], -&#34;standardContentParametersId&#34;: &#34;string&#34; -} -</code></pre>Fill out the request body with our information: -<ul> -<li>We&rsquo;re not using a standard content part, so we can delete the second key/value pair.</li> -<li>The parameterId can be found in the response from the previous example. It usually begins with (<code>List_</code>)</li> -<li>For the parameter value, we&rsquo;ll enter one of our configuration options from the previous example. In this case, we&rsquo;ll use <code>_500_mm</code> to export a 500 mm drillbit part.</li> -</ul> -<pre tabindex="0"><code>{ -&#34;parameters&#34;: [ -{ -&#34;parameterId&#34;: &#34;{parameterId}&#34;, -&#34;parameterValue&#34;: &#34;_500_mm&#34; -} -] -} -</code></pre></li> -<li>Now we can make our call: -<pre tabindex="0"><code>curl -X &#39;POST&#39; \ -&#39;https://cad.onshape.com/api/v6/elements/d/{did}/e/{eid}/configurationencodings&#39; \ --H &#39;Accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; \ --H &#39;Content-Type: application/json;charset=UTF-8; qs=0.09&#39; \ --d &#39;{ -&#34;parameters&#34;: [ -{ -&#34;parameterId&#34;: &#34;{parameterId}&#34;, -&#34;parameterValue&#34;: &#34;_500_mm&#34; -} -] -}&#39; -</code></pre></li> -<li>The call responds with two values: the ID of the encoding, and the encoded configuration string. We can use this configuration string (returned in the <code>queryParam</code> field) any time we want to specify the 500 mm drillbit length. -<pre tabindex="0"><code>{ -&#34;encodedId&#34;: &#34;{encodedId}&#34;, -&#34;queryParam&#34;: &#34;configuration={configString}&#34; -} -</code></pre></li> -</ol> -<h3 id="export-a-configured-part">Export a configured part</h3> -<p>In this example, we will export a configured part. We have a drillbit with two configurations: <code>250 mm</code> and <code>500 mm</code> lengths. To export a 500 mm drillbit, we can specify the configuration as part of the export.</p> -<ol> -<li>This example builds off the previous two. Please complete this exercise after the <a href="#encode-a-configuration">Encode a configuration</a> workflow.</li> -<li>Next, set up a call to the <a href="https://cad.onshape.com/glassworks/explorer/#/PartStudio/exportParasolid">PartStudio/exportParasolid</a> endpoint. Don&rsquo;t forget to replace the URL parameters with the IDs from your document, and replace <code>CREDENTIALS</code> with your authorization credentials. Note that this endpoint includes an optional <code>configuration</code> parameter. This is where we&rsquo;ll enter the configuration string we found in the previous example. -<pre tabindex="0"><code>curl -X &#39;GET&#39; \ -&#39;https://cad.onshape.com/api/v6/partstudios/d/{did}/w/{wid}/e/{eid}/parasolid?version=0&amp;includeExportIds=false&amp;configuration={configString}&amp;binaryExport=false&#39; \ --H &#39;Accept: */*&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; \ -</code></pre></li> -<li>This endpoint returns a redirect URL. Navigate to the returned URL in your browser to download the export. -<ul> -<li>Hint: The URL will look something like this, but with different IDs:</li> -</ul> -<pre tabindex="0"><code>https://cad.onshape.com/api/v6/partstudios/d/e60c4803eaf2ac8be492c18e/w/d2558da712764516cc9fec62/e/958bceb5a2511b572dbbe851/parasolid?version=0&amp;includeExportIds=false&amp;configuration=List_izOjbm5HCRXEld%253D_500_mm&amp;binaryExport=false -</code></pre></li> -<li>Now we need to import our Parasolid to confirm the correct configuration was used. Open your document in the Onshape UI, click the Insert new tab button, and then select Import. -</br><img src="https://onshape-public.github.io/images/configs-insert-menu.png" alt="Insert new tab menu with Import highlighted in Onshape UI" width=250></li> -<li>Navigate to the export you downloaded (with the <code>.x_t</code> extension) and import it into Onshape.</li> -<li>Use the measure tool to confirm the length of the imported drillbit is 500 mm. -</br><img src="https://onshape-public.github.io/images/configs-measure-tool.png" alt="Measure tool in Onshape UI showing drill length as 500 mm" width=400></li> -</ol> -<h2 id="workflow-video">Workflow Video</h2> -<p>This video demonstrates how to complete the above tutorials in the Onshape API Explorer. -</br></p> -<p> -<div class="wistia_responsive_padding" style="padding:77.08% 0 0 0;position:relative;"><div class="wistia_responsive_wrapper" style="height:100%;left:0;position:absolute;top:0;width:100%;"><iframe src="https://fast.wistia.net/embed/iframe/o4pvoyjwuk?seo=true&videoFoam=true" title="configs-export-example Video" allow="autoplay; fullscreen" allowtransparency="true" frameborder="0" scrolling="no" class="wistia_embed" name="wistia_embed" msallowfullscreen width="100%" height="100%"></iframe></div></div> -<script src="https://fast.wistia.net/assets/external/E-v1.js" async></script> -</p> -<h2 id="additional-resources">Additional Resources</h2> -<ul> -<li><a href="https://cad.onshape.com/glassworks/explorer/#/Element">API Explorer: Configurations</a></li> -<li><a href="https://onshape-public.github.io/docs/api-intro/explorer">API Guide: API Explorer</a></li> -<li><a href="https://cad.onshape.com/help/Content/configurations.htm">Onshape Help: Configurations</a></li> -</ul>Docs: Drawingshttps://onshape-public.github.io/docs/api-adv/drawings/Thu, 12 Oct 2023 00:00:00 +0000https://onshape-public.github.io/docs/api-adv/drawings/ -<p>This page describes the APIs Onshape provides for creating and manipulating Onshape drawings.</p> -<blockquote> -<p>📘 <strong>Notes</strong></p> -<ul> -<li>This page provides sample code as curls. See the <a href="https://curl.se/docs/">curl documentation</a> for more information.</li> -<li>All Onshape API calls must be properly authenticated by replacing the <code>CREDENTIALS</code> variable in the curls below. See the <a href="https://onshape-public.github.io/docs/auth/apikeys">API Keys</a> page for instructions and the <a href="https://onshape-public.github.io/docs/api-intro/quickstart">Quick Start</a> for an example. All applications submitted to the Onshape App Store <em>must</em> authenticate with <a href="https://onshape-public.github.io/docs/auth/oauth">OAuth2</a>.</li> -<li>This documentation refers to Onshape IDs in the following format: <code>{did}, {wid}, {eid}, {pid}, {otherId}</code>. These represent document, workspace, element, part, and other IDs (respectively) that are needed make the API calls. We sometimes abbreviate these variables as <code>DWVEM</code> Please see <a href="https://onshape-public.github.io/docs/api-intro/#onshape-api-request">API Guide: API Intro</a> for information on what these IDs mean and how to obtain them from your documents. Never include the curly braces (<code>{}</code>) in your API calls.</li> -<li>For Enterprise accounts, replace <strong><font color="slate">cad</font></strong> in all Onshape URLs with your company domain. -https://<font color="slate"><strong>cad</strong></font>.onshape.com &gt; https://<font color="slate"><strong>companyName</strong></font>.onshape.com</li> -</ul> -</blockquote> -<h2 id="endpoints">Endpoints</h2> -<p>To create drawings, Onshape allows you to send all drawing data points and information through the API as part of the request body JSON.</p> -<p>The following endpoints are available:</p> -<ul> -<li><a href="https://cad.onshape.com/glassworks/explorer/#/Drawing/createDrawingAppElement">Create a drawing</a> -<pre tabindex="0"><code>curl -X &#39;POST&#39; \ -&#39;https://cad.onshape.com/api/v6/drawings/d/{did}/w/{wid}/create&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; \ --H &#39;Accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Content-Type: application/json;charset=UTF-8; qs=0.09&#39; \ --d &#39;{ -&lt;JSON request body options from the BTDrawingParams schema&gt; -}&#39; -</code></pre>Specify the document in which to create the drawing in the URL, and pass any additional options as part of the request body. You can provide a name for the drawing, manipulate the drawing graphics area, specify a part or template to create the drawing from, and more. -<ul> -<li>See documentation for all available options in the <a href="https://cad.onshape.com/glassworks/explorer/#/Drawing/createDrawingAppElement">API Explorer</a>.</li> -<li>For instructions on viewing the documentation for the request body schemas, see our <a href="https://onshape-public.github.io/docs/api-intro/explorer#view-request-body-docs">API Explorer</a> page. -Check out the <a href="#sample-workflows">Sample Workflows</a> section below for some practical examples.<p></br> -<img src="https://onshape-public.github.io/images/BTDrawingParamsSchema.png" alt="BTDrawingParams schema in the createDrawingAppElement endpoint"></br></p></li> -</ul> -</li> -<li><a href="https://cad.onshape.com/glassworks/explorer/#/Drawing/modifyDrawing">Modify a drawing</a> -<pre tabindex="0"><code>curl -X &#39;POST \ -&#39;https://cad.onshape.doc/api/v6/drawings/d/{did}/w/{wid}/e/{eid}/modify&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; \ --H &#39;Accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Content-Type: application/json;charset=UTF-8; qs=0.09&#39; \ --d &#39;{ -&#34;description&#34;: &#34;Description of the modification.&#34;, -&#34;jsonRequests&#34;: [ -{ -&lt;JSON request body options from the jsonRequests schema&gt; -} -] -}&#39; -</code></pre>Specify the drawing to modify in the URL, and pass the information on the modification in the request body. Note that the <code>jsonRequests</code> schema is not defined in the Glassworks API Explorer; see the <a href="https://github.com/onshape-public/onshapedrawingjson">OnshapeDrawingJson</a> repository for this information, and check out the <a href="#sample-workflows">Sample Workflows</a> section below for some practical examples.</li> -<li><a href="https://cad.onshape.com/glassworks/explorer/#/Drawing/getModificationStatus">Get the drawing modification status</a> -<pre tabindex="0"><code>curl -X &#39;GET&#39; \ -&#39;https://cad.onshape.com/api/v6/drawings/modify/status/{mrid} --H &#39;Authorization: Basic CREDENTIALS&#39; \ --H &#39;Accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Content-Type: application/json;charset=UTF-8; qs=0.09&#39; \ -</code></pre>Provide the modification ID (from the <code>modifyDrawing</code> response body) to get the status of the modification.</li> -<li><a href="https://cad.onshape.com/glassworks/explorer/#/Drawing/createDrawingTranslation">Translate a drawing</a>: See the <a href="https://onshape-public.github.io/docs/api-adv/translation#export-a-drawing-as-a-json">Translations API Guide</a>.</li> -<li><a href="https://cad.onshape.com/glassworks/explorer/#/Drawing/getDrawingTranslatorFormats">Get drawing translation formats</a>: See the <a href="https://onshape-public.github.io/docs/api-adv/translation#export-a-drawing-as-a-json">Translations API Guide</a>.</li> -</ul> -<h3 id="viewing-drawing-errors">Viewing drawing errors</h3> -<p>You can <a href="https://onshape-public.github.io/docs/api-adv/translation.md#export-a-drawing-as-a-json">export your drawing to a JSON</a> to find errors with your drawing. Each <code>view</code> in the JSON includes an <code>errorState</code> for reporting drawing errors.</p> -<h2 id="sample-app">Sample App</h2> -<p>Please see the <a href="https://github.com/onshape-public/onshape-ts-drawing-client">Onshape TypeScript Drawing Client</a> for a working example of using the Onshape Drawing APIs in an application.</p> -<h2 id="sample-workflows">Sample Workflows</h2> -<h3 id="create-a-drawing-from-a-part">Create a drawing from a part</h3> -<p>In this example, we&rsquo;ll create a drawing from the <strong>FLYWHEEL</strong> part in <a href="https://cad.onshape.com/documents/e60c4803eaf2ac8be492c18e/v/405ba186c3a70e0227ab2941/e/6bed6b43463f6a46a37b4a22">this public document</a>.</p> -<ol> -<li>Create or open an Onshape document in which to create your drawing.</li> -<li>Start to form the <a href="https://cad.onshape.com/glassworks/explorer/#/Drawing/createDrawingAppElement">Drawings/createDrawingAppElement</a> call. Replace <code>{did}</code> and <code>{wid}</code> in the URL below with the document ID and workspace ID of your document (i.e., the <em>target</em> document), and replace <code>CREDENTIAL</code> with your authorization credentials. -<pre tabindex="0"><code>curl -X &#39;POST&#39; \ -&#39;https://cad.onshape.com/api/v6/drawings/d/{did}/w/{wid}/create&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; \ --H &#39;Accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Content-Type: application/json;charset=UTF-8; qs=0.09&#39; \ -</code></pre></li> -<li>Add the request body information: -<ul> -<li>Add <code>flywheelDrawing</code> as the <code>drawingName</code> field.</li> -<li>We must specify the <em>source</em> document&rsquo;s document and version IDs. Note that since our target document and source document are different, we use the <code>external</code> document and version ID fields.</li> -<li>We must also provide the ID of the part to create the drawing from, and the ID of the element (i.e., tab) in which the part lives. -</br> -(Hint: You can call <a href="https://cad.onshape.com/glassworks/explorer/#/Part/getPartsWMVE">Part/getPartsWMVE</a> to get a list of part IDs in an element.)</br> -<pre tabindex="0"><code>curl -X &#39;POST&#39; \ -&#39;https://cad.onshape.com/api/v6/drawings/d/{did}/w/{wid}/create&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; \ --H &#39;Accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Content-Type: application/json;charset=UTF-8; qs=0.09&#39; \ --d &#39;{ -&#34;drawingName&#34;: &#34;flywheelDrawing&#34;, -&#34;externalDocumentId&#34;: &#34;e60c4803eaf2ac8be492c18e&#34;, -&#34;externalDocumentVersionId&#34;: &#34;405ba186c3a70e0227ab2941&#34;, -&#34;elementId&#34;: &#34;6bed6b43463f6a46a37b4a22&#34;, -&#34;partId&#34;: &#34;JiD&#34; -}&#39; -</code></pre></li> -</ul> -</li> -<li>Call the endpoint and open your document. Confirm that you see the new <code>flywheelDrawing</code> element containing the drawing: -</br><img src="https://onshape-public.github.io/images/flywheelDrawingExample1.png" alt="new drawing created from a part in an external document" width=650></li> -</ol> -<h3 id="create-a-drawing-from-a-template">Create a drawing from a template</h3> -<p>In this example, we&rsquo;ll create a drawing from the standard ANSI template in <a href="https://cad.onshape.com/documents/cbe6e776694549b5ba1a3e88/w/24d08acf10234dbc8d3ab585/e/17eef7862b224f6fb12cbc46">this public document</a>.</p> -<ol> -<li>Open any Onshape document in which to create your drawing.</li> -<li>Start to form the <a href="https://cad.onshape.com/glassworks/explorer/#/Drawing/createDrawingAppElement">Drawings/createDrawingAppElement</a> call. Replace <code>{did}</code> and <code>{wid}</code> in the URL below with the document ID and workspace ID of your document (i.e., the <em>target</em> document), and replace <code>CREDENTIAL</code> with your authorization credentials. -<pre tabindex="0"><code>curl -X &#39;POST&#39; \ -&#39;https://cad.onshape.com/api/v6/drawings/d/{did}/w/{wid}/create&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; \ --H &#39;Accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Content-Type: application/json;charset=UTF-8; qs=0.09&#39; \ -</code></pre></li> -<li>Add the request body information: -<ul> -<li>Add <code>templateAnsiDrawing</code> as the <code>drawingName</code> field.</li> -<li>We must specify the <em>source</em> document&rsquo;s document ID and workspace ID.</li> -<li>We must also provide the ID of the element (i.e., tab) in which the template lives.</li> -<li>Note that we use the <code>template</code> document, workspace, and element ID fields when referring to a specific template for drawing creation. -</br> -<pre tabindex="0"><code>curl &#39;https://cad.onshape.com/api/drawings/d/{did}/w/{wid}/create&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; \ --H &#39;Accept: application/json, text/plain, */*&#39; \ --H &#39;Content-Type: application/json;charset=UTF-8&#39; \ --d &#39;{ -&#34;drawingName&#34;: &#34;templateAnsiDrawing&#34;, -&#34;templateDocumentId&#34;:&#34;cbe6e776694549b5ba1a3e88&#34;, -&#34;templateWorkspaceId&#34;:&#34;24d08acf10234dbc8d3ab585&#34;, -&#34;templateElementId&#34;:&#34;17eef7862b224f6fb12cbc46&#34; -}&#39; -</code></pre></li> -</ul> -</li> -<li>Call the endpoint and open your document. Confirm that you see the new <code>templateAnsiDrawing</code> element containing the empty drawing template.</li> -</ol> -<h3 id="create-a-drawing-in-a-custom-graphics-area">Create a drawing in a custom graphics area</h3> -<ol> -<li>Open any Onshape document in which to create your drawing.</li> -<li>Start to form the <a href="https://cad.onshape.com/glassworks/explorer/#/Drawing/createDrawingAppElement">Drawings/createDrawingAppElement</a> call. Replace <code>{did}</code> and <code>{wid}</code> in the URL below with your document, and replace <code>CREDENTIAL</code> with your authorization credentials. -<pre tabindex="0"><code>curl -X &#39;POST&#39; \ -&#39;https://cad.onshape.com/api/v6/drawings/d/{did}/w/{wid}/create&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; \ --H &#39;Accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Content-Type: application/json;charset=UTF-8; qs=0.09&#39; \ -</code></pre></li> -<li>Add information about the drawings area. In this example, we&rsquo;ll add an additional column and row to the drawings area, a title block, and add a border around it. -<pre tabindex="0"><code>curl -X &#39;POST&#39; \ -&#39;https://cad.onshape.com/api/v6/drawings/d/{did}/w/{wid}/create&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; \ --H &#39;accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Content-Type: application/json;charset=UTF-8; qs=0.09&#39; \ --d &#39;{ -&#34;drawingName&#34;: &#34;customGraphicsArea&#34;, -&#34;border&#34;: &#34;true&#34;, -&#34;numberHorizontalZones&#34;: &#34;3&#34;, -&#34;numberVerticalZones&#34;: &#34;3&#34; -&#34;titleblock&#34;: true -}&#39; -</code></pre></li> -<li>Call the endpoint and open your document. Confirm that you see the new <code>customGraphicsArea</code> element: -</br><img src="https://onshape-public.github.io/images/customDrawingArea.png" alt="new drawing created with border and extra column and row" width=550></li> -</ol> -<h3 id="add-a-note-to-a-drawing">Add a note to a drawing</h3> -<ol> -<li>Open an existing (or create a new) Onshape document with a drawing.</li> -<li>Start to form the <a href="https://cad.onshape.com/glassworks/explorer/#/Drawing/modifyDrawing">Drawings/modifyDrawing</a> call. Replace the URL parameters with the values from your document, and replace <code>CREDENTIALS</code> with your authorization credentials. -<pre tabindex="0"><code>curl -X &#39;POST \ -&#39;https://cad.onshape.doc/api/v6/drawings/d/{did}/w/{wid}/e/{eid}/modify&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; \ --H &#39;Accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Content-Type: application/json;charset=UTF-8; qs=0.09&#39; \ -</code></pre></li> -<li>Add information about the modification. In this example, we&rsquo;ll create an <code>Onshape::Note</code> on the drawing. We must specify the <code>messageName</code> and <code>formatVersion</code> for the modification, and then provide the contents and size of the annotation. -<pre tabindex="0"><code>curl -X &#39;POST \ -&#39;https://cad.onshape.doc/api/v6/drawings/d/{did}/w/{wid}/e/{eid}/modify&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; \ --H &#39;Accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Content-Type: application/json;charset=UTF-8; qs=0.09&#39; \ --d &#39;{ -&#34;description&#34;: &#34;Add a note to the drawing.&#34;, -&#34;jsonRequests&#34;: [ { -&#34;messageName&#34;: &#34;onshapeCreateAnnotations&#34;, -&#34;formatVersion&#34;: &#34;2021-01-01&#34;, -&#34;annotations&#34;: [ -{ -&#34;type&#34;: &#34;Onshape::Note&#34;, -&#34;note&#34;: { -&#34;position&#34;: { -&#34;type&#34;: &#34;Onshape::Reference::Point&#34;, -&#34;coordinate&#34;: [ -1, -10, -0 -] -}, -&#34;contents&#34;: &#34;This is a note&#34;, -&#34;textHeight&#34;: 0.2, -&#34;logicalId&#34;: &#34;note1&#34; -} -} -] -}] -}&#39; -</code></pre></li> -<li>Make the call, and then get <code>id</code> from the response body. You&rsquo;ll need this to poll the modification status to figure out when the modification has completed.</li> -<li>Set up the <a href="https://cad.onshape.com/glassworks/explorer/#/Drawing/getModificationStatus">Drawings/getModificationStatus</a> call. Replace <code>{mrid}</code> with the <code>id</code> from the last step, and replace <code>CREDENTIALS</code> with your credentials. Poll the modification status until the response returns <code>&quot;requestState&quot;: &quot;DONE&quot;</code>. -<pre tabindex="0"><code>curl -X &#39;GET \ -&#39;https://cad.onshape.doc/api/v6/drawings/modify/status/{mrid}&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; \ --H &#39;Accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Content-Type: application/json;charset=UTF-8; qs=0.09&#39; \ -</code></pre></li> -<li>Open your drawing and confirm that you see the new note. Note that your drawing may not match this image exactly, depending on your drawing and document properties. This sample document uses Inches for units. -</br><img src="https://onshape-public.github.io/images/drawings-addnote.png" alt="drawing with note annotation" width=550></li> -</ol> -<h3 id="add-a-callout-to-a-drawing">Add a callout to a drawing</h3> -<ol> -<li>Open an existing (or create a new) Onshape document with a drawing.</li> -<li>Start to form the <a href="https://cad.onshape.com/glassworks/explorer/#/Drawing/modifyDrawing">Drawings/modifyDrawing</a> call. Replace the URL parameters with the values from your document, and replace <code>CREDENTIALS</code> with your authorization credentials. -<pre tabindex="0"><code>curl -X &#39;POST \ -&#39;https://cad.onshape.doc/api/v6/drawings/d/{did}/w/{wid}/e/{eid}/modify&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; \ --H &#39;Accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Content-Type: application/json;charset=UTF-8; qs=0.09&#39; \ -</code></pre></li> -<li>Add information about the modification. In this example, we&rsquo;ll add an <code>Onshape::Callout</code> to the drawing. We must specify the <code>messageName</code> and <code>formatVersion</code> for the modification, and then provide the contents and size of the annotation: -<pre tabindex="0"><code>curl -X &#39;POST \ -&#39;https://cad.onshape.doc/api/v6/drawings/d/{did}/w/{wid}/e/{eid}/modify&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; \ --H &#39;Accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Content-Type: application/json;charset=UTF-8; qs=0.09&#39; \ --d &#39;{ -&#34;description&#34;: &#34;Add a callout to the drawing.&#34;, -&#34;jsonRequests&#34;: [ { -&#34;messageName&#34;: &#34;onshapeCreateAnnotations&#34;, -&#34;formatVersion&#34;: &#34;2021-01-01&#34;, -&#34;annotations&#34;: [ -{ -&#34;callout&#34;: -{ -&#34;borderShape&#34;: &#34;Circle&#34;, -&#34;borderSize&#34;: 0, -&#34;contents&#34;: &#34;Example Callout&#34;, -&#34;contentsBottom&#34;: &#34;bottom&#34;, -&#34;contentsLeft&#34;: &#34;left&#34;, -&#34;contentsRight&#34;: &#34;right&#34;, -&#34;contentsTop&#34;: &#34;top&#34;, -&#34;position&#34;: { -&#34;coordinate&#34;: [ -2.5, -6, -0 -], -&#34;type&#34;: &#34;Onshape::Reference::Point&#34; -}, -&#34;textHeight&#34;: 0.12, -&#34;logicalId&#34;: &#34;callout1&#34; -}, -&#34;type&#34;: &#34;Onshape::Callout&#34; -} -] -}] -}&#39; -</code></pre></li> -<li>Make the call, and then get <code>id</code> from the response body. You&rsquo;ll need this to poll the modification status to figure out when the modification has completed.</li> -<li>Set up the <a href="https://cad.onshape.com/glassworks/explorer/#/Drawing/getModificationStatus">Drawings/getModificationStatus</a> call. Replace <code>{mrid}</code> with the <code>id</code> from the last step, and replace <code>CREDENTIALS</code> with your credentials. Poll the modification status until the response returns <code>&quot;requestState&quot;: &quot;DONE&quot;</code>. -<pre tabindex="0"><code>curl -X &#39;GET \ -&#39;https://cad.onshape.doc/api/v6/drawings/modify/status/{mrid}&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; \ --H &#39;Accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Content-Type: application/json;charset=UTF-8; qs=0.09&#39; \ -</code></pre></li> -<li>Open your drawing and confirm that you see the new callout. -</br><img src="https://onshape-public.github.io/images/drawings-addcallout.png" alt="callout added to drawing" width=550></li> -</ol> -<h3 id="add-a-centerline-to-a-drawing">Add a centerline to a drawing</h3> -<ol> -<li>Open an existing (or create a new) Onshape document with a drawing.</li> -<li>Start to form the <a href="https://cad.onshape.com/glassworks/explorer/#/Drawing/modifyDrawing">Drawings/modifyDrawing</a> call. Replace the URL parameters with the values from your document, and replace <code>CREDENTIALS</code> with your authorization credentials. -<pre tabindex="0"><code>curl -X &#39;POST \ -&#39;https://cad.onshape.doc/api/v6/drawings/d/{did}/w/{wid}/e/{eid}/modify&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; \ --H &#39;Accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Content-Type: application/json;charset=UTF-8; qs=0.09&#39; \ -</code></pre></li> -<li>Add information about the modification. In this example, we&rsquo;ll add an <code>Onshape::Centerline</code> to the drawing. We must specify the <code>messageName</code> and <code>formatVersion</code> for the modification, and then provide the coordinates of the centerline ends.</li> -</ol> -<ul> -<li>Note: you can <a href="https://onshape-public.github.io/docs/api-adv/translation/#export-a-drawing-as-a-json">Export a Drawing to JSON</a> to get a list of valid coordinates and handles.</li> -<li>Note: if you have access, you can refer to the <a href="https://docs.opendesign.com/td/">ODA documentation</a> for more detailed formatting information. -<pre tabindex="0"><code>curl -X &#39;POST \ -&#39;https://cad.onshape.doc/api/v6/drawings/d/{did}/w/{wid}/e/{eid}/modify&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; \ --H &#39;Accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Content-Type: application/json;charset=UTF-8; qs=0.09&#39; \ --d &#39;{ -&#34;description&#34;: &#34;Add a centerline to the drawing&#34;, -&#34;jsonRequests&#34;: [ { -&#34;messageName&#34;: &#34;onshapeCreateAnnotations&#34;, -&#34;formatVersion&#34;: &#34;2021-01-01&#34;, -&#34;annotations&#34;: [ -{ -&#34;pointToPointCenterline&#34;: { -&#34;point1&#34;: { -&#34;coordinate&#34;: [ -2, -4, -0 -], -&#34;type&#34;: &#34;Onshape::Reference::Point&#34;, -&#34;uniqueId&#34;: &#34;point1&#34;, -&#34;viewId&#34;: &#34;51fa8b6040e411dfd17a4cda&#34; -}, -&#34;point2&#34;: { -&#34;coordinate&#34;: [ -7, -6, -1 -], -&#34;type&#34;: &#34;Onshape::Reference::Point&#34;, -&#34;uniqueId&#34;: &#34;point2&#34;, -&#34;viewId&#34;: &#34;ay6a8b6020e4h7dfdnn1499i&#34; -} -}, -&#34;type&#34;: &#34;Onshape::Centerline::PointToPoint&#34; -} -] -}] -}&#39; -</code></pre></li> -</ul> -<ol start="4"> -<li>Make the call, and then get <code>id</code> from the response body. You&rsquo;ll need this to poll the modification status to figure out when the modification has completed.</li> -<li>Set up the <a href="https://cad.onshape.com/glassworks/explorer/#/Drawing/getModificationStatus">Drawings/getModificationStatus</a> call. Replace <code>{mrid}</code> with the <code>id</code> from the last step, and replace <code>CREDENTIALS</code> with your credentials. Poll the modification status until the response returns <code>&quot;requestState&quot;: &quot;DONE&quot;</code>. -<pre tabindex="0"><code>curl -X &#39;GET \ -&#39;https://cad.onshape.doc/api/v6/drawings/modify/status/{mrid}&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; \ --H &#39;Accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Content-Type: application/json;charset=UTF-8; qs=0.09&#39; \ -</code></pre></li> -<li>Open your drawing and confirm that you see the new centerline.</li> -</ol> -<h3 id="add-a-dimension-to-a-drawing">Add a dimension to a drawing</h3> -<ol> -<li>Open an existing (or create a new) Onshape document with a drawing.</li> -<li>Start to form the <a href="https://cad.onshape.com/glassworks/explorer/#/Drawing/modifyDrawing">Drawings/modifyDrawing</a> call. Replace the URL parameters with the values from your document, and replace <code>CREDENTIALS</code> with your authorization credentials. -<pre tabindex="0"><code>curl -X &#39;POST \ -&#39;https://cad.onshape.doc/api/v6/drawings/d/{did}/w/{wid}/e/{eid}/modify&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; \ --H &#39;Accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Content-Type: application/json;charset=UTF-8; qs=0.09&#39; \ -</code></pre></li> -<li>Add information about the modification. In this example, we&rsquo;ll add an <code>Onshape::Dimension</code> to the drawing. We must specify the <code>messageName</code> and <code>formatVersion</code> for the modification, and then provide the coordinates and formatting options for the dimension. (Hint: you can <a href="https://onshape-public.github.io/docs/api-adv/translation/#export-a-drawing-as-a-json">Export a Drawing to JSON</a> to get a list of valid coordinates and handles.) -<pre tabindex="0"><code>curl -X &#39;POST \ -&#39;https://cad.onshape.doc/api/v6/drawings/d/{did}/w/{wid}/e/{eid}/modify&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; \ --H &#39;Accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Content-Type: application/json;charset=UTF-8; qs=0.09&#39; \ --d &#39;{ -&#34;description&#34;: &#34;Add a dimension to the drawing&#34;, -&#34;jsonRequests&#34;: [ { -&#34;messageName&#34;: &#34;onshapeCreateAnnotations&#34;, -&#34;formatVersion&#34;: &#34;2021-01-01&#34;, -&#34;annotations&#34;: [ -{ -&#34;radialDimension&#34;: { -&#34;centerPoint&#34;: { -&#34;coordinate&#34;: [ -0.2800021171569824, -0.014964947476983043, -0.079502 -], -&#34;type&#34;: &#34;Onshape::Reference::Point&#34;, -&#34;uniqueId&#34;: &#34;point1&#34;, -&#34;viewId&#34;: &#34;e11c38795c04ca55047f7ea7&#34; -}, -&#34;chordPoint&#34;: { -&#34;coordinate&#34;: [ -0.2920149764955524, -0.010030535983985095, -0.079502 -], -&#34;type&#34;: &#34;Onshape::Reference::Point&#34;, -&#34;uniqueId&#34;: &#34;point2&#34;, -&#34;viewId&#34;: &#34;e11c38795c04ca55047f7ea7&#34; -}, -&#34;formatting&#34;: { -&#34;dimdec&#34;: 2, -&#34;dimlim&#34;: false, -&#34;dimpost&#34;: &#34;R&lt;&gt;&#34;, -&#34;dimtm&#34;: 0, -&#34;dimtol&#34;: false, -&#34;dimtp&#34;: 0, -&#34;type&#34;: &#34;Onshape::Formatting::Dimension&#34; -}, -&#34;logicalId&#34;: &#34;dimension1&#34;, -&#34;textOverride&#34;: &#34;&#34;, -&#34;textPosition&#34;: { -&#34;coordinate&#34;: [ -191.80537349378181, -89.76274130852224, -0 -], -&#34;type&#34;: &#34;Onshape::Reference::Point&#34; -} -}, -&#34;type&#34;: &#34;Onshape::Dimension::Radial&#34; -} -] -}] -}&#39; -</code></pre></li> -<li>Make the call, and then get <code>id</code> from the response body. You&rsquo;ll need this to poll the modification status to figure out when the modification has completed.</li> -<li>Set up the <a href="https://cad.onshape.com/glassworks/explorer/#/Drawing/getModificationStatus">Drawings/getModificationStatus</a> call. Replace <code>{mrid}</code> with the <code>id</code> from the last step, and replace <code>CREDENTIALS</code> with your credentials. Poll the modification status until the response returns <code>&quot;requestState&quot;: &quot;DONE&quot;</code>. -<pre tabindex="0"><code>curl -X &#39;GET \ -&#39;https://cad.onshape.doc/api/v6/drawings/modify/status/{mrid}&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; \ --H &#39;Accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Content-Type: application/json;charset=UTF-8; qs=0.09&#39; \ -</code></pre></li> -<li>Open your drawing and confirm that you see the new dimension.</li> -</ol> -<h3 id="add-a-geometric-tolerance-to-a-drawing">Add a geometric tolerance to a drawing</h3> -<ol> -<li>Open an existing (or create a new) Onshape document with a drawing.</li> -<li>Start to form the <a href="https://cad.onshape.com/glassworks/explorer/#/Drawing/modifyDrawing">Drawings/modifyDrawing</a> call. Replace the URL parameters with the values from your document, and replace <code>CREDENTIALS</code> with your authorization credentials. -<pre tabindex="0"><code>curl -X &#39;POST \ -&#39;https://cad.onshape.doc/api/v6/drawings/d/{did}/w/{wid}/e/{eid}/modify&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; \ --H &#39;Accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Content-Type: application/json;charset=UTF-8; qs=0.09&#39; \ -</code></pre></li> -<li>Add information about the modification. In this example, we&rsquo;ll add an <code>Onshape::GeometricTolerance</code> to the drawing. We must specify the <code>messageName</code> and <code>formatVersion</code> for the modification, and then provide the frames and position of the annotation: -<pre tabindex="0"><code>curl -X &#39;POST \ -&#39;https://cad.onshape.doc/api/v6/drawings/d/{did}/w/{wid}/e/{eid}/modify&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; \ --H &#39;Accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Content-Type: application/json;charset=UTF-8; qs=0.09&#39; \ --d &#39;{ -&#34;description&#34;: &#34;Add a geometric tolerance to the drawing&#34;, -&#34;jsonRequests&#34;: [ { -&#34;messageName&#34;: &#34;onshapeCreateAnnotations&#34;, -&#34;formatVersion&#34;: &#34;2021-01-01&#34;, -&#34;annotations&#34;: [ -{ -&#34;geometricTolerance&#34;: { -&#34;frames&#34;: [ -&#34;{\\fDrawing Symbols Sans;◎}%%v{\\fDrawing Symbols Sans;∅}tol1{\\fDrawing Symbols Sans;Ⓜ}%%v%%v%%v%%v%%v\n&#34;, -&#34;{\\fDrawing Symbols Sans;⌖}%%vto2{\\fDrawing Symbols Sans;Ⓛ}%%v%%v%%v%%v%%v\n&#34; -], -&#34;logicalId&#34;: &#34;geometricTolerance1&#34;, -&#34;position&#34;: { -&#34;coordinate&#34;: [ -6, -6, -0 -], -&#34;type&#34;: &#34;Onshape::Reference::Point&#34; -} -}, -&#34;type&#34;: &#34;Onshape::GeometricTolerance&#34; -} -] -}] -}&#39; -</code></pre></li> -<li>Make the call, and then get <code>id</code> from the response body. You&rsquo;ll need this to poll the modification status to figure out when the modification has completed.</li> -<li>Set up the <a href="https://cad.onshape.com/glassworks/explorer/#/Drawing/getModificationStatus">Drawings/getModificationStatus</a> call. Replace <code>{mrid}</code> with the <code>id</code> from the last step, and replace <code>CREDENTIALS</code> with your credentials. Poll the modification status until the response returns <code>&quot;requestState&quot;: &quot;DONE&quot;</code>. -<pre tabindex="0"><code>curl -X &#39;GET \ -&#39;https://cad.onshape.doc/api/v6/drawings/modify/status/{mrid}&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; \ --H &#39;Accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Content-Type: application/json;charset=UTF-8; qs=0.09&#39; \ -</code></pre></li> -<li>Open your drawing and confirm that you see the new annotation. -</br><img src="https://onshape-public.github.io/images/drawings-addtolerance.png" alt="new drawing created with border and extra column and row" width=550></li> -</ol> -<h3 id="add-an-inspection-symbol-to-a-drawing">Add an inspection symbol to a drawing</h3> -<ol> -<li>Open an existing (or create a new) Onshape document with a drawing.</li> -<li>Start to form the <a href="https://cad.onshape.com/glassworks/explorer/#/Drawing/modifyDrawing">Drawings/modifyDrawing</a> call. Replace the URL parameters with the values from your document, and replace <code>CREDENTIALS</code> with your authorization credentials. -<pre tabindex="0"><code>curl -X &#39;POST \ -&#39;https://cad.onshape.doc/api/v6/drawings/d/{did}/w/{wid}/e/{eid}/modify&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; \ --H &#39;Accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Content-Type: application/json;charset=UTF-8; qs=0.09&#39; \ -</code></pre></li> -<li>Add information about the modification. In this example, we&rsquo;ll add an <code>Onshape::InspectionSymbol</code> to the drawing. We must specify the <code>messageName</code> and <code>formatVersion</code> for the modification, and then provide the shape and position of the inspection symbol. (Hint: you can <a href="https://onshape-public.github.io/docs/api-adv/translation/#export-a-drawing-as-a-json">Export a Drawing to JSON</a> to get a list of valid coordinates and handles.) -<pre tabindex="0"><code>curl -X &#39;POST \ -&#39;https://cad.onshape.doc/api/v6/drawings/d/{did}/w/{wid}/e/{eid}/modify&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; \ --H &#39;Accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Content-Type: application/json;charset=UTF-8; qs=0.09&#39; \ --d &#39;{ -&#34;description&#34;: &#34;Add an inspection symbol to the drawing&#34;, -&#34;jsonRequests&#34;: [ { -&#34;messageName&#34;: &#34;onshapeCreateAnnotations&#34;, -&#34;formatVersion&#34;: &#34;2021-01-01&#34;, -&#34;annotations&#34;: [ -{ -&#34;inspectionSymbol&#34;: { -&#34;borderShape&#34;: &#34;Circle&#34;, -&#34;borderSize&#34;: 2, -&#34;logicalId&#34;: &#34;inspection1&#34;, -&#34;parentAnnotation&#34;: &#34;h:10000577&#34;, -&#34;parentLineIndex&#34;: 0.0, -&#34;position&#34;: { -&#34;coordinate&#34;: [ -2.6, -6, -0 -], -&#34;type&#34;: &#34;Onshape::Reference::Point&#34; -}, -&#34;textHeight&#34;: 2 -}, -&#34;type&#34;: &#34;Onshape::InspectionSymbol&#34; -} -] -}] -}&#39; -</code></pre></li> -<li>Make the call, and then get <code>id</code> from the response body. You&rsquo;ll need this to poll the modification status to figure out when the modification has completed.</li> -<li>Set up the <a href="https://cad.onshape.com/glassworks/explorer/#/Drawing/getModificationStatus">Drawings/getModificationStatus</a> call. Replace <code>{mrid}</code> with the <code>id</code> from the last step, and replace <code>CREDENTIALS</code> with your credentials. Poll the modification status until the response returns <code>&quot;requestState&quot;: &quot;DONE&quot;</code>. -<pre tabindex="0"><code>curl -X &#39;GET \ -&#39;https://cad.onshape.doc/api/v6/drawings/modify/status/{mrid}&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; \ --H &#39;Accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Content-Type: application/json;charset=UTF-8; qs=0.09&#39; \ -</code></pre></li> -<li>Open your drawing and confirm that you see the new inspection symbol.</li> -</ol> -<h3 id="add-a-table-to-a-drawing">Add a table to a drawing</h3> -<ol> -<li>Open an existing (or create a new) Onshape document with a drawing.</li> -<li>Start to form the <a href="https://cad.onshape.com/glassworks/explorer/#/Drawing/modifyDrawing">Drawings/modifyDrawing</a> call. Replace the URL parameters with the values from your document, and replace <code>CREDENTIALS</code> with your authorization credentials. -<pre tabindex="0"><code>curl -X &#39;POST \ -&#39;https://cad.onshape.doc/api/v6/drawings/d/{did}/w/{wid}/e/{eid}/modify&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; \s --H &#39;Accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Content-Type: application/json;charset=UTF-8; qs=0.09&#39; \ -</code></pre></li> -<li>Add information about the modification. In this example, we&rsquo;ll add an <code>Onshape::Table::GeneralTable</code> to the drawing. We must specify the <code>messageName</code> and <code>formatVersion</code> for the modification, and then provide the location, number of rows, and number of columns for the table. (Hint: you can <a href="https://onshape-public.github.io/docs/api-adv/translation/#export-a-drawing-as-a-json">Export a Drawing to JSON</a> to get a list of valid coordinates.) -<pre tabindex="0"><code>curl -X &#39;POST \ -&#39;https://cad.onshape.doc/api/v6/drawings/d/{did}/w/{wid}/e/{eid}/modify&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; \ --H &#39;Accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Content-Type: application/json;charset=UTF-8; qs=0.09&#39; \ --d &#39;{ -&#34;description&#34;: &#34;New table&#34;, -&#34;jsonRequests&#34;: [ { -&#34;formatVersion&#34;: &#34;2021-01-01&#34;, -&#34;messageName&#34;: &#34;onshapeCreateAnnotations&#34;, -&#34;annotations&#34;: [ -{ &#34;table&#34;: { -&#34;cells&#34;: [ -{ -&#34;column&#34;: 0, -&#34;content&#34;: &#34;1.1&#34;, -&#34;row&#34;: 0 -}, -{ -&#34;column&#34;: 0, -&#34;content&#34;: &#34;2.1&#34;, -&#34;row&#34;: 1 -}, -{ -&#34;column&#34;: 1, -&#34;content&#34;: &#34;1.2&#34;, -&#34;row&#34;: 0 -}, -{ -&#34;column&#34;: 1, -&#34;content&#34;: &#34;2.2&#34;, -&#34;row&#34;: 1 -} -], -&#34;columns&#34;: 2, -&#34;rows&#34;: 2, -&#34;showHeaderRow&#34;: false, -&#34;showTitleRow&#34;: false, -&#34;position&#34;: { -&#34;coordinate&#34;: [100.0, 400.0, 0.0], -&#34;type&#34;: &#34;Onshape::Reference::Point&#34; -} -}, -&#34;type&#34;: &#34;Onshape::Table::GeneralTable&#34; -}] -}] -}&#39; -</code></pre></li> -<li>Make the call, and then get <code>id</code> from the response body. You&rsquo;ll need this to poll the modification status to figure out when the modification has completed.</li> -<li>Set up the <a href="https://cad.onshape.com/glassworks/explorer/#/Drawing/getModificationStatus">Drawings/getModificationStatus</a> call. Replace <code>{mrid}</code> with the <code>id</code> from the last step, and replace <code>CREDENTIALS</code> with your credentials. Poll the modification status until the response returns <code>&quot;requestState&quot;: &quot;DONE&quot;</code>. -<pre tabindex="0"><code>curl -X &#39;GET \ -&#39;https://cad.onshape.doc/api/v6/drawings/modify/status/{mrid}&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; \ --H &#39;Accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Content-Type: application/json;charset=UTF-8; qs=0.09&#39; \ -</code></pre></li> -<li>Open your drawing and confirm that you see the new table.</li> -</ol> -<h3 id="specify-a-snap-point">Specify a snap point</h3> -<p>You can use the <a href="https://cad.onshape.com/glassworks/explorer/#/Drawing/modifyDrawing">Drawings/modifyDrawing</a> to choose the snap points for annotations. Available types of snap points are:</p> -<pre tabindex="0"><code> ModeApint // Apparent intersection -ModeCenter // Center point -ModeEnd // End point -ModeIns // Insertion point -ModeIntersec // Intersection -ModeMid // Midpoint -ModeNear // Nearest point -ModeNode // Node -ModePar // Parallel -ModePerp // Perpendicular -ModeQuad // Quadrant -ModeStart // Start point -ModeTan // Tangent point -</code></pre><ol> -<li>Create a sketch in Onshape with two circles, then extrude both circles.</li> -<li>Create a drawing of the part&rsquo;s front view. We&rsquo;ll use the Drawings API to a point to point centerline snapped to the centers of the holes. -</br><img src="https://onshape-public.github.io/images/drawings-snap-before-01.png" alt="drawing front view of a box with two holes" width=350></li> -<li>Next, we&rsquo;ll need to get the view ID of the drawing. Call the <a href="https://cad.onshape.com/glassworks/explorer/#/Drawing/getDrawingViews_1">Drawing/getDrawingViews_1</a> endpoint on your document to get a list of all views in the drawing, and copy the <code>viewId</code> from the response:</li> -</ol> -<pre tabindex="0"><code>curl -X &#39;GET&#39; \ -&#39;https://cad.onshape.com/api/v8/drawings/d/{did}/w/{wid}/e/{eid}/views&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; \s --H &#39;accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Content-Type: application/json;charset=UTF-8; qs=0.09&#39; -</code></pre><ol start="4"> -<li>Use the <code>viewId</code> from the last step to get the <code>uniqueId</code> (or <code>edgeId</code>) of each circle&rsquo;s center from the <a href="https://cad.onshape.com/glassworks/explorer/#/Drawing/getDrawingViewJsonGeometry_1">Drawing/getDrawingViewJsonGeometry_1)</a> endpoint:</li> -</ol> -<pre tabindex="0"><code>curl -X &#39;GET&#39; \ -&#39;https://cad.onshape.com/api/v8/drawings/d/{did}/w/{wid}/e/{eid}/views/{viewId}/jsongeometry&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; \s --H &#39;accept: application/json;charset=UTF-8; qs=0.09&#39; \ -</code></pre><ol start="5"> -<li>Start to form the <a href="https://cad.onshape.com/glassworks/explorer/#/Drawing/modifyDrawing">Drawings/modifyDrawing</a> call. Replace the URL parameters with the values from your document, and replace <code>CREDENTIALS</code> with your authorization credentials. -<pre tabindex="0"><code></code></pre></li> -<li>Add information about the modification. In this example, we&rsquo;ll add a <code>pointToPointCenterline</code> to the drawing. Make sure to update the request body values as followis:</li> -</ol> -<ul> -<li><code>messageName</code>: <code>&quot;onshapeCreateAnnotation&quot;</code></li> -<li><code>formatVersion</code>: <code>&quot;2021-01-01&quot;</code></li> -<li><code>uniqueId</code>: From Step 4</li> -<li><code>viewId</code>: From Step 3</li> -<li><code>coordinates</code>: The values must be sent as part of the request, but are ignored. -<pre tabindex="0"><code> curl -X &#39;POST \ -&#39;https://cad.onshape.doc/api/v8/drawings/d/{did}/w/{wid}/e/{eid}/modify&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; \s --H &#39;Accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Content-Type: application/json;charset=UTF-8; qs=0.09&#39; \ --d { -&#34;description&#34;: &#34;creating a snap point&#34;, -&#34;jsonRequests&#34;: [ { -&#34;messageName&#34;: &#34;onshapeCreateAnnotations&#34;, -&#34;formatVersion&#34;: &#34;2021-01-01&#34;, -&#34;annotations&#34;: [ -{ -&#34;pointToPointCenterline&#34;: { -&#34;point1&#34;: { -&#34;coordinate&#34;: [0,0,0], -&#34;type&#34;: &#34;Onshape::Reference::Point&#34;, -&#34;uniqueId&#34;: &#34;{uniqueId1}&#34;, -&#34;viewId&#34;: &#34;{viewId}&#34;, -&#34;snapPointType&#34;: &#34;ModeCenter&#34; -}, -&#34;point2&#34;: { -&#34;coordinate&#34;: [0,0,0], -&#34;type&#34;: &#34;Onshape::Reference::Point&#34;, -&#34;uniqueId&#34;: &#34;{uniqueId2}&#34;, -&#34;viewId&#34;: &#34;{viewId}&#34;, -&#34;snapPointType&#34;: &#34;ModeCenter&#34; -} -}, -&#34;type&#34;: &#34;Onshape::Centerline::PointToPoint&#34; -} -] -}] -} -</code></pre></li> -</ul> -<ol start="7"> -<li>Return to your document and see that the centerline has been added to the document at the snap points. -</br><img src="https://onshape-public.github.io/images/drawings-snap-after-01.png" alt="drawing front view of a box with two holes with a centerline between the hole centers" width=350></li> -</ol> -<h2 id="additional-resources">Additional Resources</h2> -<ul> -<li><a href="https://onshape-public.github.io/docs/api-intro//#onshape-api-request">Guide to Onshape APIs</a></li> -<li><a href="https://onshape-public.github.io/docs/api-intro/explorer">Guide to the API Explorer</a></li> -<li><a href="https://cad.onshape.com/glassworks/explorer/#/Drawing">API Explorer: Drawings</a></li> -<li><a href="https://cad.onshape.com/help/Content/drawings.htm">Onshape Help: Drawings</a></li> -</ul>Docs: Featureshttps://onshape-public.github.io/docs/api-adv/featureaccess/Mon, 18 May 2020 20:37:28 -0400https://onshape-public.github.io/docs/api-adv/featureaccess/ -<p>This page describes the APIs Onshape provides for creating and manipulating features and the Feature List in a Part Studio.</p> -<blockquote> -<p>📘 <strong>Notes</strong></p> -<ul> -<li>This page provides sample code as curls. See the <a href="https://curl.se/docs/">curl documentation</a> for more information.</li> -<li>All Onshape API calls must be properly authenticated by replacing the <code>CREDENTIALS</code> variable in the curls below. See the <a href="https://onshape-public.github.io/docs/auth/apikeys">API Keys</a> page for instructions and the <a href="https://onshape-public.github.io/docs/api-intro/quickstart">Quick Start</a> for an example. All applications submitted to the Onshape App Store <em>must</em> authenticate with <a href="https://onshape-public.github.io/docs/auth/oauth">OAuth2</a>.</li> -<li>This documentation refers to Onshape IDs in the following format: <code>{did}, {wid}, {vid}, {mid}, {eid}, {pid}, {otherId}</code>. These represent document, workspace, version, microversion, element, part, and other IDs (respectively) that are needed make the API calls. We sometimes abbreviate these variables as <code>DWVEM</code> Please see <a href="https://onshape-public.github.io/docs/api-intro/#onshape-api-request">API Guide: API Intro</a> for information on what these IDs mean and how to obtain them from your documents. Never include the curly braces (<code>{}</code>) in your API calls.</li> -<li>For Enterprise accounts, replace <strong>cad</strong> in all Onshape URLs with your company domain. -https://<strong>cad</strong>.onshape.com &gt; https://<strong>companyName</strong>.onshape.com</li> -</ul> -</blockquote> -<h2 id="featurescript-vs-rest-api">FeatureScript vs REST API</h2> -<p>When working with complex geometry, you might find working directly in FeatureScript easier than working with the Onshape REST API. <a href="https://cad.onshape.com/FsDoc/">Click here to see the FeatureScript documentation.</a></p> -<h2 id="endpoints">Endpoints</h2> -<p>The following endpoints are available for working with features and the Feature List:</p> -<ul> -<li><a href="https://cad.onshape.com/glassworks/explorer/#/PartStudio/getPartStudioFeatures">Get the Feature List</a> -<pre tabindex="0"><code>curl -X &#39;GET&#39; \ -&#39;https://cad.onshape.com/api/v8/partstudios/d/{did}/{wvm}/{wvmid}/e/{eid}/features?rollbackBarIndex=-1&amp;includeGeometryIds=true&amp;noSketchGeometry=false&#39; \ --H &#39;accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; -</code></pre></li> -<li><a href="https://cad.onshape.com/glassworks/explorer/#/PartStudio/addPartStudioFeature">Add a Feature</a> -<pre tabindex="0"><code>curl -X &#39;POST&#39; \ -&#39;https://cad.onshape.com/api/v8/partstudios/d/{did}/{wvm}/{wvmid}/e/{wid}/features&#39; \ --H &#39;accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; \ --H &#39;Content-Type: application/json;charset=UTF-8; qs=0.09&#39; \ --d &#39;{ -&#34;btType&#34;: &#34;BTFeatureDefinitionCall-1406&#34;, -&#34;feature&#34;: { -&#34;btType&#34;: &#34;BTMFeature-134&#34;, -&#34;featureType&#34;: &#34;&#34;, -&#34;name&#34;: &#34;&#34;, -&#34;parameters&#34;: [] -} -}&#39; -</code></pre></li> -<li><a href="https://cad.onshape.com/glassworks/explorer/#/PartStudio/updatePartStudioFeature">Update a Feature</a> -<pre tabindex="0"><code> curl -X &#39;POST&#39; \ -&#39;https://cad.onshape.com/api/v8/partstudios/d/{did}/w/{wid}/e/{eid}/features/featureid/{fid}&#39; \ --H &#39;Accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; \ --H &#39;Content-Type: application/json;charset=UTF-8; qs=0.09&#39; \ --d &#39;{ -&#34;btType&#34;: &#34;BTFeatureDefinitionCall-1406&#34;, -&#34;feature&#34;: { -&#34;btType&#34;: &#34;BTMFeature-134&#34;, -&#34;featureId&#34;: &#34;{fid}&#34;, -&#34;parameters&#34;: [] -} -}&#39; -</code></pre></li> -<li><a href="https://cad.onshape.com/glassworks/explorer/#/PartStudio/updateFeatures">Update Multiple Features</a> -<pre tabindex="0"><code> curl -X &#39;POST&#39; \ -&#39;https://cad.onshape.com/api/v8/partstudios/d/{did}/w/{wid}/e/{eid}/features/updates&#39; \ --H &#39;Accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; \ --H &#39;Content-Type: application/json;charset=UTF-8; qs=0.09&#39; \ --d &#39;{ -&#34;btType&#34;: &#34;BTUpdateFeaturesCall-1748&#34;, -&#34;features&#34;: [ -{ -&#34;btType&#34;: &#34;BTMFeature-134&#34;, -&#34;featureId&#34;: &#34;{fid1}&#34;, -&#34;parameters&#34;: [] -}, -{ -&#34;btType&#34;: &#34;BTMFeature-134&#34;, -&#34;featureId&#34;: &#34;{fid2}&#34;, -&#34;parameters&#34;: [] -} -] -}&#39; -</code></pre></li> -<li><a href="https://cad.onshape.com/glassworks/explorer/#/PartStudio/deletePartStudioFeature">Delete a Feature</a> -<pre tabindex="0"><code>curl -X &#39;DELETE&#39; \ -&#39;https://cad.onshape.com/api/v8/partstudios/d/{did}/{wvm}/{wvmid}/e/{eid}/features/featureid/{fid}&#39; \ --H &#39;accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; -</code></pre></li> -</ul> -<h3 id="json-encoding">JSON encoding</h3> -<p>Instead of providing a translation layer between a feature&rsquo;s internal and external formats, these APIs present the internal format of the feature definitions to the user. The best way to familiarize yourself with the formats involved is by calling the <a href="https://cad.onshape.com/glassworks/explorer/#/PartStudio/getPartStudioFeatures">Get the Feature List</a> endpoint on existing Part Studios.</p> -<blockquote> -<p>📘 <strong>Notes</strong></p> -<ul> -<li>Onshape REST API parameters may change at any time. The documentation on this page is accurate for v8 of the Onshape API. The quickest way to verify what parameters are needed for a call is to create the sketch/feature in the Onshape UI, then call the <a href="https://cad.onshape.com/glassworks/explorer/#/PartStudio/getPartStudioFeatures">Get the Feature List</a> API and see what parameters are returned for the feature.</li> -</ul> -</blockquote> -<blockquote> -<p>📘 <strong>Notes</strong></p> -<ul> -<li>Default values are sometimes omitted in the encoded output. These defaults are: -<ul> -<li>String: <code>&quot;&quot;</code></li> -<li>Boolean: <code>false</code></li> -<li>Numeric: <code>0</code></li> -</ul> -</li> -<li>The JSON encoding uses a special tagging system to manage polymorphic data structures. Objects are generally by enclosing them within another object that declares the type information for the enclosed object.</li> -</ul> -</blockquote> -<h3 id="feature-types">Feature types</h3> -<p>Below, find the available types for working with features in the API.</p> -<ul> -<li><code>BTMFeature-134</code> - General feature type</li> -<li><code>BTMSketch-151</code> - Feature type for sketches</li> -</ul> -<h3 id="parameter-types">Parameter types</h3> -<p>All parameters have the following fields in common:</p> -<ul> -<li><code>parameterId</code> - Unique ID of the parameter</li> -<li><code>nodeId</code> - Unique ID of the parameter node</li> -</ul> -<p>The parameter types available for use in the API are:</p> -<ul> -<li><code>BTMParameterQuantity-147</code> -<ul> -<li><code>expression</code> - Define the value for the parameter</li> -</ul> -</li> -<li><code>BTMParameterQueryList-148 </code> - defined by one of the following: -<ul> -<li><code>SBTMIndividualQuery-138</code> -<ul> -<li><code>geometryIds</code> - List of geometry IDs the feature applies to</li> -</ul> -</li> -<li><code>SBTMIndividualSketchRegionQuery-140</code> -<ul> -<li><code>featureId</code> - Feature ID of the sketch for which to include all regions</li> -</ul> -</li> -</ul> -</li> -<li><code>BTMParameterBoolean-144</code> -<ul> -<li><code>value</code> - <code>true | false</code></li> -</ul> -</li> -<li><code>BTMParameterEnum-145</code> -<ul> -<li><code>enumName</code> - Name of the enum type that the value is a member of</li> -<li><code>value</code> - The enum member</li> -</ul> -</li> -</ul> -<h3 id="sketch-plane-ids">Sketch plane IDs</h3> -<p>The following string can be sent along with the <a href="https://cad.onshape.com/glassworks/explorer/#/PartStudio/evalFeatureScript">PartStudios/featurescript</a> API to get the plane ID. You can then use that ID to specify the plane on which to create a sketch.</p> -<pre tabindex="0"><code>function(context is Context, queries) { -return transientQueriesToStrings(evaluateQuery(context, qCreatedBy(makeId(\&#34;{planeName}\&#34;), EntityType.FACE))); -} -</code></pre><p>For example, to get the ID of the Top plane, you would make the following call:</p> -<pre tabindex="0"><code>curl -X &#39;POST&#39; \ -&#39;https://cad.onshape.com/api/v8/partstudios/d/{did}/w/{wid}/e/{eid}/featurescript?rollbackBarIndex=-1&#39; \ --H &#39;Accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; \ --H &#39;Content-Type: application/json;charset=UTF-8; qs=0.09&#39; \ --d &#39;{ -&#34;script&#34;: &#34;function(context is Context, queries) { return transientQueriesToStrings(evaluateQuery(context, qCreatedBy(makeId(\&#34;Top\&#34;), EntityType.FACE))); }&#34; -}&#39; -</code></pre><h2 id="sample-workflows">Sample Workflows</h2> -<p>Below are several examples of how the API can be used in order to help you get started. The calls could be executed using your preferred software environment but interactive use in a REST-aware tool is likely the easiest way to try the examples.</p> -<h3 id="get-the-list-of-features-in-a-part-studio">Get the list of features in a Part Studio</h3> -<p>One of the best ways to familiarize yourself with the Onshape Feature APIs is to view the API details for existing features in a Part Studio. In this example, we&rsquo;ll add three features to a Part Studio, and then call the <a href="https://cad.onshape.com/glassworks/explorer/#/PartStudio/getPartStudioFeatures">PartStudio/getPartStudioFeatures</a> API on the Part Studio. We&rsquo;ll then be able to view the structure of the way features are represented in the API.</p> -<ol> -<li>Create a new document or open an existing one.</li> -<li>Create a new sketch in the document, and draw a long rectangle.</li> -<li>Extrude the rectangle.</li> -<li>Add a fillet to one edge of the part.</li> -<li>Call the <a href="https://cad.onshape.com/glassworks/explorer/#/PartStudio/getPartStudioFeatures">PartStudio/getPartStudioFeatures</a> API. Replace the URL parameters with the values from your document, and replace <code>CREDENTIALS</code> with your authorization credentials. -<pre tabindex="0"><code>curl -X &#39;GET \ -&#39;https://cad.onshape.com/api/v8/partstudios/d/{did}/{wvm}/{wvmid}/e/{eid}/features?rollbackBarIndex=-1&amp;includeGeometryIds=true&amp;noSketchGeometry=false&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; \ --H &#39;Accept: application/json;charset=UTF-8; qs=0.09&#39; -</code></pre></li> -<li>Review the JSON returned in the response body. A lot of information is returned, but it will look something like the truncated snippet below. Notice that there are objects returned for each feature in the Part Studio&ndash; the sketch, the extrude, the fillet, and the chamfer. Each default plane and the origin in the Part Studio also appear in the <code>defaultFeatures</code> object. The Standard Geometry library is listed as an import, and the response also includes the state of each feature. : -<pre tabindex="0"><code>{ -&#34;btType&#34;: &#34;BTFeatureListResponse-2457&#34;, -&#34;isComplete&#34;: true, -&#34;serializationVersion&#34;: &#34;1.2.4&#34;, -&#34;rollbackIndex&#34;: 4, -&#34;features&#34;: [ -{ -&#34;btType&#34;: &#34;BTMSketch-151&#34;, -&#34;entities&#34;: [...], -&#34;constraints&#34;: [...], -&#34;name&#34;: &#34;Sketch 1&#34;, -&#34;suppressed&#34;: false, -&#34;parameters&#34;: [...], -&#34;featureId&#34;: &#34;{fid1}&#34;, -&#34;featureType&#34;: &#34;newSketch&#34;, -&#34;subFeatures&#34;: [...], -&#34;returnAfterSubfeatures&#34;: false -}, -{ -&#34;btType&#34;: &#34;BTMFeature-134&#34;, -&#34;name&#34;: &#34;Extrude 1&#34;, -&#34;suppressed&#34;: false, -&#34;parameters&#34;: [...] -&#34;featureId&#34;: &#34;{fid2}&#34;, -&#34;featureType&#34;: &#34;extrude&#34;, -&#34;subFeatures&#34;: [], -&#34;returnAfterSubfeatures&#34;: false -}, -{ -&#34;btType&#34;: &#34;BTMFeature-134&#34;, -&#34;name&#34;: &#34;Fillet 1&#34;, -&#34;suppressed&#34;: false, -&#34;parameters&#34;: [...], -&#34;featureId&#34;: &#34;{fid3}&#34;, -&#34;featureType&#34;: &#34;fillet&#34;, -&#34;subFeatures&#34;: [...], -&#34;returnAfterSubfeatures&#34;: false -}, -{ -&#34;btType&#34;: &#34;BTMFeature-134&#34;, -&#34;name&#34;: &#34;Chamfer 1&#34;, -&#34;suppressed&#34;: false, -&#34;parameters&#34;: [...], -&#34;featureId&#34;: &#34;{fid4}&#34;, -} -], -&#34;featureStates&#34;: { -&#34;{fid1}&#34;: { -&#34;btType&#34;: &#34;BTFeatureState-1688&#34;, -&#34;featureStatus&#34;: &#34;OK&#34;, -&#34;inactive&#34;: false -}, -... -}, -&#34;defaultFeatures&#34;: [ -{ -&#34;btType&#34;: &#34;BTMFeature-134&#34;, -&#34;name&#34;: &#34;Origin&#34;, -}, -{ -&#34;btType&#34;: &#34;BTMFeature-134&#34;, -&#34;name&#34;: &#34;Top&#34;, -}, -{ -&#34;btType&#34;: &#34;BTMFeature-134&#34;, -&#34;name&#34;: &#34;Front&#34;, -}, -{ -&#34;btType&#34;: &#34;BTMFeature-134&#34;, -&#34;name&#34;: &#34;Right&#34;, -} -], -&#34;imports&#34;: [ -{ -&#34;btType&#34;: &#34;BTMImport-136&#34;, -&#34;path&#34;: &#34;onshape/std/geometry.fs&#34;, -&#34;version&#34;: &#34;2232.0&#34; -} -], -&#34;libraryVersion&#34;: 2232 -} -</code></pre></li> -</ol> -<h3 id="create-a-cube-feature">Create a cube feature</h3> -<p>In this example we will create a cube using the <code>cube</code> feature. The feature accepts a single parameter (the length of a side) and creates a cube with a corner at the origin and aligned with the three default planes.</p> -<ol> -<li>Create a new document or open an existing one. We&rsquo;ll create the cube feature in this document.</li> -<li>Begin to create the <a href="https://cad.onshape.com/glassworks/explorer/#/PartStudio/addPartStudioFeature">PartStudio/addPartStudioFeature</a> call. Replace the URL parameters with the values from your document, and replace <code>CREDENTIALS</code> with your authorization credentials. This is a call to the same endpoint as in the previous example, but is a <code>POST</code> instead of a <code>GET</code>. -<pre tabindex="0"><code>curl -X &#39;POST \ -&#39;https://cad.onshape.com/api/v8/partstudios/d/{did}/{wvm}/{wvmid}/e/{eid}/features&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; \ --H &#39;Accept: application/json;charset=UTF-8; qs=0.09&#39;\ --H &#39;Content-Type: application/json;charset=UTF-8; qs=0.09&#39; \ --d &#39;{ -&lt;JSON of feature data&gt; -}&#39; -</code></pre></li> -<li>Add the following as the JSON body. -<ul> -<li>Note the <code>btType</code> defines this as a Feature.</li> -<li>We&rsquo;ve named the feature <code>cube</code> and inserted an instance of the feature named <code>Cube 1</code> into the Part Studio.</li> -<li>The <code>cube</code> feature has one parameter&ndash; the cube <code>sideLength</code> in inches, which is set to 1 by default.</li> -</ul> -<pre tabindex="0"><code>{ -&#34;btType&#34;: &#34;BTFeatureDefinitionCall-1406&#34;, -&#34;feature&#34;: { -&#34;btType&#34;: &#34;BTMFeature-134&#34;, -&#34;featureType&#34;: &#34;cube&#34;, -&#34;name&#34;: &#34;Cube 1&#34;, -&#34;parameters&#34;: [ -{ -&#34;btType&#34;: &#34;BTMParameterQuantity-147&#34;, -&#34;isInteger&#34;: false, -&#34;expression&#34;: &#34;1 in&#34;, -&#34;parameterId&#34;: &#34;sideLength&#34; -} -], -&#34;returnAfterSubfeatures&#34;: false, -&#34;suppressed&#34;: false -} -} -</code></pre></li> -<li>Confirm your call matches the following, and then make the call: -<pre tabindex="0"><code>curl -X &#39;POST \ -&#39;https://cad.onshape.com/api/v8/partstudios/d/{did}/{wvm}/{wvmid}/e/{eid}/features&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; \ --H &#39;Accept: application/json;charset=UTF-8; qs=0.09&#39;\ --H &#39;Content-Type: application/json;charset=UTF-8; qs=0.09&#39; \ --d &#39;{ -&#34;btType&#34;: &#34;BTFeatureDefinitionCall-1406&#34;, -&#34;feature&#34;: { -&#34;btType&#34;: &#34;BTMFeature-134&#34;, -&#34;featureType&#34;: &#34;cube&#34;, -&#34;name&#34;: &#34;Cube 1&#34;, -&#34;parameters&#34;: [ -{ -&#34;btType&#34;: &#34;BTMParameterQuantity-147&#34;, -&#34;isInteger&#34;: false, -&#34;expression&#34;: &#34;1 in&#34;, -&#34;parameterId&#34;: &#34;sideLength&#34; -} -], -&#34;returnAfterSubfeatures&#34;: false, -&#34;suppressed&#34;: false -} -}&#39; -</code></pre></li> -<li>Return to your console to review the endpoint response. The output returns: -<ul> -<li>The feature definition that we provided as input with <code>nodeId</code>s and a <code>featureId</code>. Make a note of the <code>featureId</code>; we&rsquo;ll use it in the next example.</li> -<li>Information that the feature executed correctly</li> -<li>The serialization version and microversion of the document that resulted from the feature addition</li> -</ul> -<pre tabindex="0"><code> { -&#34;btType&#34;: &#34;BTFeatureDefinitionResponse-1617&#34;, -&#34;featureState&#34;: { -&#34;btType&#34;: &#34;BTFeatureState-1688&#34;, -&#34;featureStatus&#34;: &#34;OK&#34;, -&#34;inactive&#34;: false -}, -&#34;feature&#34;: { -&#34;btType&#34;: &#34;BTMFeature-134&#34;, -&#34;name&#34;: &#34;Cube 1&#34;, -&#34;suppressed&#34;: false, -&#34;parameters&#34;: [ -{ -&#34;btType&#34;: &#34;BTMParameterQuantity-147&#34;, -&#34;value&#34;: 0, -&#34;units&#34;: &#34;&#34;, -&#34;isInteger&#34;: false, -&#34;expression&#34;: &#34;1 in&#34;, -&#34;nodeId&#34;: &#34;{nid1}&#34;, -&#34;parameterId&#34;: &#34;sideLength&#34; -} -], -&#34;featureId&#34;: &#34;{fid}&#34;, -&#34;nodeId&#34;: &#34;{nid2}&#34;, -&#34;featureType&#34;: &#34;cube&#34;, -&#34;returnAfterSubfeatures&#34;: false, -&#34;subFeatures&#34;: [], -&#34;namespace&#34;: &#34;&#34; -}, -&#34;serializationVersion&#34;: &#34;1.2.4&#34;, -&#34;sourceMicroversion&#34;: &#34;{mid}&#34;, -&#34;microversionSkew&#34;: false, -&#34;rejectMicroversionSkew&#34;: false, -&#34;libraryVersion&#34;: 0 -} -</code></pre></li> -<li>Open your document and confirm that the cube has been inserted into the Part Studio. -</br><img src="https://onshape-public.github.io/images/features-cube-example.png" alt="cube added to part studio via features api" width=550></li> -<li>Double-click <code>Cube 1</code> in the Feature List to open the Cube 1 dialog. Change the sideLength to 3 and click the checkbox. Note that the size of the cube changes automatically. -</br><img src="https://onshape-public.github.io/images/features-cube-example-02.png" alt="cube parameter updated to 3 inches" width=550></li> -</ol> -<h3 id="create-a-sketch">Create a sketch</h3> -<p>In this example, we&rsquo;ll create a circular sketch feature with the following properties:</p> -<ul> -<li>While other features use a <code>btType</code> of <code>BTMFeature-141</code>, sketches have their own special type: <code>BTMSketch-151</code></li> -<li>Sketches must use the <code>newSketch</code> featureType</li> -<li>Sketch plane ID: Front</li> -<li>Radius: 0.025 inches</li> -<li>Location: (0.05, 0.05)</li> -</ul> -<ol> -<li>Open a new PartStudio. Note the following: -<ul> -<li>Document ID</li> -<li>Workspace ID</li> -<li>Element ID (of the Part Studio tab)</li> -</ul> -</li> -<li>We want to create the circle on the Front plane, so we&rsquo;ll call the <a href="https://cad.onshape.com/glassworks/explorer/#/PartStudio/evalFeatureScript">PartStudios/featurescript</a> endpoint to get its ID: -<pre tabindex="0"><code>curl -X &#39;POST&#39; \ -&#39;https://cad.onshape.com/api/v8/partstudios/d/{did}/w/{wid}/e/{eid}/featurescript?rollbackBarIndex=-1&#39; \ --H &#39;Accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; \ --H &#39;Content-Type: application/json;charset=UTF-8; qs=0.09&#39; \ --d &#39;{ -&#34;script&#34;: &#34;function(context is Context, queries) { return transientQueriesToStrings(evaluateQuery(context, qCreatedBy(makeId(\&#34;Front\&#34;), EntityType.FACE))); }&#34; -}&#39; -</code></pre>The call returns the following, identifying the plane as <code>JCC</code>. -<pre tabindex="0"><code>{ -&#34;btType&#34;: &#34;BTFeatureScriptEvalResponse-1859&#34;, -&#34;result&#34;: { -&#34;btType&#34;: &#34;com.belmonttech.serialize.fsvalue.BTFSValueArray&#34;, -&#34;value&#34;: [ -{ -&#34;btType&#34;: &#34;com.belmonttech.serialize.fsvalue.BTFSValueString&#34;, -&#34;value&#34;: &#34;JCC&#34;, -&#34;typeTag&#34;: &#34;&#34; -} -], -&#34;typeTag&#34;: &#34;&#34; -} -} -</code></pre></li> -<li>Now we&rsquo;ll create the JSON structure for our sketch. <em>All sketches must be created with the <code>BTMSketch-151</code> btType and the <code>newSketch</code> featureType.</em> Note how we&rsquo;ve specified the plane to use in the <code>sketchPlane</code> parameter, and the <code>geometry</code> details. -<pre tabindex="0"><code>{ -&#34;feature&#34; : { -&#34;btType&#34;: &#34;BTMSketch-151&#34;, -&#34;featureType&#34;: &#34;newSketch&#34;, -&#34;name&#34;: &#34;Sketch 1&#34;, -&#34;parameters&#34;: [ -{ -&#34;btType&#34;: &#34;BTMParameterQueryList-148&#34;, -&#34;queries&#34;: [ -{ -&#34;btType&#34;: &#34;BTMIndividualQuery-138&#34;, -&#34;deterministicIds&#34;: [ &#34;JCC&#34; ] -} -], -&#34;parameterId&#34;: &#34;sketchPlane&#34; -} -], -&#34;entities&#34;: [ -{ -&#34;btType&#34;: &#34;BTMSketchCurve-4&#34;, -&#34;geometry&#34;: { -&#34;btType&#34;: &#34;BTCurveGeometryCircle-115&#34;, -&#34;radius&#34;: 0.025, -&#34;xcenter&#34;: 0.05, -&#34;ycenter&#34;: 0.05, -&#34;xdir&#34;: 1, -&#34;ydir&#34;: 0, -&#34;clockwise&#34;: false -}, -&#34;centerId&#34;: &#34;circle-entity.center&#34;, -&#34;entityId&#34;: &#34;circle-entity&#34; -} -], -&#34;constraints&#34;: [ -] -} -} -</code></pre></li> -<li>Now we&rsquo;ll add the JSON structure to the <a href="https://cad.onshape.com/glassworks/explorer/#/PartStudio/addPartStudioFeature">PartStudio/addPartStudioFeature</a> endpoint. Replace the URL parameters with the values from your document, and replace <code>CREDENTIALS</code> with your authorization credentials. -<pre tabindex="0"><code>curl -X &#39;POST&#39; \ -&#39;https://cad.onshape.com/api/v8/partstudios/d/{did}/{wvm}/{wvmid}/e/{wid}/features&#39; \ --H &#39;Accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; \ --H &#39;Content-Type: application/json;charset=UTF-8; qs=0.09&#39; \ --d &#39;{ -&#34;feature&#34; : { -&#34;btType&#34;: &#34;BTMSketch-151&#34;, -&#34;featureType&#34;: &#34;newSketch&#34;, -&#34;name&#34;: &#34;Sketch 1&#34;, -&#34;parameters&#34;: [ -{ -&#34;btType&#34;: &#34;BTMParameterQueryList-148&#34;, -&#34;queries&#34;: [ -{ -&#34;btType&#34;: &#34;BTMIndividualQuery-138&#34;, -&#34;deterministicIds&#34;: [ &#34;JCC&#34; ] -} -], -&#34;parameterId&#34;: &#34;sketchPlane&#34; -} -], -&#34;entities&#34;: [ -{ -&#34;btType&#34;: &#34;BTMSketchCurve-4&#34;, -&#34;geometry&#34;: { -&#34;btType&#34;: &#34;BTCurveGeometryCircle-115&#34;, -&#34;radius&#34;: 0.025, -&#34;xcenter&#34;: 0.05, -&#34;ycenter&#34;: 0.05, -&#34;xdir&#34;: 1, -&#34;ydir&#34;: 0, -&#34;clockwise&#34;: false -}, -&#34;centerId&#34;: &#34;circle-entity.center&#34;, -&#34;entityId&#34;: &#34;circle-entity&#34; -} -], -&#34;constraints&#34;: [ -] -} -}&#39; -</code></pre></li> -<li>Find the new sketch&rsquo;s <code>featureId</code> in the call response. You&rsquo;ll need this for the <a href="#create-a-cylinder">Create a cylinder</a> tutorial.</li> -<li>Open your Part Studio and confirm that the sketch has been added: -</br></br><img src="https://onshape-public.github.io/images/features-create-sketch.png" alt="circle sketch created via features api" width=550></li> -</ol> -<h3 id="create-a-cylinder">Create a cylinder</h3> -<p>In this tutorial, we&rsquo;ll extrude an sketch with the following properties: -</br></br><img src="https://onshape-public.github.io/images/features-extrude-dialog.png" alt="Extrude dialog in Onshape UI" width=350></p> -<ol> -<li>This tutorial expands on the <a href="#create-a-sketch">Create a sketch</a> tutorial. You&rsquo;ll need the following from the document containing your circular sketch: -<ul> -<li>Document ID</li> -<li>Workspace ID</li> -<li>Element ID of the tab containing the sketch</li> -<li>Feature ID of the sketch -<ul> -<li>If you need to get this <code>featureId</code> again, you can call the <a href="https://cad.onshape.com/glassworks/explorer/#/PartStudio/getPartStudioFeatures">getPartStudioFeatures</a> endpoint on the document.</li> -</ul> -</li> -</ul> -</li> -<li>Begin to create the <a href="https://cad.onshape.com/glassworks/explorer/#/PartStudio/addPartStudioFeature">PartStudio/addPartStudioFeature</a> call. Replace the URL parameters with the values from your document, and replace <code>CREDENTIALS</code> with your authorization credentials. -<pre tabindex="0"><code>curl -X &#39;POST \ -&#39;https://cad.onshape.com/api/v8/partstudios/d/{did}/{wvm}/{wvmid}/e/{eid}/features&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; \ --H &#39;Accept: application/json;charset=UTF-8; qs=0.09&#39;\ --H &#39;Content-Type: application/json;charset=UTF-8; qs=0.09&#39; \ --d &#39;{ -&lt;JSON of feature data&gt; -}&#39; -</code></pre></li> -<li>We&rsquo;ll start by initializing an extrude in the JSON with the <code>btType</code> and <code>featureType</code> shown below:</li> -</ol> -<pre tabindex="0"><code> { -&#34;btType&#34;: &#34;BTFeatureDefinitionCall-1406&#34;, -&#34;feature&#34;: -{ -&#34;btType&#34;: &#34;BTMFeature-134&#34;, -&#34;featureType&#34;: &#34;extrude&#34;, -&#34;name&#34;: &#34;Extrude 1&#34;, -&#34;suppressed&#34;: false, -&#34;parameters&#34;: [ -] -} -} -</code></pre><ol start="4"> -<li>Now, we&rsquo;ll add values for the options we want to our <code>parameters</code> block. Don&rsquo;t forget to replace <code>{featureId}</code> in the code below with the feature ID of the sketch.</li> -</ol> -<pre tabindex="0"><code> { -&#34;btType&#34;: &#34;BTMParameterEnum-145&#34;, -&#34;value&#34;: &#34;SOLID&#34;, -&#34;enumName&#34;: &#34;ExtendedToolBodyType&#34;, -&#34;parameterId&#34;: &#34;bodyType&#34; -}, -{ -&#34;btType&#34;: &#34;BTMParameterEnum-145&#34;, -&#34;value&#34;: &#34;NEW&#34;, -&#34;enumName&#34;: &#34;NewBodyOperationType&#34;, -&#34;parameterId&#34;: &#34;operationType&#34; -}, -{ -&#34;btType&#34;: &#34;BTMParameterQueryList-148&#34;, -&#34;queries&#34;: [ -{ -&#34;btType&#34;: &#34;BTMIndividualSketchRegionQuery-140&#34;, -&#34;featureId&#34;: &#34;{featureId}&#34; -} -], -&#34;parameterId&#34;: &#34;entities&#34; -}, -{ -&#34;btType&#34;: &#34;BTMParameterEnum-145&#34;, -&#34;value&#34;: &#34;BLIND&#34;, -&#34;enumName&#34;: &#34;BoundingType&#34;, -&#34;parameterId&#34;: &#34;endBound&#34; -}, -{ -&#34;btType&#34;: &#34;BTMParameterQuantity-147&#34;, -&#34;expression&#34;: &#34;1 in&#34;, -&#34;parameterId&#34;: &#34;depth&#34; -} -</code></pre><ol start="5"> -<li>Now our JSON is complete, and we can make our call.</li> -</ol> -<pre tabindex="0"><code> curl -X &#39;POST \ -&#39;https://cad.onshape.com/api/v8/partstudios/d/{did}/{wvm}/{wvmid}/e/{eid}/features&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; \ --H &#39;Accept: application/json;charset=UTF-8; qs=0.09&#39;\ --H &#39;Content-Type: application/json;charset=UTF-8; qs=0.09&#39; \ --d &#39;{ -&#34;btType&#34;: &#34;BTFeatureDefinitionCall-1406&#34;, -&#34;feature&#34;: { -&#34;btType&#34;: &#34;BTMFeature-134&#34;, -&#34;featureType&#34;: &#34;extrude&#34;, -&#34;name&#34;: &#34;Extrude 1&#34;, -&#34;parameters&#34;: [ -{ -&#34;btType&#34;: &#34;BTMParameterEnum-145&#34;, -&#34;value&#34;: &#34;SOLID&#34;, -&#34;enumName&#34;: &#34;ExtendedToolBodyType&#34;, -&#34;parameterId&#34;: &#34;bodyType&#34; -}, -{ -&#34;btType&#34;: &#34;BTMParameterEnum-145&#34;, -&#34;value&#34;: &#34;NEW&#34;, -&#34;enumName&#34;: &#34;NewBodyOperationType&#34;, -&#34;parameterId&#34;: &#34;operationType&#34; -}, -{ -&#34;btType&#34;: &#34;BTMParameterQueryList-148&#34;, -&#34;queries&#34;: [ -{ -&#34;btType&#34;: &#34;BTMIndividualSketchRegionQuery-140&#34;, -&#34;featureId&#34;: &#34;{featureId}&#34; -} -], -&#34;parameterId&#34;: &#34;entities&#34; -}, -{ -&#34;btType&#34;: &#34;BTMParameterEnum-145&#34;, -&#34;value&#34;: &#34;BLIND&#34;, -&#34;enumName&#34;: &#34;BoundingType&#34;, -&#34;parameterId&#34;: &#34;endBound&#34; -}, -{ -&#34;btType&#34;: &#34;BTMParameterQuantity-147&#34;, -&#34;expression&#34;: &#34;1 in&#34;, -&#34;parameterId&#34;: &#34;depth&#34; -} -], -&#34;returnAfterSubfeatures&#34;: false, -&#34;suppressed&#34;: false -} -}&#39; -</code></pre><ol start="6"> -<li>Open your document and confirm that the sketch has been extruded into a cylinder. -</br></br><img src="https://onshape-public.github.io/images/features-extrude-example.png" alt="circle sketch created via features api" width=550></li> -</ol> -<h3 id="update-a-feature">Update a feature</h3> -<p>In this example we&rsquo;ll update our cube feature.</p> -<ol> -<li>Open the document in which you created the cube feature in <a href="#create-a-cube-feature">this example</a>. You will need the following from this document: -<ul> -<li>Document ID</li> -<li>Workspace ID</li> -<li>Element ID (for the element that contains the cube feature)</li> -<li>Feature ID (ID of the cube feature, returned in the API response in the previous example) -<ul> -<li>If you need to get this <code>featureId</code> again, you can call the <a href="https://cad.onshape.com/glassworks/explorer/#/PartStudio/getPartStudioFeatures">getPartStudioFeatures</a> endpoint on the document.</li> -</ul> -</li> -</ul> -</li> -<li>Begin to create the <a href="https://cad.onshape.com/glassworks/explorer/#/PartStudio/updatePartStudioFeature">PartStudio/updatePartStudioFeature</a> call. Replace the URL parameters with the values from your document, and replace <code>CREDENTIALS</code> with your authorization credentials. -<pre tabindex="0"><code>curl -X &#39;POST&#39; \ -&#39;https://cad.onshape.com/api/v8/partstudios/d/{did}/w/{wid}/e/{eid}/features/featureid/{fid}&#39; \ --H &#39;Accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; \ --H &#39;Content-Type: application/json;charset=UTF-8; qs=0.09&#39; \ --d &#39;{ -&lt;JSON of feature data&gt; -}&#39; -</code></pre></li> -<li>Add the following as the JSON body. -<ul> -<li>Note the <code>btType</code> defines this as a Feature.</li> -<li>We specify the <code>featureId</code> again in the request body. This must match the <code>featureId</code> sent in the URL exactly.</li> -<li>We must also specify the feature&rsquo;s <code>featureType</code> and <code>name</code> in this call; if we don&rsquo;t send those fields, the call will attempt to change these values to empty strings, resulting in errors.</li> -<li>The <code>cube</code> feature has one parameter&ndash; the cube <code>sideLength</code> in inches, which we will update to 2 inches:</li> -</ul> -<pre tabindex="0"><code>{ -&#34;btType&#34;: &#34;BTFeatureDefinitionCall-1406&#34;, -&#34;feature&#34;: { -&#34;featureId&#34;: &#34;{fid}&#34;, -&#34;featureType&#34;: &#34;cube&#34;, -&#34;name&#34;: &#34;Cube 1&#34;, -&#34;parameters&#34;: [ -{ -&#34;btType&#34;: &#34;BTMParameterQuantity-147&#34;, -&#34;isInteger&#34;: false, -&#34;expression&#34;: &#34;2 in&#34;, -&#34;parameterId&#34;: &#34;sideLength&#34; -} -] -} -} -</code></pre></li> -<li>Confirm your call matches the following, and then make the call: -<pre tabindex="0"><code> curl -X &#39;POST&#39; \ -&#39;https://cad.onshape.com/api/v8/partstudios/d/{did}/w/{wid}/e/{eid}/features/featureid/{fid}&#39; \ --H &#39;Accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; \ --H &#39;Content-Type: application/json;charset=UTF-8; qs=0.09&#39; \ --d &#39;{ -&#34;btType&#34;: &#34;BTFeatureDefinitionCall-1406&#34;, -&#34;feature&#34;: { -&#34;featureId&#34;: &#34;{fid}&#34;, -&#34;featureType&#34;: &#34;cube&#34;, -&#34;name&#34;: &#34;Cube 1&#34;, -&#34;parameters&#34;: [ -{ -&#34;btType&#34;: &#34;BTMParameterQuantity-147&#34;, -&#34;isInteger&#34;: false, -&#34;expression&#34;: &#34;2 in&#34;, -&#34;parameterId&#34;: &#34;sideLength&#34; -} -] -} -}&#39; -</code></pre></li> -<li>Return to your console to review the endpoint response. The output returns: -<ul> -<li>The updated feature definition</li> -<li>Information that the feature executed correctly</li> -<li>The serialization version and microversion of the document that resulted from the feature update</li> -</ul> -<pre tabindex="0"><code> { -&#34;btType&#34;: &#34;BTFeatureDefinitionResponse-1617&#34;, -&#34;featureState&#34;: { -&#34;btType&#34;: &#34;BTFeatureState-1688&#34;, -&#34;featureStatus&#34;: &#34;OK&#34;, -&#34;inactive&#34;: false -}, -&#34;feature&#34;: { -&#34;btType&#34;: &#34;BTMFeature-134&#34;, -&#34;name&#34;: &#34;Cube 1&#34;, -&#34;suppressed&#34;: false, -&#34;parameters&#34;: [ -{ -&#34;btType&#34;: &#34;BTMParameterQuantity-147&#34;, -&#34;value&#34;: 0, -&#34;units&#34;: &#34;&#34;, -&#34;isInteger&#34;: false, -&#34;expression&#34;: &#34;2 in&#34;, -&#34;nodeId&#34;: &#34;{nid1}&#34;, -&#34;parameterId&#34;: &#34;sideLength&#34; -} -], -&#34;featureId&#34;: &#34;{fid}&#34;, -&#34;nodeId&#34;: &#34;{nid2}, -&#34;featureType&#34;: &#34;cube&#34;, -&#34;returnAfterSubfeatures&#34;: false, -&#34;subFeatures&#34;: [], -&#34;namespace&#34;: &#34;&#34; -}, -&#34;serializationVersion&#34;: &#34;1.2.4&#34;, -&#34;sourceMicroversion&#34;: &#34;{mid}&#34;, -&#34;microversionSkew&#34;: false, -&#34;rejectMicroversionSkew&#34;: false, -&#34;libraryVersion&#34;: 0 -} -</code></pre></li> -<li>Open your document and confirm that the cube has a side length of 2 inches. -</br><img src="https://onshape-public.github.io/images/features-cube-example-03.png" alt="cube added to part studio via features api" width=550></li> -</ol> -<h3 id="delete-a-feature">Delete a feature</h3> -<ol> -<li>Create a new document and add a cube feature to it. See <a href="#create-a-cube-feature">Create a cube feature</a> for instructions. Make a note of the following: -<ul> -<li>Document ID</li> -<li>Workspace ID</li> -<li>Element ID (for the element containing the cube feature)</li> -</ul> -</li> -<li>Call the <a href="https://cad.onshape.com/glassworks/explorer/#/PartStudio/getPartStudioFeatures">getPartStudioFeatures</a> endpoint on the document to get the <code>featureId</code> of the cube feature. See <a href="#get-the-list-of-features-in-a-part-studio">Get the Feature list</a> for instructions.</li> -<li>Create and execute the <a href="https://cad.onshape.com/glassworks/explorer/#/PartStudio/deletePartStudioFeature">PartStudio/deletePartStudioFeature</a> call. Replace the URL parameters with the values from your document, and replace <code>CREDENTIALS</code> with your authorization credentials. -<pre tabindex="0"><code>curl -X &#39;DELETE&#39; \ -&#39;https://cad.onshape.com/api/v8/partstudios/d/{did}/w/{wid}/e/{eid}/features/featureid/{fid}&#39; \ --H &#39;Accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; -</code></pre></li> -<li>Confirm that the cube feature has been removed from your document.</li> -</ol>Docs: Evaluating FeatureScripthttps://onshape-public.github.io/docs/api-adv/fs/Thu, 15 Aug 2024 00:00:00 +0000https://onshape-public.github.io/docs/api-adv/fs/ -<p>This page describes some of the APIs Onshape provides for evaluating <a href="https://cad.onshape.com/FsDoc/">FeatureScript</a>.</p> -<blockquote> -<p>📘 <strong>Notes</strong></p> -<ul> -<li>This page provides sample code as curls. See the <a href="https://curl.se/docs/">curl documentation</a> for more information.</li> -<li>All Onshape API calls must be properly authenticated by replacing the <code>CREDENTIALS</code> variable in the curls below. See the <a href="https://onshape-public.github.io/docs/auth/apikeys">API Keys</a> page for instructions and the <a href="https://onshape-public.github.io/docs/api-intro/quickstart">Quick Start</a> for an example. All applications submitted to the Onshape App Store <em>must</em> authenticate with <a href="https://onshape-public.github.io/docs/auth/oauth">OAuth2</a>.</li> -<li>This documentation refers to Onshape IDs in the following format: <code>{did}, {wid}, {eid}, {pid}, {otherId}</code>. These represent document, workspace, element, part, and other IDs (respectively) that are needed make the API calls. We sometimes abbreviate these variables as <code>DWVEM</code> Please see <a href="https://onshape-public.github.io/docs/api-intro/#onshape-api-request">API Guide: API Intro</a> for information on what these IDs mean and how to obtain them from your documents. Never include the curly braces (<code>{}</code>) in your API calls.</li> -<li>For Enterprise accounts, replace <strong><font color="slate">cad</font></strong> in all Onshape URLs with your company domain. -https://<font color="slate"><strong>cad</strong></font>.onshape.com &gt; https://<font color="slate"><strong>companyName</strong></font>.onshape.com</li> -</ul> -</blockquote> -<h2 id="endpoints">Endpoints</h2> -<ul> -<li><a href="https://cad.onshape.com/glassworks/explorer#/PartStudio/evalFeatureScript">PartStudio/evalFeatureScript</a> -<pre tabindex="0"><code>curl -X &#39;POST&#39; \ -&#39;https://cad.onshape.com/api/v6/partstudios/d/{did}/w/{wid}/e/{eid}/featurescript?rollbackBarIndex=-1&#39; \ --H &#39;accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39;\ --d &#39;{ -&#34;libraryVersion&#34;: 2144, -&#34;script&#34;: &#34;&#34; -} -</code></pre></li> -</ul> -<h2 id="sample-workflows">Sample Workflows</h2> -<h3 id="calculate-a-tight-bounding-box">Calculate a tight bounding box</h3> -<p>Though the Onshape API offers a <a href="https://cad.onshape.com/glassworks/explorer/#/PartStudio/getPartStudioBoundingBoxes">PartStudio/getPartStudioBoundingBoxes</a> endpoint, it does not result in a tight bounding box. The values returned are meant for graphics and visualization, and are approximate. To calculate a more accurate bounding box, we&rsquo;ll use the <a href="https://cad.onshape.com/glassworks/explorer#/PartStudio/evalFeatureScript">PartStudio/evalFeatureScript</a> endpoint.</p> -<ol> -<li>Call the <a href="https://cad.onshape.com/glassworks/explorer#/PartStudio/evalFeatureScript">PartStudio/evalFeatureScript</a>. Replace the URL parameters with the IDs from the Part Studio you&rsquo;re working with, and replace <code>CREDENTIALS</code> with your authorization credentials. The endpoint will return a tight bounding box in the response. -<pre tabindex="0"><code> curl -X &#39;POST&#39; \ -&#39;https://cad.onshape.com/api/v6/partstudios/d/{did}/w/{wid}/e/{eid}/featurescript?rollbackBarIndex=-1&#39; \ --H &#39;accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39;\ --d &#39;{ &#34;libraryVersion&#34;: 2144, -&#34;script&#34;: &#34;function(context is Context, definition is map) {const boundingBoxTight = evBox3d(context, { \n \&#34;topology\&#34; : qConstructionFilter(qEverything(), ConstructionObject.NO),\n \&#34;tight\&#34; : true\n}); \n return (boundingBoxTight);}&#34; -}&#39; -</code></pre></li> -</ol> -<h2 id="additional-resources">Additional Resources</h2> -<ul> -<li><a href="https://cad.onshape.com/FsDoc/">FeatureScript</a></li> -<li><a href="https://cad.onshape.com/glassworks/explorer/#/PartStudio">API Explorer: Part Studio</a></li> -<li><a href="https://onshape-public.github.io/docs/api-intro/explorer">API Guide: API Explorer</a></li> -</ul>Docs: Import & Exporthttps://onshape-public.github.io/docs/api-adv/translation/Wed, 27 Sep 2023 00:00:00 +0000https://onshape-public.github.io/docs/api-adv/translation/ -<p>This page describes the APIs Onshape provides for importing files to Onshape and exporting files from Onshape into different formats. We refer to the process of importing and exporting files from one format to another as <em>translating</em> the files.</p> -<p>Onshape provides several APIs to support this format translation. These fall into three categories:</p> -<ul> -<li><a href="#synchronous-exports">Synchronous exports</a> - Export Onshape content to glTF, STL, or Parasolid format.</li> -<li><a href="#asynchronous-exports">Asynchronous exports</a> - Export Onshape content into a variety of other formats.</li> -<li><a href="#imports">Import to Onshape</a> - Import a translatable file by uploading it to an Onshape blob element.</li> -</ul> -<blockquote> -<p>📘 <strong>Notes</strong></p> -<ul> -<li>This page provides sample code as curls. See the <a href="https://curl.se/docs/">curl documentation</a> for more information.</li> -<li>All Onshape API calls must be properly authenticated by replacing the <code>CREDENTIALS</code> variable in the curls below. See the <a href="https://onshape-public.github.io/docs/auth/apikeys">API Keys</a> page for instructions and the <a href="https://onshape-public.github.io/docs/api-intro/quickstart">Quick Start</a> for an example. All applications submitted to the Onshape App Store <em>must</em> authenticate with <a href="https://onshape-public.github.io/docs/auth/oauth">OAuth2</a>.</li> -<li>This documentation refers to Onshape IDs in the following format: <code>{did}, {wid}, {eid}, {pid}, {otherId}</code>. These represent document, workspace, element, part, and other IDs (respectively) that are needed make the API calls. We sometimes abbreviate these variables as <code>DWVEM</code> Please see <a href="https://onshape-public.github.io/docs/api-intro/#onshape-api-request">API Guide: API Intro</a> for information on what these IDs mean and how to obtain them from your documents. Never include the curly braces (<code>{}</code>) in your API calls.</li> -<li>For Enterprise accounts, replace <strong><font color="slate">cad</font></strong> in all Onshape URLs with your company domain. -https://<font color="slate"><strong>cad</strong></font>.onshape.com &gt; https://<font color="slate"><strong>companyName</strong></font>.onshape.com</li> -</ul> -</blockquote> -<h2 id="synchronous-exports">Synchronous exports</h2> -<p>Onshape provides a simple way to export content to common formats (glTF, Parasolid, and STL). Most of the interfaces defined here operate by requesting an HTTP redirect to a different URL where the request is fulfilled. Applications must explicitly handle the redirect and attachment authentication headers to the follow-up request, or it will fail.</p> -<p>The following endpoints are available. We&rsquo;ve included an example curl with each one.</p> -<ul> -<li><a href="https://cad.onshape.com/glassworks/explorer/#/Part/exportPartGltf">Export Part to glTF</a> -<pre tabindex="0"><code>curl -X &#39;GET&#39; \ -&#39;https://cad.onshape.com/api/v6/parts/d/{did}/w/{wid}/e/{eid}/partid/{partid}/gltf?rollbackBarIndex=-1&amp;outputSeparateFaceNodes=false&amp;outputFaceAppearances=false&#39; \ --H &#39;accept: model/gltf-binary;qs=0.08&#39; \ -</code></pre></li> -<li><a href="https://cad.onshape.com/glassworks/explorer/#/Part/exportPS">Export Part to Parasolid</a> -<pre tabindex="0"><code>curl -X &#39;GET&#39; \ -&#39;https://cad.onshape.com/api/v6/parts/d/{did}/w/{wid}?elementId={eid}&amp;withThumbnails=false&amp;includePropertyDefaults=false&#39; \ --H &#39;accept: application/json;charset=UTF-8; qs=0.09&#39; -</code></pre></li> -<li><a href="https://cad.onshape.com/glassworks/explorer/#/Part/exportStl">Export Part to STL</a> -<pre tabindex="0"><code>curl -X &#39;GET&#39; \ -&#39;https://cad.onshape.com/api/v6/parts/d/{did}/w/{wid}/e/{eid}/partid/{partid}/stl?mode=text&amp;grouping=true&amp;scale=1&amp;units=inch&#39; \ --H &#39;accept: application/octet-stream&#39; -</code></pre></li> -<li><a href="https://cad.onshape.com/glassworks/explorer/#/PartStudio/exportPartStudioGltf">Export PartStudio to glTF</a> -<pre tabindex="0"><code>curl -X &#39;GET&#39; \ -&#39;https://cad.onshape.com/api/v6/partstudios/d/{did}/w/{wid}/e/{eid}/gltf?rollbackBarIndex=-1&amp;outputSeparateFaceNodes=false&amp;outputFaceAppearances=false&#39; \ --H &#39;accept: model/gltf-binary;qs=0.08&#39; -</code></pre></li> -<li><a href="https://cad.onshape.com/glassworks/explorer/#/PartStudio/exportParasolid">Export PartStudio to Parasolid</a> -<pre tabindex="0"><code>curl -X &#39;GET&#39; \ -&#39;https://cad.onshape.com/api/v6/partstudios/d/{did}/w/{wid}/e/{eid}/parasolid?version=0&amp;includeExportIds=false&amp;binaryExport=false&#39; \ --H &#39;accept: */*&#39; -</code></pre></li> -<li><a href="https://cad.onshape.com/glassworks/explorer/#/PartStudio/exportPartStudioStl">Export PartStudio to STL</a> -<pre tabindex="0"><code>curl -X &#39;GET&#39; \ -&#39;https://cad.onshape.com/api/v6/partstudios/d/{did}/w/{wid}/e/{eid}/stl?mode=text&amp;grouping=true&amp;scale=1&amp;units=inch&#39; \ --H &#39;accept: */*&#39; -</code></pre></li> -<li><a href="https://cad.onshape.com/glassworks/explorer/#/Document/export2Json">Export Document to JSON</a> -<pre tabindex="0"><code>curl -X &#39;POST&#39; \ -&#39;https://cad.onshape.com/api/v6/documents/d/{did}/w/{wid}/e/{eid}/export&#39; \ --H &#39;accept: application/octet-stream&#39; \ -</code></pre></li> -</ul> -<h2 id="asynchronous-exports">Asynchronous exports</h2> -<p>The exports in the last section perform the format translation synchronously, returning the output immediately after some processing delay. Other format conversions are more complex and time-consuming, and in many cases, cannot be completed quickly enough to prevent connection errors. Note that the source format for an export is currently always automatically detected by Onshape. Part Studios and Assemblies are known to be <code>ONSHAPE</code> format. File uploads have their type determined by the filename suffix. For example, a file named <em>part7.step</em> is assumed to be in <code>STEP</code> format.</p> -<p>The following asynchronous translation APIs are available:</p> -<ul> -<li><a href="https://cad.onshape.com/glassworks/explorer/#/BlobElement/createBlobTranslation">BlobElement/createBlobTranslation</a>: Export a Blob Element to the specified <code>formatName</code>.</li> -<li><a href="https://cad.onshape.com/glassworks/explorer/#/PartStudio/createPartStudioTranslation">PartStudios/createPartStudioTranslation</a>: Export a Part Studio to the specified <code>formatName</code>.</li> -<li><a href="https://cad.onshape.com/glassworks/explorer/#/Assembly/translateFormat">Assembly/translateFormat</a>: Export an Assembly to the specified <code>formatName</code>.</li> -<li><a href="https://cad.onshape.com/glassworks/explorer/#/Drawing/createDrawingTranslation">Drawing/createDrawingTranslation</a>: Export a Drawing to the specified <code>formatName</code>.</li> -</ul> -<p>These asynchronous exports include a few additional steps, which are explained in more detail in the <a href="#async-export-steps">next section</a>:</p> -<ol> -<li>See what formats are available for exporting your content with <strong><a href="https://cad.onshape.com/glassworks/explorer/#/Translation/getAllTranslatorFormats">Translation/getAllTranslatorFormats</a></strong>.</li> -</ol> -<ul> -<li><strong>Note:</strong> Parts with mesh data cannot be exported to ACIS, IGES, or OBJ format.</li> -</ul> -<ol start="2"> -<li>Call the desired <strong>translation API</strong>. -<ul> -<li>Specify the target <strong><code>formatName</code></strong> in the request body JSON.</li> -<li>Specify <strong><code>storeInDocument=false</code></strong> (default) to export the content to new file.</li> -<li>Specify <strong><code>storeInDocument=true</code></strong> to export the content to a blob element in the source document.</li> -</ul> -</li> -<li>Poll the <strong><code>requestState</code></strong> in the translation response and wait for a result of <strong><code>DONE</code></strong>.</li> -<li>To retrieve the exported results: -<ul> -<li>External files: call <strong><a href="https://cad.onshape.com/glassworks/explorer/#/Document/downloadExternalData">Document/downloadExternalData</a></strong> on the <code>resultExternalDataIds</code> from the translation response.</li> -<li>Blob elements: call <strong><a href="https://cad.onshape.com/glassworks/explorer/#/BlobElement/downloadFileWorkspace">BlobElement/downloadFileWorkspace</a></strong> on the <code>resultElementIds</code> from the translation response.</li> -</ul> -</li> -</ol> -<h3 id="async-export-details">Async export details</h3> -<p>To export your Onshape content to another format:</p> -<ol> -<li>Determine what export format file types are available for your content by calling: <a href="https://cad.onshape.com/glassworks/explorer/#/Translation/getAllTranslatorFormats">Translations/getAllTranslatorFormats</a>. -<ul> -<li>Note that Drawings have their own API for this call: <a href="https://cad.onshape.com/glassworks/explorer/#/Drawing/getDrawingTranslatorFormats">Drawing/getDrawingTranslatorFormats</a></li> -</ul> -</li> -<li>Next, initiate the export by calling one of the asynchronous translation APIs. -<ul> -<li>Note that each of these APIs takes a JSON for specifying options for the export as part of the request body. Refer to the <a href="https://onshape-public.github.io/docs/api-intro/explorer">API Explorer</a> page for help viewing these JSON docs.</li> -<li>The target file format <strong>must be specified in the <code>formatName</code> field</strong> in the request body, and must match a valid format found in Step 1.</li> -<li>By default, <code>storeInDocument</code> is set to <code>false</code> in the request body to export to a single data file (or a zip of multiple files). Set to <code>true</code> to export as blob elements.</li> -</ul> -</li> -<li>Wait for the translation to complete. You can either register a webhook and wait to receive a notifcation that the translation is complete (see <a href="https://onshape-public.github.io/docs/app-dev/webhook/">Webhook Notifications</a>), or you can poll the translation&rsquo;s <code>requestState</code>: -<ul> -<li>You can poll the <code>requestState</code> from the initial translation&rsquo;s response, or you can call <a href="https://cad.onshape.com/glassworks/explorer/#/Translation/getTranslation">Translation/getTranslation</a> on the <code>translationId</code> from the initial translation&rsquo;s response.</li> -<li>When a translation is complete, <code>requestState</code> will change from <code>ACTIVE</code> to either <code>DONE</code> or <code>FAILED</code>.</li> -<li>When <code>requestState=DONE</code>, results are available to be used.</li> -</ul> -</li> -<li>Retrieve the exported results: -<ul> -<li>If you exported to an external file, call <a href="https://cad.onshape.com/glassworks/explorer/#/Document/downloadExternalData">Documents/downloadExternalData</a> to retrieve the exported result. -<ul> -<li>Note that this API takes the source document ID and a &ldquo;foreign ID&rdquo; as required parameters.</li> -<li>Use the <code>resultExternalDataIds</code> from the translation response as the foreign ID (<code>fid</code>).</li> -<li>External data is associated with, but external to, the document used as translation context. This data is not versioned like with in-document data.</li> -</ul> -</li> -<li>If your translation request body specified <code>storeInDocument=true</code>, retrieve the blob element data with <a href="https://cad.onshape.com/glassworks/explorer/#/BlobElement/downloadFileWorkspace">BlobElement/downloadFileWorkspace</a>. -<ul> -<li>The element IDs for the new blob elements can be found in the <code>resultElementIds</code> field in the translation response.</li> -</ul> -</li> -</ul> -</li> -</ol> -<h2 id="imports">Imports</h2> -<p>Files can be imported to Onshape as blob elements. When uploading a file to a blob element, either as a new element or an update to an existing element, if the file is a recognized format for import, it will be translated into <code>ONSHAPE</code> format by default. This behavior can be overridden by the application, if desired.</p> -<ul> -<li><a href="https://cad.onshape.com/glassworks/explorer/#/Translation/createTranslation">Translation/createTranslation</a> -<pre tabindex="0"><code>curl -X &#39;POST&#39; \ -&#39;https://cad.onshape.com/api/v6/translations/d/{did}/w/{wid}&#39; \ --H &#39;accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; \ --H &#39;Content-Type: multipart/form-data&#39; \ --F &#39;storeInDocument=true&#39; \ --F &#39;flattenAssemblies=true --F &#39;file=@/path/filename.ext&#39; --F &#39;formatName=&#39; \ -... -</code></pre></li> -<li><a href="https://cad.onshape.com/glassworks/explorer/#/BlobElement/uploadFileCreateElement">BlobElement/uploadFileCreateElement</a> -<pre tabindex="0"><code>curl -X &#39;POST&#39; \ -&#39;https://cad.onshape.com/api/v6/blobelements/d/{did}/w/{wid}&#39; \ --H &#39;accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; \ --H &#39;Content-Type: multipart/form-data&#39; \ --F &#39;storeInDocument=true&#39; \ --F &#39;file=@/path/filename.ext&#39; --F &#39;formatName=&#39; \ -... -</code></pre></li> -<li><a href="https://cad.onshape.com/glassworks/explorer/#/BlobElement/uploadFileUpdateElement">BlobElement/uploadFileUpdateElement</a> -<pre tabindex="0"><code> curl -X &#39;POST&#39; \ -&#39;https://cad.onshape.com/api/v6/blobelements/d/{did}/w/{wid}/e/{eid}&#39; \ --H &#39;accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; \ --H &#39;Content-Type: multipart/form-data&#39; \ --F &#39;storeInDocument=true&#39; \ --F &#39;locationElementId=&#39; \ --F &#39;file=@/path/filename.ext&#39; -... -</code></pre></li> -</ul> -<p>Note that these endpoints require you to specify the target document ID and workspace ID. You must also include the file to import. These APIs also includes a request body JSON for specifying options for the import.</p> -<ul> -<li>Override the translation to <code>ONSHAPE</code> format by specifying a valid format in the <code>formatName</code> field. Get a list of valid import formats by calling <a href="https://cad.onshape.com/glassworks/explorer/#/Translation/getAllTranslatorFormats">Translation/getAllTranslatorFormats</a>.</li> -<li>Specify <code>storeInDocument=true</code> to import the data as a blob element into the target document. Change to <code>false</code> to only create an external data file.</li> -<li>If the source file contains an assembly and <code>flattenAssemblies=true</code>, the assembly structure is removed and a single part studio is created.</li> -<li>Note that when using cURL, you must begin the path to the file with an <code>@</code> symbol.</li> -</ul> -<h2 id="sample-workflows">Sample Workflows</h2> -<h3 id="export-a-partstudio-to-stl">Export a PartStudio to STL</h3> -<p>We will export the <code>CRANK</code> PartStudio from <a href="https://cad.onshape.com/documents/e60c4803eaf2ac8be492c18e/w/d2558da712764516cc9fec62/e/6bed6b43463f6a46a37b4a22">this public document</a> to an STL file.</p> -<ol> -<li>Call the <a href="https://cad.onshape.com/glassworks/explorer/#/PartStudio/exportPartStudioStl">Part Studios/exportPartStudioStl</a> endpoint on the document: -<pre tabindex="0"><code>curl -X &#39;GET&#39; \ -&#39;https://cad.onshape.com/api/v6/partstudios/d/e60c4803eaf2ac8be492c18e/w/d2558da712764516cc9fec62/e/6bed6b43463f6a46a37b4a22/stl?mode=text&amp;grouping=true&amp;scale=1&amp;units=inch&#39; \ --H &#39;accept: */*&#39; -</code></pre></li> -<li>Navigate to the request URL to download the resulting STL file: -<pre tabindex="0"><code>https://cad.onshape.com/api/v6/partstudios/d/e60c4803eaf2ac8be492c18e/w/d2558da712764516cc9fec62/e/6bed6b43463f6a46a37b4a22/stl?mode=text&amp;grouping=true&amp;scale=1&amp;units=inch -</code></pre></li> -<li>Open the <em>CRANK.stl</em> file from wherever your downloads are saved.</li> -</ol> -<h3 id="export-a-part-to-parasolid">Export a Part to Parasolid</h3> -<p>We will export the <code>FLYWHEEL</code> part from <a href="https://cad.onshape.com/documents/e60c4803eaf2ac8be492c18e/w/d2558da712764516cc9fec62/e/6bed6b43463f6a46a37b4a22">this public document</a> to an STL file.</p> -<ol> -<li>Call the <a href="https://cad.onshape.com/glassworks/explorer/#/Part/getPartsWMV">Part/getPartsWMV</a> endpoint on your document and get all the part IDs: -<pre tabindex="0"><code>curl -X &#39;GET&#39; \ -&#39;https://cad.onshape.com/api/v6/parts/d/e60c4803eaf2ac8be492c18e/w/d2558da712764516cc9fec62?elementId=6bed6b43463f6a46a37b4a22&amp;withThumbnails=false&amp;includePropertyDefaults=false&#39; \ --H &#39;accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; -</code></pre></li> -<li>Locate the part to export (hint: look for <code>name = yourPartName</code>) in the response body. Get the part ID from the <code>partId</code> field. In the example below, <code>partId = JiD</code> for <code>name=FLYWHEEL</code>: -<pre tabindex="0"><code>[ -... -{ -&#34;name&#34; : &#34;FLYWHEEL&#34;, -&#34;state&#34; : &#34;IN_PROGRESS&#34;, -&#34;propertySourceTypes&#34; : { -&#34;57f3fb8efa3416c06701d60f&#34; : 3, -&#34;57f3fb8efa3416c06701d60d&#34; : 3, -&#34;57f3fb8efa3416c06701d61e&#34; : 3, -&#34;57f3fb8efa3416c06701d60e&#34; : 3, -&#34;57f3fb8efa3416c06701d60c&#34; : 3 -}, -&#34;defaultColorHash&#34; : &#34;FzHLKqGeuTBFjmY_2_0&#34;, -&#34;ordinal&#34; : 1, -&#34;isMesh&#34; : false, -&#34;description&#34; : &#34;Flywheel&#34;, -&#34;microversionId&#34; : &#34;bdb504d2d4c948493a87ccf3&#34;, -&#34;partNumber&#34; : &#34;PRT-10241&#34;, -&#34;elementId&#34; : &#34;6bed6b43463f6a46a37b4a22&#34;, -&#34;partId&#34; : &#34;JiD&#34;, -&#34;bodyType&#34; : &#34;solid&#34;, -&#34;customProperties&#34; : { -&#34;57f3fb8efa3416c06701d61e&#34; : &#34;false&#34; -} -... -] -</code></pre></li> -<li>Call the <a href="https://cad.onshape.com/glassworks/explorer/#/Part/exportPS">Part/exportPS</a> endpoint on the FLYWHEEL part: -<pre tabindex="0"><code>curl -X &#39;GET&#39; \ -&#39;https://cad.onshape.com/api/v6/parts/d/e60c4803eaf2ac8be492c18e/w/d2558da712764516cc9fec62/e/6bed6b43463f6a46a37b4a22/partid/JiD/parasolid?version=0&#39; \ --H &#39;accept: application/octet-stream&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; -</code></pre></li> -<li>Navigate to the request URL to download the resulting file: -<pre tabindex="0"><code>https://cad.onshape.com/api/v6/parts/d/e60c4803eaf2ac8be492c18e/w/d2558da712764516cc9fec62/e/6bed6b43463f6a46a37b4a22/partid/JiD/parasolid?version=0 -</code></pre></li> -<li>Open the <em>CRANK.x_t</em> file from your downloads. Note that the file is automatically named after the PartStudio to which the part belongs.</li> -</ol> -<h3 id="export-a-partstudio-to-solidworks">Export a PartStudio to SOLIDWORKS</h3> -<p>We will export the <code>CRANK</code> PartStudio from <a href="https://cad.onshape.com/documents/e60c4803eaf2ac8be492c18e/w/d2558da712764516cc9fec62/e/6bed6b43463f6a46a37b4a22">this public document</a> to a SOLIDWORKS file.</p> -<ol> -<li>Validate that SOLIDWORKS is a supported export file type by calling <a href="https://cad.onshape.com/glassworks/explorer/#/Translation/getAllTranslatorFormats">Translation/getAllTranslatorFormats</a> and confirming that <code>validDestinationFormat=true</code> for <code>translatorName=SOLIDWORKS</code>. -<pre tabindex="0"><code>curl -X &#39;GET&#39; \ -&#39;https://cad.onshape.com/api/v6/translations/translationformats&#39; \ --H &#39;accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; \ -</code></pre><pre tabindex="0"><code>[ -{ -&#34;validSourceFormat&#34;: true, -&#34;validDestinationFormat&#34;: true, -&#34;name&#34;: &#34;SOLIDWORKS&#34;, -&#34;translatorName&#34;: &#34;solidworks&#34;, -&#34;couldBeAssembly&#34;: true -} -] -</code></pre></li> -<li>Initialize the export by calling <a href="https://cad.onshape.com/glassworks/explorer/#/PartStudio/createPartStudioTranslation">PartStudio/createPartStudioTranslation</a>. -<pre tabindex="0"><code>curl -X &#39;POST&#39; \ -&#39;https://cad.onshape.com/api/v6/partstudios/d/e60c4803eaf2ac8be492c18e/w/d2558da712764516cc9fec62/e/6bed6b43463f6a46a37b4a22/translations&#39; \ --H &#39;accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; \ --H &#39;Content-Type: application/json;charset=UTF-8; qs=0.09&#39; \ --d &#39;{ -&#34;formatName&#34;: &#34;SOLIDWORKS&#34;, -&#34;storeInDocument&#34;: false, -&#34;translate&#34;: true -}&#39; -</code></pre><ul> -<li>Note that the API takes a JSON as part of the request body, in which you can specify options for the export.</li> -<li>In this example, we&rsquo;ve just shown a snippet of the entire JSON.</li> -<li>A <code>formatName</code> string must be specified that matches one of the valid formats you found in the last step. In this example, we set <code>formatName</code> to <code>SOLIDWORKS.</code></li> -<li>We want to export this to a new file, so we&rsquo;ll leave <code>storeInDocument</code> set to <code>false</code>.</li> -</ul> -</li> -<li>Next, we poll the <a href="https://cad.onshape.com/glassworks/explorer/#/PartStudio/createPartStudioTranslation">PartStudio/createPartStudioTranslation</a> response until <code>requestState</code> changes from <code>ACTIVE</code> to <code>DONE</code> or <code>FAILED</code>. -<pre tabindex="0"><code>{ -&#34;documentId&#34;: &#34;e60c4803eaf2ac8be492c18e&#34;, -&#34;requestElementId&#34;: &#34;6bed6b43463f6a46a37b4a22&#34;, -&#34;requestState&#34;: &#34;DONE&#34;, -&#34;resultExternalDataIds&#34;: &#34;[{resultId}]&#34;, -... -} -</code></pre></li> -<li>Once <code>requestState=DONE</code>, we can call <a href="https://cad.onshape.com/glassworks/explorer/#/Document/downloadExternalData">Documents/downloadExternalData</a> to retrieve the exported result. -<pre tabindex="0"><code>curl -X &#39;GET&#39; \ -&#39;https://cad.onshape.com/api/v6/documents/d/e60c4803eaf2ac8be492c18e/externaldata/{fid}&#39; -</code></pre><ul> -<li>Use the <code>resultExternalDataIds</code> value from the translation response as the foreign ID (<code>fid</code>).</li> -<li>The new SOLIDWORKS file is returned as the response and will be downloaded to wherever the API call is made.</li> -</ul> -</li> -</ol> -<h3 id="export-an-assembly-to-step">Export an Assembly to STEP</h3> -<p>In this example, we&rsquo;ll export an assembly from <a href="https://cad.onshape.com/documents/e60c4803eaf2ac8be492c18e/w/d2558da712764516cc9fec62/e/23a9385cd48c50167c32d6d1">this public document</a> to a STEP file.</p> -<ol> -<li>Make a copy of <a href="https://cad.onshape.com/documents/e60c4803eaf2ac8be492c18e/w/d2558da712764516cc9fec62/e/23a9385cd48c50167c32d6d1">this public document</a> so you can export the assembly. Make a note of the documentId, workspaceId, and elementId of the assembly in your new document.</li> -<li>Validate that STEP is a supported export file type for assemblies by calling <a href="https://cad.onshape.com/glassworks/explorer/#/Translation/getAllTranslatorFormats">Translation/getAllTranslatorFormats</a> and confirming that <code>validDestinationFormat=true</code> and <code>couldBeAssembly=true</code> for <code>translatorName=STEP</code>. -<pre tabindex="0"><code>curl -X &#39;GET&#39; \ -&#39;https://cad.onshape.com/api/v6/translations/translationformats&#39; \ --H &#39;accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; \ -</code></pre><pre tabindex="0"><code>[ -{ -&#34;validSourceFormat&#34;: true, -&#34;validDestinationFormat&#34;: true, -&#34;name&#34;: &#34;STEP&#34;, -&#34;translatorName&#34;: &#34;step&#34;, -&#34;couldBeAssembly&#34;: true -}, -... -] -</code></pre></li> -<li>Initialize the export by calling <a href="https://cad.onshape.com/glassworks/explorer/#/Assembly/translateFormat">Assembly/translateFormat</a>. Replace <code>{did}</code>, <code>{wid}</code>, and <code>{eid}</code> with the document, workspace, and element IDs from your copied document. Do NOT include the curly braces (<code>{}</code>) in the final call. -<pre tabindex="0"><code>curl -X &#39;POST&#39; \ -&#39;https://cad.onshape.com/api/v6/assemblies/d/{did}/w/{wid}/e/{eid}/translations&#39; \ --H &#39;accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; \ --H &#39;Content-Type: application/json;charset=UTF-8; qs=0.09&#39; \ --d &#39;{ -&#34;allowFaultyParts&#34;: true, -&#34;angularTolerance&#34;: 0.001, -&#34;formatName&#34;: &#34;STEP&#34;, -&#34;storeInDocument&#34;: true -}&#39; -</code></pre><ul> -<li>Note that the API takes a JSON as part of the request body, in which you can specify options for the export.</li> -<li>In the example above, we&rsquo;ve just shown a snippet of the entire JSON where we allow faulty parts to be exported and set the angular tolerance to 0.001.</li> -<li>A <code>formatName</code> string must be specified that matches one of the valid formats you found in the last step. In this example, we set <code>formatName</code> to <code>STEP.</code></li> -<li>Set <code>storeInDocument</code> to <code>true</code> to upload the STEP file as a blob element in your document.</li> -</ul> -</li> -<li>Next, we poll the <a href="https://cad.onshape.com/glassworks/explorer/#/Assembly/translateFormat">Assembly/translateFormat</a> response until <code>requestState</code> changes from <code>ACTIVE</code> to <code>DONE</code> or <code>FAILED</code>. -<pre tabindex="0"><code>{ -&#34;resultDocumentId&#34; : &#34;{did}&#34;, -&#34;resultWorkspaceId&#34; : &#34;{wid}&#34;, -&#34;requestState&#34; : &#34;DONE&#34;, -&#34;requestElementId&#34; : &#34;{eid}&#34;, -&#34;resultExternalDataIds&#34; : [ &#34;{resultExternalId}&#34; ], -&#34;documentId&#34; : &#34;{did}&#34;, -&#34;workspaceId&#34; : &#34;{wid}&#34;, -&#34;resultElementIds&#34; : {resulteid}, -&#34;name&#34; : &#34;GEARBOX_CHUCK&#34;, -&#34;id&#34; : &#34;{translationId}&#34;, -&#34;href&#34; : &#34;https://cad.onshape.com/api/v6/translations/{translationId}&#34; -} -</code></pre></li> -<li>Once <code>requestState=DONE</code>, we make a note of the <code>resultElementId</code> in the response. This is the elementId of the STEP blob.</li> -<li>Now, we can call <a href="https://cad.onshape.com/glassworks/explorer/#/BlobElement/downloadFileWorkspace">BlobElement/downloadFileWorkspace</a> to retrieve the exported results. -<pre tabindex="0"><code>curl -X &#39;GET&#39; \ -&#39;https://cad.onshape.com/api/v6/blobelements/d/{did}/w/{wid}/e/{resulteid}&#39; \ --H &#39;accept: application/octet-stream&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; \ -</code></pre><ul> -<li>Use the <code>resultElementIds</code> value from the translation response as the element ID (<code>{resulteid}</code>).</li> -<li>Note that you can also open your document, click the <code>GEARBOX_CHUCK.STEP</code> tab, and download the file from there.</li> -</ul> -</li> -</ol> -<h3 id="export-a-drawing-as-a-json">Export a Drawing as a JSON</h3> -<p>In this example, we&rsquo;ll export a Drawing from <a href="https://cad.onshape.com/documents/e60c4803eaf2ac8be492c18e/w/d2558da712764516cc9fec62/e/15b07287508246ccd038e31e">this public document</a> to a JSON file. Exporting a Drawing to JSON is useful when you need to gather information about that drawing (for example, finding valid coordinates on which to place an inspection symbol).</p> -<ol> -<li>Make a copy of <a href="https://cad.onshape.com/documents/e60c4803eaf2ac8be492c18e/w/d2558da712764516cc9fec62/e/15b07287508246ccd038e31e">this public document</a> so you can export the assembly. Make a note of the documentId, workspaceId, and elementId of the assembly in your new document.</li> -<li>Validate that JSON is a supported export file type for Drawings by calling <a href="https://cad.onshape.com/glassworks/explorer/#/Drawing/getDrawingTranslatorFormats">Drawing/getDrawingTranslatorFormats</a> and confirming that <code>&quot;name&quot;: &quot;DRAWING_JSON&quot;</code> appears in the response for the drawing element in your copied document. -<pre tabindex="0"><code>curl -X &#39;GET&#39; \ -&#39;https://cad.onshape.com/api/v6/drawings/d/{did}/w/{wid}/e/{eid}/translationformats&#39; \ --H &#39;accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; \ -</code></pre><pre tabindex="0"><code>[ -{ -&#34;name&#34;: &#34;DRAWING_JSON&#34;, -&#34;translatorName&#34;: &#34;drawing_json&#34;, -&#34;couldBeAssembly&#34;: false -}, -... -] -</code></pre></li> -<li>Initialize the export by calling <a href="https://cad.onshape.com/glassworks/explorer/#/Drawing/createDrawingTranslation">Drawing/createDrawingTranslation</a>. Replace <code>{did}</code>, <code>{wid}</code>, and <code>{eid}</code> with the document, workspace, and element IDs from your copied document. Do NOT include the curly braces (<code>{}</code>) in the final call. -<pre tabindex="0"><code>curl -X &#39;POST&#39; \ -&#39;https://cad.onshape.com/api/v6/drawings/d/{did}/w/{wid}/e/{eid}/translations&#39; \ --H &#39;accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; \ --H &#39;Content-Type: application/json;charset=UTF-8; qs=0.09&#39; \ --d &#39;{ -&#34;formatName&#34;: &#34;DRAWING_JSON&#34; -}&#39; -</code></pre><ul> -<li>Note that the API takes a JSON as part of the request body, in which you can specify options for the export.</li> -<li>The only required JSON field is <code>formatName</code>, in which we&rsquo;ve specified the format as found in the <code>getDrawingTranslatorFormats</code> response body.</li> -</ul> -</li> -<li>Next, we poll the <a href="https://cad.onshape.com/glassworks/explorer/#/Drawing/createDrawingTranslation">Drawing/createDrawingTranslation</a> response until <code>requestState</code> changes from <code>ACTIVE</code> to <code>DONE</code> or <code>FAILED</code>. -<pre tabindex="0"><code>{ -&#34;resultDocumentId&#34; : &#34;{did}&#34;, -&#34;resultWorkspaceId&#34; : &#34;{wid}&#34;, -&#34;requestState&#34; : &#34;DONE&#34;, -&#34;requestElementId&#34; : &#34;{eid}&#34;, -&#34;resultExternalDataIds&#34; : [ &#34;{resultExternalId}&#34; ], -&#34;documentId&#34; : &#34;{did}&#34;, -&#34;workspaceId&#34; : &#34;{wid}&#34;, -&#34;resultElementIds&#34; : {eid}, -&#34;name&#34; : &#34;GEARBOX_CHUCK&#34;, -&#34;id&#34; : &#34;{translationId}&#34;, -&#34;href&#34; : &#34;https://cad.onshape.com/api/v6/translations/{translationId}&#34; -} -</code></pre><ul> -<li>Note that you can also call the <a href="https://cad.onshape.com/glassworks/explorer/#/Translation/getTranslation">Translation/getTranslation</a> endpoint on the <code>translationId</code> to see all in-progress translation information.</li> -</ul> -</li> -<li>Once <code>requestState=DONE</code>, we make a note of the <code>&quot;resultElementIds&quot; : {resulteid},</code> in the response. This is the element ID of the JSON blob.</li> -<li>Now, we can call <a href="https://cad.onshape.com/glassworks/explorer/#/BlobElement/downloadFileWorkspace">BlobElement/downloadFileWorkspace</a> to retrieve the exported results. -<pre tabindex="0"><code>curl -X &#39;GET&#39; \ -&#39;https://cad.onshape.com/api/v6/blobelements/d/{did}/w/{wid}/e/{resulteid}&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; \ --H &#39;accept: application/octet-stream&#39; -</code></pre><ul> -<li>Use the <code>{resultExternalId}</code> value from the translation response as the element ID (<code>{resulteid}</code>). Do not include the curly braces in your call.</li> -<li>Note that you can also open your document, click the <code>GEARBOX_CHUCK.JSON</code> tab, and download the file from there.</li> -</ul> -</li> -</ol> -<h3 id="import-a-parasolid-file-as-a-part">Import a Parasolid file as a Part</h3> -<p>In this example, we&rsquo;ll import the <em>FLYWHEEL</em> part from the <em>CRANK.x_t</em> file we created in the <a href="#export-a-part-to-parasolid">Export a Part to Parasolid</a> example.</p> -<ol> -<li>Open or create a new Onshape document in which to import the Part. Make a note of the documentId and workspaceId of your document.</li> -<li>Validate that Parasolid is a supported export file type for imports by calling <a href="https://cad.onshape.com/glassworks/explorer/#/Translation/getAllTranslatorFormats">Translation/getAllTranslatorFormats</a> and confirming that <code>validSourceFormat=true</code> for <code>translatorName=parasolid</code>. -<pre tabindex="0"><code>curl -X &#39;GET&#39; \ -&#39;https://cad.onshape.com/api/v6/translations/translationformats&#39; \ --H &#39;accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; -</code></pre><pre tabindex="0"><code>[ -{ -&#34;validSourceFormat&#34;: true, -&#34;validDestinationFormat&#34;: true, -&#34;name&#34;: &#34;PARASOLID&#34;, -&#34;translatorName&#34;: &#34;parasolid&#34;, -&#34;couldBeAssembly&#34;: true -} -]s -</code></pre></li> -<li>Initialize the import by calling <a href="https://cad.onshape.com/glassworks/explorer/#/Translation/createTranslation">Translation/createTranslation</a>. In this example, the filename is <code>CRANK.x_t</code>. -<pre tabindex="0"><code>curl -X &#39;POST&#39; \ -&#39;https://cad.onshape.com/api/v6/translations/d/{did}/w/{wid}&#39; \ --H &#39;accept: application/json;charset=UTF-8; qs=0.09&#39;s \ --H &#39;Authorization: Basic CREDENTIALS&#39; \ --H &#39;Content-Type: multipart/form-data&#39; \ --F &#39;formatName=&#39; \ --F &#39;flattenAssemblies=true&#39; \ --F &#39;translate=true&#39; \ --F &#39;file=@/pathToFile/CRANK.x_t&#39; \ -</code></pre><ul> -<li>Replace <code>{did}</code> and <code>{wid}</code> in the URL with the document and workspace IDs for the document you want to import the part to.</li> -<li>Note that when using cURL, you must begin the path to the file with an <code>@</code> symbol.</li> -<li>Note that the API takes a JSON as part of the request body, in which you can specify options for the import.</li> -<li>When importing files, the API assumes we are importing to the <code>ONSHAPE</code> file type. You can override this and import to a different file type using the <code>formatName</code> field. In this case, we can leave the <code>formatName</code> field blank to import to the <code>ONSHAPE</code> file type.</li> -</ul> -</li> -<li>Next, we poll the <a href="https://cad.onshape.com/glassworks/explorer/#/Translation/getDocumentTranslations">Translation/getDocumentTranslations</a> response until <code>requestState</code> changes from <code>ACTIVE</code> to <code>DONE</code> or <code>FAILED</code>. -<pre tabindex="0"><code>{ -&#34;requestState&#34; : &#34;DONE&#34;, -&#34;documentId&#34; : &#34;{did}&#34;, -&#34;workspaceId&#34; : &#34;{wid}&#34;, -&#34;resultElementIds&#34; : [ &#34;{resulteid}&#34; ], -&#34;name&#34; : &#34;FLYWHEEL&#34;, -&#34;id&#34; : &#34;{id}&#34;, -&#34;href&#34; : &#34;https://cad.onshape.com/api/v1/translations/{tid}&#34; -} -</code></pre></li> -<li>Once <code>requestState=DONE</code>, we can view the imported file as a Part in our Onshape document. The <code>FLYWHEEL</code> part appears in a new PartStudio named <code>CRANK</code> in our document.</li> -</ol> -<h3 id="export-a-configured-part">Export a configured part</h3> -<p>See the <a href="https://onshape-public.github.io/docs/api-adv/configs">Configurations API Guide</a> for examples.</p> -<h2 id="additional-resources">Additional Resources</h2> -<ul> -<li><a href="https://cad.onshape.com/help/Content/translation.htm">Onshape Help: Translation</a></li> -<li><a href="https://cad.onshape.com/help/Content/Plans/webhooks.htm">Onshape Help: Webhooks</a></li> -<li><a href="https://onshape-public.github.io/docs/app-dev/webhook">API Guide: Webhook Notifications</a></li> -<li><a href="https://onshape-public.github.io/docs/api-intro/explorer">API Explorer</a></li> -</ul>Docs: Metadatahttps://onshape-public.github.io/docs/api-adv/metadata/Wed, 20 Dec 2023 00:00:00 +0000https://onshape-public.github.io/docs/api-adv/metadata/ -<p>This page describes the APIs Onshape provides for working with document metadata.</p> -<blockquote> -<p>📘 <strong>Notes</strong></p> -<ul> -<li>This page provides sample code as curls. See the <a href="https://curl.se/docs/">curl documentation</a> for more information.</li> -<li>All Onshape API calls must be properly authenticated by replacing the <code>CREDENTIALS</code> variable in the curls below. See the <a href="https://onshape-public.github.io/docs/auth/apikeys">API Keys</a> page for instructions and the <a href="https://onshape-public.github.io/docs/api-intro/quickstart">Quick Start</a> for an example. All applications submitted to the Onshape App Store <em>must</em> authenticate with <a href="https://onshape-public.github.io/docs/auth/oauth">OAuth2</a>.</li> -<li>This documentation refers to Onshape IDs in the following format: <code>{did}, {wid}, {eid}, {pid}, {otherId}</code>. These represent document, workspace, element, part, and other IDs (respectively) that are needed make the API calls. We sometimes abbreviate these variables as <code>DWVEM</code> Please see <a href="https://onshape-public.github.io/docs/api-intro/#onshape-api-request">API Guide: API Intro</a> for information on what these IDs mean and how to obtain them from your documents. Never include the curly braces (<code>{}</code>) in your API calls.</li> -<li>For Enterprise accounts, replace <strong><font color="slate">cad</font></strong> in all Onshape URLs with your company domain. -https://<font color="slate"><strong>cad</strong></font>.onshape.com &gt; https://<font color="slate"><strong>companyName</strong></font>.onshape.com</li> -</ul> -</blockquote> -<h2 id="endpoints">Endpoints</h2> -<h3 id="get-metadata">Get Metadata</h3> -<ul> -<li><a href="https://cad.onshape.com/glassworks/explorer/#/Metadata/getWVMetadata">getWVMetadata</a>: Get metadata for a workspace or version. -<pre tabindex="0"><code>curl -X &#39;GET&#39; \ -&#39;https://cad.onshape.com/api/v6/metadata/d/{did}/wv/{wvid}?inferMetadataOwner=false&amp;depth=1&amp;includeComputedProperties=true&amp;includeComputedAssemblyProperties=false&amp;thumbnail=false&#39; \ --H &#39;accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39;\ --H &#39;Content-Type: application/json;charset=UTF-8; qs=0.09&#39; -</code></pre></li> -<li><a href="https://cad.onshape.com/glassworks/explorer/#/Metadata/getWMVEsMetadata">getWMVEsMetadata</a>: Get metadata for all elements in a document. -<pre tabindex="0"><code>curl -X &#39;GET&#39; \ -&#39;https://cad.onshape.com/api/v6/metadata/d/{did}/wv/{wvid}/e?inferMetadataOwner=false&amp;depth=1&amp;includeComputedProperties=true&amp;includeComputedAssemblyProperties=false&amp;thumbnail=false&#39; \ --H &#39;accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; \ --H &#39;Content-Type: application/json;charset=UTF-8; qs=0.09&#39; -</code></pre></li> -<li><a href="https://cad.onshape.com/glassworks/explorer/#/Metadata/getWMVEMetadata">getWMVEMetadata</a>: Get metadata for an element. -<pre tabindex="0"><code>curl -X &#39;GET&#39; \ -&#39;https://cad.onshape.com/api/v6/metadata/d/{did}/wv/{wvid}/e/{eid}?inferMetadataOwner=false&amp;depth=1&amp;includeComputedProperties=true&amp;includeComputedAssemblyProperties=false&amp;thumbnail=false&#39; \ --H &#39;accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Authorization: CREDENTIALS&#39; \ --H &#39;Content-Type: application/json;charset=UTF-8; qs=0.09&#39; -</code></pre></li> -<li><a href="https://cad.onshape.com/glassworks/explorer/#/Metadata/getWMVEPMetadata">getWMVEPMetadata</a>: Get metadata for a part. -<pre tabindex="0"><code>curl -X &#39;GET&#39; \ -&#39;https://cad.onshape.com/api/v6/metadata/d/{did}/wv/{wvid}/e/{eid}/p/{pid}?rollbackBarIndex=-1&amp;inferMetadataOwner=false&amp;includeComputedProperties=true&amp;includeComputedAssemblyProperties=false&amp;thumbnail=false&#39; \ --H &#39;accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39;\ --H &#39;Content-Type: application/json;charset=UTF-8; qs=0.09&#39; -</code></pre></li> -<li><a href="https://cad.onshape.com/glassworks/explorer/#/Metadata/getWMVEPsMetadata">getWMVEPsMetadata</a>: Get metadata for all parts in a document. -<pre tabindex="0"><code>curl -X &#39;GET&#39; \ -&#39;https://cad.onshape.com/api/v6/metadata/d/{did}/wv/{wvid}/e/{eid}/p?inferMetadataOwner=false&amp;includeComputedProperties=true&amp;includeComputedAssemblyProperties=false&amp;thumbnail=false&#39; \ --H &#39;accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39;\ --H &#39;Content-Type: application/json;charset=UTF-8; qs=0.09&#39; -</code></pre></li> -<li><a href="https://cad.onshape.com/glassworks/explorer/#/Metadata/getVEOPStandardContentMetadata">getVEOPStandardContentMetadata</a>: Get metadata for a standard content part. -<ul> -<li><code>{linkedDocumentId}</code>: ID of the document into which the standard content part is inserted.</li> -<li>You can call <a href="https://cad.onshape.com/glassworks/explorer/#/Assembly/getAssemblyDefinition">getAssemblyDefinition</a> to get the other values needed for the call: -<ul> -<li><code>{did}</code>: ID of the document in which the standard content part lives.</li> -<li><code>{vid}</code>: ID of the version in which the standard content part lives.</li> -<li><code>{eid}</code>: ID of the element tab in which the standard content part lives.</li> -<li><code>{pid}</code>: Part ID of the standard content part.</li> -<li><code>{config}</code>: Encoded configuration string.</li> -</ul> -</li> -</ul> -<pre tabindex="0"><code>curl -X &#39;GET&#39; \ -&#39;https://cad.onshape.com/api/metadata/standardcontent/d/{did}/v/{vid}/e/{eid}/p/{pid}?configuration={config}&amp;linkDocumentId={linkDocument}&#39; \ --H &#39;accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; \ --H &#39;Content-Type: application/json;charset=UTF-8; qs=0.09&#39; -</code></pre></li> -</ul> -<h3 id="update-metadata">Update Metadata</h3> -<p>To update metadata, you send a JSON in the API request body. This JSON block must include a <code>jsonType</code> value and a <code>properties</code> object array. Each object in the <code>properties</code> array includes a <code>propertyId</code> and the metadata key/value pairs.</p> -<ul> -<li><a href="https://cad.onshape.com/glassworks/explorer/#/Metadata/updateWVMetadata">updateWVMetadata</a>: Update workspace or version metadata. -<pre tabindex="0"><code>curl -X &#39;POST&#39; \ -&#39;https://cad.onshape.com/api/v6/metadata/d/{did}/wv/{wvid}&#39; \ --H &#39;accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; \ --H &#39;Content-Type: application/json;charset=UTF-8; qs=0.09&#39; \ --d &#39;{ -&#34;jsonType&#34;: (&#34;metadata-workspace&#34; | &#34;metadata-version&#34;) , -&#34;properties&#34;: [ -{ -&#34;propertyId&#34;: &#34;propertyId1&#34;, -&#34;key1&#34;: &#34;value&#34;, -&#34;key2&#34;: &#34;value -}, -{ -&#34;propertyId&#34;: &#34;propertyId2&#34;, -&#34;key1&#34;: &#34;value&#34;, -&#34;key2&#34;: &#34;value -} -] -}&#39; -</code></pre></li> -<li><a href="https://cad.onshape.com/glassworks/explorer/#/Metadata/updateWVEMetadata">updateWVEMetadata</a>: Update element metadata. -<pre tabindex="0"><code>curl -X &#39;POST&#39; \ -&#39;https://cad.onshape.com/api/v6/metadata/d/{did}/wv/{wvid}/e/{eid}&#39; \ --H &#39;accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; \ --H &#39;Content-Type: application/json;charset=UTF-8; qs=0.09&#39; \ --d &#39;{ -&#34;jsonType&#34;: &#34;metadata-element&#34;, -&#34;properties&#34;: [ -{ -&#34;propertyId&#34;: &#34;propertyId&#34;, -&#34;key1&#34;: &#34;value&#34;, -&#34;key2&#34;: &#34;value -} -] -}&#39; -</code></pre></li> -<li><a href="https://cad.onshape.com/glassworks/explorer/#/Metadata/updateWVEPMetadata">updateWVEPMetadata</a>: Update part metadata -<pre tabindex="0"><code>curl -X &#39;POST&#39; \ -&#39;https://cad.onshape.com/api/v6/metadata/d/{did}/wv/{wvid}/e/{eid}/{iden}/{pid}&#39; \ --H &#39;accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; \ --H &#39;Content-Type: application/json;charset=UTF-8; qs=0.09&#39; \ --d &#39;{ -&#34;jsonType&#34;: &#34;metadata-part&#34;, -&#34;properties&#34;: [ -{ -&#34;propertyId&#34;: &#34;propertyId&#34;, -&#34;key1&#34;: &#34;value&#34;, -&#34;key2&#34;: &#34;value -} -] -}&#39; -</code></pre></li> -<li><a href="https://cad.onshape.com/glassworks/explorer/#/Metadata/updateVEOPStandardContentPartMetadata">updateVEOPStandardContentPartMetadata</a>: Update standard content part metadata. -<ul> -<li><code>{linkedDocumentId}</code>: ID of the document into which the standard content part is inserted.</li> -<li>You can call <a href="https://cad.onshape.com/glassworks/explorer/#/Assembly/getAssemblyDefinition">getAssemblyDefinition</a> to get the other values needed for the call: -<ul> -<li><code>{did}</code>, <code>{vid}</code>, <code>{eid}</code>: IDs of the document, version, and element in which the standard content part lives.</li> -<li><code>{companyId}</code>: ID of the company that owns the standard content part. All metadata changes to this standard content part will populate for the entire company.</li> -<li><code>{pid}</code>: Part ID of the standard content part.</li> -<li><code>{config}</code>: Encoded configuration string.</li> -</ul> -</li> -<li>For each <code>items.properties</code> object, include a unique <code>propertyId</code> and at least one key/value metadata pair.</li> -<li>Updates made to standard content are global for all users and documents within the company.</li> -</ul> -<pre tabindex="0"><code>curl -X &#39;POST&#39; \ -&#39;https://cad.onshape.com/api/v6/metadata/standardcontent/d/{did}?linkDocumentId={linkDocumentId}&#39; \ --H &#39;accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; \ --H &#39;Content-Type: application/json;charset=UTF-8; qs=0.09&#39; \ --d &#39;{ -&#34;items&#34;: [ -{ -&#34;href&#34;: &#34;https://cad.onshape.com/api/metadata/standardcontent/d/did/v/vid/e/eid/c/companyId/p/pid?configuration=config&amp;linkDocumentId=linkDocumentId&amp;applyToAllConfigs=true&#34;, -&#34;properties&#34;: [ -{ -&#34;key&#34;: &#34;value&#34;, -&#34;propertyId&#34;: &#34;propertyId1&#34; -}, -{ -&#34;key&#34;: &#34;value&#34;, -&#34;propertyId&#34;: &#34;propertyId2&#34; -} -] -} -] -}&#39; -</code></pre></li> -</ul> -<h2 id="sample-workflows">Sample Workflows</h2> -<h3 id="get-a-part-property">Get a part property</h3> -<p>In this example we&rsquo;ll get the name of a part by getting the metadata from the <code>DRILL_BIT</code> element in <a href="https://cad.onshape.com/documents/e60c4803eaf2ac8be492c18e/w/d2558da712764516cc9fec62/e/958bceb5a2511b572dbbe851">this public document</a>.</p> -<ol> -<li>Call the <a href="https://cad.onshape.com/glassworks/explorer/#/Metadata/getWMVEMetadata">Metadata/getWMVEMetadata</a> endpoint. Replace <code>CREDENTIALS</code> with your authentication credentials: -<pre tabindex="0"><code>curl -X &#39;GET&#39; \ -&#39;https://cad.onshape.com/api/v6/metadata/d/e60c4803eaf2ac8be492c18e/w/d2558da712764516cc9fec62/e/958bceb5a2511b572dbbe851?inferMetadataOwner=false&amp;depth=1&amp;includeComputedProperties=true&amp;includeComputedAssemblyProperties=false&amp;thumbnail=false&#39; \ --H &#39;accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; \ --H &#39;Content-Type: application/json;charset=UTF-8; qs=0.09&#39; -</code></pre></li> -<li>In the response body, confirm that for <code>properties.name=Name</code>, <code>properties.value=DRILL_BIT</code>. -<pre tabindex="0"><code>{ -&#34;jsonType&#34;: &#34;metadata-element&#34;, -&#34;elementType&#34;: 0, -&#34;mimeType&#34;: &#34;onshape/partstudio&#34;, -&#34;elementId&#34;: &#34;958bceb5a2511b572dbbe851&#34;, -&#34;properties&#34;: [ -{ -&#34;name&#34;: &#34;Name&#34;, -&#34;value&#34;: &#34;DRILL_BIT&#34;, -&#34;defaultValue&#34;: null, -&#34;computedPropertyError&#34;: null, -&#34;propertySource&#34;: 0, -... -</code></pre></li> -</ol> -<h3 id="update-a-part-property">Update a part property</h3> -<p>In this example we will update a part&rsquo;s description by getting the current metadata for the part, and then posting an update to that metadata.</p> -<ol> -<li> -<p>Get your document information:</p> -<p>Make a copy of <a href="https://cad.onshape.com/documents/e60c4803eaf2ac8be492c18e/w/d2558da712764516cc9fec62/e/958bceb5a2511b572dbbe851">this public document</a>. Make a note of the new document&rsquo;s document ID, workspace ID, and element ID.</p> -</li> -<li> -<p>Get the ID of the part to update:</p> -<p>Call the <a href="https://cad.onshape.com/glassworks/explorer/#/Part/getPartsWMVE">Part/getPartsWMVE</a> API on your copied document to get a list of part IDs in the element. Only one part exists in the document, with a part ID of <code>JHD</code>.</p> -<pre tabindex="0"><code>{ -&#34;name&#34;: &#34;Main&#34;, -... -&#34;microversionId&#34;: &#34;{mid}&#34;, -&#34;partNumber&#34;: null, -&#34;elementId&#34;: &#34;{eid}&#34;, -&#34;partId&#34;: &#34;JHD&#34;, -&#34;bodyType&#34;: &#34;sheet&#34;, -... -} -</code></pre></li> -<li> -<p>Get the metadata of the part:</p> -<p>We&rsquo;ll call the <a href="https://cad.onshape.com/glassworks/explorer/#/Metadata/getWMVEPMetadata">Metadata/getWMVEPMetadata</a> endpoint to get the current metadata JSON for the part. Don&rsquo;t forget to replace the URL parameters with the IDs from your copied document, and replace <code>CREDENTIALS</code> with your authorization credentials.</p> -<pre tabindex="0"><code>curl -X &#39;GET&#39; \ -&#39;https://cad.onshape.com/api/v6/metadata/d/{did}/w/{wid}/e/{eid}/p/JHD?rollbackBarIndex=-1&amp;inferMetadataOwner=false&amp;includeComputedProperties=true&amp;includeComputedAssemblyProperties=false&amp;thumbnail=false&#39; \ --H &#39;accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; \ --H &#39;Content-Type: application/json;charset=UTF-8; qs=0.09&#39; -</code></pre></li> -<li> -<p>Locate the property to update in the response:</p> -<p>The call returns a response body in JSON format. Scroll to the <code>Description</code> properties block of the JSON response, and notice that the <code>value</code> field is an empty string.</p> -<pre tabindex="0"><code>... -{ -&#34;name&#34;: &#34;Description&#34;, -&#34;value&#34;: &#34;&#34;, -&#34;defaultValue&#34;: null, -&#34;computedPropertyError&#34;: null, -&#34;propertySource&#34;: 3, -&#34;validator&#34;: { }, -&#34;required&#34;: false, -&#34;editable&#34;: true, -&#34;propertyId&#34;: &#34;{propertyId}&#34;, -&#34;editableInUi&#34;: true, -&#34;dateFormat&#34;: null, -&#34;valueType&#34;: &#34;STRING&#34;, -&#34;enumValues&#34;: null, -&#34;multivalued&#34;: false, -&#34;computedAssemblyProperty&#34;: false, -&#34;computedProperty&#34;: false, -&#34;propertyOverrideStatus&#34;: 0 -}, -... -</code></pre></li> -<li> -<p>Find the metadata&rsquo;s property ID:</p> -<p>Copy Description&rsquo;s <code>propertyId</code>. We&rsquo;ll need this ID to update the metadata.</p> -</li> -<li> -<p>Set up the <a href="https://cad.onshape.com/glassworks/explorer/#/Metadata/updateWVEPMetadata">Metadata/updateWVEPMetadata</a> call:</p> -<pre tabindex="0"><code>curl -X &#39;POST&#39; \ -&#39;https://cad.onshape.com/api/v6/metadata/d/{did}/w/{wid}/e/{eid}/p/JHD?rollbackBarIndex=-1&#39; \ --H &#39;accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; \ --H &#39;Content-Type: application/json;charset=UTF-8; qs=0.09&#39; \ -</code></pre></li> -<li> -<p>Add the request JSON to the call:</p> -<p>Note that we need to include the <code>jsonType</code>, the <code>partId</code>, the <code>propertyId</code>, and the value to update.</p> -<pre tabindex="0"><code>-d &#39;{ -&#34;jsonType&#34;: &#34;metadata-part&#34;, -&#34;partId&#34;: &#34;JHD&#34;, -&#34;properties&#34;: [ -{ -&#34;value&#34;: &#34;&#34;, -&#34;propertyId&#34;: &#34;{propertyId}&#34; -} -] -}&#39; -</code></pre></li> -<li> -<p>Add the new property information:</p> -<p>In the request JSON, change the empty Description <code>value</code> string to <code>&quot;Drill bit&quot;</code>:</p> -<pre tabindex="0"><code>-d &#39;{ -&#34;jsonType&#34;: &#34;metadata-part&#34;, -&#34;partId&#34;: &#34;JHD&#34;, -&#34;properties&#34;: [ -{ -&#34;value&#34;: &#34;Drill bit&#34;, -&#34;propertyId&#34;: &#34;{propertyId}&#34; -} -] -}&#39; -</code></pre></li> -<li> -<p>POST the new metadata:</p> -<p>Don&rsquo;t forget to replace the URL parameters and <code>CREDENTIALS</code> with your information.</p> -<pre tabindex="0"><code>curl -X &#39;POST&#39; \ -&#39;https://cad.onshape.com/api/v6/metadata/d/{did}/w/{wid}/e/{eid}/p/JHD?rollbackBarIndex=-1&#39; \ --H &#39;accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; \ --H &#39;Content-Type: application/json;charset=UTF-8; qs=0.09&#39; \ --d &#39;{ -&#34;jsonType&#34;: &#34;metadata-part&#34;, -&#34;partId&#34;: &#34;JHD&#34;, -&#34;properties&#34;: [ -{ -&#34;value&#34;: &#34;Drill bit&#34;, -&#34;propertyId&#34;: &#34;{propertyId}&#34; -} -] -}&#39; -</code></pre></li> -<li> -<p>Confirm your changes:</p> -<p>Repeat steps 3 and 4 to confirm that the Description <code>value</code> for the part is now <code>Drill bit</code>.</p> -</li> -</ol> -<h3 id="update-a-tab-name">Update a tab name</h3> -<p>In this example we will update an element&rsquo;s tab name by getting the current metadata for the element, and then posting an update to that metadata. Remember that in Onshape, an element is typically represented as a tab in the Onshape UI.</p> -<ol> -<li> -<p>Get your document information:</p> -<p>Make a copy of <a href="https://cad.onshape.com/documents/e60c4803eaf2ac8be492c18e/w/d2558da712764516cc9fec62/e/4561b91a53c595c0010d5cdb">this public document</a>. Make a note of the new document&rsquo;s document ID, workspace ID, and element ID. Note the tab name of the element is &ldquo;NEW_PART&rdquo;.</p> -<p></br><img src="https://onshape-public.github.io/images/metadata-update-tab-before.png" alt="Onshape document with NEW_PART tab name" width=950></p> -</li> -<li> -<p>Get the metadata of the element:</p> -<p>We&rsquo;ll call the <a href="https://cad.onshape.com/glassworks/explorer/#/Metadata/getWMVEMetadata">Metadata/getWMVEMetadata</a> endpoint to get the current metadata JSON for the element. Don&rsquo;t forget to replace the URL parameters with the IDs from your copied document, and replace <code>CREDENTIALS</code> with your authorization credentials.</p> -<pre tabindex="0"><code>curl -X &#39;GET&#39; \ -&#39;https://cad.onshape.com/api/v6/metadata/d/{did}/w/{wid}/e/{eid}&#39; \ --H &#39;accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; \ --H &#39;Content-Type: application/json;charset=UTF-8; qs=0.09&#39; -</code></pre></li> -<li> -<p>Locate the property to update in the response:</p> -<p>The call returns a response body in JSON format. Scroll to the <code>Name</code> properties block of the JSON response, and notice that the <code>value</code> field matches our current tab name, &ldquo;NEW_PART&rdquo;.</p> -<pre tabindex="0"><code>{ -&#34;jsonType&#34;: &#34;metadata-element&#34;, -&#34;elementType&#34;: 0, -&#34;mimeType&#34;: &#34;onshape/partstudio&#34;, -&#34;elementId&#34;: &#34;{eid}&#34;, -&#34;properties&#34;: [ -{ -&#34;name&#34;: &#34;Name&#34;, -&#34;value&#34;: &#34;NEW_PART&#34;, -&#34;validator&#34;: {}, -&#34;required&#34;: true, -&#34;editable&#34;: true, -&#34;propertyId&#34;: &#34;{propertyId}&#34;, -}, -... -], -... -} -</code></pre></li> -<li> -<p>Find the metadata&rsquo;s property ID:</p> -<p>Copy the Name block&rsquo;s <code>propertyId</code> in the response. We&rsquo;ll need this ID to update the metadata.</p> -</li> -<li> -<p>Set up the <a href="https://cad.onshape.com/glassworks/explorer/#/Metadata/updateWVEMetadata">updateWVEMetadata</a> call:</p> -<pre tabindex="0"><code>curl -X &#39;POST&#39; \ -&#39;https://cad.onshape.com/api/v6/metadata/d/{did}/w/{wid}/e/{eid}&#39; \ --H &#39;accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; \ --H &#39;Content-Type: application/json;charset=UTF-8; qs=0.09&#39; \ -</code></pre></li> -<li> -<p>Add the request JSON to the call:</p> -<p>Note that we need to include the <code>propertyId</code> and the value to update.</p> -<pre tabindex="0"><code>-d &#39;{ -&#34;properties&#34;: [ -{ -&#34;value&#34;: &#34;&#34;, -&#34;propertyId&#34;: &#34;{propertyId}&#34; -} -] -}&#39; -</code></pre></li> -<li> -<p>Add the new property information:</p> -<p>In the request JSON, replace <code>{propertyId}</code> with the property ID you found in Step 4, then change the empty <code>value</code> string to <code>&quot;PISTON&quot;</code>:</p> -<pre tabindex="0"><code>-d &#39;{ -&#34;properties&#34;: [ -{ -&#34;value&#34;: &#34;PISTON&#34;, -&#34;propertyId&#34;: &#34;{propertyId}&#34; -} -] -}&#39; -</code></pre></li> -<li> -<p>POST the new metadata:</p> -<p>Don&rsquo;t forget to replace the URL parameters and <code>CREDENTIALS</code> with your information.</p> -<pre tabindex="0"><code>curl -X &#39;POST&#39; \ -&#39;https://cad.onshape.com/api/v6/metadata/d/{did}/w/{wid}/e/{eid}&#39; \ --H &#39;accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; \ --H &#39;Content-Type: application/json;charset=UTF-8; qs=0.09&#39; \ --d &#39;{ -&#34;properties&#34;: [ -{ -&#34;value&#34;: &#34;PISTON&#34;, -&#34;propertyId&#34;: &#34;{propertyId}&#34; -} -] -}&#39; -</code></pre></li> -<li> -<p>Confirm your changes:</p> -<p>Open your document and confirm that the tab name is now <code>PISTON</code>.</p> -<p></br><img src="https://onshape-public.github.io/images/metadata-update-tab-after.png" alt="Onshape document with NEW_PART tab name" width=950></p> -</li> -</ol> -<h2 id="additional-resources">Additional Resources</h2> -<ul> -<li><a href="https://cad.onshape.com/glassworks/explorer/#/Metadata">API Explorer: Metadata</a></li> -<li><a href="https://onshape-public.github.io/docs/api-intro/explorer">API Guide: API Explorer</a></li> -</ul>Docs: Response Codeshttps://onshape-public.github.io/docs/api-adv/errors/Wed, 03 Apr 2024 00:00:00 +0000https://onshape-public.github.io/docs/api-adv/errors/ -<p>This page details some of the response codes that may be returned by Onshape API endpoints. For each response code, we&rsquo;ve provided a brief description of the response and recommended next steps.</p> -<h2 id="success-2xx">Success (2xx)</h2> -<p>The client call was successful.</p> -<h3 id="200---ok">200 - OK</h3> -<p>The client call was successful. No action needed.</p> -<h3 id="204---no-content">204 - No Content</h3> -<p>The client call was successful, and there&rsquo;s nothing to return in the response body. The empty response body cannot be parsed.</p> -<h2 id="redirect-3xx">Redirect (3xx)</h2> -<h3 id="307---temporary-redirect">307 - Temporary Redirect</h3> -<p>The client call was successful, and a redirection URL was returned. Follow the URL provided in the response.</p> -<h2 id="client-error-4xx">Client Error (4xx)</h2> -<p>There’s an error with the client request. Find the error code below, and follow the instructions for resolution.</p> -<h3 id="400---bad-request">400 - Bad Request</h3> -<p>The request cannot be processed by the server due a client-side error. This could be a malformed request syntax or other issue. Check the request parameters (GET and POST) and request body (POST) to determine the cause of the failure.</p> -<h3 id="401---unauthorized">401 - Unauthorized</h3> -<p>The request failed the authentication/authorization checks. This could mean that the client is not logged in, API keys are invalid, OAuth failed, etc. Make sure the client is <a href="https://onshape-public.github.io/docs/auth/">authenticated</a>.</p> -<h3 id="403---forbidden">403 - Forbidden</h3> -<p>The client doesn’t have the correct permissions to perform this operation. Check that the <a href="https://onshape-public.github.io/docs/auth/">API Keys or OAuth authentication</a> have sufficient permissions to perform the operation. For example, POST operations typically require <code>write</code> scope; if the API Key was created with only <code>read</code> scope, the server will return a 403 error.</p> -<p>You might also need to check document and user permissions. For more details, see <a href="https://cad.onshape.com/help/Content/sharedocuments.htm">Share Documents</a> (for everyone) and <a href="https://cad.onshape.com/help/Content/EnterpriseHelp/Content/permission_schemes.htm">Understanding and Administering Project Roles and Permission Schemes</a> (for Enterprise users and administrators).</p> -<h3 id="404---not-found">404 - Not Found</h3> -<p>The server can’t find what the client is looking for. For example, a 404 error will be returned if the client tries to make a GET request for a document that doesn’t exist.</p> -<h3 id="405---method-not-allowed">405 - Method Not Allowed</h3> -<p>Use of that method is not supported. For example, you cannot perform a DELETE request on a document version, because versions are read-only. Only GET requests on document versions are allowed.</p> -<h3 id="406----not-acceptable">406 - Not Acceptable</h3> -<p>The server cannot provide a response for the media type requested. See <a href="https://datatracker.ietf.org/doc/html/rfc2616#section-6.1.1">https://datatracker.ietf.org/doc/html/rfc2616#section-6.1.1</a>.</p> -<h3 id="409---conflict">409 - Conflict</h3> -<p>The client call includes duplicate values, causing a conflict. Modify the request to remove any conflicting values.</p> -<h3 id="415---media-type-not-supported">415 - Media Type Not Supported</h3> -<p>The client call includes unsupported data types or invalid JSON. Review the client code. When performing data imports and exports, follow all <a href="https://onshape-public.github.io/docs/api-adv/translation/">Translation guidelines</a> to ensure all media and file types are supported.</p> -<h3 id="429---too-many-requests">429 - Too Many Requests</h3> -<p>The client sent too many requests to a particular endpoint in a given time window. The number of requests allowed per time window vary and are subject to change. Onshape does not publish this information. If the client receives HTTP 429 responses, delay and then retry, or reduce its request rate.</p> -<h3 id="499---timeout">499 - Timeout</h3> -<p>This call is taking too long. Please try again later.</p> -<h2 id="server-error-5xx">Server Error (5xx)</h2> -<p>There’s an error with the Onshape servers. Find the error code below, and follow the instructions for resolution.</p> -<h3 id="500---internal-server-error">500 - Internal Server Error</h3> -<p>The request resulted in an error. Set a limit for the number of retries, and if the request continues to fail, reach out to <a href="api-support@onshape.com">support</a>.</p> -<h3 id="503---service-unavailable">503 - Service Unavailable</h3> -<p>Something is wrong with the Onshape servers. Retry after the delay specified in the response. Set a limit for the number of retries, and if the request continues to fail, reach out to <a href="api-support@onshape.com">support</a>.</p>Docs: Extensionshttps://onshape-public.github.io/docs/app-dev/extensions/Mon, 01 Jan 0001 00:00:00 +0000https://onshape-public.github.io/docs/app-dev/extensions/ -<p>This page provides information for some of the more common options for -embedding a third-party application into the Onshape interface. Onshape provides many options for embedding commands in various menus, fly-out panels, and elements. In this example, you will embed a custom web page inside a document’s right side fly-out panel. This interface will receive information from Onshape and push information from the panel back to Onshape, providing a complete, bi-directional integration scenario.</p> -<p>Please see also:</p> -<ul> -<li><a href="https://onshape-public.github.io/docs/tutorials/createextension/">Create an Extension tutorial</a>: A step-by-step walkthrough of creating an extension.</li> -<li>Create an Extension Video Sample: -<a href="https://onshape.wistia.com/medias/0ivxxngkjz?embedType=async&seo=false&videoFoam=true&videoWidth=640&wvideo=0ivxxngkjz)"><img src="https://onshape-public.github.io/images/ExtensionsVideoCard.png" style="width:5in" alt="OAuth app creation video"/></a></li> -</ul> -<h2 id="extension-types">Extension Types</h2> -<p>We can classify extensions into two high-level types. The first type embeds a UI <em>from</em> the application <em>into</em> the Onshape UI. The embedded UI is an HTTPS page displayed in an iFrame in the Onshape UI. The UI is served from the application, and can choose to make API calls to Onshape for additional information. This is exactly like the traditional tab-based applications in Onshape, except that such extensions exist at different UI locations.</p> -<p>The second type of extension embeds an action that calls a REST API <em>exposed by</em> the application <em>from</em> the Onshape UI (e.g., context menu actions and toolbar actions). These types of extensions rely on External OAuth information to authenticate and make a call where Onshape acts as a client, and the application acts as a server.</p> -<h2 id="extension-attributes">Extension Attributes</h2> -<p>Each extension exists at a specific place in the Onshape UI and works with a specific context or selection. The attributes of an extension are:</p> -<ol> -<li><strong>Name</strong>: This should be short and explicit. It will appear in the Onshape UI as a menu item, a toolbar tooltip, a collapsed panel icon tooltip, or a panel icon. It might be truncated in the UI if it is too long.</li> -<li><strong>Description</strong>: This is where the developer can record a detailed description of the extension. It does not appear in the Onshape UI, but could appear in the grant process.</li> -<li><strong>Location</strong>: This describes where the extension exists in the Onshape UI. Over time, this will cover various panels in the UI, context menus, toolbars, actions in dialogs, etc. You can see the list of currently supported locations <a href="#supported-locations-and-contexts">here</a>. -<ul> -<li>Please note that you can create only one element tab extension per application.</li> -</ul> -</li> -<li><strong>Context</strong> (selection): Some locations will work in the context of a selection. Let’s say the application developer wants to show some information from a third-party system, pertinent only to parts (not assemblies or drawings). In this scenario, the developer would choose a location like ‘Document list info panel’, and the context as ‘Selected part’. If the user searches for something in the document list, some documents, Part Studios, parts, and Assemblies would be returned. This extension will show up in the Info panel only if the selected entity is a part. Using context enables application developers to control when the extension is displayed. Check the list of contexts available for different locations <a href="#supported-locations-and-contexts">here</a>.</li> -<li><strong>Action URL</strong>: Locations that embed a UI use the action URL to define the address of the page to display. The action URL is used to specify the REST endpoint if the location is an action (context menu, toolbar item, action in dialog etc.) and the action type is GET or POST. If the location is an action and the action is ‘Open in new window’, the action URL is the URL to open in the new window.<br> -The action URL can be parameterized to pass information from Onshape to the application. The action URL replaces attributes in the format {$attribute} with the appropriate value. These attributes can be used to identify the selected entity and/or make calls back to Onshape via the API. The currently supported attributes are: -<ul> -<li><code>{$documentId}</code> - The Onshape ID for the current or selected document.</li> -<li><code>{$workspaceOrVersion}</code> - This will be either <code>w</code> or <code>v</code> for workspace or version respectively depending on current opened document state or selection.</li> -<li><code>{$workspaceOrVersionId}</code> - The Onshape ID for the current or selected workspace or version.</li> -<li><code>{$workspaceId}</code> - Use <code>{$workspaceOrVersionId}</code> instead.</li> -<li><code>{$versionId}</code> - Use <code>{$workspaceOrVersionId}</code> instead.</li> -<li><code>{$microversionId}</code> - The Onshape ID for the current or select document microversion.</li> -<li><code>{tabElementId}</code> - The Onshape ID for the current tab.</li> -<li><code>{$elementId}</code> - The Onshape ID for the current or selected element.</li> -<li><strong>Note</strong>: In most cases, <code>tabElementId</code> and <code>elementId</code> will be the same. However, when creating an extension with the <code>Selected instance</code> context, <code>tabElementId</code> indicates the current tab (i.e., the target element), and <code>elementId</code> indicates the tab from which the instance/subassembly was inserted (i.e., the source element).</li> -<li><code>{$partId}</code> - The Onshape ID for the current or selected part.</li> -<li><code>{$partNumber}</code> - The Part number property for the current or selected part, assembly or drawing.</li> -<li><code>{$revision}</code> - The Revision property for the current or selected part, assembly or drawing.</li> -<li><code>{$companyId}</code> - The ID for the company that owns the document.</li> -<li><code>{$mimeType}</code> - The mime type if the current or selected element is a blob.</li> -<li><code>{$featureId}</code> - In case of feature selected in the Feature list in a Part Studio.</li> -<li><code>{$nodeId}</code> - In case of mate or mate feature selected in the Assembly list.</li> -<li><code>{$occurrencePath}</code> - In case of part instances, mates, mate connectors and sub assemblies.</li> -<li><code>{$configuration}</code> - In case of extensions inside the document, this attribute will be replaced by current element active configuration.</li> -</ul> -</li> -</ol> -<p>The attributes can exist as path parameters or query parameters or attributes in the POST body. For example:</p> -<pre tabindex="0"><code>[https://whispering-sea-42267.herokuapp.com/oauthSignin?documentId={$documentId}&amp;workspaceOrVersion={workspaceOrVersion}&amp;workspaceOrVersionId={$workspaceOrVersionId}&amp;elementId={$elementId}&amp;partId={$partId}&amp;server=https://cad.onshape.com&amp;companyId=cad&amp;userId=5f1eba76c14a434817d9c588&amp;locale=en-US](https://whispering-sea-42267.herokuapp.com/oauthSignin?documentId=%7B$documentId%7D&amp;workspaceId=%7B$workspaceId%7D&amp;elementId=%7B$elementId%7D&amp;partId=%7B$partId) -</code></pre><p>or</p> -<pre tabindex="0"><code>[https://cad.onshape.com/api/partstudios/d/{$documentId}/{$workspaceOrVersion}/{$workspaceOrVersionId}/e/{$elementId}/stl?server=https://cad.onshape.com&amp;companyId=cad&amp;userId=5f1eba76c14a434817d9c588&amp;locale=en-US](https://cad.onshape.com/api/partstudios/d/%7B$documentId%7D/w/%7B$workspaceId%7D/e/%7B$elementId%7D/stl) -</code></pre><p>The attributes available for replacement differ by location and context selection. You can see the available attributes for each location <a href="#supported-locations-and-contexts">here</a>.</p> -<p>The <strong>timeout</strong> for <code>action_url</code> of type <code>GET</code> or <code>POST</code> is <strong>180 seconds</strong>.</p> -<ol start="6"> -<li> -<p><strong>Action type</strong>: The action type is only applicable for locations that act as actions and not for locations that embed UIs. Check if action type is valid for a location <a href="#supported-locations-and-contexts">here</a>. The supported action types are:</p> -<ul> -<li><code>GET</code> - This makes a GET API call using the action URL. Parameter replacement is done on the action URL.</li> -<li><code>POST</code> - This makes a POST API call using the action URL and the action body as the post body. Parameter replacement is done on both the action URL and the action body.</li> -<li><code>Open in new window</code> - This opens the action URL in a new browser window. Parameter replacement is done on the action URL.</li> -</ul> -</li> -<li> -<p><strong>Action body</strong>: This is only applicable if the action type is POST. The action body is passed in a POST API call and must be in a valid json format.</p> -</li> -<li> -<p><strong>Show response</strong>: This is only applicable if the action type is GET or POST. If this is checked, the UI will wait for a response and show the response in a dialog in the UI. The response must be in a valid json format.</p> -</li> -<li> -<p><strong>Icon</strong>: The icon will be shown where the extension exists. This can be an icon in an Info panel, context menu action, toolbar button, action button in a dialog, or other supported locations.</p> -</li> -</ol> -<h2 id="supported-locations-and-contexts">Supported Locations and Contexts</h2> -<p>This is the list of supported locations, their valid contexts, and whether they support action types.</p> -<h3 id="element-context-menu">Element context menu</h3> -<p>This is the context menu for elements.</p> -<p><img src="https://onshape-public.github.io/images/extensionsimage04.png" alt="image alt text"></p> -<p>Supported contexts:</p> -<ul> -<li><code>Part Studio</code></li> -<li><code>Assembly</code></li> -<li><code>Drawing</code></li> -<li><code>Blob element</code></li> -</ul> -<p>Supported parameters for replacements:</p> -<ul> -<li><code>{$documentId}</code></li> -<li><code>{$workspaceOrVersion}</code></li> -<li><code>{$workspaceOrVersionId}</code></li> -<li><code>{$workspaceId}</code> DEPRECATED</li> -<li><code>{$versionId}</code> DEPRECATED</li> -<li><code>{$elementId}</code></li> -<li><code>{$partNumber}</code></li> -<li><code>{$mimeType}</code></li> -<li><code>{$configuration}</code></li> -</ul> -<p>Default parameters as query string:</p> -<ul> -<li><code>server</code></li> -<li><code>companyId</code> - Default value is ‘cad’. If the document owner is company/enterprise, then the value is company/enterprise ID.</li> -<li><code>userId</code></li> -<li><code>locale</code></li> -<li><code>clientId</code></li> -</ul> -<p>This location supports action types.</p> -<h3 id="tree-context-menu">Tree context menu</h3> -<p>This is the context menu for the part tree, assembly tree and feature tree in part studios.</p> -<p><img src="https://onshape-public.github.io/images/extensionsimage05.png" alt="image alt text"></p> -<p>Supported contexts:</p> -<ul> -<li><code>Part</code></li> -<li><code>Sub assembly</code></li> -<li><code>Feature</code></li> -<li><code>Mate</code></li> -<li><code>Mate feature</code></li> -<li><code>Instance</code></li> -</ul> -<p>Supported parameters for replacement:</p> -<ul> -<li><code>{$documentId}</code></li> -<li><code>{$workspaceOrVersion}</code></li> -<li><code>{$workspaceOrVersionId}</code></li> -<li><code>{$workspaceId}</code> DEPRECATED</li> -<li><code>{$versionId}</code> DEPRECATED</li> -<li><code>{$elementId}</code></li> -<li><code>{$partNumber}</code></li> -<li><code>{$revision}</code></li> -<li><code>{$featureId}</code></li> -<li><code>{$nodeId}</code></li> -<li><code>{$occurrencePath}</code></li> -<li><code>{$configuration}</code></li> -</ul> -<p>Default parameters as query string:</p> -<ul> -<li><code>server</code></li> -<li><code>companyId</code> - Default value is ‘cad’. If the document owner is company/enterprise, then the value is company/enterprise ID.</li> -<li><code>userId</code></li> -<li><code>locale</code></li> -<li><code>clientId</code></li> -</ul> -<p>This location supports action types.</p> -<h3 id="document-list-context-menu">Document list context menu</h3> -<p>This the context menu available on items in the document list. This is normally documents but can be multiple types based on search results.</p> -<p><img src="https://onshape-public.github.io/images/extensionsimage06.png" alt="image alt text"></p> -<p>Supported contexts:</p> -<ul> -<li><code>Part</code></li> -<li><code>Document</code></li> -<li><code>Part Studio</code></li> -<li><code>Assembly</code></li> -<li><code>Drawing</code></li> -<li><code>Blob element</code></li> -</ul> -<p>Supported parameters for replacement:</p> -<ul> -<li><code>{$documentId}</code></li> -<li><code>{$workspaceOrVersion}</code></li> -<li><code>{$workspaceOrVersionId}</code></li> -<li><code>{$workspaceId}</code> DEPRECATED</li> -<li><code>{$versionId}</code> DEPRECATED</li> -<li><code>{$elementId}</code></li> -<li><code>{$partNumber}</code></li> -<li><code>{$revision}</code></li> -<li><code>{$configuration}</code></li> -</ul> -<p>Default parameters as query string:</p> -<ul> -<li><code>server</code></li> -<li><code>companyId</code> - Default value is ‘cad’. If the document owner is company/enterprise, then the value is company/enterprise ID.</li> -<li><code>userId</code></li> -<li><code>locale</code></li> -<li><code>clientId</code></li> -</ul> -<p>This location supports action types.</p> -<h3 id="document-list-info-panel">Document list info panel</h3> -<p>This is the Info panel to the right in the document list. The document list normally contains documents, but can contain other entities as the result of a search.</p> -<p><img src="https://onshape-public.github.io/images/extensionsimage07.png" alt="image alt text"></p> -<p>Supported contexts:</p> -<ul> -<li><code>Part</code></li> -<li><code>Document</code></li> -<li><code>Part Studio</code></li> -<li><code>Assembly</code></li> -<li><code>Drawing</code></li> -<li><code>Blob element</code></li> -</ul> -<p>Supported parameters for replacement:</p> -<ul> -<li><code>{$documentId}</code></li> -<li><code>{$workspaceOrVersion}</code></li> -<li><code>{$workspaceOrVersionId}</code></li> -<li><code>{$workspaceId}</code> DEPRECATED</li> -<li><code>{$versionId}</code> DEPRECATED</li> -<li><code>{$elementId}</code></li> -<li><code>{$partId}</code></li> -</ul> -<p>Default parameters as query string:</p> -<ul> -<li><code>server</code></li> -<li><code>companyId</code> - Default value is ‘cad’. If the document owner is company/enterprise, then the value is company/enterprise ID.</li> -<li><code>userId</code></li> -<li><code>locale</code></li> -<li><code>clientId</code></li> -</ul> -<p>This location does NOT support action types.</p> -<h3 id="element-right-panel">Element right panel</h3> -<p>This is the panel inside a document. It currently houses the BOM, configurations, etc. Applications can use this extension location to add items in this panel.</p> -<p><img src="https://onshape-public.github.io/images/extensionsimage08.png" alt="image alt text"></p> -<p>Supported contexts:</p> -<ul> -<li><code>Part</code></li> -<li><code>Document</code></li> -<li><code>Part Studio</code></li> -<li><code>Assembly</code></li> -<li><code>Sub assembly</code></li> -<li><code>Feature</code></li> -<li><code>Mate</code></li> -<li><code>Mate feature</code></li> -</ul> -<p>Supported parameters for replacement:</p> -<ul> -<li><code>{$documentId}</code></li> -<li><code>{$workspaceOrVersion}</code></li> -<li><code>{$workspaceOrVersionId}</code></li> -<li><code>{$workspaceId}</code> DEPRECATED</li> -<li><code>{$versionId}</code> DEPRECATED</li> -<li><code>{$elementId}</code></li> -<li><code>{$partNumber}</code></li> -<li><code>{$revision}</code></li> -<li><code>{$featureId}</code></li> -<li><code>{$nodeId}</code></li> -<li><code>{$occurrencePath}</code></li> -<li><code>{$configuration}</code></li> -</ul> -<p>Default parameters as query string:</p> -<ul> -<li><code>server</code></li> -<li><code>companyId</code> - Default value is ‘cad’. If the document owner is company/enterprise, then the value is company/enterprise ID.</li> -<li><code>userId</code></li> -<li><code>locale</code></li> -<li><code>clientId</code></li> -</ul> -<p>This location does NOT support action types.</p> -<h3 id="new-element-tab">New Element tab</h3> -<p>This is the menu option for <code>+ menu -&gt; Add application</code> inside a document . After menu click, a new tab will be created with the action url associated with this extension.</p> -<p><img src="https://onshape-public.github.io/images/extensionsimage09.png" alt="image alt text"></p> -<p>Supported contexts:</p> -<ul> -<li>There are no supported contexts.</li> -</ul> -<p>Supported parameters for replacement:</p> -<ul> -<li>Parameter replacement not supported.</li> -</ul> -<p>Default parameters as query string:</p> -<ul> -<li><code>documentId</code></li> -<li><code>workspaceId</code></li> -<li><code>versionId</code></li> -<li><code>elementId</code></li> -<li><code>server</code></li> -<li><code>companyId</code> - Default value is ‘cad’. If the document owner is company/enterprise, then the value is company/enterprise ID.</li> -<li><code>userId</code></li> -<li><code>locale</code></li> -<li><code>clientId</code></li> -</ul> -<p>This location supports action types.</p> -<h3 id="part-number-generator">Part number generator</h3> -<p>This extension helps partners to embed their own custom part number generation scheme in Onshape. Each application can have only one extension of this type. Once defined, these extensions are listed as one of the part numbering schemes in the release management configuration in Company settings.</p> -<p><img src="https://onshape-public.github.io/images/extensionsimage10.png" alt="image alt text"></p> -<p>In the above screen shot, ‘Part number generation scheme’ is the user-defined name of the extension.</p> -<p>Supported contexts:</p> -<ul> -<li>There are no supported contexts.</li> -</ul> -<p>Supported parameters for replacement:</p> -<ul> -<li>Parameter replacement is not supported.</li> -</ul> -<p>Default parameters as query string:</p> -<ul> -<li>No default query parameters</li> -</ul> -<p>Action URL defined by the user is assumed to be a POST API. This API should consume a predefined request body as shown below. This definition may have additional attributes in future.</p> -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-js" data-lang="js"><span style="display:flex;"><span> [ -</span></span><span style="display:flex;"><span> { -</span></span><span style="display:flex;"><span> <span style="color:#a50">&#34;id&#34;</span> : &lt;internal part number id&gt;, -</span></span><span style="display:flex;"><span> <span style="color:#a50">&#34;documentId&#34;</span> : &lt;documentId&gt;, -</span></span><span style="display:flex;"><span> <span style="color:#a50">&#34;elementId&#34;</span> : &lt;elementId&gt;, -</span></span><span style="display:flex;"><span> <span style="color:#a50">&#34;workspaceId&#34;</span> : &lt;workspaceId&gt;, -</span></span><span style="display:flex;"><span> <span style="color:#a50">&#34;elementType&#34;</span> : &lt;elementType&gt;, -</span></span><span style="display:flex;"><span> <span style="color:#a50">&#34;partId&#34;</span> : &lt;partId&gt;, -</span></span><span style="display:flex;"><span> <span style="color:#a50">&#34;companyId&#34;</span> : &lt;companyId&gt;, <span style="color:#aaa;font-style:italic">// Id of the company that owns the document, else the text “cad” -</span></span></span><span style="display:flex;"><span><span style="color:#aaa;font-style:italic"></span> <span style="color:#a50">&#34;partNumber&#34;</span> : &lt;current part number&gt;, -</span></span><span style="display:flex;"><span> <span style="color:#a50">&#34;configuration&#34;</span> : &lt;configuration string&gt;, -</span></span><span style="display:flex;"><span> <span style="color:#a50">&#34;categories&#34;</span> : &lt;array <span style="color:#00a">of</span> category ids and names&gt; <span style="color:#aaa;font-style:italic">// [ { &#34;id&#34;: &lt;String&gt;, &#34;name&#34;: &lt;string&gt; } ] -</span></span></span><span style="display:flex;"><span><span style="color:#aaa;font-style:italic"></span> } -</span></span><span style="display:flex;"><span> ] -</span></span></code></pre></div><p><strong>Note</strong>: Categories are only passed from the Release dialog and properties dialogs for now. They are empty when part number generation is called from the BOM table or configuration table.</p> -<p>Expected response sent to Onshape is as follows:</p> -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-js" data-lang="js"><span style="display:flex;"><span> [ -</span></span><span style="display:flex;"><span> { -</span></span><span style="display:flex;"><span> <span style="color:#a50">&#34;id&#34;</span> : &lt;internal part number id&gt;, -</span></span><span style="display:flex;"><span> <span style="color:#a50">&#34;documentId&#34;</span> : &lt;documentId&gt;, -</span></span><span style="display:flex;"><span> <span style="color:#a50">&#34;elementId&#34;</span> : &lt;elementId&gt;, -</span></span><span style="display:flex;"><span> <span style="color:#a50">&#34;workspaceId&#34;</span> : &lt;workspaceId&gt;, -</span></span><span style="display:flex;"><span> <span style="color:#a50">&#34;elementType&#34;</span> : &lt;elementType&gt;, -</span></span><span style="display:flex;"><span> <span style="color:#a50">&#34;partId&#34;</span> : &lt;partId&gt;, -</span></span><span style="display:flex;"><span> <span style="color:#a50">&#34;partNumber&#34;</span> : &lt;next part number generated by third party numbering scheme&gt; -</span></span><span style="display:flex;"><span> } -</span></span><span style="display:flex;"><span> ] -</span></span></code></pre></div><p>Third-party applications can simply fill the <code>&quot;partNumber&quot;</code> attribute with the part number generated by the custom numbering scheme and send it as a response. However, the response should at least contain <code>&quot;id&quot;</code> and <code>&quot;partNumber&quot;</code> as highlighted above; other attributes are optional.</p> -<p>Custom numbering schemes for part generation, once set in the Release management page, can be invoked from all the places where we set part numbers, including the Release candidate dialog shown below:</p> -<p><img src="https://onshape-public.github.io/images/extensionsimage11.png" alt="image alt text"></p> -<h2 id="sample-code">Sample code</h2> -<p>We have provided a sample application that supports the features described in this document.</p> -<p>The source code for this <code>Inventory management</code> application can be found <a href="https://github.com/onshape-public/inventory-oauth2-app">in our public GitHub repository</a>.</p> -<p>The instructions to install and the application are available in the <code>README.md</code> file in the repository.</p> -<p>The application is built on the Passport node module. It is based on this <a href="http://scottksmith.com/blog/2014/05/02/building-restful-apis-with-node/">article</a>. Please read the article before proceeding with this section.</p> -<p>Some structural information about the application:</p> -<ul> -<li>The dependencies are defined in <code>package.json</code></li> -<li>The routing for inbound calls is defined in <code>server.js</code>. This includes routing for OAuth2 calls as well as calls for the rest APIs we expose that Onshape can call via the extensions.</li> -<li>The OAuth2 calls are routed to <code>controllers/oauth2.js</code>. These include calls to authenticate as calls to get the bearer token.</li> -<li><code>controllers/oauth2.js</code> uses <code>controllers/auth.js</code> to interact with Passport to manage the authentication and storage.</li> -<li>Other API calls to get part number, etc, route to the appropriate controller in the controllers directory.</li> -<li>The controllers use the model defined in the model directory.</li> -</ul> -<p>The application is defined in the Developer Portal with extensions that use the exposed APIs.</p> -<p>The following screenshots define the base configuration of the application and some of the sample extensions.</p>Docs: Client Messaginghttps://onshape-public.github.io/docs/app-dev/clientmessaging/Mon, 01 Jan 0001 00:00:00 +0000https://onshape-public.github.io/docs/app-dev/clientmessaging/ -<p>Application extensions and the Onshape JavaScript web client need to communicate directly, calling across the iframe containing the application extension using post message.</p> -<p><img src="https://onshape-public.github.io/images/javascriptpostmessageimage00.png" alt="image alt text"></p> -<p>Onshape Client Messaging examples can be split into those that are initiated from the <em>application extension</em> and those that are initiated from the <em>Onshape client</em>.</p> -<h2 id="messages-from-the-extension">Messages from the Extension</h2> -<p>These Client Messaging examples can be initiated from the application extension:</p> -<ul> -<li><strong>Click/close flyouts events</strong>: Notify the Onshape client that the user has clicked in the application extension, which should cause Onshape flyouts (versions, history, uploads, etc.) and dropdown menus (profile dropdown menu, document menu) to close. Without this, flyouts and menus might remain open over the application extension.</li> -<li><strong>Shortcut keyboard events</strong>: Shortcut keys (such as <code>?</code>, which opens the Onshape Help dialog), can be handled by the application extension by posting a message to the Onshape client to open the dialog.</li> -<li><strong>keepAlive</strong>: Notify the Onshape client that the user is actively working in the application extension, which triggers the Onshape client to send a message to the server to keep the browser session alive. Without this, the Onshape browser session will timeout and ask the user to sign in again.</li> -<li><strong>Standard Onshape dialogs</strong>: Request from the application extension to the Onshape client to open one of the Onshape standard dialogs and send the user’s choices back to the application extension. For example, if the application extension needs the user to choose a part or assembly to be operated on, the application extension can post a message to the Onshape client requesting that dialog be opened and the selected part or assembly information sent back to the application extension.</li> -<li><strong>UI customization</strong>&quot;: Request from the application extension to the Onshape client to customize the Onshape UI (e.g., add commands to menus, add buttons to the toolbars, etc). When these commands or toolbar buttons are clicked, the Onshape client posts a message to the application extension with the available context. -<ul> -<li><strong>Note</strong>: This is limited to cases where the application extension is made active by the user; application extensions are not automatically loaded when a document is opened. Most UI customizations should be done when you register the application with Onshape, as those change the Onshape client automatically without needing to load the application extension first.</li> -</ul> -</li> -<li><strong>Content/material insertion</strong>: Request from the application extension to insert content into the Onshape document. For example, insert a part into a new or existing Part Studio, apply a material to a part, add a material to a material library, etc.</li> -</ul> -<h2 id="messages-from-onshape">Messages from Onshape</h2> -<p>The following examples can be initiated from the Onshape client:</p> -<ul> -<li><strong>User action notification</strong>: The Onshape client can notify an application extension when various user actions occur. For example, the Onshape client might notify when the user has made the application extension active or inactive (when the user clicks on document tabs). When an application extension is made inactive, it is moved off the edges of the browser, so it cannot be seen, but is still active, preserving its state.</li> -<li><strong>Printing</strong>: The Onshape client can notify an application extension when the user has chosen the <strong>Print</strong> command from the main Onshape document menu, enabling the application extension to perform a print operation.</li> -</ul> -<h2 id="security-considerations">Security Considerations</h2> -<p>To ensure security, an application extension must:</p> -<ul> -<li><strong>Parse for document, workspace, and element IDs</strong>: Parse for the <code>documentId</code>, <code>workspaceId</code>, and <code>elementId</code> that were passed as query parameters within the application extension’s iframe <code>src</code> URL. You must post these back in each <code>POST</code> message.</li> -<li><strong>Parse for the server</strong>: Parse for the <code>server</code> that was passed as a query parameter within the application extension’s iframe <code>src</code> URL. You must use this to validate messages received. -<ul> -<li>If the application extension uses a JavaScript library or framework (e.g., BackboneJS or AngularJS), it can parse the query parameters and maintain state in other ways.</li> -</ul> -</li> -<li><strong>Not redirect to another base URL</strong>: The browser tells the Onshape client the origin base URL from which a <code>POST</code> message is received. The Onshape client ignores messages posted from an origin URL that doesn’t match the original iframe <code>src</code> URL. It is <em>extremely important</em> to the security of your application that you verify that the origin of all messages you receive is the same as the original server query parameter in the iframe <code>src</code> (i.e., <code>if (server === e.origin)</code>). In production operation especially, the message IS NOT SAFE if the message origin does not match the iframe <code>src</code> server query parameter. Application extensions should not redirect to another base URL after the iframe has been opened, or the messages will be ignored.</li> -<li><strong>Post a message on startup</strong>: Onshape will not post messages until a newly started application extension has first posted a valid message to Onshape. This constraint is in effect anytime an application extension is (re)started and exists to avoid posting messages to application extensions that are not ready to handle them, are not fully loaded, etc. After your application extension is fully loaded and ready to receive messages, post a message to Onshape. A <code>keepAlive</code> message is a great first message to send to Onshape. Once Onshape receives a valid message, Onshape will start posting messages to the application extension. If the application extension later sends an invalid message Onshape will stop sending messages until a valid message is posted to Onshape.</li> -</ul> -<p><code>POST</code> messages submitted by application extensions to Onshape will be ignored if any of the following are true:</p> -<ul> -<li>The documentId, workspaceId, or elementId are missing or not valid.</li> -<li>The message name is missing or not recognized.</li> -<li>The origin of the <code>POST</code> message does not match the original iframe <code>src</code> URL.</li> -</ul> -<h2 id="element-tab">Element Tab</h2> -<p>Messages may be sent and received by element tab application extensions.</p> -<p>The following messages can be <strong>sent</strong> by Element tab application extensions:</p> -<table> -<tr> -<td>messageName -(case sensitive)</td> -<td>other message properties?</td> -<td>comment</td> -</tr> -<tr> -<td>applicationInit</td> -<td>yes -<pre><code>notifyWhenSaveRequired: whether Onshape should send a notification to save pending changes during certain operations -(default is false) -</code></pre> -</td> -<td>Send once on application startup.</td> -</tr> -<tr> -<td>closeFlyoutsAndMenus</td> -<td>no</td> -<td>Send when a mouse click or other event happens in the application extension. Closes Onshape flyouts and dropdown menus.</td> -</tr> -<tr> -<td>closeSelectItemDialog</td> -<td>no</td> -<td>Closes the select item dialog.</td> -</tr> -<tr> -<td>connectionLost</td> -<td>no</td> -<td>Displays the standard Onshape connection lost message in a message bubble, forcing the user to either reload the document or return to the documents page.</td> -</tr> -<tr> -<td>errorReload</td> -<td>yes -<pre><code>message: your message -</code></pre> -</td> -<td>Similar to the connectionLost message, but enables an application to specify the first part of the message, which will be used instead of "Onshape is not connected." The user must reload the document or return to the documents page.</td> -</tr> -<tr> -<td>finishedSaving</td> -<td>yes -<pre><code>messageId: the id sent in the corresponding 'saveChanges' message -</code></pre> -</td> -<td>Response to a 'saveChanges' message sent from Onshape. Should be sent after application has cleaned up any pending edits.</td> -</tr> -<tr> -<td>keepAlive</td> -<td>no</td> -<td>Send periodically while while the user is actively working to avoid the session from timing out.</td> -</tr> -<tr> -<td>saveAVersion</td> -<td>no</td> -<td>Send when the user types “Shift-S” in the application extension, the keyboard shortcut for save a version.</td> -</tr> -<tr> -<td>showKeyboardShortcutsHelp</td> -<td>no</td> -<td>Send when the user types “?” (Shift-? on most keyboards) in the application extension, the keyboard shortcut for the keyboard shortcuts help dialog.</td> -</tr> -<tr> -<td>showMessageBubble</td> -<td>yes -<pre><code>message: your message -</code></pre> -</td> -<td>Send when you want to show a string in the blue message bubble at the top of the Onshape app.</td> -</tr> -<tr> -<td>startLoadingSpinner</td> -<td>yes -<pre><code>message: your message -</code></pre> -</td> -<td>Send to start a large spinner in the middle of the browser window with your message underneath it.</td> -</tr> -<tr> -<td>stopLoadingSpinner</td> -<td>no</td> -<td>Send to stop the large spinner.</td> -</tr> -<tr> -<td>startWorkingSpinner</td> -<td>no</td> -<td>Send to start a small spinner in the middle bottom of the browser window.</td> -</tr> -<tr> -<td>stopWorkingSpinner</td> -<td>no</td> -<td>Send to stop the small spinner.</td> -</tr> -<tr> -<td>openSelectItemDialog</td> -<td>yes -<pre><code>dialogTitle: your dialog title -(default is no title), -selectBlobs: true or false -(default is false), -selectParts: true or false -(default is false), -selectPartStudios: true or false -(default is false), -selectAssemblies: true or false -(default is false), -selectMultiple: true or false -(default is false), -selectBlobMimeTypes: ‘comma-delimited string of blob mime types to show in dialog (e.g. “application/dwt,application/dwg”)’ -(default is an empty string) -showBrowseDocuments: true or false - controls whether ‘Other documents’ choice should be available -(default is true) -showStandardContent: true or false - controls whether ‘Standard content’ choice should be available -(default is false) -</code></pre> -</td> -<td>Send when your application wants to open a dialog in which the user will select one or multiple items - blobs, parts, part studios or assemblies. -</td> -</tr> -<tr> -<td>requestCameraProperties</td> -<td>yes -<pre><code>graphicsElementId: string , Element ID of the part studio or assembly -</code></pre> -</td> -<td> -Send to request camera properties of a specific part studio or assembly element. Note: The element should have been opened at least once in the current session. The messageName of the response is cameraProperties -</td> -</tr> -</table> -<p>The following messages can be <strong>received</strong> by Element tab application extensions:</p> -<table> -<tr> -<td>messageName -(case sensitive)</td> -<td>other message properties?</td> -<td>comment</td> -</tr> -<tr> -<td>show</td> -<td>no</td> -<td>Sent when an element tab application extension is shown (made active) within the Onshape client. This message is NOT sent when the element tab application extension is created.</td> -</tr> -<tr> -<td>hide</td> -<td>no</td> -<td>Sent when an element tab application extension is made inactive within the Onshape client. This message is NOT sent when an element tab application extension is deleted.</td> -</tr> -<tr> -<td>itemSelectedInSelectItemDialog</td> -<td>yes -<pre><code>documentId: id of selected item’s document, -workspaceId: id of selected item’s workspace, empty if versionId not empty, -versionId: id of selected item’s version, empty if workspaceId not empty, -elementId: id of element selected or containing the selected part, -elementName: name of element selected or containing the selected part, -elementType: type of element selected or containing the selected part - ‘partstudio’, ‘assembly’ or ‘blob’, -elementMicroversionId: microversion id of the element, -itemType: type of item selected: ‘part’,‘partStudio’ or ‘assembly’, -partName: name of part selected, empty if itemType is not ‘part’, -idTag: id of part, empty if no part selected -</code></pre> -</td> -<td>Sent when the user selects an item (blob, part, part studio or assembly) in the select item dialog that was opened due to an openSelectItemDialog message sent earlier. -When a part is not selected, the partXxx message properties will be empty strings.</td> -</tr> -<tr> -<td>print</td> -<td>no</td> -<td>Sent when the user chooses the Print command while the application is the active element. The application can choose to handle this as either a print or an export to a PDF or other format.</td> -</tr> -<tr> -<td>selectItemDialogClosed</td> -<td>no</td> -<td>Sent when the select item dialog closes, either because the user selected an item and selectMultiple is false, or the user changed the active element or the user closed the dialog with the "X" button.</td> -</tr> -<tr> -<td>startFirstViewCommand</td> -<td>yes -<pre><code>documentId: id of selected item’s document, -workspaceId: id of selected item’s workspace, empty if versionId not empty, -versionId: id of selected item’s version, empty if workspaceId not empty, -elementId: id of element selected or containing the selected part, -elementName: name of element selected or containing the selected part, -elementType: type of element selected or containing the selected part - ‘partstudio’, ‘assembly’ or ‘blob’, -elementMicroversionId: microversion id of the element, -itemType: type of item selected: ‘part’,‘partstudio’ or ‘assembly’, -partName: name of part selected, empty if itemType is not ‘part’, -idTag: id of part -</code></pre> -</td> -<td>Sent to a drawings application extension when the drawing is created with zero views. -<p>If other types of applications need a message posted to them with creation context, contact Onshape and we can discuss using this sort of message for your application also.</td></p> -</tr> -<tr> -<td>export</td> -<td>yes -<pre><code>fileExtension: the file extension of the export type the user chose - “.dwg”, “.dxf” are the types currently supported. -baseFileName: the base portion of the expected output file. This is currently set to “&lt;document name&gt; - &lt;element name&gt;” -</code></pre> -</td> -<td>Sent when the user chooses a command to export the contents of the application to a file.</td> -</tr> -<tr> -<td>cameraProperties</td> -<td>yes -<pre><code>graphicsElementId: string , Element ID of the part studio or assembly -isValid: boolean, Indicates if the properties are valid or not. false if element ID is invalid or element has not been open in the current session -projectionType: string, Denotes the projection method. Values are ‘orthographic’, ‘perspective’ . Empty string ‘’ if isValid is false -viewMatrix: 16 element numeric matrix with elements at index 13, 14, 15 corresponding to position of the camera -projectionMatrix: 16 element numeric matrix -verticalFieldOfView: number, 0 in case of orthographic projection -viewportHeight: number, eight of the viewport -viewportWidth: number, width of the viewport -</code></pre> -</td> -<td>Sent when application posts a requestCameraProperties message</td> -</tr> -<tr> -<td>takeFocus</td> -<td>no</td> -<td>Sent when the Onshape client sets focus on the content window of the element tab application extension.</td> -</tr> -<tr> -<td>saveChanges</td> -<td>yes -<pre><code>messageId: a unique identifier for this message. Should be passed back in the 'finishedSaving' message. -</code></pre> -</td> -<td>Sent if the application specified 'notifyWhenSaveRequired' in the 'applicationInit' message. Indicates that the application should cleanup any pending edits before an Onshape process continues (i.e. version save).</td> -</tr> -</table> -<h2 id="element-right-panel">Element Right Panel</h2> -<p>Most client messaging functionality had been limited to that occurring between the Onshape client and application elements (the <strong>Element tab</strong> location). Limited functionality in now also available for client messaging to work with application extensions in the <strong>Element right panel</strong> location.</p> -<p>Enabled messaging to Element right panel extensions includes the communication of selections that the user makes for the following application extension contexts:</p> -<ul> -<li>Part Studio</li> -<li>Assembly</li> -<li>Document</li> -</ul> -<p>All <a href="#security-considerations">Security Considerations</a> above apply to both Element tab and Element right panel extensions, with the following notes:</p> -<ul> -<li>Initial message from the application extension to the Onshape client, in the form of an <code>applicationInit</code> message (or one of any other messages supported by the element right panel extensions), is required to ensure the Onshape client does not send messages to the extension until it is ready.</li> -<li>Once a valid <code>applicationInit</code> message is received by the Onshape client, it will start sending messages with the <code>messageName</code> value <code>SELECTION</code> upon user selection interactions.</li> -<li>Prior to accepting <em>any</em> message from the Onshape client as secure, the <code>origin</code> attribute value included in incoming messages must be validated as equal to the original <code>server</code> query parameter value used to load the application extension.</li> -</ul> -<h2 id="code-snippets">Code Snippets</h2> -<h3 id="parse-query-parameters">Parse query parameters</h3> -<p>This JavaScript code parses the iframe <code>src</code> query parameters and uses them to post a message:</p> -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-js" data-lang="js"><span style="display:flex;"><span> <span style="color:#00a">var</span> documentId; -</span></span><span style="display:flex;"><span> <span style="color:#00a">var</span> workspaceId; -</span></span><span style="display:flex;"><span> <span style="color:#00a">var</span> elementId; -</span></span><span style="display:flex;"><span> <span style="color:#00a">var</span> server; -</span></span><span style="display:flex;"><span> -</span></span><span style="display:flex;"><span> <span style="color:#aaa;font-style:italic">// Parse query parameters -</span></span></span><span style="display:flex;"><span><span style="color:#aaa;font-style:italic"></span> <span style="color:#00a">var</span> queryParameters = <span style="color:#0aa">decodeURIComponent</span>(<span style="color:#0aa">window</span>.location.search.substr(<span style="color:#099">1</span>)); -</span></span><span style="display:flex;"><span> <span style="color:#00a">var</span> queryParametersArray = queryParameters.split(<span style="color:#a50">&#39;&amp;&#39;</span>); -</span></span><span style="display:flex;"><span> <span style="color:#00a">for</span> (<span style="color:#00a">var</span> i = <span style="color:#099">0</span>; i &lt; queryParametersArray.length; i++) { -</span></span><span style="display:flex;"><span> <span style="color:#00a">var</span> parameterArray = queryParametersArray[i].split(<span style="color:#a50">&#39;=&#39;</span>); -</span></span><span style="display:flex;"><span> <span style="color:#00a">if</span> (parameterArray.length === <span style="color:#099">2</span>) { -</span></span><span style="display:flex;"><span> <span style="color:#00a">switch</span> (parameterArray[<span style="color:#099">0</span>]) { -</span></span><span style="display:flex;"><span> <span style="color:#00a">case</span> <span style="color:#a50">&#39;documentId&#39;</span>: -</span></span><span style="display:flex;"><span> documentId = parameterArray[<span style="color:#099">1</span>]; -</span></span><span style="display:flex;"><span> <span style="color:#00a">break</span>; -</span></span><span style="display:flex;"><span> <span style="color:#00a">case</span> <span style="color:#a50">&#39;workspaceId&#39;</span>: -</span></span><span style="display:flex;"><span> workspaceId = parameterArray[<span style="color:#099">1</span>]; -</span></span><span style="display:flex;"><span> <span style="color:#00a">break</span>; -</span></span><span style="display:flex;"><span> <span style="color:#00a">case</span> <span style="color:#a50">&#39;elementId&#39;</span>: -</span></span><span style="display:flex;"><span> elementId = parameterArray[<span style="color:#099">1</span>]; -</span></span><span style="display:flex;"><span> <span style="color:#00a">break</span>; -</span></span><span style="display:flex;"><span> <span style="color:#00a">case</span> <span style="color:#a50">&#39;server&#39;</span>: -</span></span><span style="display:flex;"><span> server = parameterArray[<span style="color:#099">1</span>]; -</span></span><span style="display:flex;"><span> <span style="color:#00a">break</span>; -</span></span><span style="display:flex;"><span> } -</span></span><span style="display:flex;"><span> } -</span></span><span style="display:flex;"><span> } -</span></span><span style="display:flex;"><span> -</span></span><span style="display:flex;"><span> <span style="color:#aaa;font-style:italic">// Listen for clicks and post a message to the Onshape client -</span></span></span><span style="display:flex;"><span><span style="color:#aaa;font-style:italic"></span> <span style="color:#0aa">document</span>.getElementById(<span style="color:#a50">&#39;&lt;id of your topmost element&gt;&#39;</span>). -</span></span><span style="display:flex;"><span> addEventListener(<span style="color:#a50">&#39;click&#39;</span>, <span style="color:#00a">function</span>() { -</span></span><span style="display:flex;"><span> <span style="color:#00a">var</span> message = {documentId: documentId, -</span></span><span style="display:flex;"><span> workspaceId: workspaceId, -</span></span><span style="display:flex;"><span> elementId: elementId, -</span></span><span style="display:flex;"><span> messageName: <span style="color:#a50">&#39;closeFlyoutsAndMenus&#39;</span>}; -</span></span><span style="display:flex;"><span> <span style="color:#0aa">window</span>.parent.postMessage(message, <span style="color:#a50">&#39;*&#39;</span>); -</span></span><span style="display:flex;"><span> }, <span style="color:#00a">true</span>); -</span></span></code></pre></div><h3 id="create-a-message-object">Create a message object</h3> -<p>The message object posted to the Onshape client is of the form:</p> -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-js" data-lang="js"><span style="display:flex;"><span>{ -</span></span><span style="display:flex;"><span> documentId: documentId, -</span></span><span style="display:flex;"><span> workspaceId: workspaceId, -</span></span><span style="display:flex;"><span> elementId: elementId, -</span></span><span style="display:flex;"><span> messageName: <span style="color:#a50">&#39;&lt;message name&gt;&#39;</span>, -</span></span><span style="display:flex;"><span> <span style="color:#aaa;font-style:italic">// … other properties as needed for other message types … -</span></span></span><span style="display:flex;"><span><span style="color:#aaa;font-style:italic"></span>} -</span></span></code></pre></div><p>The message data object posted to the application extension is of the form:</p> -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-js" data-lang="js"><span style="display:flex;"><span>{ -</span></span><span style="display:flex;"><span> messageName: <span style="color:#a50">&#39;&lt;message name&gt;&#39;</span>, -</span></span><span style="display:flex;"><span> <span style="color:#aaa;font-style:italic">// … other properties as needed for other message types … -</span></span></span><span style="display:flex;"><span><span style="color:#aaa;font-style:italic"></span>} -</span></span></code></pre></div><p>The message will always have a <code>messageName</code> property.</p> -<h3 id="listen-for-messages">Listen for messages</h3> -<p>To listen for messages from the Onshape client:</p> -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-js" data-lang="js"><span style="display:flex;"><span> <span style="color:#aaa;font-style:italic">// server is one of the iframe src query parameters - see above -</span></span></span><span style="display:flex;"><span><span style="color:#aaa;font-style:italic"></span> -</span></span><span style="display:flex;"><span> <span style="color:#00a">var</span> handlePostMessage = <span style="color:#00a">function</span>(e) { -</span></span><span style="display:flex;"><span> console.log(<span style="color:#a50">&#34;Post message received in application extension.&#34;</span>); -</span></span><span style="display:flex;"><span> console.log(<span style="color:#a50">&#34;e.origin = &#34;</span> + e.origin); -</span></span><span style="display:flex;"><span> -</span></span><span style="display:flex;"><span> <span style="color:#aaa;font-style:italic">// Verify the origin matches the server iframe src query parameter -</span></span></span><span style="display:flex;"><span><span style="color:#aaa;font-style:italic"></span> <span style="color:#00a">if</span> (server === e.origin) { -</span></span><span style="display:flex;"><span> console.log(<span style="color:#a50">&#34;Message safe and can be handled as it is from origin &#39;&#34;</span> -</span></span><span style="display:flex;"><span> + e.origin + -</span></span><span style="display:flex;"><span> <span style="color:#a50">&#34;&#39;, which matches server query parameter &#39;&#34;</span> -</span></span><span style="display:flex;"><span> + server + <span style="color:#a50">&#34;&#39;.&#34;</span>); -</span></span><span style="display:flex;"><span> <span style="color:#00a">if</span> (e.data &amp;&amp; e.data.messageName) { -</span></span><span style="display:flex;"><span> console.log(<span style="color:#a50">&#34;Message name = &#39;&#34;</span> + e.data.messageName + <span style="color:#a50">&#34;&#39;&#34;</span>); -</span></span><span style="display:flex;"><span> } <span style="color:#00a">else</span> { -</span></span><span style="display:flex;"><span> console.log(<span style="color:#a50">&#34;Message name not found. Ignoring message.&#34;</span>); -</span></span><span style="display:flex;"><span> } -</span></span><span style="display:flex;"><span> } <span style="color:#00a">else</span> { -</span></span><span style="display:flex;"><span> console.log(<span style="color:#a50">&#34;Message NOT safe and should be ignored.&#34;</span>); -</span></span><span style="display:flex;"><span> } -</span></span><span style="display:flex;"><span> }; -</span></span><span style="display:flex;"><span> -</span></span><span style="display:flex;"><span> <span style="color:#0aa">window</span>.addEventListener(<span style="color:#a50">&#39;message&#39;</span>, handlePostMessage, <span style="color:#00a">false</span>); -</span></span></code></pre></div><h3 id="send-and-handle-messages">Send and handle messages</h3> -<p>The following is an example of how one might send an initialization message to, and handle post messages from, the Onshape client.</p> -<blockquote> -<p><em><strong>Note:</strong></em> Proper clean-up of event listeners is not included in the snippet</p> -</blockquote> -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-javascript" data-lang="javascript"><span style="display:flex;"><span><span style="color:#00a">function</span> handlePostMessage(event) { -</span></span><span style="display:flex;"><span> <span style="color:#aaa;font-style:italic">// ensure that the event data is from a legit source: -</span></span></span><span style="display:flex;"><span><span style="color:#aaa;font-style:italic"></span> <span style="color:#00a">if</span>(theServerStringFromActionUrl !== event.origin) { -</span></span><span style="display:flex;"><span> console.error(<span style="color:#a50">&#39;origin of message is not legitimate&#39;</span>); -</span></span><span style="display:flex;"><span> <span style="color:#00a">return</span>; -</span></span><span style="display:flex;"><span> } -</span></span><span style="display:flex;"><span> -</span></span><span style="display:flex;"><span> <span style="color:#aaa;font-style:italic">// branch based on messageName attribute -</span></span></span><span style="display:flex;"><span><span style="color:#aaa;font-style:italic"></span> <span style="color:#00a">switch</span>(event.data.messageName) { -</span></span><span style="display:flex;"><span> <span style="color:#00a">case</span> <span style="color:#a50">&#39;SELECTION&#39;</span>: -</span></span><span style="display:flex;"><span> console.debug(<span style="color:#a50">&#39;SELECTION event data: %o&#39;</span>, event.data); -</span></span><span style="display:flex;"><span> <span style="color:#00a">break</span>; -</span></span><span style="display:flex;"><span> <span style="color:#00a">default</span>: -</span></span><span style="display:flex;"><span> console.debug(<span style="color:#a50">`</span><span style="color:#a50">${</span>event.data.messageName<span style="color:#a50">}</span><span style="color:#a50"> not handled`</span>); -</span></span><span style="display:flex;"><span> } -</span></span><span style="display:flex;"><span>} -</span></span><span style="display:flex;"><span> -</span></span><span style="display:flex;"><span><span style="color:#0aa">window</span>.addEventListener(<span style="color:#a50">&#39;message&#39;</span>, handlePostMessage); -</span></span><span style="display:flex;"><span> -</span></span><span style="display:flex;"><span><span style="color:#00a">const</span> initMessage = { -</span></span><span style="display:flex;"><span> documentId: theDocumentId, <span style="color:#aaa;font-style:italic">// required - parsed from action url -</span></span></span><span style="display:flex;"><span><span style="color:#aaa;font-style:italic"></span> workspaceId: theWorkspaceId, <span style="color:#aaa;font-style:italic">// required - parsed from action url -</span></span></span><span style="display:flex;"><span><span style="color:#aaa;font-style:italic"></span> elementId: theElementId, <span style="color:#aaa;font-style:italic">// required - parsed from action url -</span></span></span><span style="display:flex;"><span><span style="color:#aaa;font-style:italic"></span> messageName: <span style="color:#a50">&#39;applicationInit&#39;</span> <span style="color:#aaa;font-style:italic">// required -</span></span></span><span style="display:flex;"><span><span style="color:#aaa;font-style:italic"></span>}; -</span></span><span style="display:flex;"><span> -</span></span><span style="display:flex;"><span><span style="color:#0aa">window</span>.parent.postMessage(initMessage, <span style="color:#a50">&#39;*&#39;</span>); -</span></span></code></pre></div><h3 id="right-panel-interaction-sequence">Right panel interaction sequence</h3> -<p>The sequence diagram below illustrates the interaction between an Element right panel application extension and the Onshape client:</p> -<pre tabindex="0"><code class="language-mermaid" data-lang="mermaid">%%{ -init: { -&#34;theme&#34;: &#34;default&#34;, -&#34;sequence&#34;: { -&#34;mirrorActors&#34;: false, -&#34;showSequenceNumbers&#34;: false, -&#34;width&#34;: 75, -&#34;height&#34;: 60, -&#34;actorMargin&#34;: 25, -&#34;messageFontSize&#34;: 13, -&#34;messageFontFamily&#34;: &#34;monospace&#34;, -&#34;messageFontWeight&#34;: 2 -} -} -}%% -sequenceDiagram -actor user -participant OSC AS Onshape Client -participant AE AS Application Extension -user-&gt;&gt;+OSC: start element right panel extension -Note right of user: via configured button -OSC-&gt;&gt;+AE: invoke action url (with query params) -AE-&gt;&gt;OSC: postMessage(messageName: &#39;applicationInit&#39;) -loop selection interactions -user-&gt;&gt;OSC: select -OSC-&gt;&gt;AE: postMessage(messageName: &#39;SELECTION&#39;) -end -user-&gt;&gt;OSC: stop element right panel extension -Note right of user: via configured button -deactivate AE -OSC-XAE: destroy -deactivate OSC -</code></pre><h3 id="right-panel-message-exchange">Right panel message exchange</h3> -<p>The following messages are exchanged for application extensions located in the element right panel and configured for Part Studio, Assembly, or Document contexts.</p> -<p>The first message with <code>messageName</code> attribute set to <code>applicationInit</code> is sent to the Onshape client by an application extension once it is loaded and ready to receive and process incoming messages:</p> -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-js" data-lang="js"><span style="display:flex;"><span> { -</span></span><span style="display:flex;"><span> documentId: <span style="color:#a50">&#39;&lt;document id&gt;&#39;</span>, -</span></span><span style="display:flex;"><span> workspaceId: <span style="color:#a50">&#39;&lt;workspace id&gt;&#39;</span>, -</span></span><span style="display:flex;"><span> elementId: <span style="color:#a50">&#39;&lt;element id&gt;&#39;</span>, -</span></span><span style="display:flex;"><span> messageName: <span style="color:#a50">&#39;applicationInit&#39;</span> -</span></span><span style="display:flex;"><span> } -</span></span></code></pre></div><p>The values <code>&lt;document id&gt;</code>, <code>&lt;workspace id&gt;</code>, <code>&lt;element id&gt;</code>, and <code>&lt;server id&gt;</code>:</p> -<ul> -<li>Are originally included as query parameters in the action URL used to request the content of the application extension</li> -<li>Must be included in messages sent to the Onshape client</li> -</ul> -<p>While initialization is the specific intent of the <code>applicationInit</code> message, other supported <code>messageName</code> attributes have the same initialization effect upon their first receipt by the Onshape client.</p> -<p>Next, as the user interacts with Onshape by selecting various parts of the model, messages with the <code>messageName</code> attribute set to <code>SELECTION</code> are sent to the application extension:</p> -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-js" data-lang="js"><span style="display:flex;"><span>{ -</span></span><span style="display:flex;"><span> messageName: <span style="color:#a50">&#39;SELECTION&#39;</span>, -</span></span><span style="display:flex;"><span> selections: [ -</span></span><span style="display:flex;"><span> { -</span></span><span style="display:flex;"><span> selectionType: <span style="color:#a50">&#39;ENTITY&#39;</span>, -</span></span><span style="display:flex;"><span> selectionId: <span style="color:#a50">&#39;KRiB&#39;</span>, -</span></span><span style="display:flex;"><span> entityType: <span style="color:#a50">&#39;FACE&#39;</span>, -</span></span><span style="display:flex;"><span> occurrencePath: [ -</span></span><span style="display:flex;"><span> <span style="color:#a50">&#39;MfOieM8xKIDGHe37c&#39;</span> -</span></span><span style="display:flex;"><span> ], -</span></span><span style="display:flex;"><span> workspaceMicroversionId: <span style="color:#a50">&#39;a781c53fbd1095e3462d2b70&#39;</span> -</span></span><span style="display:flex;"><span> }, -</span></span><span style="display:flex;"><span> { -</span></span><span style="display:flex;"><span> selectionType: <span style="color:#a50">&#39;ENTITY&#39;</span>, -</span></span><span style="display:flex;"><span> selectionId: <span style="color:#a50">&#39;KRdC&#39;</span>, -</span></span><span style="display:flex;"><span> entityType: <span style="color:#a50">&#39;EDGE&#39;</span>, -</span></span><span style="display:flex;"><span> occurrencePath: [ -</span></span><span style="display:flex;"><span> <span style="color:#a50">&#39;MfOieM8xKIDGHe37c&#39;</span> -</span></span><span style="display:flex;"><span> ], -</span></span><span style="display:flex;"><span> workspaceMicroversionId: <span style="color:#a50">&#39;a781c53fbd1095e3462d2b70&#39;</span> -</span></span><span style="display:flex;"><span> } -</span></span><span style="display:flex;"><span> ] -</span></span><span style="display:flex;"><span>} -</span></span></code></pre></div><h2 id="notes">Notes</h2> -<h3 id="keyboard-focus">Keyboard focus</h3> -<p>Keyboard focus will not be transferred to an application until the user clicks in the application or the application programmatically takes focus. An application should programmatically take focus when it is first loaded and when it receives a <code>show</code> message from Onshape. Shortcut keys will work immediately when the application is shown.</p> -<h3 id="future-work">Future work</h3> -<ul> -<li>New message types will be added as needed. If your application extension needs a message not listed in this document, please notify us, and we’ll work with you on it.</li> -<li>Mobile client support is unclear at this time.</li> -<li>Onshape is considering using promises to wrap <code>POST</code> messages, which would make the application extension&rsquo;s JavaScript simpler and enable chaining <code>POST</code>s with other operations. Promises would make some interactions with multiple responses difficult (e.g., when you open a dialog, like the Select Item dialog, and want to receive multiple <code>POST</code> messages back due to the user clicking on multiple items in the dialog).</li> -</ul>Docs: Structured Storagehttps://onshape-public.github.io/docs/app-dev/structuredstorage/Mon, 18 May 2020 20:40:16 -0400https://onshape-public.github.io/docs/app-dev/structuredstorage/ -<h2 id="sub-elements">Sub Elements</h2> -<p>Onshape provides application elements storage that is controlled by applications through the API. These elements allow a set of named sub-elements.</p> -<p>The application can make changes to sub-elements independently or in arbitrary groupings. Changes may be wholesale replacements, or may be deltas. When performing a delta update, the application may post a full version as well, which allows the api to return a smaller number of deltas for subsequent queries.</p> -<p>An application may need to perform multiple versionable actions in the course of performing a user-level action, and we want to allow the individual actions to be collected into a single action from the perspective of document history. We do this by providing support for creation of a private transaction and support for atomically committing the transaction to the document workspace as a single user-visible action.</p> -<p>Onshape does not assume any knowledge about the semantics of application deltas. All merging of deltas into a consolidated form is done by the application. Applications should typically send checkpoint state for a sub-element if many delta changes have been made since the last checkpoint.</p> -<p>Document content and changes are logically an array of bytes, but since they are transmitted through JSON, then are expected to be presented a Base-64 encoding of the array into string form.</p> -<p>We use some terminology in this document that is new.</p> -<ul> -<li> -<p><strong>changeId</strong> - an opaque identifier for the state of an application element. Each change to the application element results in a new changeId</p> -</li> -<li> -<p><strong>transaction</strong> - a private workspace within a document workspace for composing modifications to an application element. These changes are not visible to the user until committed.</p> -</li> -<li> -<p><strong>transaction commit</strong> - an operation that moves the changes performed within a transaction to the application element workspace as a single user-visible action.</p> -</li> -</ul> -<p><strong>Concurrent access by multiple users</strong></p> -<p>If the element is being concurrently accessed by multiple sessions, updates may encounter conflicts during update. If the application has a mechanism that ensures that all accesses to the element are mediated by a single process, as is done with our part studio and assemblies, this can be addressed directly by the application. However, if the application is not able to mediate access in this way, updates by one session may invalidate state held by another session. We address this by notifying updaters when an update cannot be directly applied because their state is out of date and allowing them to refresh their state before re-applying the change.</p> -<p>This policy of requiring the application have current state when posting updates could be overly conservative in some cases. Detecting conflict at the sub-element level might provide for better concurrent access performance, but there probably are cases where this fails, so it probably would need some level of application control.</p> -<h2 id="json-tree">JSON Tree</h2> -<p>In contrast with sub elements, JSON tree storage is a more managed data storage mechanism that Onshape itself can merge and diff. At the root of it, the data structure is a single JSON object per Application Element. The user submits incremental changes that are then applied by Onshape to the JSON tree. Onshape stores these &lsquo;diffs&rsquo; in a new microversion created as a result of the update request, or during a subsequent transaction commit request. When the user then performs a merge or restore operation, Onshape can sum and apply the requisite incremental changes. By storing diffs, Onshape provides to the user a storage mechanism that is more robust to race conditions, since multiple simultaneous edits can be optionally merged by Onshape. All of these qualities make JSON tree a preferred way to store application element data in an Onshape-native manner.</p> -<h3 id="json-tree-edit-semantics">JSON Tree Edit Semantics</h3> -<h5 id="btjedit-encoding">BTJEdit Encoding</h5> -<p>A JSON tree edit represents an incremental change to an application element&rsquo;s JSON tree. The edit is a <code>BTJEdit</code> class, which is encoded as one of the following:</p> -<ul> -<li>Deletion:</li> -</ul> -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-json" data-lang="json"><span style="display:flex;"><span>{ <span style="color:#1e90ff;font-weight:bold">&#34;btType&#34;</span> : <span style="color:#a50">&#34;BTJEditDelete-1992&#34;</span>, <span style="color:#1e90ff;font-weight:bold">&#34;path&#34;</span> : <span style="color:#a50">&#34;path&#34;</span> } -</span></span></code></pre></div><ul> -<li>Insertion:</li> -</ul> -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-json" data-lang="json"><span style="display:flex;"><span>{ <span style="color:#1e90ff;font-weight:bold">&#34;btType&#34;</span> : <span style="color:#a50">&#34;BTJEditInsert-2523&#34;</span>, <span style="color:#1e90ff;font-weight:bold">&#34;path&#34;</span> : <span style="color:#a50">&#34;path&#34;</span>, <span style="color:#1e90ff;font-weight:bold">&#34;value&#34;</span> : <span style="color:#a50">&#34;newValue&#34;</span> } -</span></span></code></pre></div><ul> -<li>Change:</li> -</ul> -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-json" data-lang="json"><span style="display:flex;"><span>{ <span style="color:#1e90ff;font-weight:bold">&#34;btType&#34;</span> : <span style="color:#a50">&#34;BTJEditChange-2636&#34;</span>, <span style="color:#1e90ff;font-weight:bold">&#34;path&#34;</span> : <span style="color:#a50">&#34;path&#34;</span>, <span style="color:#1e90ff;font-weight:bold">&#34;value&#34;</span> : <span style="color:#a50">&#34;newValue&#34;</span> } -</span></span></code></pre></div><ul> -<li>Move:</li> -</ul> -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-json" data-lang="json"><span style="display:flex;"><span>{ <span style="color:#1e90ff;font-weight:bold">&#34;btType&#34;</span> : <span style="color:#a50">&#34;BTJEditMove-3245&#34;</span>, <span style="color:#1e90ff;font-weight:bold">&#34;sourcePath&#34;</span> : <span style="color:#a50">&#34;path&#34;</span>, <span style="color:#1e90ff;font-weight:bold">&#34;destinationPath&#34;</span> : <span style="color:#a50">&#34;path&#34;</span> } -</span></span></code></pre></div><ul> -<li>List (where edit1, edit2, etc. are zero or more edits.):</li> -</ul> -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-json" data-lang="json"><span style="display:flex;"><span>{ <span style="color:#1e90ff;font-weight:bold">&#34;btType&#34;</span> : <span style="color:#a50">&#34;BTJEditList-2707&#34;</span>, <span style="color:#1e90ff;font-weight:bold">&#34;edits&#34;</span> : [ <span style="color:#a50">&#34;edit1&#34;</span>, <span style="color:#a50">&#34;edit2&#34;</span>, <span style="color:#a50">&#34;...&#34;</span>] } -</span></span></code></pre></div><p>Within the above encoding, <code>newValue</code> is a stand in for any valid JSON, and <code>path</code> is a stand in for an object representing a path to the node at which to perform the edit.</p> -<h5 id="btjpath-encoding">BTJPath Encoding</h5> -<p>The BTJPath object describes a path through the JSON tree to a particular node, and is encoded as follows:</p> -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-json" data-lang="json"><span style="display:flex;"><span>{ <span style="color:#1e90ff;font-weight:bold">&#34;btType&#34;</span> : <span style="color:#a50">&#34;BTJPath-3073&#34;</span>, <span style="color:#1e90ff;font-weight:bold">&#34;startNode&#34;</span> : <span style="color:#a50">&#34;startNode&#34;</span>, <span style="color:#1e90ff;font-weight:bold">&#34;path&#34;</span> : [ <span style="color:#a50">&#34;pathElement1&#34;</span>, <span style="color:#a50">&#34;pathElement2&#34;</span>, <span style="color:#a50">&#34;...&#34;</span>] } -</span></span></code></pre></div><p>where startNode is a string that is either empty to specify the root node or a nodeId of a node in the tree. The pathElement is one of:</p> -<ul> -<li>Key:</li> -</ul> -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-json" data-lang="json"><span style="display:flex;"><span>{ <span style="color:#1e90ff;font-weight:bold">&#34;btType&#34;</span> : <span style="color:#a50">&#34;BTJPathKey-3221&#34;</span>, <span style="color:#1e90ff;font-weight:bold">&#34;key&#34;</span> : <span style="color:#a50">&#34;string&#34;</span> } -</span></span></code></pre></div><ul> -<li>Index:</li> -</ul> -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-json" data-lang="json"><span style="display:flex;"><span>{ <span style="color:#1e90ff;font-weight:bold">&#34;btType&#34;</span> : <span style="color:#a50">&#34;BTJPathIndex-1871&#34;</span>, <span style="color:#1e90ff;font-weight:bold">&#34;index&#34;</span> : <span style="color:#a50">&#34;integer&#34;</span> } -</span></span></code></pre></div><p>In the insertion and move type edits the path elements can describe a path that doesn&rsquo;t currently exist. Onshape will generate the proper keys and values as needed to place the node value in the proper location.</p> -<h3 id="json-tree-examples">JSON Tree Examples</h3> -<p>Below are some examples that show the body required to perform the particular edit on a JSON tree.</p> -<h4 id="deletion-example">Deletion Example</h4> -<p>If the pre-existing JSON tree looks like:</p> -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-json" data-lang="json"><span style="display:flex;"><span>{<span style="color:#1e90ff;font-weight:bold">&#34;myKey&#34;</span>: <span style="color:#a50">&#34;myValue&#34;</span>} -</span></span></code></pre></div><p>and a delete edit looks like:</p> -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-json" data-lang="json"><span style="display:flex;"><span>{<span style="color:#1e90ff;font-weight:bold">&#34;btType&#34;</span>: <span style="color:#a50">&#34;BTJEditDelete-1992&#34;</span>, -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;path&#34;</span>: {<span style="color:#1e90ff;font-weight:bold">&#34;btType&#34;</span>: <span style="color:#a50">&#34;BTJPath-3073&#34;</span>, <span style="color:#1e90ff;font-weight:bold">&#34;startNode&#34;</span>: <span style="color:#a50">&#34;&#34;</span>, <span style="color:#1e90ff;font-weight:bold">&#34;path&#34;</span>: [{<span style="color:#1e90ff;font-weight:bold">&#34;btType&#34;</span>: <span style="color:#a50">&#34;BTJPathKey-3221&#34;</span>, <span style="color:#1e90ff;font-weight:bold">&#34;key&#34;</span>: <span style="color:#a50">&#34;myKey&#34;</span>}]}} -</span></span></code></pre></div><p>then the resulting JSON is the result of deleting the node specified by <code>path</code>:</p> -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-json" data-lang="json"><span style="display:flex;"><span>{} -</span></span></code></pre></div><h4 id="insert-example">Insert Example</h4> -<p>If the pre-existing JSON tree looks like:</p> -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-json" data-lang="json"><span style="display:flex;"><span>{} -</span></span></code></pre></div><p>and the insertion edit looks like:</p> -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-json" data-lang="json"><span style="display:flex;"><span>{<span style="color:#1e90ff;font-weight:bold">&#34;btType&#34;</span>: <span style="color:#a50">&#34;BTJEditInsert-2523&#34;</span>, -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;path&#34;</span>: {<span style="color:#1e90ff;font-weight:bold">&#34;btType&#34;</span>: <span style="color:#a50">&#34;BTJPath-3073&#34;</span>, <span style="color:#1e90ff;font-weight:bold">&#34;startNode&#34;</span>: <span style="color:#a50">&#34;&#34;</span>, <span style="color:#1e90ff;font-weight:bold">&#34;path&#34;</span>: [{<span style="color:#1e90ff;font-weight:bold">&#34;btType&#34;</span>: <span style="color:#a50">&#34;BTJPathKey-3221&#34;</span>, <span style="color:#1e90ff;font-weight:bold">&#34;key&#34;</span>: <span style="color:#a50">&#34;insertedKey&#34;</span>}]}, -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;value&#34;</span>: <span style="color:#a50">&#34;myValue&#34;</span>} -</span></span></code></pre></div><p>then the resulting JSON is the result of inserting the node described by <code>value</code> at the node specified by <code>path</code>:</p> -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-json" data-lang="json"><span style="display:flex;"><span>{<span style="color:#1e90ff;font-weight:bold">&#34;insertedKey&#34;</span>: <span style="color:#a50">&#34;myValue&#34;</span>} -</span></span></code></pre></div><h4 id="change-example">Change Example</h4> -<p>If the pre-existing JSON tree looks like:</p> -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-json" data-lang="json"><span style="display:flex;"><span>{<span style="color:#1e90ff;font-weight:bold">&#34;myKey&#34;</span>: <span style="color:#a50">&#34;myValue&#34;</span>} -</span></span></code></pre></div><p>and the change edit looks like:</p> -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-json" data-lang="json"><span style="display:flex;"><span>{<span style="color:#1e90ff;font-weight:bold">&#34;btType&#34;</span>: <span style="color:#a50">&#34;BTJEditChange-2636&#34;</span>, -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;path&#34;</span>: {<span style="color:#1e90ff;font-weight:bold">&#34;btType&#34;</span>: <span style="color:#a50">&#34;BTJPath-3073&#34;</span>, <span style="color:#1e90ff;font-weight:bold">&#34;startNode&#34;</span>: <span style="color:#a50">&#34;&#34;</span>, <span style="color:#1e90ff;font-weight:bold">&#34;path&#34;</span>: [{<span style="color:#1e90ff;font-weight:bold">&#34;btType&#34;</span>: <span style="color:#a50">&#34;BTJPathKey-3221&#34;</span>, <span style="color:#1e90ff;font-weight:bold">&#34;key&#34;</span>: <span style="color:#a50">&#34;myKey&#34;</span>}]}, -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;value&#34;</span>: <span style="color:#a50">&#34;myOtherValue&#34;</span>} -</span></span></code></pre></div><p>then the resulting JSON is the result of changing the node specified by <code>path</code> to the node described by <code>value</code>:</p> -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-json" data-lang="json"><span style="display:flex;"><span>{<span style="color:#1e90ff;font-weight:bold">&#34;myKey&#34;</span>: <span style="color:#a50">&#34;myOtherValue&#34;</span>} -</span></span></code></pre></div><h4 id="move-example">Move Example</h4> -<p>If the pre-existing JSON tree looks like:</p> -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-json" data-lang="json"><span style="display:flex;"><span>{<span style="color:#1e90ff;font-weight:bold">&#34;myKey&#34;</span>: <span style="color:#a50">&#34;myValue&#34;</span>, <span style="color:#1e90ff;font-weight:bold">&#34;myOtherKey&#34;</span>: <span style="color:#a50">&#34;myOtherValue&#34;</span>} -</span></span></code></pre></div><p>and the move edit looks like:</p> -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-json" data-lang="json"><span style="display:flex;"><span>{<span style="color:#1e90ff;font-weight:bold">&#34;btType&#34;</span>: <span style="color:#a50">&#34;BTJEditMove-3245&#34;</span>, <span style="color:#1e90ff;font-weight:bold">&#34;sourcePath&#34;</span>: {<span style="color:#1e90ff;font-weight:bold">&#34;btType&#34;</span>: <span style="color:#a50">&#34;BTJPath-3073&#34;</span>, <span style="color:#1e90ff;font-weight:bold">&#34;startNode&#34;</span>: <span style="color:#a50">&#34;&#34;</span>, -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;path&#34;</span>: [{<span style="color:#1e90ff;font-weight:bold">&#34;btType&#34;</span>: <span style="color:#a50">&#34;BTJPathKey-3221&#34;</span>, <span style="color:#1e90ff;font-weight:bold">&#34;key&#34;</span>: <span style="color:#a50">&#34;myKey&#34;</span>}]}, -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;destinationPath&#34;</span>: {<span style="color:#1e90ff;font-weight:bold">&#34;btType&#34;</span>: <span style="color:#a50">&#34;BTJPath-3073&#34;</span>, <span style="color:#1e90ff;font-weight:bold">&#34;startNode&#34;</span>: <span style="color:#a50">&#34;&#34;</span>, -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;path&#34;</span>: [{<span style="color:#1e90ff;font-weight:bold">&#34;btType&#34;</span>: <span style="color:#a50">&#34;BTJPathKey-3221&#34;</span>, <span style="color:#1e90ff;font-weight:bold">&#34;key&#34;</span>: <span style="color:#a50">&#34;keyCreatedFromMove&#34;</span>}]}} -</span></span></code></pre></div><p>then the resulting JSON is the result of moving the node from the specified <code>sourcePath</code> to the <code>destinationPath</code>:</p> -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-json" data-lang="json"><span style="display:flex;"><span>{<span style="color:#1e90ff;font-weight:bold">&#34;keyCreatedFromMove&#34;</span>: <span style="color:#a50">&#34;myValue&#34;</span>} -</span></span></code></pre></div><h4 id="list-example">List Example</h4> -<p>If the pre-existing JSON tree looks like:</p> -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-json" data-lang="json"><span style="display:flex;"><span>{} -</span></span></code></pre></div><p>and the list edit looks like:</p> -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-json" data-lang="json"><span style="display:flex;"><span>{<span style="color:#1e90ff;font-weight:bold">&#34;btType&#34;</span>: <span style="color:#a50">&#34;BTJEditList-2707&#34;</span>, <span style="color:#1e90ff;font-weight:bold">&#34;edits&#34;</span>: [ -</span></span><span style="display:flex;"><span> {<span style="color:#1e90ff;font-weight:bold">&#34;btType&#34;</span>: <span style="color:#a50">&#34;BTJEditInsert-2523&#34;</span>, <span style="color:#1e90ff;font-weight:bold">&#34;path&#34;</span>: {<span style="color:#1e90ff;font-weight:bold">&#34;btType&#34;</span>: <span style="color:#a50">&#34;BTJPath-3073&#34;</span>, <span style="color:#1e90ff;font-weight:bold">&#34;startNode&#34;</span>: <span style="color:#a50">&#34;&#34;</span>, <span style="color:#1e90ff;font-weight:bold">&#34;path&#34;</span>: [{<span style="color:#1e90ff;font-weight:bold">&#34;btType&#34;</span>: <span style="color:#a50">&#34;BTJPathKey-3221&#34;</span>, <span style="color:#1e90ff;font-weight:bold">&#34;key&#34;</span>: <span style="color:#a50">&#34;myKey&#34;</span>}]}, -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;value&#34;</span>: <span style="color:#a50">&#34;myValue&#34;</span>}, -</span></span><span style="display:flex;"><span> {<span style="color:#1e90ff;font-weight:bold">&#34;btType&#34;</span>: <span style="color:#a50">&#34;BTJEditChange-2636&#34;</span>, <span style="color:#1e90ff;font-weight:bold">&#34;path&#34;</span>: {<span style="color:#1e90ff;font-weight:bold">&#34;btType&#34;</span>: <span style="color:#a50">&#34;BTJPath-3073&#34;</span>, <span style="color:#1e90ff;font-weight:bold">&#34;startNode&#34;</span>: <span style="color:#a50">&#34;&#34;</span>, -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;path&#34;</span>: [{<span style="color:#1e90ff;font-weight:bold">&#34;btType&#34;</span>: <span style="color:#a50">&#34;BTJPathKey-3221&#34;</span>, <span style="color:#1e90ff;font-weight:bold">&#34;key&#34;</span>: <span style="color:#a50">&#34;myKey&#34;</span>}]}, -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;value&#34;</span>: [<span style="color:#a50">&#34;firstValue&#34;</span>, <span style="color:#a50">&#34;secondValue&#34;</span>]}, -</span></span><span style="display:flex;"><span> {<span style="color:#1e90ff;font-weight:bold">&#34;btType&#34;</span>: <span style="color:#a50">&#34;BTJEditInsert-2523&#34;</span>, <span style="color:#1e90ff;font-weight:bold">&#34;path&#34;</span>: {<span style="color:#1e90ff;font-weight:bold">&#34;btType&#34;</span>: <span style="color:#a50">&#34;BTJPath-3073&#34;</span>, <span style="color:#1e90ff;font-weight:bold">&#34;startNode&#34;</span>: <span style="color:#a50">&#34;&#34;</span>, -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;path&#34;</span>: [{<span style="color:#1e90ff;font-weight:bold">&#34;btType&#34;</span>: <span style="color:#a50">&#34;BTJPathKey-3221&#34;</span>, <span style="color:#1e90ff;font-weight:bold">&#34;key&#34;</span>: <span style="color:#a50">&#34;myKey&#34;</span>}, -</span></span><span style="display:flex;"><span> {<span style="color:#1e90ff;font-weight:bold">&#34;btType&#34;</span>: <span style="color:#a50">&#34;BTJPathIndex-1871&#34;</span>, <span style="color:#1e90ff;font-weight:bold">&#34;index&#34;</span>: <span style="color:#099">1</span>}]}, -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;value&#34;</span>: <span style="color:#a50">&#34;myBetterSecondValue&#34;</span>}, -</span></span><span style="display:flex;"><span> {<span style="color:#1e90ff;font-weight:bold">&#34;btType&#34;</span>: <span style="color:#a50">&#34;BTJEditDelete-1992&#34;</span>, <span style="color:#1e90ff;font-weight:bold">&#34;path&#34;</span>: {<span style="color:#1e90ff;font-weight:bold">&#34;btType&#34;</span>: <span style="color:#a50">&#34;BTJPath-3073&#34;</span>, <span style="color:#1e90ff;font-weight:bold">&#34;startNode&#34;</span>: <span style="color:#a50">&#34;&#34;</span>, -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;path&#34;</span>: [{<span style="color:#1e90ff;font-weight:bold">&#34;btType&#34;</span>: <span style="color:#a50">&#34;BTJPathKey-3221&#34;</span>, <span style="color:#1e90ff;font-weight:bold">&#34;key&#34;</span>: <span style="color:#a50">&#34;myKey&#34;</span>}, -</span></span><span style="display:flex;"><span> {<span style="color:#1e90ff;font-weight:bold">&#34;btType&#34;</span>: <span style="color:#a50">&#34;BTJPathIndex-1871&#34;</span>, <span style="color:#1e90ff;font-weight:bold">&#34;index&#34;</span>: <span style="color:#099">2</span>}]}} -</span></span><span style="display:flex;"><span> ]} -</span></span></code></pre></div><p>then the resulting JSON is the result of applying all the given edits in order:</p> -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-json" data-lang="json"><span style="display:flex;"><span>{<span style="color:#1e90ff;font-weight:bold">&#34;myKey&#34;</span>: [<span style="color:#a50">&#34;firstValue&#34;</span>, <span style="color:#a50">&#34;myBetterSecondValue&#34;</span>]} -</span></span></code></pre></div><p>The intermediate steps were:</p> -<ol> -<li>Insertion: -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-json" data-lang="json"><span style="display:flex;"><span> {<span style="color:#1e90ff;font-weight:bold">&#34;myKey&#34;</span>: <span style="color:#a50">&#34;myValue&#34;</span>} -</span></span></code></pre></div></li> -<li>Change: -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-json" data-lang="json"><span style="display:flex;"><span> {<span style="color:#1e90ff;font-weight:bold">&#34;myKey&#34;</span>: [<span style="color:#a50">&#34;firstValue&#34;</span>, <span style="color:#a50">&#34;secondValue&#34;</span>]} -</span></span></code></pre></div></li> -<li>List insertion: -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-json" data-lang="json"><span style="display:flex;"><span> {<span style="color:#1e90ff;font-weight:bold">&#34;myKey&#34;</span>: [<span style="color:#a50">&#34;firstValue&#34;</span>, <span style="color:#a50">&#34;myBetterSecondValue&#34;</span>, <span style="color:#a50">&#34;secondValue&#34;</span>]} -</span></span></code></pre></div></li> -<li>List deletion: -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-json" data-lang="json"><span style="display:flex;"><span> {<span style="color:#1e90ff;font-weight:bold">&#34;myKey&#34;</span>: [<span style="color:#a50">&#34;firstValue&#34;</span>, <span style="color:#a50">&#34;myBetterSecondValue&#34;</span>]} -</span></span></code></pre></div></li> -</ol> -<p>All the examples above were tested and validated using the Python client <a href="https://github.com/onshape-public/onshape-clients/blob/next/python/test/test_app_element_json_tree.py">here</a>.</p>Docs: Webhookshttps://onshape-public.github.io/docs/app-dev/webhook/Mon, 18 May 2020 20:44:05 -0400https://onshape-public.github.io/docs/app-dev/webhook/ -<p>This page describes the Webhook APIs Onshape provides for working with notifications.</p> -<p>Notifications are delivered to an application as an HTTP <code>POST</code> with a JSON body, which includes information about the identity of the registration request and information specific to the event and notification message.</p> -<p>Webhooks are an alternative approach to polling; instead of your application continuously asking Onshape for new information, webhooks automatically send a notification from Onshape any time an event you are subscribed to occurs.</p> -<p>An application may register for notifications to a URL that uses either HTTP or HTTPS. If HTTPS is specified by the URL template, the notification server must supply a certificate that is signed by a certificate authority (CA) recognized by Onshape. Self-signed certificates (as well as certificates signed by unrecognized CAs) will be rejected, causing notification delivery to fail.</p> -<blockquote> -<p>📘 <strong>Notes</strong></p> -<ul> -<li>This page provides sample code as curls. See the <a href="https://curl.se/docs/">curl documentation</a> for more information.</li> -<li>All Onshape API calls must be properly authenticated by replacing the <code>CREDENTIALS</code> variable in the curls below. See the <a href="https://onshape-public.github.io/docs/auth/apikeys">API Keys</a> page for instructions and the <a href="https://onshape-public.github.io/docs/api-intro/quickstart">Quick Start</a> for an example. All applications submitted to the Onshape App Store <em>must</em> authenticate with <a href="https://onshape-public.github.io/docs/auth/oauth">OAuth2</a>.</li> -<li>This documentation refers to Onshape IDs in the following format: <code>{did}, {wid}, {eid}, {pid}, {otherId}</code>. These represent document, workspace, element, part, and other IDs (respectively) that are needed make the API calls. We sometimes abbreviate these variables as <code>DWVEM</code> Please see <a href="https://onshape-public.github.io/docs/api-intro/#onshape-api-request">API Guide: API Intro</a> for information on what these IDs mean and how to obtain them from your documents. Sometimes, this page will use a stand-in string to represent these IDs (<code>000000000000000000000000</code>). Never include the curly braces (<code>{}</code>) in your API calls.</li> -<li>For Enterprise accounts, replace <strong><font color="slate">cad</font></strong> in all Onshape URLs with your company domain. -https://<font color="slate"><strong>cad</strong></font>.onshape.com &gt; https://<font color="slate"><strong>companyName</strong></font>.onshape.com</li> -</ul> -</blockquote> -<h2 id="events">Events</h2> -<p>Each type of event that an application may receive notifications for has a unique identifier known as the event type. Event types are grouped into Event Groups. Each group shares specification requirements.</p> -<p>Event types are categorized into several different groups based on the dominant user resource of the event. The group that a given event is part of defines the required parameters needed in the registration process to identify the resource or group of resources to watch. For instance, if registering for an event in the <code>document</code> event group, the application must identify either a specific document&rsquo;s id or a specific company&rsquo;s id. If registered for a company, the event will be registered for all present and future documents owned by the company.</p> -<blockquote> -<p>📘 <strong>Note</strong></p> -<p>You can see the full list of available events in the Glassworks API Explorer. Expand the <a href="https://cad.onshape.com/glassworks/explorer/#/Webhook/createWebhook">createWebhook</a> endpoint, then click <strong>Callbacks</strong>.</p> -<img src="https://onshape-public.github.io/images/webhooks-callbacks.png" alt="callbacks in the Glassworks Webhook > createWebhook > Callback page" width=80%> -</blockquote> -<h3 id="application-group">Application Group</h3> -<p>Monitor changes to applications.</p> -<p><strong>Supported Event Types</strong></p> -<ul> -<li><code>onshape.user.lifecycle.updateappsettings</code> - Occurs when user application settings are modified</li> -</ul> -<p><strong>Registration Requirements</strong></p> -<ul> -<li><code>clientId</code> - Must be specified in the registration body</li> -<li><code>event</code> - Must be set to <code>onshape.user.lifecycle.updateappsettings</code></li> -<li><code>options.collapseEvents</code> - Must be set to <code>true</code> or <code>false</code></li> -<li><code>url</code> - Must be provided to receive the webhook notifications</li> -</ul> -<pre tabindex="0"><code>{ -&#34;clientId&#34;: &#34;000000000000000000000000&#34;, -&#34;events&#34;: [ -&#34;onshape.user.lifecycle.updateappsettings&#34; -], -&#34;options&#34;: { -&#34;collapseEvents&#34;: false -}, -&#34;url&#34;: &#34;https://sampleUrl.org&#34; -} -</code></pre><h3 id="document-group">Document Group</h3> -<p>Monitor various aspects of document changes.</p> -<p><strong>Supported Event Types</strong></p> -<ul> -<li><code>onshape.model.lifecycle.changed</code> - Occurs when a change to a model is made</li> -<li><code>onshape.model.translation.complete</code> - Occurs when a translation request is complete</li> -<li><code>onshape.model.lifecycle.metadata</code> - Occurs when Part or element metadata is modified</li> -<li><code>onshape.model.lifecycle.createversion</code> - Occurs when a new version of a document is created</li> -<li><code>onshape.model.lifecycle.createworkspace</code> - Occurs when a new workspace is created</li> -<li><code>onshape.model.lifecycle.createelement</code> - Occurs when a new element is created</li> -<li><code>onshape.model.lifecycle.deleteelement</code> - Occurs when an element is deleted</li> -<li><code>onshape.document.lifecycle.statechange</code> - Occurs when a document changes state</li> -<li><code>onshape.model.lifecycle.changed.externalreferences</code> - Occurs when an external reference changes</li> -<li><code>onshape.document.lifecycle.created</code> - Occurs when a document is created</li> -<li><code>onshape.revision.created</code> - Occurs when a revision is created</li> -<li><code>onshape.comment.create</code> - Occurs when a comment is created in a document</li> -<li><code>onshape.comment.update</code> - Occurs when a comment is updated in a document</li> -<li><code>onshape.comment.delete</code> - Occurs when a comment is deleted in a document</li> -</ul> -<p><strong>Registration Requirements</strong></p> -<ul> -<li> -<p><code>documentId</code> OR <code>companyId</code> must be specified in the registration body</p> -<ul> -<li>Only <code>documentId</code> is valid for the <code>onshape.document.lifecycle.statechange</code></li> -</ul> -</li> -<li> -<p><code>event</code> - Must be set to one of the supported event types listed above</p> -<ul> -<li>May be set to <code>false</code> if the application is always listening to webhook notifications and <code>companyId</code> is specified.</li> -<li>If <code>false</code>, unregister the webhook when it is no longer needed.</li> -</ul> -</li> -<li> -<p><code>options.collapseEvents</code> - Must be set to <code>true</code> or <code>false</code></p> -</li> -<li> -<p><code>url</code> - Must be provided to receive the webhook notifications</p> -</li> -</ul> -<pre tabindex="0"><code>{ -&#34;documentId&#34;: &#34;000000000000000000000000&#34;, -&#34;events&#34;: [ -&#34;onshape.user.lifecycle.updateappsettings&#34; -], -&#34;options&#34;: { -&#34;collapseEvents&#34;: false -}, -&#34;url&#34;: &#34;https://sampleUrl.org&#34; -} -</code></pre><h3 id="workflow-group">Workflow Group</h3> -<p>Monitor release management actions.</p> -<p><strong>Supported Event Types</strong></p> -<ul> -<li><code>onshape.workflow.transition</code> - Occurs when a revision or release package transitions through workflow states</li> -</ul> -<p><strong>Registration Requirements</strong></p> -<ul> -<li><code>companyId</code> - Must be specified in the registration body</li> -<li><code>event</code> - Must be set to <code>onshape.workflow.transition</code> -<ul> -<li>May be set to <code>false</code> if the application is always listening to webhook notifications.</li> -<li>If <code>false</code>, unregister the webhook when it is no longer needed.</li> -</ul> -</li> -<li><code>options.collapseEvents</code> - Must be set to <code>true</code> or <code>false</code></li> -<li><code>url</code> - Must be provided to receive the webhook notifications</li> -</ul> -<pre tabindex="0"><code>{ -&#34;companyId&#34;: &#34;000000000000000000000000&#34;, -&#34;events&#34;: [ -&#34;onshape.workflow.transition&#34; -], -&#34;options&#34;: { -&#34;collapseEvents&#34;: false -}, -&#34;url&#34;: &#34;https://sampleUrl.org&#34; -} -</code></pre><h3 id="lifecycle-group">Lifecycle Group</h3> -<p>Monitor webhook changes. You do not need to register for these events; they are sent automatically when a webhook for another event type is registered, unregistered, or pinged.</p> -<p><strong>Supported Event Types</strong></p> -<ul> -<li><code>webhook.register</code> - Occurs in response to a notification registration API call</li> -<li><code>webhook.unregister</code> - Occurs in response to a notification deregistation API call</li> -<li><code>webhook.ping</code> - Occurs either: -<ul> -<li>In response to a request by an application to call the <a href="https://cad.onshape.com/glassworks/explorer/#/Webhook/pingWebhook">pingWebook</a> endpoint.</li> -<li>As a post-registration validation initiated by Onshape</li> -</ul> -</li> -</ul> -<h2 id="example-notifications">Example Notifications</h2> -<p><strong>webhook.register</strong></p> -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-json" data-lang="json"><span style="display:flex;"><span>{ -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;timestamp&#34;</span>: <span style="color:#a50">&#34;2024-05-05T23:45:10.611-0500&#34;</span>, -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;event&#34;</span>: <span style="color:#a50">&#34;webhook.register&#34;</span>, -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;workspaceId&#34;</span>: <span style="color:#a50">&#34;000000000000000000000000&#34;</span>, -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;elementId&#34;</span>: <span style="color:#a50">&#34;000000000000000000000000&#34;</span>, -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;webhookId&#34;</span>: <span style="color:#a50">&#34;000000000000000000000000&#34;</span>, -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;messageId&#34;</span>: <span style="color:#a50">&#34;000000000000000000000000&#34;</span>, -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;data&#34;</span>: <span style="color:#a50">&#34;Some data&#34;</span>, -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;documentId&#34;</span>: <span style="color:#a50">&#34;000000000000000000000000&#34;</span>, -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;versionId&#34;</span>: <span style="color:#a50">&#34;000000000000000000000000&#34;</span> -</span></span><span style="display:flex;"><span>} -</span></span></code></pre></div><p><strong>webhook.ping</strong></p> -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-json" data-lang="json"><span style="display:flex;"><span>{ -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;timestamp&#34;</span>: <span style="color:#a50">&#34;2024-05-05T23:45:10.611-0500&#34;</span>, -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;event&#34;</span>: <span style="color:#a50">&#34;webhook.ping&#34;</span>, -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;workspaceId&#34;</span>: <span style="color:#a50">&#34;000000000000000000000000&#34;</span>, -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;elementId&#34;</span>: <span style="color:#a50">&#34;000000000000000000000000&#34;</span>, -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;webhookId&#34;</span>: <span style="color:#a50">&#34;000000000000000000000000&#34;</span>, -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;messageId&#34;</span>: <span style="color:#a50">&#34;000000000000000000000000&#34;</span>, -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;data&#34;</span>: <span style="color:#a50">&#34;Some data&#34;</span>, -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;documentId&#34;</span>: <span style="color:#a50">&#34;000000000000000000000000&#34;</span>, -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;versionId&#34;</span>: <span style="color:#a50">&#34;000000000000000000000000&#34;</span> -</span></span><span style="display:flex;"><span>} -</span></span></code></pre></div><p><strong>onshape.model.lifecycle.changed</strong></p> -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-json" data-lang="json"><span style="display:flex;"><span>{ -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;timestamp&#34;</span>: <span style="color:#a50">&#34;2024-05-05T23:46:29.284-0500&#34;</span>, -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;event&#34;</span>: <span style="color:#a50">&#34;onshape.model.lifecycle.changed&#34;</span>, -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;workspaceId&#34;</span>: <span style="color:#a50">&#34;000000000000000000000000&#34;</span>, -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;elementId&#34;</span>: <span style="color:#a50">&#34;000000000000000000000000&#34;</span>, -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;webhookId&#34;</span>: <span style="color:#a50">&#34;000000000000000000000000&#34;</span>, -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;messageId&#34;</span>: <span style="color:#a50">&#34;000000000000000000000000&#34;</span>, -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;data&#34;</span>: <span style="color:#a50">&#34;Some data&#34;</span>, -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;documentId&#34;</span>: <span style="color:#a50">&#34;000000000000000000000000&#34;</span>, -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;versionId&#34;</span>: <span style="color:#a50">&#34;000000000000000000000000&#34;</span> -</span></span><span style="display:flex;"><span>} -</span></span></code></pre></div><p><strong>onshape.document.lifecycle.statechange</strong></p> -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-json" data-lang="json"><span style="display:flex;"><span>{ -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;timestamp&#34;</span>: <span style="color:#a50">&#34;2024-05-05T23:46:29.284-0500&#34;</span>, -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;event&#34;</span>: <span style="color:#a50">&#34;onshape.document.lifecycle.statechange&#34;</span>, -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;workspaceId&#34;</span>: <span style="color:#a50">&#34;000000000000000000000000&#34;</span>, -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;elementId&#34;</span>: <span style="color:#a50">&#34;000000000000000000000000&#34;</span>, -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;webhookId&#34;</span>: <span style="color:#a50">&#34;000000000000000000000000&#34;</span>, -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;messageId&#34;</span>: <span style="color:#a50">&#34;000000000000000000000000&#34;</span>, -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;data&#34;</span>: <span style="color:#a50">&#34;Some data&#34;</span>, -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;documentId&#34;</span>: <span style="color:#a50">&#34;000000000000000000000000&#34;</span>, -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;versionId&#34;</span>: <span style="color:#a50">&#34;000000000000000000000000&#34;</span>, -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;documentState&#34;</span>: <span style="color:#a50">&#34;TRASH&#34;</span> -</span></span><span style="display:flex;"><span>} -</span></span></code></pre></div><p>Possible values of <code>documentState</code> are:</p> -<ul> -<li><code>ACTIVE</code> - Document is in a normal, usable state.</li> -<li><code>TRASH</code> - Document has been moved to the trash; user can move document back to <code>ACTIVE</code> state.</li> -<li><code>DELETED</code> - Document has been deleted; user cannot access document.</li> -</ul> -<p><strong>onshape.user.lifecycle.updateappsettings</strong></p> -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-json" data-lang="json"><span style="display:flex;"><span>{ -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;timestamp&#34;</span>: <span style="color:#a50">&#34;2024-05-05T23:46:29.284-0500&#34;</span>, -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;event&#34;</span>: <span style="color:#a50">&#34;onshape.user.lifecycle.updateappsettings&#34;</span>, -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;workspaceId&#34;</span>: <span style="color:#a50">&#34;000000000000000000000000&#34;</span>, -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;elementId&#34;</span>: <span style="color:#a50">&#34;000000000000000000000000&#34;</span>, -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;webhookId&#34;</span>: <span style="color:#a50">&#34;000000000000000000000000&#34;</span>, -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;messageId&#34;</span>: <span style="color:#a50">&#34;000000000000000000000000&#34;</span>, -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;data&#34;</span>: <span style="color:#a50">&#34;Some data&#34;</span>, -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;userId&#34;</span>: <span style="color:#a50">&#34;000000000000000000000000&#34;</span>, -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;clientId&#34;</span>:<span style="color:#a50">&#34;000000000000000000000000&#34;</span> -</span></span><span style="display:flex;"><span>} -</span></span></code></pre></div><p><strong>onshape.model.translation.complete</strong></p> -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-json" data-lang="json"><span style="display:flex;"><span>{ -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;timestamp&#34;</span>: <span style="color:#a50">&#34;2024-05-05T23:46:29.284-0500&#34;</span>, -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;event&#34;</span>: <span style="color:#a50">&#34;onshape.model.translation.complete&#34;</span>, -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;workspaceId&#34;</span>: <span style="color:#a50">&#34;000000000000000000000000&#34;</span>, -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;elementId&#34;</span>: <span style="color:#a50">&#34;000000000000000000000000&#34;</span>, -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;webhookId&#34;</span>: <span style="color:#a50">&#34;000000000000000000000000&#34;</span>, -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;messageId&#34;</span>: <span style="color:#a50">&#34;000000000000000000000000&#34;</span>, -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;data&#34;</span>: <span style="color:#a50">&#34;Some data&#34;</span>, -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;documentId&#34;</span>: <span style="color:#a50">&#34;000000000000000000000000&#34;</span>, -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;userId&#34;</span>: <span style="color:#a50">&#34;000000000000000000000000&#34;</span>, -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;translationId&#34;</span>: <span style="color:#a50">&#34;000000000000000000000000&#34;</span> -</span></span><span style="display:flex;"><span>} -</span></span></code></pre></div><p><strong>onshape.comment.create</strong></p> -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-json" data-lang="json"><span style="display:flex;"><span>{ -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;timestamp&#34;</span>: <span style="color:#a50">&#34;2024-05-05T23:46:29.284-0500&#34;</span>, -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;event&#34;</span>: <span style="color:#a50">&#34;onshape.comment.create&#34;</span>, -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;workspaceId&#34;</span>: <span style="color:#a50">&#34;000000000000000000000000&#34;</span>, -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;elementId&#34;</span>: <span style="color:#a50">&#34;000000000000000000000000&#34;</span>, -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;webhookId&#34;</span>: <span style="color:#a50">&#34;000000000000000000000000&#34;</span>, -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;messageId&#34;</span>: <span style="color:#a50">&#34;000000000000000000000000&#34;</span>, -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;documentId&#34;</span>: <span style="color:#a50">&#34;000000000000000000000000&#34;</span>, -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;commentId&#34;</span>: <span style="color:#a50">&#34;000000000000000000000000&#34;</span> -</span></span><span style="display:flex;"><span>} -</span></span></code></pre></div><h2 id="endpoints">Endpoints</h2> -<p>Webhook notifications allow an application to register to receive notifications of certain events that occur within the Onshape environment. To receive a notification, an application must expose an endpoint that Onshape can call.</p> -<ul> -<li><a href="https://cad.onshape.com/glassworks/explorer/#/Webhook/getWebhooks">Webhook/getWebhooks</a> -<pre tabindex="0"><code> curl -X &#39;GET&#39; \ -&#39;https://cad.onshape.com/api/v6/webhooks?user={uid}&amp;offset=0&amp;limit=20&#39; \ --H &#39;aAccept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; -</code></pre></li> -<li><a href="https://cad.onshape.com/glassworks/explorer/#/Webhook/createWebhook">Webhook/createWebhook</a> -<pre tabindex="0"><code> curl -X &#39;POST&#39; \ -&#39;https://cad.onshape.com/api/v6/webhooks&#39; \ --H &#39;Accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; \ --H &#39;Content-Type: application/json;charset=UTF-8; qs=0.09&#39; \ --d &#39;{ -&#34;events&#34;: [ -&#34;eventType&#34; // See the [Events](#events) section above for valid event types. -], -&#34;options&#34;: { -&#34;collapseEvents&#34;: true | false -}, -&#34;url&#34;: &#34;https://sampleUrl.org&#34; -//Other parameters may be required. See the [Events](#events) section above. -}&#39; -</code></pre></li> -<li><a href="https://cad.onshape.com/glassworks/explorer/#/Webhook/getWebhook">Webhook/getWebhook</a> -<pre tabindex="0"><code>curl -X &#39;GET&#39; \ -&#39;https://cad.onshape.com/api/v6/webhooks/webhookId&#39; \ --H &#39;Accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; -</code></pre></li> -<li><a href="https://cad.onshape.com/glassworks/explorer/#/Webhook/updateWebhook">Webhook/updateWebhook</a> -<pre tabindex="0"><code> curl -X &#39;POST&#39; \ -&#39;https://cad.onshape.com/api/v6/webhooks/webhookId&#39; \ --H &#39;Accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; \ --H &#39;Content-Type: application/json;charset=UTF-8; qs=0.09&#39; \ --d &#39;{ -&#34;id&#34;: &#34;webhookId&#34;, -&#34;options&#34;: { -&#34;collapseEvents&#34;: true | false -} -}&#39; -</code></pre><ul> -<li>Note that the webhook <code>id</code> must be sent in both the URL and the request body.</li> -</ul> -</li> -<li><a href="https://cad.onshape.com/glassworks/explorer/#/Webhook/unregisterWebhook">Webhook/unregisterWebhook</a> -<pre tabindex="0"><code> curl -X &#39;DELETE&#39; \ -&#39;https://cad.onshape.com/api/v6/webhooks/{webhookId}?blockNotification=false&#39; \ --H &#39;accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; -</code></pre></li> -<li><a href="https://cad.onshape.com/glassworks/explorer/#/Webhook/pingWebhook">Webhook/pingWebhook</a> -<pre tabindex="0"><code> curl -X &#39;POST&#39; \ -&#39;https://cad.onshape.com/api/v6/webhooks/{webhookId}/ping&#39; \ --H &#39;Accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; -</code></pre></li> -</ul> -<h2 id="sample-workflows">Sample Workflows</h2> -<h3 id="create-a-webhook">Create a webhook</h3> -<p>An application registers for event notification by:</p> -<ol> -<li>Making a REST call to the Onshape web service</li> -<li>Providing a URL to notify</li> -<li>Providing the required parameters for the event types to be registered</li> -</ol> -<p>If the registration request is well-formed, the registration API call returns information about the registration, including a unique <code>id</code> string that identifies the webhook registration. This corresponds to the <code>webhookId</code> field in other endpoints. No de-duplication of notification registrations is performed by the API. Each registration call will yield a new <code>registrationId</code>, even if the parameters are identical to those passed in a prior call.</p> -<p>Shortly after an application calls the notification registration API, Onshape will make make an asynchronous trial notification call to the URL generated from the URL template with an event type of <code>webhook.register</code> to test if the application notification server is accessible. If the trial notification delivery fails to return an HTTP <code>200</code> status code, the notification registration is cancelled. The trial notification is usually delivered after the notification registration has been received by the application. However, variations in network delays may result in the trial notification occurring before the response is received and processed by the application, so the notification handler should be ready to process notifications before the registration call is made.</p> -<p>In this example, we use a webhook to send information from Onshape to another server. You need a URL for Onshape to send notifications to, and a way to view the messages sent with those notifications.</p> -<ol> -<li>Open an Onshape document, or create a new one.</li> -<li>In this example, we want to receive a notification from Onshape any time a new version is created in the specified document. For this, we’ll use <code>onshape.model.lifecycle.createversion</code> as our <code>event</code>.</li> -<li>The event type requires one parameter. We’ll use our <code>documentId</code> for this field (shown as <code>000000000000000000000000</code> in the example below).</li> -<li>All event types require specifying <code>true</code> or <code>false</code> for the <code>options.collapseEvents</code> field. In this case, set the field to <code>false</code>.</li> -<li>Next, we need the URL to send the notification to. You must provide your own URL to receive notifications here.</li> -<li>Confirm your <a href="https://cad.onshape.com/glassworks/explorer/#/Webhook/createWebhook">createWebhook</a> call looks like this (substitute your own authorization credentials, document ID, and URL), then make the call.</li> -</ol> -<pre tabindex="0"><code> curl -X &#39;POST&#39; \ -&#39;https://cad.onshape.com/api/v6/webhooks&#39; \ --H &#39;Accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; \ --H &#39;Content-Type: application/json;charset=UTF-8; qs=0.09&#39; \ --d &#39;{ -&#34;documentId&#34;: &#34;000000000000000000000000&#34;, -&#34;events&#34;: [ -&#34;onshape.model.lifecycle.createversion&#34; -], -&#34;options&#34;: { -&#34;collapseEvents&#34;: false -}, -&#34;url&#34;: &#34;https://sampleUrl.org&#34; -}&#39; -</code></pre><ol start="7"> -<li>In your application, confirm that you received the <code>webhook.register</code> event from Onshape.</li> -<li>In Onshape, create a new version in your document.</li> -<li>In your application, confirm that you received the <code>onshape.model.lifecycle.createversion</code> event from Onshape. Make note of the <code>id</code> in the response; use this as your <code>webhookId</code> in subsequent examples.</li> -</ol> -<h3 id="get-webhook-info">Get webhook info</h3> -<ol> -<li>Complete the <a href="#create-a-webhook">Create a webhook</a> steps above to obtain a <code>webhookId</code>.</li> -<li>Create your <a href="https://cad.onshape.com/glassworks/explorer/#/Webhook/getWebhook">getWebhook</a> call. substitute your own authorization credentials and <code>webhookId</code> (shown as <code>000000000000000000000000</code> in the example below), then make the call.</li> -</ol> -<pre tabindex="0"><code> curl -X &#39;GET&#39; \ -&#39;https://cad.onshape.com/api/v6/webhooks/000000000000000000000000&#39; \ --H &#39;Accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; \ -</code></pre><ol start="3"> -<li>Confirm that the <code>event</code> in the response is <code>onshape.model.lifecycle.createversion</code>.</li> -</ol> -<h3 id="update-a-webhook">Update a webhook</h3> -<ol> -<li>Complete the <a href="#create-a-webhook">Create a webhook</a> steps above to obtain a <code>webhookId</code>. Note that in the same response, the webhook <code>description</code> is <code>null</code>.</li> -<li>Create your <a href="https://cad.onshape.com/glassworks/explorer/#/Webhook/updateWebhook">updateWebhook</a> call. In this example, ww update the webhook&rsquo;s <code>description</code>. Substitute your own authorization credentials and <code>webhookId</code> (shown as <code>000000000000000000000000</code> in the example below in both the URL and request body). Then make the call.</li> -</ol> -<pre tabindex="0"><code> curl -X &#39;POST&#39; \ -&#39;https://cad.onshape.com/api/v6/webhooks/000000000000000000000000&#39; \ --H &#39;accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Authorization: Basic CREDENTIALS&#39; \ --H &#39;Content-Type: application/json;charset=UTF-8; qs=0.09&#39; \ --d &#39;{ -&#34;id&#34;: &#34;000000000000000000000000&#34;, -&#34;description&#34;: &#34;Send a notification each time a document version is created.&#34;, -&#34;options&#34;: { -&#34;collapseEvents&#34;: false -} -}&#39; -</code></pre><ol start="3"> -<li>Confirm in the response that the webhook <code>description</code> is set to <code>Send a notification each time a document version is created.</code></li> -</ol> -<h3 id="delete-a-webhook">Delete a webhook</h3> -<p>When an application no longer needs to be notified of changes specified by a particular notification registration, it should normally deregister the notification request. Deregistration is performed by making an HTTP that specifies the hook to deregister. Onshape will attempt to call the deregistered hook with an event type of <code>webhook.unregister</code> as validation that the deregistration is complete. If the application does not deregister the webhook, Onshape will continue delivering notifications until the the application either returns an error in response to a notification for the webhook or fails to respond at all for an extended period of time.</p> -<ol> -<li>Complete the <a href="#create-a-webhook">Create a webhook</a> steps above to obtain a <code>webhookId</code>.</li> -<li>Create your <a href="https://cad.onshape.com/glassworks/explorer/#/Webhook/deleteWebhook">deleteWebhook</a> call. substitute your own authorization credentials and <code>webhookId</code> (shown as <code>000000000000000000000000</code> in the example below), then make the call.</li> -</ol> -<pre tabindex="0"><code> curl -X &#39;DELETE&#39; \ -&#39;https://cad.onshape.com/api/v6/webhooks/000000000000000000000000&#39; \ --H &#39;Accept: application/json;charset=UTF-8; qs=0.09&#39; \ --H &#39;Authorization: Basic CREDENTIALS=&#39; \ -</code></pre><ol start="3"> -<li>In your application, confirm that you received the <code>webhook.unregister</code> event from Onshape.</li> -<li>In Onshape, create a new version in your document.</li> -<li>In your application, confirm that no new events have been received.</li> -</ol> -<h2 id="additional-resources">Additional Resources</h2> -<ul> -<li><a href="https://cad.onshape.com/help/Content/Plans/webhooks.htm">Onshape Help: Webhooks</a></li> -<li><a href="https://onshape-public.github.io/docs/api-intro/explorer">API Guide: API Explorer</a></li> -<li><a href="https://cad.onshape.com/help/Content/Plans/webhooks.htm">API Explorer: Webhooks</a></li> -<li><a href="https://github.com/onshape-public/onshape-clients/blob/master/python/test/test_webhooks.py#L126">Sample Code: Python Webhooks</a></li> -</ul>Docs: Launch Checklisthttps://onshape-public.github.io/docs/app-store/checklist/Mon, 01 Jan 0001 00:00:00 +0000https://onshape-public.github.io/docs/app-store/checklist/ -<p>This checklist brings together the processes you should follow to ensure your app is launched successfully. While all tasks must be completed to submit your app to the Onshape App Store, the task sequence provided here is a suggestion.</p> -<h3 id="1-understand-quality-expectations">1. Understand quality expectations</h3> -<p>These are to ensure that the Onshape App Store remains a trusted resource and that quality is maintained Review the <a href="https://onshape-public.github.io/docs/app-store/quality">Quality Considerations</a> page, and reach out to the <a href="mailto:onshape-developer-relations@ptc.com">Developer Relations team</a> with any questions.</p> -<h3 id="2-sign-in-to-your-developer-account">2. Sign in to your developer account</h3> -<p>Sign in to your developer account at <a href="https://dev-portal.onshape.com">dev-portal.onshape.com</a>, and ensure your developer account details are accurate. Contact our <a href="mailto:api-support@onshape.com">API Support team</a> if you need assistance.</p> -<h3 id="3-authenticate-your-app">3. Authenticate your app</h3> -<p>Please refer to the <a href="https://onshape-public.github.io/docs/auth/oauth">OAuth documentation</a> for information on authenticating your app with OAuth2.</p> -<h3 id="4-build-your-app">4. Build your app</h3> -<p>While building your app, use the resources in our Onshape Developer Documentation, including this API Guide and our API Explorer. We recommend familiarizing yourself with the following pages:</p> -<ul> -<li><a href="https://onshape-public.github.io/docs/api-intro/">Introduction to the Onshape REST API</a></li> -<li><a href="https://onshape-public.github.io/docs/api-intro/architecture">Onshape Architecture</a></li> -<li><a href="https://onshape-public.github.io/docs/app-dev/">Onshape App Development</a></li> -<li><a href="https://onshape-public.github.io/docs/app-dev/extensions">Extensions</a> <!-- Susan move the videos to their pages --></li> -<li><a href="https://onshape-public.github.io/docs/app-dev/clientmessaging">Client Messaging</a></li> -<li><a href="https://onshape-public.github.io/docs/app-store">Onshape App Store</a></li> -</ul> -<h3 id="5-prepare-your-store-entry">5. Prepare your store entry</h3> -<p>Prepare the descriptions, promotional graphics, screenshots, and videos you&rsquo;ll add to your store entry. Make sure you include a link to if required. Watch this video for more details.</p> -<p>See the video below for a walkthrough:</p> -<p><a href="https://onshape.wistia.com/medias/tuhuzfi7we"><img src="https://onshape-public.github.io/images/AppStoreEntryVideoCard.png" style="width:5in" alt="OAuth app creation video"/></a></p> -<h3 id="6-run-beta-tests">6. Run beta tests</h3> -<p>During the beta period, try to enlist at least 5 active testers to get feedback before making your app available to the general public.</p> -<ol> -<li>To find beta testers, contact our <a href="mailto:onshape-developer-relations@ptc.com">Developer Relations team</a>, and recruit via the <a href="https://forum.onshape.com/categories/developer-community">Onshape forum</a>.</li> -<li>To give beta users early visibility, first <a href="https://cad.onshape.com/help/Content/teams-enterprise.htm">create a team</a>, then ensure your app is shared with that team in the <a href="https://dev-portal.onshape.com">Developer Portal</a>. See the <a href="https://onshape.wistia.com/medias/5t1dwkspfo">Create a Team in Onshape video</a> for a walkthrough.</li> -</ol> -<h3 id="7-determine-your-apps-price">7. Determine your app&rsquo;s price</h3> -<p>Once you&rsquo;ve determined your monetization model, set up your price, billing, and other details. Billing should be tested, and to do so a staging environment is available. See the <a href="https://onshape-public.github.io/docs/api-adv/billing">Billing API</a> page for more details.</p> -<h3 id="8-sign-and-return-the-developer-agreement">8. Sign and return the developer agreement</h3> -<p>Email to the <a href="mailto:onshape-developer-relations@ptc.com">Developer Relations team</a> to obtain yours.</p> -<h3 id="9-submit-your-app-for-final-testing">9. Submit your app for final testing</h3> -<p>Once you&rsquo;ve returned the developer agreement, you can submit your app to the <a href="mailto:onshape-developer-relations@ptc.com">Developer Relations team</a> for final testing. <a href="https://onshape-public.github.io/docs/app-store/testingguidelines">This is a comprehensive functionality and design test.</a> During this testing period (expect up to a week, depending on complexity), changes to code are prohibited unless requested. At the conclusion of the test, you will receive one of the following notifications from our Developer Relations team:</p> -<ul> -<li>Approved for release</li> -<li>Approved for release with feedback</li> -<li>Changes required before another round of testing</li> -</ul> -<h3 id="10-integrate-your-support-systems">10. Integrate your support systems</h3> -<p>Whether you use Zendesk, Jira, or email support, we’ll help you determine and set up this integration. Contact the <a href="mailto:onshape-developer-relations@ptc.com">Developer Relations team</a> to explore these options. This is the channel we will use to test your app and provide feedback.</p> -<h3 id="11-connect-via-slack">11. Connect via Slack</h3> -<p>Connecting directly with our Support, Tech, and Sales teams has proven to be valuable to app developers. This dedicated channel is simple to implement if you already have a paid Slack account. If not (or if you want to use the free version of Slack), we can add members of your team as guests to our account. Please contact <a href="mailto:amagnin@ptc.com">Aaron Magnin</a> to establish this connection.</p> -<h3 id="12-final-check-and-publish">12. Final check and publish</h3> -<p>First, double-check you&rsquo;ve done everything on this list. Now you&rsquo;re ready to publish your app to the production channel! Send an email detailing <strong>when</strong> you’d like this to happen to the <a href="mailto:onshape-developer-relations@ptc.com">Developer Relations team</a>.</p> -<h3 id="13-promote-your-app">13. Promote your app</h3> -<p>Start promoting your app with the <a href="https://www.ptc.com/en/brand-guide/logos/onshape">Onshape badge</a> and by presenting it to our internal teams in one of the following ways:</p> -<ul> -<li>To the Onshape Tech and Sales teams in a small meeting (~1 hour, Wednesdays at noon Eastern Time)</li> -<li>To the entire Onshape organization in a company-wide meeting (~5-10 minutes, Thursdays at 11am Eastern Time).</li> -</ul> -<h3 id="14-encourage-reviews-from-users">14. Encourage reviews from users</h3> -<p>The value of reviews is not to be underestimated. Reviews give users an opportunity to provide feedback, and can also signal to others that your app is worth investigating.</p> -<h3 id="15-maintain-your-app">15. Maintain your app</h3> -<p>Continually fix stability and performance issues. Improving the user experience will result in more engaged users, higher ratings, and in turn, more success.</p> -<blockquote> -<blockquote> -<p>Failure to respond to customer tickets in a reasonable time will lead to the removal of your app from the Onshape App Store.</p> -</blockquote> -</blockquote> -<h3 id="16-increase-engagement-and-retention">16. Increase engagement and retention</h3> -<p>Aim to increase user engagement, retain and grow your audience, and earn more revenue by:</p> -<ul> -<li>Encouraging repeat visits with a nurture stream and training materials</li> -<li>Integrating more features from user requests</li> -<li>Interacting with and understanding your audience via the <a href="https://forum.onshape.com/categories/developer-community">Onshape forum</a>, social media, etc.</li> -</ul> -<h3 id="17-address-app-security">17. Address app security</h3> -<p>At some point, a prospect or user will enquire about your app&rsquo;s security controls. To address this, we recommend that you understand SOC 2 Compliance requirements, and consider filling out the <a href="https://www.google.com/url?q=https://cloudsecurityalliance.org/artifacts/consensus-assessments-initiative-questionnaire-v3-1/&amp;sa=D&amp;source=editors&amp;ust=1686683388460627&amp;usg=AOvVaw2xq8zlODs3a7W2Y3jighnr">Consensus Assessment Initiative Questionnaire</a> (CAIQ). Onshape/PTC cannot and will not attest to your compliance. More on SOC Compliance can be found at the following links:</p> -<ul> -<li><a href="https://us.aicpa.org/interestareas/frc/assuranceadvisoryservices/aicpasoc2report">AICPA.org</a></li> -<li><a href="https://en.wikipedia.org/wiki/System_and_Organization_Controls">Wikipedia: System and Organization Controls</a></li> -</ul>Docs: Testing Guidelineshttps://onshape-public.github.io/docs/app-store/testingguidelines/Mon, 01 Jan 0001 00:00:00 +0000https://onshape-public.github.io/docs/app-store/testingguidelines/ -<p>The purpose of this document is to help you get your application and App Store entry ready for QA testing.</p> -<h2 id="application-release-workflow-arw">Application Release Workflow (ARW)</h2> -<p>Each application submitted to the Onshape App Store goes through a series of stage-gates:</p> -<ol> -<li>Starting state: <code>Ok to deploy to limited visibility on Production</code> (Beta testing)</li> -<li><code>Ok to make Public</code></li> -<li>Goal state: <code>Application is Public</code></li> -</ol> -<p>To advance to the next stage, your application must pass testing, and your App Store entry must pass review.</p> -<h2 id="kick-off-testing">Kick Off Testing</h2> -<p>While completing the <a href="https://onshape-public.github.io/docs/app-store/checklist">Launch Checklist</a>, you will need to use Jira to request testing and release for your application. You can initiate the following tasks from Jira:</p> -<ul> -<li><code>Request application testing</code>: This puts your application in the testing queue. We will note when testing has started (<code>in progress</code>) and when concluded, the ticket will be closed. The outcome will include notes and links to any issues generated (<code>tickets</code>). This phase may include as many iterations as needed to get your application ready.</li> -<li><code>Request public (general) authorization</code>: We will note when testing has started (<code>in progress</code>), and this request will trigger a review of your app store entry and any outstanding bugs. Note there is no implied testing of your application, simply a review of outstanding issues (<code>tickets</code>) and of the App Store entry. Success at this stage will advance the Application Release Workflow (ARW), and you can request public release.</li> -<li><code>Request public (general) release</code>: This request states that you have coordinated with the <a href="mailto:onshape-developer-relations@ptc.com">Developer Relations team</a> and the Onshape Marketing team<!--How do they get in touch with the Marketing team? Slack?-->, and agreement has been reached that the app is ready for launch. Congratulations!</li> -</ul> -<h2 id="testing-protocol">Testing Protocol</h2> -<p><em>Applications</em> are first tested against the checklist in <a href="#addendum-a">Addendum A</a>. <em>Production App Store</em> entries are then performed against the checklist in <a href="#addendum-b">Addendum B</a>.</p> -<p>Results will be viewable in your Onshape support system (i.e., Zendesk, Jira). The result of each test will be one of:</p> -<ul> -<li><code>Pass</code>: -<ul> -<li>No action needed.</li> -<li>No notification issued. <!-- How do they know it passed? Does it just show up in the app store? --></li> -</ul> -</li> -<li><code>Enhancement</code>: Suggestions we believe would make the application better. -<ul> -<li>Will NOT prevent the application from being turned on for public access.</li> -</ul> -</li> -<li><code>Bug (low priority)</code>: Slight deviations from the criteria that have low end user impact. -<ul> -<li>Will NOT prevent the application being turned on for public access.</li> -<li>No stipulated time-frame for resolution.</li> -</ul> -</li> -<li><code>Bug (medium priority)</code>: Material deviations from the criteria that are noticeable to the end-user. Represents a minor problem that requires a work-around. -<ul> -<li>Will NOT prevent the application from being turned on for public access.</li> -<li>Must be fixed within 30 days.</li> -</ul> -</li> -<li><code>Bug (high priority)</code>: Significant deviation from the criteria. -<ul> -<li>WILL prevent the application from being turned on for public access.</li> -</ul> -</li> -<li><code>Bug (MUST FIX)</code>: Significant deviation from protocol or security violation. -<ul> -<li>WILL prevent the application from being turned on for public access.</li> -<li>If the application is already public, it may be temporarily suspended from the App Store.</li> -</ul> -</li> -</ul> -<h2 id="testing-notes">Testing Notes</h2> -<ul> -<li>Testing may be requested at any time.</li> -<li>Testing is done on a first-come basis.</li> -<li>When testing is complete (pass or fail), you go to the back of the queue.</li> -</ul> -<h2 id="addendum-a">Addendum A</h2> -<p><font size="5">Application Test Criteria</font></p> -<ul> -<li>The application must use the Onshape OAUTH mechanism</li> -<li>The OAUTH must be against the correct stack</li> -<li>To be promoted to the Production stack, and hosted service must be on a monitored production server with worldwide 24/7 availability.</li> -<li>The application should not generate any avoidable console (browser) errors</li> -<li>The application should should provide one or more of the following options. The user should not have to leave the registration workflow to complete a pre-requisite. -<ul> -<li>Sign in using the Onshape ID (account created silently on first use)</li> -<li>Sign in with partner product account credentials</li> -<li>Create a new partner account</li> -</ul> -</li> -<li>The application must be capable of managing/displaying documents in excess of 20. The application must display reasonable performance when reading documents, workspaces, elements, and parts. At scale, an account may have thousands of documents, many with multiple workspaces and each with multiple elements. Suggested strategies include: -<ul> -<li>Using a <code>Next</code> button to load the next 20 documents</li> -<li>Using infinite scroll (loading the next 20 if the scrollbar reaches the bottom of the dialog)</li> -<li>Displaying the most recently-opened documents first</li> -<li>Displaying a counter of documents/workspaces/elements read</li> -<li>Using progressive loading</li> -</ul> -</li> -<li>The application should correctly list valid documents when <code>per document app access</code> is turned on.</li> -<li>The application should correctly handle selection of versions.</li> -<li>The application should correctly handle selection of workspaces (branches).</li> -<li>The application should correctly handle/display elements that are: -<ul> -<li>Part Studios that contain nothing</li> -<li>Assemblies that contain nothing</li> -<li>Part Studios that contain only surfaces</li> -<li>Part Studios that contain only wire data (e.g., helices)</li> -</ul> -</li> -<li>The application should appropriately handle revocation of a grant.</li> -</ul> -<h2 id="addendum-b">Addendum B</h2> -<p><font size="5">App Store Testing Criteria</font></p> -<ul> -<li>The application should have a descriptive name</li> -<li>The application summary should be accurate</li> -<li>The redirect URLS should be valid</li> -<li>The iframe URL should be valid</li> -<li>The <code>Grant</code> (permissions) request should be no more than is needed</li> -<li>The <code>Application Type</code> should be correctly set</li> -<li>Team visibility should be set (optional)</li> -<li>The category should be appropriate</li> -<li>The application description should be accurate</li> -<li>The Sign-In URL should be valid</li> -<li>The pricing summary should be accurate -<ul> -<li>i.e., trials should not be listed as <code>Free</code>; <code>Free for xx days and then $xx/month</code> is more accurate.</li> -</ul> -</li> -<li>All pay plans should have accurate descriptions.</li> -<li>The support URL should point to a resource for help (the resource should NOT be an FAQ page, unless that page also contains one of the other options): -<ul> -<li>Support ticketing system (e.g., Zendesk, Jira, etc.)</li> -<li>Web page with a telephone number</li> -<li>Web page with an email address</li> -<li>Forum</li> -</ul> -</li> -<li>The EULA link should point to an English Language EULA.</li> -</ul>Docs: Quality Considerationshttps://onshape-public.github.io/docs/app-store/quality/Mon, 01 Jan 0001 00:00:00 +0000https://onshape-public.github.io/docs/app-store/quality/ -<h2 id="core-app-quality">Core App Quality</h2> -<p>Onshape users expect high-quality apps. App quality directly influences the long-term success of your app in terms of installs, user rating and reviews, engagement, and user retention.</p> -<p>This page helps you assess the core aspects of quality in your app, through a compact set of quality criteria and associated tests. All Onshape apps should meet these criteria.</p> -<p>Before publishing your apps, test them against these criteria to ensure that they function well. Your testing should go well beyond what&rsquo;s described here; the purpose of this page is to specify the essential quality characteristics all apps should display, so that you can cover them in your test plans.</p> -<h2 id="functionality">Functionality</h2> -<p>These criteria ensure that your app provides the expected functional behavior, with the appropriate level of permissions.</p> -<table> -<thead> -<tr> -<th>Area</th> -<th>Description</th> -</tr> -</thead> -<tbody> -<tr> -<td>Permissions</td> -<td>The app requests only the <em>absolute minimum</em> permissions that it needs to support core functionality.</td> -</tr> -</tbody> -</table> -<h2 id="compatibility-performance-and-stability">Compatibility, Performance, and Stability</h2> -<p>These criteria ensure that apps provide the compatibility, performance, stability, and responsiveness expected by users.</p> -<table> -<thead> -<tr> -<th>Area</th> -<th>Description</th> -</tr> -</thead> -<tbody> -<tr> -<td>Stability</td> -<td>The app does not crash, force close, freeze, or otherwise function abnormally.</td> -</tr> -<tr> -<td>Performance</td> -<td>The app loads quickly or provides onscreen feedback to the user (e.g., a progress indicator or similar cue) if the app takes longer than two (2) seconds to load.</td> -</tr> -<tr> -<td>Visual quality</td> -<td>The app displays graphics, text, images, and other UI elements without noticeable distortion, blurring, or pixelation.</td> -</tr> -</tbody> -</table> -<h2 id="security">Security</h2> -<p>These criteria ensure that apps handle user data and personal information safely.</p> -<table> -<thead> -<tr> -<th>Area</th> -<th>Description</th> -</tr> -</thead> -<tbody> -<tr> -<td>Data</td> -<td>All private data is stored in the app&rsquo;s internal storage. </br> All data from external storage is verified before being accessed. </br> No personal or sensitive user data is logged to the system or app-specific log.</td> -</tr> -<tr> -<td>Networking</td> -<td>All network traffic is sent over SSL.</td> -</tr> -</tbody> -</table> -<h2 id="onshape-app-store">Onshape App Store</h2> -<p>These criteria ensure that your apps are ready to publish on Onshape App Store.</p> -<table> -<thead> -<tr> -<th>Area</th> -<th>Description</th> -</tr> -</thead> -<tbody> -<tr> -<td>App Details page</td> -<td>The app’s feature graphic follows guidelines such as: </br>- The app listing includes a high-quality feature graphic.</br>- The feature graphic does not resemble an advertisement.</br>- The app’s screenshots or videos do not represent the content and experience of your app in a misleading way.</td> -</tr> -<tr> -<td>User support</td> -<td>User-reported bugs are addressed if they are reproducible.</td> -</tr> -</tbody> -</table> -<h2 id="test-procedures">Test procedures</h2> -<p>These test procedures help you discover various types of quality issues in your app. You can combine the tests or integrate groups of tests together in your own test plans. See the sections above for references that associate criteria with these test procedures.</p> -<table> -<thead> -<tr> -<th>Type</th> -<th>Description</th> -</tr> -</thead> -<tbody> -<tr> -<td>Core suite</td> -<td>Navigate to all parts of the app: all screens, dialogs, settings, and all user flows.</td> -</tr> -<tr> -<td>Security</td> -<td>- Review all data stored in external storage. </br>- Review how data loaded from external storage is handled and processed.</td> -</tr> -</tbody> -</table>Docs: Sync Data and Metadatahttps://onshape-public.github.io/docs/tutorials/sync/Mon, 01 Jan 0001 00:00:00 +0000https://onshape-public.github.io/docs/tutorials/sync/ -<p>The first business case is probably the most common, “How do I sync data -that I create in Onshape with my ERP or PLM system?”. There could be -many reasons why you would want to sync data between two different -systems. Primarily Onshape is a system that creates new data. This data -is created by designers as they perform their daily tasks. While the -designer works primarily in Onshape, the actual data that they create -does not exist in a vacuum, it is used by other departments, other -processes within the organization. These departments and processes -probably do not have access to Onshape or the required knowledge of how -to use Onshape. In addition, quite often, the data generated by Onshape -will be augmented with additional data as the product lifecycle process -progresses.</p> -<p>Therefore, Onshape could be considered the genesis of the data that will -be used to develop a product, yet it is not the only data that will be -required.</p> -<h2 id="overview">Overview</h2> -<p>In this business case we examine how a designer could work in Onshape -and how the data generated by Onshape can be used to make decisions in -other systems. Based upon the decisions made, data is pushed back to -Onshape as values calculated in another system. Let’s look at the -process in much more detail.</p> -<h3 id="step-1-define-properties-in-onshape">Step 1: Define Properties in Onshape</h3> -<p><img src="https://onshape-public.github.io/images/integrationguideimage31.png" -style="width:5.41667in;height:1.84722in" -alt="Diagram Description automatically generated" /></p> -<ol> -<li> -<p>In the first step, the designer starts a new part in Onshape – -remember that in Onshape a Part can be created along with other -parts in a Part Studio, so we can assume that there could be -multiple parts created in the single document. Obviously, we want -the designer to have the freedom to use all Onshape functionality -without constraints placed by the demands of the integration.</p> -</li> -<li> -<p>At some point in the design process, the designer will be required -to enter property values for the part – these could include values -such as the Part Name, the description, material and so on.</p> -</li> -<li> -<p>The designer clicks the “Save” or “Apply” button for the properties -and closes the properties window.</p> -</li> -<li> -<p>A web hook that listens to any changes in the properties has been -defined. As the user saves the properties, the web hook is -triggered, and it will send a notification through the defined web -hook to the third-party system.</p> -</li> -</ol> -<p><img src="https://onshape-public.github.io/images/integrationguideimage6.png" -style="width:0.47222in;height:0.47222in" />Note: There are Part -properties, workspace properties and document properties – all these -properties live at different levels of the document. While the trigger -could pick up changes to any to these properties, we are currently -focused on just Part properties – the event will be triggered on any -saving of properties, however our third-party code can ignore anything -that’s not a Part (or an Assembly). In this next step we assume that a -new object is being created in the third-party application.</p> -<h3 id="step-2-create-corresponding-object">Step 2: Create Corresponding Object</h3> -<p><img src="https://onshape-public.github.io/images/integrationguideimage32.png" -style="width:5.16667in;height:2.13889in" -alt="Diagram Description automatically generated" /></p> -<ol> -<li> -<p>Once the designer made changes to the properties in Onshape and -saved those changes, a message is sent to our third-party -application. This message is in JSON format and contains minimal -information such as the Workspace ID, the Document ID, the Element -ID, the Part ID (if it’s a Part) and information regarding the event -that was triggered. The third-party application receives this -information to an endpoint that was defined during the setup of the -web hook.</p> -</li> -<li> -<p>The code in our application can now use the ID’s sent over to check -if an object with corresponding IDs exists in our system. Here we -are assuming that no such object exists. This does mean that we must -store Onshape IDs into our objects in the third-party system.</p> -</li> -<li> -<p>We then create a new object and populate the ID information and save -it to the database. Note that at this point in time, we only have -minimal information that provides no more than the identity of the -Onshape Part.</p> -</li> -<li> -<p>Next, in order to get the complete metadata, we must make a REST API -call to Onshape in order to get the metadata for the part. Since we -were provided the ID information in the web hook, we have enough -information to go back to Onshape and request the metadata for a -specific, document, element, workspace and part.</p> -</li> -</ol> -<p><img src="https://onshape-public.github.io/images/integrationguideimage6.png" -style="width:0.47222in;height:0.47222in" />Note that you can either -store the Onshape IDs in separate fields in your database or as one long -unique string which can be used to easily identify the part in your -application.</p> -<h3 id="step-3-get-onshape-metadata">Step 3: Get Onshape Metadata</h3> -<p><img src="https://onshape-public.github.io/images/integrationguideimage33.png" -style="width:5.75in;height:2.04167in" -alt="Graphical user interface, text, application, chat or text message Description automatically generated" /></p> -<ol> -<li> -<p>The response from the call to the Onshape API is sent back as JSON. -The data will contain a lot of different objects that represent the -property values, their types, the IDs, name of the property, value -of the property, etc.</p> -</li> -<li> -<p>Once received this data must be parsed by your third-party -application code and the corresponding object updated as required. -For bi-directional update, it is important to store the Onshape -property IDs of any data that will need to be synced back to Onshape -from the third-party application.</p> -</li> -<li> -<p>This is an optional stage. Once you have all the metadata values -imported, you could now calculate any values that are based off the -metadata. The most common use case scenario is the generation of -intelligent part numbers. Based off configuration, part type, etc., -you could generate a part number that has specific meaning within -the context of the company.</p> -</li> -<li> -<p>If you calculated specific values, you can now store them in your -database.</p> -</li> -</ol> -<h3 id="step-4-modify-properties-in-onshape">Step 4: Modify Properties in Onshape</h3> -<p><img src="https://onshape-public.github.io/images/integrationguideimage34.png" -style="width:5.04167in;height:3.97222in" -alt="Diagram Description automatically generated" /></p> -<ol> -<li> -<p>As in Step 1 the designer updates the properties in Onshape – this -is obviously something that can happen multiple times</p> -</li> -<li> -<p>The web hook is triggered when the designer saves the property -changes</p> -</li> -<li> -<p>Our third-party application is listening for property changes</p> -</li> -<li> -<p>The third-party application’s code will check if the corresponding -object exists based off the IDs sent from Onshape.</p> -</li> -<li> -<p>In this scenario the corresponding object has already been saved in -our system</p> -</li> -<li> -<p>We make a REST API call to Onshape to get the metadata based off the -IDs sent from Onshape.</p> -</li> -<li> -<p>Onshape returns the JSON that represents the updated properties</p> -</li> -<li> -<p>We ingest the updated metadata and update our existing object in the -third-party system.</p> -</li> -</ol> -<h3 id="step-5-request-part-number">Step 5: Request Part Number</h3> -<p><img src="https://onshape-public.github.io/images/integrationguideimage35.png" -style="width:5.76389in;height:2.13889in" -alt="Graphical user interface, text, application, chat or text message Description automatically generated" /></p> -<ol> -<li> -<p>As we will see later, Onshape has the built in capability to pull -custom part numbers from a third-party system. From either the -properties window or the release candidate window, click the button -to request a part number</p> -</li> -<li> -<p>Onshape sends basic ID information to a predefined endpoint in our -third-party app.</p> -</li> -<li> -<p>The ID information sent by Onshape is enough data to find the -corresponding object in our database. We then extract from that -object the pre-calculated intelligent part number – or we can -calculate it at this point.</p> -</li> -<li> -<p>The part number is returned to Onshape and populated in the Part -Number field</p> -</li> -</ol> -<p><img src="https://onshape-public.github.io/images/integrationguideimage6.png" -style="width:0.47222in;height:0.47222in" />Note that in order to pull a -part number from a third-party application we will need to implement -OAuth2 in our application and grant Onshape access to the resources of -our application. Onshape has a very good mechanism for achieving this -and we will be explaining this in detail in this section.</p> -<p>Note that by default Onshape uses its own internal Part number -generator, in order to use a custom third-party generator, we will need -to define an app extension and then define in the Enterprise release -settings to use our custom part number generator.</p> -<h3 id="step-6-push-updates-from-third-party-application">Step 6: Push Updates from Third-Party Application</h3> -<p><img src="https://onshape-public.github.io/images/integrationguideimage36.png" -style="width:5.75in;height:2.45833in" -alt="Graphical user interface, text, application, chat or text message Description automatically generated" /></p> -<ol> -<li> -<p>In this scenario we are updating an Object in our third-party -application and expecting that some of the property values will be -updated in Onshape. We can either send over all the properties -populated for this object, or a subset of properties and values</p> -</li> -<li> -<p>The REST API to update properties in Onshape requires that we -reference the IDs of the properties that we are updating. For this -reason we have stored the Onshape property IDs with our metadata -object in our database.</p> -</li> -<li> -<p>We construct the correct JSON that contains all the properties to -update and the new values. We can then call the Onshape REST API to -update the properties in Onshape with the new data.</p> -</li> -<li> -<p>Once successfully completed, the Onshape REST API call will return -HTTP 200 and we can notify the user if needed.</p> -</li> -</ol> -<p><img src="https://onshape-public.github.io/images/integrationguideimage6.png" -style="width:0.47222in;height:0.47222in" />Note that updates to Onshape -will happen behind the scenes in real-time, therefore someone working on -the document in Onshape will be able to see the updates as soon as they -have been made. There is no notification in Onshape that notifies the -user that properties have been updated, however you can open the -properties window and view the updated data.</p> -<h2 id="implementation">Implementation</h2> -<p>We’ll start by defining an <a href="https://onshape-public.github.io/docs/app-dev/extensions">App Extension</a> in Onshape so that we can -receive custom part numbers.</p> -<p><img src="https://onshape-public.github.io/images/integrationguideimage4.png" -style="width:0.43056in;height:0.43056in" /></p> -<h3 id="debug">Debug</h3> -<p>All Browsers now have developer tools exposed in their interface. These -tools provide us ways to debug client code, view console messages and -most importantly for our use case, view Network requests and their -response.</p> -<p>In this example I am using Chrome’s developer tools. Most other Browsers -have more or less copied Chrome’s layout for the developer tools so it -should be easy to find the network section.</p> -<p><img src="https://onshape-public.github.io/images/integrationguideimage39.png" -style="width:5.36972in;height:4.16096in" -alt="Graphical user interface, text, application Description automatically generated" /></p> -<p><span id="_Toc102977895" class="anchor"></span>Figure 24 Accessing -Chrome&rsquo;s Developer Tools</p> -<p>Let’s take the simple use case of trying to understand which endpoint -Onshape uses for saving Metadata.</p> -<p>Open a document in Onshape and define some properties – don’t save yet.</p> -<p><img src="https://onshape-public.github.io/images/integrationguideimage40.png" -style="width:3.42406in;height:2.25966in" -alt="Graphical user interface, text, application, email Description automatically generated" /></p> -<p>Prior to saving open the developer tools and click on the “Network” tab.</p> -<p><img src="https://onshape-public.github.io/images/integrationguideimage41.png" style="width:6.5in;height:2.37014in" -alt="Table Description automatically generated" /></p> -<p><span id="_Toc102977896" class="anchor"></span>Figure 25 Developer Tools -Network Tab</p> -<p>Next save the updated properties by clicking either the Apply Button or -the Save Button</p> -<p>In the Network tab you will see a new web request – select it:</p> -<p><img src="https://onshape-public.github.io/images/integrationguideimage42.png" -style="width:5.40656in;height:2.82458in" -alt="Graphical user interface, text, application Description automatically generated" /></p> -<p><span id="_Toc102977897" class="anchor"></span>Figure 26 Network Request -Sample</p> -<p>What we are seeing here is the response from the call to Save the -properties. We can expand this response to view the complete JSON.</p> -<p>By clicking on the Headers we can view the actual request:</p> -<p><img src="https://onshape-public.github.io/images/integrationguideimage43.png" -style="width:5.125in;height:2.47222in" -alt="Graphical user interface, text, application Description automatically generated" /></p> -<p><span id="_Toc102977898" class="anchor"></span>Figure 27 HTTP POST -Request for Saving Properties</p> -<p>Here we can see that this will correspond to the APIs listed in the API Explorer.</p> -<p>Most importantly the “Payload” tab is our definition of the body of the -request. This is provided in JSON format and can be expanded. As shown -here:</p> -<p><img src="https://onshape-public.github.io/images/integrationguideimage44.png" -style="width:4.90769in;height:2.94205in" -alt="Graphical user interface, text, application Description automatically generated" /></p> -<p><span id="_Toc102977899" class="anchor"></span>Figure 28 HTTP POST Body</p> -<p>We now have the correct API call and the format of the body to -successfully make the API call. We can also see from the body that if we -wish to update properties in Onshape from our third-party application, -we need to store the propertyID value.</p> -<p><img src="https://onshape-public.github.io/images/integrationguideimage4.png" -style="width:0.43056in;height:0.43056in" />It is important to mention – -ALWAYS use cad.onshape.com to make API calls (no matter what you see in -the Headers tab or is shown in the Payload tab.</p> -<h3 id="define-an-application-extension">Define an Application Extension</h3> -<p>An application extension is how Onshape embeds third-party application -features in its UI. There are two types of extension:</p> -<ol> -<li> -<p>An extension that embeds its UI from the application into the -Onshape UI in an iFrame. Such a application my call Onshape REST -APIs or just expose an application interface inside Onshape.</p> -</li> -<li> -<p>An extension that embeds and that calls a REST API exposed by the -application from the Onshape UI. For instance, embedding application -functionality in the context menus or toolbars. This type of -application extension relies on external OAuth information in order -to authenticate the call. In this case Onshape acts as the client -and the application as the server.</p> -</li> -</ol> -<p>Each extension will exist at a specific location in the Onshape UI and -will work within the context of that location or a specific selection, -passing the relative information to the application.</p> -<p>In order to define the Application Extension we return to the -development portal at <a href="https://dev-portal.onshape.com/oauthApps">https://dev-portal.onshape.com/oauthApps</a> where -we initially defined our OAuth Application.</p> -<p>Select the OAuth Application that you previously defined and click on -the Extensions tab.</p> -<p><img src="https://onshape-public.github.io/images/integrationguideimage91.png" style="width:6.5in;height:3.37917in" -alt="Graphical user interface, text, application, Teams Description automatically generated" /></p> -<p><span id="_Toc102977900" class="anchor"></span>Figure 29 - Oauth -Applications - Extensions</p> -<p>Start by clicking the Add Extension button.</p> -<p><img src="https://onshape-public.github.io/images/integrationguideimage6.png" -style="width:0.47222in;height:0.47222in" />Note that you can create as -many extensions as you need for your application within the Onshape UI.</p> -<p>This is the interface where you define where in the Onshape UI the -command will appear, and what endpoint in your application the command -will reference. Changing the Location dropdown will provide additional -fields that can be defined to specify context and other relevant fields.</p> -<p>For our use case, Define a name, i.e. “Custom Part Number Generator”, -define a description of the extension and select “Part Number Generator” -from the Location dropdown. The only other field that you need to define -is the Action URL. This is the endpoint in your application where you -will fetch the part number from.</p> -<p><img src="https://onshape-public.github.io/images/integrationguideimage46.png" style="width:4.125in;height:4.125in" -alt="Graphical user interface, text, application, email Description automatically generated" /></p> -<p><span id="_Toc102977901" class="anchor"></span>Figure 30 - Define -Application Extension</p> -<p>Once you save the definition you will see it in the list of extensions. -You can always come back and edit the definition of the extension.</p> -<h3 id="grant-onshape-access-to-3suprdsup-party-data">Grant Onshape Access to 3<sup>rd</sup> Party Data</h3> -<p>If you require Onshape to access the resources of your application, then -you will need to define the external OAuth parameters. In our use case -we will need Onshape to access data in our application in order to pull -the part numbers into Onshape.</p> -<p>Click on the External OAuth tab, the final tab on the OAuth Applications -page.</p> -<p><img src="https://onshape-public.github.io/images/integrationguideimage47.png" style="width:6.5in;height:3.27361in" -alt="Graphical user interface, text, application, email Description automatically generated" /></p> -<p><span id="_Toc102977902" class="anchor"></span>Figure 31 - Define -External OAuth</p> -<p><img src="https://onshape-public.github.io/images/integrationguideimage4.png" -style="width:0.43056in;height:0.43056in" />In this guide we’re not -detailing the implementation of OAuth2 inside your application, this is -explained very well in many on-line guides. My favorite of these can be -found at: -<a href="https://www.digitalocean.com/community/tutorials/an-introduction-to-oauth-2">https://www.digitalocean.com/community/tutorials/an-introduction-to-oauth-2</a></p> -<p>Onshape provides the fields that are required for it to make a secure -request to your application, receive an access Token and refresh it when -required. In this case Onshape acts as the client and your application -as the server – this is the inverse to what we defined when we enabled -the third-party application to access Onshape.</p> -<p>Once you have defined the fields, Save/Update the definitions. We have -now completed defining the application extension and enabling Onshape to -access your applications resources.</p> -<p><img src="https://onshape-public.github.io/images/integrationguideimage6.png" -style="width:0.47222in;height:0.47222in" />Note if you haven’t defined -all the endpoints at this time, you can come back later and update the -information once you have it defined in your application.</p> -<p>The last thing we need to do is for the user to grant access for Onshape -to access your applications resources. We can do this through the same -interface that we used to grant access to Onshape.</p> -<p>From inside Onshape go to your account settings, from the top right -dropdown menu. Click on the applications page.</p> -<p>For applications that have an application extension and External OAuth -defined we have the “Grant” button available in the “external Access” -column as shown here:</p> -<p><img src="https://onshape-public.github.io/images/integrationguideimage48.png" style="width:6.5in;height:2.87083in" -alt="Graphical user interface, text, application, email Description automatically generated" /></p> -<p><span id="_Toc102977903" class="anchor"></span>Figure 32 - Grant -External Access</p> -<p>Click the “Grant” Button in the External Access column.</p> -<p>Your third-party application will present the user with option to -authorize access to the application – similar to this simple interface:</p> -<p><img src="https://onshape-public.github.io/images/integrationguideimage49.png" -style="width:4.25285in;height:1.71051in" -alt="Graphical user interface, text Description automatically generated" /></p> -<p><span id="_Toc102977904" class="anchor"></span>Figure 33 - Enabling -Onshape to access a 3rd parties data</p> -<p>If you click “Allow”, you will be returned to Onshapes Applications page -and external access will be granted.</p> -<h3 id="defining-webhooks">Defining Webhooks</h3> -<p>Now that we’ve defined our application extension and OAuth access to our -application, we can start on receiving notifications in our application -when events happen in Onshape.</p> -<p>Onshape supports webhook notification for many different types of -events. We will register an endpoint in our application that will -receive a notification whenever something occurs in Onshape. In our -specific scenario this will be when the user updates the Onshape -properties – as we defined in <strong>Step 1 Define Properties in Onshape</strong>:</p> -<p>For our purposes we will be registering to receive web hook -notifications for the onshape.model.lifecycle.metadata event. When -registering for an event in Onshape there are only two pieces of -information required:</p> -<ol> -<li> -<p>The event (onshape.model.lifecycle.metadata)</p> -</li> -<li> -<p>The Enterprise ID</p> -</li> -</ol> -<p>To easily find your enterprise ID, in Onshape select the Enterprise -Settings option from the top right dropdown menu and then click on the -“Details” menu option on the left-hand menu bar.</p> -<p>You will see your Enterprise ID and a “Copy to Clipboard” button next to -it. This will enable you to directly copy this unique ID into your code.</p> -<p><img src="https://onshape-public.github.io/images/integrationguideimage50.png" -style="width:3.0006in;height:2.70759in" -alt="Graphical user interface, application Description automatically generated" /></p> -<p><span id="_Toc102977905" class="anchor"></span>Figure 34 - Finding Your -Enterprise ID</p> -<p>The following code shows how we can register a webhook in Onshape.</p> -<p><img src="https://onshape-public.github.io/images/integrationguideimage51.emf" alt="">In this example I’ve hard-coded a few of -the values for clarity, however this method could be re-written to be a -generic model for registering various webhooks. Some good examples of -registering for webhooks exist at <a href="https://github.com/onshape-public">https://github.com/onshape-public</a>.</p> -<p>As with other calls to Onshape that we’ve seen, we are passing the -accessToken in the header in order to establish a secure call to -Onshape’s resources.</p> -<p>The information coming back from the registration call will be similar -to the following:</p> -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-json" data-lang="json"><span style="display:flex;"><span>{ -</span></span><span style="display:flex;"><span> -</span></span><span style="display:flex;"><span><span style="color:#1e90ff;font-weight:bold">&#34;timestamp&#34;</span>: <span style="color:#a50">&#34;2014-12-16T23:45:10.611-0500&#34;</span>, -</span></span><span style="display:flex;"><span> -</span></span><span style="display:flex;"><span><span style="color:#1e90ff;font-weight:bold">&#34;event&#34;</span>: <span style="color:#a50">&#34;webhook.register&#34;</span>, -</span></span><span style="display:flex;"><span> -</span></span><span style="display:flex;"><span><span style="color:#1e90ff;font-weight:bold">&#34;workspaceId&#34;</span>: <span style="color:#a50">&#34;000000000000000000000000&#34;</span>, -</span></span><span style="display:flex;"><span> -</span></span><span style="display:flex;"><span><span style="color:#1e90ff;font-weight:bold">&#34;elementId&#34;</span>: <span style="color:#a50">&#34;000000000000000000000000&#34;</span>, -</span></span><span style="display:flex;"><span> -</span></span><span style="display:flex;"><span><span style="color:#1e90ff;font-weight:bold">&#34;webhookId&#34;</span>: <span style="color:#a50">&#34;544e91f7fb88ed44f5de1508&#34;</span>, -</span></span><span style="display:flex;"><span> -</span></span><span style="display:flex;"><span><span style="color:#1e90ff;font-weight:bold">&#34;messageId&#34;</span>: <span style="color:#a50">&#34;34795d2e5f5f44eeb61fb7b1&#34;</span>, -</span></span><span style="display:flex;"><span> -</span></span><span style="display:flex;"><span><span style="color:#1e90ff;font-weight:bold">&#34;data&#34;</span>: <span style="color:#a50">&#34;Some data&#34;</span>, -</span></span><span style="display:flex;"><span> -</span></span><span style="display:flex;"><span><span style="color:#1e90ff;font-weight:bold">&#34;documentId&#34;</span>: <span style="color:#a50">&#34;000000000000000000000000&#34;</span>, -</span></span><span style="display:flex;"><span> -</span></span><span style="display:flex;"><span><span style="color:#1e90ff;font-weight:bold">&#34;versionId&#34;</span>: <span style="color:#a50">&#34;000000000000000000000000&#34;</span> -</span></span><span style="display:flex;"><span> -</span></span><span style="display:flex;"><span>} -</span></span></code></pre></div><p>In our example we are saving the event -(onshape.model.lifecycle.metadata) and the returned webhookId to a -database in order that we can later ping it to make sure that it is -live.</p> -<p><img src="https://onshape-public.github.io/images/integrationguideimage4.png" -style="width:0.43056in;height:0.43056in" />Following the registration of -the webhook, Onshape will attempt to make a call to the Notify URL -defined in the body of the registration request. This is the endpoint of -your application that should be called when the event is fired in -Onshape. The most common reason for registration failures is that the -endpoint you defined, does not return an HTTP 200 status code. -Therefore, even if you registered for an event and received a -registration notification and a webhookId back from Onshape, your web -hook is not in fact registered until Onshape validates the notify URL -and receives the HTTP 200 notification back from it. Unfortunately there -is no way to easily know if your web hook has been successfully -registered until you either ping it, request to list it, or try to -activate the event through Onshape.</p> -<p><img src="https://onshape-public.github.io/images/integrationguideimage4.png" -style="width:0.43056in;height:0.43056in" />Also it is important to know -that even when your webhook is registered successfully, if you change -your code later on and Onshape fails to receive an HTTP 200 status code -back from the notify URL, the web hook will be removed.</p> -<p>One of the ways we can validate that a webhook is “live” is by pinging -it using the Onshape REST API. The following code shows the -implementation of a ping to the webhook. If an HTTP status code of 200 -is returned, we know that the webhook is enabled, if not then we can -re-register the webhook as needed.</p> -<p><img src="https://onshape-public.github.io/images/integrationguideimage6.png" -style="width:0.47222in;height:0.47222in" /><img src="https://onshape-public.github.io/images/integrationguideimage52.emf" alt="">Once -we store the webhook ID in the database we can ping the webhook whenever -the application is loaded and validate that it’s still registered. If we -need to re-register the webhook (usually only occurs when changes are -made to the code in the notify URL), we can create a new webhook -registration and update the database record.</p> -<p><img src="https://onshape-public.github.io/images/integrationguideimage4.png" -style="width:0.43056in;height:0.43056in" />Note that you can create many -duplicate webhook registrations for the same event with the exact same -notify URL. Onshape doesn’t limit how many registrations are created for -a single webhook. In the event that this happens, the notify URL will be -called as many times as there are webhooks registered for that event. -You can validate the registered webhooks by calling the -<a href="https://cad.onshape.com/glassworks/explorer/#/Webhook">Webhook API</a>.</p> -<p><img src="https://onshape-public.github.io/images/integrationguideimage6.png" -style="width:0.47222in;height:0.47222in" />Use -<a href="https://cad.onshape.com/glassworks">https://cad.onshape.com/glassworks</a> to call APIs and validate the -requirements for each REST API call. This interface lists all the -available Onshape REST APIs and provides examples of the values returned -from each call.</p> -<h3 id="receiving-webhook-notifications">Receiving Webhook Notifications</h3> -<p>Once your webhook is registered and confirmed to be working you should -be getting a notification from the webhook to your notify URL. The -notification should be similar to the following:</p> -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-json" data-lang="json"><span style="display:flex;"><span>{ -</span></span><span style="display:flex;"><span> -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;timestamp&#34;</span>: <span style="color:#a50">&#34;2014-12-16T23:46:29.284-0500&#34;</span>, -</span></span><span style="display:flex;"><span> -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;event&#34;</span>: <span style="color:#a50">&#34;onshape.document.lifecycle.metadata&#34;</span>, -</span></span><span style="display:flex;"><span> -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;workspaceId&#34;</span>: <span style="color:#a50">&#34;000000000000000000000000&#34;</span>, -</span></span><span style="display:flex;"><span> -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;elementId&#34;</span>: <span style="color:#a50">&#34;000000000000000000000000&#34;</span>, -</span></span><span style="display:flex;"><span> -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;webhookId&#34;</span>: <span style="color:#a50">&#34;544e91f7fb88ed44f5de1508&#34;</span>, -</span></span><span style="display:flex;"><span> -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;messageId&#34;</span>: <span style="color:#a50">&#34;60f54ac1cbc04179a6642d9a&#34;</span>, -</span></span><span style="display:flex;"><span> -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;data&#34;</span>: <span style="color:#a50">&#34;Some data&#34;</span>, -</span></span><span style="display:flex;"><span> -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;documentId&#34;</span>: <span style="color:#a50">&#34;0f9c4392e5934f30b48ab645&#34;</span>, -</span></span><span style="display:flex;"><span> -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;versionId&#34;</span>: <span style="color:#a50">&#34;000000000000000000000000&#34;</span>, -</span></span><span style="display:flex;"><span> -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;documentState&#34;</span>: <span style="color:#a50">&#34;IN PROGRESS&#34;</span> -</span></span><span style="display:flex;"><span> -</span></span><span style="display:flex;"><span>} -</span></span></code></pre></div><p>In your case the workspaceId, elementID, documentID, and PartId should -be populated with the values from the Onshape document that was open -when the properties were updated.</p> -<p><img src="https://onshape-public.github.io/images/integrationguideimage4.png" -style="width:0.43056in;height:0.43056in" />It is important to note that -there is currently no OAuth validation on the webhook response, -therefore the endpoint in your application will not receive any access -token data for directly calling Onshape APIs. Therefore, if you need to -make a call to the Onshape REST APIs inside the notify URL endpoint make -a call to an endpoint in your application and include your application -OAuth credentials in the body of the request. In this way, you can make -a call to your application and load the passport and the Onshape -credentials.</p> -<p><img src="https://onshape-public.github.io/images/integrationguideimage4.png" -style="width:0.43056in;height:0.43056in" />Onshape takes security very -seriously and for this reason, unauthenticated calls only provide -minimal details such aa, in this case, id’s.</p> -<h3 id="getting-onshape-properties">Getting Onshape Properties</h3> -<p>In our specific use case, when we received the webhook notification, we -want to use the ID data provided to find the corresponding object in our -database (or create a new one) as shown in Step 2 Create Corresponding -Object: Then we make a call to the Onshape REST API: -/metadata/d/{did}/{wvm}/{wvmid}/e/{eid}/{iden}/{pid}</p> -<p>All the relevant data is provided in the response from the webhook so we -can pass this to the method which will call this API as follows:</p> -<p><img src="https://onshape-public.github.io/images/integrationguideimage53.emf" alt="">From this call I am returning the -“properties” part of the JSON – this contains all the metadata -definitions that I wish to store in my database and associate with the -corresponding object. The following is an example of one of the property -objects:</p> -<p><img src="https://onshape-public.github.io/images/integrationguideimage54.emf" alt=""></p> -<p>In fact there is probably only three key pairs that we’re interested in -here:</p> -<ol> -<li> -<p>Name – name of the property. In this case “Name”</p> -</li> -<li> -<p>Value – the value of the property. In this case “Top Plate”</p> -</li> -<li> -<p>propertyId – the ID of this property. We might need this if we want -to enable a bi-directional sync between both applications.</p> -</li> -</ol> -<p><img src="https://onshape-public.github.io/images/integrationguideimage4.png" -style="width:0.43056in;height:0.43056in" />Note that for valueType -CATEGORY the actual name, value and id will be embedded deeper in the -object inside an array. I suggest copying and pasting the output from -the API call into a JSON viewer such as <a href="http://jsonviewer.stack.hu/">http://jsonviewer.stack.hu/</a> so -that it will be easier to find where the correct values are.</p> -<p>We can now update our corresponding object with the Onshape metadata -values as described in Step 3 Get Onshape Metadata:</p> -<h3 id="updating-onshape">Updating Onshape</h3> -<p>So far we have pulled data from Onshape and populated it into our -third-party application, however what if we make updates in our -application that we want to propagate back to Onshape? This is certainly -possible through Onshape’s REST API. Usually this would be implemented -in your application on the click of a button – such as “Save”, if you -have multiple properties to update, or when a property is updated if you -want to trigger the sync for the update of a specific field.</p> -<p>Either way it is fairly straight forward to send the REST API call to -Onshape to update properties. The following snippet of code shows how -the call can be made:</p> -<p><img src="https://onshape-public.github.io/images/integrationguideimage55.emf" alt="">As we can see here, we provide the body in -the form of JSON that includes an array of items (in this case one item) -and a nested array of properties (two property objects are listed here). -Each property has a value and an ID of the property in Onshape to -update.</p> -<p>The response from this API call should be an HTTP 200 status. If this is -the case, we can update the user that the sync was successful.</p> -<p><img src="https://onshape-public.github.io/images/integrationguideimage6.png" -style="width:0.47222in;height:0.47222in" />If you know that you want to -update Onshape with property values from your application, it will be -important to build a data model that can store the properties with the -unique ID provided by Onshape.</p> -<h3 id="implementing-custom-part-numbers">Implementing Custom Part Numbers</h3> -<p><img src="https://onshape-public.github.io/images/integrationguideimage56.png" -style="width:2.95556in;height:2.94924in" /></p> -<p>The final step in this -business case is to pull the part numbers form our third-party -application. The part numbers can be calculated based on metadata values -that were previously synced from Onshape or they might be numbers being -pulled from yet another system – such as an ERP or even a Google -Spreadsheet. The important thing is that when the user clicks a button -in Onshape, the correct Part Numbers get populated.</p> -<p>To first understand how the setup for pulling part numbers from a -third-party application we need to go back to the definition of our -Application Extension in the Onshape developer’s portal.</p> -<p>Here we can see that we gave the application extension a name, defined -the location as “Part Number Generator” and defined the “Action URL” – -this is the endpoint in our application where we will fetch the part -number from.</p> -<p>Once we have the application extension defined as Location = Part Number -Generator, you will be able to use this option inside Onshape Release -Management settings.</p> -<p><img src="https://onshape-public.github.io/images/integrationguideimage4.png" -style="width:0.43056in;height:0.43056in" />Note that in order to use the -Part Number Generator option you will have to define the External OAuth -option and grant Onshape access to the resources of your application. -This is because Onshape will need to access the defined endpoint in -order to pull the part number from the application</p> -<p>From within Onshape Select the “Enterprise Settings” from the top right -dropdown menu. Navigate to the “Release Management” settings and scroll -down to the “Revisions and part numbers” section of the page.</p> -<p><img src="https://onshape-public.github.io/images/integrationguideimage57.png" -style="width:4.05994in;height:3.27831in" -alt="Graphical user interface, text, application, email Description automatically generated" /></p> -<p><span id="_Toc102977907" class="anchor"></span>Figure 36 - Revisions and -Part Number Settings</p> -<p>In the Part Number Generation dropdown select the “Custom Part Number -Generator”. Note that this is the name that you defined in your -Application Extension so it might differ from what’s shown here.</p> -<p><img src="https://onshape-public.github.io/images/integrationguideimage58.png" -style="width:2.73732in;height:2.03131in" -alt="Graphical user interface, text, application Description automatically generated" /></p> -<p><span id="_Toc102977908" class="anchor"></span>Figure 37 - Selecting -Custom Part Number Generator</p> -<p><img src="https://onshape-public.github.io/images/integrationguideimage6.png" -style="width:0.47222in;height:0.47222in" />Finally scroll to the bottom -of the page and save the settings.</p> -<p>Note that you will need the Admin role in order to access the enterprise -settings.</p> -<h3 id="implementing-part-number-code">Implementing Part Number Code</h3> -<p>Onshape will send a message to the endpoint defined in your application -extension settings. The content of this message will be an array of the -following data.</p> -<p><img src="https://onshape-public.github.io/images/integrationguideimage59.emf" alt="">There might be one or more object depending -upon where the user initiated the call for part numbers from. For -instance, if the call was initiated from the Part properties window, -there will only be one object, however if initiated from the release -candidate window, multiple parts/assemblies and drawings might be -requested in the single call. Therefore, your code should be able to -handle these two situations.</p> -<p>Onshape will expect a response back from your endpoint and it should be -formatted in the following manner:</p> -<p><img src="https://onshape-public.github.io/images/integrationguideimage60.emf" alt="">Note that in fact only the id and -partNumber fields are actually required – the other fields are optional.</p> -<p>The following is an implementation of the getNextPartNumber endpoint -that was defined in the application extension “Action URL” field:</p> -<p><img src="https://onshape-public.github.io/images/integrationguideimage61.emf" alt="">This in turn calls a function that pulls -the next part number from the corresponding object in the database (this -was defined in, Step 5: Request Part Number). In this function I’m -defining the object that will be sent to Onshape with the part number. -This will be called multiple times depending how many objects were sent -from Onshape.</p> -<p><img src="https://onshape-public.github.io/images/integrationguideimage62.emf" alt="">In this case I’m sending back all the data -required by Onshape, however it would be enough to just populate the id -and the partNumber.</p> -<p>Once you load the Part Properties window or the Release candidate -window, you can now request the Next Part number. The part number will -be pulled from the third-party application and populated in the relevant -fields as shown below.</p> -<p><img src="https://onshape-public.github.io/images/integrationguideimage63.png" -style="width:4.59649in;height:3.80143in" -alt="Graphical user interface, application Description automatically generated" /></p> -<p><span id="_Toc102977909" class="anchor"></span>Figure 38 - Release -Candidate Part Number generation</p>Docs: Sync Releases and Revisionshttps://onshape-public.github.io/docs/tutorials/releases/Mon, 01 Jan 0001 00:00:00 +0000https://onshape-public.github.io/docs/tutorials/releases/ -<p>This tutorials builds off the <a href="https://onshape-public.github.io/docs/tutorials/sync">Sync Data and Metadata</a> tutorial. Please complete that one before starting on this one.</p> -<p>In this case, we’ll be looking at the ability for Onshape to sync its -release data with an external system and for that system to send -information back to Onshape with regards to released data.</p> -<p>This specific business case will look at what happens when you wish for -a PLM system to control the release of data instead of Onshape having -that control – this is in fact a common use case.</p> -<h2 id="overview">Overview</h2> -<p><img src="https://onshape-public.github.io/images/integrationguideimage64.png" -style="width:3.21077in;height:2.56522in" /></p> -<p>We have mentioned before that -Onshape has the ability to release data – it is totally integrated to -Onshape since there is no division between CAD capabilities and PDM -capabilities in Onshape – they are all part of the same solution. See -Versions and Releases for more information on how Onshape manages -releases. There is importance in releasing data through Onshape. Onshape -uses visual cues to show which parts are released in an assembly for -instance and which parts might have a newer revision. Onshape can also -add/remove watermarks to drawings and update the title block depending -on release states. Also, the BOM table can pull a parts release data and -display it. All this is dependent upon a release process being completed -in Onshape.</p> -<p>Many organizations have implemented Product Lifecycle management systems -(PLM). One of the key benefits of a PLM system is that it manages more -than just engineering data originating from the engineering department, -it deals with all the data related to the product – from concept through -retirement. Therefore, it is a system that is used by many groups and -departments throughout the organization.</p> -<p>Often, in release processes or Engineering Change processes, additional -input and approvals are required from various departments downstream -from engineering. PLM systems are very good at routing the data for -approval to users from multiple departments and groups throughout the -organization. Onshape, on the other hand, is very focused on the -engineering department and the data generated there. While it certainly -has the capabilities to bring other groups into approval processes, it -is not considered a process centric enterprise-wide system with the -capabilities of a PLM system.</p> -<p>Many companies will have well established processes that have been -modeled in their PLM system, it is much easier for us to integrate into -those processes than reinvent the wheel in Onshape.</p> -<p>This section looks at how we might have the best of both worlds, -initiate release processes in Onshape and update our Onshape visual cues -as well as have the PLM system manage the actual approvals and release.</p> -<p>This section uses concepts such as OAuth and web hooks that we have -introduced in detail in previous sections, therefore feel free to -reference those sections for more information on these topics.</p> -<h3 id="step-1-initiate-release">Step 1: Initiate Release</h3> -<p><img src="https://onshape-public.github.io/images/integrationguideimage65.png" -style="width:4.88889in;height:2.02778in" -alt="Application Description automatically generated" /></p> -<p>In this first step we are using Onshape’s out-of-the-box capabilities to -initiate a release candidate – just as we would if we were releasing -natively in Onshape.</p> -<ol> -<li> -<p>We start by initiating the release on all the data that is required. -In this step you should use a custom workflow that simply has one -approval node.</p> -</li> -<li> -<p>Define the mandatory and any other release properties in the release -candidate window. <img src="https://onshape-public.github.io/images/integrationguideimage66.png" -style="width:4.70609in;height:3.12281in" -alt="Graphical user interface, text, application, email Description automatically generated" /></p> -</li> -</ol> -<p><span id="_Toc102977911" class="anchor"></span>Figure 40 - Initiating a -release candidate</p> -<ol start="3"> -<li> -<p>Since an approver is required, we must provide a fictious -user/approver that has been defined in the system – this could be -named “Release Approver” for instance. The process will be sent to -this approver even though they are not a real person and will not be -able to approve the release. Instead, our release process will be -approved by an external source.</p> -</li> -<li> -<p>Finally, when everything is defined, submit the release. The window -will close. Since the release is pending approval, the parts -involved in the release will enter the state of “Pending” as shown -here:</p> -<p><img src="https://onshape-public.github.io/images/integrationguideimage67.png" -style="width:4.40131in;height:2.9375in" -alt="Graphical user interface, text, application Description automatically generated" /></p> -</li> -</ol> -<p><span id="_Toc102977912" class="anchor"></span>Figure 41 - Pending -Release</p> -<p>They will remain in this state until the release has been completed.</p> -<p><img src="https://onshape-public.github.io/images/integrationguideimage68.png" -style="width:2.71208in;height:1.52174in" /></p> -<p>It is important to note that -unlike traditional PDM systems where the files are locked for change -until the release is completed or rejected, Onshape does not lock the -files. As mentioned previously, Onshape views the releases as a point in -time. As far as Onshape is concerned, time moves forward, parts can -change and at a specific point in time, the parts are in a state of -pending. It is important to mention that this does in fact prevent -another release from being initiated on the parts until the previous -release has been completed.</p> -<h3 id="step-2-initiate-release-process-in-3suprdsup-party-app">Step 2: Initiate Release Process in 3<sup>rd</sup> Party App</h3> -<p><img src="https://onshape-public.github.io/images/integrationguideimage69.png" -style="width:5.34722in;height:3.34722in" -alt="Diagram Description automatically generated" /></p> -<p>Once the user initiates the release candidate and the parts transition -to the “pending” state we can register for a webhook that will notify -our third-party application that the parts have changed state.</p> -<ol> -<li> -<p>Once the parts enter the workflow, the onshape.workflow.transition -webhook will be triggered.</p> -</li> -<li> -<p>Our third-party application should be listening for this event along -with other data, we are provided with the objectId of the release -package – this is all the data associated with the parts that are to -be released. The response also contains the objectType and the -transitionName; for our use case we will only concern ourselves with -requests that have an objectType of “Release” and a transitionName -of “Submit”.</p> -</li> -<li> -<p>Using the ObjectId we make an API call to onshape; -/api/releasepackages/&lt;releasePackageId&gt;?detailed=true</p> -</li> -<li> -<p>This API call will return to us a JSON response containing all -assemblies and parts in the release package. The following -information should be extracted from the release package:</p> -<ol> -<li> -<p>For each line item (assembly or part) extract the documentId, -the elementId, elementType, versionId and PartId</p> -</li> -<li> -<p>Iterate through the top level properties and record the -propertyId for property with the name “comment” – this will be -used to update the release comments later on.</p> -</li> -</ol> -</li> -<li> -<p>Now that we have the relevant IDs we can update the state of our -corresponding objects in the third party system and record any -additional data such as the release comment field.</p> -</li> -<li> -<p>Finally, we can kick off our official release process in the -third-party application. This could be an automated process or a -manual one.</p> -</li> -</ol> -<h3 id="step-3-complete-release-process">Step 3: Complete Release Process</h3> -<p>The release process continues in the third-party application until -approvals have been received by all required actors. Meanwhile in -Onshape the parts are in the pending state. In this step we close the -loop once the release process is completed.</p> -<p><img src="https://onshape-public.github.io/images/integrationguideimage70.png" -style="width:5.375in;height:3.34722in" -alt="Graphical user interface, text, application Description automatically generated" /></p> -<ol> -<li> -<p>The release process managed by the third-party application is -completed and the data in that system is released.</p> -</li> -<li> -<p>Once this happens, we make a call to the Onshape API; -/api/releasepackages/&lt;releasePackageId&gt; the releasePackageId is -the ID we were provided with at the start of this process – While -there are different ways of implementing this, I tend to store the -ID and any other data related to the release in a custom “release -Object” in my database so I can retrieve and update the release as -required. In addition to the passing the release package ID, in the -body of the request we should pass the id of the release comment and -a value for the comment. This will update the release in Onshape -with any relevant data.</p> -</li> -<li> -<p>Onshape releases the data that was included in the release candidate -and that completes the workflow process.</p> -</li> -<li> -<p>Onshape will return a status code that indicates success or failure</p> -</li> -<li> -<p>Finally we can optionally update the corresponding object to -indicate that it is in sync with the Onshape data.</p> -</li> -</ol> -<p>In the event that the release process is rejected at anytime, we can -send the releasePackages API request to Onshape with a REJECT workflow -Action argument. This will cause Onshape to reject the workflow and the -state of the parts at the specific release point in time, will be set to -“Rejected”.</p> -<p><img src="https://onshape-public.github.io/images/integrationguideimage71.png" -style="width:4.69737in;height:3.12807in" -alt="Graphical user interface, application Description automatically generated" /></p> -<p><span id="_Toc102977914" class="anchor"></span>Figure 43 - release -candidate rejected</p> -<p>Since our timeline is moving forward this has no actual effect on the -parts other than to cancel the pending release and enable them to be -released at another future point in time.</p> -<h2 id="implementation">Implementation</h2> -<p>In this section we will take a closer look at how to implement the -release scenario in our code. The first thing we need to do is define -the correct web hook to listen for the initiation of the release – this -means that once the user clicks the submit button on the release -candidate dialog, this web hook will be triggered.</p> -<h3 id="set-up-webhook">Set Up Webhook</h3> -<p><img src="https://onshape-public.github.io/images/integrationguideimage72.emf" alt=""></p> -<p>This code is very similar to what we defined previously for the metadata -update, instead here we are defining a hook for the -onshape.workflow.transition hook. As with other code examples that -require authentication, we have included error handling in order to -refresh that access token in the event that it has expired.</p> -<p>The onshape.workflow.transition will in fact fire whenever a revision or -release package transitions through different workflow states. In his -specific case we are only interested in catching the event when the -workflow is initially submitted. This can be filtered by the information -sent to the return URL, in this case -<a href="https://myserver.com/api/getReleaseData">https://myserver.com/api/getReleaseData</a></p> -<p>In this implementation we are storing he webhook ID in the database so -that we can ping it when the application is loaded to make sure that it -is still active. Other implementations delete the webhook after it is -used and then recreate it as required. There is no specific preference -for which methodology is better – that depend s upon the requirements of -your integration.</p> -<h3 id="receive-web-hook-notifications">Receive Web Hook Notifications</h3> -<p>Once the user who is initiating the release clicks the Submit button on -the Release Candidate dialog, the webhook will be triggered and a -message will be sent to the third-party application listening for that -webhook.</p> -<p><img src="https://onshape-public.github.io/images/integrationguideimage66.png" -style="width:4.70609in;height:3.12281in" -alt="Graphical user interface, text, application, email Description automatically generated" /></p> -<p>In our example the URL that the webhook data from Onshape gets sent to -is:</p> -<p><a href="https://myserver.com/api/getReleaseData">https://myserver.com/api/getReleaseData</a></p> -<p>In our application we can define a router for that end point as follows:</p> -<p>router.route(&rsquo;/getReleaseData&rsquo;).post(mymodule.getReleaseData);</p> -<p>In this case “mymodule” is where I’ve defined all the functionality for -managing data coming from Onshape. Since the webhook data contains no -authentication information (just minimal data is sent from the webhoom -for security reasons), we can’t directly authenticate our application -against Onshape, therefore we need to pass the data received from the -webhook through a method that will then add the authentication data to -our request object. The getReleaseData method simply passes the webhook -information received by the application to another authenticated -endpoint as follows:</p> -<p><img src="https://onshape-public.github.io/images/integrationguideimage73.emf" alt=""></p> -<p>Here is the endpoint defined for processReleasePackage:</p> -<p>router.route(&rsquo;/processReleasePackage&rsquo;).post(authController.isAuthenticated, -releaseController.processReleasePackage);</p> -<p>As we can see here, we have now added in the authentication middleware - -authController.isAuthenticated - and can make secure calls to Onsahpe’s -API.</p> -<h3 id="get-release-package-data">Get Release Package Data</h3> -<p>The parameter that the web hook sent over to our application that we -need to make use of is the ID of the release package. We can now make a -call to Onshape to retrieve the complete release package with the ID.</p> -<p>We get the release package ID from the request object and make the REST -API call to get the package as follows:</p> -<p><img src="https://onshape-public.github.io/images/integrationguideimage74.emf" alt=""></p> -<p>The complete release package should be returned in “response”. We can -now parse that data to retrieve the properties we need. The most -important properties will the IDs of the parts that we are going to -release – these should already be synced with our system – if not, we -can create them from the data in the release package.</p> -<h3 id="save-release-package-data">Save Release Package Data</h3> -<p>The next step is to save the properties of the release package to a -corresponding object in our database. We need at least the ID of the -release package so we can later release it automatically from the -third-party application. In this case I’m storing other properties that -came from the release candidate such as release name and description.</p> -<p><img src="https://onshape-public.github.io/images/integrationguideimage75.emf" alt=""></p> -<p><img src="https://onshape-public.github.io/images/integrationguideimage76.png" -style="width:3.01875in;height:4.38889in" /></p> -<p>Most of this code deals with -retrieving values from the release package and storing them as a new -release object in the database. Additional values are associated with -the part in the PLM system. In a typical production scenario this code -would interface with the PLMs workflow capabilities and possibly kick -off a release or change process in that system. For our basic example we -are storing values from Onshape with our items and setting a state on -the part so that users can see that the part is pending release and take -actions required.</p> -<p>At this point in time, Onshape does not care that the part is pending a -release. The part in Onshape will remain in a pending state until it is -released by the PLM system. As noted previously, we used a user setup in -the system to specifically initiate the release, therefore no other -users will receive notifications from Onshape with regards to release -actions on this part.</p> -<h3 id="complete-the-release">Complete the Release</h3> -<p>Once the release or change workflow has completed in the PLM system and -all approvals have been received, the Part/Item will be in a released -state in the PLM system. However, we must now update Onshape with the -correct release status of the parts. It is important that Onshape data -is in sync with the corresponding data in the PLM system for reasons of -data integrity and the visual cues used within Onshape to identify a -part as released.</p> -<p>In a typical scenario Onshape will be automatically updated once the -workflow completes in the PLM system. In our use case we are simplifying -the process by clicking a button to release the item. This will update -the state of the part in our system and send a REST API call to Onshape -to release the data in the release package (be it one part, an assembly -with multiple parts, or drawings).</p> -<p><img src="https://onshape-public.github.io/images/integrationguideimage77.emf" alt=""></p> -<p>This code snippet updates the database with the released status of a -part. Since we stored data from the release package in our database we -now retrieve the “Comment” property so that we can send an updated value -to Onshape with the release.</p> -<p>let attrid = rp.props.find(ob =&gt; ob.name == &ldquo;Comment&rdquo;);</p> -<p>The important line of code here is the REST API call to Onshape:</p> -<p><strong>axios.post(&lsquo;<a href="https://cad.onshape.com/api/releasepackages/'">https://cad.onshape.com/api/releasepackages/'</a> + id + -&lsquo;?wfaction=RELEASE&rsquo;</strong></p> -<p>The id provided here is the ID of the release package that we stored -when the web hook was called at the beginning of the process. The -“wfaction” argument indicates that the workflow action in Onshape should -be to release the data associated with this release package.</p> -<p>In this example we are also updating the release comments in Onshape, -for this reason we required the property ID of the Comment field – which -we also previously stored in our release object in the database.</p> -<p><img src="https://onshape-public.github.io/images/integrationguideimage78.png" style="width:6.5in;height:4.25903in" -alt="Graphical user interface, text, application Description automatically generated" /></p> -<p><span id="_Toc102977916" class="anchor"></span>Figure 45 - Release -completed automatically in Onshape</p> -<p><img src="https://onshape-public.github.io/images/integrationguideimage79.png" style="width:6.5in;height:4.25625in" -alt="Graphical user interface, text, application, email Description automatically generated" /></p> -<p><span id="_Toc102977917" class="anchor"></span>Figure 46 - Release -comments Updated from third-party system</p>Docs: Generate Derivative Fileshttps://onshape-public.github.io/docs/tutorials/derivative/Mon, 01 Jan 0001 00:00:00 +0000https://onshape-public.github.io/docs/tutorials/derivative/ -<p>This tutorials builds off the <a href="https://onshape-public.github.io/docs/tutorials/releases">Sync Releases and Revisions</a> tutorial. Please complete that one before starting on this one.</p> -<p>It’s clear by now that Onshape doesn’t use files to store its data, -instead it is a data driven solution that is always up to date. Files -are a snapshot in time that provide a view of the design at a specific -point in time - such as at a release or version. A new file is required -for each “snapshot” and managing these files can get quite cumbersome. -However, there are situations that require that files be generated from -the Onshape data.</p> -<p>In general, we want files to be generated at defined points of time and -within the context of a business process – such as a release process. -The derived file could be a format such as a PDF of the drawing that is -generated following the successful release of the data. Also, a common -requirement is to generate STEP files or JT files that can be used in 3D -Printing or viewers embedded in PLM solutions. Regardless of the use -case Onshape has very good export capabilities for many different file -formats.</p> -<p>This business case examines how to automatically generate files derived -from the Onshape data. The process described here can be plugged into -many different use cases. In this specific example we are plugging the -translation use case into the Release Business case just after the -release is completed in the third-party application and Onshape is -updated. Since we already have all the relevant ID information for the -parts to translate from the release package data, we can directly call -the translation APIs after receiving notification that the release was -successfully executed in Onshape.</p> -<h2 id="overview">Overview</h2> -<p><img src="https://onshape-public.github.io/images/integrationguideimage80.png" -style="width:5.5in;height:4.79167in" /></p> -<ol> -<li> -<p>Once we have received an HTTP 200 status from the call to Onshape to -release the release Package, we can proceed with the translation. -The reason why we may want to wait till the release has successfully -completed could be for several reasons:</p> -<ol> -<li> -<p>We are generating a PDF of the drawing and want the “In -Progress” watermark removed, and the title block updated with -release information</p> -</li> -<li> -<p>We are generating files for 3D printing or for sending to a -vendor to manufacture and we only want to send released data</p> -</li> -</ol> -</li> -<li> -<p>We can now make an API call to Onshape. In both the following cases -we must pass the document Id, the version Id and element Id – all -values that were available in the release package. Other values are -dependent upon your specific use case and can be referenced in -<a href="https://cad.onshape.com/glassworks/explorer/#/PartStudio/createPartStudioTranslation">https://cad.onshape.com/glassworks/explorer/#/PartStudio/createPartStudioTranslation</a></p> -<ol> -<li> -<p>For Assembly translation we can POST to :/api -/assemblies/d/{did}/{wv}/{wvid}/e/{eid}/translations.</p> -</li> -<li> -<p>For Parts we can POST to: -/api/partstudios/d/{did}/{wv}/{wvid}/e/{eid}/translations</p> -</li> -</ol> -</li> -<li> -<p>Three variables of importance are returned from the API call to -translate: requestState, id (of the translation) and -resultExternalDataIds. We should store or keep this data in memory -until the translation is completed. Depending upon the requestState -there might be additional data available in the response.</p> -</li> -<li> -<p>We can now periodically ping the translation web service with the id -retrieved in the last step. Using the GET call to -/api/translation/{id} we will receive one of three responses in the -requestState:</p> -<ol> -<li> -<p>DONE</p> -</li> -<li> -<p>ACTIVE</p> -</li> -<li> -<p>FAILED</p> -</li> -</ol> -</li> -<li> -<p>Depending on the response we can either continue to periodically -ping the translation service if we received ACTIVE</p> -</li> -<li> -<p>Notify the user of a failed translation attempt if we received a -FAILED response</p> -</li> -<li> -<p>Make a call to Onshape to GET the translated file if we received a -DONE response. To retrieve the translated file make a GET request to -/api/documents/d/{documentId}/externaldata/{externalDataId}</p> -</li> -<li> -<p>The file can now be stored in your third-party system or stored to -an external drive depending upon your specific use case.</p> -</li> -</ol> -<h2 id="implementation">Implementation</h2> -<p>As use cases go, this is a very straightforward process. The only -complexity here is deciding how to receive the notification from Onshape -that the translation has completed. There are several ways of -implementing this including using a webhook to notify us when the -translation completes. In the examples here I will show both the webhook -methodology as well as pinging Onshape with a status request every -couple of seconds. The status request can be initiated from the client -through an AJAX call or, as in the example I use here, from the server.</p> -<p><img src="https://onshape-public.github.io/images/integrationguideimage81.png" -style="width:3.3395in;height:3.66667in" /> In our example I have added a -button to the interface of my third-party system that enables me to -request a translated file. In this use case I have hard coded that the -resulting file should be a STEP file – in a production ready -implementation, we would expect that one or more formats are available -and possibly selected by the user. In addition, a production ready -implementation might have automated the translation for whenever a part -is released. Other considerations for automation might include -identifying what is being released. I.e. if it’s a part then translate -to STEP, if it’s a Drawing then translate to PDF, etc. These are all -very common use cases.</p> -<h3 id="initiate-the-translation">Initiate the Translation</h3> -<p><img src="https://onshape-public.github.io/images/integrationguideimage82.emf" alt="">The code snippet shown here is fairly -straightforward. First it gets the ID of the part that was sent from the -client, it then uses that ID to retrieve the part from the database. The -part stored in our database already has all the required values to -successfully communicate with Onshape, such as the document ID, the -workspace ID and the element ID – all these values are used in the -translation request.</p> -<p>In the body of the request we can see some of the required values that -define how the part is to be translated to STEP. In this case I have -only included the minimum required key pairs for this translation.</p> -<p>The REST API call to translate an Onshape element returns an object that -includes the translationId – this is the value that will be used to ping -Onshape and request the status of the translation.</p> -<h3 id="ping-onshape-for-translation">Ping Onshape for Translation</h3> -<p>In this code snippet I have simplified things by including a function -that waits for a second and then pings Onshape again, It will continue -pinging Onshape until it receives back a status that is not “ACTIVE”. -Once the status returned is anything except “ACTIVE” it returns the -resulting object back to the client.</p> -<p>The id used here is the translationId retrieved from the result object -when the translation was initiated.</p> -<p><img src="https://onshape-public.github.io/images/integrationguideimage83.emf" alt=""></p> -<p>Once the requestState is changed, this will indicate that the -translation has completed either with a FAIL or a DONE status. Depending -on the result we can define our logic on the client appropriately.</p> -<p>The following shows the object returned to the client from the -translation REST API. Note that the requestState is now set to “DONE”,, -meaning that the translation has completed -successfully.<img src="https://onshape-public.github.io/images/integrationguideimage84.png" style="width:6.5in;height:3.17986in" -alt="A picture containing timeline Description automatically generated" /></p> -<p>With this data we can now request the file directly from Onshape. The ID -that we need to use to retrieve the file is the “resultExternalDataIds”. -Note that this is an array of values – since it makes sense that we -might be translating more than one part.</p> -<h3 id="retrieve-translated-file">Retrieve Translated File</h3> -<p>With the resultExternalDataIds we can now retrieve the translated file -from Onshape. The following code snippet does exactly this.</p> -<p><img src="https://onshape-public.github.io/images/integrationguideimage85.emf" alt=""></p> -<p>The Onshape REST API</p> -<p><a href="https://cad.onshape.com/api/d/'">https://cad.onshape.com/api/d/'</a> + did + &lsquo;/externaldata/&rsquo; + id</p> -<p>retrieves the translated file – in this case the ID is -resultExternalDataIds[0] value.</p> -<p>Once this is completed, we use the response to save the file directly to -our server where the application is hosted. Finally, I’m sending a JSON -object to the client that provides a direct link to the file that is now -hosted on our server.</p> -<p>The client can then request the translated file from our server, even -though this is a function of the server and not related to Onshape, I -have included a code snippet here that will send the file to the client.</p> -<p><img src="https://onshape-public.github.io/images/integrationguideimage86.emf" alt=""></p> -<p>In our sample implementation Once the translation has completed -successfully I display a link to the translated file that calls the -“getfile” endpoint shown above.</p> -<p><img src="https://onshape-public.github.io/images/integrationguideimage87.png" style="width:6.5in;height:2.32917in" -alt="Graphical user interface, text, application, chat or text message Description automatically generated" /></p> -<p>Clicking the link will cause the file to be downloaded as shown here.</p> -<h3 id="define-translation-webhooks">Define Translation Webhooks</h3> -<p>As we mentioned at the beginning of this section there is more than one -way to receive notification back from Onshape that the translation has -completed. We can also define a webhook that will notify us once the -translation completes. The drawback with this methodology is that the -webhook must be created for each translation and then deleted.</p> -<p>A complete example of this can be found at: -<a href="https://github.com/onshape-public/app-gltf-viewer/blob/main/services/webhook-service.js">https://github.com/onshape-public/app-gltf-viewer/blob/main/services/webhook-service.js</a></p> -<p>The following function is used in this application to define the -webhook:</p> -<p><img src="https://onshape-public.github.io/images/integrationguideimage88.emf" alt=""></p> -<p>The following line would call this function once the user requests to -initiate a translation.</p> -<p>WebhookService.registerWebhook(req.user.accessToken, -req.session.passport.user.id, did)</p> -<p>Finally the endpoint registered with the webhook could be defined as -follows:</p> -<p><img src="https://onshape-public.github.io/images/integrationguideimage89.emf" alt=""></p> -<p>In this case once the translation is completed, this endpoint receives a -notification. If the event is equal to</p> -<p>onshape.model.translation.complete</p> -<p>We can assume that the translation has completed and we can unregister -the webhook and retrieve the translated file.</p> -<p>The complete sample including it setup and deployment can be found at: -<a href="https://github.com/onshape-public/app-gltf-viewer">https://github.com/onshape-public/app-gltf-viewer</a></p>Docs: Create an Extensionhttps://onshape-public.github.io/docs/tutorials/createextension/Mon, 01 Jan 0001 00:00:00 +0000https://onshape-public.github.io/docs/tutorials/createextension/ -<p>In this example, you will create a custom web page (as shown in the image below) that is displayed in the -right-hand fly-out panel. This interface displays metadata pulled from -a third-party system when a part in Onshape is selected. This interface can also update metadata in Onshape through the <code>Update</code> functionality.</p> -<p>You can follow along with the steps below with this video: -<a href="https://onshape.wistia.com/medias/0ivxxngkjz?embedType=async&seo=false&videoFoam=true&videoWidth=640&wvideo=0ivxxngkjz)"><img src="https://onshape-public.github.io/images/ExtensionsVideoCard.png" style="width:5in" alt="OAuth app creation video"/></a></p> -<h3 id="define-the-extension">Define the extension</h3> -<p>This tutorials builds off the <a href="https://onshape-public.github.io/docs/tutorials/derivative">Generate Derivative Files</a> tutorial. Please complete that one before starting on this one.</p> -<ol> -<li> -<p>Navigate to the Developer portal from <a href="https://dev-portal.onshape.com">https://dev-portal.onshape.com</a>.</p> -</li> -<li> -<p>Click <strong>OAuth applications</strong> in the left menu.</p> -</li> -<li> -<p>Select your application, and the click the <strong>Extensions</strong> tab. -<img src="https://onshape-public.github.io/images/integrationguideimage91.png" style="width:6.5in;height:3.48958in" alt="Graphical user interface, application, Teams Description automatically generated" /></p> -</li> -<li> -<p>Click the <strong>Add Extension</strong> button on the top right.</p> -</li> -<li> -<p>Select <code>Element Right Panel</code>. -<img src="https://onshape-public.github.io/images/integrationguideimage92.png" style="width:5.05785in;height:5.66469in" alt="Graphical user interface, application Description automatically generated" /></p> -</li> -<li> -<p>Next, define the context. The context defines what parameters -can be sent from Onshape to the application. Some basic -parameters are automatically sent with any context, additional information can be passed to our -application, depending on the context selected. Click the <code>Selected part</code> option. This sends the <code>partId</code> and <code>partNumber</code> to the application, along with the <code>documentId</code>, <code>elementId</code>, and the <code>workspaceOrVersionId</code>.</p> -</li> -<li> -<p>In the <code>Action URL</code> field, fill in the URL of the page to load in the right element panel. The parameters can be added as arguments (variable that get replaced with real values when the page is loaded from Onshape).</p> -<pre tabindex="0"><code>https://ourserver.com/bom?documentId=${documentid}&amp;elementId=${elementid}&amp;partId={$partId}&amp;partNumber={$partNumber} -</code></pre></li> -<li> -<p>Finally, select an icon for the extension. This will appear on the tab that opens the right element panel.</p> -</li> -</ol> -<p>You have now defined the extension, and it will appear in the Onshape -interface.</p> -<h3 id="call-a-page-in-the-extension">Call a page in the extension</h3> -<p>The following code snippet shows how to use your previous definition to -pull data from the third-party application and send it to the web page:</p> -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-js" data-lang="js"><span style="display:flex;"><span><span style="color:#aaa;font-style:italic">//https://myserver.com/bom?documentId=${documentId}&amp;elementId=${elementId}&amp; -</span></span></span><span style="display:flex;"><span><span style="color:#aaa;font-style:italic">//partId=${partId}&amp;partNumber=${partNumber} -</span></span></span><span style="display:flex;"><span><span style="color:#aaa;font-style:italic"></span>app.get(<span style="color:#a50">&#39;/bom&#39;</span>, (req, res) =&gt; { -</span></span><span style="display:flex;"><span> <span style="color:#00a">if</span> (req.query.partNumber !== <span style="color:#a50">&#39;${partNumber&#39;</span>}) { -</span></span><span style="display:flex;"><span> partController.getPartsList(req.query.partNumber).then((parts) =&gt; { -</span></span><span style="display:flex;"><span> catController.getCatById(parts.Category).then((cat) =&gt; { -</span></span><span style="display:flex;"><span> res.render(<span style="color:#a50">&#39;bomview&#39;</span>, { -</span></span><span style="display:flex;"><span> parts: parts, -</span></span><span style="display:flex;"><span> cat: cat -</span></span><span style="display:flex;"><span> }) -</span></span><span style="display:flex;"><span> }) -</span></span><span style="display:flex;"><span> }) -</span></span><span style="display:flex;"><span> } <span style="color:#00a">else</span> { -</span></span><span style="display:flex;"><span> res.render(<span style="color:#a50">&#39;bomview&#39;</span>, { -</span></span><span style="display:flex;"><span> parts: { <span style="color:#a50">&#34;_id&#34;</span>: <span style="color:#099">0</span> }, -</span></span><span style="display:flex;"><span> cat: { <span style="color:#a50">&#34;_id&#34;</span>: <span style="color:#099">0</span> } -</span></span><span style="display:flex;"><span> }) -</span></span><span style="display:flex;"><span> } -</span></span><span style="display:flex;"><span>}) -</span></span></code></pre></div><p>This code checks to see if the <code>partNumber</code> parameter was actually populated (i.e., that a part number was defined for the selected part). If defined, you can use the part number to -retrieve information about the selected part from our third-party application.</p> -<p>If the part number isn’t defined, you can send an alert to the web page to notify the user that a part number must be defined to use this web page.</p> -<p>You can also use the document ID, the element ID, and the Part ID to retrieve the correct part as long as they are stored with the part in your application.</p> -<h3 id="use-the-extension">Use the extension</h3> -<ol> -<li> -<p>In Onshape, load a document. You will see your icon embedded in -the location you chose for you extension.</p> -</li> -<li> -<p>Select a part in a Part Studio, and click the icon to open the extension application: -<img src="https://onshape-public.github.io/images/integrationguideimage94.png" style="width:6.5in;height:3.94236in" alt="Graphical user interface Description automatically generated" /></p> -<p>If the part you selected has not yet been synced with your third-party application, no part number has been generated, and the system can’t find a corresponding object in our database.</p> -<p>When you select a part that has been synced, and a part number has been generated, you will see the expected result:</p> -<img src="https://onshape-public.github.io/images/integrationguideimage95.png" style="width:5.49548in;height:3.32019in" alt="Graphical user interface Description automatically generated" /> -<p>Since the context you selected for this application extension was <code>Selected Part</code>, a part must be selected to load anything in the extension. If no part is selected, you will see a notification similar to the following:</p> -<img src="https://onshape-public.github.io/images/integrationguideimage96.png" style="width:5.10442in;height:1.41408in" alt="Graphical user interface, text, application Description automatically generated" /></li> -</ol>Docs: glTF Viewerhttps://onshape-public.github.io/docs/tutorials/gltf/Mon, 01 Jan 0001 00:00:00 +0000https://onshape-public.github.io/docs/tutorials/gltf/ -<p>The GLTF Viewer is a sample application that demonstrates:</p> -<ul> -<li>How to fetch a glTF representation of an Onshape model</li> -<li>How to create an app that runs as a tab inside an Onshape document</li> -<li>OAuth2 authentication</li> -<li>Use of REST APIs</li> -<li>Use of document context</li> -</ul> -<p>The application is built using Express and is deployed on Heroku.</p> -<p>Refer to the <a href="https://github.com/onshape-public/app-gltf-viewer">gltf-viewer-app README</a> for instructions on running this sample app.</p>Docs: Changeloghttps://onshape-public.github.io/docs/changelog/Mon, 01 Jan 0001 00:00:00 +0000https://onshape-public.github.io/docs/changelog/ -<h4 id="rel-1185---released-2024-08-12"><code>rel-1.185</code> - released 2024-08-12</h4> -<ul> -<li>Updated all endpoints that return a user summary (createdBy, modifiedBy) have a new boolean property <code>isOnshapeSupport</code> for use to separate Onshape support employee activities.</li> -<li>Updated all <code>bodyDetails</code>, <code>tessellatededged</code>, and <code>tessellatedfaces</code> endpionts (parts and Part Studios) to include <code>errorEnum</code> vales for detecting new mate position, curve pattern and Simulation material checks.</li> -</ul> -<h4 id="rel-1184---released-2024-07-19"><code>rel-1.184</code> - released 2024-07-19</h4> -<ul> -<li>Updated API version to <code>V8</code>, (<a href="https://cad.onshape.com/api/versions)">https://cad.onshape.com/api/versions)</a>, A new microversion will not be created when a document restore operation results in a no-op.</li> -<li>Remove inconsistencies in assembly definition endpoint (<code>/assemblies/d/[did]/[wvm]/[wvmid]/e/[eid]</code>) related to configuration parameters</li> -<li>Update all translation endpoints (<code>POST</code> : <code>../translations</code>) to include new request property <code>useFileNameToSetSinglePartName</code></li> -<li>Update all revision endpoints (<code>GET</code> : <code>/revisions/..</code>) to include response property <code>canChangeType</code> (supporting new admin option to change type part, assembly, file, etc)</li> -<li>Update <code>GET</code> : <code>/users/[:uid]/settings</code> endpoint to include responses for <code>highlightLaminarEdges</code> and <code>perspectiveModeOn</code> for <code>default</code> status</li> -</ul> -<h4 id="rel-1183---released-2024-06-28"><code>rel-1.183</code> - released 2024-06-28</h4> -<ul> -<li>Added new <code>V7</code> version to the api (<a href="https://cad.onshape.com/api/versions">https://cad.onshape.com/api/versions</a>)</li> -<li>Updated <code>GET</code> : <code>V7/partstudios/d/[did]/[wvm]/[wvmid]/e/[eid]/sketches</code> to return fully defined status (UNDERDEFINED, WELL_DEFINED, OVERDEFINED, UNKNOWN)</li> -<li>Updated <code>GET</code> : <code>V7/partstudios/d/[did]/[wvm]/[wvmid]/e/[eid]/sketches</code> vectors are now maps instead of arrays, and may be <code>BTVector2d</code> or <code>BTVector3d</code> depending on the <code>output3D</code> parameter</li> -<li>Updated <code>GET</code> : <code>V7/partstudios/d/[did]/[wvm]/[wvmid]/e/[eid]/sketches</code> to use more consistent naming:</li> -</ul> -<table> -<thead> -<tr> -<th>Fields</th> -</tr> -</thead> -<tbody> -<tr> -<td><code>sketch</code> -&gt; <code>name</code></td> -</tr> -<tr> -<td><code>sketchId</code> -&gt; <code>featureId</code></td> -</tr> -<tr> -<td><code>transformMatrix</code> -&gt; <code>sketchMatrix</code></td> -</tr> -<tr> -<td><code>featuresUsed</code> -&gt; <code>featuresUsingSketch</code></td> -</tr> -<tr> -<td><code>geomEntities</code> -&gt; <code>entities</code></td> -</tr> -</tbody> -</table> -<ul> -<li>Updated <code>GET</code> : <code>/variables</code> endpoint to return variable description when variable is set through custom feature</li> -<li>Updated <code>POST</code> : <code>/webhooks</code> endpoint to default to <code>isTransient = true</code> if not specified (auto cleanup)</li> -<li>Updated descriptions for Assembly, Documents, Metadata, Parts, Part Studios, Revisions, Variables and Versions enddpoints</li> -</ul> -<h4 id="rel-1182---released-2024-06-07"><code>rel-1.182</code> - released 2024-06-07</h4> -<ul> -<li>Updated descriptions for <code>webhooks</code> endpoints</li> -</ul> -<h4 id="rel-1181---released-2024-05-17"><code>rel-1.181</code> - released 2024-05-17</h4> -<ul> -<li>Update Document, Assembly, Blob, Drawing and Part Studio translation <code>POST</code> endpoints to have a new request body property <code>occurancesToExport</code></li> -<li>Update to <code>/elements</code> endpoint summary and descriptions in Glassworks</li> -<li>Updated documentation for webhooks (<a href="https://onshape-public.github.io/docs/app-dev/webhook/">https://onshape-public.github.io/docs/app-dev/webhook/</a>)</li> -</ul> -<h4 id="rel-1180---released-2024-04-26"><code>rel-1.180</code> - released 2024-04-26</h4> -<ul> -<li>New Drawings sample application (public repo: <a href="https://github.com/onshape-public/onshapedrawingjson">https://github.com/onshape-public/onshapedrawingjson</a>)</li> -<li>New API Guide section for response codes (<a href="https://onshape-public.github.io/docs/api-adv/errors/">https://onshape-public.github.io/docs/api-adv/errors/</a>)</li> -<li>Support export of tables in JSON of Drawings <code>GET</code> : <code>/appelements/[:did]/[:wvm]/[:wvmid]/e/[:eid]/views/[:viewid]/jsongeometry</code></li> -<li>Update Assembly, Blob, Drawing and Part Studio translation <code>POST</code> endpoints to have a new request body property <code>resolution</code></li> -</ul> -<h4 id="rel-1179---released-2024-04-05"><code>rel-1.179</code> - released 2024-04-05</h4> -<ul> -<li>New drawing views list endpoint <code>GET</code> : <code>/appelements/[:did]/[:wvm]/[:wvmid]/e/[:eid]/views</code></li> -<li>New drawing view endpoint <code>GET</code> : <code>/appelements/[:did]/[:wvm]/[:wvmid]/e/[:eid]/views/[:viewid]/jsongeometry</code></li> -<li>New updated features endpoint documentation</li> -<li>Updated glassworks for all metadata endpoints to reference developer documentation</li> -<li>Added description of output to schema for Metadata APIs</li> -<li>Updated translation endpoints with new request property <code>specifyMaterialData</code></li> -</ul> -<h4 id="rel-1178---released-2024-03-15"><code>rel-1.178</code> - released 2024-03-15</h4> -<ul> -<li>Update Part Studio translation <code>POST</code> endpoint to have a new request body property <code>importMaterialDensity</code></li> -<li>Update active workflow endpost <code>GET</code>: <code>/workflow/active</code> to have a new response property <code>hasInactiveCustomWorkflows</code></li> -<li>Updated authorization (OAuth2 and BasicAuth) for publication endpoints</li> -<li>Various updates to descriptions of data types and query parameters</li> -<li>Fixed delete publication endpoint (<code>HTTP::200</code> now removes publication)</li> -</ul> -<h4 id="rel-1177---released-2024-02-23"><code>rel-1.177</code> - released 2024-02-23</h4> -<ul> -<li>Updated translation endpoints with new request property <code>useIGESImportPostProcessing</code></li> -<li>Updated translation endpoints with modified request property <code>stepParasolidPreprocessingOption</code></li> -<li>Updated descriptions for <code>metadata</code> | <code>releasepackages</code> for property <code>propertyOverrideStatus</code></li> -</ul> -<h4 id="rel-1176---released-2024-02-02"><code>rel-1.176</code> - released 2024-02-02</h4> -<ul> -<li>New create publication endpoint <code>POST</code> : <code>/publications</code></li> -<li>New update publication endpoint <code>POST</code>: <code>/publications/[:pid]</code></li> -<li>New delete publication endpoint <code>DELETE</code>: <code>/publications/[:pid]</code></li> -<li>New create publication item endpoint <code>POST</code> : <code>/publications/item</code></li> -<li>New update publication item endpoint <code>POST</code>: <code>/publications/item/[:iid]</code></li> -<li>New delete publication item endpoint <code>DELETE</code>: <code>/publications/item/[:iid]</code></li> -</ul> -<h4 id="rel-1175---released-2024-01-12"><code>rel-1.175</code> - released 2024-01-12</h4> -<ul> -<li>Exclude suppressed sub assemblies from rootAssembly occurrences for <code>GET</code>: <code>/assemblies/d/[did]/[wvm]/[wvmid]/e/[eid]</code></li> -</ul> -<h4 id="rel-1174---released-2023-12-15"><code>rel-1.174</code> - released 2023-12-15</h4> -<ul> -<li>Add microversion id the extension url <code>[$microversionId]</code></li> -<li>Updated translation endpoints with new request property <code>pdfVersion</code></li> -<li>Fixed issue with bodydetails endpoints always returning <code>isInner</code> and <code>isOuter</code> the same</li> -<li>Update all endpoints for <code>bodydetails</code> | <code>tessellatededges</code> | <code>tessellatedfaces</code> | <code>featurescript</code> to include new response body <code>errorEnum</code>:</li> -</ul> -<table> -<thead> -<tr> -<th>errorEnum</th> -</tr> -</thead> -<tbody> -<tr> -<td><code>BODY_DRAFT_STRAY_NONMITER_EDGES</code></td> -</tr> -<tr> -<td><code>MASS_PROPERTY_FACES_NOT_COPLANAR</code></td> -</tr> -<tr> -<td><code>PARAMETER_VALUE_INVALID</code></td> -</tr> -<tr> -<td><code>SHEET_METAL_CHAMFER_NO_TANGENT_BASED</code></td> -</tr> -<tr> -<td><code>CHAMFER_DIRECTION_OVERRIDE_NO_EFFECT</code></td> -</tr> -<tr> -<td><code>FILLET_CHAMFER_UNSUPPORTED</code></td> -</tr> -<tr> -<td><code>CHAMFER_HELD_BACK</code></td> -</tr> -<tr> -<td><code>SWEEP_BAD_LOCK_DIRECTION</code></td> -</tr> -<tr> -<td><code>SHEET_METAL_COUNTER_HOLE_UNSUPPORTED</code></td> -</tr> -<tr> -<td><code>SWEEP_SELECT_DIRECTION</code></td> -</tr> -</tbody> -</table> -<ul> -<li>Update all endpoints for <code>bodydetails</code> | <code>tessellatededges</code> | <code>tessellatedfaces</code> | <code>featurescript</code> to include new property <code>imageForeignId</code></li> -<li>Support sending a list of emails to <code>POST</code> : <code>/classrooms/[cid]/members</code></li> -</ul> -<h4 id="rel-1173---released-2023-11-28"><code>rel-1.173</code> - released 2023-11-28</h4> -<ul> -<li>Update all classroom endpoints (<code>/classrooms/</code>) to support OAuth</li> -<li>Add description of output to schema for getAssemblyShadedViews API</li> -</ul> -<h4 id="rel-1172---released-2023-11-06"><code>rel-1.172</code> - released 2023-11-06</h4> -<ul> -<li>Update all endpoints for <code>bodydetails</code> | <code>tessellatededges</code> | <code>tessellatedfaces</code> | <code>featurescript</code> to include new response body <code>errorEnum</code>:</li> -</ul> -<table> -<thead> -<tr> -<th>errorEnum</th> -</tr> -</thead> -<tbody> -<tr> -<td><code>FIT_TOLERANCE_LIMITS_NOT_FOUND</code></td> -</tr> -<tr> -<td><code>FIT_TOLERANCE_SIZE_TOO_LARGE_ISO</code></td> -</tr> -<tr> -<td><code>FIT_TOLERANCE_SIZE_TOO_LARGE_ANSI</code></td> -</tr> -<tr> -<td><code>OFFSET_WIRE_SHEET_CREATION_FAILED</code></td> -</tr> -<tr> -<td><code>REPLACE_FACE_SHEET_SMALL</code></td> -</tr> -<tr> -<td><code>REPLACE_FACES_NOT_ADJACENT</code></td> -</tr> -<tr> -<td><code>SHEET_METAL_HOLE_REBUILD_FAILED</code></td> -</tr> -<tr> -<td><code>CPLANE_TANGENT_INPUT</code></td> -</tr> -<tr> -<td><code>CPLANE_TANGENT_SELECT_REFERENCE</code></td> -</tr> -<tr> -<td><code>CNE_TANGENT_PLANE_INVALID</code></td> -</tr> -<tr> -<td><code>CPLANE_TANGENT_POINT_INVALID</code></td> -</tr> -<tr> -<td><code>REPLACE_FACES_NOT_SAME_BODY</code></td> -</tr> -<tr> -<td><code>MUST_USE_DEFAULT_RADIUS_WITH_FACE_BEND</code></td> -</tr> -<tr> -<td><code>CANNOT_RIP_A_FACE_BEND</code></td> -</tr> -<tr> -<td><code>CANNOT_MAKE_A_FACE_BEND_TANGENT</code></td> -</tr> -</tbody> -</table> -<ul> -<li>References to <code>API Guide</code> for endpoint descriptions in Glassworks</li> -</ul> -<h4 id="rel-1171---released-2023-10-13"><code>rel-1.171</code> - released 2023-10-13</h4> -<ul> -<li>Update all translation <code>POST</code> endpoints to have a new request body properties <code>hideInspectionItems</code> and <code>textOption</code></li> -<li>Replaced <code>GET</code> : <code> /releasepackages/companyreleaseworkflow</code> | <code>/workflow/active</code> property <code>canCurrentUserSyncVersionsToArena</code> with <code>canCurrentUserSyncStandardContentToArena</code></li> -<li>Updated <code>GET</code> and <code>POST</code> : <code>/tabletemplates</code> endpoint with new response property <code>valueType</code></li> -<li>Comprehensive update to remaining endpoint summary and descriptions in Glassworks</li> -</ul> -<h4 id="rel-1170---released-2023-09-22"><code>rel-1.170</code> - released 2023-09-22</h4> -<ul> -<li>New appelements delete subelement endpoint <code>DELETE</code> : <code>/appelements/d/[did]/[wvm]/[wvmid]/e/[eid]/content/subelements</code></li> -<li>New company add new user endoint <code>POST</code> : <code>/companies/[cid]/users</code></li> -<li>New company update user endoint <code>POST</code> : <code>/companies/[cid]/users/[uid]</code></li> -<li>New company delete user endoint <code>DELETE</code> : <code>/companies/[cid]/users/[uid]</code></li> -<li>Comprehensive update to remaining endpoint summary and descriptions in Glassworks</li> -</ul> -<h4 id="rel-1169---released-2023-09-01"><code>rel-1.169</code> - released 2023-09-01</h4> -<ul> -<li>Comprehensive update to most endpoint summary and descriptions in Glassworks</li> -<li>Update all translation endpoints to include new property <code>importAppearances</code></li> -<li>Update <code>POST</code> : <code>/partstudios/d/[did]/[wvm]/[wvmid]/e/[eid]/featurescript</code> has a new property <code>expressionErrorInfo</code></li> -<li>Update <code>GET</code> and <code>POST</code> : <code>/releasepackages/[rpid]</code> property <code>workflow/actions</code> has a new enum value <code>REASSIGN_TASK</code></li> -</ul> -<h4 id="rel-1168---released-2023-08-11"><code>rel-1.168</code> - released 2023-08-11</h4> -<ul> -<li>Deprecated <code>POST</code> : <code>/api/drawings/create</code> -&gt; Replaced with <code>POST</code> : <code>/api/drawings/d/[did]/w/w/[wid]/create</code></li> -<li>Update <code>GET</code> : <code>/api/documents</code> endpoint has a new property <code>publishedVersion</code></li> -<li>Update <code>GET</code> and <code>POST</code> : <code>/api/releasepackages/[rpid]</code> has a new property <code>syncedWithPLM</code></li> -</ul> -<h4 id="rel-1167---released-2023-07-21"><code>rel-1.167</code> - released 2023-07-21</h4> -<ul> -<li>Update glTF translation endpoints to use new field <code>useGltfCompression</code> (bool)</li> -<li>Update STEP translation endpoints to use new field <code>stepParasolidPreprocessingOption</code> (0-None, 1-Advanced, 2-Automatic, 3-Basic)</li> -<li>Update <code>GET</code> : <code>/api/documents</code> | <code>/api/documents/[did]</code> | <code>/api/companies/[cid]/documentsbyname</code> to include new field <code>forceExportRules</code></li> -</ul> -<h4 id="rel-1165---released-2023-06-12"><code>rel-1.165</code> - released 2023-06-12</h4> -<ul> -<li>Support <code>partId</code> array string for <code>GET</code> : <code>/api/partstudios/bodydetails</code> endpoint for the option of getting a subset of parts from a partstudio (empty = all parts)</li> -</ul> -<h4 id="rel-1163---released-2023-04-28"><code>rel-1.163</code> - released 2023-04-28</h4> -<ul> -<li>Update documentation for the Documents endpoint (<code>/api/documents</code>)</li> -<li>Update Releasepackage endpoint <code>GET</code> : <code>/api/releasepackage</code> to include <code>type</code> to understand action (ie. Approve vs Reject)</li> -<li>Update API to V6 - Fix a bug in how updating the JSON tree of an app element in a transaction returns the diff</li> -</ul> -<h4 id="rel-1162---released-2023-04-12"><code>rel-1.162</code> - released 2023-04-12</h4> -<ul> -<li>New Assembly modify endpoint <code>POST</code> : <code>/api/assemblies/d/{did}/w/{wid}/e/{eid}/modify</code> for bulk deletion and suppression of instances and features</li> -</ul> -<h4 id="rel-1161---released-2023-03-20"><code>rel-1.161</code> - released 2023-03-20</h4> -<ul> -<li>New BOM templates endpoint (<code>/api/tabletemplates</code>)</li> -<li>Support POST <code>/api/webhooks</code> parameter <code>isTransient = true</code> to specify auto cleanup after a set number of days</li> -</ul> -<h4 id="rel-1160---released-2023-02-24"><code>rel-1.160</code> - released 2023-02-24</h4> -<ul> -<li>Support configuratons for <code>GET</code> : <code>/api/partstudios/d/{did}/{wvm}/{wvmid}/e/{eid}/features</code></li> -<li>Remove deprecated <code>GET</code> : <code>/api/elements/:emid</code></li> -<li>Remove deprecated <code>GET</code> and <code>POST</code> : <code>/api/elements/d/:did/[wvm]/:wvmid/e/:eid/metadata</code></li> -<li>Deprecated <code>GET</code> and <code>POST</code> : <code>/api/parts/standardcontent/d/:did/v/:vid/e/:eid/[cu]/:cuid/partid/:pid/metadata</code></li> -<li>Deprecated <code>GET</code> and <code>POST</code> : <code>/api/parts/d/:did/[wvm]/:wmvid/e/:eid/partid/:pid/metadata</code></li> -</ul> -<h4 id="rel-1158---released-2023-01-11"><code>rel-1.158</code> - released 2023-01-11</h4> -<ul> -<li>New example values in Glassworks API documentation</li> -</ul> -<h4 id="rel-1155---released-2022-11-01"><code>rel-1.155</code> - released 2022-11-01</h4> -<ul> -<li>Support Parasolid binary (x_b) exports</li> -</ul> -<h4 id="rel-1154---released-2022-10-10"><code>rel-1.154</code> - released 2022-10-10</h4> -<ul> -<li>Add face color, hidden state and type of composite to body details endpoint</li> -</ul> -<h4 id="rel-1152---released-2022-08-30"><code>rel-1.152</code> - released 2022-08-30</h4> -<ul> -<li>Support more parameters to filter the partstudio endpoint</li> -</ul> -<h4 id="rel-1147---released-2022-05-16"><code>rel-1.147</code> - released 2022-05-16</h4> -<ul> -<li>Support global tree node endpoint for impacting recently opened filter</li> -</ul> -<h4 id="rel-1146---released-2022-04-25"><code>rel-1.146</code> - released 2022-04-25</h4> -<ul> -<li>Support API versioning</li> -<li>Return ‘nodeId’ when adding or updating an AppElement</li> -</ul> -<h4 id="rel-1145---released-2022-04-05"><code>rel-1.145</code> - released 2022-04-05</h4> -<ul> -<li>Fixed issue where assembly feature errors were missing</li> -</ul> -<h4 id="rel-1140---released-2021-12-15"><code>rel-1.140</code> - released 2021-12-15</h4> -<ul> -<li>Add mass properties for assemblies</li> -</ul> -<h4 id="rel-1139---released-2021-11-15"><code>rel-1.139</code> - released 2021-11-15</h4> -<ul> -<li>Relax casing search in Glassworks (Swagger client)</li> -<li>BOM and Metadata API endpoint responses now matched</li> -</ul> -<h4 id="rel-1138---released-2021-10-25"><code>rel-1.138</code> - released 2021-10-25</h4> -<ul> -<li>Updated webhook documentation</li> -</ul> -<h4 id="rel-1135---released-2021-8-20"><code>rel-1.135</code> - released 2021-8-20</h4> -<ul> -<li>Webhook events for Enterprise SSO configuration changes</li> -</ul> -<h4 id="rel-1134---released-2021-07-30"><code>rel-1.134</code> - released 2021-07-30</h4> -<ul> -<li>Support comment events (add, update, delete) for the web-hook endpoint</li> -</ul> -<h4 id="rel-1131---released-2021-06-01"><code>rel-1.131</code> - released 2021-06-01</h4> -<ul> -<li>Add synchronous glTF/gLB endpoint for assemblies</li> -</ul> -<h4 id="rel-1128---released-2021-03-29"><code>rel-1.128</code> - released 2021-03-29</h4> -<ul> -<li>Support face color for export of glTF/gLB</li> -<li>Add document API endpoint for comments</li> -</ul> -<h4 id="rel-1127---released-2021-03-08"><code>rel-1.127</code> - released 2021-03-08</h4> -<ul> -<li>Add translation option dtkPeriodicFacesPolicy=3 for CATIA parts</li> -</ul> -<h4 id="rel-1126---released-2021-02-12"><code>rel-1.126</code> - released 2021-02-12</h4> -<ul> -<li>Add GLTF and GLB accepts option to the tessellation APIs</li> -</ul> -<h4 id="rel-1125---released-2021-01-25"><code>rel-1.125</code> - released 2021-01-25</h4> -<ul> -<li>Add ‘good/better/best’ quality query parameters to tessellation endpoint</li> -</ul> -<h4 id="rel-1122---released-2020-11-18"><code>rel-1.122</code> - released 2020-11-18</h4> -<ul> -<li>Enforce OAuth endpoint rate limiting</li> -<li>Add release package action/transition based webhooks</li> -</ul> -<h4 id="rel-1119---released-2020-09-15"><code>rel-1.119</code> - released 2020-09-15</h4> -<ul> -<li>Add rollback bar to EvalFeatureScript endpoint</li> -</ul> -<h4 id="rel-1118---released-2020-08-25"><code>rel-1.118</code> - released 2020-08-25</h4> -<ul> -<li>PartStudio GET support for sketch constraints in features endpoint</li> -</ul> -<h4 id="rel-1116---released-2020-07-15"><code>rel-1.116</code> - released 2020-07-15</h4> -<ul> -<li>Specify starting elements to create document endpoint</li> -</ul> -<h4 id="rel-1114---released-2020-06-03"><code>rel-1.114</code> - released 2020-06-03</h4> -<ul> -<li>Project endpoints</li> -</ul> -<h4 id="rel-1113---released-2020-05-11"><code>rel-1.113</code> - released 2020-05-11</h4> -<ul> -<li>Output GLTF files for an element (tab)</li> -</ul> -<h4 id="rel-1111---released-2020-03-31"><code>rel-1.111</code> - released 2020-03-31</h4> -<ul> -<li>Support ownership transfer for teams</li> -</ul> -<h4 id="rel-1110---released-2020-03-09"><code>rel-1.110</code> - released 2020-03-09</h4> -<ul> -<li>Add support for exploded views</li> -</ul> -<h4 id="rel-1108---released-2020-01-29"><code>rel-1.108</code> - released 2020-01-29</h4> -<ul> -<li>Drawings endpoints for create 4 view, get view geometry and view definition</li> -</ul> -<h4 id="rel-1102---released-2019-09-11"><code>rel-1.102</code> - released 2019-09-11</h4> -<ul> -<li>Added webhook events for release management</li> -<li>Added webhook event for document version creation</li> -</ul> -<h4 id="rel-199---released-2019-07-08"><code>rel-1.99</code> - released 2019-07-08</h4> -<ul> -<li>Assembly BOM API support for items</li> -</ul> -<h4 id="rel-196---released-2019-05-03"><code>rel-1.96</code> - released 2019-05-03</h4> -<ul> -<li>Part Studio compare endpoint</li> -</ul> -<h4 id="rel-193---released-2019-03-01"><code>rel-1.93</code> - released 2019-03-01</h4> -<ul> -<li>Webhook subscriptions for a company</li> -</ul> -<h4 id="rel-186---released-2018-09-28"><code>rel-1.86</code> - released 2018-09-28</h4> -<ul> -<li>Export Drawings to DXF, DWG and PDF</li> -</ul> \ No newline at end of file +Welcome to the Onshape Developer Documentation onhttps://onshape-public.github.io/docs/Recent content in Welcome to the Onshape Developer Documentation onHugoen-usMon, 01 Jan 0001 00:00:00 +0000Changeloghttps://onshape-public.github.io/docs/changelog/Mon, 01 Jan 0001 00:00:00 +0000https://onshape-public.github.io/docs/changelog/rel-1.185 - released 2024-08-12 Updated all endpoints that return a user summary (createdBy, modifiedBy) have a new boolean property isOnshapeSupport for use to separate Onshape support employee activities. Updated all bodyDetails, tessellatededged, and tessellatedfaces endpionts (parts and Part Studios) to include errorEnum vales for detecting new mate position, curve pattern and Simulation material checks. rel-1.184 - released 2024-07-19 Updated API version to V8, (https://cad.onshape.com/api/versions), A new microversion will not be created when a document restore operation results in a no-op. \ No newline at end of file diff --git a/docs/tutorials/createextension/index.html b/docs/tutorials/createextension/index.html index f347dba..1d53dfb 100644 --- a/docs/tutorials/createextension/index.html +++ b/docs/tutorials/createextension/index.html @@ -1,9 +1,8 @@ -Create an Extension |

    Create an Extension

    In this example, you will create a custom web page (as shown in the image below) that is displayed in the +Create an Extension |

    Create an Extension

    In this example, you will create a custom web page (as shown in the image below) that is displayed in the right-hand fly-out panel. This interface displays metadata pulled from a third-party system when a part in Onshape is selected. This interface can also update metadata in Onshape through the Update functionality.

    You can follow along with the steps below with this video: OAuth app creation video

    Define the extension

    This tutorials builds off the Generate Derivative Files tutorial. Please complete that one before starting on this one.

    1. Navigate to the Developer portal from https://dev-portal.onshape.com.

    2. Click OAuth applications in the left menu.

    3. Select your application, and the click the Extensions tab. @@ -36,4 +35,4 @@

    This code checks to see if the partNumber parameter was actually populated (i.e., that a part number was defined for the selected part). If defined, you can use the part number to retrieve information about the selected part from our third-party application.

    If the part number isn’t defined, you can send an alert to the web page to notify the user that a part number must be defined to use this web page.

    You can also use the document ID, the element ID, and the Part ID to retrieve the correct part as long as they are stored with the part in your application.

    Use the extension

    1. In Onshape, load a document. You will see your icon embedded in the location you chose for you extension.

    2. Select a part in a Part Studio, and click the icon to open the extension application: -Graphical user interface Description automatically generated

      If the part you selected has not yet been synced with your third-party application, no part number has been generated, and the system can’t find a corresponding object in our database.

      When you select a part that has been synced, and a part number has been generated, you will see the expected result:

      Graphical user interface Description automatically generated

      Since the context you selected for this application extension was Selected Part, a part must be selected to load anything in the extension. If no part is selected, you will see a notification similar to the following:

      Graphical user interface, text, application Description automatically generated
    \ No newline at end of file +Graphical user interface Description automatically generated

    If the part you selected has not yet been synced with your third-party application, no part number has been generated, and the system can’t find a corresponding object in our database.

    When you select a part that has been synced, and a part number has been generated, you will see the expected result:

    Graphical user interface Description automatically generated

    Since the context you selected for this application extension was Selected Part, a part must be selected to load anything in the extension. If no part is selected, you will see a notification similar to the following:

    Graphical user interface, text, application Description automatically generated
    \ No newline at end of file diff --git a/docs/tutorials/derivative/index.html b/docs/tutorials/derivative/index.html index 09538a9..ac178eb 100644 --- a/docs/tutorials/derivative/index.html +++ b/docs/tutorials/derivative/index.html @@ -1,9 +1,8 @@ -Generate Derivative Files |

    Generate Derivative Files

    This tutorials builds off the Sync Releases and Revisions tutorial. Please complete that one before starting on this one.

    It’s clear by now that Onshape doesn’t use files to store its data, +Generate Derivative Files |

    Generate Derivative Files

    This tutorials builds off the Sync Releases and Revisions tutorial. Please complete that one before starting on this one.

    It’s clear by now that Onshape doesn’t use files to store its data, instead it is a data driven solution that is always up to date. Files are a snapshot in time that provide a view of the design at a specific point in time - such as at a release or version. A new file is required @@ -109,4 +108,4 @@ follows:

    In this case once the translation is completed, this endpoint receives a notification. If the event is equal to

    onshape.model.translation.complete

    We can assume that the translation has completed and we can unregister the webhook and retrieve the translated file.

    The complete sample including it setup and deployment can be found at: -https://github.com/onshape-public/app-gltf-viewer

    \ No newline at end of file +https://github.com/onshape-public/app-gltf-viewer

    \ No newline at end of file diff --git a/docs/tutorials/gltf/index.html b/docs/tutorials/gltf/index.html index 1ddb344..2e04d7b 100644 --- a/docs/tutorials/gltf/index.html +++ b/docs/tutorials/gltf/index.html @@ -1,11 +1,9 @@ -glTF Viewer | glTF Viewer |

    glTF Viewer

    The GLTF Viewer is a sample application that demonstrates:

    • How to fetch a glTF representation of an Onshape model
    • How to create an app that runs as a tab inside an Onshape document
    • OAuth2 authentication
    • Use of REST APIs
    • Use of document context

    The application is built using Express and is deployed on Heroku.

    Refer to the gltf-viewer-app README for instructions on running this sample app.

    \ No newline at end of file +Refer to the gltf-viewer-app README for instructions on running this sample app.">

    glTF Viewer

    The GLTF Viewer is a sample application that demonstrates:

    • How to fetch a glTF representation of an Onshape model
    • How to create an app that runs as a tab inside an Onshape document
    • OAuth2 authentication
    • Use of REST APIs
    • Use of document context

    The application is built using Express and is deployed on Heroku.

    Refer to the gltf-viewer-app README for instructions on running this sample app.

    \ No newline at end of file diff --git a/docs/tutorials/index.html b/docs/tutorials/index.html index b6c7aa2..eb02f7d 100644 --- a/docs/tutorials/index.html +++ b/docs/tutorials/index.html @@ -1,3 +1,5 @@ -Sample Apps |

    Sample Apps

    The easiest way to get started with the Onshape API is to look at our sample applications. Each sample application is provided as a Github repository. For access, go to https://github.com/onshape-public.

    Sample Apps and Tutorials

    1. In Sync Data and Metadata, we set up a third-party OAuth application and pull part numbers into it from Onshape.
    2. Whether data is released initially in Onshape or in the third-party application, those releases must be kept in sync. In Sync Releases and Revisions, we use part number data (pushed to the third-party application in the previous tutorial) to release data and push notifications back to Onshape.
    3. Generate Derivative Files deals with the creation of derivative -files (such as PDF, STEP, etc.) once the release has been successfully completed.
    4. In the Extensions tutorial, we add our app to an extension in the right-hand fly-out panel in Onshape.
    5. In the glTF Viewer app, we authenticate with OAuth2 and fetch a glTF representation of an Onshape model.
    \ No newline at end of file +Sample Apps |

    Sample Apps

    The easiest way to get started with the Onshape API is to look at our sample applications. Each sample application is provided as a Github repository. For access, go to https://github.com/onshape-public.

    Sample Apps and Tutorials

    1. In Sync Data and Metadata, we set up a third-party OAuth application and pull part numbers into it from Onshape.
    2. Whether data is released initially in Onshape or in the third-party application, those releases must be kept in sync. In Sync Releases and Revisions, we use part number data (pushed to the third-party application in the previous tutorial) to release data and push notifications back to Onshape.
    3. Generate Derivative Files deals with the creation of derivative +files (such as PDF, STEP, etc.) once the release has been successfully completed.
    4. In the Extensions tutorial, we add our app to an extension in the right-hand fly-out panel in Onshape.
    5. In the glTF Viewer app, we authenticate with OAuth2 and fetch a glTF representation of an Onshape model.
    \ No newline at end of file diff --git a/docs/tutorials/index.xml b/docs/tutorials/index.xml index 9b43fe4..93e5ab4 100644 --- a/docs/tutorials/index.xml +++ b/docs/tutorials/index.xml @@ -1,1325 +1,7 @@ -– Sample Appshttps://onshape-public.github.io/docs/tutorials/Recent content in Sample Apps onHugo -- gohugo.ioen-usWed, 07 Jun 2023 00:00:00 +0000Docs: Sync Data and Metadatahttps://onshape-public.github.io/docs/tutorials/sync/Mon, 01 Jan 0001 00:00:00 +0000https://onshape-public.github.io/docs/tutorials/sync/ -<p>The first business case is probably the most common, “How do I sync data -that I create in Onshape with my ERP or PLM system?”. There could be -many reasons why you would want to sync data between two different -systems. Primarily Onshape is a system that creates new data. This data -is created by designers as they perform their daily tasks. While the -designer works primarily in Onshape, the actual data that they create -does not exist in a vacuum, it is used by other departments, other -processes within the organization. These departments and processes -probably do not have access to Onshape or the required knowledge of how -to use Onshape. In addition, quite often, the data generated by Onshape -will be augmented with additional data as the product lifecycle process -progresses.</p> -<p>Therefore, Onshape could be considered the genesis of the data that will -be used to develop a product, yet it is not the only data that will be -required.</p> -<h2 id="overview">Overview</h2> -<p>In this business case we examine how a designer could work in Onshape -and how the data generated by Onshape can be used to make decisions in -other systems. Based upon the decisions made, data is pushed back to -Onshape as values calculated in another system. Let’s look at the -process in much more detail.</p> -<h3 id="step-1-define-properties-in-onshape">Step 1: Define Properties in Onshape</h3> -<p><img src="https://onshape-public.github.io/images/integrationguideimage31.png" -style="width:5.41667in;height:1.84722in" -alt="Diagram Description automatically generated" /></p> -<ol> -<li> -<p>In the first step, the designer starts a new part in Onshape – -remember that in Onshape a Part can be created along with other -parts in a Part Studio, so we can assume that there could be -multiple parts created in the single document. Obviously, we want -the designer to have the freedom to use all Onshape functionality -without constraints placed by the demands of the integration.</p> -</li> -<li> -<p>At some point in the design process, the designer will be required -to enter property values for the part – these could include values -such as the Part Name, the description, material and so on.</p> -</li> -<li> -<p>The designer clicks the “Save” or “Apply” button for the properties -and closes the properties window.</p> -</li> -<li> -<p>A web hook that listens to any changes in the properties has been -defined. As the user saves the properties, the web hook is -triggered, and it will send a notification through the defined web -hook to the third-party system.</p> -</li> -</ol> -<p><img src="https://onshape-public.github.io/images/integrationguideimage6.png" -style="width:0.47222in;height:0.47222in" />Note: There are Part -properties, workspace properties and document properties – all these -properties live at different levels of the document. While the trigger -could pick up changes to any to these properties, we are currently -focused on just Part properties – the event will be triggered on any -saving of properties, however our third-party code can ignore anything -that’s not a Part (or an Assembly). In this next step we assume that a -new object is being created in the third-party application.</p> -<h3 id="step-2-create-corresponding-object">Step 2: Create Corresponding Object</h3> -<p><img src="https://onshape-public.github.io/images/integrationguideimage32.png" -style="width:5.16667in;height:2.13889in" -alt="Diagram Description automatically generated" /></p> -<ol> -<li> -<p>Once the designer made changes to the properties in Onshape and -saved those changes, a message is sent to our third-party -application. This message is in JSON format and contains minimal -information such as the Workspace ID, the Document ID, the Element -ID, the Part ID (if it’s a Part) and information regarding the event -that was triggered. The third-party application receives this -information to an endpoint that was defined during the setup of the -web hook.</p> -</li> -<li> -<p>The code in our application can now use the ID’s sent over to check -if an object with corresponding IDs exists in our system. Here we -are assuming that no such object exists. This does mean that we must -store Onshape IDs into our objects in the third-party system.</p> -</li> -<li> -<p>We then create a new object and populate the ID information and save -it to the database. Note that at this point in time, we only have -minimal information that provides no more than the identity of the -Onshape Part.</p> -</li> -<li> -<p>Next, in order to get the complete metadata, we must make a REST API -call to Onshape in order to get the metadata for the part. Since we -were provided the ID information in the web hook, we have enough -information to go back to Onshape and request the metadata for a -specific, document, element, workspace and part.</p> -</li> -</ol> -<p><img src="https://onshape-public.github.io/images/integrationguideimage6.png" -style="width:0.47222in;height:0.47222in" />Note that you can either -store the Onshape IDs in separate fields in your database or as one long -unique string which can be used to easily identify the part in your -application.</p> -<h3 id="step-3-get-onshape-metadata">Step 3: Get Onshape Metadata</h3> -<p><img src="https://onshape-public.github.io/images/integrationguideimage33.png" -style="width:5.75in;height:2.04167in" -alt="Graphical user interface, text, application, chat or text message Description automatically generated" /></p> -<ol> -<li> -<p>The response from the call to the Onshape API is sent back as JSON. -The data will contain a lot of different objects that represent the -property values, their types, the IDs, name of the property, value -of the property, etc.</p> -</li> -<li> -<p>Once received this data must be parsed by your third-party -application code and the corresponding object updated as required. -For bi-directional update, it is important to store the Onshape -property IDs of any data that will need to be synced back to Onshape -from the third-party application.</p> -</li> -<li> -<p>This is an optional stage. Once you have all the metadata values -imported, you could now calculate any values that are based off the -metadata. The most common use case scenario is the generation of -intelligent part numbers. Based off configuration, part type, etc., -you could generate a part number that has specific meaning within -the context of the company.</p> -</li> -<li> -<p>If you calculated specific values, you can now store them in your -database.</p> -</li> -</ol> -<h3 id="step-4-modify-properties-in-onshape">Step 4: Modify Properties in Onshape</h3> -<p><img src="https://onshape-public.github.io/images/integrationguideimage34.png" -style="width:5.04167in;height:3.97222in" -alt="Diagram Description automatically generated" /></p> -<ol> -<li> -<p>As in Step 1 the designer updates the properties in Onshape – this -is obviously something that can happen multiple times</p> -</li> -<li> -<p>The web hook is triggered when the designer saves the property -changes</p> -</li> -<li> -<p>Our third-party application is listening for property changes</p> -</li> -<li> -<p>The third-party application’s code will check if the corresponding -object exists based off the IDs sent from Onshape.</p> -</li> -<li> -<p>In this scenario the corresponding object has already been saved in -our system</p> -</li> -<li> -<p>We make a REST API call to Onshape to get the metadata based off the -IDs sent from Onshape.</p> -</li> -<li> -<p>Onshape returns the JSON that represents the updated properties</p> -</li> -<li> -<p>We ingest the updated metadata and update our existing object in the -third-party system.</p> -</li> -</ol> -<h3 id="step-5-request-part-number">Step 5: Request Part Number</h3> -<p><img src="https://onshape-public.github.io/images/integrationguideimage35.png" -style="width:5.76389in;height:2.13889in" -alt="Graphical user interface, text, application, chat or text message Description automatically generated" /></p> -<ol> -<li> -<p>As we will see later, Onshape has the built in capability to pull -custom part numbers from a third-party system. From either the -properties window or the release candidate window, click the button -to request a part number</p> -</li> -<li> -<p>Onshape sends basic ID information to a predefined endpoint in our -third-party app.</p> -</li> -<li> -<p>The ID information sent by Onshape is enough data to find the -corresponding object in our database. We then extract from that -object the pre-calculated intelligent part number – or we can -calculate it at this point.</p> -</li> -<li> -<p>The part number is returned to Onshape and populated in the Part -Number field</p> -</li> -</ol> -<p><img src="https://onshape-public.github.io/images/integrationguideimage6.png" -style="width:0.47222in;height:0.47222in" />Note that in order to pull a -part number from a third-party application we will need to implement -OAuth2 in our application and grant Onshape access to the resources of -our application. Onshape has a very good mechanism for achieving this -and we will be explaining this in detail in this section.</p> -<p>Note that by default Onshape uses its own internal Part number -generator, in order to use a custom third-party generator, we will need -to define an app extension and then define in the Enterprise release -settings to use our custom part number generator.</p> -<h3 id="step-6-push-updates-from-third-party-application">Step 6: Push Updates from Third-Party Application</h3> -<p><img src="https://onshape-public.github.io/images/integrationguideimage36.png" -style="width:5.75in;height:2.45833in" -alt="Graphical user interface, text, application, chat or text message Description automatically generated" /></p> -<ol> -<li> -<p>In this scenario we are updating an Object in our third-party -application and expecting that some of the property values will be -updated in Onshape. We can either send over all the properties -populated for this object, or a subset of properties and values</p> -</li> -<li> -<p>The REST API to update properties in Onshape requires that we -reference the IDs of the properties that we are updating. For this -reason we have stored the Onshape property IDs with our metadata -object in our database.</p> -</li> -<li> -<p>We construct the correct JSON that contains all the properties to -update and the new values. We can then call the Onshape REST API to -update the properties in Onshape with the new data.</p> -</li> -<li> -<p>Once successfully completed, the Onshape REST API call will return -HTTP 200 and we can notify the user if needed.</p> -</li> -</ol> -<p><img src="https://onshape-public.github.io/images/integrationguideimage6.png" -style="width:0.47222in;height:0.47222in" />Note that updates to Onshape -will happen behind the scenes in real-time, therefore someone working on -the document in Onshape will be able to see the updates as soon as they -have been made. There is no notification in Onshape that notifies the -user that properties have been updated, however you can open the -properties window and view the updated data.</p> -<h2 id="implementation">Implementation</h2> -<p>We’ll start by defining an <a href="https://onshape-public.github.io/docs/app-dev/extensions">App Extension</a> in Onshape so that we can -receive custom part numbers.</p> -<p><img src="https://onshape-public.github.io/images/integrationguideimage4.png" -style="width:0.43056in;height:0.43056in" /></p> -<h3 id="debug">Debug</h3> -<p>All Browsers now have developer tools exposed in their interface. These -tools provide us ways to debug client code, view console messages and -most importantly for our use case, view Network requests and their -response.</p> -<p>In this example I am using Chrome’s developer tools. Most other Browsers -have more or less copied Chrome’s layout for the developer tools so it -should be easy to find the network section.</p> -<p><img src="https://onshape-public.github.io/images/integrationguideimage39.png" -style="width:5.36972in;height:4.16096in" -alt="Graphical user interface, text, application Description automatically generated" /></p> -<p><span id="_Toc102977895" class="anchor"></span>Figure 24 Accessing -Chrome&rsquo;s Developer Tools</p> -<p>Let’s take the simple use case of trying to understand which endpoint -Onshape uses for saving Metadata.</p> -<p>Open a document in Onshape and define some properties – don’t save yet.</p> -<p><img src="https://onshape-public.github.io/images/integrationguideimage40.png" -style="width:3.42406in;height:2.25966in" -alt="Graphical user interface, text, application, email Description automatically generated" /></p> -<p>Prior to saving open the developer tools and click on the “Network” tab.</p> -<p><img src="https://onshape-public.github.io/images/integrationguideimage41.png" style="width:6.5in;height:2.37014in" -alt="Table Description automatically generated" /></p> -<p><span id="_Toc102977896" class="anchor"></span>Figure 25 Developer Tools -Network Tab</p> -<p>Next save the updated properties by clicking either the Apply Button or -the Save Button</p> -<p>In the Network tab you will see a new web request – select it:</p> -<p><img src="https://onshape-public.github.io/images/integrationguideimage42.png" -style="width:5.40656in;height:2.82458in" -alt="Graphical user interface, text, application Description automatically generated" /></p> -<p><span id="_Toc102977897" class="anchor"></span>Figure 26 Network Request -Sample</p> -<p>What we are seeing here is the response from the call to Save the -properties. We can expand this response to view the complete JSON.</p> -<p>By clicking on the Headers we can view the actual request:</p> -<p><img src="https://onshape-public.github.io/images/integrationguideimage43.png" -style="width:5.125in;height:2.47222in" -alt="Graphical user interface, text, application Description automatically generated" /></p> -<p><span id="_Toc102977898" class="anchor"></span>Figure 27 HTTP POST -Request for Saving Properties</p> -<p>Here we can see that this will correspond to the APIs listed in the API Explorer.</p> -<p>Most importantly the “Payload” tab is our definition of the body of the -request. This is provided in JSON format and can be expanded. As shown -here:</p> -<p><img src="https://onshape-public.github.io/images/integrationguideimage44.png" -style="width:4.90769in;height:2.94205in" -alt="Graphical user interface, text, application Description automatically generated" /></p> -<p><span id="_Toc102977899" class="anchor"></span>Figure 28 HTTP POST Body</p> -<p>We now have the correct API call and the format of the body to -successfully make the API call. We can also see from the body that if we -wish to update properties in Onshape from our third-party application, -we need to store the propertyID value.</p> -<p><img src="https://onshape-public.github.io/images/integrationguideimage4.png" -style="width:0.43056in;height:0.43056in" />It is important to mention – -ALWAYS use cad.onshape.com to make API calls (no matter what you see in -the Headers tab or is shown in the Payload tab.</p> -<h3 id="define-an-application-extension">Define an Application Extension</h3> -<p>An application extension is how Onshape embeds third-party application -features in its UI. There are two types of extension:</p> -<ol> -<li> -<p>An extension that embeds its UI from the application into the -Onshape UI in an iFrame. Such a application my call Onshape REST -APIs or just expose an application interface inside Onshape.</p> -</li> -<li> -<p>An extension that embeds and that calls a REST API exposed by the -application from the Onshape UI. For instance, embedding application -functionality in the context menus or toolbars. This type of -application extension relies on external OAuth information in order -to authenticate the call. In this case Onshape acts as the client -and the application as the server.</p> -</li> -</ol> -<p>Each extension will exist at a specific location in the Onshape UI and -will work within the context of that location or a specific selection, -passing the relative information to the application.</p> -<p>In order to define the Application Extension we return to the -development portal at <a href="https://dev-portal.onshape.com/oauthApps">https://dev-portal.onshape.com/oauthApps</a> where -we initially defined our OAuth Application.</p> -<p>Select the OAuth Application that you previously defined and click on -the Extensions tab.</p> -<p><img src="https://onshape-public.github.io/images/integrationguideimage91.png" style="width:6.5in;height:3.37917in" -alt="Graphical user interface, text, application, Teams Description automatically generated" /></p> -<p><span id="_Toc102977900" class="anchor"></span>Figure 29 - Oauth -Applications - Extensions</p> -<p>Start by clicking the Add Extension button.</p> -<p><img src="https://onshape-public.github.io/images/integrationguideimage6.png" -style="width:0.47222in;height:0.47222in" />Note that you can create as -many extensions as you need for your application within the Onshape UI.</p> -<p>This is the interface where you define where in the Onshape UI the -command will appear, and what endpoint in your application the command -will reference. Changing the Location dropdown will provide additional -fields that can be defined to specify context and other relevant fields.</p> -<p>For our use case, Define a name, i.e. “Custom Part Number Generator”, -define a description of the extension and select “Part Number Generator” -from the Location dropdown. The only other field that you need to define -is the Action URL. This is the endpoint in your application where you -will fetch the part number from.</p> -<p><img src="https://onshape-public.github.io/images/integrationguideimage46.png" style="width:4.125in;height:4.125in" -alt="Graphical user interface, text, application, email Description automatically generated" /></p> -<p><span id="_Toc102977901" class="anchor"></span>Figure 30 - Define -Application Extension</p> -<p>Once you save the definition you will see it in the list of extensions. -You can always come back and edit the definition of the extension.</p> -<h3 id="grant-onshape-access-to-3suprdsup-party-data">Grant Onshape Access to 3<sup>rd</sup> Party Data</h3> -<p>If you require Onshape to access the resources of your application, then -you will need to define the external OAuth parameters. In our use case -we will need Onshape to access data in our application in order to pull -the part numbers into Onshape.</p> -<p>Click on the External OAuth tab, the final tab on the OAuth Applications -page.</p> -<p><img src="https://onshape-public.github.io/images/integrationguideimage47.png" style="width:6.5in;height:3.27361in" -alt="Graphical user interface, text, application, email Description automatically generated" /></p> -<p><span id="_Toc102977902" class="anchor"></span>Figure 31 - Define -External OAuth</p> -<p><img src="https://onshape-public.github.io/images/integrationguideimage4.png" -style="width:0.43056in;height:0.43056in" />In this guide we’re not -detailing the implementation of OAuth2 inside your application, this is -explained very well in many on-line guides. My favorite of these can be -found at: -<a href="https://www.digitalocean.com/community/tutorials/an-introduction-to-oauth-2">https://www.digitalocean.com/community/tutorials/an-introduction-to-oauth-2</a></p> -<p>Onshape provides the fields that are required for it to make a secure -request to your application, receive an access Token and refresh it when -required. In this case Onshape acts as the client and your application -as the server – this is the inverse to what we defined when we enabled -the third-party application to access Onshape.</p> -<p>Once you have defined the fields, Save/Update the definitions. We have -now completed defining the application extension and enabling Onshape to -access your applications resources.</p> -<p><img src="https://onshape-public.github.io/images/integrationguideimage6.png" -style="width:0.47222in;height:0.47222in" />Note if you haven’t defined -all the endpoints at this time, you can come back later and update the -information once you have it defined in your application.</p> -<p>The last thing we need to do is for the user to grant access for Onshape -to access your applications resources. We can do this through the same -interface that we used to grant access to Onshape.</p> -<p>From inside Onshape go to your account settings, from the top right -dropdown menu. Click on the applications page.</p> -<p>For applications that have an application extension and External OAuth -defined we have the “Grant” button available in the “external Access” -column as shown here:</p> -<p><img src="https://onshape-public.github.io/images/integrationguideimage48.png" style="width:6.5in;height:2.87083in" -alt="Graphical user interface, text, application, email Description automatically generated" /></p> -<p><span id="_Toc102977903" class="anchor"></span>Figure 32 - Grant -External Access</p> -<p>Click the “Grant” Button in the External Access column.</p> -<p>Your third-party application will present the user with option to -authorize access to the application – similar to this simple interface:</p> -<p><img src="https://onshape-public.github.io/images/integrationguideimage49.png" -style="width:4.25285in;height:1.71051in" -alt="Graphical user interface, text Description automatically generated" /></p> -<p><span id="_Toc102977904" class="anchor"></span>Figure 33 - Enabling -Onshape to access a 3rd parties data</p> -<p>If you click “Allow”, you will be returned to Onshapes Applications page -and external access will be granted.</p> -<h3 id="defining-webhooks">Defining Webhooks</h3> -<p>Now that we’ve defined our application extension and OAuth access to our -application, we can start on receiving notifications in our application -when events happen in Onshape.</p> -<p>Onshape supports webhook notification for many different types of -events. We will register an endpoint in our application that will -receive a notification whenever something occurs in Onshape. In our -specific scenario this will be when the user updates the Onshape -properties – as we defined in <strong>Step 1 Define Properties in Onshape</strong>:</p> -<p>For our purposes we will be registering to receive web hook -notifications for the onshape.model.lifecycle.metadata event. When -registering for an event in Onshape there are only two pieces of -information required:</p> -<ol> -<li> -<p>The event (onshape.model.lifecycle.metadata)</p> -</li> -<li> -<p>The Enterprise ID</p> -</li> -</ol> -<p>To easily find your enterprise ID, in Onshape select the Enterprise -Settings option from the top right dropdown menu and then click on the -“Details” menu option on the left-hand menu bar.</p> -<p>You will see your Enterprise ID and a “Copy to Clipboard” button next to -it. This will enable you to directly copy this unique ID into your code.</p> -<p><img src="https://onshape-public.github.io/images/integrationguideimage50.png" -style="width:3.0006in;height:2.70759in" -alt="Graphical user interface, application Description automatically generated" /></p> -<p><span id="_Toc102977905" class="anchor"></span>Figure 34 - Finding Your -Enterprise ID</p> -<p>The following code shows how we can register a webhook in Onshape.</p> -<p><img src="https://onshape-public.github.io/images/integrationguideimage51.emf" alt="">In this example I’ve hard-coded a few of -the values for clarity, however this method could be re-written to be a -generic model for registering various webhooks. Some good examples of -registering for webhooks exist at <a href="https://github.com/onshape-public">https://github.com/onshape-public</a>.</p> -<p>As with other calls to Onshape that we’ve seen, we are passing the -accessToken in the header in order to establish a secure call to -Onshape’s resources.</p> -<p>The information coming back from the registration call will be similar -to the following:</p> -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-json" data-lang="json"><span style="display:flex;"><span>{ -</span></span><span style="display:flex;"><span> -</span></span><span style="display:flex;"><span><span style="color:#1e90ff;font-weight:bold">&#34;timestamp&#34;</span>: <span style="color:#a50">&#34;2014-12-16T23:45:10.611-0500&#34;</span>, -</span></span><span style="display:flex;"><span> -</span></span><span style="display:flex;"><span><span style="color:#1e90ff;font-weight:bold">&#34;event&#34;</span>: <span style="color:#a50">&#34;webhook.register&#34;</span>, -</span></span><span style="display:flex;"><span> -</span></span><span style="display:flex;"><span><span style="color:#1e90ff;font-weight:bold">&#34;workspaceId&#34;</span>: <span style="color:#a50">&#34;000000000000000000000000&#34;</span>, -</span></span><span style="display:flex;"><span> -</span></span><span style="display:flex;"><span><span style="color:#1e90ff;font-weight:bold">&#34;elementId&#34;</span>: <span style="color:#a50">&#34;000000000000000000000000&#34;</span>, -</span></span><span style="display:flex;"><span> -</span></span><span style="display:flex;"><span><span style="color:#1e90ff;font-weight:bold">&#34;webhookId&#34;</span>: <span style="color:#a50">&#34;544e91f7fb88ed44f5de1508&#34;</span>, -</span></span><span style="display:flex;"><span> -</span></span><span style="display:flex;"><span><span style="color:#1e90ff;font-weight:bold">&#34;messageId&#34;</span>: <span style="color:#a50">&#34;34795d2e5f5f44eeb61fb7b1&#34;</span>, -</span></span><span style="display:flex;"><span> -</span></span><span style="display:flex;"><span><span style="color:#1e90ff;font-weight:bold">&#34;data&#34;</span>: <span style="color:#a50">&#34;Some data&#34;</span>, -</span></span><span style="display:flex;"><span> -</span></span><span style="display:flex;"><span><span style="color:#1e90ff;font-weight:bold">&#34;documentId&#34;</span>: <span style="color:#a50">&#34;000000000000000000000000&#34;</span>, -</span></span><span style="display:flex;"><span> -</span></span><span style="display:flex;"><span><span style="color:#1e90ff;font-weight:bold">&#34;versionId&#34;</span>: <span style="color:#a50">&#34;000000000000000000000000&#34;</span> -</span></span><span style="display:flex;"><span> -</span></span><span style="display:flex;"><span>} -</span></span></code></pre></div><p>In our example we are saving the event -(onshape.model.lifecycle.metadata) and the returned webhookId to a -database in order that we can later ping it to make sure that it is -live.</p> -<p><img src="https://onshape-public.github.io/images/integrationguideimage4.png" -style="width:0.43056in;height:0.43056in" />Following the registration of -the webhook, Onshape will attempt to make a call to the Notify URL -defined in the body of the registration request. This is the endpoint of -your application that should be called when the event is fired in -Onshape. The most common reason for registration failures is that the -endpoint you defined, does not return an HTTP 200 status code. -Therefore, even if you registered for an event and received a -registration notification and a webhookId back from Onshape, your web -hook is not in fact registered until Onshape validates the notify URL -and receives the HTTP 200 notification back from it. Unfortunately there -is no way to easily know if your web hook has been successfully -registered until you either ping it, request to list it, or try to -activate the event through Onshape.</p> -<p><img src="https://onshape-public.github.io/images/integrationguideimage4.png" -style="width:0.43056in;height:0.43056in" />Also it is important to know -that even when your webhook is registered successfully, if you change -your code later on and Onshape fails to receive an HTTP 200 status code -back from the notify URL, the web hook will be removed.</p> -<p>One of the ways we can validate that a webhook is “live” is by pinging -it using the Onshape REST API. The following code shows the -implementation of a ping to the webhook. If an HTTP status code of 200 -is returned, we know that the webhook is enabled, if not then we can -re-register the webhook as needed.</p> -<p><img src="https://onshape-public.github.io/images/integrationguideimage6.png" -style="width:0.47222in;height:0.47222in" /><img src="https://onshape-public.github.io/images/integrationguideimage52.emf" alt="">Once -we store the webhook ID in the database we can ping the webhook whenever -the application is loaded and validate that it’s still registered. If we -need to re-register the webhook (usually only occurs when changes are -made to the code in the notify URL), we can create a new webhook -registration and update the database record.</p> -<p><img src="https://onshape-public.github.io/images/integrationguideimage4.png" -style="width:0.43056in;height:0.43056in" />Note that you can create many -duplicate webhook registrations for the same event with the exact same -notify URL. Onshape doesn’t limit how many registrations are created for -a single webhook. In the event that this happens, the notify URL will be -called as many times as there are webhooks registered for that event. -You can validate the registered webhooks by calling the -<a href="https://cad.onshape.com/glassworks/explorer/#/Webhook">Webhook API</a>.</p> -<p><img src="https://onshape-public.github.io/images/integrationguideimage6.png" -style="width:0.47222in;height:0.47222in" />Use -<a href="https://cad.onshape.com/glassworks">https://cad.onshape.com/glassworks</a> to call APIs and validate the -requirements for each REST API call. This interface lists all the -available Onshape REST APIs and provides examples of the values returned -from each call.</p> -<h3 id="receiving-webhook-notifications">Receiving Webhook Notifications</h3> -<p>Once your webhook is registered and confirmed to be working you should -be getting a notification from the webhook to your notify URL. The -notification should be similar to the following:</p> -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-json" data-lang="json"><span style="display:flex;"><span>{ -</span></span><span style="display:flex;"><span> -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;timestamp&#34;</span>: <span style="color:#a50">&#34;2014-12-16T23:46:29.284-0500&#34;</span>, -</span></span><span style="display:flex;"><span> -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;event&#34;</span>: <span style="color:#a50">&#34;onshape.document.lifecycle.metadata&#34;</span>, -</span></span><span style="display:flex;"><span> -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;workspaceId&#34;</span>: <span style="color:#a50">&#34;000000000000000000000000&#34;</span>, -</span></span><span style="display:flex;"><span> -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;elementId&#34;</span>: <span style="color:#a50">&#34;000000000000000000000000&#34;</span>, -</span></span><span style="display:flex;"><span> -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;webhookId&#34;</span>: <span style="color:#a50">&#34;544e91f7fb88ed44f5de1508&#34;</span>, -</span></span><span style="display:flex;"><span> -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;messageId&#34;</span>: <span style="color:#a50">&#34;60f54ac1cbc04179a6642d9a&#34;</span>, -</span></span><span style="display:flex;"><span> -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;data&#34;</span>: <span style="color:#a50">&#34;Some data&#34;</span>, -</span></span><span style="display:flex;"><span> -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;documentId&#34;</span>: <span style="color:#a50">&#34;0f9c4392e5934f30b48ab645&#34;</span>, -</span></span><span style="display:flex;"><span> -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;versionId&#34;</span>: <span style="color:#a50">&#34;000000000000000000000000&#34;</span>, -</span></span><span style="display:flex;"><span> -</span></span><span style="display:flex;"><span> <span style="color:#1e90ff;font-weight:bold">&#34;documentState&#34;</span>: <span style="color:#a50">&#34;IN PROGRESS&#34;</span> -</span></span><span style="display:flex;"><span> -</span></span><span style="display:flex;"><span>} -</span></span></code></pre></div><p>In your case the workspaceId, elementID, documentID, and PartId should -be populated with the values from the Onshape document that was open -when the properties were updated.</p> -<p><img src="https://onshape-public.github.io/images/integrationguideimage4.png" -style="width:0.43056in;height:0.43056in" />It is important to note that -there is currently no OAuth validation on the webhook response, -therefore the endpoint in your application will not receive any access -token data for directly calling Onshape APIs. Therefore, if you need to -make a call to the Onshape REST APIs inside the notify URL endpoint make -a call to an endpoint in your application and include your application -OAuth credentials in the body of the request. In this way, you can make -a call to your application and load the passport and the Onshape -credentials.</p> -<p><img src="https://onshape-public.github.io/images/integrationguideimage4.png" -style="width:0.43056in;height:0.43056in" />Onshape takes security very -seriously and for this reason, unauthenticated calls only provide -minimal details such aa, in this case, id’s.</p> -<h3 id="getting-onshape-properties">Getting Onshape Properties</h3> -<p>In our specific use case, when we received the webhook notification, we -want to use the ID data provided to find the corresponding object in our -database (or create a new one) as shown in Step 2 Create Corresponding -Object: Then we make a call to the Onshape REST API: -/metadata/d/{did}/{wvm}/{wvmid}/e/{eid}/{iden}/{pid}</p> -<p>All the relevant data is provided in the response from the webhook so we -can pass this to the method which will call this API as follows:</p> -<p><img src="https://onshape-public.github.io/images/integrationguideimage53.emf" alt="">From this call I am returning the -“properties” part of the JSON – this contains all the metadata -definitions that I wish to store in my database and associate with the -corresponding object. The following is an example of one of the property -objects:</p> -<p><img src="https://onshape-public.github.io/images/integrationguideimage54.emf" alt=""></p> -<p>In fact there is probably only three key pairs that we’re interested in -here:</p> -<ol> -<li> -<p>Name – name of the property. In this case “Name”</p> -</li> -<li> -<p>Value – the value of the property. In this case “Top Plate”</p> -</li> -<li> -<p>propertyId – the ID of this property. We might need this if we want -to enable a bi-directional sync between both applications.</p> -</li> -</ol> -<p><img src="https://onshape-public.github.io/images/integrationguideimage4.png" -style="width:0.43056in;height:0.43056in" />Note that for valueType -CATEGORY the actual name, value and id will be embedded deeper in the -object inside an array. I suggest copying and pasting the output from -the API call into a JSON viewer such as <a href="http://jsonviewer.stack.hu/">http://jsonviewer.stack.hu/</a> so -that it will be easier to find where the correct values are.</p> -<p>We can now update our corresponding object with the Onshape metadata -values as described in Step 3 Get Onshape Metadata:</p> -<h3 id="updating-onshape">Updating Onshape</h3> -<p>So far we have pulled data from Onshape and populated it into our -third-party application, however what if we make updates in our -application that we want to propagate back to Onshape? This is certainly -possible through Onshape’s REST API. Usually this would be implemented -in your application on the click of a button – such as “Save”, if you -have multiple properties to update, or when a property is updated if you -want to trigger the sync for the update of a specific field.</p> -<p>Either way it is fairly straight forward to send the REST API call to -Onshape to update properties. The following snippet of code shows how -the call can be made:</p> -<p><img src="https://onshape-public.github.io/images/integrationguideimage55.emf" alt="">As we can see here, we provide the body in -the form of JSON that includes an array of items (in this case one item) -and a nested array of properties (two property objects are listed here). -Each property has a value and an ID of the property in Onshape to -update.</p> -<p>The response from this API call should be an HTTP 200 status. If this is -the case, we can update the user that the sync was successful.</p> -<p><img src="https://onshape-public.github.io/images/integrationguideimage6.png" -style="width:0.47222in;height:0.47222in" />If you know that you want to -update Onshape with property values from your application, it will be -important to build a data model that can store the properties with the -unique ID provided by Onshape.</p> -<h3 id="implementing-custom-part-numbers">Implementing Custom Part Numbers</h3> -<p><img src="https://onshape-public.github.io/images/integrationguideimage56.png" -style="width:2.95556in;height:2.94924in" /></p> -<p>The final step in this -business case is to pull the part numbers form our third-party -application. The part numbers can be calculated based on metadata values -that were previously synced from Onshape or they might be numbers being -pulled from yet another system – such as an ERP or even a Google -Spreadsheet. The important thing is that when the user clicks a button -in Onshape, the correct Part Numbers get populated.</p> -<p>To first understand how the setup for pulling part numbers from a -third-party application we need to go back to the definition of our -Application Extension in the Onshape developer’s portal.</p> -<p>Here we can see that we gave the application extension a name, defined -the location as “Part Number Generator” and defined the “Action URL” – -this is the endpoint in our application where we will fetch the part -number from.</p> -<p>Once we have the application extension defined as Location = Part Number -Generator, you will be able to use this option inside Onshape Release -Management settings.</p> -<p><img src="https://onshape-public.github.io/images/integrationguideimage4.png" -style="width:0.43056in;height:0.43056in" />Note that in order to use the -Part Number Generator option you will have to define the External OAuth -option and grant Onshape access to the resources of your application. -This is because Onshape will need to access the defined endpoint in -order to pull the part number from the application</p> -<p>From within Onshape Select the “Enterprise Settings” from the top right -dropdown menu. Navigate to the “Release Management” settings and scroll -down to the “Revisions and part numbers” section of the page.</p> -<p><img src="https://onshape-public.github.io/images/integrationguideimage57.png" -style="width:4.05994in;height:3.27831in" -alt="Graphical user interface, text, application, email Description automatically generated" /></p> -<p><span id="_Toc102977907" class="anchor"></span>Figure 36 - Revisions and -Part Number Settings</p> -<p>In the Part Number Generation dropdown select the “Custom Part Number -Generator”. Note that this is the name that you defined in your -Application Extension so it might differ from what’s shown here.</p> -<p><img src="https://onshape-public.github.io/images/integrationguideimage58.png" -style="width:2.73732in;height:2.03131in" -alt="Graphical user interface, text, application Description automatically generated" /></p> -<p><span id="_Toc102977908" class="anchor"></span>Figure 37 - Selecting -Custom Part Number Generator</p> -<p><img src="https://onshape-public.github.io/images/integrationguideimage6.png" -style="width:0.47222in;height:0.47222in" />Finally scroll to the bottom -of the page and save the settings.</p> -<p>Note that you will need the Admin role in order to access the enterprise -settings.</p> -<h3 id="implementing-part-number-code">Implementing Part Number Code</h3> -<p>Onshape will send a message to the endpoint defined in your application -extension settings. The content of this message will be an array of the -following data.</p> -<p><img src="https://onshape-public.github.io/images/integrationguideimage59.emf" alt="">There might be one or more object depending -upon where the user initiated the call for part numbers from. For -instance, if the call was initiated from the Part properties window, -there will only be one object, however if initiated from the release -candidate window, multiple parts/assemblies and drawings might be -requested in the single call. Therefore, your code should be able to -handle these two situations.</p> -<p>Onshape will expect a response back from your endpoint and it should be -formatted in the following manner:</p> -<p><img src="https://onshape-public.github.io/images/integrationguideimage60.emf" alt="">Note that in fact only the id and -partNumber fields are actually required – the other fields are optional.</p> -<p>The following is an implementation of the getNextPartNumber endpoint -that was defined in the application extension “Action URL” field:</p> -<p><img src="https://onshape-public.github.io/images/integrationguideimage61.emf" alt="">This in turn calls a function that pulls -the next part number from the corresponding object in the database (this -was defined in, Step 5: Request Part Number). In this function I’m -defining the object that will be sent to Onshape with the part number. -This will be called multiple times depending how many objects were sent -from Onshape.</p> -<p><img src="https://onshape-public.github.io/images/integrationguideimage62.emf" alt="">In this case I’m sending back all the data -required by Onshape, however it would be enough to just populate the id -and the partNumber.</p> -<p>Once you load the Part Properties window or the Release candidate -window, you can now request the Next Part number. The part number will -be pulled from the third-party application and populated in the relevant -fields as shown below.</p> -<p><img src="https://onshape-public.github.io/images/integrationguideimage63.png" -style="width:4.59649in;height:3.80143in" -alt="Graphical user interface, application Description automatically generated" /></p> -<p><span id="_Toc102977909" class="anchor"></span>Figure 38 - Release -Candidate Part Number generation</p>Docs: Sync Releases and Revisionshttps://onshape-public.github.io/docs/tutorials/releases/Mon, 01 Jan 0001 00:00:00 +0000https://onshape-public.github.io/docs/tutorials/releases/ -<p>This tutorials builds off the <a href="https://onshape-public.github.io/docs/tutorials/sync">Sync Data and Metadata</a> tutorial. Please complete that one before starting on this one.</p> -<p>In this case, we’ll be looking at the ability for Onshape to sync its -release data with an external system and for that system to send -information back to Onshape with regards to released data.</p> -<p>This specific business case will look at what happens when you wish for -a PLM system to control the release of data instead of Onshape having -that control – this is in fact a common use case.</p> -<h2 id="overview">Overview</h2> -<p><img src="https://onshape-public.github.io/images/integrationguideimage64.png" -style="width:3.21077in;height:2.56522in" /></p> -<p>We have mentioned before that -Onshape has the ability to release data – it is totally integrated to -Onshape since there is no division between CAD capabilities and PDM -capabilities in Onshape – they are all part of the same solution. See -Versions and Releases for more information on how Onshape manages -releases. There is importance in releasing data through Onshape. Onshape -uses visual cues to show which parts are released in an assembly for -instance and which parts might have a newer revision. Onshape can also -add/remove watermarks to drawings and update the title block depending -on release states. Also, the BOM table can pull a parts release data and -display it. All this is dependent upon a release process being completed -in Onshape.</p> -<p>Many organizations have implemented Product Lifecycle management systems -(PLM). One of the key benefits of a PLM system is that it manages more -than just engineering data originating from the engineering department, -it deals with all the data related to the product – from concept through -retirement. Therefore, it is a system that is used by many groups and -departments throughout the organization.</p> -<p>Often, in release processes or Engineering Change processes, additional -input and approvals are required from various departments downstream -from engineering. PLM systems are very good at routing the data for -approval to users from multiple departments and groups throughout the -organization. Onshape, on the other hand, is very focused on the -engineering department and the data generated there. While it certainly -has the capabilities to bring other groups into approval processes, it -is not considered a process centric enterprise-wide system with the -capabilities of a PLM system.</p> -<p>Many companies will have well established processes that have been -modeled in their PLM system, it is much easier for us to integrate into -those processes than reinvent the wheel in Onshape.</p> -<p>This section looks at how we might have the best of both worlds, -initiate release processes in Onshape and update our Onshape visual cues -as well as have the PLM system manage the actual approvals and release.</p> -<p>This section uses concepts such as OAuth and web hooks that we have -introduced in detail in previous sections, therefore feel free to -reference those sections for more information on these topics.</p> -<h3 id="step-1-initiate-release">Step 1: Initiate Release</h3> -<p><img src="https://onshape-public.github.io/images/integrationguideimage65.png" -style="width:4.88889in;height:2.02778in" -alt="Application Description automatically generated" /></p> -<p>In this first step we are using Onshape’s out-of-the-box capabilities to -initiate a release candidate – just as we would if we were releasing -natively in Onshape.</p> -<ol> -<li> -<p>We start by initiating the release on all the data that is required. -In this step you should use a custom workflow that simply has one -approval node.</p> -</li> -<li> -<p>Define the mandatory and any other release properties in the release -candidate window. <img src="https://onshape-public.github.io/images/integrationguideimage66.png" -style="width:4.70609in;height:3.12281in" -alt="Graphical user interface, text, application, email Description automatically generated" /></p> -</li> -</ol> -<p><span id="_Toc102977911" class="anchor"></span>Figure 40 - Initiating a -release candidate</p> -<ol start="3"> -<li> -<p>Since an approver is required, we must provide a fictious -user/approver that has been defined in the system – this could be -named “Release Approver” for instance. The process will be sent to -this approver even though they are not a real person and will not be -able to approve the release. Instead, our release process will be -approved by an external source.</p> -</li> -<li> -<p>Finally, when everything is defined, submit the release. The window -will close. Since the release is pending approval, the parts -involved in the release will enter the state of “Pending” as shown -here:</p> -<p><img src="https://onshape-public.github.io/images/integrationguideimage67.png" -style="width:4.40131in;height:2.9375in" -alt="Graphical user interface, text, application Description automatically generated" /></p> -</li> -</ol> -<p><span id="_Toc102977912" class="anchor"></span>Figure 41 - Pending -Release</p> -<p>They will remain in this state until the release has been completed.</p> -<p><img src="https://onshape-public.github.io/images/integrationguideimage68.png" -style="width:2.71208in;height:1.52174in" /></p> -<p>It is important to note that -unlike traditional PDM systems where the files are locked for change -until the release is completed or rejected, Onshape does not lock the -files. As mentioned previously, Onshape views the releases as a point in -time. As far as Onshape is concerned, time moves forward, parts can -change and at a specific point in time, the parts are in a state of -pending. It is important to mention that this does in fact prevent -another release from being initiated on the parts until the previous -release has been completed.</p> -<h3 id="step-2-initiate-release-process-in-3suprdsup-party-app">Step 2: Initiate Release Process in 3<sup>rd</sup> Party App</h3> -<p><img src="https://onshape-public.github.io/images/integrationguideimage69.png" -style="width:5.34722in;height:3.34722in" -alt="Diagram Description automatically generated" /></p> -<p>Once the user initiates the release candidate and the parts transition -to the “pending” state we can register for a webhook that will notify -our third-party application that the parts have changed state.</p> -<ol> -<li> -<p>Once the parts enter the workflow, the onshape.workflow.transition -webhook will be triggered.</p> -</li> -<li> -<p>Our third-party application should be listening for this event along -with other data, we are provided with the objectId of the release -package – this is all the data associated with the parts that are to -be released. The response also contains the objectType and the -transitionName; for our use case we will only concern ourselves with -requests that have an objectType of “Release” and a transitionName -of “Submit”.</p> -</li> -<li> -<p>Using the ObjectId we make an API call to onshape; -/api/releasepackages/&lt;releasePackageId&gt;?detailed=true</p> -</li> -<li> -<p>This API call will return to us a JSON response containing all -assemblies and parts in the release package. The following -information should be extracted from the release package:</p> -<ol> -<li> -<p>For each line item (assembly or part) extract the documentId, -the elementId, elementType, versionId and PartId</p> -</li> -<li> -<p>Iterate through the top level properties and record the -propertyId for property with the name “comment” – this will be -used to update the release comments later on.</p> -</li> -</ol> -</li> -<li> -<p>Now that we have the relevant IDs we can update the state of our -corresponding objects in the third party system and record any -additional data such as the release comment field.</p> -</li> -<li> -<p>Finally, we can kick off our official release process in the -third-party application. This could be an automated process or a -manual one.</p> -</li> -</ol> -<h3 id="step-3-complete-release-process">Step 3: Complete Release Process</h3> -<p>The release process continues in the third-party application until -approvals have been received by all required actors. Meanwhile in -Onshape the parts are in the pending state. In this step we close the -loop once the release process is completed.</p> -<p><img src="https://onshape-public.github.io/images/integrationguideimage70.png" -style="width:5.375in;height:3.34722in" -alt="Graphical user interface, text, application Description automatically generated" /></p> -<ol> -<li> -<p>The release process managed by the third-party application is -completed and the data in that system is released.</p> -</li> -<li> -<p>Once this happens, we make a call to the Onshape API; -/api/releasepackages/&lt;releasePackageId&gt; the releasePackageId is -the ID we were provided with at the start of this process – While -there are different ways of implementing this, I tend to store the -ID and any other data related to the release in a custom “release -Object” in my database so I can retrieve and update the release as -required. In addition to the passing the release package ID, in the -body of the request we should pass the id of the release comment and -a value for the comment. This will update the release in Onshape -with any relevant data.</p> -</li> -<li> -<p>Onshape releases the data that was included in the release candidate -and that completes the workflow process.</p> -</li> -<li> -<p>Onshape will return a status code that indicates success or failure</p> -</li> -<li> -<p>Finally we can optionally update the corresponding object to -indicate that it is in sync with the Onshape data.</p> -</li> -</ol> -<p>In the event that the release process is rejected at anytime, we can -send the releasePackages API request to Onshape with a REJECT workflow -Action argument. This will cause Onshape to reject the workflow and the -state of the parts at the specific release point in time, will be set to -“Rejected”.</p> -<p><img src="https://onshape-public.github.io/images/integrationguideimage71.png" -style="width:4.69737in;height:3.12807in" -alt="Graphical user interface, application Description automatically generated" /></p> -<p><span id="_Toc102977914" class="anchor"></span>Figure 43 - release -candidate rejected</p> -<p>Since our timeline is moving forward this has no actual effect on the -parts other than to cancel the pending release and enable them to be -released at another future point in time.</p> -<h2 id="implementation">Implementation</h2> -<p>In this section we will take a closer look at how to implement the -release scenario in our code. The first thing we need to do is define -the correct web hook to listen for the initiation of the release – this -means that once the user clicks the submit button on the release -candidate dialog, this web hook will be triggered.</p> -<h3 id="set-up-webhook">Set Up Webhook</h3> -<p><img src="https://onshape-public.github.io/images/integrationguideimage72.emf" alt=""></p> -<p>This code is very similar to what we defined previously for the metadata -update, instead here we are defining a hook for the -onshape.workflow.transition hook. As with other code examples that -require authentication, we have included error handling in order to -refresh that access token in the event that it has expired.</p> -<p>The onshape.workflow.transition will in fact fire whenever a revision or -release package transitions through different workflow states. In his -specific case we are only interested in catching the event when the -workflow is initially submitted. This can be filtered by the information -sent to the return URL, in this case -<a href="https://myserver.com/api/getReleaseData">https://myserver.com/api/getReleaseData</a></p> -<p>In this implementation we are storing he webhook ID in the database so -that we can ping it when the application is loaded to make sure that it -is still active. Other implementations delete the webhook after it is -used and then recreate it as required. There is no specific preference -for which methodology is better – that depend s upon the requirements of -your integration.</p> -<h3 id="receive-web-hook-notifications">Receive Web Hook Notifications</h3> -<p>Once the user who is initiating the release clicks the Submit button on -the Release Candidate dialog, the webhook will be triggered and a -message will be sent to the third-party application listening for that -webhook.</p> -<p><img src="https://onshape-public.github.io/images/integrationguideimage66.png" -style="width:4.70609in;height:3.12281in" -alt="Graphical user interface, text, application, email Description automatically generated" /></p> -<p>In our example the URL that the webhook data from Onshape gets sent to -is:</p> -<p><a href="https://myserver.com/api/getReleaseData">https://myserver.com/api/getReleaseData</a></p> -<p>In our application we can define a router for that end point as follows:</p> -<p>router.route(&rsquo;/getReleaseData&rsquo;).post(mymodule.getReleaseData);</p> -<p>In this case “mymodule” is where I’ve defined all the functionality for -managing data coming from Onshape. Since the webhook data contains no -authentication information (just minimal data is sent from the webhoom -for security reasons), we can’t directly authenticate our application -against Onshape, therefore we need to pass the data received from the -webhook through a method that will then add the authentication data to -our request object. The getReleaseData method simply passes the webhook -information received by the application to another authenticated -endpoint as follows:</p> -<p><img src="https://onshape-public.github.io/images/integrationguideimage73.emf" alt=""></p> -<p>Here is the endpoint defined for processReleasePackage:</p> -<p>router.route(&rsquo;/processReleasePackage&rsquo;).post(authController.isAuthenticated, -releaseController.processReleasePackage);</p> -<p>As we can see here, we have now added in the authentication middleware - -authController.isAuthenticated - and can make secure calls to Onsahpe’s -API.</p> -<h3 id="get-release-package-data">Get Release Package Data</h3> -<p>The parameter that the web hook sent over to our application that we -need to make use of is the ID of the release package. We can now make a -call to Onshape to retrieve the complete release package with the ID.</p> -<p>We get the release package ID from the request object and make the REST -API call to get the package as follows:</p> -<p><img src="https://onshape-public.github.io/images/integrationguideimage74.emf" alt=""></p> -<p>The complete release package should be returned in “response”. We can -now parse that data to retrieve the properties we need. The most -important properties will the IDs of the parts that we are going to -release – these should already be synced with our system – if not, we -can create them from the data in the release package.</p> -<h3 id="save-release-package-data">Save Release Package Data</h3> -<p>The next step is to save the properties of the release package to a -corresponding object in our database. We need at least the ID of the -release package so we can later release it automatically from the -third-party application. In this case I’m storing other properties that -came from the release candidate such as release name and description.</p> -<p><img src="https://onshape-public.github.io/images/integrationguideimage75.emf" alt=""></p> -<p><img src="https://onshape-public.github.io/images/integrationguideimage76.png" -style="width:3.01875in;height:4.38889in" /></p> -<p>Most of this code deals with -retrieving values from the release package and storing them as a new -release object in the database. Additional values are associated with -the part in the PLM system. In a typical production scenario this code -would interface with the PLMs workflow capabilities and possibly kick -off a release or change process in that system. For our basic example we -are storing values from Onshape with our items and setting a state on -the part so that users can see that the part is pending release and take -actions required.</p> -<p>At this point in time, Onshape does not care that the part is pending a -release. The part in Onshape will remain in a pending state until it is -released by the PLM system. As noted previously, we used a user setup in -the system to specifically initiate the release, therefore no other -users will receive notifications from Onshape with regards to release -actions on this part.</p> -<h3 id="complete-the-release">Complete the Release</h3> -<p>Once the release or change workflow has completed in the PLM system and -all approvals have been received, the Part/Item will be in a released -state in the PLM system. However, we must now update Onshape with the -correct release status of the parts. It is important that Onshape data -is in sync with the corresponding data in the PLM system for reasons of -data integrity and the visual cues used within Onshape to identify a -part as released.</p> -<p>In a typical scenario Onshape will be automatically updated once the -workflow completes in the PLM system. In our use case we are simplifying -the process by clicking a button to release the item. This will update -the state of the part in our system and send a REST API call to Onshape -to release the data in the release package (be it one part, an assembly -with multiple parts, or drawings).</p> -<p><img src="https://onshape-public.github.io/images/integrationguideimage77.emf" alt=""></p> -<p>This code snippet updates the database with the released status of a -part. Since we stored data from the release package in our database we -now retrieve the “Comment” property so that we can send an updated value -to Onshape with the release.</p> -<p>let attrid = rp.props.find(ob =&gt; ob.name == &ldquo;Comment&rdquo;);</p> -<p>The important line of code here is the REST API call to Onshape:</p> -<p><strong>axios.post(&lsquo;<a href="https://cad.onshape.com/api/releasepackages/'">https://cad.onshape.com/api/releasepackages/'</a> + id + -&lsquo;?wfaction=RELEASE&rsquo;</strong></p> -<p>The id provided here is the ID of the release package that we stored -when the web hook was called at the beginning of the process. The -“wfaction” argument indicates that the workflow action in Onshape should -be to release the data associated with this release package.</p> -<p>In this example we are also updating the release comments in Onshape, -for this reason we required the property ID of the Comment field – which -we also previously stored in our release object in the database.</p> -<p><img src="https://onshape-public.github.io/images/integrationguideimage78.png" style="width:6.5in;height:4.25903in" -alt="Graphical user interface, text, application Description automatically generated" /></p> -<p><span id="_Toc102977916" class="anchor"></span>Figure 45 - Release -completed automatically in Onshape</p> -<p><img src="https://onshape-public.github.io/images/integrationguideimage79.png" style="width:6.5in;height:4.25625in" -alt="Graphical user interface, text, application, email Description automatically generated" /></p> -<p><span id="_Toc102977917" class="anchor"></span>Figure 46 - Release -comments Updated from third-party system</p>Docs: Generate Derivative Fileshttps://onshape-public.github.io/docs/tutorials/derivative/Mon, 01 Jan 0001 00:00:00 +0000https://onshape-public.github.io/docs/tutorials/derivative/ -<p>This tutorials builds off the <a href="https://onshape-public.github.io/docs/tutorials/releases">Sync Releases and Revisions</a> tutorial. Please complete that one before starting on this one.</p> -<p>It’s clear by now that Onshape doesn’t use files to store its data, -instead it is a data driven solution that is always up to date. Files -are a snapshot in time that provide a view of the design at a specific -point in time - such as at a release or version. A new file is required -for each “snapshot” and managing these files can get quite cumbersome. -However, there are situations that require that files be generated from -the Onshape data.</p> -<p>In general, we want files to be generated at defined points of time and -within the context of a business process – such as a release process. -The derived file could be a format such as a PDF of the drawing that is -generated following the successful release of the data. Also, a common -requirement is to generate STEP files or JT files that can be used in 3D -Printing or viewers embedded in PLM solutions. Regardless of the use -case Onshape has very good export capabilities for many different file -formats.</p> -<p>This business case examines how to automatically generate files derived -from the Onshape data. The process described here can be plugged into -many different use cases. In this specific example we are plugging the -translation use case into the Release Business case just after the -release is completed in the third-party application and Onshape is -updated. Since we already have all the relevant ID information for the -parts to translate from the release package data, we can directly call -the translation APIs after receiving notification that the release was -successfully executed in Onshape.</p> -<h2 id="overview">Overview</h2> -<p><img src="https://onshape-public.github.io/images/integrationguideimage80.png" -style="width:5.5in;height:4.79167in" /></p> -<ol> -<li> -<p>Once we have received an HTTP 200 status from the call to Onshape to -release the release Package, we can proceed with the translation. -The reason why we may want to wait till the release has successfully -completed could be for several reasons:</p> -<ol> -<li> -<p>We are generating a PDF of the drawing and want the “In -Progress” watermark removed, and the title block updated with -release information</p> -</li> -<li> -<p>We are generating files for 3D printing or for sending to a -vendor to manufacture and we only want to send released data</p> -</li> -</ol> -</li> -<li> -<p>We can now make an API call to Onshape. In both the following cases -we must pass the document Id, the version Id and element Id – all -values that were available in the release package. Other values are -dependent upon your specific use case and can be referenced in -<a href="https://cad.onshape.com/glassworks/explorer/#/PartStudio/createPartStudioTranslation">https://cad.onshape.com/glassworks/explorer/#/PartStudio/createPartStudioTranslation</a></p> -<ol> -<li> -<p>For Assembly translation we can POST to :/api -/assemblies/d/{did}/{wv}/{wvid}/e/{eid}/translations.</p> -</li> -<li> -<p>For Parts we can POST to: -/api/partstudios/d/{did}/{wv}/{wvid}/e/{eid}/translations</p> -</li> -</ol> -</li> -<li> -<p>Three variables of importance are returned from the API call to -translate: requestState, id (of the translation) and -resultExternalDataIds. We should store or keep this data in memory -until the translation is completed. Depending upon the requestState -there might be additional data available in the response.</p> -</li> -<li> -<p>We can now periodically ping the translation web service with the id -retrieved in the last step. Using the GET call to -/api/translation/{id} we will receive one of three responses in the -requestState:</p> -<ol> -<li> -<p>DONE</p> -</li> -<li> -<p>ACTIVE</p> -</li> -<li> -<p>FAILED</p> -</li> -</ol> -</li> -<li> -<p>Depending on the response we can either continue to periodically -ping the translation service if we received ACTIVE</p> -</li> -<li> -<p>Notify the user of a failed translation attempt if we received a -FAILED response</p> -</li> -<li> -<p>Make a call to Onshape to GET the translated file if we received a -DONE response. To retrieve the translated file make a GET request to -/api/documents/d/{documentId}/externaldata/{externalDataId}</p> -</li> -<li> -<p>The file can now be stored in your third-party system or stored to -an external drive depending upon your specific use case.</p> -</li> -</ol> -<h2 id="implementation">Implementation</h2> -<p>As use cases go, this is a very straightforward process. The only -complexity here is deciding how to receive the notification from Onshape -that the translation has completed. There are several ways of -implementing this including using a webhook to notify us when the -translation completes. In the examples here I will show both the webhook -methodology as well as pinging Onshape with a status request every -couple of seconds. The status request can be initiated from the client -through an AJAX call or, as in the example I use here, from the server.</p> -<p><img src="https://onshape-public.github.io/images/integrationguideimage81.png" -style="width:3.3395in;height:3.66667in" /> In our example I have added a -button to the interface of my third-party system that enables me to -request a translated file. In this use case I have hard coded that the -resulting file should be a STEP file – in a production ready -implementation, we would expect that one or more formats are available -and possibly selected by the user. In addition, a production ready -implementation might have automated the translation for whenever a part -is released. Other considerations for automation might include -identifying what is being released. I.e. if it’s a part then translate -to STEP, if it’s a Drawing then translate to PDF, etc. These are all -very common use cases.</p> -<h3 id="initiate-the-translation">Initiate the Translation</h3> -<p><img src="https://onshape-public.github.io/images/integrationguideimage82.emf" alt="">The code snippet shown here is fairly -straightforward. First it gets the ID of the part that was sent from the -client, it then uses that ID to retrieve the part from the database. The -part stored in our database already has all the required values to -successfully communicate with Onshape, such as the document ID, the -workspace ID and the element ID – all these values are used in the -translation request.</p> -<p>In the body of the request we can see some of the required values that -define how the part is to be translated to STEP. In this case I have -only included the minimum required key pairs for this translation.</p> -<p>The REST API call to translate an Onshape element returns an object that -includes the translationId – this is the value that will be used to ping -Onshape and request the status of the translation.</p> -<h3 id="ping-onshape-for-translation">Ping Onshape for Translation</h3> -<p>In this code snippet I have simplified things by including a function -that waits for a second and then pings Onshape again, It will continue -pinging Onshape until it receives back a status that is not “ACTIVE”. -Once the status returned is anything except “ACTIVE” it returns the -resulting object back to the client.</p> -<p>The id used here is the translationId retrieved from the result object -when the translation was initiated.</p> -<p><img src="https://onshape-public.github.io/images/integrationguideimage83.emf" alt=""></p> -<p>Once the requestState is changed, this will indicate that the -translation has completed either with a FAIL or a DONE status. Depending -on the result we can define our logic on the client appropriately.</p> -<p>The following shows the object returned to the client from the -translation REST API. Note that the requestState is now set to “DONE”,, -meaning that the translation has completed -successfully.<img src="https://onshape-public.github.io/images/integrationguideimage84.png" style="width:6.5in;height:3.17986in" -alt="A picture containing timeline Description automatically generated" /></p> -<p>With this data we can now request the file directly from Onshape. The ID -that we need to use to retrieve the file is the “resultExternalDataIds”. -Note that this is an array of values – since it makes sense that we -might be translating more than one part.</p> -<h3 id="retrieve-translated-file">Retrieve Translated File</h3> -<p>With the resultExternalDataIds we can now retrieve the translated file -from Onshape. The following code snippet does exactly this.</p> -<p><img src="https://onshape-public.github.io/images/integrationguideimage85.emf" alt=""></p> -<p>The Onshape REST API</p> -<p><a href="https://cad.onshape.com/api/d/'">https://cad.onshape.com/api/d/'</a> + did + &lsquo;/externaldata/&rsquo; + id</p> -<p>retrieves the translated file – in this case the ID is -resultExternalDataIds[0] value.</p> -<p>Once this is completed, we use the response to save the file directly to -our server where the application is hosted. Finally, I’m sending a JSON -object to the client that provides a direct link to the file that is now -hosted on our server.</p> -<p>The client can then request the translated file from our server, even -though this is a function of the server and not related to Onshape, I -have included a code snippet here that will send the file to the client.</p> -<p><img src="https://onshape-public.github.io/images/integrationguideimage86.emf" alt=""></p> -<p>In our sample implementation Once the translation has completed -successfully I display a link to the translated file that calls the -“getfile” endpoint shown above.</p> -<p><img src="https://onshape-public.github.io/images/integrationguideimage87.png" style="width:6.5in;height:2.32917in" -alt="Graphical user interface, text, application, chat or text message Description automatically generated" /></p> -<p>Clicking the link will cause the file to be downloaded as shown here.</p> -<h3 id="define-translation-webhooks">Define Translation Webhooks</h3> -<p>As we mentioned at the beginning of this section there is more than one -way to receive notification back from Onshape that the translation has -completed. We can also define a webhook that will notify us once the -translation completes. The drawback with this methodology is that the -webhook must be created for each translation and then deleted.</p> -<p>A complete example of this can be found at: -<a href="https://github.com/onshape-public/app-gltf-viewer/blob/main/services/webhook-service.js">https://github.com/onshape-public/app-gltf-viewer/blob/main/services/webhook-service.js</a></p> -<p>The following function is used in this application to define the -webhook:</p> -<p><img src="https://onshape-public.github.io/images/integrationguideimage88.emf" alt=""></p> -<p>The following line would call this function once the user requests to -initiate a translation.</p> -<p>WebhookService.registerWebhook(req.user.accessToken, -req.session.passport.user.id, did)</p> -<p>Finally the endpoint registered with the webhook could be defined as -follows:</p> -<p><img src="https://onshape-public.github.io/images/integrationguideimage89.emf" alt=""></p> -<p>In this case once the translation is completed, this endpoint receives a -notification. If the event is equal to</p> -<p>onshape.model.translation.complete</p> -<p>We can assume that the translation has completed and we can unregister -the webhook and retrieve the translated file.</p> -<p>The complete sample including it setup and deployment can be found at: -<a href="https://github.com/onshape-public/app-gltf-viewer">https://github.com/onshape-public/app-gltf-viewer</a></p>Docs: Create an Extensionhttps://onshape-public.github.io/docs/tutorials/createextension/Mon, 01 Jan 0001 00:00:00 +0000https://onshape-public.github.io/docs/tutorials/createextension/ -<p>In this example, you will create a custom web page (as shown in the image below) that is displayed in the -right-hand fly-out panel. This interface displays metadata pulled from -a third-party system when a part in Onshape is selected. This interface can also update metadata in Onshape through the <code>Update</code> functionality.</p> -<p>You can follow along with the steps below with this video: -<a href="https://onshape.wistia.com/medias/0ivxxngkjz?embedType=async&seo=false&videoFoam=true&videoWidth=640&wvideo=0ivxxngkjz)"><img src="https://onshape-public.github.io/images/ExtensionsVideoCard.png" style="width:5in" alt="OAuth app creation video"/></a></p> -<h3 id="define-the-extension">Define the extension</h3> -<p>This tutorials builds off the <a href="https://onshape-public.github.io/docs/tutorials/derivative">Generate Derivative Files</a> tutorial. Please complete that one before starting on this one.</p> -<ol> -<li> -<p>Navigate to the Developer portal from <a href="https://dev-portal.onshape.com">https://dev-portal.onshape.com</a>.</p> -</li> -<li> -<p>Click <strong>OAuth applications</strong> in the left menu.</p> -</li> -<li> -<p>Select your application, and the click the <strong>Extensions</strong> tab. -<img src="https://onshape-public.github.io/images/integrationguideimage91.png" style="width:6.5in;height:3.48958in" alt="Graphical user interface, application, Teams Description automatically generated" /></p> -</li> -<li> -<p>Click the <strong>Add Extension</strong> button on the top right.</p> -</li> -<li> -<p>Select <code>Element Right Panel</code>. -<img src="https://onshape-public.github.io/images/integrationguideimage92.png" style="width:5.05785in;height:5.66469in" alt="Graphical user interface, application Description automatically generated" /></p> -</li> -<li> -<p>Next, define the context. The context defines what parameters -can be sent from Onshape to the application. Some basic -parameters are automatically sent with any context, additional information can be passed to our -application, depending on the context selected. Click the <code>Selected part</code> option. This sends the <code>partId</code> and <code>partNumber</code> to the application, along with the <code>documentId</code>, <code>elementId</code>, and the <code>workspaceOrVersionId</code>.</p> -</li> -<li> -<p>In the <code>Action URL</code> field, fill in the URL of the page to load in the right element panel. The parameters can be added as arguments (variable that get replaced with real values when the page is loaded from Onshape).</p> -<pre tabindex="0"><code>https://ourserver.com/bom?documentId=${documentid}&amp;elementId=${elementid}&amp;partId={$partId}&amp;partNumber={$partNumber} -</code></pre></li> -<li> -<p>Finally, select an icon for the extension. This will appear on the tab that opens the right element panel.</p> -</li> -</ol> -<p>You have now defined the extension, and it will appear in the Onshape -interface.</p> -<h3 id="call-a-page-in-the-extension">Call a page in the extension</h3> -<p>The following code snippet shows how to use your previous definition to -pull data from the third-party application and send it to the web page:</p> -<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-js" data-lang="js"><span style="display:flex;"><span><span style="color:#aaa;font-style:italic">//https://myserver.com/bom?documentId=${documentId}&amp;elementId=${elementId}&amp; -</span></span></span><span style="display:flex;"><span><span style="color:#aaa;font-style:italic">//partId=${partId}&amp;partNumber=${partNumber} -</span></span></span><span style="display:flex;"><span><span style="color:#aaa;font-style:italic"></span>app.get(<span style="color:#a50">&#39;/bom&#39;</span>, (req, res) =&gt; { -</span></span><span style="display:flex;"><span> <span style="color:#00a">if</span> (req.query.partNumber !== <span style="color:#a50">&#39;${partNumber&#39;</span>}) { -</span></span><span style="display:flex;"><span> partController.getPartsList(req.query.partNumber).then((parts) =&gt; { -</span></span><span style="display:flex;"><span> catController.getCatById(parts.Category).then((cat) =&gt; { -</span></span><span style="display:flex;"><span> res.render(<span style="color:#a50">&#39;bomview&#39;</span>, { -</span></span><span style="display:flex;"><span> parts: parts, -</span></span><span style="display:flex;"><span> cat: cat -</span></span><span style="display:flex;"><span> }) -</span></span><span style="display:flex;"><span> }) -</span></span><span style="display:flex;"><span> }) -</span></span><span style="display:flex;"><span> } <span style="color:#00a">else</span> { -</span></span><span style="display:flex;"><span> res.render(<span style="color:#a50">&#39;bomview&#39;</span>, { -</span></span><span style="display:flex;"><span> parts: { <span style="color:#a50">&#34;_id&#34;</span>: <span style="color:#099">0</span> }, -</span></span><span style="display:flex;"><span> cat: { <span style="color:#a50">&#34;_id&#34;</span>: <span style="color:#099">0</span> } -</span></span><span style="display:flex;"><span> }) -</span></span><span style="display:flex;"><span> } -</span></span><span style="display:flex;"><span>}) -</span></span></code></pre></div><p>This code checks to see if the <code>partNumber</code> parameter was actually populated (i.e., that a part number was defined for the selected part). If defined, you can use the part number to -retrieve information about the selected part from our third-party application.</p> -<p>If the part number isn’t defined, you can send an alert to the web page to notify the user that a part number must be defined to use this web page.</p> -<p>You can also use the document ID, the element ID, and the Part ID to retrieve the correct part as long as they are stored with the part in your application.</p> -<h3 id="use-the-extension">Use the extension</h3> -<ol> -<li> -<p>In Onshape, load a document. You will see your icon embedded in -the location you chose for you extension.</p> -</li> -<li> -<p>Select a part in a Part Studio, and click the icon to open the extension application: -<img src="https://onshape-public.github.io/images/integrationguideimage94.png" style="width:6.5in;height:3.94236in" alt="Graphical user interface Description automatically generated" /></p> -<p>If the part you selected has not yet been synced with your third-party application, no part number has been generated, and the system can’t find a corresponding object in our database.</p> -<p>When you select a part that has been synced, and a part number has been generated, you will see the expected result:</p> -<img src="https://onshape-public.github.io/images/integrationguideimage95.png" style="width:5.49548in;height:3.32019in" alt="Graphical user interface Description automatically generated" /> -<p>Since the context you selected for this application extension was <code>Selected Part</code>, a part must be selected to load anything in the extension. If no part is selected, you will see a notification similar to the following:</p> -<img src="https://onshape-public.github.io/images/integrationguideimage96.png" style="width:5.10442in;height:1.41408in" alt="Graphical user interface, text, application Description automatically generated" /></li> -</ol>Docs: glTF Viewerhttps://onshape-public.github.io/docs/tutorials/gltf/Mon, 01 Jan 0001 00:00:00 +0000https://onshape-public.github.io/docs/tutorials/gltf/ -<p>The GLTF Viewer is a sample application that demonstrates:</p> -<ul> -<li>How to fetch a glTF representation of an Onshape model</li> -<li>How to create an app that runs as a tab inside an Onshape document</li> -<li>OAuth2 authentication</li> -<li>Use of REST APIs</li> -<li>Use of document context</li> -</ul> -<p>The application is built using Express and is deployed on Heroku.</p> -<p>Refer to the <a href="https://github.com/onshape-public/app-gltf-viewer">gltf-viewer-app README</a> for instructions on running this sample app.</p> \ No newline at end of file +Sample Apps onhttps://onshape-public.github.io/docs/tutorials/Recent content in Sample Apps onHugoen-usMon, 01 Jan 0001 00:00:00 +0000Sync Data and Metadatahttps://onshape-public.github.io/docs/tutorials/sync/Mon, 01 Jan 0001 00:00:00 +0000https://onshape-public.github.io/docs/tutorials/sync/The first business case is probably the most common, “How do I sync data that I create in Onshape with my ERP or PLM system?”. There could be many reasons why you would want to sync data between two different systems. Primarily Onshape is a system that creates new data. This data is created by designers as they perform their daily tasks. While the designer works primarily in Onshape, the actual data that they create does not exist in a vacuum, it is used by other departments, other processes within the organization.Sync Releases and Revisionshttps://onshape-public.github.io/docs/tutorials/releases/Mon, 01 Jan 0001 00:00:00 +0000https://onshape-public.github.io/docs/tutorials/releases/This tutorials builds off the Sync Data and Metadata tutorial. Please complete that one before starting on this one. +In this case, we’ll be looking at the ability for Onshape to sync its release data with an external system and for that system to send information back to Onshape with regards to released data. +This specific business case will look at what happens when you wish for a PLM system to control the release of data instead of Onshape having that control – this is in fact a common use case.Generate Derivative Fileshttps://onshape-public.github.io/docs/tutorials/derivative/Mon, 01 Jan 0001 00:00:00 +0000https://onshape-public.github.io/docs/tutorials/derivative/This tutorials builds off the Sync Releases and Revisions tutorial. Please complete that one before starting on this one. +It’s clear by now that Onshape doesn’t use files to store its data, instead it is a data driven solution that is always up to date. Files are a snapshot in time that provide a view of the design at a specific point in time - such as at a release or version.Create an Extensionhttps://onshape-public.github.io/docs/tutorials/createextension/Mon, 01 Jan 0001 00:00:00 +0000https://onshape-public.github.io/docs/tutorials/createextension/In this example, you will create a custom web page (as shown in the image below) that is displayed in the right-hand fly-out panel. This interface displays metadata pulled from a third-party system when a part in Onshape is selected. This interface can also update metadata in Onshape through the Update functionality. +You can follow along with the steps below with this video: Define the extension This tutorials builds off the Generate Derivative Files tutorial.glTF Viewerhttps://onshape-public.github.io/docs/tutorials/gltf/Mon, 01 Jan 0001 00:00:00 +0000https://onshape-public.github.io/docs/tutorials/gltf/The GLTF Viewer is a sample application that demonstrates: +How to fetch a glTF representation of an Onshape model How to create an app that runs as a tab inside an Onshape document OAuth2 authentication Use of REST APIs Use of document context The application is built using Express and is deployed on Heroku. +Refer to the gltf-viewer-app README for instructions on running this sample app. \ No newline at end of file diff --git a/docs/tutorials/releases/index.html b/docs/tutorials/releases/index.html index 497d905..65200ed 100644 --- a/docs/tutorials/releases/index.html +++ b/docs/tutorials/releases/index.html @@ -1,12 +1,12 @@ -Sync Releases and Revisions | Sync Releases and Revisions |

    Sync Releases and Revisions

    This tutorials builds off the Sync Data and Metadata tutorial. Please complete that one before starting on this one.

    In this case, we’ll be looking at the ability for Onshape to sync its +This specific business case will look at what happens when you wish for a PLM system to control the release of data instead of Onshape having that control – this is in fact a common use case.">

    Sync Releases and Revisions

    This tutorials builds off the Sync Data and Metadata tutorial. Please complete that one before starting on this one.

    In this case, we’ll be looking at the ability for Onshape to sync its release data with an external system and for that system to send information back to Onshape with regards to released data.

    This specific business case will look at what happens when you wish for a PLM system to control the release of data instead of Onshape having @@ -183,4 +183,4 @@ for this reason we required the property ID of the Comment field – which we also previously stored in our release object in the database.

    Graphical user interface, text, application Description automatically generated

    Figure 45 - Release completed automatically in Onshape

    Graphical user interface, text, application, email Description automatically generated

    Figure 46 - Release -comments Updated from third-party system

    \ No newline at end of file +comments Updated from third-party system

    \ No newline at end of file diff --git a/docs/tutorials/sync/index.html b/docs/tutorials/sync/index.html index 4c01ee5..c451904 100644 --- a/docs/tutorials/sync/index.html +++ b/docs/tutorials/sync/index.html @@ -1,7 +1,4 @@ -Sync Data and Metadata |

    Sync Data and Metadata

    The first business case is probably the most common, “How do I sync data +Sync Data and Metadata |

    \ No newline at end of file +Candidate Part Number generation

    \ No newline at end of file diff --git a/index.html b/index.html index 5cc2441..42f727e 100644 --- a/index.html +++ b/index.html @@ -1,27 +1,10 @@ - -

    Welcome to the Onshape Developer Documentation. You can find resources here for developing applications that integrate with Onshape.

    The Onshape Developer Documentation consists of four parts:

    API Guide + +

    Welcome to the Onshape Developer Documentation. You can find resources here for developing applications that integrate with Onshape.

    The Onshape Developer Documentation consists of four parts:

    API Guide API Explorer
    Developer Portal -Sample Code

    If you are new to Onshape development, start with the API Guide.

    Guides
    \ No newline at end of file +Sample Code

    If you are new to Onshape development, start with the API Guide.

    Guides
    \ No newline at end of file diff --git a/index.xml b/index.xml index 2afba9f..437477c 100644 --- a/index.xml +++ b/index.xml @@ -1 +1,47 @@ -– Onshape Developer Documentationhttps://onshape-public.github.io/Recent content in Onshape Developer Documentation onHugo -- gohugo.ioen-usThu, 15 Aug 2024 00:00:00 +0000 \ No newline at end of file +Onshape Developer Documentation onhttps://onshape-public.github.io/Recent content in Onshape Developer Documentation onHugoen-usThu, 15 Aug 2024 00:00:00 +0000API Explorerhttps://onshape-public.github.io/docs/api-intro/explorer/Mon, 18 May 2020 20:39:14 -0400https://onshape-public.github.io/docs/api-intro/explorer/We document all available Onshape REST API endpoints in our Glassworks API Explorer: +https://cad.onshape.com/glassworks/explorer/ +This API Explorer site enables you to run API requests directly within its interface and provides the output from the API call. To try an endpoint in the API Explorer, follow these steps or follow along with the video below: +Open this public Onshape document in your browser: https://cad.onshape.com/documents/e60c4803eaf2ac8be492c18e/w/d2558da712764516cc9fec62/e/6bed6b43463f6a46a37b4a22 Open the API Explorer in a new browser tab: https://cad.Architecturehttps://onshape-public.github.io/docs/api-intro/architecture/Mon, 01 Jan 0001 00:00:00 +0000https://onshape-public.github.io/docs/api-intro/architecture/Design in Onshape typically beings with a document, which is the container that includes all content related to a specific design. All data in an Onshape document is stored in Elements. Part Studios and Assemblies are two of the most common element types in a design. Throughout the design process, creating versions can be useful for product development management while working on the “Main” workspace. See also: +The API Introduction page for information on how documents, workspaces, and elements are assembled into a URL.Quick Starthttps://onshape-public.github.io/docs/api-intro/quickstart/Mon, 18 May 2020 20:39:14 -0400https://onshape-public.github.io/docs/api-intro/quickstart/In this example, we will call an Onshape REST API endpoint to send a document name to our console. Please note that the sample shown on this page is only designed to be used as a quick start guide and does not represent a full Onshape application. +System Requirements You must be signed in to your Onshape account at https://cad.onshape.com (or https://companyName.onshape.com for Enterprise accounts). This example is coded in Python.Why Onshape?https://onshape-public.github.io/docs/api-intro/whyonshape/Mon, 01 Jan 0001 00:00:00 +0000https://onshape-public.github.io/docs/api-intro/whyonshape/Why Onshape? As long as there have been applications that manage organizational data into a database, there has been a need to share that data between different departments and therefore, usually, different systems. In a typical design/manufacturing organization, there could be at least four or five mission-critical databases that manage the data for different departments and for different stages in the product’s lifecycle. +Initially, these systems provide the capabilities required by their consumers (i.OAuthhttps://onshape-public.github.io/docs/auth/oauth/Mon, 18 May 2020 20:39:14 -0400https://onshape-public.github.io/docs/auth/oauth/See the gltf-viewer-app for a working example of OAuth2. +📘 Note +All applications submitted to the Onshape App Store (Onshape Apps) must use OAuth2 for authorization. Automation scripts (or applications not meant for the Onshape App Store) may use either OAuth2 or API Keys for authentication. OAuth2 allows applications to call Onshape APIs on behalf of the users of the application; API keys will only perform operations on behalf of the Onshape user who generated the API keys.API Keyshttps://onshape-public.github.io/docs/auth/apikeys/Mon, 01 Jan 0001 00:00:00 +0000https://onshape-public.github.io/docs/auth/apikeys/📘 Note +All applications submitted to the Onshape App Store (Onshape Apps) must follow the instructions on the OAuth2 page and use OAuth2 for authorization. Automation scripts (or applications not meant for the Onshape App Store) may use either OAuth2 or API Keys for authentication. OAuth2 allows applications to call Onshape APIs on behalf of the users of the application; API keys will only perform operations on behalf of the Onshape user who generated the API keys.Assemblieshttps://onshape-public.github.io/docs/api-adv/assemblies/Tue, 13 Aug 2024 00:00:00 +0000https://onshape-public.github.io/docs/api-adv/assemblies/This page describes the APIs Onshape provides for working with assemblies. +📘 Notes +This page provides sample code as curls. See the curl documentation for more information. All Onshape API calls must be properly authenticated by replacing the CREDENTIALS variable in the curls below. See the API Keys page for instructions and the Quick Start for an example. All applications submitted to the Onshape App Store must authenticate with OAuth2. This documentation refers to Onshape IDs in the following format: {did}, {wid}, {eid}, {pid}, {otherId}.Associativityhttps://onshape-public.github.io/docs/api-adv/associativity/Mon, 18 May 2020 20:28:26 -0400https://onshape-public.github.io/docs/api-adv/associativity/Onshape does not expose a persistent ID for any of these entities. When the model changes, the ID may change. Therefore, Onshape provides an API to enable mapping IDs from a previous microversion to the current microversion. Assuming a simple case of maintaining associativity for a face, an abstract workflow might be: +Read the tessellated model data. Select the face of interest. Store the Face ID and Document Microversion ID for the face.Billinghttps://onshape-public.github.io/docs/api-adv/billing/Mon, 18 May 2020 20:29:36 -0400https://onshape-public.github.io/docs/api-adv/billing/This document describes APIs that will allow partners to interact with the Onshape billing system. +Please address questions to &ldquo;api-support@onshape.com&rdquo; for the fastest response. +Overview All billing is done through &ldquo;plans&rdquo; that are created in the Developer Portal. A “plan” has the following attributes: +Name (also called SKU) A unique (within your company) plan name Description A user-visible description of the plan Amount The cost of the plan (may be one-time or recurring, depending on the type) Type Monthly, One-time or Consumable Onshape defines three kinds of plans:Configurationshttps://onshape-public.github.io/docs/api-adv/configs/Fri, 05 Apr 2024 00:00:00 +0000https://onshape-public.github.io/docs/api-adv/configs/This page describes the APIs Onshape provides for working with Configurations. +You can use Configurations to create variations of entire Part Studios, Assemblies, specific parts and more. You can configure feature and parameter values, part properties, custom part properties, face and part appearances, and sketch text. Each Part Studio can have only one Configuration, but it can contain multiple Configuration inputs. The Configuration inputs you define for a Part Studio become options when inserting that Part Studio into an Assembly or Drawing.Drawingshttps://onshape-public.github.io/docs/api-adv/drawings/Thu, 12 Oct 2023 00:00:00 +0000https://onshape-public.github.io/docs/api-adv/drawings/This page describes the APIs Onshape provides for creating and manipulating Onshape drawings. +📘 Notes +This page provides sample code as curls. See the curl documentation for more information. All Onshape API calls must be properly authenticated by replacing the CREDENTIALS variable in the curls below. See the API Keys page for instructions and the Quick Start for an example. All applications submitted to the Onshape App Store must authenticate with OAuth2.Featureshttps://onshape-public.github.io/docs/api-adv/featureaccess/Mon, 18 May 2020 20:37:28 -0400https://onshape-public.github.io/docs/api-adv/featureaccess/This page describes the APIs Onshape provides for creating and manipulating features and the Feature List in a Part Studio. +📘 Notes +This page provides sample code as curls. See the curl documentation for more information. All Onshape API calls must be properly authenticated by replacing the CREDENTIALS variable in the curls below. See the API Keys page for instructions and the Quick Start for an example. All applications submitted to the Onshape App Store must authenticate with OAuth2.Evaluating FeatureScripthttps://onshape-public.github.io/docs/api-adv/fs/Thu, 15 Aug 2024 00:00:00 +0000https://onshape-public.github.io/docs/api-adv/fs/This page describes some of the APIs Onshape provides for evaluating FeatureScript. +📘 Notes +This page provides sample code as curls. See the curl documentation for more information. All Onshape API calls must be properly authenticated by replacing the CREDENTIALS variable in the curls below. See the API Keys page for instructions and the Quick Start for an example. All applications submitted to the Onshape App Store must authenticate with OAuth2.Import & Exporthttps://onshape-public.github.io/docs/api-adv/translation/Wed, 27 Sep 2023 00:00:00 +0000https://onshape-public.github.io/docs/api-adv/translation/This page describes the APIs Onshape provides for importing files to Onshape and exporting files from Onshape into different formats. We refer to the process of importing and exporting files from one format to another as translating the files. +Onshape provides several APIs to support this format translation. These fall into three categories: +Synchronous exports - Export Onshape content to glTF, STL, or Parasolid format. Asynchronous exports - Export Onshape content into a variety of other formats.Metadatahttps://onshape-public.github.io/docs/api-adv/metadata/Wed, 20 Dec 2023 00:00:00 +0000https://onshape-public.github.io/docs/api-adv/metadata/This page describes the APIs Onshape provides for working with document metadata. +📘 Notes +This page provides sample code as curls. See the curl documentation for more information. All Onshape API calls must be properly authenticated by replacing the CREDENTIALS variable in the curls below. See the API Keys page for instructions and the Quick Start for an example. All applications submitted to the Onshape App Store must authenticate with OAuth2.Response Codeshttps://onshape-public.github.io/docs/api-adv/errors/Wed, 03 Apr 2024 00:00:00 +0000https://onshape-public.github.io/docs/api-adv/errors/This page details some of the response codes that may be returned by Onshape API endpoints. For each response code, we&rsquo;ve provided a brief description of the response and recommended next steps. +Success (2xx) The client call was successful. +200 - OK The client call was successful. No action needed. +204 - No Content The client call was successful, and there&rsquo;s nothing to return in the response body. The empty response body cannot be parsed.Extensionshttps://onshape-public.github.io/docs/app-dev/extensions/Mon, 01 Jan 0001 00:00:00 +0000https://onshape-public.github.io/docs/app-dev/extensions/This page provides information for some of the more common options for embedding a third-party application into the Onshape interface. Onshape provides many options for embedding commands in various menus, fly-out panels, and elements. In this example, you will embed a custom web page inside a document’s right side fly-out panel. This interface will receive information from Onshape and push information from the panel back to Onshape, providing a complete, bi-directional integration scenario.Client Messaginghttps://onshape-public.github.io/docs/app-dev/clientmessaging/Mon, 01 Jan 0001 00:00:00 +0000https://onshape-public.github.io/docs/app-dev/clientmessaging/Application extensions and the Onshape JavaScript web client need to communicate directly, calling across the iframe containing the application extension using post message. +Onshape Client Messaging examples can be split into those that are initiated from the application extension and those that are initiated from the Onshape client. +Messages from the Extension These Client Messaging examples can be initiated from the application extension: +Click/close flyouts events: Notify the Onshape client that the user has clicked in the application extension, which should cause Onshape flyouts (versions, history, uploads, etc.Structured Storagehttps://onshape-public.github.io/docs/app-dev/structuredstorage/Mon, 18 May 2020 20:40:16 -0400https://onshape-public.github.io/docs/app-dev/structuredstorage/Sub Elements Onshape provides application elements storage that is controlled by applications through the API. These elements allow a set of named sub-elements. +The application can make changes to sub-elements independently or in arbitrary groupings. Changes may be wholesale replacements, or may be deltas. When performing a delta update, the application may post a full version as well, which allows the api to return a smaller number of deltas for subsequent queries.Webhookshttps://onshape-public.github.io/docs/app-dev/webhook/Mon, 18 May 2020 20:44:05 -0400https://onshape-public.github.io/docs/app-dev/webhook/This page describes the Webhook APIs Onshape provides for working with notifications. +Notifications are delivered to an application as an HTTP POST with a JSON body, which includes information about the identity of the registration request and information specific to the event and notification message. +Webhooks are an alternative approach to polling; instead of your application continuously asking Onshape for new information, webhooks automatically send a notification from Onshape any time an event you are subscribed to occurs.Launch Checklisthttps://onshape-public.github.io/docs/app-store/checklist/Mon, 01 Jan 0001 00:00:00 +0000https://onshape-public.github.io/docs/app-store/checklist/This checklist brings together the processes you should follow to ensure your app is launched successfully. While all tasks must be completed to submit your app to the Onshape App Store, the task sequence provided here is a suggestion. +1. Understand quality expectations These are to ensure that the Onshape App Store remains a trusted resource and that quality is maintained Review the Quality Considerations page, and reach out to the Developer Relations team with any questions.Testing Guidelineshttps://onshape-public.github.io/docs/app-store/testingguidelines/Mon, 01 Jan 0001 00:00:00 +0000https://onshape-public.github.io/docs/app-store/testingguidelines/The purpose of this document is to help you get your application and App Store entry ready for QA testing. +Application Release Workflow (ARW) Each application submitted to the Onshape App Store goes through a series of stage-gates: +Starting state: Ok to deploy to limited visibility on Production (Beta testing) Ok to make Public Goal state: Application is Public To advance to the next stage, your application must pass testing, and your App Store entry must pass review.Quality Considerationshttps://onshape-public.github.io/docs/app-store/quality/Mon, 01 Jan 0001 00:00:00 +0000https://onshape-public.github.io/docs/app-store/quality/Core App Quality Onshape users expect high-quality apps. App quality directly influences the long-term success of your app in terms of installs, user rating and reviews, engagement, and user retention. +This page helps you assess the core aspects of quality in your app, through a compact set of quality criteria and associated tests. All Onshape apps should meet these criteria. +Before publishing your apps, test them against these criteria to ensure that they function well.Sync Data and Metadatahttps://onshape-public.github.io/docs/tutorials/sync/Mon, 01 Jan 0001 00:00:00 +0000https://onshape-public.github.io/docs/tutorials/sync/The first business case is probably the most common, “How do I sync data that I create in Onshape with my ERP or PLM system?”. There could be many reasons why you would want to sync data between two different systems. Primarily Onshape is a system that creates new data. This data is created by designers as they perform their daily tasks. While the designer works primarily in Onshape, the actual data that they create does not exist in a vacuum, it is used by other departments, other processes within the organization.Sync Releases and Revisionshttps://onshape-public.github.io/docs/tutorials/releases/Mon, 01 Jan 0001 00:00:00 +0000https://onshape-public.github.io/docs/tutorials/releases/This tutorials builds off the Sync Data and Metadata tutorial. Please complete that one before starting on this one. +In this case, we’ll be looking at the ability for Onshape to sync its release data with an external system and for that system to send information back to Onshape with regards to released data. +This specific business case will look at what happens when you wish for a PLM system to control the release of data instead of Onshape having that control – this is in fact a common use case.Generate Derivative Fileshttps://onshape-public.github.io/docs/tutorials/derivative/Mon, 01 Jan 0001 00:00:00 +0000https://onshape-public.github.io/docs/tutorials/derivative/This tutorials builds off the Sync Releases and Revisions tutorial. Please complete that one before starting on this one. +It’s clear by now that Onshape doesn’t use files to store its data, instead it is a data driven solution that is always up to date. Files are a snapshot in time that provide a view of the design at a specific point in time - such as at a release or version.Create an Extensionhttps://onshape-public.github.io/docs/tutorials/createextension/Mon, 01 Jan 0001 00:00:00 +0000https://onshape-public.github.io/docs/tutorials/createextension/In this example, you will create a custom web page (as shown in the image below) that is displayed in the right-hand fly-out panel. This interface displays metadata pulled from a third-party system when a part in Onshape is selected. This interface can also update metadata in Onshape through the Update functionality. +You can follow along with the steps below with this video: Define the extension This tutorials builds off the Generate Derivative Files tutorial.glTF Viewerhttps://onshape-public.github.io/docs/tutorials/gltf/Mon, 01 Jan 0001 00:00:00 +0000https://onshape-public.github.io/docs/tutorials/gltf/The GLTF Viewer is a sample application that demonstrates: +How to fetch a glTF representation of an Onshape model How to create an app that runs as a tab inside an Onshape document OAuth2 authentication Use of REST APIs Use of document context The application is built using Express and is deployed on Heroku. +Refer to the gltf-viewer-app README for instructions on running this sample app.Changeloghttps://onshape-public.github.io/docs/changelog/Mon, 01 Jan 0001 00:00:00 +0000https://onshape-public.github.io/docs/changelog/rel-1.185 - released 2024-08-12 Updated all endpoints that return a user summary (createdBy, modifiedBy) have a new boolean property isOnshapeSupport for use to separate Onshape support employee activities. Updated all bodyDetails, tessellatededged, and tessellatedfaces endpionts (parts and Part Studios) to include errorEnum vales for detecting new mate position, curve pattern and Simulation material checks. rel-1.184 - released 2024-07-19 Updated API version to V8, (https://cad.onshape.com/api/versions), A new microversion will not be created when a document restore operation results in a no-op. \ No newline at end of file diff --git a/js/click-to-copy.min.73478a7d4807698aed7e355eb23f9890ca18fea3158604c8471746d046702bad.js b/js/click-to-copy.min.73478a7d4807698aed7e355eb23f9890ca18fea3158604c8471746d046702bad.js new file mode 100644 index 0000000..0b95e45 --- /dev/null +++ b/js/click-to-copy.min.73478a7d4807698aed7e355eb23f9890ca18fea3158604c8471746d046702bad.js @@ -0,0 +1,2 @@ +let codeListings=document.querySelectorAll(".highlight > pre");for(let t=0;t{e.setAttribute(t,o[t])}),e.classList.add("fas","fa-copy","btn","btn-sm","td-click-to-copy");const i=new bootstrap.Tooltip(e);e.onclick=()=>{copyCode(s),e.setAttribute("data-bs-original-title","Copied!"),i.show()},e.onmouseout=()=>{e.setAttribute("data-bs-original-title","Copy to clipboard"),i.hide()};const n=document.createElement("div");n.classList.add("click-to-copy"),n.append(e),codeListings[t].insertBefore(n,s)}const copyCode=e=>{navigator.clipboard.writeText(e.textContent.trim()+` +`)} \ No newline at end of file diff --git a/js/main.min.69e2c1ae9320465ab10236d9ef752c6a4442c54b48b883b17c497b7c7d96a796.js b/js/main.min.69e2c1ae9320465ab10236d9ef752c6a4442c54b48b883b17c497b7c7d96a796.js new file mode 100644 index 0000000..5fea893 --- /dev/null +++ b/js/main.min.69e2c1ae9320465ab10236d9ef752c6a4442c54b48b883b17c497b7c7d96a796.js @@ -0,0 +1,5 @@ +/*! + * Bootstrap v5.3.3 (https://getbootstrap.com/) + * Copyright 2011-2024 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + */(function(e,t){typeof exports=="object"&&typeof module!="undefined"?module.exports=t():typeof define=="function"&&define.amd?define(t):(e=typeof globalThis!="undefined"?globalThis:e||self,e.bootstrap=t())})(this,function(){"use strict";const C=new Map,pt={set(e,t,n){C.has(e)||C.set(e,new Map);const s=C.get(e);if(!s.has(t)&&s.size!==0){console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(s.keys())[0]}.`);return}s.set(t,n)},get(e,t){return C.has(e)?C.get(e).get(t)||null:null},remove(e,t){if(!C.has(e))return;const n=C.get(e);n.delete(t),n.size===0&&C.delete(e)}},Jr=1e6,Xr=1e3,lt="transitionend",is=e=>(e&&window.CSS&&window.CSS.escape&&(e=e.replace(/#([^\s"#']+)/g,(e,t)=>`#${CSS.escape(t)}`)),e),Gr=e=>e==null?`${e}`:Object.prototype.toString.call(e).match(/\s([a-z]+)/i)[1].toLowerCase(),Yr=e=>{do e+=Math.floor(Math.random()*Jr);while(document.getElementById(e))return e},Pr=e=>{if(!e)return 0;let{transitionDuration:t,transitionDelay:n}=window.getComputedStyle(e);const s=Number.parseFloat(t),o=Number.parseFloat(n);return!s&&!o?0:(t=t.split(",")[0],n=n.split(",")[0],(Number.parseFloat(t)+Number.parseFloat(n))*Xr)},ns=e=>{e.dispatchEvent(new Event(lt))},g=e=>!!e&&typeof e=="object"&&(typeof e.jquery!="undefined"&&(e=e[0]),typeof e.nodeType!="undefined"),w=e=>g(e)?e.jquery?e[0]:e:typeof e=="string"&&e.length>0?document.querySelector(is(e)):null,R=e=>{if(!g(e)||e.getClientRects().length===0)return!1;const n=getComputedStyle(e).getPropertyValue("visibility")==="visible",t=e.closest("details:not([open])");if(!t)return n;if(t!==e){const n=e.closest("summary");if(n&&n.parentNode!==t)return!1;if(n===null)return!1}return n},y=e=>!e||e.nodeType!==Node.ELEMENT_NODE||!!e.classList.contains("disabled")||(typeof e.disabled!="undefined"?e.disabled:e.hasAttribute("disabled")&&e.getAttribute("disabled")!=="false"),es=e=>{if(!document.documentElement.attachShadow)return null;if(typeof e.getRootNode=="function"){const t=e.getRootNode();return t instanceof ShadowRoot?t:null}return e instanceof ShadowRoot?e:e.parentNode?es(e.parentNode):null},le=()=>{},oe=e=>{e.offsetHeight},Jn=()=>window.jQuery&&!document.body.hasAttribute("data-bs-no-jquery")?window.jQuery:null,Ue=[],Nr=e=>{document.readyState==="loading"?(Ue.length||document.addEventListener("DOMContentLoaded",()=>{for(const e of Ue)e()}),Ue.push(e)):e()},c=()=>document.documentElement.dir==="rtl",u=e=>{Nr(()=>{const t=Jn();if(t){const n=e.NAME,s=t.fn[n];t.fn[n]=e.jQueryInterface,t.fn[n].Constructor=e,t.fn[n].noConflict=()=>(t.fn[n]=s,e.jQueryInterface)}})},o=(e,t=[],n=e)=>typeof e=="function"?e(...t):n,Zn=(e,t,n=!0)=>{if(!n){o(e);return}const a=5,r=Pr(t)+a;let s=!1;const i=({target:n})=>{if(n!==t)return;s=!0,t.removeEventListener(lt,i),o(e)};t.addEventListener(lt,i),setTimeout(()=>{s||ns(t)},r)},$e=(e,t,n,s)=>{const i=e.length;let o=e.indexOf(t);return o===-1?!n&&s?e[i-1]:e[0]:(o+=n?1:-1,s&&(o=(o+i)%i),e[Math.max(0,Math.min(o,i-1))])},zr=/[^.]*(?=\..*)\.|.*/,Tr=/\..*/,Ar=/::\d+$/,De={};let qn=1;const Un={mouseenter:"mouseover",mouseleave:"mouseout"},Er=new Set(["click","dblclick","mouseup","mousedown","contextmenu","mousewheel","DOMMouseScroll","mouseover","mouseout","mousemove","selectstart","selectend","keydown","keypress","keyup","orientationchange","touchstart","touchmove","touchend","touchcancel","pointerdown","pointermove","pointerup","pointerleave","pointercancel","gesturestart","gesturechange","gestureend","focus","blur","change","reset","select","submit","focusin","focusout","load","unload","beforeunload","resize","move","DOMContentLoaded","readystatechange","error","abort","scroll"]);function Hn(e,t){return t&&`${t}::${qn++}`||e.uidEvent||qn++}function Fn(e){const t=Hn(e);return e.uidEvent=t,De[t]=De[t]||{},De[t]}function xr(t,n){return function s(o){return ht(o,{delegateTarget:t}),s.oneOff&&e.off(t,o.type,n),n.apply(t,[o])}}function Or(t,n,s){return function o(i){const a=t.querySelectorAll(n);for(let{target:r}=i;r&&r!==this;r=r.parentNode)for(const c of a){if(c!==r)continue;return ht(i,{delegateTarget:r}),o.oneOff&&e.off(t,i.type,n,s),s.apply(r,[i])}}}function Sn(e,t,n=null){return Object.values(e).find(e=>e.callable===t&&e.delegationSelector===n)}function An(e,t,n){const o=typeof t=="string",i=o?n:t||n;let s=xn(e);return Er.has(s)||(s=e),[o,i,s]}function Cn(e,t,n,s,o){if(typeof t!="string"||!e)return;let[r,i,c]=An(t,n,s);if(t in Un){const e=e=>function(t){if(!t.relatedTarget||t.relatedTarget!==t.delegateTarget&&!t.delegateTarget.contains(t.relatedTarget))return e.call(this,t)};i=e(i)}const d=Fn(e),u=d[c]||(d[c]={}),l=Sn(u,i,r?n:null);if(l){l.oneOff=l.oneOff&&o;return}const h=Hn(i,t.replace(zr,"")),a=r?Or(e,n,i):xr(e,i);a.delegationSelector=r?n:null,a.callable=i,a.oneOff=o,a.uidEvent=h,u[h]=a,e.addEventListener(c,a,r)}function dt(e,t,n,s,o){const i=Sn(t[n],s,o);if(!i)return;e.removeEventListener(n,i,Boolean(o)),delete t[n][i.uidEvent]}function wr(e,t,n,s){const o=t[n]||{};for(const[a,i]of Object.entries(o))a.includes(s)&&dt(e,t,n,i.callable,i.delegationSelector)}function xn(e){return e=e.replace(Tr,""),Un[e]||e}const e={on(e,t,n,s){Cn(e,t,n,s,!1)},one(e,t,n,s){Cn(e,t,n,s,!0)},off(e,t,n,s){if(typeof t!="string"||!e)return;const[c,a,i]=An(t,n,s),l=i!==t,o=Fn(e),r=o[i]||{},d=t.startsWith(".");if(typeof a!="undefined"){if(!Object.keys(r).length)return;dt(e,o,i,a,c?n:null);return}if(d)for(const n of Object.keys(o))wr(e,o,n,t.slice(1));for(const[s,n]of Object.entries(r)){const a=s.replace(Ar,"");(!l||t.includes(a))&&dt(e,o,i,n.callable,n.delegationSelector)}},trigger(e,t,n){if(typeof t!="string"||!e)return null;const i=Jn(),l=xn(t),d=t!==l;let s=null,a=!0,r=!0,c=!1;d&&i&&(s=i.Event(t,n),i(e).trigger(s),a=!s.isPropagationStopped(),r=!s.isImmediatePropagationStopped(),c=s.isDefaultPrevented());const o=ht(new Event(t,{bubbles:a,cancelable:!0}),n);return c&&o.preventDefault(),r&&e.dispatchEvent(o),o.defaultPrevented&&s&&s.preventDefault(),o}};function ht(e,t={}){for(const[n,s]of Object.entries(t))try{e[n]=s}catch{Object.defineProperty(e,n,{configurable:!0,get(){return s}})}return e}function On(e){if(e==="true")return!0;if(e==="false")return!1;if(e===Number(e).toString())return Number(e);if(e===""||e==="null")return null;if(typeof e!="string")return e;try{return JSON.parse(decodeURIComponent(e))}catch{return e}}function Le(e){return e.replace(/[A-Z]/g,e=>`-${e.toLowerCase()}`)}const v={setDataAttribute(e,t,n){e.setAttribute(`data-bs-${Le(t)}`,n)},removeDataAttribute(e,t){e.removeAttribute(`data-bs-${Le(t)}`)},getDataAttributes(e){if(!e)return{};const t={},n=Object.keys(e.dataset).filter(e=>e.startsWith("bs")&&!e.startsWith("bsConfig"));for(const o of n){let s=o.replace(/^bs/,"");s=s.charAt(0).toLowerCase()+s.slice(1,s.length),t[s]=On(e.dataset[o])}return t},getDataAttribute(e,t){return On(e.getAttribute(`data-bs-${Le(t)}`))}};class se{static get Default(){return{}}static get DefaultType(){return{}}static get NAME(){throw new Error('You have to implement the static method "NAME", for each component!')}_getConfig(e){return e=this._mergeConfigObj(e),e=this._configAfterMerge(e),this._typeCheckConfig(e),e}_configAfterMerge(e){return e}_mergeConfigObj(e,t){const n=g(t)?v.getDataAttribute(t,"config"):{};return{...this.constructor.Default,...typeof n=="object"?n:{},...g(t)?v.getDataAttributes(t):{},...typeof e=="object"?e:{}}}_typeCheckConfig(e,t=this.constructor.DefaultType){for(const[n,s]of Object.entries(t)){const o=e[n],i=g(o)?"element":Gr(o);if(!new RegExp(s).test(i))throw new TypeError(`${this.constructor.NAME.toUpperCase()}: Option "${n}" provided type "${i}" but expected type "${s}".`)}}}const _r="5.3.3";class h extends se{constructor(e,t){if(super(),e=w(e),!e)return;this._element=e,this._config=this._getConfig(t),pt.set(this._element,this.constructor.DATA_KEY,this)}dispose(){pt.remove(this._element,this.constructor.DATA_KEY),e.off(this._element,this.constructor.EVENT_KEY);for(const e of Object.getOwnPropertyNames(this))this[e]=null}_queueCallback(e,t,n=!0){Zn(e,t,n)}_getConfig(e){return e=this._mergeConfigObj(e,this._element),e=this._configAfterMerge(e),this._typeCheckConfig(e),e}static getInstance(e){return pt.get(w(e),this.DATA_KEY)}static getOrCreateInstance(e,t={}){return this.getInstance(e)||new this(e,typeof t=="object"?t:null)}static get VERSION(){return _r}static get DATA_KEY(){return`bs.${this.NAME}`}static get EVENT_KEY(){return`.${this.DATA_KEY}`}static eventName(e){return`${e}${this.EVENT_KEY}`}}const tt=e=>{let t=e.getAttribute("data-bs-target");if(!t||t==="#"){let n=e.getAttribute("href");if(!n||!n.includes("#")&&!n.startsWith("."))return null;n.includes("#")&&!n.startsWith("#")&&(n=`#${n.split("#")[1]}`),t=n&&n!=="#"?n.trim():null}return t?t.split(",").map(e=>is(e)).join(","):null},t={find(e,t=document.documentElement){return[].concat(...Element.prototype.querySelectorAll.call(t,e))},findOne(e,t=document.documentElement){return Element.prototype.querySelector.call(t,e)},children(e,t){return[].concat(...e.children).filter(e=>e.matches(t))},parents(e,t){const s=[];let n=e.parentNode.closest(t);for(;n;)s.push(n),n=n.parentNode.closest(t);return s},prev(e,t){let n=e.previousElementSibling;for(;n;){if(n.matches(t))return[n];n=n.previousElementSibling}return[]},next(e,t){let n=e.nextElementSibling;for(;n;){if(n.matches(t))return[n];n=n.nextElementSibling}return[]},focusableChildren(e){const t=["a","button","input","textarea","select","details","[tabindex]",'[contenteditable="true"]'].map(e=>`${e}:not([tabindex^="-"])`).join(",");return this.find(t,e).filter(e=>!y(e)&&R(e))},getSelectorFromElement(e){const n=tt(e);return n?t.findOne(n)?n:null:null},getElementFromSelector(e){const n=tt(e);return n?t.findOne(n):null},getMultipleElementsFromSelector(e){const n=tt(e);return n?t.find(n):[]}},_e=(n,s="hide")=>{const i=`click.dismiss${n.EVENT_KEY}`,o=n.NAME;e.on(document,i,`[data-bs-dismiss="${o}"]`,function(e){if(["A","AREA"].includes(this.tagName)&&e.preventDefault(),y(this))return;const i=t.getElementFromSelector(this)||this.closest(`.${o}`),a=n.getOrCreateInstance(i);a[s]()})},yr="alert",jr="bs.alert",jn=`.${jr}`,vr=`close${jn}`,cr=`closed${jn}`,ir="fade",Qa="show";class de extends h{static get NAME(){return yr}close(){const t=e.trigger(this._element,vr);if(t.defaultPrevented)return;this._element.classList.remove(Qa);const n=this._element.classList.contains(ir);this._queueCallback(()=>this._destroyElement(),this._element,n)}_destroyElement(){this._element.remove(),e.trigger(this._element,cr),this.dispose()}static jQueryInterface(e){return this.each(function(){const t=de.getOrCreateInstance(this);if(typeof e!="string")return;if(t[e]===void 0||e.startsWith("_")||e==="constructor")throw new TypeError(`No method named "${e}"`);t[e](this)})}}_e(de,"close"),u(de);const Ga="button",qa="bs.button",Wa=`.${qa}`,Ba=".data-api",Pa="active",fn='[data-bs-toggle="button"]',Ta=`click${Wa}${Ba}`;class fe extends h{static get NAME(){return Ga}toggle(){this._element.setAttribute("aria-pressed",this._element.classList.toggle(Pa))}static jQueryInterface(e){return this.each(function(){const t=fe.getOrCreateInstance(this);e==="toggle"&&t[e]()})}}e.on(document,Ta,fn,e=>{e.preventDefault();const t=e.target.closest(fn),n=fe.getOrCreateInstance(t);n.toggle()}),u(fe);const ga="swipe",P=".bs.swipe",pa=`touchstart${P}`,fa=`touchmove${P}`,ma=`touchend${P}`,ua=`pointerdown${P}`,la=`pointerup${P}`,Qi="touch",Gi="pen",Vi="pointer-event",Bi=40,Ri={endCallback:null,leftCallback:null,rightCallback:null},Ni={endCallback:"(function|null)",leftCallback:"(function|null)",rightCallback:"(function|null)"};class Re extends se{constructor(e,t){if(super(),this._element=e,!e||!Re.isSupported())return;this._config=this._getConfig(t),this._deltaX=0,this._supportPointerEvents=Boolean(window.PointerEvent),this._initEvents()}static get Default(){return Ri}static get DefaultType(){return Ni}static get NAME(){return ga}dispose(){e.off(this._element,P)}_start(e){if(!this._supportPointerEvents){this._deltaX=e.touches[0].clientX;return}this._eventIsPointerPenTouch(e)&&(this._deltaX=e.clientX)}_end(e){this._eventIsPointerPenTouch(e)&&(this._deltaX=e.clientX-this._deltaX),this._handleSwipe(),o(this._config.endCallback)}_move(e){this._deltaX=e.touches&&e.touches.length>1?0:e.touches[0].clientX-this._deltaX}_handleSwipe(){const e=Math.abs(this._deltaX);if(e<=Bi)return;const t=e/this._deltaX;if(this._deltaX=0,!t)return;o(t>0?this._config.rightCallback:this._config.leftCallback)}_initEvents(){this._supportPointerEvents?(e.on(this._element,ua,e=>this._start(e)),e.on(this._element,la,e=>this._end(e)),this._element.classList.add(Vi)):(e.on(this._element,pa,e=>this._start(e)),e.on(this._element,fa,e=>this._move(e)),e.on(this._element,ma,e=>this._end(e)))}_eventIsPointerPenTouch(e){return this._supportPointerEvents&&(e.pointerType===Gi||e.pointerType===Qi)}static isSupported(){return"ontouchstart"in document.documentElement||navigator.maxTouchPoints>0}}const Di="carousel",zi="bs.carousel",_=`.${zi}`,Kt=".data-api",Mi="ArrowLeft",Si="ArrowRight",Ei=500,ie="next",U="prev",K="left",ke="right",ji=`slide${_}`,Be=`slid${_}`,bi=`keydown${_}`,gi=`mouseenter${_}`,li=`mouseleave${_}`,ci=`dragstart${_}`,si=`load${_}${Kt}`,ei=`click${_}${Kt}`,Pt="carousel",Ce="active",Jo="slide",Zo="carousel-item-end",Qo="carousel-item-start",Xo="carousel-item-next",Go="carousel-item-prev",zt=".active",gt=".carousel-item",Ko=zt+gt,Bo=".carousel-item img",Po=".carousel-indicators",No="[data-bs-slide], [data-bs-slide-to]",Do='[data-bs-ride="carousel"]',To={[Mi]:ke,[Si]:K},Fo={interval:5e3,keyboard:!0,pause:"hover",ride:!1,touch:!0,wrap:!0},vo={interval:"(number|boolean)",keyboard:"boolean",pause:"(string|boolean)",ride:"(boolean|string)",touch:"boolean",wrap:"boolean"};class ee extends h{constructor(e,n){super(e,n),this._interval=null,this._activeElement=null,this._isSliding=!1,this.touchTimeout=null,this._swipeHelper=null,this._indicatorsElement=t.findOne(Po,this._element),this._addEventListeners(),this._config.ride===Pt&&this.cycle()}static get Default(){return Fo}static get DefaultType(){return vo}static get NAME(){return Di}next(){this._slide(ie)}nextWhenVisible(){!document.hidden&&R(this._element)&&this.next()}prev(){this._slide(U)}pause(){this._isSliding&&ns(this._element),this._clearInterval()}cycle(){this._clearInterval(),this._updateInterval(),this._interval=setInterval(()=>this.nextWhenVisible(),this._config.interval)}_maybeEnableCycle(){if(!this._config.ride)return;if(this._isSliding){e.one(this._element,Be,()=>this.cycle());return}this.cycle()}to(t){const n=this._getItems();if(t>n.length-1||t<0)return;if(this._isSliding){e.one(this._element,Be,()=>this.to(t));return}const s=this._getItemIndex(this._getActive());if(s===t)return;const o=t>s?ie:U;this._slide(o,n[t])}dispose(){this._swipeHelper&&this._swipeHelper.dispose(),super.dispose()}_configAfterMerge(e){return e.defaultInterval=e.interval,e}_addEventListeners(){this._config.keyboard&&e.on(this._element,bi,e=>this._keydown(e)),this._config.pause==="hover"&&(e.on(this._element,gi,()=>this.pause()),e.on(this._element,li,()=>this._maybeEnableCycle())),this._config.touch&&Re.isSupported()&&this._addTouchEventListeners()}_addTouchEventListeners(){for(const n of t.find(Bo,this._element))e.on(n,ci,e=>e.preventDefault());const n=()=>{if(this._config.pause!=="hover")return;this.pause(),this.touchTimeout&&clearTimeout(this.touchTimeout),this.touchTimeout=setTimeout(()=>this._maybeEnableCycle(),Ei+this._config.interval)},s={leftCallback:()=>this._slide(this._directionToOrder(K)),rightCallback:()=>this._slide(this._directionToOrder(ke)),endCallback:n};this._swipeHelper=new Re(this._element,s)}_keydown(e){if(/input|textarea/i.test(e.target.tagName))return;const t=To[e.key];t&&(e.preventDefault(),this._slide(this._directionToOrder(t)))}_getItemIndex(e){return this._getItems().indexOf(e)}_setActiveIndicatorElement(e){if(!this._indicatorsElement)return;const s=t.findOne(zt,this._indicatorsElement);s.classList.remove(Ce),s.removeAttribute("aria-current");const n=t.findOne(`[data-bs-slide-to="${e}"]`,this._indicatorsElement);n&&(n.classList.add(Ce),n.setAttribute("aria-current","true"))}_updateInterval(){const e=this._activeElement||this._getActive();if(!e)return;const t=Number.parseInt(e.getAttribute("data-bs-interval"),10);this._config.interval=t||this._config.defaultInterval}_slide(t,n=null){if(this._isSliding)return;const o=this._getActive(),a=t===ie,s=n||$e(this._getItems(),o,a,this._config.wrap);if(s===o)return;const c=this._getItemIndex(s),l=n=>e.trigger(this._element,n,{relatedTarget:s,direction:this._orderToDirection(t),from:this._getItemIndex(o),to:c}),d=l(ji);if(d.defaultPrevented)return;if(!o||!s)return;const u=Boolean(this._interval);this.pause(),this._isSliding=!0,this._setActiveIndicatorElement(c),this._activeElement=s;const i=a?Qo:Zo,r=a?Xo:Go;s.classList.add(r),oe(s),o.classList.add(i),s.classList.add(i);const h=()=>{s.classList.remove(i,r),s.classList.add(Ce),o.classList.remove(Ce,r,i),this._isSliding=!1,l(Be)};this._queueCallback(h,o,this._isAnimated()),u&&this.cycle()}_isAnimated(){return this._element.classList.contains(Jo)}_getActive(){return t.findOne(Ko,this._element)}_getItems(){return t.find(gt,this._element)}_clearInterval(){this._interval&&(clearInterval(this._interval),this._interval=null)}_directionToOrder(e){return c()?e===K?U:ie:e===K?ie:U}_orderToDirection(e){return c()?e===U?K:ke:e===U?ke:K}static jQueryInterface(e){return this.each(function(){const t=ee.getOrCreateInstance(this,e);if(typeof e=="number"){t.to(e);return}if(typeof e=="string"){if(t[e]===void 0||e.startsWith("_")||e==="constructor")throw new TypeError(`No method named "${e}"`);t[e]()}})}}e.on(document,ei,No,function(e){const s=t.getElementFromSelector(this);if(!s||!s.classList.contains(Pt))return;e.preventDefault();const n=ee.getOrCreateInstance(s),o=this.getAttribute("data-bs-slide-to");if(o){n.to(o),n._maybeEnableCycle();return}if(v.getDataAttribute(this,"slide")==="next"){n.next(),n._maybeEnableCycle();return}n.prev(),n._maybeEnableCycle()}),e.on(window,si,()=>{const e=t.find(Do);for(const t of e)ee.getOrCreateInstance(t)}),u(ee);const rs="collapse",po="bs.collapse",J=`.${po}`,co=".data-api",ao=`show${J}`,io=`shown${J}`,Js=`hide${J}`,Qs=`hidden${J}`,Gs=`click${J}${co}`,ct="show",L="collapse",pe="collapsing",Ys="collapsed",Ks=`:scope .${L} .${L}`,Us="collapse-horizontal",Ws="width",$s="height",Vs=".collapse.show, .collapse.collapsing",nt='[data-bs-toggle="collapse"]',Bs={parent:null,toggle:!0},Is={parent:"(null|element)",toggle:"boolean"};class te extends h{constructor(e,n){super(e,n),this._isTransitioning=!1,this._triggerArray=[];const s=t.find(nt);for(const e of s){const n=t.getSelectorFromElement(e),o=t.find(n).filter(e=>e===this._element);n!==null&&o.length&&this._triggerArray.push(e)}this._initializeChildren(),this._config.parent||this._addAriaAndCollapsedClass(this._triggerArray,this._isShown()),this._config.toggle&&this.toggle()}static get Default(){return Bs}static get DefaultType(){return Is}static get NAME(){return rs}toggle(){this._isShown()?this.hide():this.show()}show(){if(this._isTransitioning||this._isShown())return;let n=[];if(this._config.parent&&(n=this._getFirstLevelChildren(Vs).filter(e=>e!==this._element).map(e=>te.getOrCreateInstance(e,{toggle:!1}))),n.length&&n[0]._isTransitioning)return;const s=e.trigger(this._element,ao);if(s.defaultPrevented)return;for(const e of n)e.hide();const t=this._getDimension();this._element.classList.remove(L),this._element.classList.add(pe),this._element.style[t]=0,this._addAriaAndCollapsedClass(this._triggerArray,!0),this._isTransitioning=!0;const o=()=>{this._isTransitioning=!1,this._element.classList.remove(pe),this._element.classList.add(L,ct),this._element.style[t]="",e.trigger(this._element,io)},i=t[0].toUpperCase()+t.slice(1),a=`scroll${i}`;this._queueCallback(o,this._element,!0),this._element.style[t]=`${this._element[a]}px`}hide(){if(this._isTransitioning||!this._isShown())return;const s=e.trigger(this._element,Js);if(s.defaultPrevented)return;const n=this._getDimension();this._element.style[n]=`${this._element.getBoundingClientRect()[n]}px`,oe(this._element),this._element.classList.add(pe),this._element.classList.remove(L,ct);for(const e of this._triggerArray){const n=t.getElementFromSelector(e);n&&!this._isShown(n)&&this._addAriaAndCollapsedClass([e],!1)}this._isTransitioning=!0;const o=()=>{this._isTransitioning=!1,this._element.classList.remove(pe),this._element.classList.add(L),e.trigger(this._element,Qs)};this._element.style[n]="",this._queueCallback(o,this._element,!0)}_isShown(e=this._element){return e.classList.contains(ct)}_configAfterMerge(e){return e.toggle=Boolean(e.toggle),e.parent=w(e.parent),e}_getDimension(){return this._element.classList.contains(Us)?Ws:$s}_initializeChildren(){if(!this._config.parent)return;const e=this._getFirstLevelChildren(nt);for(const n of e){const s=t.getElementFromSelector(n);s&&this._addAriaAndCollapsedClass([n],this._isShown(s))}}_getFirstLevelChildren(e){const n=t.find(Ks,this._config.parent);return t.find(e,this._config.parent).filter(e=>!n.includes(e))}_addAriaAndCollapsedClass(e,t){if(!e.length)return;for(const n of e)n.classList.toggle(Ys,!t),n.setAttribute("aria-expanded",t)}static jQueryInterface(e){const t={};return typeof e=="string"&&/show|hide/.test(e)&&(t.toggle=!1),this.each(function(){const n=te.getOrCreateInstance(this,t);if(typeof e=="string"){if(typeof n[e]=="undefined")throw new TypeError(`No method named "${e}"`);n[e]()}})}}e.on(document,Gs,nt,function(e){(e.target.tagName==="A"||e.delegateTarget&&e.delegateTarget.tagName==="A")&&e.preventDefault();for(const e of t.getMultipleElementsFromSelector(this))te.getOrCreateInstance(e,{toggle:!1}).toggle()}),u(te);var k,A,Q,Nn,In,ae,Yn,Xn,ot,Tt,Ft,St,At,je,s="top",a="bottom",i="right",n="left",Ee="auto",Y=[s,a,i,n],T="start",q="end",Vt="clippingParents",Ve="viewport",I="popper",Ut="reference",Te=Y.reduce(function(e,t){return e.concat([t+"-"+T,t+"-"+q])},[]),Xe=[].concat(Y,[Ee]).reduce(function(e,t){return e.concat([t,t+"-"+T,t+"-"+q])},[]),Yt="beforeRead",Gt="read",Xt="afterRead",Qt="beforeMain",Zt="main",Jt="afterMain",en="beforeWrite",tn="write",nn="afterWrite",sn=[Yt,Gt,Xt,Qt,Zt,Jt,en,tn,nn];function f(e){return e?(e.nodeName||"").toLowerCase():null}function r(e){if(e==null)return window;if(e.toString()!=="[object Window]"){var t=e.ownerDocument;return t?t.defaultView||window:window}return e}function D(e){var t=r(e).Element;return e instanceof t||e instanceof Element}function l(e){var t=r(e).HTMLElement;return e instanceof t||e instanceof HTMLElement}function Me(e){if(typeof ShadowRoot=="undefined")return!1;var t=r(e).ShadowRoot;return e instanceof t||e instanceof ShadowRoot}function Hs(e){var t=e.state;Object.keys(t.elements).forEach(function(e){var o=t.styles[e]||{},s=t.attributes[e]||{},n=t.elements[e];if(!l(n)||!f(n))return;Object.assign(n.style,o),Object.keys(s).forEach(function(e){var t=s[e];t===!1?n.removeAttribute(e):n.setAttribute(e,t===!0?"":t)})})}function Ps(e){var t=e.state,n={popper:{position:t.options.strategy,left:"0",top:"0",margin:"0"},arrow:{position:"absolute"},reference:{}};return Object.assign(t.elements.popper.style,n.popper),t.styles=n,t.elements.arrow&&Object.assign(t.elements.arrow.style,n.arrow),function(){Object.keys(t.elements).forEach(function(e){var s=t.elements[e],o=t.attributes[e]||{},i=Object.keys(t.styles.hasOwnProperty(e)?t.styles[e]:n[e]),a=i.reduce(function(e,t){return e[t]="",e},{});if(!l(s)||!f(s))return;Object.assign(s.style,a),Object.keys(o).forEach(function(e){s.removeAttribute(e)})})}}const st={name:"applyStyles",enabled:!0,phase:"write",fn:Hs,effect:Ps,requires:["computeStyles"]};function p(e){return e.split("-")[0]}k=Math.max,Q=Math.min,A=Math.round;function et(){var e=navigator.userAgentData;return e!=null&&e.brands&&Array.isArray(e.brands)?e.brands.map(function(e){return e.brand+"/"+e.version}).join(" "):navigator.userAgent}function bn(){return!/^((?!chrome|android).)*safari/i.test(et())}function X(e,t,n){t===void 0&&(t=!1),n===void 0&&(n=!1),s=e.getBoundingClientRect(),o=1,i=1,t&&l(e)&&(o=e.offsetWidth>0?A(s.width)/e.offsetWidth||1:1,i=e.offsetHeight>0?A(s.height)/e.offsetHeight||1:1);var s,o,i,f=D(e)?r(e):window,a=f.visualViewport,u=!bn()&&n,c=(s.left+(u&&a?a.offsetLeft:0))/o,d=(s.top+(u&&a?a.offsetTop:0))/i,h=s.width/o,m=s.height/i;return{width:h,height:m,top:d,right:c+h,bottom:d+m,left:c,x:c,y:d}}function ut(e){var t=X(e),n=e.offsetWidth,s=e.offsetHeight;return Math.abs(t.width-n)<=1&&(n=t.width),Math.abs(t.height-s)<=1&&(s=t.height),{x:e.offsetLeft,y:e.offsetTop,width:n,height:s}}function _n(e,t){var n,s=t.getRootNode&&t.getRootNode();if(e.contains(t))return!0;if(s&&Me(s)){n=t;do{if(n&&e.isSameNode(n))return!0;n=n.parentNode||n.host}while(n)}return!1}function j(e){return r(e).getComputedStyle(e)}function Rs(e){return["table","td","th"].indexOf(f(e))>=0}function E(e){return((D(e)?e.ownerDocument:e.document)||window.document).documentElement}function ge(e){return f(e)==="html"?e:e.assignedSlot||e.parentNode||(Me(e)?e.host:null)||E(e)}function En(e){return!l(e)||j(e).position==="fixed"?null:e.offsetParent}function As(e){var t,n,o,s=/firefox/i.test(et()),i=/Trident/i.test(et());if(i&&l(e)&&(o=j(e),o.position==="fixed"))return null;for(t=ge(e),Me(t)&&(t=t.host);l(t)&&["html","body"].indexOf(f(t))<0;){if(n=j(t),n.transform!=="none"||n.perspective!=="none"||n.contain==="paint"||["transform","perspective"].indexOf(n.willChange)!==-1||s&&n.willChange==="filter"||s&&n.filter&&n.filter!=="none")return t;t=t.parentNode}return null}function ce(e){for(var n=r(e),t=En(e);t&&Rs(t)&&j(t).position==="static";)t=En(t);return t&&(f(t)==="html"||f(t)==="body"&&j(t).position==="static")?n:t||As(e)||n}function Qe(e){return["top","bottom"].indexOf(e)>=0?"x":"y"}function re(e,t,n){return k(e,Q(t,n))}function Cs(e,t,n){var s=re(e,t,n);return s>n?n:s}function Tn(){return{top:0,right:0,bottom:0,left:0}}function zn(e){return Object.assign({},Tn(),e)}function Dn(e,t){return t.reduce(function(t,n){return t[n]=e,t},{})}Nn=function(t,n){return t=typeof t=="function"?t(Object.assign({},n.rects,{placement:n.placement})):t,zn(typeof t!="number"?t:Dn(t,Y))};function Os(e){var r,c,d,u,f,g,v,b,j,y,_,O,x,C,E,t=e.state,S=e.name,A=e.options,h=t.elements.arrow,m=t.modifiersData.popperOffsets,w=p(t.placement),o=Qe(w),k=[n,i].indexOf(w)>=0,l=k?"height":"width";if(!h||!m)return;g=Nn(A.padding,t),v=ut(h),b=o==="y"?s:n,j=o==="y"?a:i,y=t.rects.reference[l]+t.rects.reference[o]-m[o]-t.rects.popper[l],_=m[o]-t.rects.reference[o],c=ce(h),f=c?o==="y"?c.clientHeight||0:c.clientWidth||0:0,O=y/2-_/2,x=g[b],C=f-v[l]-g[j],u=f/2-v[l]/2+O,d=re(x,u,C),E=o,t.modifiersData[S]=(r={},r[E]=d,r.centerOffset=d-u,r)}function ys(e){var n=e.state,o=e.options,s=o.element,t=s===void 0?"[data-popper-arrow]":s;if(t==null)return;if(typeof t=="string"&&(t=n.elements.popper.querySelector(t),!t))return;if(!_n(n.elements.popper,t))return;n.elements.arrow=t}const Pn={name:"arrow",enabled:!0,phase:"main",fn:Os,effect:ys,requires:["popperOffsets"],requiresIfExists:["preventOverflow"]};function V(e){return e.split("-")[1]}In={top:"auto",right:"auto",bottom:"auto",left:"auto"};function bs(e,t){var s=e.x,o=e.y,n=t.devicePixelRatio||1;return{x:A(s*n)/n||0,y:A(o*n)/n||0}}function Vn(e){var c,u,h,p,g,b,y,T,z,f=e.popper,N=e.popperRect,d=e.placement,A=e.variation,m=e.offsets,x=e.position,v=e.gpuAcceleration,S=e.adaptive,_=e.roundOffsets,M=e.isFixed,L=m.x,t=L===void 0?0:L,D=m.y,o=D===void 0?0:D,C=typeof _=="function"?_({x:t,y:o}):{x:t,y:o},t=C.x,o=C.y,F=m.hasOwnProperty("x"),k=m.hasOwnProperty("y"),w=n,O=s,l=window;return S&&(c=ce(f),g="clientHeight",y="clientWidth",c===r(f)&&(c=E(f),j(c).position!=="static"&&x==="absolute"&&(g="scrollHeight",y="scrollWidth")),c=c,(d===s||(d===n||d===i)&&A===q)&&(O=a,T=M&&c===l&&l.visualViewport?l.visualViewport.height:c[g],o-=T-N.height,o*=v?1:-1),(d===n||(d===s||d===a)&&A===q)&&(w=i,z=M&&c===l&&l.visualViewport?l.visualViewport.width:c[y],t-=z-N.width,t*=v?1:-1)),p=Object.assign({position:x},S&&In),b=_===!0?bs({x:t,y:o},r(f)):{x:t,y:o},t=b.x,o=b.y,v?Object.assign({},p,(h={},h[O]=k?"0":"",h[w]=F?"0":"",h.transform=(l.devicePixelRatio||1)<=1?"translate("+t+"px, "+o+"px)":"translate3d("+t+"px, "+o+"px, 0)",h)):Object.assign({},p,(u={},u[O]=k?o+"px":"",u[w]=F?t+"px":"",u.transform="",u))}function vs(e){var t=e.state,n=e.options,s=n.gpuAcceleration,c=s===void 0||s,o=n.adaptive,l=o===void 0||o,i=n.roundOffsets,a=i===void 0||i,r={placement:p(t.placement),variation:V(t.placement),popper:t.elements.popper,popperRect:t.rects.popper,gpuAcceleration:c,isFixed:t.options.strategy==="fixed"};t.modifiersData.popperOffsets!=null&&(t.styles.popper=Object.assign({},t.styles.popper,Vn(Object.assign({},r,{offsets:t.modifiersData.popperOffsets,position:t.options.strategy,adaptive:l,roundOffsets:a})))),t.modifiersData.arrow!=null&&(t.styles.arrow=Object.assign({},t.styles.arrow,Vn(Object.assign({},r,{offsets:t.modifiersData.arrow,position:"absolute",adaptive:!1,roundOffsets:a})))),t.attributes.popper=Object.assign({},t.attributes.popper,{"data-popper-placement":t.placement})}const Fe={name:"computeStyles",enabled:!0,phase:"beforeWrite",fn:vs,data:{}};ae={passive:!0};function gs(e){var n=e.state,t=e.instance,s=e.options,o=s.scroll,i=o===void 0||o,a=s.resize,c=a===void 0||a,l=r(n.elements.popper),d=[].concat(n.scrollParents.reference,n.scrollParents.popper);return i&&d.forEach(function(e){e.addEventListener("scroll",t.update,ae)}),c&&l.addEventListener("resize",t.update,ae),function(){i&&d.forEach(function(e){e.removeEventListener("scroll",t.update,ae)}),c&&l.removeEventListener("resize",t.update,ae)}}const ze={name:"eventListeners",enabled:!0,phase:"write",fn:function(){},effect:gs,data:{}};Yn={left:"right",right:"left",bottom:"top",top:"bottom"};function Ae(e){return e.replace(/left|right|bottom|top/g,function(e){return Yn[e]})}Xn={start:"end",end:"start"};function Qn(e){return e.replace(/start|end/g,function(e){return Xn[e]})}function We(e){var t=r(e),n=t.pageXOffset,s=t.pageYOffset;return{scrollLeft:n,scrollTop:s}}function Ke(e){return X(E(e)).left+We(e).scrollLeft}function hs(e,t){var s,d=r(e),o=E(e),n=d.visualViewport,i=o.clientWidth,a=o.clientHeight,c=0,l=0;return n&&(i=n.width,a=n.height,s=bn(),(s||!s&&t==="fixed")&&(c=n.offsetLeft,l=n.offsetTop)),{width:i,height:a,x:c+Ke(e),y:l}}function us(e){var s,n=E(e),o=We(e),t=(s=e.ownerDocument)==null?void 0:s.body,i=k(n.scrollWidth,n.clientWidth,t?t.scrollWidth:0,t?t.clientWidth:0),r=k(n.scrollHeight,n.clientHeight,t?t.scrollHeight:0,t?t.clientHeight:0),a=-o.scrollLeft+Ke(e),c=-o.scrollTop;return j(t||n).direction==="rtl"&&(a+=k(n.clientWidth,t?t.clientWidth:0)-i),{width:i,height:r,x:a,y:c}}function Je(e){var t=j(e),n=t.overflow,s=t.overflowX,o=t.overflowY;return/auto|scroll|overlay|hidden/.test(n+o+s)}function ss(e){return["html","body","#document"].indexOf(f(e))>=0?e.ownerDocument.body:l(e)&&Je(e)?e:ss(ge(e))}function ne(e,t){t===void 0&&(t=[]);var s,n=ss(e),o=n===((s=e.ownerDocument)==null?void 0:s.body),i=r(n),a=o?[i].concat(i.visualViewport||[],Je(n)?n:[]):n,c=t.concat(a);return o?c:c.concat(ne(ge(a)))}function rt(e){return Object.assign({},e,{left:e.x,top:e.y,right:e.x+e.width,bottom:e.y+e.height})}function Fi(e,t){var n=X(e,!1,t==="fixed");return n.top=n.top+e.clientTop,n.left=n.left+e.clientLeft,n.bottom=n.top+e.clientHeight,n.right=n.left+e.clientWidth,n.width=e.clientWidth,n.height=e.clientHeight,n.x=n.left,n.y=n.top,n}function Mt(e,t,n){return t===Ve?rt(hs(e,n)):D(t)?Fi(t,n):rt(us(E(e)))}function ls(e){var n=ne(ge(e)),s=["absolute","fixed"].indexOf(j(e).position)>=0,t=s&&l(e)?ce(e):e;return D(t)?n.filter(function(e){return D(e)&&_n(e,t)&&f(e)!=="body"}):[]}function ds(e,t,n,s){var a=t==="clippingParents"?ls(e):[].concat(t),i=[].concat(a,[n]),r=i[0],o=i.reduce(function(t,n){var o=Mt(e,n,s);return t.top=k(o.top,t.top),t.right=Q(o.right,t.right),t.bottom=Q(o.bottom,t.bottom),t.left=k(o.left,t.left),t},Mt(e,r,s));return o.width=o.right-o.left,o.height=o.bottom-o.top,o.x=o.left,o.y=o.top,o}function ts(e){var o,r,l,t=e.reference,c=e.element,d=e.placement,u=d?p(d):null,f=d?V(d):null,h=t.x+t.width/2-c.width/2,m=t.y+t.height/2-c.height/2;switch(u){case s:o={x:h,y:t.y-c.height};break;case a:o={x:h,y:t.y+t.height};break;case i:o={x:t.x+t.width,y:m};break;case n:o={x:t.x-c.width,y:m};break;default:o={x:t.x,y:t.y}}if(r=u?Qe(u):null,r!=null)switch(l=r==="y"?"height":"width",f){case T:o[r]=o[r]-(t[l]/2-c[l]/2);break;case q:o[r]=o[r]+(t[l]/2-c[l]/2);break}return o}function N(e,t){t===void 0&&(t={});var _,n=t,v=n.placement,j=v===void 0?e.placement:v,f=n.strategy,T=f===void 0?e.strategy:f,p=n.boundary,C=p===void 0?Vt:p,O=n.rootBoundary,F=O===void 0?Ve:O,x=n.elementContext,c=x===void 0?I:x,m=n.altBoundary,M=m!==void 0&&m,b=n.padding,d=b===void 0?0:b,o=zn(typeof d!="number"?d:Dn(d,Y)),S=c===I?Ut:I,w=e.rects.popper,h=e.elements[M?S:c],r=ds(D(h)?h:h.contextElement||E(e.elements.popper),C,F,T),y=X(e.elements.reference),k=ts({reference:y,element:w,strategy:"absolute",placement:j}),A=rt(Object.assign({},w,k)),l=c===I?A:y,u={top:r.top-l.top+o.top,bottom:l.bottom-r.bottom+o.bottom,left:r.left-l.left+o.left,right:l.right-r.right+o.right},g=e.modifiersData.offset;return c===I&&g&&(_=g[j],Object.keys(u).forEach(function(e){var t=[i,a].indexOf(e)>=0?1:-1,n=[s,a].indexOf(e)>=0?"y":"x";u[e]+=_[n]*t})),u}function ms(e,t){t===void 0&&(t={});var s,n=t,c=n.placement,l=n.boundary,d=n.rootBoundary,u=n.padding,h=n.flipVariations,i=n.allowedAutoPlacements,m=i===void 0?Xe:i,a=V(c),r=a?h?Te:Te.filter(function(e){return V(e)===a}):Y,o=r.filter(function(e){return m.indexOf(e)>=0});return o.length===0&&(o=r),s=o.reduce(function(t,n){return t[n]=N(e,{placement:n,boundary:l,rootBoundary:d,padding:u})[p(n)],t},{}),Object.keys(s).sort(function(e,t){return s[e]-s[t]})}function fs(e){if(p(e)===Ee)return[];var t=Ae(e);return[Qn(e),t,Qn(t)]}function ps(e){var t=e.state,o=e.options,C=e.name;if(t.modifiersData[C]._skip)return;for(var r,c,l,u,h,g,v,y,_,x,E,k,z,M=o.mainAxis,I=M===void 0||M,D=o.altAxis,P=D===void 0||D,R=o.fallbackPlacements,L=o.padding,w=o.boundary,O=o.rootBoundary,B=o.altBoundary,F=o.flipVariations,j=F===void 0||F,$=o.allowedAutoPlacements,d=t.options.placement,K=p(d),H=K===d,q=R||(H||!j?[Ae(d)]:fs(d)),f=[d].concat(q).reduce(function(e,n){return e.concat(p(n)===Ee?ms(t,{placement:n,boundary:w,rootBoundary:O,padding:L,flipVariations:j,allowedAutoPlacements:$}):n)},[]),U=t.rects.reference,W=t.rects.popper,A=new Map,S=!0,m=f[0],b=0;b=0,_=y?"width":"height",h=N(t,{placement:r,boundary:w,rootBoundary:O,altBoundary:B,padding:L}),l=y?g?i:n:g?a:s,U[_]>W[_]&&(l=Ae(l)),z=Ae(l),c=[],I&&c.push(h[v]<=0),P&&c.push(h[l]<=0,h[z]<=0),c.every(function(e){return e})){m=r,S=!1;break}A.set(r,c)}if(S)for(k=j?3:1,E=function(t){var n=f.find(function(e){var n=A.get(e);if(n)return n.slice(0,t).every(function(e){return e})});if(n)return m=n,"break"},u=k;u>0;u--)if(x=E(u),x==="break")break;t.placement!==m&&(t.modifiersData[C]._skip=!0,t.placement=m,t.reset=!0)}const Kn={name:"flip",enabled:!0,phase:"main",fn:ps,requiresIfExists:["offset"],data:{_skip:!1}};function $n(e,t,n){return n===void 0&&(n={x:0,y:0}),{top:e.top-t.height-n.y,right:e.right-t.width+n.x,bottom:e.bottom-t.height+n.y,left:e.left-t.width-n.x}}function Bn(e){return[s,i,a,n].some(function(t){return e[t]>=0})}function js(e){var t=e.state,a=e.name,r=t.rects.reference,c=t.rects.popper,l=t.modifiersData.preventOverflow,d=N(t,{elementContext:"reference"}),u=N(t,{altBoundary:!0}),n=$n(d,r),s=$n(u,c,l),o=Bn(n),i=Bn(s);t.modifiersData[a]={referenceClippingOffsets:n,popperEscapeOffsets:s,isReferenceHidden:o,hasPopperEscaped:i},t.attributes.popper=Object.assign({},t.attributes.popper,{"data-popper-reference-hidden":o,"data-popper-escaped":i})}const Rn={name:"hide",enabled:!0,phase:"main",requiresIfExists:["preventOverflow"],fn:js};function _s(e,t,o){var c=p(e),d=[n,s].indexOf(c)>=0?-1:1,l=typeof o=="function"?o(Object.assign({},t,{placement:e})):o,a=l[0],r=l[1],a=a||0,r=(r||0)*d;return[n,i].indexOf(c)>=0?{x:r,y:a}:{x:a,y:r}}function ws(e){var t=e.state,i=e.options,a=e.name,n=i.offset,r=n===void 0?[0,0]:n,s=Xe.reduce(function(e,n){return e[n]=_s(n,t.rects,r),e},{}),o=s[t.placement],c=o.x,l=o.y;t.modifiersData.popperOffsets!=null&&(t.modifiersData.popperOffsets.x+=c,t.modifiersData.popperOffsets.y+=l),t.modifiersData[a]=s}const Ln={name:"offset",enabled:!0,phase:"main",requires:["popperOffsets"],fn:ws};function xs(e){var t=e.state,n=e.name;t.modifiersData[n]=ts({reference:t.rects.reference,element:t.rects.popper,strategy:"absolute",placement:t.placement})}const He={name:"popperOffsets",enabled:!0,phase:"read",fn:xs,data:{}};function Es(e){return e==="x"?"y":"x"}function ks(e){var fe,r,h,P,H,$,W,U,Y,Z,J,ue,v,E,K,q,te,ne,x,oe,B,ae,le,G,me,c,f,w,A,M,F,z,D,R,I,X,t=e.state,l=e.options,be=e.name,pe=l.mainAxis,ge=pe===void 0||pe,se=l.altAxis,we=se!==void 0&&se,_e=l.boundary,ye=l.rootBoundary,ve=l.altBoundary,je=l.padding,de=l.tether,d=de===void 0||de,ie=l.tetherOffset,S=ie===void 0?0:ie,O=N(t,{boundary:_e,rootBoundary:ye,padding:je,altBoundary:ve}),ee=p(t.placement),C=V(t.placement),he=!C,o=Qe(ee),j=Es(o),b=t.modifiersData.popperOffsets,u=t.rects.reference,g=t.rects.popper,_=typeof S=="function"?S(Object.assign({},t.rects,{placement:t.placement})):S,m=typeof _=="number"?{mainAxis:_,altAxis:_}:Object.assign({mainAxis:0,altAxis:0},_),y=t.modifiersData.offset?t.modifiersData.offset[t.placement]:null,L={x:0,y:0};if(!b)return;ge&&(P=o==="y"?s:n,H=o==="y"?a:i,r=o==="y"?"height":"width",h=b[o],$=h+O[P],W=h-O[H],U=d?-g[r]/2:0,J=C===T?u[r]:g[r],Z=C===T?-g[r]:-u[r],Y=t.elements.arrow,ue=d&&Y?ut(Y):{width:0,height:0},E=t.modifiersData["arrow#persistent"]?t.modifiersData["arrow#persistent"].padding:Tn(),q=E[P],K=E[H],v=re(0,u[r],ue[r]),te=he?u[r]/2-U-v-q-m.mainAxis:J-v-q-m.mainAxis,ne=he?-u[r]/2+U+v+K+m.mainAxis:Z+v+K+m.mainAxis,x=t.elements.arrow&&ce(t.elements.arrow),oe=x?o==="y"?x.clientTop||0:x.clientLeft||0:0,B=(fe=y?.[o])!=null?fe:0,ae=h+te-B-oe,le=h+ne-B,I=re(d?Q($,ae):$,h,d?k(W,le):W),b[o]=I,L[o]=I-h),we&&(G=o==="x"?s:n,me=o==="x"?a:i,c=b[j],f=j==="y"?"height":"width",R=c+O[G],D=c-O[me],w=[s,n].indexOf(ee)!==-1,z=(X=y?.[j])!=null?X:0,F=w?R:c-u[f]-g[f]-z+m.altAxis,M=w?c+u[f]+g[f]-z-m.altAxis:D,A=d&&w?Cs(F,c,M):re(d?F:R,c,d?M:D),b[j]=A,L[j]=A-c),t.modifiersData[be]=L}const kn={name:"preventOverflow",enabled:!0,phase:"main",fn:ks,requiresIfExists:["offset"]};function Ss(e){return{scrollLeft:e.scrollLeft,scrollTop:e.scrollTop}}function Ms(e){return e===r(e)||!l(e)?We(e):Ss(e)}function Fs(e){var t=e.getBoundingClientRect(),n=A(t.width)/e.offsetWidth||1,s=A(t.height)/e.offsetHeight||1;return n!==1||s!==1}function Ts(e,t,n){n===void 0&&(n=!1);var r=l(t),c=l(t)&&Fs(t),i=E(t),o=X(e,c,n),a={scrollLeft:0,scrollTop:0},s={x:0,y:0};return(r||!r&&!n)&&((f(t)!=="body"||Je(i))&&(a=Ms(t)),l(t)?(s=X(t,!0),s.x+=t.clientLeft,s.y+=t.clientTop):i&&(s.x=Ke(i))),{x:o.left+a.scrollLeft-s.x,y:o.top+a.scrollTop-s.y,width:o.width,height:o.height}}function zs(e){var n=new Map,t=new Set,s=[];e.forEach(function(e){n.set(e.name,e)});function o(e){t.add(e.name);var i=[].concat(e.requires||[],e.requiresIfExists||[]);i.forEach(function(e){if(!t.has(e)){var s=n.get(e);s&&o(s)}}),s.push(e)}return e.forEach(function(e){t.has(e.name)||o(e)}),s}function Ds(e){var t=zs(e);return sn.reduce(function(e,n){return e.concat(t.filter(function(e){return e.phase===n}))},[])}function Ns(e){var t;return function(){return t||(t=new Promise(function(n){Promise.resolve().then(function(){t=void 0,n(e())})})),t}}function Ls(e){var t=e.reduce(function(e,t){var n=e[t.name];return e[t.name]=n?Object.assign({},n,t,{options:Object.assign({},n.options,t.options),data:Object.assign({},n.data,t.data)}):t,e},{});return Object.keys(t).map(function(e){return t[e]})}ot={placement:"bottom",modifiers:[],strategy:"absolute"};function un(){for(var t=arguments.length,n=new Array(t),e=0;eNumber.parseInt(e,10)):typeof e=="function"?t=>e(t,this._element):e}_getPopperConfig(){const e={placement:this._getPlacement(),modifiers:[{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"offset",options:{offset:this._getOffset()}}]};return(this._inNavbar||this._config.display==="static")&&(v.setDataAttribute(this._menu,"popper","static"),e.modifiers=[{name:"applyStyles",enabled:!1}]),{...e,...o(this._config.popperConfig,[e])}}_selectMenuItem({key:e,target:n}){const s=t.find(yo,this._menu).filter(e=>R(e));if(!s.length)return;$e(s,n,e===bt,!s.includes(n)).focus()}static jQueryInterface(e){return this.each(function(){const t=m.getOrCreateInstance(this,e);if(typeof e!="string")return;if(typeof t[e]=="undefined")throw new TypeError(`No method named "${e}"`);t[e]()})}static clearMenus(e){if(e.button===eo||e.type==="keyup"&&e.key!==jt)return;const n=t.find(go);for(const a of n){const t=m.getInstance(a);if(!t||t._config.autoClose===!1)continue;const s=e.composedPath(),o=s.includes(t._menu);if(s.includes(t._element)||t._config.autoClose==="inside"&&!o||t._config.autoClose==="outside"&&o)continue;if(t._menu.contains(e.target)&&(e.type==="keyup"&&e.key===jt||/input|select|option|textarea|form/i.test(e.target.tagName)))continue;const i={relatedTarget:t._element};e.type==="click"&&(i.clickEvent=e),t._completeHide(i)}}static dataApiKeydownHandler(e){const a=/input|textarea/i.test(e.target.tagName),s=e.key===Xs,o=[Zs,bt].includes(e.key);if(!o&&!s)return;if(a&&!s)return;e.preventDefault();const i=this.matches(z)?this:t.prev(this,z)[0]||t.next(this,z)[0]||t.findOne(z,e.delegateTarget.parentNode),n=m.getOrCreateInstance(i);if(o){e.stopPropagation(),n.show(),n._selectMenuItem(e);return}n._isShown()&&(e.stopPropagation(),n.hide(),i.focus())}}e.on(document,yt,z,m.dataApiKeydownHandler),e.on(document,yt,me,m.dataApiKeydownHandler),e.on(document,vt,m.clearMenus),e.on(document,ro,m.clearMenus),e.on(document,vt,z,function(e){e.preventDefault(),m.getOrCreateInstance(this).toggle()}),u(m);const _t="backdrop",zo="fade",wt="show",Ot=`mousedown.bs.${_t}`,Lo={className:"modal-backdrop",clickCallback:null,isAnimated:!1,isVisible:!0,rootElement:"body"},Ro={className:"string",clickCallback:"(function|null)",isAnimated:"boolean",isVisible:"boolean",rootElement:"(element|string)"};class xt extends se{constructor(e){super(),this._config=this._getConfig(e),this._isAppended=!1,this._element=null}static get Default(){return Lo}static get DefaultType(){return Ro}static get NAME(){return _t}show(e){if(!this._config.isVisible){o(e);return}this._append();const t=this._getElement();this._config.isAnimated&&oe(t),t.classList.add(wt),this._emulateAnimation(()=>{o(e)})}hide(e){if(!this._config.isVisible){o(e);return}this._getElement().classList.remove(wt),this._emulateAnimation(()=>{this.dispose(),o(e)})}dispose(){if(!this._isAppended)return;e.off(this._element,Ot),this._element.remove(),this._isAppended=!1}_getElement(){if(!this._element){const e=document.createElement("div");e.className=this._config.className,this._config.isAnimated&&e.classList.add(zo),this._element=e}return this._element}_configAfterMerge(e){return e.rootElement=w(e.rootElement),e}_append(){if(this._isAppended)return;const t=this._getElement();this._config.rootElement.append(t),e.on(t,Ot,()=>{o(this._config.clickCallback)}),this._isAppended=!0}_emulateAnimation(e){Zn(e,this._getElement(),this._config.isAnimated)}}const Ho="focustrap",Io="bs.focustrap",be=`.${Io}`,Vo=`focusin${be}`,$o=`keydown.tab${be}`,Wo="Tab",Uo="forward",kt="backward",qo={autofocus:!0,trapElement:null},Yo={autofocus:"boolean",trapElement:"element"};class Dt extends se{constructor(e){super(),this._config=this._getConfig(e),this._isActive=!1,this._lastTabNavDirection=null}static get Default(){return qo}static get DefaultType(){return Yo}static get NAME(){return Ho}activate(){if(this._isActive)return;this._config.autofocus&&this._config.trapElement.focus(),e.off(document,be),e.on(document,Vo,e=>this._handleFocusin(e)),e.on(document,$o,e=>this._handleKeydown(e)),this._isActive=!0}deactivate(){if(!this._isActive)return;this._isActive=!1,e.off(document,be)}_handleFocusin(e){const{trapElement:n}=this._config;if(e.target===document||e.target===n||n.contains(e.target))return;const s=t.focusableChildren(n);s.length===0?n.focus():this._lastTabNavDirection===kt?s[s.length-1].focus():s[0].focus()}_handleKeydown(e){if(e.key!==Wo)return;this._lastTabNavDirection=e.shiftKey?kt:Uo}}const Nt=".fixed-top, .fixed-bottom, .is-fixed, .sticky-top",Lt=".sticky-top",Oe="padding-right",Rt="margin-right";class qe{constructor(){this._element=document.body}getWidth(){const e=document.documentElement.clientWidth;return Math.abs(window.innerWidth-e)}hide(){const e=this.getWidth();this._disableOverFlow(),this._setElementAttributes(this._element,Oe,t=>t+e),this._setElementAttributes(Nt,Oe,t=>t+e),this._setElementAttributes(Lt,Rt,t=>t-e)}reset(){this._resetElementAttributes(this._element,"overflow"),this._resetElementAttributes(this._element,Oe),this._resetElementAttributes(Nt,Oe),this._resetElementAttributes(Lt,Rt)}isOverflowing(){return this.getWidth()>0}_disableOverFlow(){this._saveInitialAttribute(this._element,"overflow"),this._element.style.overflow="hidden"}_setElementAttributes(e,t,n){const s=this.getWidth(),o=e=>{if(e!==this._element&&window.innerWidth>e.clientWidth+s)return;this._saveInitialAttribute(e,t);const o=window.getComputedStyle(e).getPropertyValue(t);e.style.setProperty(t,`${n(Number.parseFloat(o))}px`)};this._applyManipulationCallback(e,o)}_saveInitialAttribute(e,t){const n=e.style.getPropertyValue(t);n&&v.setDataAttribute(e,t,n)}_resetElementAttributes(e,t){const n=e=>{const n=v.getDataAttribute(e,t);if(n===null){e.style.removeProperty(t);return}v.removeDataAttribute(e,t),e.style.setProperty(t,n)};this._applyManipulationCallback(e,n)}_applyManipulationCallback(e,n){if(g(e)){n(e);return}for(const s of t.find(e,this._element))n(s)}}const ti="modal",ni="bs.modal",d=`.${ni}`,oi=".data-api",ii="Escape",ai=`hide${d}`,ri=`hidePrevented${d}`,Ht=`hidden${d}`,It=`show${d}`,di=`shown${d}`,ui=`resize${d}`,hi=`click.dismiss${d}`,mi=`mousedown.dismiss${d}`,fi=`keydown.dismiss${d}`,pi=`click${d}${oi}`,Bt="modal-open",vi="fade",$t="show",Se="modal-static",yi=".modal.show",_i=".modal-dialog",wi=".modal-body",Oi='[data-bs-toggle="modal"]',xi={backdrop:!0,focus:!0,keyboard:!0},Ci={backdrop:"(boolean|string)",focus:"boolean",keyboard:"boolean"};class $ extends h{constructor(e,n){super(e,n),this._dialog=t.findOne(_i,this._element),this._backdrop=this._initializeBackDrop(),this._focustrap=this._initializeFocusTrap(),this._isShown=!1,this._isTransitioning=!1,this._scrollBar=new qe,this._addEventListeners()}static get Default(){return xi}static get DefaultType(){return Ci}static get NAME(){return ti}toggle(e){return this._isShown?this.hide():this.show(e)}show(t){if(this._isShown||this._isTransitioning)return;const n=e.trigger(this._element,It,{relatedTarget:t});if(n.defaultPrevented)return;this._isShown=!0,this._isTransitioning=!0,this._scrollBar.hide(),document.body.classList.add(Bt),this._adjustDialog(),this._backdrop.show(()=>this._showElement(t))}hide(){if(!this._isShown||this._isTransitioning)return;const t=e.trigger(this._element,ai);if(t.defaultPrevented)return;this._isShown=!1,this._isTransitioning=!0,this._focustrap.deactivate(),this._element.classList.remove($t),this._queueCallback(()=>this._hideModal(),this._element,this._isAnimated())}dispose(){e.off(window,d),e.off(this._dialog,d),this._backdrop.dispose(),this._focustrap.deactivate(),super.dispose()}handleUpdate(){this._adjustDialog()}_initializeBackDrop(){return new xt({isVisible:Boolean(this._config.backdrop),isAnimated:this._isAnimated()})}_initializeFocusTrap(){return new Dt({trapElement:this._element})}_showElement(n){document.body.contains(this._element)||document.body.append(this._element),this._element.style.display="block",this._element.removeAttribute("aria-hidden"),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),this._element.scrollTop=0;const s=t.findOne(wi,this._dialog);s&&(s.scrollTop=0),oe(this._element),this._element.classList.add($t);const o=()=>{this._config.focus&&this._focustrap.activate(),this._isTransitioning=!1,e.trigger(this._element,di,{relatedTarget:n})};this._queueCallback(o,this._dialog,this._isAnimated())}_addEventListeners(){e.on(this._element,fi,e=>{if(e.key!==ii)return;if(this._config.keyboard){this.hide();return}this._triggerBackdropTransition()}),e.on(window,ui,()=>{this._isShown&&!this._isTransitioning&&this._adjustDialog()}),e.on(this._element,mi,t=>{e.one(this._element,hi,e=>{if(this._element!==t.target||this._element!==e.target)return;if(this._config.backdrop==="static"){this._triggerBackdropTransition();return}this._config.backdrop&&this.hide()})})}_hideModal(){this._element.style.display="none",this._element.setAttribute("aria-hidden",!0),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._isTransitioning=!1,this._backdrop.hide(()=>{document.body.classList.remove(Bt),this._resetAdjustments(),this._scrollBar.reset(),e.trigger(this._element,Ht)})}_isAnimated(){return this._element.classList.contains(vi)}_triggerBackdropTransition(){const n=e.trigger(this._element,ri);if(n.defaultPrevented)return;const s=this._element.scrollHeight>document.documentElement.clientHeight,t=this._element.style.overflowY;if(t==="hidden"||this._element.classList.contains(Se))return;s||(this._element.style.overflowY="hidden"),this._element.classList.add(Se),this._queueCallback(()=>{this._element.classList.remove(Se),this._queueCallback(()=>{this._element.style.overflowY=t},this._dialog)},this._dialog),this._element.focus()}_adjustDialog(){const t=this._element.scrollHeight>document.documentElement.clientHeight,e=this._scrollBar.getWidth(),n=e>0;if(n&&!t){const t=c()?"paddingLeft":"paddingRight";this._element.style[t]=`${e}px`}if(!n&&t){const t=c()?"paddingRight":"paddingLeft";this._element.style[t]=`${e}px`}}_resetAdjustments(){this._element.style.paddingLeft="",this._element.style.paddingRight=""}static jQueryInterface(e,t){return this.each(function(){const n=$.getOrCreateInstance(this,e);if(typeof e!="string")return;if(typeof n[e]=="undefined")throw new TypeError(`No method named "${e}"`);n[e](t)})}}e.on(document,pi,Oi,function(n){const s=t.getElementFromSelector(this);["A","AREA"].includes(this.tagName)&&n.preventDefault(),e.one(s,It,t=>{if(t.defaultPrevented)return;e.one(s,Ht,()=>{R(this)&&this.focus()})});const o=t.findOne(yi);o&&$.getInstance(o).hide();const i=$.getOrCreateInstance(s);i.toggle(this)}),_e($),u($);const ki="offcanvas",Ai="bs.offcanvas",b=`.${Ai}`,Wt=".data-api",cs=`load${b}${Wt}`,Ti="Escape",qt="show",on="showing",an="hiding",Li="offcanvas-backdrop",rn=".offcanvas.show",Pi=`show${b}`,Hi=`shown${b}`,Ii=`hide${b}`,cn=`hidePrevented${b}`,ln=`hidden${b}`,$i=`resize${b}`,Wi=`click${b}${Wt}`,Ui=`keydown.dismiss${b}`,Ki='[data-bs-toggle="offcanvas"]',qi={backdrop:!0,keyboard:!0,scroll:!1},Yi={backdrop:"(boolean|string)",keyboard:"boolean",scroll:"boolean"};class O extends h{constructor(e,t){super(e,t),this._isShown=!1,this._backdrop=this._initializeBackDrop(),this._focustrap=this._initializeFocusTrap(),this._addEventListeners()}static get Default(){return qi}static get DefaultType(){return Yi}static get NAME(){return ki}toggle(e){return this._isShown?this.hide():this.show(e)}show(t){if(this._isShown)return;const n=e.trigger(this._element,Pi,{relatedTarget:t});if(n.defaultPrevented)return;this._isShown=!0,this._backdrop.show(),this._config.scroll||(new qe).hide(),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),this._element.classList.add(on);const s=()=>{(!this._config.scroll||this._config.backdrop)&&this._focustrap.activate(),this._element.classList.add(qt),this._element.classList.remove(on),e.trigger(this._element,Hi,{relatedTarget:t})};this._queueCallback(s,this._element,!0)}hide(){if(!this._isShown)return;const t=e.trigger(this._element,Ii);if(t.defaultPrevented)return;this._focustrap.deactivate(),this._element.blur(),this._isShown=!1,this._element.classList.add(an),this._backdrop.hide();const n=()=>{this._element.classList.remove(qt,an),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._config.scroll||(new qe).reset(),e.trigger(this._element,ln)};this._queueCallback(n,this._element,!0)}dispose(){this._backdrop.dispose(),this._focustrap.deactivate(),super.dispose()}_initializeBackDrop(){const n=()=>{if(this._config.backdrop==="static"){e.trigger(this._element,cn);return}this.hide()},t=Boolean(this._config.backdrop);return new xt({className:Li,isVisible:t,isAnimated:!0,rootElement:this._element.parentNode,clickCallback:t?n:null})}_initializeFocusTrap(){return new Dt({trapElement:this._element})}_addEventListeners(){e.on(this._element,Ui,t=>{if(t.key!==Ti)return;if(this._config.keyboard){this.hide();return}e.trigger(this._element,cn)})}static jQueryInterface(e){return this.each(function(){const t=O.getOrCreateInstance(this,e);if(typeof e!="string")return;if(t[e]===void 0||e.startsWith("_")||e==="constructor")throw new TypeError(`No method named "${e}"`);t[e](this)})}}e.on(document,Wi,Ki,function(n){const s=t.getElementFromSelector(this);if(["A","AREA"].includes(this.tagName)&&n.preventDefault(),y(this))return;e.one(s,ln,()=>{R(this)&&this.focus()});const o=t.findOne(rn);o&&o!==s&&O.getInstance(o).hide();const i=O.getOrCreateInstance(s);i.toggle(this)}),e.on(window,cs,()=>{for(const e of t.find(rn))O.getOrCreateInstance(e).show()}),e.on(window,$i,()=>{for(const e of t.find("[aria-modal][class*=show][class*=offcanvas-]"))getComputedStyle(e).position!=="fixed"&&O.getOrCreateInstance(e).hide()}),_e(O),u(O);const Xi=/^aria-[\w-]*$/i,dn={"*":["class","dir","id","lang","role",Xi],a:["target","href","title","rel"],area:[],b:[],br:[],col:[],code:[],dd:[],div:[],dl:[],dt:[],em:[],hr:[],h1:[],h2:[],h3:[],h4:[],h5:[],h6:[],i:[],img:["src","srcset","alt","title","width","height"],li:[],ol:[],p:[],pre:[],s:[],small:[],span:[],sub:[],sup:[],strong:[],u:[],ul:[]},Zi=new Set(["background","cite","href","itemtype","longdesc","poster","src","xlink:href"]),Ji=/^(?!javascript:)(?:[a-z0-9+.-]+:|[^&:/?#]*(?:[/?#]|$))/i,ea=(e,t)=>{const n=e.nodeName.toLowerCase();return t.includes(n)?!Zi.has(n)||Boolean(Ji.test(e.nodeValue)):t.filter(e=>e instanceof RegExp).some(e=>e.test(n))};function ta(e,t,n){if(!e.length)return e;if(n&&typeof n=="function")return n(e);const o=new window.DOMParser,s=o.parseFromString(e,"text/html"),i=[].concat(...s.body.querySelectorAll("*"));for(const e of i){const n=e.nodeName.toLowerCase();if(!Object.keys(t).includes(n)){e.remove();continue}const s=[].concat(...e.attributes),o=[].concat(t["*"]||[],t[n]||[]);for(const t of s)ea(t,o)||e.removeAttribute(t.nodeName)}return s.body.innerHTML}const na="TemplateFactory",sa={allowList:dn,content:{},extraClass:"",html:!1,sanitize:!0,sanitizeFn:null,template:"
    "},oa={allowList:"object",content:"object",extraClass:"(string|function)",html:"boolean",sanitize:"boolean",sanitizeFn:"(null|function)",template:"string"},ia={entry:"(string|element|function|null)",selector:"(string|element)"};class aa extends se{constructor(e){super(),this._config=this._getConfig(e)}static get Default(){return sa}static get DefaultType(){return oa}static get NAME(){return na}getContent(){return Object.values(this._config.content).map(e=>this._resolvePossibleFunction(e)).filter(Boolean)}hasContent(){return this.getContent().length>0}changeContent(e){return this._checkContent(e),this._config.content={...this._config.content,...e},this}toHtml(){const e=document.createElement("div");e.innerHTML=this._maybeSanitize(this._config.template);for(const[t,n]of Object.entries(this._config.content))this._setContent(e,n,t);const t=e.children[0],n=this._resolvePossibleFunction(this._config.extraClass);return n&&t.classList.add(...n.split(" ")),t}_typeCheckConfig(e){super._typeCheckConfig(e),this._checkContent(e.content)}_checkContent(e){for(const[t,n]of Object.entries(e))super._typeCheckConfig({selector:t,entry:n},ia)}_setContent(e,n,s){const o=t.findOne(s,e);if(!o)return;if(n=this._resolvePossibleFunction(n),!n){o.remove();return}if(g(n)){this._putElementInTemplate(w(n),o);return}if(this._config.html){o.innerHTML=this._maybeSanitize(n);return}o.textContent=n}_maybeSanitize(e){return this._config.sanitize?ta(e,this._config.allowList,this._config.sanitizeFn):e}_resolvePossibleFunction(e){return o(e,[this])}_putElementInTemplate(e,t){if(this._config.html){t.innerHTML="",t.append(e);return}t.textContent=e.textContent}}const ra="tooltip",ca=new Set(["sanitize","allowList","sanitizeFn"]),Ze="fade",da="modal",ye="show",ha=".tooltip-inner",hn=`.${da}`,mn="hide.bs.modal",Z="hover",at="focus",va="click",ba="manual",ja="hide",ya="hidden",_a="show",wa="shown",Oa="inserted",xa="click",Ca="focusin",Ea="focusout",ka="mouseenter",Aa="mouseleave",Sa={AUTO:"auto",TOP:"top",RIGHT:c()?"left":"right",BOTTOM:"bottom",LEFT:c()?"right":"left"},Ma={allowList:dn,animation:!0,boundary:"clippingParents",container:!1,customClass:"",delay:0,fallbackPlacements:["top","right","bottom","left"],html:!1,offset:[0,6],placement:"top",popperConfig:null,sanitize:!0,sanitizeFn:null,selector:!1,template:'',title:"",trigger:"hover focus"},Fa={allowList:"object",animation:"boolean",boundary:"(string|element)",container:"(string|element|boolean)",customClass:"(string|function)",delay:"(number|object)",fallbackPlacements:"array",html:"boolean",offset:"(array|string|function)",placement:"(string|function)",popperConfig:"(null|object|function)",sanitize:"boolean",sanitizeFn:"(null|function)",selector:"(string|boolean)",template:"string",title:"(string|element|function)",trigger:"string"};class H extends h{constructor(e,t){if(typeof Et=="undefined")throw new TypeError("Bootstrap's tooltips require Popper (https://popper.js.org)");super(e,t),this._isEnabled=!0,this._timeout=0,this._isHovered=null,this._activeTrigger={},this._popper=null,this._templateFactory=null,this._newContent=null,this.tip=null,this._setListeners(),this._config.selector||this._fixTitle()}static get Default(){return Ma}static get DefaultType(){return Fa}static get NAME(){return ra}enable(){this._isEnabled=!0}disable(){this._isEnabled=!1}toggleEnabled(){this._isEnabled=!this._isEnabled}toggle(){if(!this._isEnabled)return;if(this._activeTrigger.click=!this._activeTrigger.click,this._isShown()){this._leave();return}this._enter()}dispose(){clearTimeout(this._timeout),e.off(this._element.closest(hn),mn,this._hideModalHandler),this._element.getAttribute("data-bs-original-title")&&this._element.setAttribute("title",this._element.getAttribute("data-bs-original-title")),this._disposePopper(),super.dispose()}show(){if(this._element.style.display==="none")throw new Error("Please use show on visible elements");if(!this._isWithContent()||!this._isEnabled)return;const n=e.trigger(this._element,this.constructor.eventName(_a)),s=es(this._element),o=(s||this._element.ownerDocument.documentElement).contains(this._element);if(n.defaultPrevented||!o)return;this._disposePopper();const t=this._getTipElement();this._element.setAttribute("aria-describedby",t.getAttribute("id"));const{container:i}=this._config;if(this._element.ownerDocument.documentElement.contains(this.tip)||(i.append(t),e.trigger(this._element,this.constructor.eventName(Oa))),this._popper=this._createPopper(t),t.classList.add(ye),"ontouchstart"in document.documentElement)for(const t of[].concat(...document.body.children))e.on(t,"mouseover",le);const a=()=>{e.trigger(this._element,this.constructor.eventName(wa)),this._isHovered===!1&&this._leave(),this._isHovered=!1};this._queueCallback(a,this.tip,this._isAnimated())}hide(){if(!this._isShown())return;const t=e.trigger(this._element,this.constructor.eventName(ja));if(t.defaultPrevented)return;const n=this._getTipElement();if(n.classList.remove(ye),"ontouchstart"in document.documentElement)for(const t of[].concat(...document.body.children))e.off(t,"mouseover",le);this._activeTrigger[va]=!1,this._activeTrigger[at]=!1,this._activeTrigger[Z]=!1,this._isHovered=null;const s=()=>{if(this._isWithActiveTrigger())return;this._isHovered||this._disposePopper(),this._element.removeAttribute("aria-describedby"),e.trigger(this._element,this.constructor.eventName(ya))};this._queueCallback(s,this.tip,this._isAnimated())}update(){this._popper&&this._popper.update()}_isWithContent(){return Boolean(this._getTitle())}_getTipElement(){return this.tip||(this.tip=this._createTipElement(this._newContent||this._getContentForTemplate())),this.tip}_createTipElement(e){const t=this._getTemplateFactory(e).toHtml();if(!t)return null;t.classList.remove(Ze,ye),t.classList.add(`bs-${this.constructor.NAME}-auto`);const n=Yr(this.constructor.NAME).toString();return t.setAttribute("id",n),this._isAnimated()&&t.classList.add(Ze),t}setContent(e){this._newContent=e,this._isShown()&&(this._disposePopper(),this.show())}_getTemplateFactory(e){return this._templateFactory?this._templateFactory.changeContent(e):this._templateFactory=new aa({...this._config,content:e,extraClass:this._resolvePossibleFunction(this._config.customClass)}),this._templateFactory}_getContentForTemplate(){return{[ha]:this._getTitle()}}_getTitle(){return this._resolvePossibleFunction(this._config.title)||this._element.getAttribute("data-bs-original-title")}_initializeOnDelegatedTarget(e){return this.constructor.getOrCreateInstance(e.delegateTarget,this._getDelegateConfig())}_isAnimated(){return this._config.animation||this.tip&&this.tip.classList.contains(Ze)}_isShown(){return this.tip&&this.tip.classList.contains(ye)}_createPopper(e){const t=o(this._config.placement,[this,e,this._element]),n=Sa[t.toUpperCase()];return je(this._element,e,this._getPopperConfig(n))}_getOffset(){const{offset:e}=this._config;return typeof e=="string"?e.split(",").map(e=>Number.parseInt(e,10)):typeof e=="function"?t=>e(t,this._element):e}_resolvePossibleFunction(e){return o(e,[this._element])}_getPopperConfig(e){const t={placement:e,modifiers:[{name:"flip",options:{fallbackPlacements:this._config.fallbackPlacements}},{name:"offset",options:{offset:this._getOffset()}},{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"arrow",options:{element:`.${this.constructor.NAME}-arrow`}},{name:"preSetPlacement",enabled:!0,phase:"beforeMain",fn:e=>{this._getTipElement().setAttribute("data-popper-placement",e.state.placement)}}]};return{...t,...o(this._config.popperConfig,[t])}}_setListeners(){const t=this._config.trigger.split(" ");for(const n of t)if(n==="click")e.on(this._element,this.constructor.eventName(xa),this._config.selector,e=>{const t=this._initializeOnDelegatedTarget(e);t.toggle()});else if(n!==ba){const t=n===Z?this.constructor.eventName(ka):this.constructor.eventName(Ca),s=n===Z?this.constructor.eventName(Aa):this.constructor.eventName(Ea);e.on(this._element,t,this._config.selector,e=>{const t=this._initializeOnDelegatedTarget(e);t._activeTrigger[e.type==="focusin"?at:Z]=!0,t._enter()}),e.on(this._element,s,this._config.selector,e=>{const t=this._initializeOnDelegatedTarget(e);t._activeTrigger[e.type==="focusout"?at:Z]=t._element.contains(e.relatedTarget),t._leave()})}this._hideModalHandler=()=>{this._element&&this.hide()},e.on(this._element.closest(hn),mn,this._hideModalHandler)}_fixTitle(){const e=this._element.getAttribute("title");if(!e)return;!this._element.getAttribute("aria-label")&&!this._element.textContent.trim()&&this._element.setAttribute("aria-label",e),this._element.setAttribute("data-bs-original-title",e),this._element.removeAttribute("title")}_enter(){if(this._isShown()||this._isHovered){this._isHovered=!0;return}this._isHovered=!0,this._setTimeout(()=>{this._isHovered&&this.show()},this._config.delay.show)}_leave(){if(this._isWithActiveTrigger())return;this._isHovered=!1,this._setTimeout(()=>{this._isHovered||this.hide()},this._config.delay.hide)}_setTimeout(e,t){clearTimeout(this._timeout),this._timeout=setTimeout(e,t)}_isWithActiveTrigger(){return Object.values(this._activeTrigger).includes(!0)}_getConfig(e){const t=v.getDataAttributes(this._element);for(const e of Object.keys(t))ca.has(e)&&delete t[e];return e={...t,...typeof e=="object"&&e?e:{}},e=this._mergeConfigObj(e),e=this._configAfterMerge(e),this._typeCheckConfig(e),e}_configAfterMerge(e){return e.container=e.container===!1?document.body:w(e.container),typeof e.delay=="number"&&(e.delay={show:e.delay,hide:e.delay}),typeof e.title=="number"&&(e.title=e.title.toString()),typeof e.content=="number"&&(e.content=e.content.toString()),e}_getDelegateConfig(){const e={};for(const[t,n]of Object.entries(this._config))this.constructor.Default[t]!==n&&(e[t]=n);return e.selector=!1,e.trigger="manual",e}_disposePopper(){this._popper&&(this._popper.destroy(),this._popper=null),this.tip&&(this.tip.remove(),this.tip=null)}static jQueryInterface(e){return this.each(function(){const t=H.getOrCreateInstance(this,e);if(typeof e!="string")return;if(typeof t[e]=="undefined")throw new TypeError(`No method named "${e}"`);t[e]()})}}u(H);const za="popover",Da=".popover-header",Na=".popover-body",La={...H.Default,content:"",offset:[0,8],placement:"right",template:'',trigger:"click"},Ra={...H.DefaultType,content:"(null|string|element|function)"};class mt extends H{static get Default(){return La}static get DefaultType(){return Ra}static get NAME(){return za}_isWithContent(){return this._getTitle()||this._getContent()}_getContentForTemplate(){return{[Da]:this._getTitle(),[Na]:this._getContent()}}_getContent(){return this._resolvePossibleFunction(this._config.content)}static jQueryInterface(e){return this.each(function(){const t=mt.getOrCreateInstance(this,e);if(typeof e!="string")return;if(typeof t[e]=="undefined")throw new TypeError(`No method named "${e}"`);t[e]()})}}u(mt);const Ha="scrollspy",Ia="bs.scrollspy",Ie=`.${Ia}`,Va=".data-api",$a=`activate${Ie}`,pn=`click${Ie}`,Ua=`load${Ie}${Va}`,Ka="dropdown-item",W="active",Ya='[data-bs-spy="scroll"]',Ge="[href]",Xa=".nav, .list-group",gn=".nav-link",Za=".nav-item",Ja=".list-group-item",er=`${gn}, ${Za} > ${gn}, ${Ja}`,tr=".dropdown",nr=".dropdown-toggle",sr={offset:null,rootMargin:"0px 0px -25%",smoothScroll:!1,target:null,threshold:[.1,.5,1]},or={offset:"(number|null)",rootMargin:"string",smoothScroll:"boolean",target:"element",threshold:"array"};class xe extends h{constructor(e,t){super(e,t),this._targetLinks=new Map,this._observableSections=new Map,this._rootElement=getComputedStyle(this._element).overflowY==="visible"?null:this._element,this._activeTarget=null,this._observer=null,this._previousScrollData={visibleEntryTop:0,parentScrollTop:0},this.refresh()}static get Default(){return sr}static get DefaultType(){return or}static get NAME(){return Ha}refresh(){this._initializeTargetsAndObservables(),this._maybeEnableSmoothScroll(),this._observer?this._observer.disconnect():this._observer=this._getNewObserver();for(const e of this._observableSections.values())this._observer.observe(e)}dispose(){this._observer.disconnect(),super.dispose()}_configAfterMerge(e){return e.target=w(e.target)||document.body,e.rootMargin=e.offset?`${e.offset}px 0px -30%`:e.rootMargin,typeof e.threshold=="string"&&(e.threshold=e.threshold.split(",").map(e=>Number.parseFloat(e))),e}_maybeEnableSmoothScroll(){if(!this._config.smoothScroll)return;e.off(this._config.target,pn),e.on(this._config.target,pn,Ge,e=>{const t=this._observableSections.get(e.target.hash);if(t){e.preventDefault();const n=this._rootElement||window,s=t.offsetTop-this._element.offsetTop;if(n.scrollTo){n.scrollTo({top:s,behavior:"smooth"});return}n.scrollTop=s}})}_getNewObserver(){const e={root:this._rootElement,threshold:this._config.threshold,rootMargin:this._config.rootMargin};return new IntersectionObserver(e=>this._observerCallback(e),e)}_observerCallback(e){const n=e=>this._targetLinks.get(`#${e.target.id}`),s=e=>{this._previousScrollData.visibleEntryTop=e.target.offsetTop,this._process(n(e))},t=(this._rootElement||document.documentElement).scrollTop,o=t>=this._previousScrollData.parentScrollTop;this._previousScrollData.parentScrollTop=t;for(const i of e){if(!i.isIntersecting){this._activeTarget=null,this._clearActiveClass(n(i));continue}const a=i.target.offsetTop>=this._previousScrollData.visibleEntryTop;if(o&&a){if(s(i),!t)return;continue}!o&&!a&&s(i)}}_initializeTargetsAndObservables(){this._targetLinks=new Map,this._observableSections=new Map;const e=t.find(Ge,this._config.target);for(const n of e){if(!n.hash||y(n))continue;const s=t.findOne(decodeURI(n.hash),this._element);R(s)&&(this._targetLinks.set(decodeURI(n.hash),n),this._observableSections.set(n.hash,s))}}_process(t){if(this._activeTarget===t)return;this._clearActiveClass(this._config.target),this._activeTarget=t,t.classList.add(W),this._activateParents(t),e.trigger(this._element,$a,{relatedTarget:t})}_activateParents(e){if(e.classList.contains(Ka)){t.findOne(nr,e.closest(tr)).classList.add(W);return}for(const n of t.parents(e,Xa))for(const e of t.prev(n,er))e.classList.add(W)}_clearActiveClass(e){e.classList.remove(W);const n=t.find(`${Ge}.${W}`,e);for(const e of n)e.classList.remove(W)}static jQueryInterface(e){return this.each(function(){const t=xe.getOrCreateInstance(this,e);if(typeof e!="string")return;if(t[e]===void 0||e.startsWith("_")||e==="constructor")throw new TypeError(`No method named "${e}"`);t[e]()})}}e.on(window,Ua,()=>{for(const e of t.find(Ya))xe.getOrCreateInstance(e)}),u(xe);const ar="tab",rr="bs.tab",M=`.${rr}`,lr=`hide${M}`,dr=`hidden${M}`,ur=`show${M}`,hr=`shown${M}`,mr=`click${M}`,fr=`keydown${M}`,pr=`load${M}`,gr="ArrowLeft",vn="ArrowRight",br="ArrowUp",yn="ArrowDown",ft="Home",wn="End",S="active",Mn="fade",Ye="show",Cr="dropdown",Wn=".dropdown-toggle",kr=".dropdown-menu",Ne=`:not(${Wn})`,Sr='.list-group, .nav, [role="tablist"]',Mr=".nav-item, .list-group-item",Fr=`.nav-link${Ne}, .list-group-item${Ne}, [role="tab"]${Ne}`,Gn='[data-bs-toggle="tab"], [data-bs-toggle="pill"], [data-bs-toggle="list"]',Pe=`${Fr}, ${Gn}`,Dr=`.${S}[data-bs-toggle="tab"], .${S}[data-bs-toggle="pill"], .${S}[data-bs-toggle="list"]`;class B extends h{constructor(t){if(super(t),this._parent=this._element.closest(Sr),!this._parent)return;this._setInitialAttributes(this._parent,this._getChildren()),e.on(this._element,fr,e=>this._keydown(e))}static get NAME(){return ar}show(){const t=this._element;if(this._elemIsActive(t))return;const n=this._getActiveElem(),s=n?e.trigger(n,lr,{relatedTarget:t}):null,o=e.trigger(t,ur,{relatedTarget:n});if(o.defaultPrevented||s&&s.defaultPrevented)return;this._deactivate(n,t),this._activate(t,n)}_activate(n,s){if(!n)return;n.classList.add(S),this._activate(t.getElementFromSelector(n));const o=()=>{if(n.getAttribute("role")!=="tab"){n.classList.add(Ye);return}n.removeAttribute("tabindex"),n.setAttribute("aria-selected",!0),this._toggleDropDown(n,!0),e.trigger(n,hr,{relatedTarget:s})};this._queueCallback(o,n,n.classList.contains(Mn))}_deactivate(n,s){if(!n)return;n.classList.remove(S),n.blur(),this._deactivate(t.getElementFromSelector(n));const o=()=>{if(n.getAttribute("role")!=="tab"){n.classList.remove(Ye);return}n.setAttribute("aria-selected",!1),n.setAttribute("tabindex","-1"),this._toggleDropDown(n,!1),e.trigger(n,dr,{relatedTarget:s})};this._queueCallback(o,n,n.classList.contains(Mn))}_keydown(e){if(![gr,vn,br,yn,ft,wn].includes(e.key))return;e.stopPropagation(),e.preventDefault();const n=this._getChildren().filter(e=>!y(e));let t;if([ft,wn].includes(e.key))t=n[e.key===ft?0:n.length-1];else{const s=[vn,yn].includes(e.key);t=$e(n,e.target,s,!0)}t&&(t.focus({preventScroll:!0}),B.getOrCreateInstance(t).show())}_getChildren(){return t.find(Pe,this._parent)}_getActiveElem(){return this._getChildren().find(e=>this._elemIsActive(e))||null}_setInitialAttributes(e,t){this._setAttributeIfNotExists(e,"role","tablist");for(const e of t)this._setInitialAttributesOnChild(e)}_setInitialAttributesOnChild(e){e=this._getInnerElement(e);const t=this._elemIsActive(e),n=this._getOuterElement(e);e.setAttribute("aria-selected",t),n!==e&&this._setAttributeIfNotExists(n,"role","presentation"),t||e.setAttribute("tabindex","-1"),this._setAttributeIfNotExists(e,"role","tab"),this._setInitialAttributesOnTargetPanel(e)}_setInitialAttributesOnTargetPanel(e){const n=t.getElementFromSelector(e);if(!n)return;this._setAttributeIfNotExists(n,"role","tabpanel"),e.id&&this._setAttributeIfNotExists(n,"aria-labelledby",`${e.id}`)}_toggleDropDown(e,n){const s=this._getOuterElement(e);if(!s.classList.contains(Cr))return;const o=(e,o)=>{const i=t.findOne(e,s);i&&i.classList.toggle(o,n)};o(Wn,S),o(kr,Ye),s.setAttribute("aria-expanded",n)}_setAttributeIfNotExists(e,t,n){e.hasAttribute(t)||e.setAttribute(t,n)}_elemIsActive(e){return e.classList.contains(S)}_getInnerElement(e){return e.matches(Pe)?e:t.findOne(Pe,e)}_getOuterElement(e){return e.closest(Mr)||e}static jQueryInterface(e){return this.each(function(){const t=B.getOrCreateInstance(this);if(typeof e!="string")return;if(t[e]===void 0||e.startsWith("_")||e==="constructor")throw new TypeError(`No method named "${e}"`);t[e]()})}}e.on(document,mr,Gn,function(e){if(["A","AREA"].includes(this.tagName)&&e.preventDefault(),y(this))return;B.getOrCreateInstance(this).show()}),e.on(window,pr,()=>{for(const e of t.find(Dr))B.getOrCreateInstance(e)}),u(B);const Lr="toast",Rr="bs.toast",x=`.${Rr}`,Hr=`mouseover${x}`,Ir=`mouseout${x}`,Br=`focusin${x}`,Vr=`focusout${x}`,$r=`hide${x}`,Wr=`hidden${x}`,Ur=`show${x}`,Kr=`shown${x}`,qr="fade",os="hide",ve="show",he="showing",Qr={animation:"boolean",autohide:"boolean",delay:"number"},Zr={animation:!0,autohide:!0,delay:5e3};class ue extends h{constructor(e,t){super(e,t),this._timeout=null,this._hasMouseInteraction=!1,this._hasKeyboardInteraction=!1,this._setListeners()}static get Default(){return Zr}static get DefaultType(){return Qr}static get NAME(){return Lr}show(){const t=e.trigger(this._element,Ur);if(t.defaultPrevented)return;this._clearTimeout(),this._config.animation&&this._element.classList.add(qr);const n=()=>{this._element.classList.remove(he),e.trigger(this._element,Kr),this._maybeScheduleHide()};this._element.classList.remove(os),oe(this._element),this._element.classList.add(ve,he),this._queueCallback(n,this._element,this._config.animation)}hide(){if(!this.isShown())return;const t=e.trigger(this._element,$r);if(t.defaultPrevented)return;const n=()=>{this._element.classList.add(os),this._element.classList.remove(he,ve),e.trigger(this._element,Wr)};this._element.classList.add(he),this._queueCallback(n,this._element,this._config.animation)}dispose(){this._clearTimeout(),this.isShown()&&this._element.classList.remove(ve),super.dispose()}isShown(){return this._element.classList.contains(ve)}_maybeScheduleHide(){if(!this._config.autohide)return;if(this._hasMouseInteraction||this._hasKeyboardInteraction)return;this._timeout=setTimeout(()=>{this.hide()},this._config.delay)}_onInteraction(e,t){switch(e.type){case"mouseover":case"mouseout":{this._hasMouseInteraction=t;break}case"focusin":case"focusout":{this._hasKeyboardInteraction=t;break}}if(t){this._clearTimeout();return}const n=e.relatedTarget;if(this._element===n||this._element.contains(n))return;this._maybeScheduleHide()}_setListeners(){e.on(this._element,Hr,e=>this._onInteraction(e,!0)),e.on(this._element,Ir,e=>this._onInteraction(e,!1)),e.on(this._element,Br,e=>this._onInteraction(e,!0)),e.on(this._element,Vr,e=>this._onInteraction(e,!1))}_clearTimeout(){clearTimeout(this._timeout),this._timeout=null}static jQueryInterface(e){return this.each(function(){const t=ue.getOrCreateInstance(this,e);if(typeof e=="string"){if(typeof t[e]=="undefined")throw new TypeError(`No method named "${e}"`);t[e](this)}})}}_e(ue),u(ue);const ec={Alert:de,Button:fe,Carousel:ee,Collapse:te,Dropdown:m,Modal:$,Offcanvas:O,Popover:mt,ScrollSpy:xe,Tab:B,Toast:ue,Tooltip:H};return ec}),function(e){"use strict";e(function(){e('[data-bs-toggle="tooltip"]').tooltip(),e('[data-bs-toggle="popover"]').popover(),e(".popover-dismiss").popover({trigger:"focus"})});function t(e){return e.offset().top+e.outerHeight()}e(function(){var n,o,i,s=e(".js-td-cover");if(!s.length)return;o=t(s),i=e(".js-navbar-scroll").offset().top,n=Math.ceil(e(".js-navbar-scroll").outerHeight()),o-i{o(e(n.target)),t.blur()}),t.closest("form").on("submit",()=>!1);let n=null;const s=new Map;e.ajax(t.data("offline-search-index-json-src")).then(e=>{n=lunr(function(){this.ref("ref"),this.field("title",{boost:5}),this.field("categories",{boost:3}),this.field("tags",{boost:3}),this.field("description",{boost:2}),this.field("body"),e.forEach(e=>{this.add(e),s.set(e.ref,{title:e.title,excerpt:e.excerpt})})}),t.trigger("change")});const o=o=>{{let e=bootstrap.Popover.getInstance(o[0]);e!==null&&e.dispose()}if(n===null)return;const i=o.val();if(i==="")return;const c=n.query(e=>{const t=lunr.tokenizer(i.toLowerCase());t.forEach(t=>{const n=t.toString();e.term(n,{boost:100}),e.term(n,{wildcard:lunr.Query.wildcard.LEADING|lunr.Query.wildcard.TRAILING,boost:10}),e.term(n,{editDistance:2})})}).slice(0,o.data("offline-search-max-results")),a=e("
    ");a.append(e("
    ").css({display:"flex",justifyContent:"space-between",marginBottom:"1em"}).append(e("").text("Search results").css({fontWeight:"bold"})).append(e("").addClass("td-offline-search-results__close-button")));const r=e("
    ").css({maxHeight:`calc(100vh - ${o.offset().top-e(window).scrollTop()+180}px)`,overflowY:"auto"});a.append(r),c.length===0?r.append(e("

    ").text(`No results found for query "${i}"`)):c.forEach(n=>{const i=s.get(n.ref),a=t.data("offline-search-base-href")+n.ref.replace(/^\//,""),o=e("

    ").addClass("mt-4");o.append(e("").addClass("d-block text-body-secondary").text(n.ref)),o.append(e("").addClass("d-block").css({fontSize:"1.2rem"}).attr("href",a).text(i.title)),o.append(e("

    ").text(i.excerpt)),r.append(o)}),o.one("shown.bs.popover",()=>{e(".td-offline-search-results__close-button").on("click",()=>{o.val(""),o.trigger("change")})});const l=new bootstrap.Popover(o,{content:a[0],html:!0,customClass:"td-offline-search-results",placement:"bottom"});l.show()}})}(jQuery) \ No newline at end of file diff --git a/js/main.min.a8aca58be32dafbc1f83ea37498f84156385fd2ded5d1776c98a24db210d3ec6.js b/js/main.min.a8aca58be32dafbc1f83ea37498f84156385fd2ded5d1776c98a24db210d3ec6.js deleted file mode 100644 index 01d2bb8..0000000 --- a/js/main.min.a8aca58be32dafbc1f83ea37498f84156385fd2ded5d1776c98a24db210d3ec6.js +++ /dev/null @@ -1 +0,0 @@ -(function(e){"use strict";e(function(){e('[data-toggle="tooltip"]').tooltip(),e('[data-toggle="popover"]').popover(),e(".popover-dismiss").popover({trigger:"focus"})});function t(e){return e.offset().top+e.outerHeight()}e(function(){var n,o,i,s=e(".js-td-cover");if(!s.length)return;o=t(s),i=e(".js-navbar-scroll").offset().top,n=Math.ceil(e(".js-navbar-scroll").outerHeight()),o-i',t.href="#"+e.id,e.insertAdjacentElement("beforeend",t),e.addEventListener("mouseenter",function(){t.style.visibility="initial"}),e.addEventListener("mouseleave",function(){t.style.visibility="hidden"})}})})}(jQuery),function(e){"use strict";e(document).ready(function(){const t=e(".td-search-input");t.data("html",!0),t.data("placement","bottom"),t.data("template",'

    '),t.on("change",n=>{o(e(n.target)),t.blur()}),t.closest("form").on("submit",()=>!1);let n=null;const s=new Map;e.ajax(t.data("offline-search-index-json-src")).then(e=>{n=lunr(function(){this.ref("ref"),this.field("title",{boost:5}),this.field("categories",{boost:3}),this.field("tags",{boost:3}),this.field("description",{boost:2}),this.field("body"),e.forEach(e=>{this.add(e),s.set(e.ref,{title:e.title,excerpt:e.excerpt})})}),t.trigger("change")});const o=o=>{if(o.popover("dispose"),n===null)return;const i=o.val();if(i==="")return;const c=n.query(e=>{const t=lunr.tokenizer(i.toLowerCase());t.forEach(t=>{const n=t.toString();e.term(n,{boost:100}),e.term(n,{wildcard:lunr.Query.wildcard.LEADING|lunr.Query.wildcard.TRAILING,boost:10}),e.term(n,{editDistance:2})})}).slice(0,o.data("offline-search-max-results")),a=e("
    ");a.append(e("
    ").css({display:"flex",justifyContent:"space-between",marginBottom:"1em"}).append(e("").text("Search results").css({fontWeight:"bold"})).append(e("").addClass("fas fa-times search-result-close-button").css({cursor:"pointer"})));const r=e("
    ").css({maxHeight:`calc(100vh - ${o.offset().top-e(window).scrollTop()+180}px)`,overflowY:"auto"});a.append(r),c.length===0?r.append(e("

    ").text(`No results found for query "${i}"`)):c.forEach(n=>{const i=s.get(n.ref),a=t.data("offline-search-base-href")+n.ref.replace(/^\//,""),o=e("

    ").addClass("mt-4");o.append(e("").addClass("d-block text-muted").text(n.ref)),o.append(e("").addClass("d-block").css({fontSize:"1.2rem"}).attr("href",a).text(i.title)),o.append(e("

    ").text(i.excerpt)),r.append(o)}),o.on("shown.bs.popover",()=>{e(".search-result-close-button").on("click",()=>{o.val(""),o.trigger("change")})});const l=e.fn.tooltip.Constructor.Default.whiteList;l["*"].push("style"),o.data("content",a[0].outerHTML).popover({whiteList:l}).popover("show")}})}(jQuery),function(e){var t,n,o,s=!1;if(e(".language-mermaid").parent().replaceWith(function(){return s=!0,e('

    ').text(e(this).text())}),!s){mermaid.initialize({startOnLoad:!1});return}o={enable:!0},t=function(e,n){var s={};for(const o in e){const i=o.toLowerCase();e.hasOwnProperty(o)&&n.hasOwnProperty(i)&&(typeof e[o]=="object"?s[o]=t(e[o],n[i]):s[o]=n[i])}return s},n=t(mermaid.mermaidAPI.defaultConfig,o),n.startOnLoad=!0,mermaid.initialize(n)}(jQuery),function(){var e,t,n=function(){e=document.createElement("div"),e.classList.add("drawioframe"),t=document.createElement("iframe"),e.appendChild(t),document.body.appendChild(e)},s=function(){e&&(document.body.removeChild(e),e=void 0,t=void 0)},o=function(e,o){var i,a,r="https://embed.diagrams.net/";r+="?embed=1&ui=atlas&spin=1&modified=unsavedChanges&proto=json&saveAndEdit=1&noSaveBtn=1",i=document.createElement("div"),i.classList.add("drawio"),e.parentNode.insertBefore(i,e),i.appendChild(e),a=document.createElement("button"),a.classList.add("drawiobtn"),a.insertAdjacentHTML("beforeend",''),i.appendChild(a),a.addEventListener("click",function(){if(t)return;n();var a=function(n){var i,c,r=t.contentWindow;if(n.data.length>0&&n.source==r){if(i=JSON.parse(n.data),i.event=="init")r.postMessage(JSON.stringify({action:"load",xml:o}),"*");else if(i.event=="save")c=o.indexOf("data:image/png")==0?"xmlpng":"xmlsvg",r.postMessage(JSON.stringify({action:"export",format:c}),"*");else if(i.event=="export"){const n=e.src.replace(/^.*?([^/]+)$/,"$1"),t=document.createElement("a");t.setAttribute("href",i.data),t.setAttribute("download",n),document.body.appendChild(t),t.click(),t.parentNode.removeChild(t)}(i.event=="exit"||i.event=="export")&&(window.removeEventListener("message",a),s())}};window.addEventListener("message",a),t.setAttribute("src",r)})};document.addEventListener("DOMContentLoaded",function(){for(const s of document.getElementsByTagName("img")){const n=s,t=n.getAttribute("src");if(!t.endsWith(".svg")&&!t.endsWith(".png"))continue;const e=new XMLHttpRequest;e.responseType="blob",e.open("GET",t),e.addEventListener("load",function(){const t=new FileReader;t.addEventListener("load",function(){if(t.result.indexOf("mxfile")!=-1){const t=new FileReader;t.addEventListener("load",function(){const e=t.result;o(n,e)}),t.readAsDataURL(e.response)}}),t.readAsBinaryString(e.response)}),e.send()}})}()
    \ No newline at end of file
    diff --git a/js/prism.js b/js/prism.js
    index ae881ac..15f0f78 100644
    --- a/js/prism.js
    +++ b/js/prism.js
    @@ -1,21 +1,21 @@
    -/* PrismJS 1.21.0
    +/* PrismJS 1.28.0
     https://prismjs.com/download.html#themes=prism&languages=markup+css+clike+javascript+bash+c+csharp+cpp+go+java+markdown+python+scss+sql+toml+yaml&plugins=toolbar+copy-to-clipboard */
    -var _self="undefined"!=typeof window?window:"undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?self:{},Prism=function(u){var c=/\blang(?:uage)?-([\w-]+)\b/i,n=0,M={manual:u.Prism&&u.Prism.manual,disableWorkerMessageHandler:u.Prism&&u.Prism.disableWorkerMessageHandler,util:{encode:function e(n){return n instanceof W?new W(n.type,e(n.content),n.alias):Array.isArray(n)?n.map(e):n.replace(/&/g,"&").replace(/=l.reach);k+=y.value.length,y=y.next){var b=y.value;if(t.length>n.length)return;if(!(b instanceof W)){var x=1;if(h&&y!=t.tail.prev){m.lastIndex=k;var w=m.exec(n);if(!w)break;var A=w.index+(f&&w[1]?w[1].length:0),P=w.index+w[0].length,S=k;for(S+=y.value.length;S<=A;)y=y.next,S+=y.value.length;if(S-=y.value.length,k=S,y.value instanceof W)continue;for(var E=y;E!==t.tail&&(Sl.reach&&(l.reach=j);var C=y.prev;L&&(C=I(t,C,L),k+=L.length),z(t,C,x);var _=new W(o,g?M.tokenize(O,g):O,v,O);y=I(t,C,_),N&&I(t,y,N),1"+a.content+""},!u.document)return u.addEventListener&&(M.disableWorkerMessageHandler||u.addEventListener("message",function(e){var n=JSON.parse(e.data),t=n.language,r=n.code,a=n.immediateClose;u.postMessage(M.highlight(r,M.languages[t],t)),a&&u.close()},!1)),M;var e=M.util.currentScript();function t(){M.manual||M.highlightAll()}if(e&&(M.filename=e.src,e.hasAttribute("data-manual")&&(M.manual=!0)),!M.manual){var r=document.readyState;"loading"===r||"interactive"===r&&e&&e.defer?document.addEventListener("DOMContentLoaded",t):window.requestAnimationFrame?window.requestAnimationFrame(t):window.setTimeout(t,16)}return M}(_self);"undefined"!=typeof module&&module.exports&&(module.exports=Prism),"undefined"!=typeof global&&(global.Prism=Prism);
    -Prism.languages.markup={comment://,prolog:/<\?[\s\S]+?\?>/,doctype:{pattern:/"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|)*\]\s*)?>/i,greedy:!0,inside:{"internal-subset":{pattern:/(\[)[\s\S]+(?=\]>$)/,lookbehind:!0,greedy:!0,inside:null},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},punctuation:/^$|[[\]]/,"doctype-tag":/^DOCTYPE/,name:/[^\s<>'"]+/}},cdata://i,tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,inside:{punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:[{pattern:/&[\da-z]{1,8};/i,alias:"named-entity"},/&#x?[\da-f]{1,8};/i]},Prism.languages.markup.tag.inside["attr-value"].inside.entity=Prism.languages.markup.entity,Prism.languages.markup.doctype.inside["internal-subset"].inside=Prism.languages.markup,Prism.hooks.add("wrap",function(a){"entity"===a.type&&(a.attributes.title=a.content.replace(/&/,"&"))}),Object.defineProperty(Prism.languages.markup.tag,"addInlined",{value:function(a,e){var s={};s["language-"+e]={pattern:/(^$)/i,lookbehind:!0,inside:Prism.languages[e]},s.cdata=/^$/i;var n={"included-cdata":{pattern://i,inside:s}};n["language-"+e]={pattern:/[\s\S]+/,inside:Prism.languages[e]};var t={};t[a]={pattern:RegExp("(<__[^]*?>)(?:))*\\]\\]>|(?!)".replace(/__/g,function(){return a}),"i"),lookbehind:!0,greedy:!0,inside:n},Prism.languages.insertBefore("markup","cdata",t)}}),Prism.languages.html=Prism.languages.markup,Prism.languages.mathml=Prism.languages.markup,Prism.languages.svg=Prism.languages.markup,Prism.languages.xml=Prism.languages.extend("markup",{}),Prism.languages.ssml=Prism.languages.xml,Prism.languages.atom=Prism.languages.xml,Prism.languages.rss=Prism.languages.xml;
    -!function(e){var s=/("|')(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/;e.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:/@[\w-]+[\s\S]*?(?:;|(?=\s*\{))/,inside:{rule:/^@[\w-]+/,"selector-function-argument":{pattern:/(\bselector\s*\((?!\s*\))\s*)(?:[^()]|\((?:[^()]|\([^()]*\))*\))+?(?=\s*\))/,lookbehind:!0,alias:"selector"},keyword:{pattern:/(^|[^\w-])(?:and|not|only|or)(?![\w-])/,lookbehind:!0}}},url:{pattern:RegExp("\\burl\\((?:"+s.source+"|(?:[^\\\\\r\n()\"']|\\\\[^])*)\\)","i"),greedy:!0,inside:{function:/^url/i,punctuation:/^\(|\)$/,string:{pattern:RegExp("^"+s.source+"$"),alias:"url"}}},selector:RegExp("[^{}\\s](?:[^{};\"']|"+s.source+")*?(?=\\s*\\{)"),string:{pattern:s,greedy:!0},property:/[-_a-z\xA0-\uFFFF][-\w\xA0-\uFFFF]*(?=\s*:)/i,important:/!important\b/i,function:/[-a-z0-9]+(?=\()/i,punctuation:/[(){};:,]/},e.languages.css.atrule.inside.rest=e.languages.css;var t=e.languages.markup;t&&(t.tag.addInlined("style","css"),e.languages.insertBefore("inside","attr-value",{"style-attr":{pattern:/\s*style=("|')(?:\\[\s\S]|(?!\1)[^\\])*\1/i,inside:{"attr-name":{pattern:/^\s*style/i,inside:t.tag.inside},punctuation:/^\s*=\s*['"]|['"]\s*$/,"attr-value":{pattern:/.+/i,inside:e.languages.css}},alias:"language-css"}},t.tag))}(Prism);
    -Prism.languages.clike={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"class-name":{pattern:/(\b(?:class|interface|extends|implements|trait|instanceof|new)\s+|\bcatch\s+\()[\w.\\]+/i,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:if|else|while|do|for|return|in|instanceof|function|new|try|throw|catch|finally|null|break|continue)\b/,boolean:/\b(?:true|false)\b/,function:/\w+(?=\()/,number:/\b0x[\da-f]+\b|(?:\b\d+\.?\d*|\B\.\d+)(?:e[+-]?\d+)?/i,operator:/[<>]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/,punctuation:/[{}[\];(),.:]/};
    -Prism.languages.javascript=Prism.languages.extend("clike",{"class-name":[Prism.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])[_$A-Z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\.(?:prototype|constructor))/,lookbehind:!0}],keyword:[{pattern:/((?:^|})\s*)(?:catch|finally)\b/,lookbehind:!0},{pattern:/(^|[^.]|\.\.\.\s*)\b(?:as|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|for|from|function|(?:get|set)(?=\s*[\[$\w\xA0-\uFFFF])|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,lookbehind:!0}],number:/\b(?:(?:0[xX](?:[\dA-Fa-f](?:_[\dA-Fa-f])?)+|0[bB](?:[01](?:_[01])?)+|0[oO](?:[0-7](?:_[0-7])?)+)n?|(?:\d(?:_\d)?)+n|NaN|Infinity)\b|(?:\b(?:\d(?:_\d)?)+\.?(?:\d(?:_\d)?)*|\B\.(?:\d(?:_\d)?)+)(?:[Ee][+-]?(?:\d(?:_\d)?)+)?/,function:/#?[_$a-zA-Z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,operator:/--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/}),Prism.languages.javascript["class-name"][0].pattern=/(\b(?:class|interface|extends|implements|instanceof|new)\s+)[\w.\\]+/,Prism.languages.insertBefore("javascript","keyword",{regex:{pattern:/((?:^|[^$\w\xA0-\uFFFF."'\])\s]|\b(?:return|yield))\s*)\/(?:\[(?:[^\]\\\r\n]|\\.)*]|\\.|[^/\\\[\r\n])+\/[gimyus]{0,6}(?=(?:\s|\/\*(?:[^*]|\*(?!\/))*\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/,lookbehind:!0,greedy:!0},"function-variable":{pattern:/#?[_$a-zA-Z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|[_$a-zA-Z\xA0-\uFFFF][$\w\xA0-\uFFFF]*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+[_$A-Za-z\xA0-\uFFFF][$\w\xA0-\uFFFF]*)?\s*\(\s*)(?!\s)(?:[^()]|\([^()]*\))+?(?=\s*\))/,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/[_$a-z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\s*=>)/i,inside:Prism.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()]|\([^()]*\))+?(?=\s*\)\s*=>)/,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:[_$A-Za-z\xA0-\uFFFF][$\w\xA0-\uFFFF]*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()]|\([^()]*\))+?(?=\s*\)\s*\{)/,lookbehind:!0,inside:Prism.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/}),Prism.languages.insertBefore("javascript","string",{"template-string":{pattern:/`(?:\\[\s\S]|\${(?:[^{}]|{(?:[^{}]|{[^}]*})*})+}|(?!\${)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\${(?:[^{}]|{(?:[^{}]|{[^}]*})*})+}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\${|}$/,alias:"punctuation"},rest:Prism.languages.javascript}},string:/[\s\S]+/}}}),Prism.languages.markup&&Prism.languages.markup.tag.addInlined("script","javascript"),Prism.languages.js=Prism.languages.javascript;
    -!function(e){var t="\\b(?:BASH|BASHOPTS|BASH_ALIASES|BASH_ARGC|BASH_ARGV|BASH_CMDS|BASH_COMPLETION_COMPAT_DIR|BASH_LINENO|BASH_REMATCH|BASH_SOURCE|BASH_VERSINFO|BASH_VERSION|COLORTERM|COLUMNS|COMP_WORDBREAKS|DBUS_SESSION_BUS_ADDRESS|DEFAULTS_PATH|DESKTOP_SESSION|DIRSTACK|DISPLAY|EUID|GDMSESSION|GDM_LANG|GNOME_KEYRING_CONTROL|GNOME_KEYRING_PID|GPG_AGENT_INFO|GROUPS|HISTCONTROL|HISTFILE|HISTFILESIZE|HISTSIZE|HOME|HOSTNAME|HOSTTYPE|IFS|INSTANCE|JOB|LANG|LANGUAGE|LC_ADDRESS|LC_ALL|LC_IDENTIFICATION|LC_MEASUREMENT|LC_MONETARY|LC_NAME|LC_NUMERIC|LC_PAPER|LC_TELEPHONE|LC_TIME|LESSCLOSE|LESSOPEN|LINES|LOGNAME|LS_COLORS|MACHTYPE|MAILCHECK|MANDATORY_PATH|NO_AT_BRIDGE|OLDPWD|OPTERR|OPTIND|ORBIT_SOCKETDIR|OSTYPE|PAPERSIZE|PATH|PIPESTATUS|PPID|PS1|PS2|PS3|PS4|PWD|RANDOM|REPLY|SECONDS|SELINUX_INIT|SESSION|SESSIONTYPE|SESSION_MANAGER|SHELL|SHELLOPTS|SHLVL|SSH_AUTH_SOCK|TERM|UID|UPSTART_EVENTS|UPSTART_INSTANCE|UPSTART_JOB|UPSTART_SESSION|USER|WINDOWID|XAUTHORITY|XDG_CONFIG_DIRS|XDG_CURRENT_DESKTOP|XDG_DATA_DIRS|XDG_GREETER_DATA_DIR|XDG_MENU_PREFIX|XDG_RUNTIME_DIR|XDG_SEAT|XDG_SEAT_PATH|XDG_SESSION_DESKTOP|XDG_SESSION_ID|XDG_SESSION_PATH|XDG_SESSION_TYPE|XDG_VTNR|XMODIFIERS)\\b",n={environment:{pattern:RegExp("\\$"+t),alias:"constant"},variable:[{pattern:/\$?\(\([\s\S]+?\)\)/,greedy:!0,inside:{variable:[{pattern:/(^\$\(\([\s\S]+)\)\)/,lookbehind:!0},/^\$\(\(/],number:/\b0x[\dA-Fa-f]+\b|(?:\b\d+\.?\d*|\B\.\d+)(?:[Ee]-?\d+)?/,operator:/--?|-=|\+\+?|\+=|!=?|~|\*\*?|\*=|\/=?|%=?|<<=?|>>=?|<=?|>=?|==?|&&?|&=|\^=?|\|\|?|\|=|\?|:/,punctuation:/\(\(?|\)\)?|,|;/}},{pattern:/\$\((?:\([^)]+\)|[^()])+\)|`[^`]+`/,greedy:!0,inside:{variable:/^\$\(|^`|\)$|`$/}},{pattern:/\$\{[^}]+\}/,greedy:!0,inside:{operator:/:[-=?+]?|[!\/]|##?|%%?|\^\^?|,,?/,punctuation:/[\[\]]/,environment:{pattern:RegExp("(\\{)"+t),lookbehind:!0,alias:"constant"}}},/\$(?:\w+|[#?*!@$])/],entity:/\\(?:[abceEfnrtv\\"]|O?[0-7]{1,3}|x[0-9a-fA-F]{1,2}|u[0-9a-fA-F]{4}|U[0-9a-fA-F]{8})/};e.languages.bash={shebang:{pattern:/^#!\s*\/.*/,alias:"important"},comment:{pattern:/(^|[^"{\\$])#.*/,lookbehind:!0},"function-name":[{pattern:/(\bfunction\s+)\w+(?=(?:\s*\(?:\s*\))?\s*\{)/,lookbehind:!0,alias:"function"},{pattern:/\b\w+(?=\s*\(\s*\)\s*\{)/,alias:"function"}],"for-or-select":{pattern:/(\b(?:for|select)\s+)\w+(?=\s+in\s)/,alias:"variable",lookbehind:!0},"assign-left":{pattern:/(^|[\s;|&]|[<>]\()\w+(?=\+?=)/,inside:{environment:{pattern:RegExp("(^|[\\s;|&]|[<>]\\()"+t),lookbehind:!0,alias:"constant"}},alias:"variable",lookbehind:!0},string:[{pattern:/((?:^|[^<])<<-?\s*)(\w+?)\s*(?:\r?\n|\r)[\s\S]*?(?:\r?\n|\r)\2/,lookbehind:!0,greedy:!0,inside:n},{pattern:/((?:^|[^<])<<-?\s*)(["'])(\w+)\2\s*(?:\r?\n|\r)[\s\S]*?(?:\r?\n|\r)\3/,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\](?:\\\\)*)(["'])(?:\\[\s\S]|\$\([^)]+\)|`[^`]+`|(?!\2)[^\\])*\2/,lookbehind:!0,greedy:!0,inside:n}],environment:{pattern:RegExp("\\$?"+t),alias:"constant"},variable:n.variable,function:{pattern:/(^|[\s;|&]|[<>]\()(?:add|apropos|apt|aptitude|apt-cache|apt-get|aspell|automysqlbackup|awk|basename|bash|bc|bconsole|bg|bzip2|cal|cat|cfdisk|chgrp|chkconfig|chmod|chown|chroot|cksum|clear|cmp|column|comm|composer|cp|cron|crontab|csplit|curl|cut|date|dc|dd|ddrescue|debootstrap|df|diff|diff3|dig|dir|dircolors|dirname|dirs|dmesg|du|egrep|eject|env|ethtool|expand|expect|expr|fdformat|fdisk|fg|fgrep|file|find|fmt|fold|format|free|fsck|ftp|fuser|gawk|git|gparted|grep|groupadd|groupdel|groupmod|groups|grub-mkconfig|gzip|halt|head|hg|history|host|hostname|htop|iconv|id|ifconfig|ifdown|ifup|import|install|ip|jobs|join|kill|killall|less|link|ln|locate|logname|logrotate|look|lpc|lpr|lprint|lprintd|lprintq|lprm|ls|lsof|lynx|make|man|mc|mdadm|mkconfig|mkdir|mke2fs|mkfifo|mkfs|mkisofs|mknod|mkswap|mmv|more|most|mount|mtools|mtr|mutt|mv|nano|nc|netstat|nice|nl|nohup|notify-send|npm|nslookup|op|open|parted|passwd|paste|pathchk|ping|pkill|pnpm|popd|pr|printcap|printenv|ps|pushd|pv|quota|quotacheck|quotactl|ram|rar|rcp|reboot|remsync|rename|renice|rev|rm|rmdir|rpm|rsync|scp|screen|sdiff|sed|sendmail|seq|service|sftp|sh|shellcheck|shuf|shutdown|sleep|slocate|sort|split|ssh|stat|strace|su|sudo|sum|suspend|swapon|sync|tac|tail|tar|tee|time|timeout|top|touch|tr|traceroute|tsort|tty|umount|uname|unexpand|uniq|units|unrar|unshar|unzip|update-grub|uptime|useradd|userdel|usermod|users|uudecode|uuencode|v|vdir|vi|vim|virsh|vmstat|wait|watch|wc|wget|whereis|which|who|whoami|write|xargs|xdg-open|yarn|yes|zenity|zip|zsh|zypper)(?=$|[)\s;|&])/,lookbehind:!0},keyword:{pattern:/(^|[\s;|&]|[<>]\()(?:if|then|else|elif|fi|for|while|in|case|esac|function|select|do|done|until)(?=$|[)\s;|&])/,lookbehind:!0},builtin:{pattern:/(^|[\s;|&]|[<>]\()(?:\.|:|break|cd|continue|eval|exec|exit|export|getopts|hash|pwd|readonly|return|shift|test|times|trap|umask|unset|alias|bind|builtin|caller|command|declare|echo|enable|help|let|local|logout|mapfile|printf|read|readarray|source|type|typeset|ulimit|unalias|set|shopt)(?=$|[)\s;|&])/,lookbehind:!0,alias:"class-name"},boolean:{pattern:/(^|[\s;|&]|[<>]\()(?:true|false)(?=$|[)\s;|&])/,lookbehind:!0},"file-descriptor":{pattern:/\B&\d\b/,alias:"important"},operator:{pattern:/\d?<>|>\||\+=|==?|!=?|=~|<<[<-]?|[&\d]?>>|\d?[<>]&?|&[>&]?|\|[&|]?|<=?|>=?/,inside:{"file-descriptor":{pattern:/^\d/,alias:"important"}}},punctuation:/\$?\(\(?|\)\)?|\.\.|[{}[\];\\]/,number:{pattern:/(^|\s)(?:[1-9]\d*|0)(?:[.,]\d+)?\b/,lookbehind:!0}};for(var a=["comment","function-name","for-or-select","assign-left","string","environment","function","keyword","builtin","boolean","file-descriptor","operator","punctuation","number"],r=n.variable[1].inside,s=0;s>=?|<<=?|->|([-+&|:])\1|[?:~]|[-+*/%&|^!=<>]=?/,number:/(?:\b0x(?:[\da-f]+\.?[\da-f]*|\.[\da-f]+)(?:p[+-]?\d+)?|(?:\b\d+\.?\d*|\B\.\d+)(?:e[+-]?\d+)?)[ful]*/i}),Prism.languages.insertBefore("c","string",{macro:{pattern:/(^\s*)#\s*[a-z]+(?:[^\r\n\\/]|\/(?!\*)|\/\*(?:[^*]|\*(?!\/))*\*\/|\\(?:\r\n|[\s\S]))*/im,lookbehind:!0,greedy:!0,alias:"property",inside:{string:[{pattern:/^(#\s*include\s*)<[^>]+>/,lookbehind:!0},Prism.languages.c.string],comment:Prism.languages.c.comment,directive:{pattern:/^(#\s*)[a-z]+/,lookbehind:!0,alias:"keyword"},"directive-hash":/^#/,punctuation:/##|\\(?=[\r\n])/,expression:{pattern:/\S[\s\S]*/,inside:Prism.languages.c}}},constant:/\b(?:__FILE__|__LINE__|__DATE__|__TIME__|__TIMESTAMP__|__func__|EOF|NULL|SEEK_CUR|SEEK_END|SEEK_SET|stdin|stdout|stderr)\b/}),delete Prism.languages.c.boolean;
    -!function(s){function a(e,s){return e.replace(/<<(\d+)>>/g,function(e,n){return"(?:"+s[+n]+")"})}function t(e,n,s){return RegExp(a(e,n),s||"")}function e(e,n){for(var s=0;s>/g,function(){return"(?:"+e+")"});return e.replace(/<>/g,"[^\\s\\S]")}var n="bool byte char decimal double dynamic float int long object sbyte short string uint ulong ushort var void",r="class enum interface struct",i="add alias and ascending async await by descending from get global group into join let nameof not notnull on or orderby partial remove select set unmanaged value when where where",o="abstract as base break case catch checked const continue default delegate do else event explicit extern finally fixed for foreach goto if implicit in internal is lock namespace new null operator out override params private protected public readonly ref return sealed sizeof stackalloc static switch this throw try typeof unchecked unsafe using virtual volatile while yield";function l(e){return"\\b(?:"+e.trim().replace(/ /g,"|")+")\\b"}var d=l(r),p=RegExp(l(n+" "+r+" "+i+" "+o)),c=l(r+" "+i+" "+o),u=l(n+" "+r+" "+o),g=e("<(?:[^<>;=+\\-*/%&|^]|<>)*>",2),b=e("\\((?:[^()]|<>)*\\)",2),h="@?\\b[A-Za-z_]\\w*\\b",f=a("<<0>>(?:\\s*<<1>>)?",[h,g]),m=a("(?!<<0>>)<<1>>(?:\\s*\\.\\s*<<1>>)*",[c,f]),k="\\[\\s*(?:,\\s*)*\\]",y=a("<<0>>(?:\\s*(?:\\?\\s*)?<<1>>)*(?:\\s*\\?)?",[m,k]),w=a("(?:<<0>>|<<1>>)(?:\\s*(?:\\?\\s*)?<<2>>)*(?:\\s*\\?)?",[a("\\(<<0>>+(?:,<<0>>+)+\\)",[a("[^,()<>[\\];=+\\-*/%&|^]|<<0>>|<<1>>|<<2>>",[g,b,k])]),m,k]),v={keyword:p,punctuation:/[<>()?,.:[\]]/},x="'(?:[^\r\n'\\\\]|\\\\.|\\\\[Uux][\\da-fA-F]{1,8})'",$='"(?:\\\\.|[^\\\\"\r\n])*"';s.languages.csharp=s.languages.extend("clike",{string:[{pattern:t("(^|[^$\\\\])<<0>>",['@"(?:""|\\\\[^]|[^\\\\"])*"(?!")']),lookbehind:!0,greedy:!0},{pattern:t("(^|[^@$\\\\])<<0>>",[$]),lookbehind:!0,greedy:!0},{pattern:RegExp(x),greedy:!0,alias:"character"}],"class-name":[{pattern:t("(\\busing\\s+static\\s+)<<0>>(?=\\s*;)",[m]),lookbehind:!0,inside:v},{pattern:t("(\\busing\\s+<<0>>\\s*=\\s*)<<1>>(?=\\s*;)",[h,w]),lookbehind:!0,inside:v},{pattern:t("(\\busing\\s+)<<0>>(?=\\s*=)",[h]),lookbehind:!0},{pattern:t("(\\b<<0>>\\s+)<<1>>",[d,f]),lookbehind:!0,inside:v},{pattern:t("(\\bcatch\\s*\\(\\s*)<<0>>",[m]),lookbehind:!0,inside:v},{pattern:t("(\\bwhere\\s+)<<0>>",[h]),lookbehind:!0},{pattern:t("(\\b(?:is(?:\\s+not)?|as)\\s+)<<0>>",[y]),lookbehind:!0,inside:v},{pattern:t("\\b<<0>>(?=\\s+(?!<<1>>)<<2>>(?:\\s*[=,;:{)\\]]|\\s+(?:in|when)\\b))",[w,u,h]),inside:v}],keyword:p,number:/(?:\b0(?:x[\da-f_]*[\da-f]|b[01_]*[01])|(?:\B\.\d+(?:_+\d+)*|\b\d+(?:_+\d+)*(?:\.\d+(?:_+\d+)*)?)(?:e[-+]?\d+(?:_+\d+)*)?)(?:ul|lu|[dflmu])?\b/i,operator:/>>=?|<<=?|[-=]>|([-+&|])\1|~|\?\?=?|[-+*/%&|^!=<>]=?/,punctuation:/\?\.?|::|[{}[\];(),.:]/}),s.languages.insertBefore("csharp","number",{range:{pattern:/\.\./,alias:"operator"}}),s.languages.insertBefore("csharp","punctuation",{"named-parameter":{pattern:t("([(,]\\s*)<<0>>(?=\\s*:)",[h]),lookbehind:!0,alias:"punctuation"}}),s.languages.insertBefore("csharp","class-name",{namespace:{pattern:t("(\\b(?:namespace|using)\\s+)<<0>>(?:\\s*\\.\\s*<<0>>)*(?=\\s*[;{])",[h]),lookbehind:!0,inside:{punctuation:/\./}},"type-expression":{pattern:t("(\\b(?:default|typeof|sizeof)\\s*\\(\\s*)(?:[^()\\s]|\\s(?!\\s*\\))|<<0>>)*(?=\\s*\\))",[b]),lookbehind:!0,alias:"class-name",inside:v},"return-type":{pattern:t("<<0>>(?=\\s+(?:<<1>>\\s*(?:=>|[({]|\\.\\s*this\\s*\\[)|this\\s*\\[))",[w,m]),inside:v,alias:"class-name"},"constructor-invocation":{pattern:t("(\\bnew\\s+)<<0>>(?=\\s*[[({])",[w]),lookbehind:!0,inside:v,alias:"class-name"},"generic-method":{pattern:t("<<0>>\\s*<<1>>(?=\\s*\\()",[h,g]),inside:{function:t("^<<0>>",[h]),generic:{pattern:RegExp(g),alias:"class-name",inside:v}}},"type-list":{pattern:t("\\b((?:<<0>>\\s+<<1>>|where\\s+<<2>>)\\s*:\\s*)(?:<<3>>|<<4>>)(?:\\s*,\\s*(?:<<3>>|<<4>>))*(?=\\s*(?:where|[{;]|=>|$))",[d,f,h,w,p.source]),lookbehind:!0,inside:{keyword:p,"class-name":{pattern:RegExp(w),greedy:!0,inside:v},punctuation:/,/}},preprocessor:{pattern:/(^\s*)#.*/m,lookbehind:!0,alias:"property",inside:{directive:{pattern:/(\s*#)\b(?:define|elif|else|endif|endregion|error|if|line|pragma|region|undef|warning)\b/,lookbehind:!0,alias:"keyword"}}}});var _=$+"|"+x,B=a("/(?![*/])|//[^\r\n]*[\r\n]|/\\*(?:[^*]|\\*(?!/))*\\*/|<<0>>",[_]),E=e(a("[^\"'/()]|<<0>>|\\(<>*\\)",[B]),2),R="\\b(?:assembly|event|field|method|module|param|property|return|type)\\b",P=a("<<0>>(?:\\s*\\(<<1>>*\\))?",[m,E]);s.languages.insertBefore("csharp","class-name",{attribute:{pattern:t("((?:^|[^\\s\\w>)?])\\s*\\[\\s*)(?:<<0>>\\s*:\\s*)?<<1>>(?:\\s*,\\s*<<1>>)*(?=\\s*\\])",[R,P]),lookbehind:!0,greedy:!0,inside:{target:{pattern:t("^<<0>>(?=\\s*:)",[R]),alias:"keyword"},"attribute-arguments":{pattern:t("\\(<<0>>*\\)",[E]),inside:s.languages.csharp},"class-name":{pattern:RegExp(m),inside:{punctuation:/\./}},punctuation:/[:,]/}}});var z=":[^}\r\n]+",S=e(a("[^\"'/()]|<<0>>|\\(<>*\\)",[B]),2),j=a("\\{(?!\\{)(?:(?![}:])<<0>>)*<<1>>?\\}",[S,z]),A=e(a("[^\"'/()]|/(?!\\*)|/\\*(?:[^*]|\\*(?!/))*\\*/|<<0>>|\\(<>*\\)",[_]),2),F=a("\\{(?!\\{)(?:(?![}:])<<0>>)*<<1>>?\\}",[A,z]);function U(e,n){return{interpolation:{pattern:t("((?:^|[^{])(?:\\{\\{)*)<<0>>",[e]),lookbehind:!0,inside:{"format-string":{pattern:t("(^\\{(?:(?![}:])<<0>>)*)<<1>>(?=\\}$)",[n,z]),lookbehind:!0,inside:{punctuation:/^:/}},punctuation:/^\{|\}$/,expression:{pattern:/[\s\S]+/,alias:"language-csharp",inside:s.languages.csharp}}},string:/[\s\S]+/}}s.languages.insertBefore("csharp","string",{"interpolation-string":[{pattern:t('(^|[^\\\\])(?:\\$@|@\\$)"(?:""|\\\\[^]|\\{\\{|<<0>>|[^\\\\{"])*"',[j]),lookbehind:!0,greedy:!0,inside:U(j,S)},{pattern:t('(^|[^@\\\\])\\$"(?:\\\\.|\\{\\{|<<0>>|[^\\\\"{])*"',[F]),lookbehind:!0,greedy:!0,inside:U(F,A)}]})}(Prism),Prism.languages.dotnet=Prism.languages.cs=Prism.languages.csharp;
    -!function(e){var t=/\b(?:alignas|alignof|asm|auto|bool|break|case|catch|char|char8_t|char16_t|char32_t|class|compl|concept|const|consteval|constexpr|constinit|const_cast|continue|co_await|co_return|co_yield|decltype|default|delete|do|double|dynamic_cast|else|enum|explicit|export|extern|float|for|friend|goto|if|inline|int|int8_t|int16_t|int32_t|int64_t|uint8_t|uint16_t|uint32_t|uint64_t|long|mutable|namespace|new|noexcept|nullptr|operator|private|protected|public|register|reinterpret_cast|requires|return|short|signed|sizeof|static|static_assert|static_cast|struct|switch|template|this|thread_local|throw|try|typedef|typeid|typename|union|unsigned|using|virtual|void|volatile|wchar_t|while)\b/;e.languages.cpp=e.languages.extend("c",{"class-name":[{pattern:RegExp("(\\b(?:class|concept|enum|struct|typename)\\s+)(?!)\\w+".replace(//g,function(){return t.source})),lookbehind:!0},/\b[A-Z]\w*(?=\s*::\s*\w+\s*\()/,/\b[A-Z_]\w*(?=\s*::\s*~\w+\s*\()/i,/\w+(?=\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>\s*::\s*\w+\s*\()/],keyword:t,number:{pattern:/(?:\b0b[01']+|\b0x(?:[\da-f']+\.?[\da-f']*|\.[\da-f']+)(?:p[+-]?[\d']+)?|(?:\b[\d']+\.?[\d']*|\B\.[\d']+)(?:e[+-]?[\d']+)?)[ful]*/i,greedy:!0},operator:/>>=?|<<=?|->|([-+&|:])\1|[?:~]|<=>|[-+*/%&|^!=<>]=?|\b(?:and|and_eq|bitand|bitor|not|not_eq|or|or_eq|xor|xor_eq)\b/,boolean:/\b(?:true|false)\b/}),e.languages.insertBefore("cpp","string",{"raw-string":{pattern:/R"([^()\\ ]{0,16})\([\s\S]*?\)\1"/,alias:"string",greedy:!0}}),e.languages.insertBefore("cpp","class-name",{"base-clause":{pattern:/(\b(?:class|struct)\s+\w+\s*:\s*)(?:[^;{}"'])+?(?=\s*[;{])/,lookbehind:!0,greedy:!0,inside:e.languages.extend("cpp",{})}}),e.languages.insertBefore("inside","operator",{"class-name":/\b[a-z_]\w*\b(?!\s*::)/i},e.languages.cpp["base-clause"])}(Prism);
    -Prism.languages.go=Prism.languages.extend("clike",{keyword:/\b(?:break|case|chan|const|continue|default|defer|else|fallthrough|for|func|go(?:to)?|if|import|interface|map|package|range|return|select|struct|switch|type|var)\b/,builtin:/\b(?:bool|byte|complex(?:64|128)|error|float(?:32|64)|rune|string|u?int(?:8|16|32|64)?|uintptr|append|cap|close|complex|copy|delete|imag|len|make|new|panic|print(?:ln)?|real|recover)\b/,boolean:/\b(?:_|iota|nil|true|false)\b/,operator:/[*\/%^!=]=?|\+[=+]?|-[=-]?|\|[=|]?|&(?:=|&|\^=?)?|>(?:>=?|=)?|<(?:<=?|=|-)?|:=|\.\.\./,number:/(?:\b0x[a-f\d]+|(?:\b\d+\.?\d*|\B\.\d+)(?:e[-+]?\d+)?)i?/i,string:{pattern:/(["'`])(?:\\[\s\S]|(?!\1)[^\\])*\1/,greedy:!0}}),delete Prism.languages.go["class-name"];
    -!function(e){var t=/\b(?:abstract|assert|boolean|break|byte|case|catch|char|class|const|continue|default|do|double|else|enum|exports|extends|final|finally|float|for|goto|if|implements|import|instanceof|int|interface|long|module|native|new|null|open|opens|package|private|protected|provides|public|record|requires|return|short|static|strictfp|super|switch|synchronized|this|throw|throws|to|transient|transitive|try|uses|var|void|volatile|while|with|yield)\b/,a=/\b[A-Z](?:\w*[a-z]\w*)?\b/;e.languages.java=e.languages.extend("clike",{"class-name":[a,/\b[A-Z]\w*(?=\s+\w+\s*[;,=())])/],keyword:t,function:[e.languages.clike.function,{pattern:/(\:\:)[a-z_]\w*/,lookbehind:!0}],number:/\b0b[01][01_]*L?\b|\b0x[\da-f_]*\.?[\da-f_p+-]+\b|(?:\b\d[\d_]*\.?[\d_]*|\B\.\d[\d_]*)(?:e[+-]?\d[\d_]*)?[dfl]?/i,operator:{pattern:/(^|[^.])(?:<<=?|>>>?=?|->|--|\+\+|&&|\|\||::|[?:~]|[-+*/%&|^!=<>]=?)/m,lookbehind:!0}}),e.languages.insertBefore("java","string",{"triple-quoted-string":{pattern:/"""[ \t]*[\r\n](?:(?:"|"")?(?:\\.|[^"\\]))*"""/,greedy:!0,alias:"string"}}),e.languages.insertBefore("java","class-name",{annotation:{alias:"punctuation",pattern:/(^|[^.])@\w+/,lookbehind:!0},namespace:{pattern:RegExp("(\\b(?:exports|import(?:\\s+static)?|module|open|opens|package|provides|requires|to|transitive|uses|with)\\s+)(?!)[a-z]\\w*(?:\\.[a-z]\\w*)*\\.?".replace(//g,function(){return t.source})),lookbehind:!0,inside:{punctuation:/\./}},generics:{pattern:/<(?:[\w\s,.&?]|<(?:[\w\s,.&?]|<(?:[\w\s,.&?]|<[\w\s,.&?]*>)*>)*>)*>/,inside:{"class-name":a,keyword:t,punctuation:/[<>(),.:]/,operator:/[?&|]/}}})}(Prism);
    -!function(d){function n(n){return n=n.replace(//g,function(){return"(?:\\\\.|[^\\\\\n\r]|(?:\n|\r\n?)(?!\n|\r\n?))"}),RegExp("((?:^|[^\\\\])(?:\\\\{2})*)(?:"+n+")")}var e="(?:\\\\.|``(?:[^`\r\n]|`(?!`))+``|`[^`\r\n]+`|[^\\\\|\r\n`])+",t="\\|?__(?:\\|__)+\\|?(?:(?:\n|\r\n?)|$)".replace(/__/g,function(){return e}),a="\\|?[ \t]*:?-{3,}:?[ \t]*(?:\\|[ \t]*:?-{3,}:?[ \t]*)+\\|?(?:\n|\r\n?)";d.languages.markdown=d.languages.extend("markup",{}),d.languages.insertBefore("markdown","prolog",{blockquote:{pattern:/^>(?:[\t ]*>)*/m,alias:"punctuation"},table:{pattern:RegExp("^"+t+a+"(?:"+t+")*","m"),inside:{"table-data-rows":{pattern:RegExp("^("+t+a+")(?:"+t+")*$"),lookbehind:!0,inside:{"table-data":{pattern:RegExp(e),inside:d.languages.markdown},punctuation:/\|/}},"table-line":{pattern:RegExp("^("+t+")"+a+"$"),lookbehind:!0,inside:{punctuation:/\||:?-{3,}:?/}},"table-header-row":{pattern:RegExp("^"+t+"$"),inside:{"table-header":{pattern:RegExp(e),alias:"important",inside:d.languages.markdown},punctuation:/\|/}}}},code:[{pattern:/((?:^|\n)[ \t]*\n|(?:^|\r\n?)[ \t]*\r\n?)(?: {4}|\t).+(?:(?:\n|\r\n?)(?: {4}|\t).+)*/,lookbehind:!0,alias:"keyword"},{pattern:/``.+?``|`[^`\r\n]+`/,alias:"keyword"},{pattern:/^```[\s\S]*?^```$/m,greedy:!0,inside:{"code-block":{pattern:/^(```.*(?:\n|\r\n?))[\s\S]+?(?=(?:\n|\r\n?)^```$)/m,lookbehind:!0},"code-language":{pattern:/^(```).+/,lookbehind:!0},punctuation:/```/}}],title:[{pattern:/\S.*(?:\n|\r\n?)(?:==+|--+)(?=[ \t]*$)/m,alias:"important",inside:{punctuation:/==+$|--+$/}},{pattern:/(^\s*)#+.+/m,lookbehind:!0,alias:"important",inside:{punctuation:/^#+|#+$/}}],hr:{pattern:/(^\s*)([*-])(?:[\t ]*\2){2,}(?=\s*$)/m,lookbehind:!0,alias:"punctuation"},list:{pattern:/(^\s*)(?:[*+-]|\d+\.)(?=[\t ].)/m,lookbehind:!0,alias:"punctuation"},"url-reference":{pattern:/!?\[[^\]]+\]:[\t ]+(?:\S+|<(?:\\.|[^>\\])+>)(?:[\t ]+(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\)))?/,inside:{variable:{pattern:/^(!?\[)[^\]]+/,lookbehind:!0},string:/(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\))$/,punctuation:/^[\[\]!:]|[<>]/},alias:"url"},bold:{pattern:n("\\b__(?:(?!_)|_(?:(?!_))+_)+__\\b|\\*\\*(?:(?!\\*)|\\*(?:(?!\\*))+\\*)+\\*\\*"),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^..)[\s\S]+(?=..$)/,lookbehind:!0,inside:{}},punctuation:/\*\*|__/}},italic:{pattern:n("\\b_(?:(?!_)|__(?:(?!_))+__)+_\\b|\\*(?:(?!\\*)|\\*\\*(?:(?!\\*))+\\*\\*)+\\*"),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^.)[\s\S]+(?=.$)/,lookbehind:!0,inside:{}},punctuation:/[*_]/}},strike:{pattern:n("(~~?)(?:(?!~))+?\\2"),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^~~?)[\s\S]+(?=\1$)/,lookbehind:!0,inside:{}},punctuation:/~~?/}},url:{pattern:n('!?\\[(?:(?!\\]))+\\](?:\\([^\\s)]+(?:[\t ]+"(?:\\\\.|[^"\\\\])*")?\\)| ?\\[(?:(?!\\]))+\\])'),lookbehind:!0,greedy:!0,inside:{variable:{pattern:/(\[)[^\]]+(?=\]$)/,lookbehind:!0},content:{pattern:/(^!?\[)[^\]]+(?=\])/,lookbehind:!0,inside:{}},string:{pattern:/"(?:\\.|[^"\\])*"(?=\)$)/}}}}),["url","bold","italic","strike"].forEach(function(e){["url","bold","italic","strike"].forEach(function(n){e!==n&&(d.languages.markdown[e].inside.content.inside[n]=d.languages.markdown[n])})}),d.hooks.add("after-tokenize",function(n){"markdown"!==n.language&&"md"!==n.language||!function n(e){if(e&&"string"!=typeof e)for(var t=0,a=e.length;t]?|>[=>]?|[&|^~]/,punctuation:/[{}[\];(),.:]/},Prism.languages.python["string-interpolation"].inside.interpolation.inside.rest=Prism.languages.python,Prism.languages.py=Prism.languages.python;
    -Prism.languages.scss=Prism.languages.extend("css",{comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0},atrule:{pattern:/@[\w-]+(?:\([^()]+\)|[^(])*?(?=\s+[{;])/,inside:{rule:/@[\w-]+/}},url:/(?:[-a-z]+-)?url(?=\()/i,selector:{pattern:/(?=\S)[^@;{}()]?(?:[^@;{}()]|#\{\$[-\w]+\})+(?=\s*\{(?:\}|\s|[^}]+[:{][^}]+))/m,inside:{parent:{pattern:/&/,alias:"important"},placeholder:/%[-\w]+/,variable:/\$[-\w]+|#\{\$[-\w]+\}/}},property:{pattern:/(?:[\w-]|\$[-\w]+|#\{\$[-\w]+\})+(?=\s*:)/,inside:{variable:/\$[-\w]+|#\{\$[-\w]+\}/}}}),Prism.languages.insertBefore("scss","atrule",{keyword:[/@(?:if|else(?: if)?|for|each|while|import|extend|debug|warn|mixin|include|function|return|content)/i,{pattern:/( +)(?:from|through)(?= )/,lookbehind:!0}]}),Prism.languages.insertBefore("scss","important",{variable:/\$[-\w]+|#\{\$[-\w]+\}/}),Prism.languages.insertBefore("scss","function",{placeholder:{pattern:/%[-\w]+/,alias:"selector"},statement:{pattern:/\B!(?:default|optional)\b/i,alias:"keyword"},boolean:/\b(?:true|false)\b/,null:{pattern:/\bnull\b/,alias:"keyword"},operator:{pattern:/(\s)(?:[-+*\/%]|[=!]=|<=?|>=?|and|or|not)(?=\s)/,lookbehind:!0}}),Prism.languages.scss.atrule.inside.rest=Prism.languages.scss;
    -Prism.languages.sql={comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|(?:--|\/\/|#).*)/,lookbehind:!0},variable:[{pattern:/@(["'`])(?:\\[\s\S]|(?!\1)[^\\])+\1/,greedy:!0},/@[\w.$]+/],string:{pattern:/(^|[^@\\])("|')(?:\\[\s\S]|(?!\2)[^\\]|\2\2)*\2/,greedy:!0,lookbehind:!0},function:/\b(?:AVG|COUNT|FIRST|FORMAT|LAST|LCASE|LEN|MAX|MID|MIN|MOD|NOW|ROUND|SUM|UCASE)(?=\s*\()/i,keyword:/\b(?:ACTION|ADD|AFTER|ALGORITHM|ALL|ALTER|ANALYZE|ANY|APPLY|AS|ASC|AUTHORIZATION|AUTO_INCREMENT|BACKUP|BDB|BEGIN|BERKELEYDB|BIGINT|BINARY|BIT|BLOB|BOOL|BOOLEAN|BREAK|BROWSE|BTREE|BULK|BY|CALL|CASCADED?|CASE|CHAIN|CHAR(?:ACTER|SET)?|CHECK(?:POINT)?|CLOSE|CLUSTERED|COALESCE|COLLATE|COLUMNS?|COMMENT|COMMIT(?:TED)?|COMPUTE|CONNECT|CONSISTENT|CONSTRAINT|CONTAINS(?:TABLE)?|CONTINUE|CONVERT|CREATE|CROSS|CURRENT(?:_DATE|_TIME|_TIMESTAMP|_USER)?|CURSOR|CYCLE|DATA(?:BASES?)?|DATE(?:TIME)?|DAY|DBCC|DEALLOCATE|DEC|DECIMAL|DECLARE|DEFAULT|DEFINER|DELAYED|DELETE|DELIMITERS?|DENY|DESC|DESCRIBE|DETERMINISTIC|DISABLE|DISCARD|DISK|DISTINCT|DISTINCTROW|DISTRIBUTED|DO|DOUBLE|DROP|DUMMY|DUMP(?:FILE)?|DUPLICATE|ELSE(?:IF)?|ENABLE|ENCLOSED|END|ENGINE|ENUM|ERRLVL|ERRORS|ESCAPED?|EXCEPT|EXEC(?:UTE)?|EXISTS|EXIT|EXPLAIN|EXTENDED|FETCH|FIELDS|FILE|FILLFACTOR|FIRST|FIXED|FLOAT|FOLLOWING|FOR(?: EACH ROW)?|FORCE|FOREIGN|FREETEXT(?:TABLE)?|FROM|FULL|FUNCTION|GEOMETRY(?:COLLECTION)?|GLOBAL|GOTO|GRANT|GROUP|HANDLER|HASH|HAVING|HOLDLOCK|HOUR|IDENTITY(?:_INSERT|COL)?|IF|IGNORE|IMPORT|INDEX|INFILE|INNER|INNODB|INOUT|INSERT|INT|INTEGER|INTERSECT|INTERVAL|INTO|INVOKER|ISOLATION|ITERATE|JOIN|KEYS?|KILL|LANGUAGE|LAST|LEAVE|LEFT|LEVEL|LIMIT|LINENO|LINES|LINESTRING|LOAD|LOCAL|LOCK|LONG(?:BLOB|TEXT)|LOOP|MATCH(?:ED)?|MEDIUM(?:BLOB|INT|TEXT)|MERGE|MIDDLEINT|MINUTE|MODE|MODIFIES|MODIFY|MONTH|MULTI(?:LINESTRING|POINT|POLYGON)|NATIONAL|NATURAL|NCHAR|NEXT|NO|NONCLUSTERED|NULLIF|NUMERIC|OFF?|OFFSETS?|ON|OPEN(?:DATASOURCE|QUERY|ROWSET)?|OPTIMIZE|OPTION(?:ALLY)?|ORDER|OUT(?:ER|FILE)?|OVER|PARTIAL|PARTITION|PERCENT|PIVOT|PLAN|POINT|POLYGON|PRECEDING|PRECISION|PREPARE|PREV|PRIMARY|PRINT|PRIVILEGES|PROC(?:EDURE)?|PUBLIC|PURGE|QUICK|RAISERROR|READS?|REAL|RECONFIGURE|REFERENCES|RELEASE|RENAME|REPEAT(?:ABLE)?|REPLACE|REPLICATION|REQUIRE|RESIGNAL|RESTORE|RESTRICT|RETURN(?:S|ING)?|REVOKE|RIGHT|ROLLBACK|ROUTINE|ROW(?:COUNT|GUIDCOL|S)?|RTREE|RULE|SAVE(?:POINT)?|SCHEMA|SECOND|SELECT|SERIAL(?:IZABLE)?|SESSION(?:_USER)?|SET(?:USER)?|SHARE|SHOW|SHUTDOWN|SIMPLE|SMALLINT|SNAPSHOT|SOME|SONAME|SQL|START(?:ING)?|STATISTICS|STATUS|STRIPED|SYSTEM_USER|TABLES?|TABLESPACE|TEMP(?:ORARY|TABLE)?|TERMINATED|TEXT(?:SIZE)?|THEN|TIME(?:STAMP)?|TINY(?:BLOB|INT|TEXT)|TOP?|TRAN(?:SACTIONS?)?|TRIGGER|TRUNCATE|TSEQUAL|TYPES?|UNBOUNDED|UNCOMMITTED|UNDEFINED|UNION|UNIQUE|UNLOCK|UNPIVOT|UNSIGNED|UPDATE(?:TEXT)?|USAGE|USE|USER|USING|VALUES?|VAR(?:BINARY|CHAR|CHARACTER|YING)|VIEW|WAITFOR|WARNINGS|WHEN|WHERE|WHILE|WITH(?: ROLLUP|IN)?|WORK|WRITE(?:TEXT)?|YEAR)\b/i,boolean:/\b(?:TRUE|FALSE|NULL)\b/i,number:/\b0x[\da-f]+\b|\b\d+\.?\d*|\B\.\d+\b/i,operator:/[-+*\/=%^~]|&&?|\|\|?|!=?|<(?:=>?|<|>)?|>[>=]?|\b(?:AND|BETWEEN|IN|LIKE|NOT|OR|IS|DIV|REGEXP|RLIKE|SOUNDS LIKE|XOR)\b/i,punctuation:/[;[\]()`,.]/};
    -!function(e){function n(e){return e.replace(/__/g,function(){return"(?:[\\w-]+|'[^'\n\r]*'|\"(?:\\\\.|[^\\\\\"\r\n])*\")"})}e.languages.toml={comment:{pattern:/#.*/,greedy:!0},table:{pattern:RegExp(n("(^\\s*\\[\\s*(?:\\[\\s*)?)__(?:\\s*\\.\\s*__)*(?=\\s*\\])"),"m"),lookbehind:!0,greedy:!0,alias:"class-name"},key:{pattern:RegExp(n("(^\\s*|[{,]\\s*)__(?:\\s*\\.\\s*__)*(?=\\s*=)"),"m"),lookbehind:!0,greedy:!0,alias:"property"},string:{pattern:/"""(?:\\[\s\S]|[^\\])*?"""|'''[\s\S]*?'''|'[^'\n\r]*'|"(?:\\.|[^\\"\r\n])*"/,greedy:!0},date:[{pattern:/\b\d{4}-\d{2}-\d{2}(?:[T\s]\d{2}:\d{2}:\d{2}(?:\.\d+)?(?:Z|[+-]\d{2}:\d{2})?)?\b/i,alias:"number"},{pattern:/\b\d{2}:\d{2}:\d{2}(?:\.\d+)?\b/,alias:"number"}],number:/(?:\b0(?:x[\da-zA-Z]+(?:_[\da-zA-Z]+)*|o[0-7]+(?:_[0-7]+)*|b[10]+(?:_[10]+)*))\b|[-+]?\b\d+(?:_\d+)*(?:\.\d+(?:_\d+)*)?(?:[eE][+-]?\d+(?:_\d+)*)?\b|[-+]?\b(?:inf|nan)\b/,boolean:/\b(?:true|false)\b/,punctuation:/[.,=[\]{}]/}}(Prism);
    -!function(n){var t=/[*&][^\s[\]{},]+/,e=/!(?:<[\w\-%#;/?:@&=+$,.!~*'()[\]]+>|(?:[a-zA-Z\d-]*!)?[\w\-%#;/?:@&=+$.~*'()]+)?/,r="(?:"+e.source+"(?:[ \t]+"+t.source+")?|"+t.source+"(?:[ \t]+"+e.source+")?)";function a(n,t){t=(t||"").replace(/m/g,"")+"m";var e="([:\\-,[{]\\s*(?:\\s<>[ \t]+)?)(?:<>)(?=[ \t]*(?:$|,|]|}|\\s*#))".replace(/<>/g,function(){return r}).replace(/<>/g,function(){return n});return RegExp(e,t)}n.languages.yaml={scalar:{pattern:RegExp("([\\-:]\\s*(?:\\s<>[ \t]+)?[|>])[ \t]*(?:((?:\r?\n|\r)[ \t]+)[^\r\n]+(?:\\2[^\r\n]+)*)".replace(/<>/g,function(){return r})),lookbehind:!0,alias:"string"},comment:/#.*/,key:{pattern:RegExp("((?:^|[:\\-,[{\r\n?])[ \t]*(?:<>[ \t]+)?)[^\r\n{[\\]},#\\s]+?(?=\\s*:\\s)".replace(/<>/g,function(){return r})),lookbehind:!0,alias:"atrule"},directive:{pattern:/(^[ \t]*)%.+/m,lookbehind:!0,alias:"important"},datetime:{pattern:a("\\d{4}-\\d\\d?-\\d\\d?(?:[tT]|[ \t]+)\\d\\d?:\\d{2}:\\d{2}(?:\\.\\d*)?[ \t]*(?:Z|[-+]\\d\\d?(?::\\d{2})?)?|\\d{4}-\\d{2}-\\d{2}|\\d\\d?:\\d{2}(?::\\d{2}(?:\\.\\d*)?)?"),lookbehind:!0,alias:"number"},boolean:{pattern:a("true|false","i"),lookbehind:!0,alias:"important"},null:{pattern:a("null|~","i"),lookbehind:!0,alias:"important"},string:{pattern:a("(\"|')(?:(?!\\2)[^\\\\\r\n]|\\\\.)*\\2"),lookbehind:!0,greedy:!0},number:{pattern:a("[+-]?(?:0x[\\da-f]+|0o[0-7]+|(?:\\d+\\.?\\d*|\\.?\\d+)(?:e[+-]?\\d+)?|\\.inf|\\.nan)","i"),lookbehind:!0},tag:e,important:t,punctuation:/---|[:[\]{}\-,|>?]|\.\.\./},n.languages.yml=n.languages.yaml}(Prism);
    -!function(){if("undefined"!=typeof self&&self.Prism&&self.document){var i=[],l={},c=function(){};Prism.plugins.toolbar={};var e=Prism.plugins.toolbar.registerButton=function(e,n){var t;t="function"==typeof n?n:function(e){var t;return"function"==typeof n.onClick?((t=document.createElement("button")).type="button",t.addEventListener("click",function(){n.onClick.call(this,e)})):"string"==typeof n.url?(t=document.createElement("a")).href=n.url:t=document.createElement("span"),n.className&&t.classList.add(n.className),t.textContent=n.text,t},e in l?console.warn('There is a button with the key "'+e+'" registered already.'):i.push(l[e]=t)},t=Prism.plugins.toolbar.hook=function(a){var e=a.element.parentNode;if(e&&/pre/i.test(e.nodeName)&&!e.parentNode.classList.contains("code-toolbar")){var t=document.createElement("div");t.classList.add("code-toolbar"),e.parentNode.insertBefore(t,e),t.appendChild(e);var r=document.createElement("div");r.classList.add("toolbar");var n=i,o=function(e){for(;e;){var t=e.getAttribute("data-toolbar-order");if(null!=t)return(t=t.trim()).length?t.split(/\s*,\s*/g):[];e=e.parentElement}}(a.element);o&&(n=o.map(function(e){return l[e]||c})),n.forEach(function(e){var t=e(a);if(t){var n=document.createElement("div");n.classList.add("toolbar-item"),n.appendChild(t),r.appendChild(n)}}),t.appendChild(r)}};e("label",function(e){var t=e.element.parentNode;if(t&&/pre/i.test(t.nodeName)&&t.hasAttribute("data-label")){var n,a,r=t.getAttribute("data-label");try{a=document.querySelector("template#"+r)}catch(e){}return a?n=a.content:(t.hasAttribute("data-url")?(n=document.createElement("a")).href=t.getAttribute("data-url"):n=document.createElement("span"),n.textContent=r),n}}),Prism.hooks.add("complete",t)}}();
    -!function(){if("undefined"!=typeof self&&self.Prism&&self.document)if(Prism.plugins.toolbar){var i=window.ClipboardJS||void 0;i||"function"!=typeof require||(i=require("clipboard"));var c=[];if(!i){var o=document.createElement("script"),t=document.querySelector("head");o.onload=function(){if(i=window.ClipboardJS)for(;c.length;)c.pop()()},o.src="https://cdnjs.cloudflare.com/ajax/libs/clipboard.js/2.0.0/clipboard.min.js",t.appendChild(o)}Prism.plugins.toolbar.registerButton("copy-to-clipboard",function(o){var t=document.createElement("button");t.textContent="Copy";var e=o.element;return i?n():c.push(n),t;function n(){var o=new i(t,{text:function(){return e.textContent}});o.on("success",function(){t.textContent="Copied!",r()}),o.on("error",function(){t.textContent="Press Ctrl+C to copy",r()})}function r(){setTimeout(function(){t.textContent="Copy"},5e3)}})}else console.warn("Copy to Clipboard plugin loaded before Toolbar plugin.")}();
    +var _self="undefined"!=typeof window?window:"undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?self:{},Prism=function(e){var n=/(?:^|\s)lang(?:uage)?-([\w-]+)(?=\s|$)/i,t=0,r={},a={manual:e.Prism&&e.Prism.manual,disableWorkerMessageHandler:e.Prism&&e.Prism.disableWorkerMessageHandler,util:{encode:function e(n){return n instanceof i?new i(n.type,e(n.content),n.alias):Array.isArray(n)?n.map(e):n.replace(/&/g,"&").replace(/=g.reach);A+=w.value.length,w=w.next){var E=w.value;if(n.length>e.length)return;if(!(E instanceof i)){var P,L=1;if(y){if(!(P=l(b,A,e,m))||P.index>=e.length)break;var S=P.index,O=P.index+P[0].length,j=A;for(j+=w.value.length;S>=j;)j+=(w=w.next).value.length;if(A=j-=w.value.length,w.value instanceof i)continue;for(var C=w;C!==n.tail&&(jg.reach&&(g.reach=W);var z=w.prev;if(_&&(z=u(n,z,_),A+=_.length),c(n,z,L),w=u(n,z,new i(f,p?a.tokenize(N,p):N,k,N)),M&&u(n,w,M),L>1){var I={cause:f+","+d,reach:W};o(e,n,t,w.prev,A,I),g&&I.reach>g.reach&&(g.reach=I.reach)}}}}}}function s(){var e={value:null,prev:null,next:null},n={value:null,prev:e,next:null};e.next=n,this.head=e,this.tail=n,this.length=0}function u(e,n,t){var r=n.next,a={value:t,prev:n,next:r};return n.next=a,r.prev=a,e.length++,a}function c(e,n,t){for(var r=n.next,a=0;a"+i.content+""},!e.document)return e.addEventListener?(a.disableWorkerMessageHandler||e.addEventListener("message",(function(n){var t=JSON.parse(n.data),r=t.language,i=t.code,l=t.immediateClose;e.postMessage(a.highlight(i,a.languages[r],r)),l&&e.close()}),!1),a):a;var g=a.util.currentScript();function f(){a.manual||a.highlightAll()}if(g&&(a.filename=g.src,g.hasAttribute("data-manual")&&(a.manual=!0)),!a.manual){var h=document.readyState;"loading"===h||"interactive"===h&&g&&g.defer?document.addEventListener("DOMContentLoaded",f):window.requestAnimationFrame?window.requestAnimationFrame(f):window.setTimeout(f,16)}return a}(_self);"undefined"!=typeof module&&module.exports&&(module.exports=Prism),"undefined"!=typeof global&&(global.Prism=Prism);
    +Prism.languages.markup={comment:{pattern://,greedy:!0},prolog:{pattern:/<\?[\s\S]+?\?>/,greedy:!0},doctype:{pattern:/"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|)*\]\s*)?>/i,greedy:!0,inside:{"internal-subset":{pattern:/(^[^\[]*\[)[\s\S]+(?=\]>$)/,lookbehind:!0,greedy:!0,inside:null},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},punctuation:/^$|[[\]]/,"doctype-tag":/^DOCTYPE/i,name:/[^\s<>'"]+/}},cdata:{pattern://i,greedy:!0},tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"special-attr":[],"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,inside:{punctuation:[{pattern:/^=/,alias:"attr-equals"},{pattern:/^(\s*)["']|["']$/,lookbehind:!0}]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:[{pattern:/&[\da-z]{1,8};/i,alias:"named-entity"},/&#x?[\da-f]{1,8};/i]},Prism.languages.markup.tag.inside["attr-value"].inside.entity=Prism.languages.markup.entity,Prism.languages.markup.doctype.inside["internal-subset"].inside=Prism.languages.markup,Prism.hooks.add("wrap",(function(a){"entity"===a.type&&(a.attributes.title=a.content.replace(/&/,"&"))})),Object.defineProperty(Prism.languages.markup.tag,"addInlined",{value:function(a,e){var s={};s["language-"+e]={pattern:/(^$)/i,lookbehind:!0,inside:Prism.languages[e]},s.cdata=/^$/i;var t={"included-cdata":{pattern://i,inside:s}};t["language-"+e]={pattern:/[\s\S]+/,inside:Prism.languages[e]};var n={};n[a]={pattern:RegExp("(<__[^>]*>)(?:))*\\]\\]>|(?!)".replace(/__/g,(function(){return a})),"i"),lookbehind:!0,greedy:!0,inside:t},Prism.languages.insertBefore("markup","cdata",n)}}),Object.defineProperty(Prism.languages.markup.tag,"addAttribute",{value:function(a,e){Prism.languages.markup.tag.inside["special-attr"].push({pattern:RegExp("(^|[\"'\\s])(?:"+a+")\\s*=\\s*(?:\"[^\"]*\"|'[^']*'|[^\\s'\">=]+(?=[\\s>]))","i"),lookbehind:!0,inside:{"attr-name":/^[^\s=]+/,"attr-value":{pattern:/=[\s\S]+/,inside:{value:{pattern:/(^=\s*(["']|(?!["'])))\S[\s\S]*(?=\2$)/,lookbehind:!0,alias:[e,"language-"+e],inside:Prism.languages[e]},punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}}}})}}),Prism.languages.html=Prism.languages.markup,Prism.languages.mathml=Prism.languages.markup,Prism.languages.svg=Prism.languages.markup,Prism.languages.xml=Prism.languages.extend("markup",{}),Prism.languages.ssml=Prism.languages.xml,Prism.languages.atom=Prism.languages.xml,Prism.languages.rss=Prism.languages.xml;
    +!function(s){var e=/(?:"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n])*')/;s.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:RegExp("@[\\w-](?:[^;{\\s\"']|\\s+(?!\\s)|"+e.source+")*?(?:;|(?=\\s*\\{))"),inside:{rule:/^@[\w-]+/,"selector-function-argument":{pattern:/(\bselector\s*\(\s*(?![\s)]))(?:[^()\s]|\s+(?![\s)])|\((?:[^()]|\([^()]*\))*\))+(?=\s*\))/,lookbehind:!0,alias:"selector"},keyword:{pattern:/(^|[^\w-])(?:and|not|only|or)(?![\w-])/,lookbehind:!0}}},url:{pattern:RegExp("\\burl\\((?:"+e.source+"|(?:[^\\\\\r\n()\"']|\\\\[^])*)\\)","i"),greedy:!0,inside:{function:/^url/i,punctuation:/^\(|\)$/,string:{pattern:RegExp("^"+e.source+"$"),alias:"url"}}},selector:{pattern:RegExp("(^|[{}\\s])[^{}\\s](?:[^{};\"'\\s]|\\s+(?![\\s{])|"+e.source+")*(?=\\s*\\{)"),lookbehind:!0},string:{pattern:e,greedy:!0},property:{pattern:/(^|[^-\w\xA0-\uFFFF])(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*(?=\s*:)/i,lookbehind:!0},important:/!important\b/i,function:{pattern:/(^|[^-a-z0-9])[-a-z0-9]+(?=\()/i,lookbehind:!0},punctuation:/[(){};:,]/},s.languages.css.atrule.inside.rest=s.languages.css;var t=s.languages.markup;t&&(t.tag.addInlined("style","css"),t.tag.addAttribute("style","css"))}(Prism);
    +Prism.languages.clike={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"class-name":{pattern:/(\b(?:class|extends|implements|instanceof|interface|new|trait)\s+|\bcatch\s+\()[\w.\\]+/i,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:break|catch|continue|do|else|finally|for|function|if|in|instanceof|new|null|return|throw|try|while)\b/,boolean:/\b(?:false|true)\b/,function:/\b\w+(?=\()/,number:/\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i,operator:/[<>]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/,punctuation:/[{}[\];(),.:]/};
    +Prism.languages.javascript=Prism.languages.extend("clike",{"class-name":[Prism.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$A-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\.(?:constructor|prototype))/,lookbehind:!0}],keyword:[{pattern:/((?:^|\})\s*)catch\b/,lookbehind:!0},{pattern:/(^|[^.]|\.\.\.\s*)\b(?:as|assert(?=\s*\{)|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\s*(?:\{|$))|for|from(?=\s*(?:['"]|$))|function|(?:get|set)(?=\s*(?:[#\[$\w\xA0-\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,lookbehind:!0}],function:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,number:{pattern:RegExp("(^|[^\\w$])(?:NaN|Infinity|0[bB][01]+(?:_[01]+)*n?|0[oO][0-7]+(?:_[0-7]+)*n?|0[xX][\\dA-Fa-f]+(?:_[\\dA-Fa-f]+)*n?|\\d+(?:_\\d+)*n|(?:\\d+(?:_\\d+)*(?:\\.(?:\\d+(?:_\\d+)*)?)?|\\.\\d+(?:_\\d+)*)(?:[Ee][+-]?\\d+(?:_\\d+)*)?)(?![\\w$])"),lookbehind:!0},operator:/--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/}),Prism.languages.javascript["class-name"][0].pattern=/(\b(?:class|extends|implements|instanceof|interface|new)\s+)[\w.\\]+/,Prism.languages.insertBefore("javascript","keyword",{regex:{pattern:RegExp("((?:^|[^$\\w\\xA0-\\uFFFF.\"'\\])\\s]|\\b(?:return|yield))\\s*)/(?:(?:\\[(?:[^\\]\\\\\r\n]|\\\\.)*\\]|\\\\.|[^/\\\\\\[\r\n])+/[dgimyus]{0,7}|(?:\\[(?:[^[\\]\\\\\r\n]|\\\\.|\\[(?:[^[\\]\\\\\r\n]|\\\\.|\\[(?:[^[\\]\\\\\r\n]|\\\\.)*\\])*\\])*\\]|\\\\.|[^/\\\\\\[\r\n])+/[dgimyus]{0,7}v[dgimyus]{0,7})(?=(?:\\s|/\\*(?:[^*]|\\*(?!/))*\\*/)*(?:$|[\r\n,.;:})\\]]|//))"),lookbehind:!0,greedy:!0,inside:{"regex-source":{pattern:/^(\/)[\s\S]+(?=\/[a-z]*$)/,lookbehind:!0,alias:"language-regex",inside:Prism.languages.regex},"regex-delimiter":/^\/|\/$/,"regex-flags":/^[a-z]+$/}},"function-variable":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)?\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\))/,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*\{)/,lookbehind:!0,inside:Prism.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/}),Prism.languages.insertBefore("javascript","string",{hashbang:{pattern:/^#!.*/,greedy:!0,alias:"comment"},"template-string":{pattern:/`(?:\\[\s\S]|\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}|(?!\$\{)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},rest:Prism.languages.javascript}},string:/[\s\S]+/}},"string-property":{pattern:/((?:^|[,{])[ \t]*)(["'])(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2(?=\s*:)/m,lookbehind:!0,greedy:!0,alias:"property"}}),Prism.languages.insertBefore("javascript","operator",{"literal-property":{pattern:/((?:^|[,{])[ \t]*)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/m,lookbehind:!0,alias:"property"}}),Prism.languages.markup&&(Prism.languages.markup.tag.addInlined("script","javascript"),Prism.languages.markup.tag.addAttribute("on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)","javascript")),Prism.languages.js=Prism.languages.javascript;
    +!function(e){var t="\\b(?:BASH|BASHOPTS|BASH_ALIASES|BASH_ARGC|BASH_ARGV|BASH_CMDS|BASH_COMPLETION_COMPAT_DIR|BASH_LINENO|BASH_REMATCH|BASH_SOURCE|BASH_VERSINFO|BASH_VERSION|COLORTERM|COLUMNS|COMP_WORDBREAKS|DBUS_SESSION_BUS_ADDRESS|DEFAULTS_PATH|DESKTOP_SESSION|DIRSTACK|DISPLAY|EUID|GDMSESSION|GDM_LANG|GNOME_KEYRING_CONTROL|GNOME_KEYRING_PID|GPG_AGENT_INFO|GROUPS|HISTCONTROL|HISTFILE|HISTFILESIZE|HISTSIZE|HOME|HOSTNAME|HOSTTYPE|IFS|INSTANCE|JOB|LANG|LANGUAGE|LC_ADDRESS|LC_ALL|LC_IDENTIFICATION|LC_MEASUREMENT|LC_MONETARY|LC_NAME|LC_NUMERIC|LC_PAPER|LC_TELEPHONE|LC_TIME|LESSCLOSE|LESSOPEN|LINES|LOGNAME|LS_COLORS|MACHTYPE|MAILCHECK|MANDATORY_PATH|NO_AT_BRIDGE|OLDPWD|OPTERR|OPTIND|ORBIT_SOCKETDIR|OSTYPE|PAPERSIZE|PATH|PIPESTATUS|PPID|PS1|PS2|PS3|PS4|PWD|RANDOM|REPLY|SECONDS|SELINUX_INIT|SESSION|SESSIONTYPE|SESSION_MANAGER|SHELL|SHELLOPTS|SHLVL|SSH_AUTH_SOCK|TERM|UID|UPSTART_EVENTS|UPSTART_INSTANCE|UPSTART_JOB|UPSTART_SESSION|USER|WINDOWID|XAUTHORITY|XDG_CONFIG_DIRS|XDG_CURRENT_DESKTOP|XDG_DATA_DIRS|XDG_GREETER_DATA_DIR|XDG_MENU_PREFIX|XDG_RUNTIME_DIR|XDG_SEAT|XDG_SEAT_PATH|XDG_SESSION_DESKTOP|XDG_SESSION_ID|XDG_SESSION_PATH|XDG_SESSION_TYPE|XDG_VTNR|XMODIFIERS)\\b",n={pattern:/(^(["']?)\w+\2)[ \t]+\S.*/,lookbehind:!0,alias:"punctuation",inside:null},a={bash:n,environment:{pattern:RegExp("\\$"+t),alias:"constant"},variable:[{pattern:/\$?\(\([\s\S]+?\)\)/,greedy:!0,inside:{variable:[{pattern:/(^\$\(\([\s\S]+)\)\)/,lookbehind:!0},/^\$\(\(/],number:/\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee]-?\d+)?/,operator:/--|\+\+|\*\*=?|<<=?|>>=?|&&|\|\||[=!+\-*/%<>^&|]=?|[?~:]/,punctuation:/\(\(?|\)\)?|,|;/}},{pattern:/\$\((?:\([^)]+\)|[^()])+\)|`[^`]+`/,greedy:!0,inside:{variable:/^\$\(|^`|\)$|`$/}},{pattern:/\$\{[^}]+\}/,greedy:!0,inside:{operator:/:[-=?+]?|[!\/]|##?|%%?|\^\^?|,,?/,punctuation:/[\[\]]/,environment:{pattern:RegExp("(\\{)"+t),lookbehind:!0,alias:"constant"}}},/\$(?:\w+|[#?*!@$])/],entity:/\\(?:[abceEfnrtv\\"]|O?[0-7]{1,3}|U[0-9a-fA-F]{8}|u[0-9a-fA-F]{4}|x[0-9a-fA-F]{1,2})/};e.languages.bash={shebang:{pattern:/^#!\s*\/.*/,alias:"important"},comment:{pattern:/(^|[^"{\\$])#.*/,lookbehind:!0},"function-name":[{pattern:/(\bfunction\s+)[\w-]+(?=(?:\s*\(?:\s*\))?\s*\{)/,lookbehind:!0,alias:"function"},{pattern:/\b[\w-]+(?=\s*\(\s*\)\s*\{)/,alias:"function"}],"for-or-select":{pattern:/(\b(?:for|select)\s+)\w+(?=\s+in\s)/,alias:"variable",lookbehind:!0},"assign-left":{pattern:/(^|[\s;|&]|[<>]\()\w+(?:\.\w+)*(?=\+?=)/,inside:{environment:{pattern:RegExp("(^|[\\s;|&]|[<>]\\()"+t),lookbehind:!0,alias:"constant"}},alias:"variable",lookbehind:!0},parameter:{pattern:/(^|\s)-{1,2}(?:\w+:[+-]?)?\w+(?:\.\w+)*(?=[=\s]|$)/,alias:"variable",lookbehind:!0},string:[{pattern:/((?:^|[^<])<<-?\s*)(\w+)\s[\s\S]*?(?:\r?\n|\r)\2/,lookbehind:!0,greedy:!0,inside:a},{pattern:/((?:^|[^<])<<-?\s*)(["'])(\w+)\2\s[\s\S]*?(?:\r?\n|\r)\3/,lookbehind:!0,greedy:!0,inside:{bash:n}},{pattern:/(^|[^\\](?:\\\\)*)"(?:\\[\s\S]|\$\([^)]+\)|\$(?!\()|`[^`]+`|[^"\\`$])*"/,lookbehind:!0,greedy:!0,inside:a},{pattern:/(^|[^$\\])'[^']*'/,lookbehind:!0,greedy:!0},{pattern:/\$'(?:[^'\\]|\\[\s\S])*'/,greedy:!0,inside:{entity:a.entity}}],environment:{pattern:RegExp("\\$?"+t),alias:"constant"},variable:a.variable,function:{pattern:/(^|[\s;|&]|[<>]\()(?:add|apropos|apt|apt-cache|apt-get|aptitude|aspell|automysqlbackup|awk|basename|bash|bc|bconsole|bg|bzip2|cal|cargo|cat|cfdisk|chgrp|chkconfig|chmod|chown|chroot|cksum|clear|cmp|column|comm|composer|cp|cron|crontab|csplit|curl|cut|date|dc|dd|ddrescue|debootstrap|df|diff|diff3|dig|dir|dircolors|dirname|dirs|dmesg|docker|docker-compose|du|egrep|eject|env|ethtool|expand|expect|expr|fdformat|fdisk|fg|fgrep|file|find|fmt|fold|format|free|fsck|ftp|fuser|gawk|git|gparted|grep|groupadd|groupdel|groupmod|groups|grub-mkconfig|gzip|halt|head|hg|history|host|hostname|htop|iconv|id|ifconfig|ifdown|ifup|import|install|ip|java|jobs|join|kill|killall|less|link|ln|locate|logname|logrotate|look|lpc|lpr|lprint|lprintd|lprintq|lprm|ls|lsof|lynx|make|man|mc|mdadm|mkconfig|mkdir|mke2fs|mkfifo|mkfs|mkisofs|mknod|mkswap|mmv|more|most|mount|mtools|mtr|mutt|mv|nano|nc|netstat|nice|nl|node|nohup|notify-send|npm|nslookup|op|open|parted|passwd|paste|pathchk|ping|pkill|pnpm|podman|podman-compose|popd|pr|printcap|printenv|ps|pushd|pv|quota|quotacheck|quotactl|ram|rar|rcp|reboot|remsync|rename|renice|rev|rm|rmdir|rpm|rsync|scp|screen|sdiff|sed|sendmail|seq|service|sftp|sh|shellcheck|shuf|shutdown|sleep|slocate|sort|split|ssh|stat|strace|su|sudo|sum|suspend|swapon|sync|sysctl|tac|tail|tar|tee|time|timeout|top|touch|tr|traceroute|tsort|tty|umount|uname|unexpand|uniq|units|unrar|unshar|unzip|update-grub|uptime|useradd|userdel|usermod|users|uudecode|uuencode|v|vcpkg|vdir|vi|vim|virsh|vmstat|wait|watch|wc|wget|whereis|which|who|whoami|write|xargs|xdg-open|yarn|yes|zenity|zip|zsh|zypper)(?=$|[)\s;|&])/,lookbehind:!0},keyword:{pattern:/(^|[\s;|&]|[<>]\()(?:case|do|done|elif|else|esac|fi|for|function|if|in|select|then|until|while)(?=$|[)\s;|&])/,lookbehind:!0},builtin:{pattern:/(^|[\s;|&]|[<>]\()(?:\.|:|alias|bind|break|builtin|caller|cd|command|continue|declare|echo|enable|eval|exec|exit|export|getopts|hash|help|let|local|logout|mapfile|printf|pwd|read|readarray|readonly|return|set|shift|shopt|source|test|times|trap|type|typeset|ulimit|umask|unalias|unset)(?=$|[)\s;|&])/,lookbehind:!0,alias:"class-name"},boolean:{pattern:/(^|[\s;|&]|[<>]\()(?:false|true)(?=$|[)\s;|&])/,lookbehind:!0},"file-descriptor":{pattern:/\B&\d\b/,alias:"important"},operator:{pattern:/\d?<>|>\||\+=|=[=~]?|!=?|<<[<-]?|[&\d]?>>|\d[<>]&?|[<>][&=]?|&[>&]?|\|[&|]?/,inside:{"file-descriptor":{pattern:/^\d/,alias:"important"}}},punctuation:/\$?\(\(?|\)\)?|\.\.|[{}[\];\\]/,number:{pattern:/(^|\s)(?:[1-9]\d*|0)(?:[.,]\d+)?\b/,lookbehind:!0}},n.inside=e.languages.bash;for(var s=["comment","function-name","for-or-select","assign-left","parameter","string","environment","function","keyword","builtin","boolean","file-descriptor","operator","punctuation","number"],o=a.variable[1].inside,i=0;i>=?|<<=?|->|([-+&|:])\1|[?:~]|[-+*/%&|^!=<>]=?/}),Prism.languages.insertBefore("c","string",{char:{pattern:/'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n]){0,32}'/,greedy:!0}}),Prism.languages.insertBefore("c","string",{macro:{pattern:/(^[\t ]*)#\s*[a-z](?:[^\r\n\\/]|\/(?!\*)|\/\*(?:[^*]|\*(?!\/))*\*\/|\\(?:\r\n|[\s\S]))*/im,lookbehind:!0,greedy:!0,alias:"property",inside:{string:[{pattern:/^(#\s*include\s*)<[^>]+>/,lookbehind:!0},Prism.languages.c.string],char:Prism.languages.c.char,comment:Prism.languages.c.comment,"macro-name":[{pattern:/(^#\s*define\s+)\w+\b(?!\()/i,lookbehind:!0},{pattern:/(^#\s*define\s+)\w+\b(?=\()/i,lookbehind:!0,alias:"function"}],directive:{pattern:/^(#\s*)[a-z]+/,lookbehind:!0,alias:"keyword"},"directive-hash":/^#/,punctuation:/##|\\(?=[\r\n])/,expression:{pattern:/\S[\s\S]*/,inside:Prism.languages.c}}}}),Prism.languages.insertBefore("c","function",{constant:/\b(?:EOF|NULL|SEEK_CUR|SEEK_END|SEEK_SET|__DATE__|__FILE__|__LINE__|__TIMESTAMP__|__TIME__|__func__|stderr|stdin|stdout)\b/}),delete Prism.languages.c.boolean;
    +!function(e){function n(e,n){return e.replace(/<<(\d+)>>/g,(function(e,s){return"(?:"+n[+s]+")"}))}function s(e,s,a){return RegExp(n(e,s),a||"")}function a(e,n){for(var s=0;s>/g,(function(){return"(?:"+e+")"}));return e.replace(/<>/g,"[^\\s\\S]")}var t="bool byte char decimal double dynamic float int long object sbyte short string uint ulong ushort var void",r="class enum interface record struct",i="add alias and ascending async await by descending from(?=\\s*(?:\\w|$)) get global group into init(?=\\s*;) join let nameof not notnull on or orderby partial remove select set unmanaged value when where with(?=\\s*{)",o="abstract as base break case catch checked const continue default delegate do else event explicit extern finally fixed for foreach goto if implicit in internal is lock namespace new null operator out override params private protected public readonly ref return sealed sizeof stackalloc static switch this throw try typeof unchecked unsafe using virtual volatile while yield";function l(e){return"\\b(?:"+e.trim().replace(/ /g,"|")+")\\b"}var d=l(r),p=RegExp(l(t+" "+r+" "+i+" "+o)),c=l(r+" "+i+" "+o),u=l(t+" "+r+" "+o),g=a("<(?:[^<>;=+\\-*/%&|^]|<>)*>",2),b=a("\\((?:[^()]|<>)*\\)",2),h="@?\\b[A-Za-z_]\\w*\\b",f=n("<<0>>(?:\\s*<<1>>)?",[h,g]),m=n("(?!<<0>>)<<1>>(?:\\s*\\.\\s*<<1>>)*",[c,f]),k="\\[\\s*(?:,\\s*)*\\]",y=n("<<0>>(?:\\s*(?:\\?\\s*)?<<1>>)*(?:\\s*\\?)?",[m,k]),w=n("[^,()<>[\\];=+\\-*/%&|^]|<<0>>|<<1>>|<<2>>",[g,b,k]),v=n("\\(<<0>>+(?:,<<0>>+)+\\)",[w]),x=n("(?:<<0>>|<<1>>)(?:\\s*(?:\\?\\s*)?<<2>>)*(?:\\s*\\?)?",[v,m,k]),$={keyword:p,punctuation:/[<>()?,.:[\]]/},_="'(?:[^\r\n'\\\\]|\\\\.|\\\\[Uux][\\da-fA-F]{1,8})'",B='"(?:\\\\.|[^\\\\"\r\n])*"';e.languages.csharp=e.languages.extend("clike",{string:[{pattern:s("(^|[^$\\\\])<<0>>",['@"(?:""|\\\\[^]|[^\\\\"])*"(?!")']),lookbehind:!0,greedy:!0},{pattern:s("(^|[^@$\\\\])<<0>>",[B]),lookbehind:!0,greedy:!0}],"class-name":[{pattern:s("(\\busing\\s+static\\s+)<<0>>(?=\\s*;)",[m]),lookbehind:!0,inside:$},{pattern:s("(\\busing\\s+<<0>>\\s*=\\s*)<<1>>(?=\\s*;)",[h,x]),lookbehind:!0,inside:$},{pattern:s("(\\busing\\s+)<<0>>(?=\\s*=)",[h]),lookbehind:!0},{pattern:s("(\\b<<0>>\\s+)<<1>>",[d,f]),lookbehind:!0,inside:$},{pattern:s("(\\bcatch\\s*\\(\\s*)<<0>>",[m]),lookbehind:!0,inside:$},{pattern:s("(\\bwhere\\s+)<<0>>",[h]),lookbehind:!0},{pattern:s("(\\b(?:is(?:\\s+not)?|as)\\s+)<<0>>",[y]),lookbehind:!0,inside:$},{pattern:s("\\b<<0>>(?=\\s+(?!<<1>>|with\\s*\\{)<<2>>(?:\\s*[=,;:{)\\]]|\\s+(?:in|when)\\b))",[x,u,h]),inside:$}],keyword:p,number:/(?:\b0(?:x[\da-f_]*[\da-f]|b[01_]*[01])|(?:\B\.\d+(?:_+\d+)*|\b\d+(?:_+\d+)*(?:\.\d+(?:_+\d+)*)?)(?:e[-+]?\d+(?:_+\d+)*)?)(?:[dflmu]|lu|ul)?\b/i,operator:/>>=?|<<=?|[-=]>|([-+&|])\1|~|\?\?=?|[-+*/%&|^!=<>]=?/,punctuation:/\?\.?|::|[{}[\];(),.:]/}),e.languages.insertBefore("csharp","number",{range:{pattern:/\.\./,alias:"operator"}}),e.languages.insertBefore("csharp","punctuation",{"named-parameter":{pattern:s("([(,]\\s*)<<0>>(?=\\s*:)",[h]),lookbehind:!0,alias:"punctuation"}}),e.languages.insertBefore("csharp","class-name",{namespace:{pattern:s("(\\b(?:namespace|using)\\s+)<<0>>(?:\\s*\\.\\s*<<0>>)*(?=\\s*[;{])",[h]),lookbehind:!0,inside:{punctuation:/\./}},"type-expression":{pattern:s("(\\b(?:default|sizeof|typeof)\\s*\\(\\s*(?!\\s))(?:[^()\\s]|\\s(?!\\s)|<<0>>)*(?=\\s*\\))",[b]),lookbehind:!0,alias:"class-name",inside:$},"return-type":{pattern:s("<<0>>(?=\\s+(?:<<1>>\\s*(?:=>|[({]|\\.\\s*this\\s*\\[)|this\\s*\\[))",[x,m]),inside:$,alias:"class-name"},"constructor-invocation":{pattern:s("(\\bnew\\s+)<<0>>(?=\\s*[[({])",[x]),lookbehind:!0,inside:$,alias:"class-name"},"generic-method":{pattern:s("<<0>>\\s*<<1>>(?=\\s*\\()",[h,g]),inside:{function:s("^<<0>>",[h]),generic:{pattern:RegExp(g),alias:"class-name",inside:$}}},"type-list":{pattern:s("\\b((?:<<0>>\\s+<<1>>|record\\s+<<1>>\\s*<<5>>|where\\s+<<2>>)\\s*:\\s*)(?:<<3>>|<<4>>|<<1>>\\s*<<5>>|<<6>>)(?:\\s*,\\s*(?:<<3>>|<<4>>|<<6>>))*(?=\\s*(?:where|[{;]|=>|$))",[d,f,h,x,p.source,b,"\\bnew\\s*\\(\\s*\\)"]),lookbehind:!0,inside:{"record-arguments":{pattern:s("(^(?!new\\s*\\()<<0>>\\s*)<<1>>",[f,b]),lookbehind:!0,greedy:!0,inside:e.languages.csharp},keyword:p,"class-name":{pattern:RegExp(x),greedy:!0,inside:$},punctuation:/[,()]/}},preprocessor:{pattern:/(^[\t ]*)#.*/m,lookbehind:!0,alias:"property",inside:{directive:{pattern:/(#)\b(?:define|elif|else|endif|endregion|error|if|line|nullable|pragma|region|undef|warning)\b/,lookbehind:!0,alias:"keyword"}}}});var E=B+"|"+_,R=n("/(?![*/])|//[^\r\n]*[\r\n]|/\\*(?:[^*]|\\*(?!/))*\\*/|<<0>>",[E]),z=a(n("[^\"'/()]|<<0>>|\\(<>*\\)",[R]),2),S="\\b(?:assembly|event|field|method|module|param|property|return|type)\\b",j=n("<<0>>(?:\\s*\\(<<1>>*\\))?",[m,z]);e.languages.insertBefore("csharp","class-name",{attribute:{pattern:s("((?:^|[^\\s\\w>)?])\\s*\\[\\s*)(?:<<0>>\\s*:\\s*)?<<1>>(?:\\s*,\\s*<<1>>)*(?=\\s*\\])",[S,j]),lookbehind:!0,greedy:!0,inside:{target:{pattern:s("^<<0>>(?=\\s*:)",[S]),alias:"keyword"},"attribute-arguments":{pattern:s("\\(<<0>>*\\)",[z]),inside:e.languages.csharp},"class-name":{pattern:RegExp(m),inside:{punctuation:/\./}},punctuation:/[:,]/}}});var A=":[^}\r\n]+",F=a(n("[^\"'/()]|<<0>>|\\(<>*\\)",[R]),2),P=n("\\{(?!\\{)(?:(?![}:])<<0>>)*<<1>>?\\}",[F,A]),U=a(n("[^\"'/()]|/(?!\\*)|/\\*(?:[^*]|\\*(?!/))*\\*/|<<0>>|\\(<>*\\)",[E]),2),Z=n("\\{(?!\\{)(?:(?![}:])<<0>>)*<<1>>?\\}",[U,A]);function q(n,a){return{interpolation:{pattern:s("((?:^|[^{])(?:\\{\\{)*)<<0>>",[n]),lookbehind:!0,inside:{"format-string":{pattern:s("(^\\{(?:(?![}:])<<0>>)*)<<1>>(?=\\}$)",[a,A]),lookbehind:!0,inside:{punctuation:/^:/}},punctuation:/^\{|\}$/,expression:{pattern:/[\s\S]+/,alias:"language-csharp",inside:e.languages.csharp}}},string:/[\s\S]+/}}e.languages.insertBefore("csharp","string",{"interpolation-string":[{pattern:s('(^|[^\\\\])(?:\\$@|@\\$)"(?:""|\\\\[^]|\\{\\{|<<0>>|[^\\\\{"])*"',[P]),lookbehind:!0,greedy:!0,inside:q(P,F)},{pattern:s('(^|[^@\\\\])\\$"(?:\\\\.|\\{\\{|<<0>>|[^\\\\"{])*"',[Z]),lookbehind:!0,greedy:!0,inside:q(Z,U)}],char:{pattern:RegExp(_),greedy:!0}}),e.languages.dotnet=e.languages.cs=e.languages.csharp}(Prism);
    +!function(e){var t=/\b(?:alignas|alignof|asm|auto|bool|break|case|catch|char|char16_t|char32_t|char8_t|class|co_await|co_return|co_yield|compl|concept|const|const_cast|consteval|constexpr|constinit|continue|decltype|default|delete|do|double|dynamic_cast|else|enum|explicit|export|extern|final|float|for|friend|goto|if|import|inline|int|int16_t|int32_t|int64_t|int8_t|long|module|mutable|namespace|new|noexcept|nullptr|operator|override|private|protected|public|register|reinterpret_cast|requires|return|short|signed|sizeof|static|static_assert|static_cast|struct|switch|template|this|thread_local|throw|try|typedef|typeid|typename|uint16_t|uint32_t|uint64_t|uint8_t|union|unsigned|using|virtual|void|volatile|wchar_t|while)\b/,n="\\b(?!)\\w+(?:\\s*\\.\\s*\\w+)*\\b".replace(//g,(function(){return t.source}));e.languages.cpp=e.languages.extend("c",{"class-name":[{pattern:RegExp("(\\b(?:class|concept|enum|struct|typename)\\s+)(?!)\\w+".replace(//g,(function(){return t.source}))),lookbehind:!0},/\b[A-Z]\w*(?=\s*::\s*\w+\s*\()/,/\b[A-Z_]\w*(?=\s*::\s*~\w+\s*\()/i,/\b\w+(?=\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>\s*::\s*\w+\s*\()/],keyword:t,number:{pattern:/(?:\b0b[01']+|\b0x(?:[\da-f']+(?:\.[\da-f']*)?|\.[\da-f']+)(?:p[+-]?[\d']+)?|(?:\b[\d']+(?:\.[\d']*)?|\B\.[\d']+)(?:e[+-]?[\d']+)?)[ful]{0,4}/i,greedy:!0},operator:/>>=?|<<=?|->|--|\+\+|&&|\|\||[?:~]|<=>|[-+*/%&|^!=<>]=?|\b(?:and|and_eq|bitand|bitor|not|not_eq|or|or_eq|xor|xor_eq)\b/,boolean:/\b(?:false|true)\b/}),e.languages.insertBefore("cpp","string",{module:{pattern:RegExp('(\\b(?:import|module)\\s+)(?:"(?:\\\\(?:\r\n|[^])|[^"\\\\\r\n])*"|<[^<>\r\n]*>|'+"(?:\\s*:\\s*)?|:\\s*".replace(//g,(function(){return n}))+")"),lookbehind:!0,greedy:!0,inside:{string:/^[<"][\s\S]+/,operator:/:/,punctuation:/\./}},"raw-string":{pattern:/R"([^()\\ ]{0,16})\([\s\S]*?\)\1"/,alias:"string",greedy:!0}}),e.languages.insertBefore("cpp","keyword",{"generic-function":{pattern:/\b(?!operator\b)[a-z_]\w*\s*<(?:[^<>]|<[^<>]*>)*>(?=\s*\()/i,inside:{function:/^\w+/,generic:{pattern:/<[\s\S]+/,alias:"class-name",inside:e.languages.cpp}}}}),e.languages.insertBefore("cpp","operator",{"double-colon":{pattern:/::/,alias:"punctuation"}}),e.languages.insertBefore("cpp","class-name",{"base-clause":{pattern:/(\b(?:class|struct)\s+\w+\s*:\s*)[^;{}"'\s]+(?:\s+[^;{}"'\s]+)*(?=\s*[;{])/,lookbehind:!0,greedy:!0,inside:e.languages.extend("cpp",{})}}),e.languages.insertBefore("inside","double-colon",{"class-name":/\b[a-z_]\w*\b(?!\s*::)/i},e.languages.cpp["base-clause"])}(Prism);
    +Prism.languages.go=Prism.languages.extend("clike",{string:{pattern:/(^|[^\\])"(?:\\.|[^"\\\r\n])*"|`[^`]*`/,lookbehind:!0,greedy:!0},keyword:/\b(?:break|case|chan|const|continue|default|defer|else|fallthrough|for|func|go(?:to)?|if|import|interface|map|package|range|return|select|struct|switch|type|var)\b/,boolean:/\b(?:_|false|iota|nil|true)\b/,number:[/\b0(?:b[01_]+|o[0-7_]+)i?\b/i,/\b0x(?:[a-f\d_]+(?:\.[a-f\d_]*)?|\.[a-f\d_]+)(?:p[+-]?\d+(?:_\d+)*)?i?(?!\w)/i,/(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.\d[\d_]*)(?:e[+-]?[\d_]+)?i?(?!\w)/i],operator:/[*\/%^!=]=?|\+[=+]?|-[=-]?|\|[=|]?|&(?:=|&|\^=?)?|>(?:>=?|=)?|<(?:<=?|=|-)?|:=|\.\.\./,builtin:/\b(?:append|bool|byte|cap|close|complex|complex(?:64|128)|copy|delete|error|float(?:32|64)|u?int(?:8|16|32|64)?|imag|len|make|new|panic|print(?:ln)?|real|recover|rune|string|uintptr)\b/}),Prism.languages.insertBefore("go","string",{char:{pattern:/'(?:\\.|[^'\\\r\n]){0,10}'/,greedy:!0}}),delete Prism.languages.go["class-name"];
    +!function(e){var n=/\b(?:abstract|assert|boolean|break|byte|case|catch|char|class|const|continue|default|do|double|else|enum|exports|extends|final|finally|float|for|goto|if|implements|import|instanceof|int|interface|long|module|native|new|non-sealed|null|open|opens|package|permits|private|protected|provides|public|record(?!\s*[(){}[\]<>=%~.:,;?+\-*/&|^])|requires|return|sealed|short|static|strictfp|super|switch|synchronized|this|throw|throws|to|transient|transitive|try|uses|var|void|volatile|while|with|yield)\b/,t="(?:[a-z]\\w*\\s*\\.\\s*)*(?:[A-Z]\\w*\\s*\\.\\s*)*",s={pattern:RegExp("(^|[^\\w.])"+t+"[A-Z](?:[\\d_A-Z]*[a-z]\\w*)?\\b"),lookbehind:!0,inside:{namespace:{pattern:/^[a-z]\w*(?:\s*\.\s*[a-z]\w*)*(?:\s*\.)?/,inside:{punctuation:/\./}},punctuation:/\./}};e.languages.java=e.languages.extend("clike",{string:{pattern:/(^|[^\\])"(?:\\.|[^"\\\r\n])*"/,lookbehind:!0,greedy:!0},"class-name":[s,{pattern:RegExp("(^|[^\\w.])"+t+"[A-Z]\\w*(?=\\s+\\w+\\s*[;,=()]|\\s*(?:\\[[\\s,]*\\]\\s*)?::\\s*new\\b)"),lookbehind:!0,inside:s.inside},{pattern:RegExp("(\\b(?:class|enum|extends|implements|instanceof|interface|new|record|throws)\\s+)"+t+"[A-Z]\\w*\\b"),lookbehind:!0,inside:s.inside}],keyword:n,function:[e.languages.clike.function,{pattern:/(::\s*)[a-z_]\w*/,lookbehind:!0}],number:/\b0b[01][01_]*L?\b|\b0x(?:\.[\da-f_p+-]+|[\da-f_]+(?:\.[\da-f_p+-]+)?)\b|(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.\d[\d_]*)(?:e[+-]?\d[\d_]*)?[dfl]?/i,operator:{pattern:/(^|[^.])(?:<<=?|>>>?=?|->|--|\+\+|&&|\|\||::|[?:~]|[-+*/%&|^!=<>]=?)/m,lookbehind:!0},constant:/\b[A-Z][A-Z_\d]+\b/}),e.languages.insertBefore("java","string",{"triple-quoted-string":{pattern:/"""[ \t]*[\r\n](?:(?:"|"")?(?:\\.|[^"\\]))*"""/,greedy:!0,alias:"string"},char:{pattern:/'(?:\\.|[^'\\\r\n]){1,6}'/,greedy:!0}}),e.languages.insertBefore("java","class-name",{annotation:{pattern:/(^|[^.])@\w+(?:\s*\.\s*\w+)*/,lookbehind:!0,alias:"punctuation"},generics:{pattern:/<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&))*>)*>)*>)*>/,inside:{"class-name":s,keyword:n,punctuation:/[<>(),.:]/,operator:/[?&|]/}},import:[{pattern:RegExp("(\\bimport\\s+)"+t+"(?:[A-Z]\\w*|\\*)(?=\\s*;)"),lookbehind:!0,inside:{namespace:s.inside.namespace,punctuation:/\./,operator:/\*/,"class-name":/\w+/}},{pattern:RegExp("(\\bimport\\s+static\\s+)"+t+"(?:\\w+|\\*)(?=\\s*;)"),lookbehind:!0,alias:"static",inside:{namespace:s.inside.namespace,static:/\b\w+$/,punctuation:/\./,operator:/\*/,"class-name":/\w+/}}],namespace:{pattern:RegExp("(\\b(?:exports|import(?:\\s+static)?|module|open|opens|package|provides|requires|to|transitive|uses|with)\\s+)(?!)[a-z]\\w*(?:\\.[a-z]\\w*)*\\.?".replace(//g,(function(){return n.source}))),lookbehind:!0,inside:{punctuation:/\./}}})}(Prism);
    +!function(n){function e(n){return n=n.replace(//g,(function(){return"(?:\\\\.|[^\\\\\n\r]|(?:\n|\r\n?)(?![\r\n]))"})),RegExp("((?:^|[^\\\\])(?:\\\\{2})*)(?:"+n+")")}var t="(?:\\\\.|``(?:[^`\r\n]|`(?!`))+``|`[^`\r\n]+`|[^\\\\|\r\n`])+",a="\\|?__(?:\\|__)+\\|?(?:(?:\n|\r\n?)|(?![^]))".replace(/__/g,(function(){return t})),i="\\|?[ \t]*:?-{3,}:?[ \t]*(?:\\|[ \t]*:?-{3,}:?[ \t]*)+\\|?(?:\n|\r\n?)";n.languages.markdown=n.languages.extend("markup",{}),n.languages.insertBefore("markdown","prolog",{"front-matter-block":{pattern:/(^(?:\s*[\r\n])?)---(?!.)[\s\S]*?[\r\n]---(?!.)/,lookbehind:!0,greedy:!0,inside:{punctuation:/^---|---$/,"front-matter":{pattern:/\S+(?:\s+\S+)*/,alias:["yaml","language-yaml"],inside:n.languages.yaml}}},blockquote:{pattern:/^>(?:[\t ]*>)*/m,alias:"punctuation"},table:{pattern:RegExp("^"+a+i+"(?:"+a+")*","m"),inside:{"table-data-rows":{pattern:RegExp("^("+a+i+")(?:"+a+")*$"),lookbehind:!0,inside:{"table-data":{pattern:RegExp(t),inside:n.languages.markdown},punctuation:/\|/}},"table-line":{pattern:RegExp("^("+a+")"+i+"$"),lookbehind:!0,inside:{punctuation:/\||:?-{3,}:?/}},"table-header-row":{pattern:RegExp("^"+a+"$"),inside:{"table-header":{pattern:RegExp(t),alias:"important",inside:n.languages.markdown},punctuation:/\|/}}}},code:[{pattern:/((?:^|\n)[ \t]*\n|(?:^|\r\n?)[ \t]*\r\n?)(?: {4}|\t).+(?:(?:\n|\r\n?)(?: {4}|\t).+)*/,lookbehind:!0,alias:"keyword"},{pattern:/^```[\s\S]*?^```$/m,greedy:!0,inside:{"code-block":{pattern:/^(```.*(?:\n|\r\n?))[\s\S]+?(?=(?:\n|\r\n?)^```$)/m,lookbehind:!0},"code-language":{pattern:/^(```).+/,lookbehind:!0},punctuation:/```/}}],title:[{pattern:/\S.*(?:\n|\r\n?)(?:==+|--+)(?=[ \t]*$)/m,alias:"important",inside:{punctuation:/==+$|--+$/}},{pattern:/(^\s*)#.+/m,lookbehind:!0,alias:"important",inside:{punctuation:/^#+|#+$/}}],hr:{pattern:/(^\s*)([*-])(?:[\t ]*\2){2,}(?=\s*$)/m,lookbehind:!0,alias:"punctuation"},list:{pattern:/(^\s*)(?:[*+-]|\d+\.)(?=[\t ].)/m,lookbehind:!0,alias:"punctuation"},"url-reference":{pattern:/!?\[[^\]]+\]:[\t ]+(?:\S+|<(?:\\.|[^>\\])+>)(?:[\t ]+(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\)))?/,inside:{variable:{pattern:/^(!?\[)[^\]]+/,lookbehind:!0},string:/(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\))$/,punctuation:/^[\[\]!:]|[<>]/},alias:"url"},bold:{pattern:e("\\b__(?:(?!_)|_(?:(?!_))+_)+__\\b|\\*\\*(?:(?!\\*)|\\*(?:(?!\\*))+\\*)+\\*\\*"),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^..)[\s\S]+(?=..$)/,lookbehind:!0,inside:{}},punctuation:/\*\*|__/}},italic:{pattern:e("\\b_(?:(?!_)|__(?:(?!_))+__)+_\\b|\\*(?:(?!\\*)|\\*\\*(?:(?!\\*))+\\*\\*)+\\*"),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^.)[\s\S]+(?=.$)/,lookbehind:!0,inside:{}},punctuation:/[*_]/}},strike:{pattern:e("(~~?)(?:(?!~))+\\2"),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^~~?)[\s\S]+(?=\1$)/,lookbehind:!0,inside:{}},punctuation:/~~?/}},"code-snippet":{pattern:/(^|[^\\`])(?:``[^`\r\n]+(?:`[^`\r\n]+)*``(?!`)|`[^`\r\n]+`(?!`))/,lookbehind:!0,greedy:!0,alias:["code","keyword"]},url:{pattern:e('!?\\[(?:(?!\\]))+\\](?:\\([^\\s)]+(?:[\t ]+"(?:\\\\.|[^"\\\\])*")?\\)|[ \t]?\\[(?:(?!\\]))+\\])'),lookbehind:!0,greedy:!0,inside:{operator:/^!/,content:{pattern:/(^\[)[^\]]+(?=\])/,lookbehind:!0,inside:{}},variable:{pattern:/(^\][ \t]?\[)[^\]]+(?=\]$)/,lookbehind:!0},url:{pattern:/(^\]\()[^\s)]+/,lookbehind:!0},string:{pattern:/(^[ \t]+)"(?:\\.|[^"\\])*"(?=\)$)/,lookbehind:!0}}}}),["url","bold","italic","strike"].forEach((function(e){["url","bold","italic","strike","code-snippet"].forEach((function(t){e!==t&&(n.languages.markdown[e].inside.content.inside[t]=n.languages.markdown[t])}))})),n.hooks.add("after-tokenize",(function(n){"markdown"!==n.language&&"md"!==n.language||function n(e){if(e&&"string"!=typeof e)for(var t=0,a=e.length;t",quot:'"'},l=String.fromCodePoint||String.fromCharCode;n.languages.md=n.languages.markdown}(Prism);
    +Prism.languages.python={comment:{pattern:/(^|[^\\])#.*/,lookbehind:!0,greedy:!0},"string-interpolation":{pattern:/(?:f|fr|rf)(?:("""|''')[\s\S]*?\1|("|')(?:\\.|(?!\2)[^\\\r\n])*\2)/i,greedy:!0,inside:{interpolation:{pattern:/((?:^|[^{])(?:\{\{)*)\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}])+\})+\})+\}/,lookbehind:!0,inside:{"format-spec":{pattern:/(:)[^:(){}]+(?=\}$)/,lookbehind:!0},"conversion-option":{pattern:/![sra](?=[:}]$)/,alias:"punctuation"},rest:null}},string:/[\s\S]+/}},"triple-quoted-string":{pattern:/(?:[rub]|br|rb)?("""|''')[\s\S]*?\1/i,greedy:!0,alias:"string"},string:{pattern:/(?:[rub]|br|rb)?("|')(?:\\.|(?!\1)[^\\\r\n])*\1/i,greedy:!0},function:{pattern:/((?:^|\s)def[ \t]+)[a-zA-Z_]\w*(?=\s*\()/g,lookbehind:!0},"class-name":{pattern:/(\bclass\s+)\w+/i,lookbehind:!0},decorator:{pattern:/(^[\t ]*)@\w+(?:\.\w+)*/m,lookbehind:!0,alias:["annotation","punctuation"],inside:{punctuation:/\./}},keyword:/\b(?:_(?=\s*:)|and|as|assert|async|await|break|case|class|continue|def|del|elif|else|except|exec|finally|for|from|global|if|import|in|is|lambda|match|nonlocal|not|or|pass|print|raise|return|try|while|with|yield)\b/,builtin:/\b(?:__import__|abs|all|any|apply|ascii|basestring|bin|bool|buffer|bytearray|bytes|callable|chr|classmethod|cmp|coerce|compile|complex|delattr|dict|dir|divmod|enumerate|eval|execfile|file|filter|float|format|frozenset|getattr|globals|hasattr|hash|help|hex|id|input|int|intern|isinstance|issubclass|iter|len|list|locals|long|map|max|memoryview|min|next|object|oct|open|ord|pow|property|range|raw_input|reduce|reload|repr|reversed|round|set|setattr|slice|sorted|staticmethod|str|sum|super|tuple|type|unichr|unicode|vars|xrange|zip)\b/,boolean:/\b(?:False|None|True)\b/,number:/\b0(?:b(?:_?[01])+|o(?:_?[0-7])+|x(?:_?[a-f0-9])+)\b|(?:\b\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\B\.\d+(?:_\d+)*)(?:e[+-]?\d+(?:_\d+)*)?j?(?!\w)/i,operator:/[-+%=]=?|!=|:=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]/,punctuation:/[{}[\];(),.:]/},Prism.languages.python["string-interpolation"].inside.interpolation.inside.rest=Prism.languages.python,Prism.languages.py=Prism.languages.python;
    +Prism.languages.scss=Prism.languages.extend("css",{comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0},atrule:{pattern:/@[\w-](?:\([^()]+\)|[^()\s]|\s+(?!\s))*?(?=\s+[{;])/,inside:{rule:/@[\w-]+/}},url:/(?:[-a-z]+-)?url(?=\()/i,selector:{pattern:/(?=\S)[^@;{}()]?(?:[^@;{}()\s]|\s+(?!\s)|#\{\$[-\w]+\})+(?=\s*\{(?:\}|\s|[^}][^:{}]*[:{][^}]))/,inside:{parent:{pattern:/&/,alias:"important"},placeholder:/%[-\w]+/,variable:/\$[-\w]+|#\{\$[-\w]+\}/}},property:{pattern:/(?:[-\w]|\$[-\w]|#\{\$[-\w]+\})+(?=\s*:)/,inside:{variable:/\$[-\w]+|#\{\$[-\w]+\}/}}}),Prism.languages.insertBefore("scss","atrule",{keyword:[/@(?:content|debug|each|else(?: if)?|extend|for|forward|function|if|import|include|mixin|return|use|warn|while)\b/i,{pattern:/( )(?:from|through)(?= )/,lookbehind:!0}]}),Prism.languages.insertBefore("scss","important",{variable:/\$[-\w]+|#\{\$[-\w]+\}/}),Prism.languages.insertBefore("scss","function",{"module-modifier":{pattern:/\b(?:as|hide|show|with)\b/i,alias:"keyword"},placeholder:{pattern:/%[-\w]+/,alias:"selector"},statement:{pattern:/\B!(?:default|optional)\b/i,alias:"keyword"},boolean:/\b(?:false|true)\b/,null:{pattern:/\bnull\b/,alias:"keyword"},operator:{pattern:/(\s)(?:[-+*\/%]|[=!]=|<=?|>=?|and|not|or)(?=\s)/,lookbehind:!0}}),Prism.languages.scss.atrule.inside.rest=Prism.languages.scss;
    +Prism.languages.sql={comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|(?:--|\/\/|#).*)/,lookbehind:!0},variable:[{pattern:/@(["'`])(?:\\[\s\S]|(?!\1)[^\\])+\1/,greedy:!0},/@[\w.$]+/],string:{pattern:/(^|[^@\\])("|')(?:\\[\s\S]|(?!\2)[^\\]|\2\2)*\2/,greedy:!0,lookbehind:!0},identifier:{pattern:/(^|[^@\\])`(?:\\[\s\S]|[^`\\]|``)*`/,greedy:!0,lookbehind:!0,inside:{punctuation:/^`|`$/}},function:/\b(?:AVG|COUNT|FIRST|FORMAT|LAST|LCASE|LEN|MAX|MID|MIN|MOD|NOW|ROUND|SUM|UCASE)(?=\s*\()/i,keyword:/\b(?:ACTION|ADD|AFTER|ALGORITHM|ALL|ALTER|ANALYZE|ANY|APPLY|AS|ASC|AUTHORIZATION|AUTO_INCREMENT|BACKUP|BDB|BEGIN|BERKELEYDB|BIGINT|BINARY|BIT|BLOB|BOOL|BOOLEAN|BREAK|BROWSE|BTREE|BULK|BY|CALL|CASCADED?|CASE|CHAIN|CHAR(?:ACTER|SET)?|CHECK(?:POINT)?|CLOSE|CLUSTERED|COALESCE|COLLATE|COLUMNS?|COMMENT|COMMIT(?:TED)?|COMPUTE|CONNECT|CONSISTENT|CONSTRAINT|CONTAINS(?:TABLE)?|CONTINUE|CONVERT|CREATE|CROSS|CURRENT(?:_DATE|_TIME|_TIMESTAMP|_USER)?|CURSOR|CYCLE|DATA(?:BASES?)?|DATE(?:TIME)?|DAY|DBCC|DEALLOCATE|DEC|DECIMAL|DECLARE|DEFAULT|DEFINER|DELAYED|DELETE|DELIMITERS?|DENY|DESC|DESCRIBE|DETERMINISTIC|DISABLE|DISCARD|DISK|DISTINCT|DISTINCTROW|DISTRIBUTED|DO|DOUBLE|DROP|DUMMY|DUMP(?:FILE)?|DUPLICATE|ELSE(?:IF)?|ENABLE|ENCLOSED|END|ENGINE|ENUM|ERRLVL|ERRORS|ESCAPED?|EXCEPT|EXEC(?:UTE)?|EXISTS|EXIT|EXPLAIN|EXTENDED|FETCH|FIELDS|FILE|FILLFACTOR|FIRST|FIXED|FLOAT|FOLLOWING|FOR(?: EACH ROW)?|FORCE|FOREIGN|FREETEXT(?:TABLE)?|FROM|FULL|FUNCTION|GEOMETRY(?:COLLECTION)?|GLOBAL|GOTO|GRANT|GROUP|HANDLER|HASH|HAVING|HOLDLOCK|HOUR|IDENTITY(?:COL|_INSERT)?|IF|IGNORE|IMPORT|INDEX|INFILE|INNER|INNODB|INOUT|INSERT|INT|INTEGER|INTERSECT|INTERVAL|INTO|INVOKER|ISOLATION|ITERATE|JOIN|KEYS?|KILL|LANGUAGE|LAST|LEAVE|LEFT|LEVEL|LIMIT|LINENO|LINES|LINESTRING|LOAD|LOCAL|LOCK|LONG(?:BLOB|TEXT)|LOOP|MATCH(?:ED)?|MEDIUM(?:BLOB|INT|TEXT)|MERGE|MIDDLEINT|MINUTE|MODE|MODIFIES|MODIFY|MONTH|MULTI(?:LINESTRING|POINT|POLYGON)|NATIONAL|NATURAL|NCHAR|NEXT|NO|NONCLUSTERED|NULLIF|NUMERIC|OFF?|OFFSETS?|ON|OPEN(?:DATASOURCE|QUERY|ROWSET)?|OPTIMIZE|OPTION(?:ALLY)?|ORDER|OUT(?:ER|FILE)?|OVER|PARTIAL|PARTITION|PERCENT|PIVOT|PLAN|POINT|POLYGON|PRECEDING|PRECISION|PREPARE|PREV|PRIMARY|PRINT|PRIVILEGES|PROC(?:EDURE)?|PUBLIC|PURGE|QUICK|RAISERROR|READS?|REAL|RECONFIGURE|REFERENCES|RELEASE|RENAME|REPEAT(?:ABLE)?|REPLACE|REPLICATION|REQUIRE|RESIGNAL|RESTORE|RESTRICT|RETURN(?:ING|S)?|REVOKE|RIGHT|ROLLBACK|ROUTINE|ROW(?:COUNT|GUIDCOL|S)?|RTREE|RULE|SAVE(?:POINT)?|SCHEMA|SECOND|SELECT|SERIAL(?:IZABLE)?|SESSION(?:_USER)?|SET(?:USER)?|SHARE|SHOW|SHUTDOWN|SIMPLE|SMALLINT|SNAPSHOT|SOME|SONAME|SQL|START(?:ING)?|STATISTICS|STATUS|STRIPED|SYSTEM_USER|TABLES?|TABLESPACE|TEMP(?:ORARY|TABLE)?|TERMINATED|TEXT(?:SIZE)?|THEN|TIME(?:STAMP)?|TINY(?:BLOB|INT|TEXT)|TOP?|TRAN(?:SACTIONS?)?|TRIGGER|TRUNCATE|TSEQUAL|TYPES?|UNBOUNDED|UNCOMMITTED|UNDEFINED|UNION|UNIQUE|UNLOCK|UNPIVOT|UNSIGNED|UPDATE(?:TEXT)?|USAGE|USE|USER|USING|VALUES?|VAR(?:BINARY|CHAR|CHARACTER|YING)|VIEW|WAITFOR|WARNINGS|WHEN|WHERE|WHILE|WITH(?: ROLLUP|IN)?|WORK|WRITE(?:TEXT)?|YEAR)\b/i,boolean:/\b(?:FALSE|NULL|TRUE)\b/i,number:/\b0x[\da-f]+\b|\b\d+(?:\.\d*)?|\B\.\d+\b/i,operator:/[-+*\/=%^~]|&&?|\|\|?|!=?|<(?:=>?|<|>)?|>[>=]?|\b(?:AND|BETWEEN|DIV|ILIKE|IN|IS|LIKE|NOT|OR|REGEXP|RLIKE|SOUNDS LIKE|XOR)\b/i,punctuation:/[;[\]()`,.]/};
    +!function(e){function n(e){return e.replace(/__/g,(function(){return"(?:[\\w-]+|'[^'\n\r]*'|\"(?:\\\\.|[^\\\\\"\r\n])*\")"}))}e.languages.toml={comment:{pattern:/#.*/,greedy:!0},table:{pattern:RegExp(n("(^[\t ]*\\[\\s*(?:\\[\\s*)?)__(?:\\s*\\.\\s*__)*(?=\\s*\\])"),"m"),lookbehind:!0,greedy:!0,alias:"class-name"},key:{pattern:RegExp(n("(^[\t ]*|[{,]\\s*)__(?:\\s*\\.\\s*__)*(?=\\s*=)"),"m"),lookbehind:!0,greedy:!0,alias:"property"},string:{pattern:/"""(?:\\[\s\S]|[^\\])*?"""|'''[\s\S]*?'''|'[^'\n\r]*'|"(?:\\.|[^\\"\r\n])*"/,greedy:!0},date:[{pattern:/\b\d{4}-\d{2}-\d{2}(?:[T\s]\d{2}:\d{2}:\d{2}(?:\.\d+)?(?:Z|[+-]\d{2}:\d{2})?)?\b/i,alias:"number"},{pattern:/\b\d{2}:\d{2}:\d{2}(?:\.\d+)?\b/,alias:"number"}],number:/(?:\b0(?:x[\da-zA-Z]+(?:_[\da-zA-Z]+)*|o[0-7]+(?:_[0-7]+)*|b[10]+(?:_[10]+)*))\b|[-+]?\b\d+(?:_\d+)*(?:\.\d+(?:_\d+)*)?(?:[eE][+-]?\d+(?:_\d+)*)?\b|[-+]?\b(?:inf|nan)\b/,boolean:/\b(?:false|true)\b/,punctuation:/[.,=[\]{}]/}}(Prism);
    +!function(e){var n=/[*&][^\s[\]{},]+/,r=/!(?:<[\w\-%#;/?:@&=+$,.!~*'()[\]]+>|(?:[a-zA-Z\d-]*!)?[\w\-%#;/?:@&=+$.~*'()]+)?/,t="(?:"+r.source+"(?:[ \t]+"+n.source+")?|"+n.source+"(?:[ \t]+"+r.source+")?)",a="(?:[^\\s\\x00-\\x08\\x0e-\\x1f!\"#%&'*,\\-:>?@[\\]`{|}\\x7f-\\x84\\x86-\\x9f\\ud800-\\udfff\\ufffe\\uffff]|[?:-])(?:[ \t]*(?:(?![#:])|:))*".replace(//g,(function(){return"[^\\s\\x00-\\x08\\x0e-\\x1f,[\\]{}\\x7f-\\x84\\x86-\\x9f\\ud800-\\udfff\\ufffe\\uffff]"})),d="\"(?:[^\"\\\\\r\n]|\\\\.)*\"|'(?:[^'\\\\\r\n]|\\\\.)*'";function o(e,n){n=(n||"").replace(/m/g,"")+"m";var r="([:\\-,[{]\\s*(?:\\s<>[ \t]+)?)(?:<>)(?=[ \t]*(?:$|,|\\]|\\}|(?:[\r\n]\\s*)?#))".replace(/<>/g,(function(){return t})).replace(/<>/g,(function(){return e}));return RegExp(r,n)}e.languages.yaml={scalar:{pattern:RegExp("([\\-:]\\s*(?:\\s<>[ \t]+)?[|>])[ \t]*(?:((?:\r?\n|\r)[ \t]+)\\S[^\r\n]*(?:\\2[^\r\n]+)*)".replace(/<>/g,(function(){return t}))),lookbehind:!0,alias:"string"},comment:/#.*/,key:{pattern:RegExp("((?:^|[:\\-,[{\r\n?])[ \t]*(?:<>[ \t]+)?)<>(?=\\s*:\\s)".replace(/<>/g,(function(){return t})).replace(/<>/g,(function(){return"(?:"+a+"|"+d+")"}))),lookbehind:!0,greedy:!0,alias:"atrule"},directive:{pattern:/(^[ \t]*)%.+/m,lookbehind:!0,alias:"important"},datetime:{pattern:o("\\d{4}-\\d\\d?-\\d\\d?(?:[tT]|[ \t]+)\\d\\d?:\\d{2}:\\d{2}(?:\\.\\d*)?(?:[ \t]*(?:Z|[-+]\\d\\d?(?::\\d{2})?))?|\\d{4}-\\d{2}-\\d{2}|\\d\\d?:\\d{2}(?::\\d{2}(?:\\.\\d*)?)?"),lookbehind:!0,alias:"number"},boolean:{pattern:o("false|true","i"),lookbehind:!0,alias:"important"},null:{pattern:o("null|~","i"),lookbehind:!0,alias:"important"},string:{pattern:o(d),lookbehind:!0,greedy:!0},number:{pattern:o("[+-]?(?:0x[\\da-f]+|0o[0-7]+|(?:\\d+(?:\\.\\d*)?|\\.\\d+)(?:e[+-]?\\d+)?|\\.inf|\\.nan)","i"),lookbehind:!0},tag:r,important:n,punctuation:/---|[:[\]{}\-,|>?]|\.\.\./},e.languages.yml=e.languages.yaml}(Prism);
    +!function(){if("undefined"!=typeof Prism&&"undefined"!=typeof document){var e=[],t={},n=function(){};Prism.plugins.toolbar={};var a=Prism.plugins.toolbar.registerButton=function(n,a){var r;r="function"==typeof a?a:function(e){var t;return"function"==typeof a.onClick?((t=document.createElement("button")).type="button",t.addEventListener("click",(function(){a.onClick.call(this,e)}))):"string"==typeof a.url?(t=document.createElement("a")).href=a.url:t=document.createElement("span"),a.className&&t.classList.add(a.className),t.textContent=a.text,t},n in t?console.warn('There is a button with the key "'+n+'" registered already.'):e.push(t[n]=r)},r=Prism.plugins.toolbar.hook=function(a){var r=a.element.parentNode;if(r&&/pre/i.test(r.nodeName)&&!r.parentNode.classList.contains("code-toolbar")){var o=document.createElement("div");o.classList.add("code-toolbar"),r.parentNode.insertBefore(o,r),o.appendChild(r);var i=document.createElement("div");i.classList.add("toolbar");var l=e,d=function(e){for(;e;){var t=e.getAttribute("data-toolbar-order");if(null!=t)return(t=t.trim()).length?t.split(/\s*,\s*/g):[];e=e.parentElement}}(a.element);d&&(l=d.map((function(e){return t[e]||n}))),l.forEach((function(e){var t=e(a);if(t){var n=document.createElement("div");n.classList.add("toolbar-item"),n.appendChild(t),i.appendChild(n)}})),o.appendChild(i)}};a("label",(function(e){var t=e.element.parentNode;if(t&&/pre/i.test(t.nodeName)&&t.hasAttribute("data-label")){var n,a,r=t.getAttribute("data-label");try{a=document.querySelector("template#"+r)}catch(e){}return a?n=a.content:(t.hasAttribute("data-url")?(n=document.createElement("a")).href=t.getAttribute("data-url"):n=document.createElement("span"),n.textContent=r),n}})),Prism.hooks.add("complete",r)}}();
    +!function(){function t(t){var e=document.createElement("textarea");e.value=t.getText(),e.style.top="0",e.style.left="0",e.style.position="fixed",document.body.appendChild(e),e.focus(),e.select();try{var o=document.execCommand("copy");setTimeout((function(){o?t.success():t.error()}),1)}catch(e){setTimeout((function(){t.error(e)}),1)}document.body.removeChild(e)}"undefined"!=typeof Prism&&"undefined"!=typeof document&&(Prism.plugins.toolbar?Prism.plugins.toolbar.registerButton("copy-to-clipboard",(function(e){var o=e.element,n=function(t){var e={copy:"Copy","copy-error":"Press Ctrl+C to copy","copy-success":"Copied!","copy-timeout":5e3};for(var o in e){for(var n="data-prismjs-"+o,c=t;c&&!c.hasAttribute(n);)c=c.parentElement;c&&(e[o]=c.getAttribute(n))}return e}(o),c=document.createElement("button");c.className="copy-to-clipboard-button",c.setAttribute("type","button");var r=document.createElement("span");return c.appendChild(r),u("copy"),function(e,o){e.addEventListener("click",(function(){!function(e){navigator.clipboard?navigator.clipboard.writeText(e.getText()).then(e.success,(function(){t(e)})):t(e)}(o)}))}(c,{getText:function(){return o.textContent},success:function(){u("copy-success"),i()},error:function(){u("copy-error"),setTimeout((function(){!function(t){window.getSelection().selectAllChildren(t)}(o)}),1),i()}}),c;function i(){setTimeout((function(){u("copy")}),n["copy-timeout"])}function u(t){r.textContent=n[t],c.setAttribute("data-copy-state",t)}})):console.warn("Copy to Clipboard plugin loaded before Toolbar plugin."))}();
    diff --git a/js/swagger-ui-bundle.js b/js/swagger-ui-bundle.js
    deleted file mode 100644
    index c48cc4c..0000000
    --- a/js/swagger-ui-bundle.js
    +++ /dev/null
    @@ -1,134 +0,0 @@
    -!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t(function(){try{return require("esprima")}catch(e){}}()):"function"==typeof define&&define.amd?define(["esprima"],t):"object"==typeof exports?exports.SwaggerUIBundle=t(function(){try{return require("esprima")}catch(e){}}()):e.SwaggerUIBundle=t(e.esprima)}(window,function(e){return function(e){var t={};function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}return n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)n.d(r,o,function(t){return e[t]}.bind(null,o));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="/dist",n(n.s=488)}([function(e,t,n){"use strict";e.exports=n(104)},function(e,t,n){e.exports=function(){"use strict";var e=Array.prototype.slice;function t(e,t){t&&(e.prototype=Object.create(t.prototype)),e.prototype.constructor=e}function n(e){return a(e)?e:J(e)}function r(e){return s(e)?e:K(e)}function o(e){return u(e)?e:Y(e)}function i(e){return a(e)&&!c(e)?e:$(e)}function a(e){return!(!e||!e[p])}function s(e){return!(!e||!e[f])}function u(e){return!(!e||!e[h])}function c(e){return s(e)||u(e)}function l(e){return!(!e||!e[d])}t(r,n),t(o,n),t(i,n),n.isIterable=a,n.isKeyed=s,n.isIndexed=u,n.isAssociative=c,n.isOrdered=l,n.Keyed=r,n.Indexed=o,n.Set=i;var p="@@__IMMUTABLE_ITERABLE__@@",f="@@__IMMUTABLE_KEYED__@@",h="@@__IMMUTABLE_INDEXED__@@",d="@@__IMMUTABLE_ORDERED__@@",m=5,v=1<>>0;if(""+n!==t||4294967295===n)return NaN;t=n}return t<0?C(e)+t:t}function O(){return!0}function A(e,t,n){return(0===e||void 0!==n&&e<=-n)&&(void 0===t||void 0!==n&&t>=n)}function T(e,t){return P(e,t,0)}function j(e,t){return P(e,t,t)}function P(e,t,n){return void 0===e?n:e<0?Math.max(0,t+e):void 0===t?e:Math.min(t,e)}var I=0,M=1,N=2,R="function"==typeof Symbol&&Symbol.iterator,D="@@iterator",L=R||D;function U(e){this.next=e}function q(e,t,n,r){var o=0===e?t:1===e?n:[t,n];return r?r.value=o:r={value:o,done:!1},r}function F(){return{value:void 0,done:!0}}function B(e){return!!H(e)}function z(e){return e&&"function"==typeof e.next}function V(e){var t=H(e);return t&&t.call(e)}function H(e){var t=e&&(R&&e[R]||e[D]);if("function"==typeof t)return t}function W(e){return e&&"number"==typeof e.length}function J(e){return null==e?ie():a(e)?e.toSeq():function(e){var t=ue(e)||"object"==typeof e&&new te(e);if(!t)throw new TypeError("Expected Array or iterable object of values, or keyed object: "+e);return t}(e)}function K(e){return null==e?ie().toKeyedSeq():a(e)?s(e)?e.toSeq():e.fromEntrySeq():ae(e)}function Y(e){return null==e?ie():a(e)?s(e)?e.entrySeq():e.toIndexedSeq():se(e)}function $(e){return(null==e?ie():a(e)?s(e)?e.entrySeq():e:se(e)).toSetSeq()}U.prototype.toString=function(){return"[Iterator]"},U.KEYS=I,U.VALUES=M,U.ENTRIES=N,U.prototype.inspect=U.prototype.toSource=function(){return this.toString()},U.prototype[L]=function(){return this},t(J,n),J.of=function(){return J(arguments)},J.prototype.toSeq=function(){return this},J.prototype.toString=function(){return this.__toString("Seq {","}")},J.prototype.cacheResult=function(){return!this._cache&&this.__iterateUncached&&(this._cache=this.entrySeq().toArray(),this.size=this._cache.length),this},J.prototype.__iterate=function(e,t){return ce(this,e,t,!0)},J.prototype.__iterator=function(e,t){return le(this,e,t,!0)},t(K,J),K.prototype.toKeyedSeq=function(){return this},t(Y,J),Y.of=function(){return Y(arguments)},Y.prototype.toIndexedSeq=function(){return this},Y.prototype.toString=function(){return this.__toString("Seq [","]")},Y.prototype.__iterate=function(e,t){return ce(this,e,t,!1)},Y.prototype.__iterator=function(e,t){return le(this,e,t,!1)},t($,J),$.of=function(){return $(arguments)},$.prototype.toSetSeq=function(){return this},J.isSeq=oe,J.Keyed=K,J.Set=$,J.Indexed=Y;var G,Z,X,Q="@@__IMMUTABLE_SEQ__@@";function ee(e){this._array=e,this.size=e.length}function te(e){var t=Object.keys(e);this._object=e,this._keys=t,this.size=t.length}function ne(e){this._iterable=e,this.size=e.length||e.size}function re(e){this._iterator=e,this._iteratorCache=[]}function oe(e){return!(!e||!e[Q])}function ie(){return G||(G=new ee([]))}function ae(e){var t=Array.isArray(e)?new ee(e).fromEntrySeq():z(e)?new re(e).fromEntrySeq():B(e)?new ne(e).fromEntrySeq():"object"==typeof e?new te(e):void 0;if(!t)throw new TypeError("Expected Array or iterable object of [k, v] entries, or keyed object: "+e);return t}function se(e){var t=ue(e);if(!t)throw new TypeError("Expected Array or iterable object of values: "+e);return t}function ue(e){return W(e)?new ee(e):z(e)?new re(e):B(e)?new ne(e):void 0}function ce(e,t,n,r){var o=e._cache;if(o){for(var i=o.length-1,a=0;a<=i;a++){var s=o[n?i-a:a];if(!1===t(s[1],r?s[0]:a,e))return a+1}return a}return e.__iterateUncached(t,n)}function le(e,t,n,r){var o=e._cache;if(o){var i=o.length-1,a=0;return new U(function(){var e=o[n?i-a:a];return a++>i?{value:void 0,done:!0}:q(t,r?e[0]:a-1,e[1])})}return e.__iteratorUncached(t,n)}function pe(e,t){return t?function e(t,n,r,o){return Array.isArray(n)?t.call(o,r,Y(n).map(function(r,o){return e(t,r,o,n)})):he(n)?t.call(o,r,K(n).map(function(r,o){return e(t,r,o,n)})):n}(t,e,"",{"":e}):fe(e)}function fe(e){return Array.isArray(e)?Y(e).map(fe).toList():he(e)?K(e).map(fe).toMap():e}function he(e){return e&&(e.constructor===Object||void 0===e.constructor)}function de(e,t){if(e===t||e!=e&&t!=t)return!0;if(!e||!t)return!1;if("function"==typeof e.valueOf&&"function"==typeof t.valueOf){if((e=e.valueOf())===(t=t.valueOf())||e!=e&&t!=t)return!0;if(!e||!t)return!1}return!("function"!=typeof e.equals||"function"!=typeof t.equals||!e.equals(t))}function me(e,t){if(e===t)return!0;if(!a(t)||void 0!==e.size&&void 0!==t.size&&e.size!==t.size||void 0!==e.__hash&&void 0!==t.__hash&&e.__hash!==t.__hash||s(e)!==s(t)||u(e)!==u(t)||l(e)!==l(t))return!1;if(0===e.size&&0===t.size)return!0;var n=!c(e);if(l(e)){var r=e.entries();return t.every(function(e,t){var o=r.next().value;return o&&de(o[1],e)&&(n||de(o[0],t))})&&r.next().done}var o=!1;if(void 0===e.size)if(void 0===t.size)"function"==typeof e.cacheResult&&e.cacheResult();else{o=!0;var i=e;e=t,t=i}var p=!0,f=t.__iterate(function(t,r){if(n?!e.has(t):o?!de(t,e.get(r,y)):!de(e.get(r,y),t))return p=!1,!1});return p&&e.size===f}function ve(e,t){if(!(this instanceof ve))return new ve(e,t);if(this._value=e,this.size=void 0===t?1/0:Math.max(0,t),0===this.size){if(Z)return Z;Z=this}}function ge(e,t){if(!e)throw new Error(t)}function ye(e,t,n){if(!(this instanceof ye))return new ye(e,t,n);if(ge(0!==n,"Cannot step a Range by 0"),e=e||0,void 0===t&&(t=1/0),n=void 0===n?1:Math.abs(n),tr?{value:void 0,done:!0}:q(e,o,n[t?r-o++:o++])})},t(te,K),te.prototype.get=function(e,t){return void 0===t||this.has(e)?this._object[e]:t},te.prototype.has=function(e){return this._object.hasOwnProperty(e)},te.prototype.__iterate=function(e,t){for(var n=this._object,r=this._keys,o=r.length-1,i=0;i<=o;i++){var a=r[t?o-i:i];if(!1===e(n[a],a,this))return i+1}return i},te.prototype.__iterator=function(e,t){var n=this._object,r=this._keys,o=r.length-1,i=0;return new U(function(){var a=r[t?o-i:i];return i++>o?{value:void 0,done:!0}:q(e,a,n[a])})},te.prototype[d]=!0,t(ne,Y),ne.prototype.__iterateUncached=function(e,t){if(t)return this.cacheResult().__iterate(e,t);var n=V(this._iterable),r=0;if(z(n))for(var o;!(o=n.next()).done&&!1!==e(o.value,r++,this););return r},ne.prototype.__iteratorUncached=function(e,t){if(t)return this.cacheResult().__iterator(e,t);var n=V(this._iterable);if(!z(n))return new U(F);var r=0;return new U(function(){var t=n.next();return t.done?t:q(e,r++,t.value)})},t(re,Y),re.prototype.__iterateUncached=function(e,t){if(t)return this.cacheResult().__iterate(e,t);for(var n,r=this._iterator,o=this._iteratorCache,i=0;i=r.length){var t=n.next();if(t.done)return t;r[o]=t.value}return q(e,o,r[o++])})},t(ve,Y),ve.prototype.toString=function(){return 0===this.size?"Repeat []":"Repeat [ "+this._value+" "+this.size+" times ]"},ve.prototype.get=function(e,t){return this.has(e)?this._value:t},ve.prototype.includes=function(e){return de(this._value,e)},ve.prototype.slice=function(e,t){var n=this.size;return A(e,t,n)?this:new ve(this._value,j(t,n)-T(e,n))},ve.prototype.reverse=function(){return this},ve.prototype.indexOf=function(e){return de(this._value,e)?0:-1},ve.prototype.lastIndexOf=function(e){return de(this._value,e)?this.size:-1},ve.prototype.__iterate=function(e,t){for(var n=0;n=0&&t=0&&nn?{value:void 0,done:!0}:q(e,i++,a)})},ye.prototype.equals=function(e){return e instanceof ye?this._start===e._start&&this._end===e._end&&this._step===e._step:me(this,e)},t(be,n),t(_e,be),t(we,be),t(xe,be),be.Keyed=_e,be.Indexed=we,be.Set=xe;var Ee="function"==typeof Math.imul&&-2===Math.imul(4294967295,2)?Math.imul:function(e,t){var n=65535&(e|=0),r=65535&(t|=0);return n*r+((e>>>16)*r+n*(t>>>16)<<16>>>0)|0};function Se(e){return e>>>1&1073741824|3221225471&e}function Ce(e){if(!1===e||null==e)return 0;if("function"==typeof e.valueOf&&(!1===(e=e.valueOf())||null==e))return 0;if(!0===e)return 1;var t=typeof e;if("number"===t){if(e!=e||e===1/0)return 0;var n=0|e;for(n!==e&&(n^=4294967295*e);e>4294967295;)n^=e/=4294967295;return Se(n)}if("string"===t)return e.length>Me?function(e){var t=De[e];return void 0===t&&(t=ke(e),Re===Ne&&(Re=0,De={}),Re++,De[e]=t),t}(e):ke(e);if("function"==typeof e.hashCode)return e.hashCode();if("object"===t)return function(e){var t;if(je&&void 0!==(t=Oe.get(e)))return t;if(void 0!==(t=e[Ie]))return t;if(!Te){if(void 0!==(t=e.propertyIsEnumerable&&e.propertyIsEnumerable[Ie]))return t;if(void 0!==(t=function(e){if(e&&e.nodeType>0)switch(e.nodeType){case 1:return e.uniqueID;case 9:return e.documentElement&&e.documentElement.uniqueID}}(e)))return t}if(t=++Pe,1073741824&Pe&&(Pe=0),je)Oe.set(e,t);else{if(void 0!==Ae&&!1===Ae(e))throw new Error("Non-extensible objects are not allowed as keys.");if(Te)Object.defineProperty(e,Ie,{enumerable:!1,configurable:!1,writable:!1,value:t});else if(void 0!==e.propertyIsEnumerable&&e.propertyIsEnumerable===e.constructor.prototype.propertyIsEnumerable)e.propertyIsEnumerable=function(){return this.constructor.prototype.propertyIsEnumerable.apply(this,arguments)},e.propertyIsEnumerable[Ie]=t;else{if(void 0===e.nodeType)throw new Error("Unable to set a non-enumerable property on object.");e[Ie]=t}}return t}(e);if("function"==typeof e.toString)return ke(e.toString());throw new Error("Value type "+t+" cannot be hashed.")}function ke(e){for(var t=0,n=0;n=t.length)throw new Error("Missing value for key: "+t[n]);e.set(t[n],t[n+1])}})},Ue.prototype.toString=function(){return this.__toString("Map {","}")},Ue.prototype.get=function(e,t){return this._root?this._root.get(0,void 0,e,t):t},Ue.prototype.set=function(e,t){return Qe(this,e,t)},Ue.prototype.setIn=function(e,t){return this.updateIn(e,y,function(){return t})},Ue.prototype.remove=function(e){return Qe(this,e,y)},Ue.prototype.deleteIn=function(e){return this.updateIn(e,function(){return y})},Ue.prototype.update=function(e,t,n){return 1===arguments.length?e(this):this.updateIn([e],t,n)},Ue.prototype.updateIn=function(e,t,n){n||(n=t,t=void 0);var r=function e(t,n,r,o){var i=t===y,a=n.next();if(a.done){var s=i?r:t,u=o(s);return u===s?t:u}ge(i||t&&t.set,"invalid keyPath");var c=a.value,l=i?y:t.get(c,y),p=e(l,n,r,o);return p===l?t:p===y?t.remove(c):(i?Xe():t).set(c,p)}(this,rn(e),t,n);return r===y?void 0:r},Ue.prototype.clear=function(){return 0===this.size?this:this.__ownerID?(this.size=0,this._root=null,this.__hash=void 0,this.__altered=!0,this):Xe()},Ue.prototype.merge=function(){return rt(this,void 0,arguments)},Ue.prototype.mergeWith=function(t){var n=e.call(arguments,1);return rt(this,t,n)},Ue.prototype.mergeIn=function(t){var n=e.call(arguments,1);return this.updateIn(t,Xe(),function(e){return"function"==typeof e.merge?e.merge.apply(e,n):n[n.length-1]})},Ue.prototype.mergeDeep=function(){return rt(this,ot,arguments)},Ue.prototype.mergeDeepWith=function(t){var n=e.call(arguments,1);return rt(this,it(t),n)},Ue.prototype.mergeDeepIn=function(t){var n=e.call(arguments,1);return this.updateIn(t,Xe(),function(e){return"function"==typeof e.mergeDeep?e.mergeDeep.apply(e,n):n[n.length-1]})},Ue.prototype.sort=function(e){return Tt(Jt(this,e))},Ue.prototype.sortBy=function(e,t){return Tt(Jt(this,t,e))},Ue.prototype.withMutations=function(e){var t=this.asMutable();return e(t),t.wasAltered()?t.__ensureOwner(this.__ownerID):this},Ue.prototype.asMutable=function(){return this.__ownerID?this:this.__ensureOwner(new E)},Ue.prototype.asImmutable=function(){return this.__ensureOwner()},Ue.prototype.wasAltered=function(){return this.__altered},Ue.prototype.__iterator=function(e,t){return new Ye(this,e,t)},Ue.prototype.__iterate=function(e,t){var n=this,r=0;return this._root&&this._root.iterate(function(t){return r++,e(t[1],t[0],n)},t),r},Ue.prototype.__ensureOwner=function(e){return e===this.__ownerID?this:e?Ze(this.size,this._root,e,this.__hash):(this.__ownerID=e,this.__altered=!1,this)},Ue.isMap=qe;var Fe,Be="@@__IMMUTABLE_MAP__@@",ze=Ue.prototype;function Ve(e,t){this.ownerID=e,this.entries=t}function He(e,t,n){this.ownerID=e,this.bitmap=t,this.nodes=n}function We(e,t,n){this.ownerID=e,this.count=t,this.nodes=n}function Je(e,t,n){this.ownerID=e,this.keyHash=t,this.entries=n}function Ke(e,t,n){this.ownerID=e,this.keyHash=t,this.entry=n}function Ye(e,t,n){this._type=t,this._reverse=n,this._stack=e._root&&Ge(e._root)}function $e(e,t){return q(e,t[0],t[1])}function Ge(e,t){return{node:e,index:0,__prev:t}}function Ze(e,t,n,r){var o=Object.create(ze);return o.size=e,o._root=t,o.__ownerID=n,o.__hash=r,o.__altered=!1,o}function Xe(){return Fe||(Fe=Ze(0))}function Qe(e,t,n){var r,o;if(e._root){var i=w(b),a=w(_);if(r=et(e._root,e.__ownerID,0,void 0,t,n,i,a),!a.value)return e;o=e.size+(i.value?n===y?-1:1:0)}else{if(n===y)return e;o=1,r=new Ve(e.__ownerID,[[t,n]])}return e.__ownerID?(e.size=o,e._root=r,e.__hash=void 0,e.__altered=!0,e):r?Ze(o,r):Xe()}function et(e,t,n,r,o,i,a,s){return e?e.update(t,n,r,o,i,a,s):i===y?e:(x(s),x(a),new Ke(t,r,[o,i]))}function tt(e){return e.constructor===Ke||e.constructor===Je}function nt(e,t,n,r,o){if(e.keyHash===r)return new Je(t,r,[e.entry,o]);var i,a=(0===n?e.keyHash:e.keyHash>>>n)&g,s=(0===n?r:r>>>n)&g;return new He(t,1<>1&1431655765))+(e>>2&858993459))+(e>>4)&252645135,e+=e>>8,127&(e+=e>>16)}function ut(e,t,n,r){var o=r?e:S(e);return o[t]=n,o}ze[Be]=!0,ze.delete=ze.remove,ze.removeIn=ze.deleteIn,Ve.prototype.get=function(e,t,n,r){for(var o=this.entries,i=0,a=o.length;i=ct)return function(e,t,n,r){e||(e=new E);for(var o=new Ke(e,Ce(n),[n,r]),i=0;i>>e)&g),i=this.bitmap;return 0==(i&o)?r:this.nodes[st(i&o-1)].get(e+m,t,n,r)},He.prototype.update=function(e,t,n,r,o,i,a){void 0===n&&(n=Ce(r));var s=(0===t?n:n>>>t)&g,u=1<=lt)return function(e,t,n,r,o){for(var i=0,a=new Array(v),s=0;0!==n;s++,n>>>=1)a[s]=1&n?t[i++]:void 0;return a[r]=o,new We(e,i+1,a)}(e,f,c,s,d);if(l&&!d&&2===f.length&&tt(f[1^p]))return f[1^p];if(l&&d&&1===f.length&&tt(d))return d;var b=e&&e===this.ownerID,_=l?d?c:c^u:c|u,w=l?d?ut(f,p,d,b):function(e,t,n){var r=e.length-1;if(n&&t===r)return e.pop(),e;for(var o=new Array(r),i=0,a=0;a>>e)&g,i=this.nodes[o];return i?i.get(e+m,t,n,r):r},We.prototype.update=function(e,t,n,r,o,i,a){void 0===n&&(n=Ce(r));var s=(0===t?n:n>>>t)&g,u=o===y,c=this.nodes,l=c[s];if(u&&!l)return this;var p=et(l,e,t+m,n,r,o,i,a);if(p===l)return this;var f=this.count;if(l){if(!p&&--f0&&r=0&&e=e.size||t<0)return e.withMutations(function(e){t<0?kt(e,t).set(0,n):kt(e,0,t+1).set(t,n)});t+=e._origin;var r=e._tail,o=e._root,i=w(_);return t>=At(e._capacity)?r=Et(r,e.__ownerID,0,t,n,i):o=Et(o,e.__ownerID,e._level,t,n,i),i.value?e.__ownerID?(e._root=o,e._tail=r,e.__hash=void 0,e.__altered=!0,e):wt(e._origin,e._capacity,e._level,o,r):e}(this,e,t)},ft.prototype.remove=function(e){return this.has(e)?0===e?this.shift():e===this.size-1?this.pop():this.splice(e,1):this},ft.prototype.insert=function(e,t){return this.splice(e,0,t)},ft.prototype.clear=function(){return 0===this.size?this:this.__ownerID?(this.size=this._origin=this._capacity=0,this._level=m,this._root=this._tail=null,this.__hash=void 0,this.__altered=!0,this):xt()},ft.prototype.push=function(){var e=arguments,t=this.size;return this.withMutations(function(n){kt(n,0,t+e.length);for(var r=0;r>>t&g;if(r>=this.array.length)return new vt([],e);var o,i=0===r;if(t>0){var a=this.array[r];if((o=a&&a.removeBefore(e,t-m,n))===a&&i)return this}if(i&&!o)return this;var s=St(this,e);if(!i)for(var u=0;u>>t&g;if(o>=this.array.length)return this;if(t>0){var i=this.array[o];if((r=i&&i.removeAfter(e,t-m,n))===i&&o===this.array.length-1)return this}var a=St(this,e);return a.array.splice(o+1),r&&(a.array[o]=r),a};var gt,yt,bt={};function _t(e,t){var n=e._origin,r=e._capacity,o=At(r),i=e._tail;return a(e._root,e._level,0);function a(e,s,u){return 0===s?function(e,a){var s=a===o?i&&i.array:e&&e.array,u=a>n?0:n-a,c=r-a;return c>v&&(c=v),function(){if(u===c)return bt;var e=t?--c:u++;return s&&s[e]}}(e,u):function(e,o,i){var s,u=e&&e.array,c=i>n?0:n-i>>o,l=1+(r-i>>o);return l>v&&(l=v),function(){for(;;){if(s){var e=s();if(e!==bt)return e;s=null}if(c===l)return bt;var n=t?--l:c++;s=a(u&&u[n],o-m,i+(n<>>n&g,u=e&&s0){var c=e&&e.array[s],l=Et(c,t,n-m,r,o,i);return l===c?e:((a=St(e,t)).array[s]=l,a)}return u&&e.array[s]===o?e:(x(i),a=St(e,t),void 0===o&&s===a.array.length-1?a.array.pop():a.array[s]=o,a)}function St(e,t){return t&&e&&t===e.ownerID?e:new vt(e?e.array.slice():[],t)}function Ct(e,t){if(t>=At(e._capacity))return e._tail;if(t<1<0;)n=n.array[t>>>r&g],r-=m;return n}}function kt(e,t,n){void 0!==t&&(t|=0),void 0!==n&&(n|=0);var r=e.__ownerID||new E,o=e._origin,i=e._capacity,a=o+t,s=void 0===n?i:n<0?i+n:o+n;if(a===o&&s===i)return e;if(a>=s)return e.clear();for(var u=e._level,c=e._root,l=0;a+l<0;)c=new vt(c&&c.array.length?[void 0,c]:[],r),l+=1<<(u+=m);l&&(a+=l,o+=l,s+=l,i+=l);for(var p=At(i),f=At(s);f>=1<p?new vt([],r):h;if(h&&f>p&&am;y-=m){var b=p>>>y&g;v=v.array[b]=St(v.array[b],r)}v.array[p>>>m&g]=h}if(s=f)a-=f,s-=f,u=m,c=null,d=d&&d.removeBefore(r,0,a);else if(a>o||f>>u&g;if(_!==f>>>u&g)break;_&&(l+=(1<o&&(c=c.removeBefore(r,u,a-l)),c&&fi&&(i=c.size),a(u)||(c=c.map(function(e){return pe(e)})),r.push(c)}return i>e.size&&(e=e.setSize(i)),at(e,t,r)}function At(e){return e>>m<=v&&a.size>=2*i.size?(r=(o=a.filter(function(e,t){return void 0!==e&&s!==t})).toKeyedSeq().map(function(e){return e[0]}).flip().toMap(),e.__ownerID&&(r.__ownerID=o.__ownerID=e.__ownerID)):(r=i.remove(t),o=s===a.size-1?a.pop():a.set(s,void 0))}else if(u){if(n===a.get(s)[1])return e;r=i,o=a.set(s,[t,n])}else r=i.set(t,a.size),o=a.set(a.size,[t,n]);return e.__ownerID?(e.size=r.size,e._map=r,e._list=o,e.__hash=void 0,e):Pt(r,o)}function Nt(e,t){this._iter=e,this._useKeys=t,this.size=e.size}function Rt(e){this._iter=e,this.size=e.size}function Dt(e){this._iter=e,this.size=e.size}function Lt(e){this._iter=e,this.size=e.size}function Ut(e){var t=en(e);return t._iter=e,t.size=e.size,t.flip=function(){return e},t.reverse=function(){var t=e.reverse.apply(this);return t.flip=function(){return e.reverse()},t},t.has=function(t){return e.includes(t)},t.includes=function(t){return e.has(t)},t.cacheResult=tn,t.__iterateUncached=function(t,n){var r=this;return e.__iterate(function(e,n){return!1!==t(n,e,r)},n)},t.__iteratorUncached=function(t,n){if(t===N){var r=e.__iterator(t,n);return new U(function(){var e=r.next();if(!e.done){var t=e.value[0];e.value[0]=e.value[1],e.value[1]=t}return e})}return e.__iterator(t===M?I:M,n)},t}function qt(e,t,n){var r=en(e);return r.size=e.size,r.has=function(t){return e.has(t)},r.get=function(r,o){var i=e.get(r,y);return i===y?o:t.call(n,i,r,e)},r.__iterateUncached=function(r,o){var i=this;return e.__iterate(function(e,o,a){return!1!==r(t.call(n,e,o,a),o,i)},o)},r.__iteratorUncached=function(r,o){var i=e.__iterator(N,o);return new U(function(){var o=i.next();if(o.done)return o;var a=o.value,s=a[0];return q(r,s,t.call(n,a[1],s,e),o)})},r}function Ft(e,t){var n=en(e);return n._iter=e,n.size=e.size,n.reverse=function(){return e},e.flip&&(n.flip=function(){var t=Ut(e);return t.reverse=function(){return e.flip()},t}),n.get=function(n,r){return e.get(t?n:-1-n,r)},n.has=function(n){return e.has(t?n:-1-n)},n.includes=function(t){return e.includes(t)},n.cacheResult=tn,n.__iterate=function(t,n){var r=this;return e.__iterate(function(e,n){return t(e,n,r)},!n)},n.__iterator=function(t,n){return e.__iterator(t,!n)},n}function Bt(e,t,n,r){var o=en(e);return r&&(o.has=function(r){var o=e.get(r,y);return o!==y&&!!t.call(n,o,r,e)},o.get=function(r,o){var i=e.get(r,y);return i!==y&&t.call(n,i,r,e)?i:o}),o.__iterateUncached=function(o,i){var a=this,s=0;return e.__iterate(function(e,i,u){if(t.call(n,e,i,u))return s++,o(e,r?i:s-1,a)},i),s},o.__iteratorUncached=function(o,i){var a=e.__iterator(N,i),s=0;return new U(function(){for(;;){var i=a.next();if(i.done)return i;var u=i.value,c=u[0],l=u[1];if(t.call(n,l,c,e))return q(o,r?c:s++,l,i)}})},o}function zt(e,t,n,r){var o=e.size;if(void 0!==t&&(t|=0),void 0!==n&&(n===1/0?n=o:n|=0),A(t,n,o))return e;var i=T(t,o),a=j(n,o);if(i!=i||a!=a)return zt(e.toSeq().cacheResult(),t,n,r);var s,u=a-i;u==u&&(s=u<0?0:u);var c=en(e);return c.size=0===s?s:e.size&&s||void 0,!r&&oe(e)&&s>=0&&(c.get=function(t,n){return(t=k(this,t))>=0&&ts)return{value:void 0,done:!0};var e=o.next();return r||t===M?e:q(t,u-1,t===I?void 0:e.value[1],e)})},c}function Vt(e,t,n,r){var o=en(e);return o.__iterateUncached=function(o,i){var a=this;if(i)return this.cacheResult().__iterate(o,i);var s=!0,u=0;return e.__iterate(function(e,i,c){if(!s||!(s=t.call(n,e,i,c)))return u++,o(e,r?i:u-1,a)}),u},o.__iteratorUncached=function(o,i){var a=this;if(i)return this.cacheResult().__iterator(o,i);var s=e.__iterator(N,i),u=!0,c=0;return new U(function(){var e,i,l;do{if((e=s.next()).done)return r||o===M?e:q(o,c++,o===I?void 0:e.value[1],e);var p=e.value;i=p[0],l=p[1],u&&(u=t.call(n,l,i,a))}while(u);return o===N?e:q(o,i,l,e)})},o}function Ht(e,t){var n=s(e),o=[e].concat(t).map(function(e){return a(e)?n&&(e=r(e)):e=n?ae(e):se(Array.isArray(e)?e:[e]),e}).filter(function(e){return 0!==e.size});if(0===o.length)return e;if(1===o.length){var i=o[0];if(i===e||n&&s(i)||u(e)&&u(i))return i}var c=new ee(o);return n?c=c.toKeyedSeq():u(e)||(c=c.toSetSeq()),(c=c.flatten(!0)).size=o.reduce(function(e,t){if(void 0!==e){var n=t.size;if(void 0!==n)return e+n}},0),c}function Wt(e,t,n){var r=en(e);return r.__iterateUncached=function(r,o){var i=0,s=!1;return function e(u,c){var l=this;u.__iterate(function(o,u){return(!t||c0}function $t(e,t,r){var o=en(e);return o.size=new ee(r).map(function(e){return e.size}).min(),o.__iterate=function(e,t){for(var n,r=this.__iterator(M,t),o=0;!(n=r.next()).done&&!1!==e(n.value,o++,this););return o},o.__iteratorUncached=function(e,o){var i=r.map(function(e){return e=n(e),V(o?e.reverse():e)}),a=0,s=!1;return new U(function(){var n;return s||(n=i.map(function(e){return e.next()}),s=n.some(function(e){return e.done})),s?{value:void 0,done:!0}:q(e,a++,t.apply(null,n.map(function(e){return e.value})))})},o}function Gt(e,t){return oe(e)?t:e.constructor(t)}function Zt(e){if(e!==Object(e))throw new TypeError("Expected [K, V] tuple: "+e)}function Xt(e){return Le(e.size),C(e)}function Qt(e){return s(e)?r:u(e)?o:i}function en(e){return Object.create((s(e)?K:u(e)?Y:$).prototype)}function tn(){return this._iter.cacheResult?(this._iter.cacheResult(),this.size=this._iter.size,this):J.prototype.cacheResult.call(this)}function nn(e,t){return e>t?1:e=0;n--)t={value:arguments[n],next:t};return this.__ownerID?(this.size=e,this._head=t,this.__hash=void 0,this.__altered=!0,this):An(e,t)},En.prototype.pushAll=function(e){if(0===(e=o(e)).size)return this;Le(e.size);var t=this.size,n=this._head;return e.reverse().forEach(function(e){t++,n={value:e,next:n}}),this.__ownerID?(this.size=t,this._head=n,this.__hash=void 0,this.__altered=!0,this):An(t,n)},En.prototype.pop=function(){return this.slice(1)},En.prototype.unshift=function(){return this.push.apply(this,arguments)},En.prototype.unshiftAll=function(e){return this.pushAll(e)},En.prototype.shift=function(){return this.pop.apply(this,arguments)},En.prototype.clear=function(){return 0===this.size?this:this.__ownerID?(this.size=0,this._head=void 0,this.__hash=void 0,this.__altered=!0,this):Tn()},En.prototype.slice=function(e,t){if(A(e,t,this.size))return this;var n=T(e,this.size);if(j(t,this.size)!==this.size)return we.prototype.slice.call(this,e,t);for(var r=this.size-n,o=this._head;n--;)o=o.next;return this.__ownerID?(this.size=r,this._head=o,this.__hash=void 0,this.__altered=!0,this):An(r,o)},En.prototype.__ensureOwner=function(e){return e===this.__ownerID?this:e?An(this.size,this._head,e,this.__hash):(this.__ownerID=e,this.__altered=!1,this)},En.prototype.__iterate=function(e,t){if(t)return this.reverse().__iterate(e);for(var n=0,r=this._head;r&&!1!==e(r.value,n++,this);)r=r.next;return n},En.prototype.__iterator=function(e,t){if(t)return this.reverse().__iterator(e);var n=0,r=this._head;return new U(function(){if(r){var t=r.value;return r=r.next,q(e,n++,t)}return{value:void 0,done:!0}})},En.isStack=Sn;var Cn,kn="@@__IMMUTABLE_STACK__@@",On=En.prototype;function An(e,t,n,r){var o=Object.create(On);return o.size=e,o._head=t,o.__ownerID=n,o.__hash=r,o.__altered=!1,o}function Tn(){return Cn||(Cn=An(0))}function jn(e,t){var n=function(n){e.prototype[n]=t[n]};return Object.keys(t).forEach(n),Object.getOwnPropertySymbols&&Object.getOwnPropertySymbols(t).forEach(n),e}On[kn]=!0,On.withMutations=ze.withMutations,On.asMutable=ze.asMutable,On.asImmutable=ze.asImmutable,On.wasAltered=ze.wasAltered,n.Iterator=U,jn(n,{toArray:function(){Le(this.size);var e=new Array(this.size||0);return this.valueSeq().__iterate(function(t,n){e[n]=t}),e},toIndexedSeq:function(){return new Rt(this)},toJS:function(){return this.toSeq().map(function(e){return e&&"function"==typeof e.toJS?e.toJS():e}).__toJS()},toJSON:function(){return this.toSeq().map(function(e){return e&&"function"==typeof e.toJSON?e.toJSON():e}).__toJS()},toKeyedSeq:function(){return new Nt(this,!0)},toMap:function(){return Ue(this.toKeyedSeq())},toObject:function(){Le(this.size);var e={};return this.__iterate(function(t,n){e[n]=t}),e},toOrderedMap:function(){return Tt(this.toKeyedSeq())},toOrderedSet:function(){return gn(s(this)?this.valueSeq():this)},toSet:function(){return cn(s(this)?this.valueSeq():this)},toSetSeq:function(){return new Dt(this)},toSeq:function(){return u(this)?this.toIndexedSeq():s(this)?this.toKeyedSeq():this.toSetSeq()},toStack:function(){return En(s(this)?this.valueSeq():this)},toList:function(){return ft(s(this)?this.valueSeq():this)},toString:function(){return"[Iterable]"},__toString:function(e,t){return 0===this.size?e+t:e+" "+this.toSeq().map(this.__toStringMapper).join(", ")+" "+t},concat:function(){var t=e.call(arguments,0);return Gt(this,Ht(this,t))},includes:function(e){return this.some(function(t){return de(t,e)})},entries:function(){return this.__iterator(N)},every:function(e,t){Le(this.size);var n=!0;return this.__iterate(function(r,o,i){if(!e.call(t,r,o,i))return n=!1,!1}),n},filter:function(e,t){return Gt(this,Bt(this,e,t,!0))},find:function(e,t,n){var r=this.findEntry(e,t);return r?r[1]:n},forEach:function(e,t){return Le(this.size),this.__iterate(t?e.bind(t):e)},join:function(e){Le(this.size),e=void 0!==e?""+e:",";var t="",n=!0;return this.__iterate(function(r){n?n=!1:t+=e,t+=null!=r?r.toString():""}),t},keys:function(){return this.__iterator(I)},map:function(e,t){return Gt(this,qt(this,e,t))},reduce:function(e,t,n){var r,o;return Le(this.size),arguments.length<2?o=!0:r=t,this.__iterate(function(t,i,a){o?(o=!1,r=t):r=e.call(n,r,t,i,a)}),r},reduceRight:function(e,t,n){var r=this.toKeyedSeq().reverse();return r.reduce.apply(r,arguments)},reverse:function(){return Gt(this,Ft(this,!0))},slice:function(e,t){return Gt(this,zt(this,e,t,!0))},some:function(e,t){return!this.every(Rn(e),t)},sort:function(e){return Gt(this,Jt(this,e))},values:function(){return this.__iterator(M)},butLast:function(){return this.slice(0,-1)},isEmpty:function(){return void 0!==this.size?0===this.size:!this.some(function(){return!0})},count:function(e,t){return C(e?this.toSeq().filter(e,t):this)},countBy:function(e,t){return function(e,t,n){var r=Ue().asMutable();return e.__iterate(function(o,i){r.update(t.call(n,o,i,e),0,function(e){return e+1})}),r.asImmutable()}(this,e,t)},equals:function(e){return me(this,e)},entrySeq:function(){var e=this;if(e._cache)return new ee(e._cache);var t=e.toSeq().map(Nn).toIndexedSeq();return t.fromEntrySeq=function(){return e.toSeq()},t},filterNot:function(e,t){return this.filter(Rn(e),t)},findEntry:function(e,t,n){var r=n;return this.__iterate(function(n,o,i){if(e.call(t,n,o,i))return r=[o,n],!1}),r},findKey:function(e,t){var n=this.findEntry(e,t);return n&&n[0]},findLast:function(e,t,n){return this.toKeyedSeq().reverse().find(e,t,n)},findLastEntry:function(e,t,n){return this.toKeyedSeq().reverse().findEntry(e,t,n)},findLastKey:function(e,t){return this.toKeyedSeq().reverse().findKey(e,t)},first:function(){return this.find(O)},flatMap:function(e,t){return Gt(this,function(e,t,n){var r=Qt(e);return e.toSeq().map(function(o,i){return r(t.call(n,o,i,e))}).flatten(!0)}(this,e,t))},flatten:function(e){return Gt(this,Wt(this,e,!0))},fromEntrySeq:function(){return new Lt(this)},get:function(e,t){return this.find(function(t,n){return de(n,e)},void 0,t)},getIn:function(e,t){for(var n,r=this,o=rn(e);!(n=o.next()).done;){var i=n.value;if((r=r&&r.get?r.get(i,y):y)===y)return t}return r},groupBy:function(e,t){return function(e,t,n){var r=s(e),o=(l(e)?Tt():Ue()).asMutable();e.__iterate(function(i,a){o.update(t.call(n,i,a,e),function(e){return(e=e||[]).push(r?[a,i]:i),e})});var i=Qt(e);return o.map(function(t){return Gt(e,i(t))})}(this,e,t)},has:function(e){return this.get(e,y)!==y},hasIn:function(e){return this.getIn(e,y)!==y},isSubset:function(e){return e="function"==typeof e.includes?e:n(e),this.every(function(t){return e.includes(t)})},isSuperset:function(e){return(e="function"==typeof e.isSubset?e:n(e)).isSubset(this)},keyOf:function(e){return this.findKey(function(t){return de(t,e)})},keySeq:function(){return this.toSeq().map(Mn).toIndexedSeq()},last:function(){return this.toSeq().reverse().first()},lastKeyOf:function(e){return this.toKeyedSeq().reverse().keyOf(e)},max:function(e){return Kt(this,e)},maxBy:function(e,t){return Kt(this,t,e)},min:function(e){return Kt(this,e?Dn(e):qn)},minBy:function(e,t){return Kt(this,t?Dn(t):qn,e)},rest:function(){return this.slice(1)},skip:function(e){return this.slice(Math.max(0,e))},skipLast:function(e){return Gt(this,this.toSeq().reverse().skip(e).reverse())},skipWhile:function(e,t){return Gt(this,Vt(this,e,t,!0))},skipUntil:function(e,t){return this.skipWhile(Rn(e),t)},sortBy:function(e,t){return Gt(this,Jt(this,t,e))},take:function(e){return this.slice(0,Math.max(0,e))},takeLast:function(e){return Gt(this,this.toSeq().reverse().take(e).reverse())},takeWhile:function(e,t){return Gt(this,function(e,t,n){var r=en(e);return r.__iterateUncached=function(r,o){var i=this;if(o)return this.cacheResult().__iterate(r,o);var a=0;return e.__iterate(function(e,o,s){return t.call(n,e,o,s)&&++a&&r(e,o,i)}),a},r.__iteratorUncached=function(r,o){var i=this;if(o)return this.cacheResult().__iterator(r,o);var a=e.__iterator(N,o),s=!0;return new U(function(){if(!s)return{value:void 0,done:!0};var e=a.next();if(e.done)return e;var o=e.value,u=o[0],c=o[1];return t.call(n,c,u,i)?r===N?e:q(r,u,c,e):(s=!1,{value:void 0,done:!0})})},r}(this,e,t))},takeUntil:function(e,t){return this.takeWhile(Rn(e),t)},valueSeq:function(){return this.toIndexedSeq()},hashCode:function(){return this.__hash||(this.__hash=function(e){if(e.size===1/0)return 0;var t=l(e),n=s(e),r=t?1:0;return function(e,t){return t=Ee(t,3432918353),t=Ee(t<<15|t>>>-15,461845907),t=Ee(t<<13|t>>>-13,5),t=Ee((t=(t+3864292196|0)^e)^t>>>16,2246822507),t=Se((t=Ee(t^t>>>13,3266489909))^t>>>16)}(e.__iterate(n?t?function(e,t){r=31*r+Fn(Ce(e),Ce(t))|0}:function(e,t){r=r+Fn(Ce(e),Ce(t))|0}:t?function(e){r=31*r+Ce(e)|0}:function(e){r=r+Ce(e)|0}),r)}(this))}});var Pn=n.prototype;Pn[p]=!0,Pn[L]=Pn.values,Pn.__toJS=Pn.toArray,Pn.__toStringMapper=Ln,Pn.inspect=Pn.toSource=function(){return this.toString()},Pn.chain=Pn.flatMap,Pn.contains=Pn.includes,jn(r,{flip:function(){return Gt(this,Ut(this))},mapEntries:function(e,t){var n=this,r=0;return Gt(this,this.toSeq().map(function(o,i){return e.call(t,[i,o],r++,n)}).fromEntrySeq())},mapKeys:function(e,t){var n=this;return Gt(this,this.toSeq().flip().map(function(r,o){return e.call(t,r,o,n)}).flip())}});var In=r.prototype;function Mn(e,t){return t}function Nn(e,t){return[t,e]}function Rn(e){return function(){return!e.apply(this,arguments)}}function Dn(e){return function(){return-e.apply(this,arguments)}}function Ln(e){return"string"==typeof e?JSON.stringify(e):String(e)}function Un(){return S(arguments)}function qn(e,t){return et?-1:0}function Fn(e,t){return e^t+2654435769+(e<<6)+(e>>2)|0}return In[f]=!0,In[L]=Pn.entries,In.__toJS=Pn.toObject,In.__toStringMapper=function(e,t){return JSON.stringify(t)+": "+Ln(e)},jn(o,{toKeyedSeq:function(){return new Nt(this,!1)},filter:function(e,t){return Gt(this,Bt(this,e,t,!1))},findIndex:function(e,t){var n=this.findEntry(e,t);return n?n[0]:-1},indexOf:function(e){var t=this.keyOf(e);return void 0===t?-1:t},lastIndexOf:function(e){var t=this.lastKeyOf(e);return void 0===t?-1:t},reverse:function(){return Gt(this,Ft(this,!1))},slice:function(e,t){return Gt(this,zt(this,e,t,!1))},splice:function(e,t){var n=arguments.length;if(t=Math.max(0|t,0),0===n||2===n&&!t)return this;e=T(e,e<0?this.count():this.size);var r=this.slice(0,e);return Gt(this,1===n?r:r.concat(S(arguments,2),this.slice(e+t)))},findLastIndex:function(e,t){var n=this.findLastEntry(e,t);return n?n[0]:-1},first:function(){return this.get(0)},flatten:function(e){return Gt(this,Wt(this,e,!1))},get:function(e,t){return(e=k(this,e))<0||this.size===1/0||void 0!==this.size&&e>this.size?t:this.find(function(t,n){return n===e},void 0,t)},has:function(e){return(e=k(this,e))>=0&&(void 0!==this.size?this.size===1/0||e5e3)return e.textContent;return function(e){for(var n,r,o,i,a,s=e.textContent,u=0,c=s[0],l=1,p=e.innerHTML="",f=0;r=n,n=f<7&&"\\"==n?1:l;){if(l=c,c=s[++u],i=p.length>1,!l||f>8&&"\n"==l||[/\S/.test(l),1,1,!/[$\w]/.test(l),("/"==n||"\n"==n)&&i,'"'==n&&i,"'"==n&&i,s[u-4]+r+n=="--\x3e",r+n=="*/"][f])for(p&&(e.appendChild(a=t.createElement("span")).setAttribute("style",["color: #555; font-weight: bold;","","","color: #555;",""][f?f<3?2:f>6?4:f>3?3:+/^(a(bstract|lias|nd|rguments|rray|s(m|sert)?|uto)|b(ase|egin|ool(ean)?|reak|yte)|c(ase|atch|har|hecked|lass|lone|ompl|onst|ontinue)|de(bugger|cimal|clare|f(ault|er)?|init|l(egate|ete)?)|do|double|e(cho|ls?if|lse(if)?|nd|nsure|num|vent|x(cept|ec|p(licit|ort)|te(nds|nsion|rn)))|f(allthrough|alse|inal(ly)?|ixed|loat|or(each)?|riend|rom|unc(tion)?)|global|goto|guard|i(f|mp(lements|licit|ort)|n(it|clude(_once)?|line|out|stanceof|t(erface|ernal)?)?|s)|l(ambda|et|ock|ong)|m(icrolight|odule|utable)|NaN|n(amespace|ative|ext|ew|il|ot|ull)|o(bject|perator|r|ut|verride)|p(ackage|arams|rivate|rotected|rotocol|ublic)|r(aise|e(adonly|do|f|gister|peat|quire(_once)?|scue|strict|try|turn))|s(byte|ealed|elf|hort|igned|izeof|tatic|tring|truct|ubscript|uper|ynchronized|witch)|t(emplate|hen|his|hrows?|ransient|rue|ry|ype(alias|def|id|name|of))|u(n(checked|def(ined)?|ion|less|signed|til)|se|sing)|v(ar|irtual|oid|olatile)|w(char_t|hen|here|hile|ith)|xor|yield)$/.test(p):0]),a.appendChild(t.createTextNode(p))),o=f&&f<7?f:o,p="",f=11;![1,/[\/{}[(\-+*=<>:;|\\.,?!&@~]/.test(l),/[\])]/.test(l),/[$\w]/.test(l),"/"==l&&o<2&&"<"!=n,'"'==l,"'"==l,l+c+s[u+1]+s[u+2]=="\x3c!--",l+c=="/*",l+c=="//","#"==l][--f];);p+=l}}(e)}function Q(e){var t;if([/filename\*=[^']+'\w*'"([^"]+)";?/i,/filename\*=[^']+'\w*'([^;]+);?/i,/filename="([^;]*);?"/i,/filename=([^;]*);?/i].some(function(n){return null!==(t=n.exec(e))}),null!==t&&t.length>1)try{return decodeURIComponent(t[1])}catch(e){console.error(e)}return null}function ee(e){return t=e.replace(/\.[^.\/]*$/,""),b()(g()(t));var t}var te=function(e,t){if(e>t)return"Value must be less than Maximum"},ne=function(e,t){if(et)return"Value must be less than MaxLength"},pe=function(e,t){if(e.length2&&void 0!==arguments[2]?arguments[2]:{},r=n.isOAS3,o=void 0!==r&&r,i=n.bypassRequiredCheck,a=void 0!==i&&i,s=[],u=e.get("required"),c=Object(P.a)(e,{isOAS3:o}),p=c.schema,h=c.parameterContentMediaType;if(!p)return s;var m=p.get("required"),v=p.get("maximum"),g=p.get("minimum"),y=p.get("type"),b=p.get("format"),_=p.get("maxLength"),w=p.get("minLength"),x=p.get("pattern");if(y&&(u||m||t)){var E="string"===y&&t,S="array"===y&&l()(t)&&t.length,C="array"===y&&d.a.List.isList(t)&&t.count(),k="array"===y&&"string"==typeof t&&t,O="file"===y&&t instanceof A.a.File,T="boolean"===y&&(t||!1===t),j="number"===y&&(t||0===t),I="integer"===y&&(t||0===t),M="object"===y&&"object"===f()(t)&&null!==t,N="object"===y&&"string"==typeof t&&t,R=[E,S,C,k,O,T,j,I,M,N],D=R.some(function(e){return!!e});if((u||m)&&!D&&!a)return s.push("Required field is not provided"),s;if("object"===y&&"string"==typeof t&&(null===h||"application/json"===h))try{JSON.parse(t)}catch(e){return s.push("Parameter string value must be valid JSON"),s}if(x){var L=fe(t,x);L&&s.push(L)}if(_||0===_){var U=le(t,_);U&&s.push(U)}if(w){var q=pe(t,w);q&&s.push(q)}if(v||0===v){var F=te(t,v);F&&s.push(F)}if(g||0===g){var B=ne(t,g);B&&s.push(B)}if("string"===y){var z;if(!(z="date-time"===b?ue(t):"uuid"===b?ce(t):se(t)))return s;s.push(z)}else if("boolean"===y){var V=ae(t);if(!V)return s;s.push(V)}else if("number"===y){var H=re(t);if(!H)return s;s.push(H)}else if("integer"===y){var W=oe(t);if(!W)return s;s.push(W)}else if("array"===y){var J;if(!C||!t.count())return s;J=p.getIn(["items","type"]),t.forEach(function(e,t){var n;"number"===J?n=re(e):"integer"===J?n=oe(e):"string"===J&&(n=se(e)),n&&s.push({index:t,error:n})})}else if("file"===y){var K=ie(t);if(!K)return s;s.push(K)}}return s},de=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};if(/xml/.test(t)){if(!e.xml||!e.xml.name){if(e.xml=e.xml||{},!e.$$ref)return e.type||e.items||e.properties||e.additionalProperties?'\n\x3c!-- XML example cannot be generated; root element name is undefined --\x3e':null;var r=e.$$ref.match(/\S*\/(\S+)$/);e.xml.name=r[1]}return Object(k.memoizedCreateXMLExample)(e,n)}var i=Object(k.memoizedSampleFromSchema)(e,n);return"object"===f()(i)?o()(i,null,2):i},me=function(){var e={},t=A.a.location.search;if(!t)return{};if(""!=t){var n=t.substr(1).split("&");for(var r in n)n.hasOwnProperty(r)&&(r=n[r].split("="),e[decodeURIComponent(r[0])]=r[1]&&decodeURIComponent(r[1])||"")}return e},ve=function(t){return(t instanceof e?t:new e(t.toString(),"utf-8")).toString("base64")},ge={operationsSorter:{alpha:function(e,t){return e.get("path").localeCompare(t.get("path"))},method:function(e,t){return e.get("method").localeCompare(t.get("method"))}},tagsSorter:{alpha:function(e,t){return e.localeCompare(t)}}},ye=function(e){var t=[];for(var n in e){var r=e[n];void 0!==r&&""!==r&&t.push([n,"=",encodeURIComponent(r).replace(/%20/g,"+")].join(""))}return t.join("&")},be=function(e,t,n){return!!E()(n,function(n){return C()(e[n],t[n])})};function _e(e){return"string"!=typeof e||""===e?"":Object(m.sanitizeUrl)(e)}function we(e){if(!d.a.OrderedMap.isOrderedMap(e))return null;if(!e.size)return null;var t=e.find(function(e,t){return t.startsWith("2")&&u()(e.get("content")||{}).length>0}),n=e.get("default")||d.a.OrderedMap(),r=(n.get("content")||d.a.OrderedMap()).keySeq().toJS().length?n:null;return t||r}var xe=function(e){return"string"==typeof e||e instanceof String?e.trim().replace(/\s/g,"%20"):""},Ee=function(e){return j()(xe(e).replace(/%20/g,"_"))},Se=function(e){return e.filter(function(e,t){return/^x-/.test(t)})},Ce=function(e){return e.filter(function(e,t){return/^pattern|maxLength|minLength|maximum|minimum/.test(t)})};function ke(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:function(){return!0};if("object"!==f()(e)||l()(e)||null===e||!t)return e;var r=a()({},e);return u()(r).forEach(function(e){e===t&&n(r[e],e)?delete r[e]:r[e]=ke(r[e],t,n)}),r}function Oe(e){if("string"==typeof e)return e;if(e&&e.toJS&&(e=e.toJS()),"object"===f()(e)&&null!==e)try{return o()(e,null,2)}catch(t){return String(e)}return null==e?"":e.toString()}function Ae(e){return"number"==typeof e?e.toString():e}function Te(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=t.returnAll,r=void 0!==n&&n,o=t.allowHashes,i=void 0===o||o;if(!d.a.Map.isMap(e))throw new Error("paramToIdentifier: received a non-Im.Map parameter as input");var a=e.get("name"),s=e.get("in"),u=[];return e&&e.hashCode&&s&&a&&i&&u.push("".concat(s,".").concat(a,".hash-").concat(e.hashCode())),s&&a&&u.push("".concat(s,".").concat(a)),u.push(a),r?u:u[0]||""}function je(e,t){return Te(e,{returnAll:!0}).map(function(e){return t[e]}).filter(function(e){return void 0!==e})[0]}function Pe(){return Me(M()(32).toString("base64"))}function Ie(e){return Me(R()("sha256").update(e).digest("base64"))}function Me(e){return e.replace(/\+/g,"-").replace(/\//g,"_").replace(/=/g,"")}}).call(this,n(64).Buffer)},function(e,t){e.exports=function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}},function(e,t,n){var r=n(54);function o(e,t){for(var n=0;n1?t-1:0),o=1;o2?n-2:0),i=2;i>",i={listOf:function(e){return c(e,"List",r.List.isList)},mapOf:function(e,t){return l(e,t,"Map",r.Map.isMap)},orderedMapOf:function(e,t){return l(e,t,"OrderedMap",r.OrderedMap.isOrderedMap)},setOf:function(e){return c(e,"Set",r.Set.isSet)},orderedSetOf:function(e){return c(e,"OrderedSet",r.OrderedSet.isOrderedSet)},stackOf:function(e){return c(e,"Stack",r.Stack.isStack)},iterableOf:function(e){return c(e,"Iterable",r.Iterable.isIterable)},recordOf:function(e){return s(function(t,n,o,i,s){for(var u=arguments.length,c=Array(u>5?u-5:0),l=5;l6?u-6:0),l=6;l5?c-5:0),p=5;p5?i-5:0),s=5;s key("+l[p]+")"].concat(a));if(h instanceof Error)return h}})).apply(void 0,i);var u})}function p(e){var t=void 0===arguments[1]?"Iterable":arguments[1],n=void 0===arguments[2]?r.Iterable.isIterable:arguments[2];return s(function(r,o,i,s,u){for(var c=arguments.length,l=Array(c>5?c-5:0),p=5;p4)}function u(e){var t=e.get("swagger");return"string"==typeof t&&t.startsWith("2.0")}function c(e){return function(t,n){return function(r){return n&&n.specSelectors&&n.specSelectors.specJson?s(n.specSelectors.specJson())?a.a.createElement(e,o()({},r,n,{Ori:t})):a.a.createElement(t,r):(console.warn("OAS3 wrapper: couldn't get spec"),null)}}}},function(e,t,n){"use strict";
    -/*
    -object-assign
    -(c) Sindre Sorhus
    -@license MIT
    -*/var r=Object.getOwnPropertySymbols,o=Object.prototype.hasOwnProperty,i=Object.prototype.propertyIsEnumerable;function a(e){if(null==e)throw new TypeError("Object.assign cannot be called with null or undefined");return Object(e)}e.exports=function(){try{if(!Object.assign)return!1;var e=new String("abc");if(e[5]="de","5"===Object.getOwnPropertyNames(e)[0])return!1;for(var t={},n=0;n<10;n++)t["_"+String.fromCharCode(n)]=n;if("0123456789"!==Object.getOwnPropertyNames(t).map(function(e){return t[e]}).join(""))return!1;var r={};return"abcdefghijklmnopqrst".split("").forEach(function(e){r[e]=e}),"abcdefghijklmnopqrst"===Object.keys(Object.assign({},r)).join("")}catch(e){return!1}}()?Object.assign:function(e,t){for(var n,s,u=a(e),c=1;c0){var o=n.map(function(e){return console.error(e),e.line=e.fullPath?g(y,e.fullPath):null,e.path=e.fullPath?e.fullPath.join("."):null,e.level="error",e.type="thrown",e.source="resolver",A()(e,"message",{enumerable:!0,value:e.message}),e});i.newThrownErrBatch(o)}return r.updateResolved(t)})}},_e=[],we=V()(k()(S.a.mark(function e(){var t,n,r,o,i,a,s,u,c,l,p,f,h,d,m,v,g;return S.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:if(t=_e.system){e.next=4;break}return console.error("debResolveSubtrees: don't have a system to operate on, aborting."),e.abrupt("return");case 4:if(n=t.errActions,r=t.errSelectors,o=t.fn,i=o.resolveSubtree,a=o.AST,s=void 0===a?{}:a,u=t.specSelectors,c=t.specActions,i){e.next=8;break}return console.error("Error: Swagger-Client did not provide a `resolveSubtree` method, doing nothing."),e.abrupt("return");case 8:return l=s.getLineNumberForPath?s.getLineNumberForPath:function(){},p=u.specStr(),f=t.getConfigs(),h=f.modelPropertyMacro,d=f.parameterMacro,m=f.requestInterceptor,v=f.responseInterceptor,e.prev=11,e.next=14,_e.reduce(function(){var e=k()(S.a.mark(function e(t,o){var a,s,c,f,g,y,b;return S.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,t;case 2:return a=e.sent,s=a.resultMap,c=a.specWithCurrentSubtrees,e.next=7,i(c,o,{baseDoc:u.url(),modelPropertyMacro:h,parameterMacro:d,requestInterceptor:m,responseInterceptor:v});case 7:return f=e.sent,g=f.errors,y=f.spec,r.allErrors().size&&n.clearBy(function(e){return"thrown"!==e.get("type")||"resolver"!==e.get("source")||!e.get("fullPath").every(function(e,t){return e===o[t]||void 0===o[t]})}),j()(g)&&g.length>0&&(b=g.map(function(e){return e.line=e.fullPath?l(p,e.fullPath):null,e.path=e.fullPath?e.fullPath.join("."):null,e.level="error",e.type="thrown",e.source="resolver",A()(e,"message",{enumerable:!0,value:e.message}),e}),n.newThrownErrBatch(b)),W()(s,o,y),W()(c,o,y),e.abrupt("return",{resultMap:s,specWithCurrentSubtrees:c});case 15:case"end":return e.stop()}},e)}));return function(t,n){return e.apply(this,arguments)}}(),x.a.resolve({resultMap:(u.specResolvedSubtree([])||Object(R.Map)()).toJS(),specWithCurrentSubtrees:u.specJson().toJS()}));case 14:g=e.sent,delete _e.system,_e=[],e.next=22;break;case 19:e.prev=19,e.t0=e.catch(11),console.error(e.t0);case 22:c.updateResolvedSubtree([],g.resultMap);case 23:case"end":return e.stop()}},e,null,[[11,19]])})),35),xe=function(e){return function(t){_e.map(function(e){return e.join("@@")}).indexOf(e.join("@@"))>-1||(_e.push(e),_e.system=t,we())}};function Ee(e,t,n,r,o){return{type:X,payload:{path:e,value:r,paramName:t,paramIn:n,isXml:o}}}function Se(e,t,n,r){return{type:X,payload:{path:e,param:t,value:n,isXml:r}}}var Ce=function(e,t){return{type:le,payload:{path:e,value:t}}},ke=function(){return{type:le,payload:{path:[],value:Object(R.Map)()}}},Oe=function(e,t){return{type:ee,payload:{pathMethod:e,isOAS3:t}}},Ae=function(e,t,n,r){return{type:Q,payload:{pathMethod:e,paramName:t,paramIn:n,includeEmptyValue:r}}};function Te(e){return{type:se,payload:{pathMethod:e}}}function je(e,t){return{type:ue,payload:{path:e,value:t,key:"consumes_value"}}}function Pe(e,t){return{type:ue,payload:{path:e,value:t,key:"produces_value"}}}var Ie=function(e,t,n){return{payload:{path:e,method:t,res:n},type:te}},Me=function(e,t,n){return{payload:{path:e,method:t,req:n},type:ne}},Ne=function(e,t,n){return{payload:{path:e,method:t,req:n},type:re}},Re=function(e){return{payload:e,type:oe}},De=function(e){return function(t){var n=t.fn,r=t.specActions,o=t.specSelectors,i=t.getConfigs,a=t.oas3Selectors,s=e.pathName,u=e.method,c=e.operation,l=i(),p=l.requestInterceptor,f=l.responseInterceptor,h=c.toJS();if(c&&c.get("parameters")&&c.get("parameters").filter(function(e){return e&&!0===e.get("allowEmptyValue")}).forEach(function(t){if(o.parameterInclusionSettingFor([s,u],t.get("name"),t.get("in"))){e.parameters=e.parameters||{};var n=Object(J.C)(t,e.parameters);(!n||n&&0===n.size)&&(e.parameters[t.get("name")]="")}}),e.contextUrl=L()(o.url()).toString(),h&&h.operationId?e.operationId=h.operationId:h&&s&&u&&(e.operationId=n.opId(h,s,u)),o.isOAS3()){var d="".concat(s,":").concat(u);e.server=a.selectedServer(d)||a.selectedServer();var m=a.serverVariables({server:e.server,namespace:d}).toJS(),g=a.serverVariables({server:e.server}).toJS();e.serverVariables=_()(m).length?m:g,e.requestContentType=a.requestContentType(s,u),e.responseContentType=a.responseContentType(s,u)||"*/*";var b=a.requestBodyValue(s,u);Object(J.t)(b)?e.requestBody=JSON.parse(b):b&&b.toJS?e.requestBody=b.toJS():e.requestBody=b}var w=y()({},e);w=n.buildRequest(w),r.setRequest(e.pathName,e.method,w);e.requestInterceptor=function(t){var n=p.apply(this,[t]),o=y()({},n);return r.setMutatedRequest(e.pathName,e.method,o),n},e.responseInterceptor=f;var x=v()();return n.execute(e).then(function(t){t.duration=v()()-x,r.setResponse(e.pathName,e.method,t)}).catch(function(t){console.error(t),r.setResponse(e.pathName,e.method,{error:!0,err:q()(t)})})}},Le=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=e.path,n=e.method,r=d()(e,["path","method"]);return function(e){var o=e.fn.fetch,i=e.specSelectors,a=e.specActions,s=i.specJsonWithResolvedSubtrees().toJS(),u=i.operationScheme(t,n),c=i.contentTypeValues([t,n]).toJS(),l=c.requestContentType,p=c.responseContentType,f=/xml/i.test(l),h=i.parameterValues([t,n],f).toJS();return a.executeRequest(Y({},r,{fetch:o,spec:s,pathName:t,method:n,parameters:h,requestContentType:l,scheme:u,responseContentType:p}))}};function Ue(e,t){return{type:ie,payload:{path:e,method:t}}}function qe(e,t){return{type:ae,payload:{path:e,method:t}}}function Fe(e,t,n){return{type:pe,payload:{scheme:e,path:t,method:n}}}},function(e,t,n){var r=n(32),o=n(22),i=n(63),a=n(77),s=n(75),u=function(e,t,n){var c,l,p,f=e&u.F,h=e&u.G,d=e&u.S,m=e&u.P,v=e&u.B,g=e&u.W,y=h?o:o[t]||(o[t]={}),b=y.prototype,_=h?r:d?r[t]:(r[t]||{}).prototype;for(c in h&&(n=t),n)(l=!f&&_&&void 0!==_[c])&&s(y,c)||(p=l?_[c]:n[c],y[c]=h&&"function"!=typeof _[c]?n[c]:v&&l?i(p,r):g&&_[c]==p?function(e){var t=function(t,n,r){if(this instanceof e){switch(arguments.length){case 0:return new e;case 1:return new e(t);case 2:return new e(t,n)}return new e(t,n,r)}return e.apply(this,arguments)};return t.prototype=e.prototype,t}(p):m&&"function"==typeof p?i(Function.call,p):p,m&&((y.virtual||(y.virtual={}))[c]=p,e&u.R&&b&&!b[c]&&a(b,c,p)))};u.F=1,u.G=2,u.S=4,u.P=8,u.B=16,u.W=32,u.U=64,u.R=128,e.exports=u},function(e,t,n){"use strict";var r=n(138),o=["kind","resolve","construct","instanceOf","predicate","represent","defaultStyle","styleAliases"],i=["scalar","sequence","mapping"];e.exports=function(e,t){var n,a;if(t=t||{},Object.keys(t).forEach(function(t){if(-1===o.indexOf(t))throw new r('Unknown option "'+t+'" is met in definition of "'+e+'" YAML type.')}),this.tag=e,this.kind=t.kind||null,this.resolve=t.resolve||function(){return!0},this.construct=t.construct||function(e){return e},this.instanceOf=t.instanceOf||null,this.predicate=t.predicate||null,this.represent=t.represent||null,this.defaultStyle=t.defaultStyle||null,this.styleAliases=(n=t.styleAliases||null,a={},null!==n&&Object.keys(n).forEach(function(e){n[e].forEach(function(t){a[String(t)]=e})}),a),-1===i.indexOf(this.kind))throw new r('Unknown kind "'+this.kind+'" is specified for "'+e+'" YAML type.')}},function(e,t){var n=e.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=n)},function(e,t,n){var r=n(197)("wks"),o=n(199),i=n(41).Symbol,a="function"==typeof i;(e.exports=function(e){return r[e]||(r[e]=a&&i[e]||(a?i:o)("Symbol."+e))}).store=r},function(e,t,n){var r=n(214)("wks"),o=n(159),i=n(32).Symbol,a="function"==typeof i;(e.exports=function(e){return r[e]||(r[e]=a&&i[e]||(a?i:o)("Symbol."+e))}).store=r},function(e,t,n){var r=n(41),o=n(72),i=n(81),a=n(97),s=n(153),u=function(e,t,n){var c,l,p,f,h=e&u.F,d=e&u.G,m=e&u.S,v=e&u.P,g=e&u.B,y=d?r:m?r[t]||(r[t]={}):(r[t]||{}).prototype,b=d?o:o[t]||(o[t]={}),_=b.prototype||(b.prototype={});for(c in d&&(n=t),n)p=((l=!h&&y&&void 0!==y[c])?y:n)[c],f=g&&l?s(p,r):v&&"function"==typeof p?s(Function.call,p):p,y&&a(y,c,p,e&u.U),b[c]!=p&&i(b,c,f),v&&_[c]!=p&&(_[c]=p)};r.core=o,u.F=1,u.G=2,u.S=4,u.P=8,u.B=16,u.W=32,u.U=64,u.R=128,e.exports=u},function(e,t){var n;n=function(){return this}();try{n=n||new Function("return this")()}catch(e){"object"==typeof window&&(n=window)}e.exports=n},function(e,t){var n=Array.isArray;e.exports=n},function(e,t,n){"use strict";var r=!("undefined"==typeof window||!window.document||!window.document.createElement),o={canUseDOM:r,canUseWorkers:"undefined"!=typeof Worker,canUseEventListeners:r&&!(!window.addEventListener&&!window.attachEvent),canUseViewport:r&&!!window.screen,isInWorker:!r};e.exports=o},function(e,t,n){"use strict";var r=Object.prototype.hasOwnProperty;function o(e,t){return!!e&&r.call(e,t)}var i=/\\([\\!"#$%&'()*+,.\/:;<=>?@[\]^_`{|}~-])/g;function a(e){return!(e>=55296&&e<=57343)&&(!(e>=64976&&e<=65007)&&(65535!=(65535&e)&&65534!=(65535&e)&&(!(e>=0&&e<=8)&&(11!==e&&(!(e>=14&&e<=31)&&(!(e>=127&&e<=159)&&!(e>1114111)))))))}function s(e){if(e>65535){var t=55296+((e-=65536)>>10),n=56320+(1023&e);return String.fromCharCode(t,n)}return String.fromCharCode(e)}var u=/&([a-z#][a-z0-9]{1,31});/gi,c=/^#((?:x[a-f0-9]{1,8}|[0-9]{1,8}))/i,l=n(463);function p(e,t){var n=0;return o(l,t)?l[t]:35===t.charCodeAt(0)&&c.test(t)&&a(n="x"===t[1].toLowerCase()?parseInt(t.slice(2),16):parseInt(t.slice(1),10))?s(n):e}var f=/[&<>"]/,h=/[&<>"]/g,d={"&":"&","<":"<",">":">",'"':"""};function m(e){return d[e]}t.assign=function(e){return[].slice.call(arguments,1).forEach(function(t){if(t){if("object"!=typeof t)throw new TypeError(t+"must be object");Object.keys(t).forEach(function(n){e[n]=t[n]})}}),e},t.isString=function(e){return"[object String]"===function(e){return Object.prototype.toString.call(e)}(e)},t.has=o,t.unescapeMd=function(e){return e.indexOf("\\")<0?e:e.replace(i,"$1")},t.isValidEntityCode=a,t.fromCodePoint=s,t.replaceEntities=function(e){return e.indexOf("&")<0?e:e.replace(u,p)},t.escapeHtml=function(e){return f.test(e)?e.replace(h,m):e}},function(e,t,n){var r=n(55),o=n(771);e.exports=function(e,t){if(null==e)return{};var n,i,a=o(e,t);if(r){var s=r(e);for(i=0;i=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}},function(e,t){var n=e.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=n)},function(e,t,n){var r=n(35),o=n(99),i=n(73),a=/"/g,s=function(e,t,n,r){var o=String(i(e)),s="<"+t;return""!==n&&(s+=" "+n+'="'+String(r).replace(a,""")+'"'),s+">"+o+""};e.exports=function(e,t){var n={};n[e]=t(s),r(r.P+r.F*o(function(){var t=""[e]('"');return t!==t.toLowerCase()||t.split('"').length>3}),"String",n)}},function(e,t){e.exports=function(e){return"object"==typeof e?null!==e:"function"==typeof e}},function(e,t,n){"use strict";n.r(t),n.d(t,"NEW_THROWN_ERR",function(){return i}),n.d(t,"NEW_THROWN_ERR_BATCH",function(){return a}),n.d(t,"NEW_SPEC_ERR",function(){return s}),n.d(t,"NEW_SPEC_ERR_BATCH",function(){return u}),n.d(t,"NEW_AUTH_ERR",function(){return c}),n.d(t,"CLEAR",function(){return l}),n.d(t,"CLEAR_BY",function(){return p}),n.d(t,"newThrownErr",function(){return f}),n.d(t,"newThrownErrBatch",function(){return h}),n.d(t,"newSpecErr",function(){return d}),n.d(t,"newSpecErrBatch",function(){return m}),n.d(t,"newAuthErr",function(){return v}),n.d(t,"clear",function(){return g}),n.d(t,"clearBy",function(){return y});var r=n(119),o=n.n(r),i="err_new_thrown_err",a="err_new_thrown_err_batch",s="err_new_spec_err",u="err_new_spec_err_batch",c="err_new_auth_err",l="err_clear",p="err_clear_by";function f(e){return{type:i,payload:o()(e)}}function h(e){return{type:a,payload:e}}function d(e){return{type:s,payload:e}}function m(e){return{type:u,payload:e}}function v(e){return{type:c,payload:e}}function g(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return{type:l,payload:e}}function y(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:function(){return!0};return{type:p,payload:e}}},function(e,t,n){var r=n(98);e.exports=function(e){if(!r(e))throw TypeError(e+" is not an object!");return e}},function(e,t,n){var r=n(43);e.exports=function(e){if(!r(e))throw TypeError(e+" is not an object!");return e}},function(e,t){"function"==typeof Object.create?e.exports=function(e,t){e.super_=t,e.prototype=Object.create(t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}})}:e.exports=function(e,t){e.super_=t;var n=function(){};n.prototype=t.prototype,e.prototype=new n,e.prototype.constructor=e}},function(e,t,n){var r=n(64),o=r.Buffer;function i(e,t){for(var n in e)t[n]=e[n]}function a(e,t,n){return o(e,t,n)}o.from&&o.alloc&&o.allocUnsafe&&o.allocUnsafeSlow?e.exports=r:(i(r,t),t.Buffer=a),i(o,a),a.from=function(e,t,n){if("number"==typeof e)throw new TypeError("Argument must not be a number");return o(e,t,n)},a.alloc=function(e,t,n){if("number"!=typeof e)throw new TypeError("Argument must be a number");var r=o(e);return void 0!==t?"string"==typeof n?r.fill(t,n):r.fill(t):r.fill(0),r},a.allocUnsafe=function(e){if("number"!=typeof e)throw new TypeError("Argument must be a number");return o(e)},a.allocUnsafeSlow=function(e){if("number"!=typeof e)throw new TypeError("Argument must be a number");return r.SlowBuffer(e)}},function(e,t,n){var r=n(46),o=n(349),i=n(218),a=Object.defineProperty;t.f=n(50)?Object.defineProperty:function(e,t,n){if(r(e),t=i(t,!0),r(n),o)try{return a(e,t,n)}catch(e){}if("get"in n||"set"in n)throw TypeError("Accessors not supported!");return"value"in n&&(e[t]=n.value),e}},function(e,t,n){e.exports=!n(82)(function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a})},function(e,t,n){var r=n(366),o="object"==typeof self&&self&&self.Object===Object&&self,i=r||o||Function("return this")();e.exports=i},function(e,t){e.exports=function(e){var t=typeof e;return null!=e&&("object"==t||"function"==t)}},function(e,t,n){"use strict";e.exports={debugTool:null}},function(e,t,n){e.exports=n(573)},function(e,t,n){e.exports=n(770)},function(e,t,n){e.exports=function(e){var t={};function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}return n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)n.d(r,o,function(t){return e[t]}.bind(null,o));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=45)}([function(e,t){e.exports=n(17)},function(e,t){e.exports=n(14)},function(e,t){e.exports=n(26)},function(e,t){e.exports=n(16)},function(e,t){e.exports=n(123)},function(e,t){e.exports=n(60)},function(e,t){e.exports=n(61)},function(e,t){e.exports=n(55)},function(e,t){e.exports=n(2)},function(e,t){e.exports=n(54)},function(e,t){e.exports=n(94)},function(e,t){e.exports=n(28)},function(e,t){e.exports=n(930)},function(e,t){e.exports=n(12)},function(e,t){e.exports=n(192)},function(e,t){e.exports=n(936)},function(e,t){e.exports=n(93)},function(e,t){e.exports=n(193)},function(e,t){e.exports=n(939)},function(e,t){e.exports=n(943)},function(e,t){e.exports=n(944)},function(e,t){e.exports=n(92)},function(e,t){e.exports=n(13)},function(e,t){e.exports=n(146)},function(e,t){e.exports=n(4)},function(e,t){e.exports=n(5)},function(e,t){e.exports=n(946)},function(e,t){e.exports=n(421)},function(e,t){e.exports=n(949)},function(e,t){e.exports=n(52)},function(e,t){e.exports=n(64)},function(e,t){e.exports=n(283)},function(e,t){e.exports=n(272)},function(e,t){e.exports=n(950)},function(e,t){e.exports=n(145)},function(e,t){e.exports=n(951)},function(e,t){e.exports=n(959)},function(e,t){e.exports=n(960)},function(e,t){e.exports=n(961)},function(e,t){e.exports=n(40)},function(e,t){e.exports=n(264)},function(e,t){e.exports=n(37)},function(e,t){e.exports=n(964)},function(e,t){e.exports=n(965)},function(e,t){e.exports=n(966)},function(e,t,n){e.exports=n(50)},function(e,t){e.exports=n(967)},function(e,t){e.exports=n(968)},function(e,t){e.exports=n(969)},function(e,t){e.exports=n(970)},function(e,t,n){"use strict";n.r(t);var r={};n.r(r),n.d(r,"path",function(){return mn}),n.d(r,"query",function(){return vn}),n.d(r,"header",function(){return yn}),n.d(r,"cookie",function(){return bn});var o=n(9),i=n.n(o),a=n(10),s=n.n(a),u=n(5),c=n.n(u),l=n(6),p=n.n(l),f=n(7),h=n.n(f),d=n(0),m=n.n(d),v=n(8),g=n.n(v),y=(n(46),n(15)),b=n.n(y),_=n(20),w=n.n(_),x=n(12),E=n.n(x),S=n(4),C=n.n(S),k=n(22),O=n.n(k),A=n(11),T=n.n(A),j=n(2),P=n.n(j),I=n(1),M=n.n(I),N=n(17),R=n.n(N),D=(n(47),n(26)),L=n.n(D),U=n(23),q=n.n(U),F=n(31),B=n.n(F),z={serializeRes:J,mergeInQueryOrForm:Z};function V(e){return H.apply(this,arguments)}function H(){return(H=R()(C.a.mark(function e(t){var n,r,o,i,a,s=arguments;return C.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:if(n=s.length>1&&void 0!==s[1]?s[1]:{},"object"===P()(t)&&(t=(n=t).url),n.headers=n.headers||{},z.mergeInQueryOrForm(n),n.headers&&m()(n.headers).forEach(function(e){var t=n.headers[e];"string"==typeof t&&(n.headers[e]=t.replace(/\n+/g," "))}),!n.requestInterceptor){e.next=12;break}return e.next=8,n.requestInterceptor(n);case 8:if(e.t0=e.sent,e.t0){e.next=11;break}e.t0=n;case 11:n=e.t0;case 12:return r=n.headers["content-type"]||n.headers["Content-Type"],/multipart\/form-data/i.test(r)&&(delete n.headers["content-type"],delete n.headers["Content-Type"]),e.prev=14,e.next=17,(n.userFetch||fetch)(n.url,n);case 17:return o=e.sent,e.next=20,z.serializeRes(o,t,n);case 20:if(o=e.sent,!n.responseInterceptor){e.next=28;break}return e.next=24,n.responseInterceptor(o);case 24:if(e.t1=e.sent,e.t1){e.next=27;break}e.t1=o;case 27:o=e.t1;case 28:e.next=38;break;case 30:if(e.prev=30,e.t2=e.catch(14),o){e.next=34;break}throw e.t2;case 34:throw(i=new Error(o.statusText)).statusCode=i.status=o.status,i.responseError=e.t2,i;case 38:if(o.ok){e.next=43;break}throw(a=new Error(o.statusText)).statusCode=a.status=o.status,a.response=o,a;case 43:return e.abrupt("return",o);case 44:case"end":return e.stop()}},e,null,[[14,30]])}))).apply(this,arguments)}var W=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";return/(json|xml|yaml|text)\b/.test(e)};function J(e,t){var n=(arguments.length>2&&void 0!==arguments[2]?arguments[2]:{}).loadSpec,r=void 0!==n&&n,o={ok:e.ok,url:e.url||t,status:e.status,statusText:e.statusText,headers:K(e.headers)},i=o.headers["content-type"],a=r||W(i);return(a?e.text:e.blob||e.buffer).call(e).then(function(e){if(o.text=e,o.data=e,a)try{var t=function(e,t){return t&&(0===t.indexOf("application/json")||t.indexOf("+json")>0)?JSON.parse(e):q.a.safeLoad(e)}(e,i);o.body=t,o.obj=t}catch(e){o.parseError=e}return o})}function K(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t={};return"function"==typeof e.forEach?(e.forEach(function(e,n){void 0!==t[n]?(t[n]=M()(t[n])?t[n]:[t[n]],t[n].push(e)):t[n]=e}),t):t}function Y(e,t){return t||"undefined"==typeof navigator||(t=navigator),t&&"ReactNative"===t.product?!(!e||"object"!==P()(e)||"string"!=typeof e.uri):"undefined"!=typeof File?e instanceof File:null!==e&&"object"===P()(e)&&"function"==typeof e.pipe}function $(e,t){var n=e.collectionFormat,r=e.allowEmptyValue,o="object"===P()(e)?e.value:e;if(void 0===o&&r)return"";if(Y(o)||"boolean"==typeof o)return o;var i=encodeURIComponent;return t&&(i=B()(o)?function(e){return e}:function(e){return T()(e)}),"object"!==P()(o)||M()(o)?M()(o)?M()(o)&&!n?o.map(i).join(","):"multi"===n?o.map(i):o.map(i).join({csv:",",ssv:"%20",tsv:"%09",pipes:"|"}[n]):i(o):""}function G(e){var t=m()(e).reduce(function(t,n){var r,o=e[n],i=!!o.skipEncoding,a=i?n:encodeURIComponent(n),s=(r=o)&&"object"===P()(r)&&!M()(o);return t[a]=$(s?o:{value:o},i),t},{});return L.a.stringify(t,{encode:!1,indices:!1})||""}function Z(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=e.url,r=void 0===t?"":t,o=e.query,i=e.form;if(i){var a=m()(i).some(function(e){return Y(i[e].value)}),s=e.headers["content-type"]||e.headers["Content-Type"];if(a||/multipart\/form-data/i.test(s)){var u=n(48);e.body=new u,m()(i).forEach(function(t){e.body.append(t,$(i[t],!0))})}else e.body=G(i);delete e.form}if(o){var c=r.split("?"),l=O()(c,2),p=l[0],f=l[1],h="";if(f){var d=L.a.parse(f);m()(o).forEach(function(e){return delete d[e]}),h=L.a.stringify(d,{encode:!0})}var v=function(){for(var e=arguments.length,t=new Array(e),n=0;n0){var o=t(e,n[n.length-1],n);o&&(r=r.concat(o))}if(M()(e)){var i=e.map(function(e,r){return Ce(e,t,n.concat(r))});i&&(r=r.concat(i))}else if(Te(e)){var a=m()(e).map(function(r){return Ce(e[r],t,n.concat(r))});a&&(r=r.concat(a))}return r=Oe(r)}function ke(e){return M()(e)?e:[e]}function Oe(e){var t;return(t=[]).concat.apply(t,he()(e.map(function(e){return M()(e)?Oe(e):e})))}function Ae(e){return e.filter(function(e){return void 0!==e})}function Te(e){return e&&"object"===P()(e)}function je(e){return e&&"function"==typeof e}function Pe(e){if(Ne(e)){var t=e.op;return"add"===t||"remove"===t||"replace"===t}return!1}function Ie(e){return Pe(e)||Ne(e)&&"mutation"===e.type}function Me(e){return Ie(e)&&("add"===e.op||"replace"===e.op||"merge"===e.op||"mergeDeep"===e.op)}function Ne(e){return e&&"object"===P()(e)}function Re(e,t){try{return me.a.getValueByPointer(e,t)}catch(e){return console.error(e),{}}}var De=n(35),Le=n.n(De),Ue=n(36),qe=n(28),Fe=n.n(qe);function Be(e,t){function n(){Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):this.stack=(new Error).stack;for(var e=arguments.length,n=new Array(e),r=0;r-1&&-1===We.indexOf(n)||Je.indexOf(r)>-1||Ke.some(function(e){return r.indexOf(e)>-1})}function $e(e,t){var n=e.split("#"),r=O()(n,2),o=r[0],i=r[1],a=E.a.resolve(o||"",t||"");return i?"".concat(a,"#").concat(i):a}var Ge="application/json, application/yaml",Ze=new RegExp("^([a-z]+://|//)","i"),Xe=Be("JSONRefError",function(e,t,n){this.originalError=n,ie()(this,t||{})}),Qe={},et=new Le.a,tt=[function(e){return"paths"===e[0]&&"responses"===e[3]&&"content"===e[5]&&"example"===e[7]},function(e){return"paths"===e[0]&&"requestBody"===e[3]&&"content"===e[4]&&"example"===e[6]}],nt={key:"$ref",plugin:function(e,t,n,r){var o=r.getInstance(),i=n.slice(0,-1);if(!Ye(i)&&(a=i,!tt.some(function(e){return e(a)}))){var a,s=r.getContext(n).baseDoc;if("string"!=typeof e)return new Xe("$ref: must be a string (JSON-Ref)",{$ref:e,baseDoc:s,fullPath:n});var u,c,l,p=st(e),f=p[0],h=p[1]||"";try{u=s||f?it(f,s):null}catch(t){return at(t,{pointer:h,$ref:e,basePath:u,fullPath:n})}if(function(e,t,n,r){var o=et.get(r);o||(o={},et.set(r,o));var i=function(e){if(0===e.length)return"";return"/".concat(e.map(ht).join("/"))}(n),a="".concat(t||"","#").concat(e),s=i.replace(/allOf\/\d+\/?/g,""),u=r.contextTree.get([]).baseDoc;if(t==u&&mt(s,e))return!0;var c="";if(n.some(function(e){return c="".concat(c,"/").concat(ht(e)),o[c]&&o[c].some(function(e){return mt(e,a)||mt(a,e)})}))return!0;o[s]=(o[s]||[]).concat(a)}(h,u,i,r)&&!o.useCircularStructures){var d=$e(e,u);return e===d?null:_e.replace(n,d)}if(null==u?(l=pt(h),void 0===(c=r.get(l))&&(c=new Xe("Could not resolve reference: ".concat(e),{pointer:h,$ref:e,baseDoc:s,fullPath:n}))):c=null!=(c=ut(u,h)).__value?c.__value:c.catch(function(t){throw at(t,{pointer:h,$ref:e,baseDoc:s,fullPath:n})}),c instanceof Error)return[_e.remove(n),c];var v=$e(e,u),g=_e.replace(i,c,{$$ref:v});if(u&&u!==s)return[g,_e.context(i,{baseDoc:u})];try{if(!function(e,t){var n=[e];return t.path.reduce(function(e,t){return n.push(e[t]),e[t]},e),function e(t){return _e.isObject(t)&&(n.indexOf(t)>=0||m()(t).some(function(n){return e(t[n])}))}(t.value)}(r.state,g)||o.useCircularStructures)return g}catch(e){return null}}}},rt=ie()(nt,{docCache:Qe,absoluteify:it,clearCache:function(e){void 0!==e?delete Qe[e]:m()(Qe).forEach(function(e){delete Qe[e]})},JSONRefError:Xe,wrapError:at,getDoc:ct,split:st,extractFromDoc:ut,fetchJSON:function(e){return Object(Ue.fetch)(e,{headers:{Accept:Ge},loadSpec:!0}).then(function(e){return e.text()}).then(function(e){return q.a.safeLoad(e)})},extract:lt,jsonPointerToArray:pt,unescapeJsonPointerToken:ft}),ot=rt;function it(e,t){if(!Ze.test(e)){if(!t)throw new Xe("Tried to resolve a relative URL, without having a basePath. path: '".concat(e,"' basePath: '").concat(t,"'"));return E.a.resolve(t,e)}return e}function at(e,t){var n;return n=e&&e.response&&e.response.body?"".concat(e.response.body.code," ").concat(e.response.body.message):e.message,new Xe("Could not resolve reference: ".concat(n),t,e)}function st(e){return(e+"").split("#")}function ut(e,t){var n=Qe[e];if(n&&!_e.isPromise(n))try{var r=lt(t,n);return ie()(Q.a.resolve(r),{__value:r})}catch(e){return Q.a.reject(e)}return ct(e).then(function(e){return lt(t,e)})}function ct(e){var t=Qe[e];return t?_e.isPromise(t)?t:Q.a.resolve(t):(Qe[e]=rt.fetchJSON(e).then(function(t){return Qe[e]=t,t}),Qe[e])}function lt(e,t){var n=pt(e);if(n.length<1)return t;var r=_e.getIn(t,n);if(void 0===r)throw new Xe("Could not resolve pointer: ".concat(e," does not exist in document"),{pointer:e});return r}function pt(e){if("string"!=typeof e)throw new TypeError("Expected a string, got a ".concat(P()(e)));return"/"===e[0]&&(e=e.substr(1)),""===e?[]:e.split("/").map(ft)}function ft(e){return"string"!=typeof e?e:Fe.a.unescape(e.replace(/~1/g,"/").replace(/~0/g,"~"))}function ht(e){return Fe.a.escape(e.replace(/~/g,"~0").replace(/\//g,"~1"))}var dt=function(e){return!e||"/"===e||"#"===e};function mt(e,t){if(dt(t))return!0;var n=e.charAt(t.length),r=t.slice(-1);return 0===e.indexOf(t)&&(!n||"/"===n||"#"===n)&&"#"!==r}var vt={key:"allOf",plugin:function(e,t,n,r,o){if(!o.meta||!o.meta.$$ref){var i=n.slice(0,-1);if(!Ye(i)){if(!M()(e)){var a=new TypeError("allOf must be an array");return a.fullPath=n,a}var s=!1,u=o.value;i.forEach(function(e){u&&(u=u[e])}),delete(u=ie()({},u)).allOf;var c=[];return c.push(r.replace(i,{})),e.forEach(function(e,t){if(!r.isObject(e)){if(s)return null;s=!0;var o=new TypeError("Elements in allOf must be objects");return o.fullPath=n,c.push(o)}c.push(r.mergeDeep(i,e));var a=function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},r=n.specmap,o=n.getBaseUrlForNodePath,i=void 0===o?function(e){return r.getContext([].concat(he()(t),he()(e))).baseDoc}:o,a=n.targetKeys,s=void 0===a?["$ref","$$ref"]:a,u=[];return Ve()(e).forEach(function(){if(s.indexOf(this.key)>-1){var e=this.path,n=t.concat(this.path),o=$e(this.node,i(e));u.push(r.replace(n,o))}}),u}(e,n.slice(0,-1),{getBaseUrlForNodePath:function(e){return r.getContext([].concat(he()(n),[t],he()(e))).baseDoc},specmap:r});c.push.apply(c,he()(a))}),c.push(r.mergeDeep(i,u)),u.$$ref||c.push(r.remove([].concat(i,"$$ref"))),c}}}},gt={key:"parameters",plugin:function(e,t,n,r,o){if(M()(e)&&e.length){var i=ie()([],e),a=n.slice(0,-1),s=ie()({},_e.getIn(r.spec,a));return e.forEach(function(e,t){try{i[t].default=r.parameterMacro(s,e)}catch(e){var o=new Error(e);return o.fullPath=n,o}}),_e.replace(n,i)}return _e.replace(n,e)}},yt={key:"properties",plugin:function(e,t,n,r){var o=ie()({},e);for(var i in e)try{o[i].default=r.modelPropertyMacro(o[i])}catch(e){var a=new Error(e);return a.fullPath=n,a}return _e.replace(n,o)}};function bt(e,t){var n=m()(e);if(h.a){var r=h()(e);t&&(r=r.filter(function(t){return p()(e,t).enumerable})),n.push.apply(n,r)}return n}var _t=function(){function e(t){se()(this,e),this.root=wt(t||{})}return ce()(e,[{key:"set",value:function(e,t){var n=this.getParent(e,!0);if(n){var r=e[e.length-1],o=n.children;o[r]?xt(o[r],t,n):o[r]=wt(t,n)}else xt(this.root,t,null)}},{key:"get",value:function(e){if((e=e||[]).length<1)return this.root.value;for(var t,n,r=this.root,o=0;o1?n-1:0),o=1;o1?n-1:0),o=1;o0})}},{key:"nextPromisedPatch",value:function(){if(this.promisedPatches.length>0)return Q.a.race(this.promisedPatches.map(function(e){return e.value}))}},{key:"getPluginHistory",value:function(e){var t=this.getPluginName(e);return this.pluginHistory[t]||[]}},{key:"getPluginRunCount",value:function(e){return this.getPluginHistory(e).length}},{key:"getPluginHistoryTip",value:function(e){var t=this.getPluginHistory(e);return t&&t[t.length-1]||{}}},{key:"getPluginMutationIndex",value:function(e){var t=this.getPluginHistoryTip(e).mutationIndex;return"number"!=typeof t?-1:t}},{key:"getPluginName",value:function(e){return e.pluginName}},{key:"updatePluginHistory",value:function(e,t){var n=this.getPluginName(e);(this.pluginHistory[n]=this.pluginHistory[n]||[]).push(t)}},{key:"updatePatches",value:function(e,t){var n=this;_e.normalizeArray(e).forEach(function(e){if(e instanceof Error)n.errors.push(e);else try{if(!_e.isObject(e))return void n.debug("updatePatches","Got a non-object patch",e);if(n.showDebug&&n.allPatches.push(e),_e.isPromise(e.value))return n.promisedPatches.push(e),void n.promisedPatchThen(e);if(_e.isContextPatch(e))return void n.setContext(e.path,e.value);if(_e.isMutation(e))return void n.updateMutations(e)}catch(e){console.error(e),n.errors.push(e)}})}},{key:"updateMutations",value:function(e){"object"===P()(e.value)&&!M()(e.value)&&this.allowMetaPatches&&(e.value=ie()({},e.value));var t=_e.applyPatch(this.state,e,{allowMetaPatches:this.allowMetaPatches});t&&(this.mutations.push(e),this.state=t)}},{key:"removePromisedPatch",value:function(e){var t=this.promisedPatches.indexOf(e);t<0?this.debug("Tried to remove a promisedPatch that isn't there!"):this.promisedPatches.splice(t,1)}},{key:"promisedPatchThen",value:function(e){var t=this;return e.value=e.value.then(function(n){var r=ie()({},e,{value:n});t.removePromisedPatch(e),t.updatePatches(r)}).catch(function(n){t.removePromisedPatch(e),t.updatePatches(n)})}},{key:"getMutations",value:function(e,t){return e=e||0,"number"!=typeof t&&(t=this.mutations.length),this.mutations.slice(e,t)}},{key:"getCurrentMutations",value:function(){return this.getMutationsForPlugin(this.getCurrentPlugin())}},{key:"getMutationsForPlugin",value:function(e){var t=this.getPluginMutationIndex(e);return this.getMutations(t+1)}},{key:"getCurrentPlugin",value:function(){return this.currentPlugin}},{key:"getPatchesOfType",value:function(e,t){return e.filter(t)}},{key:"getLib",value:function(){return this.libMethods}},{key:"_get",value:function(e){return _e.getIn(this.state,e)}},{key:"_getContext",value:function(e){return this.contextTree.get(e)}},{key:"setContext",value:function(e,t){return this.contextTree.set(e,t)}},{key:"_hasRun",value:function(e){return this.getPluginRunCount(this.getCurrentPlugin())>(e||0)}},{key:"_clone",value:function(e){return JSON.parse(T()(e))}},{key:"dispatch",value:function(){var e=this,t=this,n=this.nextPlugin();if(!n){var r=this.nextPromisedPatch();if(r)return r.then(function(){return e.dispatch()}).catch(function(){return e.dispatch()});var o={spec:this.state,errors:this.errors};return this.showDebug&&(o.patches=this.allPatches),Q.a.resolve(o)}if(t.pluginCount=t.pluginCount||{},t.pluginCount[n]=(t.pluginCount[n]||0)+1,t.pluginCount[n]>100)return Q.a.resolve({spec:t.state,errors:t.errors.concat(new Error("We've reached a hard limit of ".concat(100," plugin runs")))});if(n!==this.currentPlugin&&this.promisedPatches.length){var i=this.promisedPatches.map(function(e){return e.value});return Q.a.all(i.map(function(e){return e.then(Function,Function)})).then(function(){return e.dispatch()})}return function(){t.currentPlugin=n;var e=t.getCurrentMutations(),r=t.mutations.length-1;try{if(n.isGenerator){var o=!0,i=!1,s=void 0;try{for(var u,c=te()(n(e,t.getLib()));!(o=(u=c.next()).done);o=!0){a(u.value)}}catch(e){i=!0,s=e}finally{try{o||null==c.return||c.return()}finally{if(i)throw s}}}else{a(n(e,t.getLib()))}}catch(e){console.error(e),a([ie()(re()(e),{plugin:n})])}finally{t.updatePluginHistory(n,{mutationIndex:r})}return t.dispatch()}();function a(e){e&&(e=_e.fullyNormalizeArray(e),t.updatePatches(e,n))}}}]),e}();var St={refs:ot,allOf:vt,parameters:gt,properties:yt},Ct=n(29),kt=n.n(Ct),Ot=function(e){return String.prototype.toLowerCase.call(e)},At=function(e){return e.replace(/[^\w]/gi,"_")};function Tt(e){var t=e.openapi;return!!t&&w()(t,"3")}function jt(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"",r=(arguments.length>3&&void 0!==arguments[3]?arguments[3]:{}).v2OperationIdCompatibilityMode;return e&&"object"===P()(e)?(e.operationId||"").replace(/\s/g,"").length?At(e.operationId):function(e,t){if((arguments.length>2&&void 0!==arguments[2]?arguments[2]:{}).v2OperationIdCompatibilityMode){var n="".concat(t.toLowerCase(),"_").concat(e).replace(/[\s!@#$%^&*()_+=[{\]};:<>|.\/?,\\'""-]/g,"_");return(n=n||"".concat(e.substring(1),"_").concat(t)).replace(/((_){2,})/g,"_").replace(/^(_)*/g,"").replace(/([_])*$/g,"")}return"".concat(Ot(t)).concat(At(e))}(t,n,{v2OperationIdCompatibilityMode:r}):null}function Pt(e,t){return"".concat(Ot(t),"-").concat(e)}function It(e,t){return e&&e.paths?function(e,t){return Mt(e,t,!0)||null}(e,function(e){var n=e.pathName,r=e.method,o=e.operation;if(!o||"object"!==P()(o))return!1;var i=o.operationId;return[jt(o,n,r),Pt(n,r),i].some(function(e){return e&&e===t})}):null}function Mt(e,t,n){if(!e||"object"!==P()(e)||!e.paths||"object"!==P()(e.paths))return null;var r=e.paths;for(var o in r)for(var i in r[o])if("PARAMETERS"!==i.toUpperCase()){var a=r[o][i];if(a&&"object"===P()(a)){var s={spec:e,pathName:o,method:i.toUpperCase(),operation:a},u=t(s);if(n&&u)return s}}}function Nt(e){var t=e.spec,n=t.paths,r={};if(!n||t.$$normalized)return e;for(var o in n){var i=n[o];if(kt()(i)){var a=i.parameters,s=function(e){var n=i[e];if(!kt()(n))return"continue";var s=jt(n,o,e);if(s){r[s]?r[s].push(n):r[s]=[n];var u=r[s];if(u.length>1)u.forEach(function(e,t){e.__originalOperationId=e.__originalOperationId||e.operationId,e.operationId="".concat(s).concat(t+1)});else if(void 0!==n.operationId){var c=u[0];c.__originalOperationId=c.__originalOperationId||n.operationId,c.operationId=s}}if("parameters"!==e){var l=[],p={};for(var f in t)"produces"!==f&&"consumes"!==f&&"security"!==f||(p[f]=t[f],l.push(p));if(a&&(p.parameters=a,l.push(p)),l.length)for(var h=0,d=l;h1&&void 0!==arguments[1]?arguments[1]:{},n=t.requestInterceptor,r=t.responseInterceptor,o=e.withCredentials?"include":"same-origin";return function(t){return e({url:t,loadSpec:!0,requestInterceptor:n,responseInterceptor:r,headers:{Accept:Ge},credentials:o}).then(function(e){return e.body})}}function Dt(e){var t=e.fetch,n=e.spec,r=e.url,o=e.mode,i=e.allowMetaPatches,a=void 0===i||i,s=e.pathDiscriminator,u=e.modelPropertyMacro,c=e.parameterMacro,l=e.requestInterceptor,p=e.responseInterceptor,f=e.skipNormalization,h=e.useCircularStructures,d=e.http,m=e.baseDoc;return m=m||r,d=t||d||V,n?v(n):Rt(d,{requestInterceptor:l,responseInterceptor:p})(m).then(v);function v(e){m&&(St.refs.docCache[m]=e),St.refs.fetchJSON=Rt(d,{requestInterceptor:l,responseInterceptor:p});var t,n=[St.refs];return"function"==typeof c&&n.push(St.parameters),"function"==typeof u&&n.push(St.properties),"strict"!==o&&n.push(St.allOf),(t={spec:e,context:{baseDoc:m},plugins:n,allowMetaPatches:a,pathDiscriminator:s,parameterMacro:c,modelPropertyMacro:u,useCircularStructures:h},new Et(t).dispatch()).then(f?function(){var e=R()(C.a.mark(function e(t){return C.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.abrupt("return",t);case 1:case"end":return e.stop()}},e)}));return function(t){return e.apply(this,arguments)}}():Nt)}}var Lt=n(16),Ut=n.n(Lt);function qt(e,t){var n=m()(e);if(h.a){var r=h()(e);t&&(r=r.filter(function(t){return p()(e,t).enumerable})),n.push.apply(n,r)}return n}function Ft(e){for(var t=1;t2&&void 0!==m[2]?m[2]:{},o=r.returnEntireTree,i=r.baseDoc,a=r.requestInterceptor,s=r.responseInterceptor,u=r.parameterMacro,c=r.modelPropertyMacro,l=r.useCircularStructures,p={pathDiscriminator:n,baseDoc:i,requestInterceptor:a,responseInterceptor:s,parameterMacro:u,modelPropertyMacro:c,useCircularStructures:l},f=Nt({spec:t}),h=f.spec,e.next=6,Dt(Ft({},p,{spec:h,allowMetaPatches:!0,skipNormalization:!0}));case 6:return d=e.sent,!o&&M()(n)&&n.length&&(d.spec=Ut()(d.spec,n)||null),e.abrupt("return",d);case 9:case"end":return e.stop()}},e)}))).apply(this,arguments)}var zt=n(38),Vt=n.n(zt);function Ht(e,t){var n=m()(e);if(h.a){var r=h()(e);t&&(r=r.filter(function(t){return p()(e,t).enumerable})),n.push.apply(n,r)}return n}function Wt(e){for(var t=1;t0&&void 0!==arguments[0]?arguments[0]:{};return function(t){var n=t.pathName,r=t.method,o=t.operationId;return function(t){var i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return e.execute(Wt({spec:e.spec},Vt()(e,"requestInterceptor","responseInterceptor","userFetch"),{pathName:n,method:r,parameters:t,operationId:o},i))}}}};var $t=n(39),Gt=n.n($t),Zt=n(40),Xt=n.n(Zt),Qt=n(41),en=n.n(Qt),tn=n(19),nn=n.n(tn),rn=n(42),on=n.n(rn),an={body:function(e){var t=e.req,n=e.value;t.body=n},header:function(e){var t=e.req,n=e.parameter,r=e.value;t.headers=t.headers||{},void 0!==r&&(t.headers[n.name]=r)},query:function(e){var t=e.req,n=e.value,r=e.parameter;t.query=t.query||{},!1===n&&"boolean"===r.type&&(n="false");0===n&&["number","integer"].indexOf(r.type)>-1&&(n="0");if(n)t.query[r.name]={collectionFormat:r.collectionFormat,value:n};else if(r.allowEmptyValue&&void 0!==n){var o=r.name;t.query[o]=t.query[o]||{},t.query[o].allowEmptyValue=!0}},path:function(e){var t=e.req,n=e.value,r=e.parameter;t.url=t.url.split("{".concat(r.name,"}")).join(encodeURIComponent(n))},formData:function(e){var t=e.req,n=e.value,r=e.parameter;(n||r.allowEmptyValue)&&(t.form=t.form||{},t.form[r.name]={value:n,allowEmptyValue:r.allowEmptyValue,collectionFormat:r.collectionFormat})}};n(49);var sn=n(43),un=n.n(sn),cn=n(44),ln=function(e){return":/?#[]@!$&'()*+,;=".indexOf(e)>-1},pn=function(e){return/^[a-z0-9\-._~]+$/i.test(e)};function fn(e){var t=(arguments.length>1&&void 0!==arguments[1]?arguments[1]:{}).escape,n=arguments.length>2?arguments[2]:void 0;return"number"==typeof e&&(e=e.toString()),"string"==typeof e&&e.length&&t?n?JSON.parse(e):Object(cn.stringToCharArray)(e).map(function(e){return pn(e)?e:ln(e)&&"unsafe"===t?e:(un()(e)||[]).map(function(e){return"0".concat(e.toString(16).toUpperCase()).slice(-2)}).map(function(e){return"%".concat(e)}).join("")}).join(""):e}function hn(e){var t=e.value;return M()(t)?function(e){var t=e.key,n=e.value,r=e.style,o=e.explode,i=e.escape,a=function(e){return fn(e,{escape:i})};if("simple"===r)return n.map(function(e){return a(e)}).join(",");if("label"===r)return".".concat(n.map(function(e){return a(e)}).join("."));if("matrix"===r)return n.map(function(e){return a(e)}).reduce(function(e,n){return!e||o?"".concat(e||"",";").concat(t,"=").concat(n):"".concat(e,",").concat(n)},"");if("form"===r){var s=o?"&".concat(t,"="):",";return n.map(function(e){return a(e)}).join(s)}if("spaceDelimited"===r){var u=o?"".concat(t,"="):"";return n.map(function(e){return a(e)}).join(" ".concat(u))}if("pipeDelimited"===r){var c=o?"".concat(t,"="):"";return n.map(function(e){return a(e)}).join("|".concat(c))}}(e):"object"===P()(t)?function(e){var t=e.key,n=e.value,r=e.style,o=e.explode,i=e.escape,a=function(e){return fn(e,{escape:i})},s=m()(n);if("simple"===r)return s.reduce(function(e,t){var r=a(n[t]),i=o?"=":",",s=e?"".concat(e,","):"";return"".concat(s).concat(t).concat(i).concat(r)},"");if("label"===r)return s.reduce(function(e,t){var r=a(n[t]),i=o?"=":".",s=e?"".concat(e,"."):".";return"".concat(s).concat(t).concat(i).concat(r)},"");if("matrix"===r&&o)return s.reduce(function(e,t){var r=a(n[t]),o=e?"".concat(e,";"):";";return"".concat(o).concat(t,"=").concat(r)},"");if("matrix"===r)return s.reduce(function(e,r){var o=a(n[r]),i=e?"".concat(e,","):";".concat(t,"=");return"".concat(i).concat(r,",").concat(o)},"");if("form"===r)return s.reduce(function(e,t){var r=a(n[t]),i=e?"".concat(e).concat(o?"&":","):"",s=o?"=":",";return"".concat(i).concat(t).concat(s).concat(r)},"")}(e):function(e){var t=e.key,n=e.value,r=e.style,o=e.escape,i=function(e){return fn(e,{escape:o})};if("simple"===r)return i(n);if("label"===r)return".".concat(i(n));if("matrix"===r)return";".concat(t,"=").concat(i(n));if("form"===r)return i(n);if("deepObject"===r)return i(n)}(e)}function dn(e,t){return t.includes("application/json")?"string"==typeof e?e:T()(e):e.toString()}function mn(e){var t=e.req,n=e.value,r=e.parameter,o=r.name,i=r.style,a=r.explode,s=r.content;if(s){var u=m()(s)[0];t.url=t.url.split("{".concat(o,"}")).join(fn(dn(n,u),{escape:!0}))}else{var c=hn({key:r.name,value:n,style:i||"simple",explode:a||!1,escape:!0});t.url=t.url.split("{".concat(o,"}")).join(c)}}function vn(e){var t=e.req,n=e.value,r=e.parameter;if(t.query=t.query||{},r.content){var o=m()(r.content)[0];t.query[r.name]=dn(n,o)}else if(!1===n&&(n="false"),0===n&&(n="0"),n){var i=P()(n);if("deepObject"===r.style)m()(n).forEach(function(e){var o=n[e];t.query["".concat(r.name,"[").concat(e,"]")]={value:hn({key:e,value:o,style:"deepObject",escape:r.allowReserved?"unsafe":"reserved"}),skipEncoding:!0}});else if("object"!==i||M()(n)||"form"!==r.style&&r.style||!r.explode&&void 0!==r.explode){var a=encodeURIComponent(r.name);t.query[a]={value:hn({key:a,value:n,style:r.style||"form",explode:void 0===r.explode||r.explode,escape:r.allowReserved?"unsafe":"reserved"}),skipEncoding:!0}}else{m()(n).forEach(function(e){var o=n[e];t.query[e]={value:hn({key:e,value:o,style:r.style||"form",escape:r.allowReserved?"unsafe":"reserved"}),skipEncoding:!0}})}}else if(r.allowEmptyValue&&void 0!==n){var s=r.name;t.query[s]=t.query[s]||{},t.query[s].allowEmptyValue=!0}}var gn=["accept","authorization","content-type"];function yn(e){var t=e.req,n=e.parameter,r=e.value;if(t.headers=t.headers||{},!(gn.indexOf(n.name.toLowerCase())>-1))if(n.content){var o=m()(n.content)[0];t.headers[n.name]=dn(r,o)}else void 0!==r&&(t.headers[n.name]=hn({key:n.name,value:r,style:n.style||"simple",explode:void 0!==n.explode&&n.explode,escape:!1}))}function bn(e){var t=e.req,n=e.parameter,r=e.value;t.headers=t.headers||{};var o=P()(r);if(n.content){var i=m()(n.content)[0];t.headers.Cookie="".concat(n.name,"=").concat(dn(r,i))}else if("undefined"!==o){var a="object"===o&&!M()(r)&&n.explode?"":"".concat(n.name,"=");t.headers.Cookie=a+hn({key:n.name,value:r,escape:!1,style:n.style||"form",explode:void 0!==n.explode&&n.explode})}}var _n=n(30),wn=function(e,t){var n=e.operation,r=e.requestBody,o=e.securities,i=e.spec,a=e.attachContentTypeForEmptyPayload,s=e.requestContentType;t=function(e){var t=e.request,n=e.securities,r=void 0===n?{}:n,o=e.operation,i=void 0===o?{}:o,a=e.spec,s=b()({},t),u=r.authorized,c=void 0===u?{}:u,l=i.security||a.security||[],p=c&&!!m()(c).length,f=Ut()(a,["components","securitySchemes"])||{};if(s.headers=s.headers||{},s.query=s.query||{},!m()(r).length||!p||!l||M()(i.security)&&!i.security.length)return t;return l.forEach(function(e,t){for(var n in e){var r=c[n],o=f[n];if(r){var i=r.value||r,a=o.type;if(r)if("apiKey"===a)"query"===o.in&&(s.query[o.name]=i),"header"===o.in&&(s.headers[o.name]=i),"cookie"===o.in&&(s.cookies[o.name]=i);else if("http"===a){if("basic"===o.scheme){var u=i.username,l=i.password,p=nn()("".concat(u,":").concat(l));s.headers.Authorization="Basic ".concat(p)}"bearer"===o.scheme&&(s.headers.Authorization="Bearer ".concat(i))}else if("oauth2"===a){var h=r.token||{},d=h[o["x-tokenName"]||"access_token"],m=h.token_type;m&&"bearer"!==m.toLowerCase()||(m="Bearer"),s.headers.Authorization="".concat(m," ").concat(d)}}}}),s}({request:t,securities:o,operation:n,spec:i});var u=n.requestBody||{},c=m()(u.content||{}),l=s&&c.indexOf(s)>-1;if(r||a){if(s&&l)t.headers["Content-Type"]=s;else if(!s){var p=c[0];p&&(t.headers["Content-Type"]=p,s=p)}}else s&&l&&(t.headers["Content-Type"]=s);return r&&(s?c.indexOf(s)>-1&&("application/x-www-form-urlencoded"===s||0===s.indexOf("multipart/")?"object"===P()(r)?(t.form={},m()(r).forEach(function(e){var n,o,i=r[e];"undefined"!=typeof File&&(o=i instanceof File),"undefined"!=typeof Blob&&(o=o||i instanceof Blob),void 0!==_n.Buffer&&(o=o||_n.Buffer.isBuffer(i)),n="object"!==P()(i)||o?i:M()(i)?i.toString():T()(i),t.form[e]={value:n}})):t.form=r:t.body=r):t.body=r),t};var xn=function(e,t){var n=e.spec,r=e.operation,o=e.securities,i=e.requestContentType,a=e.attachContentTypeForEmptyPayload;if((t=function(e){var t=e.request,n=e.securities,r=void 0===n?{}:n,o=e.operation,i=void 0===o?{}:o,a=e.spec,s=b()({},t),u=r.authorized,c=void 0===u?{}:u,l=r.specSecurity,p=void 0===l?[]:l,f=i.security||p,h=c&&!!m()(c).length,d=a.securityDefinitions;if(s.headers=s.headers||{},s.query=s.query||{},!m()(r).length||!h||!f||M()(i.security)&&!i.security.length)return t;return f.forEach(function(e,t){for(var n in e){var r=c[n];if(r){var o=r.token,i=r.value||r,a=d[n],u=a.type,l=a["x-tokenName"]||"access_token",p=o&&o[l],f=o&&o.token_type;if(r)if("apiKey"===u){var h="query"===a.in?"query":"headers";s[h]=s[h]||{},s[h][a.name]=i}else"basic"===u?i.header?s.headers.authorization=i.header:(i.base64=nn()("".concat(i.username,":").concat(i.password)),s.headers.authorization="Basic ".concat(i.base64)):"oauth2"===u&&p&&(f=f&&"bearer"!==f.toLowerCase()?f:"Bearer",s.headers.authorization="".concat(f," ").concat(p))}}}),s}({request:t,securities:o,operation:r,spec:n})).body||t.form||a)i?t.headers["Content-Type"]=i:M()(r.consumes)?t.headers["Content-Type"]=r.consumes[0]:M()(n.consumes)?t.headers["Content-Type"]=n.consumes[0]:r.parameters&&r.parameters.filter(function(e){return"file"===e.type}).length?t.headers["Content-Type"]="multipart/form-data":r.parameters&&r.parameters.filter(function(e){return"formData"===e.in}).length&&(t.headers["Content-Type"]="application/x-www-form-urlencoded");else if(i){var s=r.parameters&&r.parameters.filter(function(e){return"body"===e.in}).length>0,u=r.parameters&&r.parameters.filter(function(e){return"formData"===e.in}).length>0;(s||u)&&(t.headers["Content-Type"]=i)}return t};function En(e,t){var n=m()(e);if(h.a){var r=h()(e);t&&(r=r.filter(function(t){return p()(e,t).enumerable})),n.push.apply(n,r)}return n}function Sn(e){for(var t=1;t-1&&(c=o,l=u[p.indexOf(o)])}return!c&&u&&u.length&&(c=u[0].url,l=u[0]),c.indexOf("{")>-1&&function(e){for(var t,n=[],r=/{([^}]+)}/g;t=r.exec(e);)n.push(t[1]);return n}(c).forEach(function(e){if(l.variables&&l.variables[e]){var t=l.variables[e],n=s[e]||t.default,r=new RegExp("{".concat(e,"}"),"g");c=c.replace(r,n)}}),function(){var e,t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",r=E.a.parse(t),o=E.a.parse(n),i=Pn(r.protocol)||Pn(o.protocol)||"",a=r.host||o.host,s=r.pathname||"";return"/"===(e=i&&a?"".concat(i,"://").concat(a+s):s)[e.length-1]?e.slice(0,-1):e}(c,i)}(b):function(e){var t,n=e.spec,r=e.scheme,o=e.contextUrl,i=void 0===o?"":o,a=E.a.parse(i),s=M()(n.schemes)?n.schemes[0]:null,u=r||s||Pn(a.protocol)||"http",c=n.host||a.host||"",l=n.basePath||"";return"/"===(t=u&&c?"".concat(u,"://").concat(c+l):l)[t.length-1]?t.slice(0,-1):t}(b),!n)return delete g.cookies,g;g.url+=S,g.method="".concat(x).toUpperCase(),h=h||{};var C=t.paths[S]||{};o&&(g.headers.accept=o);var k=An([].concat(Cn(w.parameters)).concat(Cn(C.parameters)));k.forEach(function(e){var n,r=d[e.in];if("body"===e.in&&e.schema&&e.schema.properties&&(n=h),void 0===(n=e&&e.name&&h[e.name])?n=e&&e.name&&h["".concat(e.in,".").concat(e.name)]:On(e.name,k).length>1&&console.warn("Parameter '".concat(e.name,"' is ambiguous because the defined spec has more than one parameter with the name: '").concat(e.name,"' and the passed-in parameter values did not define an 'in' value.")),null!==n){if(void 0!==e.default&&void 0===n&&(n=e.default),void 0===n&&e.required&&!e.allowEmptyValue)throw new Error("Required parameter ".concat(e.name," is not provided"));if(v&&e.schema&&"object"===e.schema.type&&"string"==typeof n)try{n=JSON.parse(n)}catch(e){throw new Error("Could not parse object parameter value string as JSON")}r&&r({req:g,parameter:e,value:n,operation:w,spec:t})}});var O=Sn({},e,{operation:w});if((g=v?wn(O,g):xn(O,g)).cookies&&m()(g.cookies).length){var A=m()(g.cookies).reduce(function(e,t){var n=g.cookies[t];return e+(e?"&":"")+on.a.serialize(t,n)},"");g.headers.Cookie=A}return g.cookies&&delete g.cookies,Z(g),g}var Pn=function(e){return e?e.replace(/\W/g,""):null};function In(e,t){var n=m()(e);if(h.a){var r=h()(e);t&&(r=r.filter(function(t){return p()(e,t).enumerable})),n.push.apply(n,r)}return n}function Mn(e){var t=this,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if("string"==typeof e?n.url=e:n=e,!(this instanceof Mn))return new Mn(n);b()(this,n);var r=this.resolve().then(function(){return t.disableInterfaces||b()(t,Mn.makeApisTagOperation(t)),t});return r.client=this,r}Mn.http=V,Mn.makeHttp=function(e,t,n){return n=n||function(e){return e},t=t||function(e){return e},function(r){return"string"==typeof r&&(r={url:r}),z.mergeInQueryOrForm(r),r=t(r),n(e(r))}}.bind(null,Mn.http),Mn.resolve=Dt,Mn.resolveSubtree=function(e,t){return Bt.apply(this,arguments)},Mn.execute=function(e){var t=e.http,n=e.fetch,r=e.spec,o=e.operationId,i=e.pathName,a=e.method,s=e.parameters,u=e.securities,c=Gt()(e,["http","fetch","spec","operationId","pathName","method","parameters","securities"]),l=t||n||V;i&&a&&!o&&(o=Pt(i,a));var p=Tn.buildRequest(Sn({spec:r,operationId:o,parameters:s,securities:u,http:l},c));return p.body&&(Xt()(p.body)||en()(p.body))&&(p.body=T()(p.body)),l(p)},Mn.serializeRes=J,Mn.serializeHeaders=K,Mn.clearCache=function(){St.refs.clearCache()},Mn.makeApisTagOperation=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=Yt.makeExecute(e);return{apis:Yt.mapTagOperations({v2OperationIdCompatibilityMode:e.v2OperationIdCompatibilityMode,spec:e.spec,cb:t})}},Mn.buildRequest=jn,Mn.helpers={opId:jt},Mn.prototype={http:V,execute:function(e){return this.applyDefaults(),Mn.execute(function(e){for(var t=1;t 
    - * @license  MIT
    - */
    -var r=n(569),o=n(570),i=n(355);function a(){return u.TYPED_ARRAY_SUPPORT?2147483647:1073741823}function s(e,t){if(a()=a())throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+a().toString(16)+" bytes");return 0|e}function d(e,t){if(u.isBuffer(e))return e.length;if("undefined"!=typeof ArrayBuffer&&"function"==typeof ArrayBuffer.isView&&(ArrayBuffer.isView(e)||e instanceof ArrayBuffer))return e.byteLength;"string"!=typeof e&&(e=""+e);var n=e.length;if(0===n)return 0;for(var r=!1;;)switch(t){case"ascii":case"latin1":case"binary":return n;case"utf8":case"utf-8":case void 0:return B(e).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return 2*n;case"hex":return n>>>1;case"base64":return z(e).length;default:if(r)return B(e).length;t=(""+t).toLowerCase(),r=!0}}function m(e,t,n){var r=!1;if((void 0===t||t<0)&&(t=0),t>this.length)return"";if((void 0===n||n>this.length)&&(n=this.length),n<=0)return"";if((n>>>=0)<=(t>>>=0))return"";for(e||(e="utf8");;)switch(e){case"hex":return j(this,t,n);case"utf8":case"utf-8":return k(this,t,n);case"ascii":return A(this,t,n);case"latin1":case"binary":return T(this,t,n);case"base64":return C(this,t,n);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return P(this,t,n);default:if(r)throw new TypeError("Unknown encoding: "+e);e=(e+"").toLowerCase(),r=!0}}function v(e,t,n){var r=e[t];e[t]=e[n],e[n]=r}function g(e,t,n,r,o){if(0===e.length)return-1;if("string"==typeof n?(r=n,n=0):n>2147483647?n=2147483647:n<-2147483648&&(n=-2147483648),n=+n,isNaN(n)&&(n=o?0:e.length-1),n<0&&(n=e.length+n),n>=e.length){if(o)return-1;n=e.length-1}else if(n<0){if(!o)return-1;n=0}if("string"==typeof t&&(t=u.from(t,r)),u.isBuffer(t))return 0===t.length?-1:y(e,t,n,r,o);if("number"==typeof t)return t&=255,u.TYPED_ARRAY_SUPPORT&&"function"==typeof Uint8Array.prototype.indexOf?o?Uint8Array.prototype.indexOf.call(e,t,n):Uint8Array.prototype.lastIndexOf.call(e,t,n):y(e,[t],n,r,o);throw new TypeError("val must be string, number or Buffer")}function y(e,t,n,r,o){var i,a=1,s=e.length,u=t.length;if(void 0!==r&&("ucs2"===(r=String(r).toLowerCase())||"ucs-2"===r||"utf16le"===r||"utf-16le"===r)){if(e.length<2||t.length<2)return-1;a=2,s/=2,u/=2,n/=2}function c(e,t){return 1===a?e[t]:e.readUInt16BE(t*a)}if(o){var l=-1;for(i=n;is&&(n=s-u),i=n;i>=0;i--){for(var p=!0,f=0;fo&&(r=o):r=o;var i=t.length;if(i%2!=0)throw new TypeError("Invalid hex string");r>i/2&&(r=i/2);for(var a=0;a>8,o=n%256,i.push(o),i.push(r);return i}(t,e.length-n),e,n,r)}function C(e,t,n){return 0===t&&n===e.length?r.fromByteArray(e):r.fromByteArray(e.slice(t,n))}function k(e,t,n){n=Math.min(e.length,n);for(var r=[],o=t;o239?4:c>223?3:c>191?2:1;if(o+p<=n)switch(p){case 1:c<128&&(l=c);break;case 2:128==(192&(i=e[o+1]))&&(u=(31&c)<<6|63&i)>127&&(l=u);break;case 3:i=e[o+1],a=e[o+2],128==(192&i)&&128==(192&a)&&(u=(15&c)<<12|(63&i)<<6|63&a)>2047&&(u<55296||u>57343)&&(l=u);break;case 4:i=e[o+1],a=e[o+2],s=e[o+3],128==(192&i)&&128==(192&a)&&128==(192&s)&&(u=(15&c)<<18|(63&i)<<12|(63&a)<<6|63&s)>65535&&u<1114112&&(l=u)}null===l?(l=65533,p=1):l>65535&&(l-=65536,r.push(l>>>10&1023|55296),l=56320|1023&l),r.push(l),o+=p}return function(e){var t=e.length;if(t<=O)return String.fromCharCode.apply(String,e);var n="",r=0;for(;r0&&(e=this.toString("hex",0,n).match(/.{2}/g).join(" "),this.length>n&&(e+=" ... ")),""},u.prototype.compare=function(e,t,n,r,o){if(!u.isBuffer(e))throw new TypeError("Argument must be a Buffer");if(void 0===t&&(t=0),void 0===n&&(n=e?e.length:0),void 0===r&&(r=0),void 0===o&&(o=this.length),t<0||n>e.length||r<0||o>this.length)throw new RangeError("out of range index");if(r>=o&&t>=n)return 0;if(r>=o)return-1;if(t>=n)return 1;if(this===e)return 0;for(var i=(o>>>=0)-(r>>>=0),a=(n>>>=0)-(t>>>=0),s=Math.min(i,a),c=this.slice(r,o),l=e.slice(t,n),p=0;po)&&(n=o),e.length>0&&(n<0||t<0)||t>this.length)throw new RangeError("Attempt to write outside buffer bounds");r||(r="utf8");for(var i=!1;;)switch(r){case"hex":return b(this,e,t,n);case"utf8":case"utf-8":return _(this,e,t,n);case"ascii":return w(this,e,t,n);case"latin1":case"binary":return x(this,e,t,n);case"base64":return E(this,e,t,n);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return S(this,e,t,n);default:if(i)throw new TypeError("Unknown encoding: "+r);r=(""+r).toLowerCase(),i=!0}},u.prototype.toJSON=function(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};var O=4096;function A(e,t,n){var r="";n=Math.min(e.length,n);for(var o=t;or)&&(n=r);for(var o="",i=t;in)throw new RangeError("Trying to access beyond buffer length")}function M(e,t,n,r,o,i){if(!u.isBuffer(e))throw new TypeError('"buffer" argument must be a Buffer instance');if(t>o||te.length)throw new RangeError("Index out of range")}function N(e,t,n,r){t<0&&(t=65535+t+1);for(var o=0,i=Math.min(e.length-n,2);o>>8*(r?o:1-o)}function R(e,t,n,r){t<0&&(t=4294967295+t+1);for(var o=0,i=Math.min(e.length-n,4);o>>8*(r?o:3-o)&255}function D(e,t,n,r,o,i){if(n+r>e.length)throw new RangeError("Index out of range");if(n<0)throw new RangeError("Index out of range")}function L(e,t,n,r,i){return i||D(e,0,n,4),o.write(e,t,n,r,23,4),n+4}function U(e,t,n,r,i){return i||D(e,0,n,8),o.write(e,t,n,r,52,8),n+8}u.prototype.slice=function(e,t){var n,r=this.length;if((e=~~e)<0?(e+=r)<0&&(e=0):e>r&&(e=r),(t=void 0===t?r:~~t)<0?(t+=r)<0&&(t=0):t>r&&(t=r),t0&&(o*=256);)r+=this[e+--t]*o;return r},u.prototype.readUInt8=function(e,t){return t||I(e,1,this.length),this[e]},u.prototype.readUInt16LE=function(e,t){return t||I(e,2,this.length),this[e]|this[e+1]<<8},u.prototype.readUInt16BE=function(e,t){return t||I(e,2,this.length),this[e]<<8|this[e+1]},u.prototype.readUInt32LE=function(e,t){return t||I(e,4,this.length),(this[e]|this[e+1]<<8|this[e+2]<<16)+16777216*this[e+3]},u.prototype.readUInt32BE=function(e,t){return t||I(e,4,this.length),16777216*this[e]+(this[e+1]<<16|this[e+2]<<8|this[e+3])},u.prototype.readIntLE=function(e,t,n){e|=0,t|=0,n||I(e,t,this.length);for(var r=this[e],o=1,i=0;++i=(o*=128)&&(r-=Math.pow(2,8*t)),r},u.prototype.readIntBE=function(e,t,n){e|=0,t|=0,n||I(e,t,this.length);for(var r=t,o=1,i=this[e+--r];r>0&&(o*=256);)i+=this[e+--r]*o;return i>=(o*=128)&&(i-=Math.pow(2,8*t)),i},u.prototype.readInt8=function(e,t){return t||I(e,1,this.length),128&this[e]?-1*(255-this[e]+1):this[e]},u.prototype.readInt16LE=function(e,t){t||I(e,2,this.length);var n=this[e]|this[e+1]<<8;return 32768&n?4294901760|n:n},u.prototype.readInt16BE=function(e,t){t||I(e,2,this.length);var n=this[e+1]|this[e]<<8;return 32768&n?4294901760|n:n},u.prototype.readInt32LE=function(e,t){return t||I(e,4,this.length),this[e]|this[e+1]<<8|this[e+2]<<16|this[e+3]<<24},u.prototype.readInt32BE=function(e,t){return t||I(e,4,this.length),this[e]<<24|this[e+1]<<16|this[e+2]<<8|this[e+3]},u.prototype.readFloatLE=function(e,t){return t||I(e,4,this.length),o.read(this,e,!0,23,4)},u.prototype.readFloatBE=function(e,t){return t||I(e,4,this.length),o.read(this,e,!1,23,4)},u.prototype.readDoubleLE=function(e,t){return t||I(e,8,this.length),o.read(this,e,!0,52,8)},u.prototype.readDoubleBE=function(e,t){return t||I(e,8,this.length),o.read(this,e,!1,52,8)},u.prototype.writeUIntLE=function(e,t,n,r){(e=+e,t|=0,n|=0,r)||M(this,e,t,n,Math.pow(2,8*n)-1,0);var o=1,i=0;for(this[t]=255&e;++i=0&&(i*=256);)this[t+o]=e/i&255;return t+n},u.prototype.writeUInt8=function(e,t,n){return e=+e,t|=0,n||M(this,e,t,1,255,0),u.TYPED_ARRAY_SUPPORT||(e=Math.floor(e)),this[t]=255&e,t+1},u.prototype.writeUInt16LE=function(e,t,n){return e=+e,t|=0,n||M(this,e,t,2,65535,0),u.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8):N(this,e,t,!0),t+2},u.prototype.writeUInt16BE=function(e,t,n){return e=+e,t|=0,n||M(this,e,t,2,65535,0),u.TYPED_ARRAY_SUPPORT?(this[t]=e>>>8,this[t+1]=255&e):N(this,e,t,!1),t+2},u.prototype.writeUInt32LE=function(e,t,n){return e=+e,t|=0,n||M(this,e,t,4,4294967295,0),u.TYPED_ARRAY_SUPPORT?(this[t+3]=e>>>24,this[t+2]=e>>>16,this[t+1]=e>>>8,this[t]=255&e):R(this,e,t,!0),t+4},u.prototype.writeUInt32BE=function(e,t,n){return e=+e,t|=0,n||M(this,e,t,4,4294967295,0),u.TYPED_ARRAY_SUPPORT?(this[t]=e>>>24,this[t+1]=e>>>16,this[t+2]=e>>>8,this[t+3]=255&e):R(this,e,t,!1),t+4},u.prototype.writeIntLE=function(e,t,n,r){if(e=+e,t|=0,!r){var o=Math.pow(2,8*n-1);M(this,e,t,n,o-1,-o)}var i=0,a=1,s=0;for(this[t]=255&e;++i>0)-s&255;return t+n},u.prototype.writeIntBE=function(e,t,n,r){if(e=+e,t|=0,!r){var o=Math.pow(2,8*n-1);M(this,e,t,n,o-1,-o)}var i=n-1,a=1,s=0;for(this[t+i]=255&e;--i>=0&&(a*=256);)e<0&&0===s&&0!==this[t+i+1]&&(s=1),this[t+i]=(e/a>>0)-s&255;return t+n},u.prototype.writeInt8=function(e,t,n){return e=+e,t|=0,n||M(this,e,t,1,127,-128),u.TYPED_ARRAY_SUPPORT||(e=Math.floor(e)),e<0&&(e=255+e+1),this[t]=255&e,t+1},u.prototype.writeInt16LE=function(e,t,n){return e=+e,t|=0,n||M(this,e,t,2,32767,-32768),u.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8):N(this,e,t,!0),t+2},u.prototype.writeInt16BE=function(e,t,n){return e=+e,t|=0,n||M(this,e,t,2,32767,-32768),u.TYPED_ARRAY_SUPPORT?(this[t]=e>>>8,this[t+1]=255&e):N(this,e,t,!1),t+2},u.prototype.writeInt32LE=function(e,t,n){return e=+e,t|=0,n||M(this,e,t,4,2147483647,-2147483648),u.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8,this[t+2]=e>>>16,this[t+3]=e>>>24):R(this,e,t,!0),t+4},u.prototype.writeInt32BE=function(e,t,n){return e=+e,t|=0,n||M(this,e,t,4,2147483647,-2147483648),e<0&&(e=4294967295+e+1),u.TYPED_ARRAY_SUPPORT?(this[t]=e>>>24,this[t+1]=e>>>16,this[t+2]=e>>>8,this[t+3]=255&e):R(this,e,t,!1),t+4},u.prototype.writeFloatLE=function(e,t,n){return L(this,e,t,!0,n)},u.prototype.writeFloatBE=function(e,t,n){return L(this,e,t,!1,n)},u.prototype.writeDoubleLE=function(e,t,n){return U(this,e,t,!0,n)},u.prototype.writeDoubleBE=function(e,t,n){return U(this,e,t,!1,n)},u.prototype.copy=function(e,t,n,r){if(n||(n=0),r||0===r||(r=this.length),t>=e.length&&(t=e.length),t||(t=0),r>0&&r=this.length)throw new RangeError("sourceStart out of bounds");if(r<0)throw new RangeError("sourceEnd out of bounds");r>this.length&&(r=this.length),e.length-t=0;--o)e[o+t]=this[o+n];else if(i<1e3||!u.TYPED_ARRAY_SUPPORT)for(o=0;o>>=0,n=void 0===n?this.length:n>>>0,e||(e=0),"number"==typeof e)for(i=t;i55295&&n<57344){if(!o){if(n>56319){(t-=3)>-1&&i.push(239,191,189);continue}if(a+1===r){(t-=3)>-1&&i.push(239,191,189);continue}o=n;continue}if(n<56320){(t-=3)>-1&&i.push(239,191,189),o=n;continue}n=65536+(o-55296<<10|n-56320)}else o&&(t-=3)>-1&&i.push(239,191,189);if(o=null,n<128){if((t-=1)<0)break;i.push(n)}else if(n<2048){if((t-=2)<0)break;i.push(n>>6|192,63&n|128)}else if(n<65536){if((t-=3)<0)break;i.push(n>>12|224,n>>6&63|128,63&n|128)}else{if(!(n<1114112))throw new Error("Invalid code point");if((t-=4)<0)break;i.push(n>>18|240,n>>12&63|128,n>>6&63|128,63&n|128)}}return i}function z(e){return r.toByteArray(function(e){if((e=function(e){return e.trim?e.trim():e.replace(/^\s+|\s+$/g,"")}(e).replace(q,"")).length<2)return"";for(;e.length%4!=0;)e+="=";return e}(e))}function V(e,t,n,r){for(var o=0;o=t.length||o>=e.length);++o)t[o+n]=e[o];return o}}).call(this,n(36))},function(e,t,n){"use strict";e.exports={current:null}},function(e,t){e.exports=function(e){return null!=e&&"object"==typeof e}},function(e,t){var n,r,o=e.exports={};function i(){throw new Error("setTimeout has not been defined")}function a(){throw new Error("clearTimeout has not been defined")}function s(e){if(n===setTimeout)return setTimeout(e,0);if((n===i||!n)&&setTimeout)return n=setTimeout,setTimeout(e,0);try{return n(e,0)}catch(t){try{return n.call(null,e,0)}catch(t){return n.call(this,e,0)}}}!function(){try{n="function"==typeof setTimeout?setTimeout:i}catch(e){n=i}try{r="function"==typeof clearTimeout?clearTimeout:a}catch(e){r=a}}();var u,c=[],l=!1,p=-1;function f(){l&&u&&(l=!1,u.length?c=u.concat(c):p=-1,c.length&&h())}function h(){if(!l){var e=s(f);l=!0;for(var t=c.length;t;){for(u=c,c=[];++p1)for(var n=1;n0&&"/"!==t[0]});function oe(e,t,n){return t=t||[],te.apply(void 0,[e].concat(u()(t))).get("parameters",Object(p.List)()).reduce(function(e,t){var r=n&&"body"===t.get("in")?t.get("value_xml"):t.get("value");return e.set(Object(l.B)(t,{allowHashes:!1}),r)},Object(p.fromJS)({}))}function ie(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";if(p.List.isList(e))return e.some(function(e){return p.Map.isMap(e)&&e.get("in")===t})}function ae(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";if(p.List.isList(e))return e.some(function(e){return p.Map.isMap(e)&&e.get("type")===t})}function se(e,t){t=t||[];var n=x(e).getIn(["paths"].concat(u()(t)),Object(p.fromJS)({})),r=e.getIn(["meta","paths"].concat(u()(t)),Object(p.fromJS)({})),o=ue(e,t),i=n.get("parameters")||new p.List,a=r.get("consumes_value")?r.get("consumes_value"):ae(i,"file")?"multipart/form-data":ae(i,"formData")?"application/x-www-form-urlencoded":void 0;return Object(p.fromJS)({requestContentType:a,responseContentType:o})}function ue(e,t){t=t||[];var n=x(e).getIn(["paths"].concat(u()(t)),null);if(null!==n){var r=e.getIn(["meta","paths"].concat(u()(t),["produces_value"]),null),o=n.getIn(["produces",0],null);return r||o||"application/json"}}function ce(e,t){t=t||[];var n=x(e),r=n.getIn(["paths"].concat(u()(t)),null);if(null!==r){var o=t,i=a()(o,1)[0],s=r.get("produces",null),c=n.getIn(["paths",i,"produces"],null),l=n.getIn(["produces"],null);return s||c||l}}function le(e,t){t=t||[];var n=x(e),r=n.getIn(["paths"].concat(u()(t)),null);if(null!==r){var o=t,i=a()(o,1)[0],s=r.get("consumes",null),c=n.getIn(["paths",i,"consumes"],null),l=n.getIn(["consumes"],null);return s||c||l}}var pe=function(e,t,n){var r=e.get("url").match(/^([a-z][a-z0-9+\-.]*):/),i=o()(r)?r[1]:null;return e.getIn(["scheme",t,n])||e.getIn(["scheme","_defaultScheme"])||i||""},fe=function(e,t,n){return["http","https"].indexOf(pe(e,t,n))>-1},he=function(e,t){t=t||[];var n=e.getIn(["meta","paths"].concat(u()(t),["parameters"]),Object(p.fromJS)([])),r=!0;return n.forEach(function(e){var t=e.get("errors");t&&t.count()&&(r=!1)}),r};function de(e){return p.Map.isMap(e)?e:new p.Map}},function(e,t,n){"use strict";n.r(t),n.d(t,"SHOW_AUTH_POPUP",function(){return d}),n.d(t,"AUTHORIZE",function(){return m}),n.d(t,"LOGOUT",function(){return v}),n.d(t,"PRE_AUTHORIZE_OAUTH2",function(){return g}),n.d(t,"AUTHORIZE_OAUTH2",function(){return y}),n.d(t,"VALIDATE",function(){return b}),n.d(t,"CONFIGURE_AUTH",function(){return _}),n.d(t,"showDefinitions",function(){return w}),n.d(t,"authorize",function(){return x}),n.d(t,"logout",function(){return E}),n.d(t,"preAuthorizeImplicit",function(){return S}),n.d(t,"authorizeOauth2",function(){return C}),n.d(t,"authorizePassword",function(){return k}),n.d(t,"authorizeApplication",function(){return O}),n.d(t,"authorizeAccessCodeWithFormParams",function(){return A}),n.d(t,"authorizeAccessCodeWithBasicAuthentication",function(){return T}),n.d(t,"authorizeRequest",function(){return j}),n.d(t,"configureAuth",function(){return P});var r=n(26),o=n.n(r),i=n(16),a=n.n(i),s=n(28),u=n.n(s),c=n(95),l=n.n(c),p=n(18),f=n.n(p),h=n(3),d="show_popup",m="authorize",v="logout",g="pre_authorize_oauth2",y="authorize_oauth2",b="validate",_="configure_auth";function w(e){return{type:d,payload:e}}function x(e){return{type:m,payload:e}}function E(e){return{type:v,payload:e}}var S=function(e){return function(t){var n=t.authActions,r=t.errActions,o=e.auth,i=e.token,a=e.isValid,s=o.schema,c=o.name,l=s.get("flow");delete f.a.swaggerUIRedirectOauth2,"accessCode"===l||a||r.newAuthErr({authId:c,source:"auth",level:"warning",message:"Authorization may be unsafe, passed state was changed in server Passed state wasn't returned from auth server"}),i.error?r.newAuthErr({authId:c,source:"auth",level:"error",message:u()(i)}):n.authorizeOauth2({auth:o,token:i})}};function C(e){return{type:y,payload:e}}var k=function(e){return function(t){var n=t.authActions,r=e.schema,o=e.name,i=e.username,s=e.password,u=e.passwordType,c=e.clientId,l=e.clientSecret,p={grant_type:"password",scope:e.scopes.join(" "),username:i,password:s},f={};switch(u){case"request-body":!function(e,t,n){t&&a()(e,{client_id:t});n&&a()(e,{client_secret:n})}(p,c,l);break;case"basic":f.Authorization="Basic "+Object(h.a)(c+":"+l);break;default:console.warn("Warning: invalid passwordType ".concat(u," was passed, not including client id and secret"))}return n.authorizeRequest({body:Object(h.b)(p),url:r.get("tokenUrl"),name:o,headers:f,query:{},auth:e})}};var O=function(e){return function(t){var n=t.authActions,r=e.schema,o=e.scopes,i=e.name,a=e.clientId,s=e.clientSecret,u={Authorization:"Basic "+Object(h.a)(a+":"+s)},c={grant_type:"client_credentials",scope:o.join(" ")};return n.authorizeRequest({body:Object(h.b)(c),name:i,url:r.get("tokenUrl"),auth:e,headers:u})}},A=function(e){var t=e.auth,n=e.redirectUrl;return function(e){var r=e.authActions,o=t.schema,i=t.name,a=t.clientId,s=t.clientSecret,u=t.codeVerifier,c={grant_type:"authorization_code",code:t.code,client_id:a,client_secret:s,redirect_uri:n,code_verifier:u};return r.authorizeRequest({body:Object(h.b)(c),name:i,url:o.get("tokenUrl"),auth:t})}},T=function(e){var t=e.auth,n=e.redirectUrl;return function(e){var r=e.authActions,o=t.schema,i=t.name,a=t.clientId,s=t.clientSecret,u={Authorization:"Basic "+Object(h.a)(a+":"+s)},c={grant_type:"authorization_code",code:t.code,client_id:a,redirect_uri:n};return r.authorizeRequest({body:Object(h.b)(c),name:i,url:o.get("tokenUrl"),auth:t,headers:u})}},j=function(e){return function(t){var n,r=t.fn,i=t.getConfigs,s=t.authActions,c=t.errActions,p=t.oas3Selectors,f=t.specSelectors,h=t.authSelectors,d=e.body,m=e.query,v=void 0===m?{}:m,g=e.headers,y=void 0===g?{}:g,b=e.name,_=e.url,w=e.auth,x=(h.getConfigs()||{}).additionalQueryStringParams;n=f.isOAS3()?l()(_,p.selectedServer(),!0):l()(_,f.url(),!0),"object"===o()(x)&&(n.query=a()({},n.query,x));var E=n.toString(),S=a()({Accept:"application/json, text/plain, */*","Content-Type":"application/x-www-form-urlencoded","X-Requested-With":"XMLHttpRequest"},y);r.fetch({url:E,method:"post",headers:S,query:v,body:d,requestInterceptor:i().requestInterceptor,responseInterceptor:i().responseInterceptor}).then(function(e){var t=JSON.parse(e.data),n=t&&(t.error||""),r=t&&(t.parseError||"");e.ok?n||r?c.newAuthErr({authId:b,level:"error",source:"auth",message:u()(t)}):s.authorizeOauth2({auth:w,token:t}):c.newAuthErr({authId:b,level:"error",source:"auth",message:e.statusText})}).catch(function(e){var t=new Error(e).message;if(e.response&&e.response.data){var n=e.response.data;try{var r="string"==typeof n?JSON.parse(n):n;r.error&&(t+=", error: ".concat(r.error)),r.error_description&&(t+=", description: ".concat(r.error_description))}catch(e){}}c.newAuthErr({authId:b,level:"error",source:"auth",message:t})})}};function P(e){return{type:_,payload:e}}},function(e,t){var n=e.exports={version:"2.6.5"};"number"==typeof __e&&(__e=n)},function(e,t){e.exports=function(e){if(null==e)throw TypeError("Can't call method on  "+e);return e}},function(e,t,n){var r=n(127),o=Math.min;e.exports=function(e){return e>0?o(r(e),9007199254740991):0}},function(e,t){var n={}.hasOwnProperty;e.exports=function(e,t){return n.call(e,t)}},function(e,t,n){var r=n(211),o=n(210);e.exports=function(e){return r(o(e))}},function(e,t,n){var r=n(49),o=n(133);e.exports=n(50)?function(e,t,n){return r.f(e,t,o(1,n))}:function(e,t,n){return e[t]=n,e}},function(e,t,n){"use strict";e.exports=function(e){if("function"!=typeof e)throw new TypeError(e+" is not a function");return e}},function(e,t,n){"use strict";n.r(t),n.d(t,"UPDATE_LAYOUT",function(){return o}),n.d(t,"UPDATE_FILTER",function(){return i}),n.d(t,"UPDATE_MODE",function(){return a}),n.d(t,"SHOW",function(){return s}),n.d(t,"updateLayout",function(){return u}),n.d(t,"updateFilter",function(){return c}),n.d(t,"show",function(){return l}),n.d(t,"changeMode",function(){return p});var r=n(3),o="layout_update_layout",i="layout_update_filter",a="layout_update_mode",s="layout_show";function u(e){return{type:o,payload:e}}function c(e){return{type:i,payload:e}}function l(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];return e=Object(r.w)(e),{type:s,payload:{thing:e,shown:t}}}function p(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";return e=Object(r.w)(e),{type:a,payload:{thing:e,mode:t}}}},function(e,t,n){"use strict";(function(t){
    -/*!
    - * @description Recursive object extending
    - * @author Viacheslav Lotsmanov 
    - * @license MIT
    - *
    - * The MIT License (MIT)
    - *
    - * Copyright (c) 2013-2018 Viacheslav Lotsmanov
    - *
    - * Permission is hereby granted, free of charge, to any person obtaining a copy of
    - * this software and associated documentation files (the "Software"), to deal in
    - * the Software without restriction, including without limitation the rights to
    - * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
    - * the Software, and to permit persons to whom the Software is furnished to do so,
    - * subject to the following conditions:
    - *
    - * The above copyright notice and this permission notice shall be included in all
    - * copies or substantial portions of the Software.
    - *
    - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
    - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
    - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
    - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
    - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
    - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
    - */
    -function n(e){return e instanceof t||e instanceof Date||e instanceof RegExp}function r(e){if(e instanceof t){var n=t.alloc?t.alloc(e.length):new t(e.length);return e.copy(n),n}if(e instanceof Date)return new Date(e.getTime());if(e instanceof RegExp)return new RegExp(e);throw new Error("Unexpected situation")}function o(e){var t=[];return e.forEach(function(e,i){"object"==typeof e&&null!==e?Array.isArray(e)?t[i]=o(e):n(e)?t[i]=r(e):t[i]=a({},e):t[i]=e}),t}function i(e,t){return"__proto__"===t?void 0:e[t]}var a=e.exports=function(){if(arguments.length<1||"object"!=typeof arguments[0])return!1;if(arguments.length<2)return arguments[0];var e,t,s=arguments[0],u=Array.prototype.slice.call(arguments,1);return u.forEach(function(u){"object"!=typeof u||null===u||Array.isArray(u)||Object.keys(u).forEach(function(c){return t=i(s,c),(e=i(u,c))===s?void 0:"object"!=typeof e||null===e?void(s[c]=e):Array.isArray(e)?void(s[c]=o(e)):n(e)?void(s[c]=r(e)):"object"!=typeof t||null===t||Array.isArray(t)?void(s[c]=a({},e)):void(s[c]=a(t,e))})}),s}}).call(this,n(64).Buffer)},function(e,t,n){var r=n(151),o=n(336);e.exports=n(126)?function(e,t,n){return r.f(e,t,o(1,n))}:function(e,t,n){return e[t]=n,e}},function(e,t){e.exports=function(e){try{return!!e()}catch(e){return!0}}},function(e,t,n){var r=n(106),o=n(603),i=n(604),a="[object Null]",s="[object Undefined]",u=r?r.toStringTag:void 0;e.exports=function(e){return null==e?void 0===e?s:a:u&&u in Object(e)?o(e):i(e)}},function(e,t,n){var r=n(621),o=n(624);e.exports=function(e,t){var n=o(e,t);return r(n)?n:void 0}},function(e,t,n){var r=n(380),o=n(661),i=n(107);e.exports=function(e){return i(e)?r(e):o(e)}},function(e,t,n){"use strict";var r=n(178),o=Object.keys||function(e){var t=[];for(var n in e)t.push(n);return t};e.exports=p;var i=n(137);i.inherits=n(47);var a=n(390),s=n(240);i.inherits(p,a);for(var u=o(s.prototype),c=0;c=t.length?{value:void 0,done:!0}:(e=r(t,n),this._i+=e.length,{value:e,done:!1})})},function(e,t){e.exports={}},function(e,t,n){n(561);for(var r=n(32),o=n(77),i=n(102),a=n(34)("toStringTag"),s="CSSRuleList,CSSStyleDeclaration,CSSValueList,ClientRectList,DOMRectList,DOMStringList,DOMTokenList,DataTransferItemList,FileList,HTMLAllCollection,HTMLCollection,HTMLFormElement,HTMLSelectElement,MediaList,MimeTypeArray,NamedNodeMap,NodeList,PaintRequestList,Plugin,PluginArray,SVGLengthList,SVGNumberList,SVGPathSegList,SVGPointList,SVGStringList,SVGTransformList,SourceBufferList,StyleSheetList,TextTrackCueList,TextTrackList,TouchList".split(","),u=0;u1){for(var d=Array(h),m=0;m1){for(var g=Array(v),y=0;y=this._finalSize&&(this._update(this._block),this._block.fill(0));var n=8*this._len;if(n<=4294967295)this._block.writeUInt32BE(n,this._blockSize-4);else{var r=(4294967295&n)>>>0,o=(n-r)/4294967296;this._block.writeUInt32BE(o,this._blockSize-8),this._block.writeUInt32BE(r,this._blockSize-4)}this._update(this._block);var i=this._hash();return e?i.toString(e):i},o.prototype._update=function(){throw new Error("_update must be implemented by subclass")},e.exports=o},function(e,t,n){var r=n(63),o=n(406),i=n(407),a=n(46),s=n(158),u=n(225),c={},l={};(t=e.exports=function(e,t,n,p,f){var h,d,m,v,g=f?function(){return e}:u(e),y=r(n,p,t?2:1),b=0;if("function"!=typeof g)throw TypeError(e+" is not iterable!");if(i(g)){for(h=s(e.length);h>b;b++)if((v=t?y(a(d=e[b])[0],d[1]):y(e[b]))===c||v===l)return v}else for(m=g.call(e);!(d=m.next()).done;)if((v=o(m,y,d.value,t))===c||v===l)return v}).BREAK=c,t.RETURN=l},function(e,t,n){"use strict";function r(e){return null==e}e.exports.isNothing=r,e.exports.isObject=function(e){return"object"==typeof e&&null!==e},e.exports.toArray=function(e){return Array.isArray(e)?e:r(e)?[]:[e]},e.exports.repeat=function(e,t){var n,r="";for(n=0;n1&&void 0!==arguments[1]?arguments[1]:{},r=Object(i.A)(t),a=r.type,s=r.example,u=r.properties,c=r.additionalProperties,l=r.items,p=n.includeReadOnly,f=n.includeWriteOnly;if(void 0!==s)return Object(i.e)(s,"$$ref",function(e){return"string"==typeof e&&e.indexOf("#")>-1});if(!a)if(u)a="object";else{if(!l)return;a="array"}if("object"===a){var d=Object(i.A)(u),m={};for(var v in d)d[v]&&d[v].deprecated||d[v]&&d[v].readOnly&&!p||d[v]&&d[v].writeOnly&&!f||(m[v]=e(d[v],n));if(!0===c)m.additionalProp1={};else if(c)for(var g=Object(i.A)(c),y=e(g,n),b=1;b<4;b++)m["additionalProp"+b]=y;return m}return"array"===a?o()(l.anyOf)?l.anyOf.map(function(t){return e(t,n)}):o()(l.oneOf)?l.oneOf.map(function(t){return e(t,n)}):[e(l,n)]:t.enum?t.default?t.default:Object(i.w)(t.enum)[0]:"file"!==a?h(t):void 0},m=function(e){return e.schema&&(e=e.schema),e.properties&&(e.type="object"),e},v=function e(t){var n,r,a=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},s=p()({},Object(i.A)(t)),u=s.type,c=s.properties,l=s.additionalProperties,f=s.items,d=s.example,m=a.includeReadOnly,v=a.includeWriteOnly,g=s.default,y={},b={},_=t.xml,w=_.name,x=_.prefix,E=_.namespace,S=s.enum;if(!u)if(c||l)u="object";else{if(!f)return;u="array"}if(n=(x?x+":":"")+(w=w||"notagname"),E){var C=x?"xmlns:"+x:"xmlns";b[C]=E}if("array"===u&&f){if(f.xml=f.xml||_||{},f.xml.name=f.xml.name||_.name,_.wrapped)return y[n]=[],o()(d)?d.forEach(function(t){f.example=t,y[n].push(e(f,a))}):o()(g)?g.forEach(function(t){f.default=t,y[n].push(e(f,a))}):y[n]=[e(f,a)],b&&y[n].push({_attr:b}),y;var k=[];return o()(d)?(d.forEach(function(t){f.example=t,k.push(e(f,a))}),k):o()(g)?(g.forEach(function(t){f.default=t,k.push(e(f,a))}),k):e(f,a)}if("object"===u){var O=Object(i.A)(c);for(var A in y[n]=[],d=d||{},O)if(O.hasOwnProperty(A)&&(!O[A].readOnly||m)&&(!O[A].writeOnly||v))if(O[A].xml=O[A].xml||{},O[A].xml.attribute){var T=o()(O[A].enum)&&O[A].enum[0],j=O[A].example,P=O[A].default;b[O[A].xml.name||A]=void 0!==j&&j||void 0!==d[A]&&d[A]||void 0!==P&&P||T||h(O[A])}else{O[A].xml.name=O[A].xml.name||A,void 0===O[A].example&&void 0!==d[A]&&(O[A].example=d[A]);var I=e(O[A]);o()(I)?y[n]=y[n].concat(I):y[n].push(I)}return!0===l?y[n].push({additionalProp:"Anything can be here"}):l&&y[n].push({additionalProp:h(l)}),b&&y[n].push({_attr:b}),y}return r=void 0!==d?d:void 0!==g?g:o()(S)?S[0]:h(t),y[n]=b?[{_attr:b},r]:r,y};function g(e,t){var n=v(e,t);if(n)return s()(n,{declaration:!0,indent:"\t"})}var y=c()(g),b=c()(d)},function(e,t,n){"use strict";n.r(t),n.d(t,"UPDATE_CONFIGS",function(){return i}),n.d(t,"TOGGLE_CONFIGS",function(){return a}),n.d(t,"update",function(){return s}),n.d(t,"toggle",function(){return u}),n.d(t,"loaded",function(){return c});var r=n(2),o=n.n(r),i="configs_update",a="configs_toggle";function s(e,t){return{type:i,payload:o()({},e,t)}}function u(e){return{type:a,payload:e}}var c=function(){return function(){}}},function(e,t,n){"use strict";n.d(t,"a",function(){return a});var r=n(1),o=n.n(r),i=o.a.Set.of("type","format","items","default","maximum","exclusiveMaximum","minimum","exclusiveMinimum","maxLength","minLength","pattern","maxItems","minItems","uniqueItems","enum","multipleOf");function a(e){var t=(arguments.length>1&&void 0!==arguments[1]?arguments[1]:{}).isOAS3;if(!o.a.Map.isMap(e))return{schema:o.a.Map(),parameterContentMediaType:null};if(!t)return"body"===e.get("in")?{schema:e.get("schema",o.a.Map()),parameterContentMediaType:null}:{schema:e.filter(function(e,t){return i.includes(t)}),parameterContentMediaType:null};if(e.get("content")){var n=e.get("content",o.a.Map({})).keySeq().first();return{schema:e.getIn(["content",n,"schema"],o.a.Map()),parameterContentMediaType:n}}return{schema:e.get("schema",o.a.Map()),parameterContentMediaType:null}}},function(e,t,n){e.exports=n(781)},function(e,t,n){"use strict";n.r(t);var r=n(469),o="object"==typeof self&&self&&self.Object===Object&&self,i=(r.a||o||Function("return this")()).Symbol,a=Object.prototype,s=a.hasOwnProperty,u=a.toString,c=i?i.toStringTag:void 0;var l=function(e){var t=s.call(e,c),n=e[c];try{e[c]=void 0;var r=!0}catch(e){}var o=u.call(e);return r&&(t?e[c]=n:delete e[c]),o},p=Object.prototype.toString;var f=function(e){return p.call(e)},h="[object Null]",d="[object Undefined]",m=i?i.toStringTag:void 0;var v=function(e){return null==e?void 0===e?d:h:m&&m in Object(e)?l(e):f(e)};var g=function(e,t){return function(n){return e(t(n))}}(Object.getPrototypeOf,Object);var y=function(e){return null!=e&&"object"==typeof e},b="[object Object]",_=Function.prototype,w=Object.prototype,x=_.toString,E=w.hasOwnProperty,S=x.call(Object);var C=function(e){if(!y(e)||v(e)!=b)return!1;var t=g(e);if(null===t)return!0;var n=E.call(t,"constructor")&&t.constructor;return"function"==typeof n&&n instanceof n&&x.call(n)==S},k=n(330),O={INIT:"@@redux/INIT"};function A(e,t,n){var r;if("function"==typeof t&&void 0===n&&(n=t,t=void 0),void 0!==n){if("function"!=typeof n)throw new Error("Expected the enhancer to be a function.");return n(A)(e,t)}if("function"!=typeof e)throw new Error("Expected the reducer to be a function.");var o=e,i=t,a=[],s=a,u=!1;function c(){s===a&&(s=a.slice())}function l(){return i}function p(e){if("function"!=typeof e)throw new Error("Expected listener to be a function.");var t=!0;return c(),s.push(e),function(){if(t){t=!1,c();var n=s.indexOf(e);s.splice(n,1)}}}function f(e){if(!C(e))throw new Error("Actions must be plain objects. Use custom middleware for async actions.");if(void 0===e.type)throw new Error('Actions may not have an undefined "type" property. Have you misspelled a constant?');if(u)throw new Error("Reducers may not dispatch actions.");try{u=!0,i=o(i,e)}finally{u=!1}for(var t=a=s,n=0;n0&&void 0!==arguments[0]?arguments[0]:{},t=arguments[1];if(a)throw a;for(var r=!1,o={},s=0;s0?r:n)(e)}},function(e,t){e.exports={}},function(e,t,n){var r=n(348),o=n(215);e.exports=Object.keys||function(e){return r(e,o)}},function(e,t){var n={}.toString;e.exports=function(e){return n.call(e).slice(8,-1)}},function(e,t){e.exports=!0},function(e,t){e.exports=function(e){if("function"!=typeof e)throw TypeError(e+" is not a function!");return e}},function(e,t){e.exports=function(e,t){return{enumerable:!(1&e),configurable:!(2&e),writable:!(4&e),value:t}}},function(e,t,n){var r=n(49).f,o=n(75),i=n(34)("toStringTag");e.exports=function(e,t,n){e&&!o(e=n?e:e.prototype,i)&&r(e,i,{configurable:!0,value:t})}},function(e,t,n){var r=n(159)("meta"),o=n(43),i=n(75),a=n(49).f,s=0,u=Object.isExtensible||function(){return!0},c=!n(82)(function(){return u(Object.preventExtensions({}))}),l=function(e){a(e,r,{value:{i:"O"+ ++s,w:{}}})},p=e.exports={KEY:r,NEED:!1,fastKey:function(e,t){if(!o(e))return"symbol"==typeof e?e:("string"==typeof e?"S":"P")+e;if(!i(e,r)){if(!u(e))return"F";if(!t)return"E";l(e)}return e[r].i},getWeak:function(e,t){if(!i(e,r)){if(!u(e))return!0;if(!t)return!1;l(e)}return e[r].w},onFreeze:function(e){return c&&p.NEED&&u(e)&&!i(e,r)&&l(e),e}}},function(e,t,n){"use strict";e.exports=function(e){for(var t=arguments.length-1,n="Minified React error #"+e+"; visit http://facebook.github.io/react/docs/error-decoder.html?invariant="+e,r=0;r1&&void 0!==arguments[1]?arguments[1]:[],n={arrayBehaviour:(arguments.length>2&&void 0!==arguments[2]?arguments[2]:{}).arrayBehaviour||"replace"},r=t.map(function(e){return e||{}}),i=e||{},c=0;c1?t-1:0),r=1;r")}),p=function(){var e=/(?:)/,t=e.exec;e.exec=function(){return t.apply(this,arguments)};var n="ab".split(e);return 2===n.length&&"a"===n[0]&&"b"===n[1]}();e.exports=function(e,t,n){var f=s(e),h=!i(function(){var t={};return t[f]=function(){return 7},7!=""[e](t)}),d=h?!i(function(){var t=!1,n=/a/;return n.exec=function(){return t=!0,null},"split"===e&&(n.constructor={},n.constructor[c]=function(){return n}),n[f](""),!t}):void 0;if(!h||!d||"replace"===e&&!l||"split"===e&&!p){var m=/./[f],v=n(a,f,""[e],function(e,t,n,r,o){return t.exec===u?h&&!o?{done:!0,value:m.call(t,n,r)}:{done:!0,value:e.call(n,t,r)}:{done:!1}}),g=v[0],y=v[1];r(String.prototype,e,g),o(RegExp.prototype,f,2==t?function(e,t){return y.call(e,this,t)}:function(e){return y.call(e,this)})}}},function(e,t,n){var r=n(212),o=Math.min;e.exports=function(e){return e>0?o(r(e),9007199254740991):0}},function(e,t){var n=0,r=Math.random();e.exports=function(e){return"Symbol(".concat(void 0===e?"":e,")_",(++n+r).toString(36))}},function(e,t,n){var r=n(46),o=n(350),i=n(215),a=n(213)("IE_PROTO"),s=function(){},u=function(){var e,t=n(217)("iframe"),r=i.length;for(t.style.display="none",n(351).appendChild(t),t.src="javascript:",(e=t.contentWindow.document).open(),e.write("

    Tags

    \ No newline at end of file +Tags |

    Tags

    \ No newline at end of file diff --git a/tags/index.xml b/tags/index.xml index f240332..7a1d646 100644 --- a/tags/index.xml +++ b/tags/index.xml @@ -1 +1 @@ -– Tagshttps://onshape-public.github.io/tags/Recent content in Tags onHugo -- gohugo.ioen-us \ No newline at end of file +Tags onhttps://onshape-public.github.io/tags/Recent content in Tags onHugoen-us \ No newline at end of file diff --git a/webfonts/fa-brands-400.eot b/webfonts/fa-brands-400.eot deleted file mode 100644 index 2cca660de6a78a701c3a9294c520ff1c7af664df..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 129734 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 - - - - -Created by FontForge 20190112 at Fri Aug 2 14:41:09 2019 - By Robert Madole -Copyright (c) Font Awesome - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/webfonts/fa-brands-400.ttf b/webfonts/fa-brands-400.ttf index 2cb180bc7cb3fc910ddcfd952728774019dc77ed..8c8a402329635864ed6ece2b50f4bbcbd158b839 100644 GIT binary patch literal 209128 zcmd443!I!qmGE8lJbl0S^u6cS(>*ht$;>3vbL%AJGK2&YNC1)hMS_T;+@c0S1RXA} zsHmXa1TXQ%x*A;;am5wcS(ioDWtCT9brp3$45+MTW)c!nXTJZb>P{wzyYKhC-}n1{ z-E+F?se7F|b?VfqQ_m=^lnSXy<*L#NuU+XwvTdAI%%K6=j3okhDb$!9_^Q?9O;};U(ImvS*{%3*i3oqGm<)1wM z?^E85N(C;y__FiQbN=qH?^UXOi0AE>oOk7RXM^We#0N-Uy7atDE|>|A)|8w6ky4)a z?U%iE$9*l%X65D&D3#lzXshe>s*bm}0x zBRTl+s~=nVs#4Ci#Q)B@xe;z6<;Q825U161f~uN8$)^uX<!oZy+{_$L@#hfqD+aOG-NBwW718Sa)ZR#@a>JdOr5q46GuIy zZ)uj-OphDa&o|mIMVdV-K$vZ7)16R$@^vh#?@*tlo(b|#;sTP_nJ{jo*>A>W!PGmc zlDGllqoi|yyy@?xsn61i9{XOX~MD+ak}VO*Wr`eqS71L zvL?Ny_W)(4O*?ir(oHwY;#p5GP#5lmikZ5^4;cRxV|OC$ySb5mQni`-lq!&>1URr) z!#^6~CES9k%kqu9-qWDNDN|;%{gO_2kJKY!j-lsLqaM;4Iu<$?n1UBfkaiOP&6Fp& zXMT`3LtM%{69=vRLEmffX4+u$nleb=EQ>X2kzZ))fyVrwFyoOj^-PgQVA9kZ(9g)T ziMRb_>`XjqXosZ(y!3;|6+YLDw__{M4Sqv@!*6+Jtr5R*WnM|WmewX2mkFLH z7>9>US+-qMQceTxnm`_zYZgC;;jf9u|Hf_fS^5@pHcDS9djg&X$l%t_|-uZ7_Mj`-I8?uEbN1%%z-- zxAe<%p;<Iz=N;)}j%Nf`BS8~_!k~4G-=m_dF3aG2XKLI>nE$LL?Y?N4Vj`m{-06OQv~|eQ>sh#sD8Cl zovF@KuT|%(*QpEC>(v|7h3bv!P3j_bvARTEsxDL8)tl8@)LYdKb-8+*xC>ifn7;Ap`DY&g#l$bR{o+5LjX%5U*<+vm z=(Be}yYrW|UvB^9mw)-~-I3j`yZd)9-@Rt{k-N{{eg5t@@4kBX4SU|O=Z$-=+jG;N z5AV5q&y#zeo=MFtnOQnBKC^n}l$kSUUO)53nK#W`I`ih4x6JIAdFRZvGdIk9VCL4D zJ7?~m`NYf@X1+G_(9B~qKb-m1%x`D*&Ac@0&IV^=v)S39+2Psx?AqBav#*&wZ}y_u zOJ}#wzH|1v+4s$Uc=p!W+h#vHd-v=;vtOLuHT&h+`)41RePs5>vp<`io;!Q)^0{l~ zCgBn#9@+QUzVGdu*|&e+OE1P>Y13p@v#@5+F#p$ z&i;4ofA{|P?*G94TlRl+|KIKZ%KiuUKeGP^`~PGA)BAsMV9kN`2R?D&o&(=G@cjc% zA9#LYfl=>L6}40isn!3lj_xVbS4_X>FO2RGqr2;ukL(Wb&NI4$yN}pC(HPx#?7q&7 z?zLugKf34pi$?c|#^}C*(Y_Iqk9*lyL0CLnFnXSGxPY&b2I-n zvxm`jW&^X)*#x6oV{})|9>?fzn>~N_5=Qsx*~!@(7~PLBy00 z*V*geo7`J4quaY^bf0B(pW7Guzcsr5YDRa6(Y>lMx;O8?WB=bWy5DGw?#~(B(F5xa zAKiuNg`Y3{WZ{PkPcqK`N1sw(siTxHWjcS;`HRk{JHORA)p1<=Rqf%n7ut5Tt!vA) z`C1=n{aWi+TDyz8i(f3>T6|UU=wiJ%UhFUS730NV;g5y6!f&Ms@!9yV;?Kr^7XN(w ztol&u8mE`-WA&sdu!}1#JmZ3Bk-Eo+5DarJ2Q4#Y)foy zY<292=v4Hp(XT}Bi{2aka&%Ypi_tGcKOg<;=snTTML!e$RCFhT(t+X%TOdNaQ_M&A>?A$ooEI{cH-3!>*m&xxKLc{=g~nC|x@-;!R*C$cfJDl#4! zj`T&UkgIj|~2Ui4#4ZpUPDE<8ZgYP~1%X*i-Q{S#X z(J1Es(9x&rlMXL}J@N_((c{4T0CWrdGAjSmN2i-9SdIVEhZRc6Dz!`!=<;7m_7}pD z4qo`n>D%@{lya12RH9m18Pt$Q_ER{Z%{X>PpBVjzmDk^-LC&mMWpFr zGd6f+R(3T&q<{+010Xa|lA07e!WBLuApN+c0YVX%HbDAx zSp!7s+1>!@=bIbQiz~D#PzB!FfF-y)8UT+%wy_|%5sDTN99_|X0o*GaFo^s11_+&A z)qv$xQL`Ypt-jg?G3aDXR za3`Qfa5q~}qqrwoP-D2%Gff?89GAXK-+-U-o_-H-BmQHQdV1c1qKs#l9RliDrG7DC zL3CTc*k(a(!TnDQYAZ^?xCM1Q?kWrF1YGh9s1tENYC*jU_ihV{Ha@%4f&x#!q@TZ} ze+oSPa=Qg}D()`e%Y@U1Up@kS8~>R~?G6JG{P6$X(Bf{Pwb$S>W&%R9yBVk5jET_f z?jwLT_@T|+6Tp%9p~2mf9}v3RE$M{5FUEbd1);m$?*OhQ9JCeoYEEqqy zn4z!gJ-GC923)B3p~u;G621p_61Wck94`2teINc8aiKQ>;rX*40l>TZ6E0&TAUnp{ z+W}}%E#QKC0S$ki{Ty%)esD4SH^3M1L)){vENDOOmw+!5E_k{Z0QWkC`+x-<#|6K$ zj}V@~eG&i%8k(N{DeyD=1>9*1x|J@RZ9%u;UI<)H8rm}le&?>i-;et)U=lz0o`a_6 z-i?0*_eKjMnasT(fF3pDFn0@Z2maN#^mXno{72z_9QY*ujkwU++-LD`!lmDH_u*%p z=IGPhH}Ri=J7qyLK6C#J&^P@$T>2*Ea~r+sPs;BMc5 z1tcf6kNO3Wq0~OcTR`NNeMedl+TQnJ3;Kt+;7CApxBEV0LH{T2=PhW)Yae|O&_BVY ztpb{{+4qnI{ZrgWEa;!%N}B-9nC<(X1wD;BV?i^9`}SK9o!-8eEa+b_J>wQMICzo% z2xxHe;yMc&T)ep6f(9QiLaPFz%YX4-0q9A?*IuN40sR|X+A5%5P-_1W0Dd%lWB)l8 zG_BTfiycf;$1HsPx|Z3|NgB?c?)VS`DQ+D+s&+ z=2!wq?R^~pMt!(Gu;$-|E^Pt;J3;bQep;QN)qH~W@CCcmCu2h+}l~I3*~PieCyRp9e;yTulkr$C!MU+>Gvyj7G<5iNvU&oA-rt?KCjfa zN7;Bhi~#pIg4^qW18f?IyM#2C?nL0HoXe>1Eu#onrz6Ct5!_b;FCer(fIvkXucRMu zr`)Tk`)cB@Chi*Qe%HkaN~F2=k4jxf*!8y}{H##w-FE^9l=`dfz+(tLlz-#rm3l9A zyiWnt`Tm4bH{FlGga3p0KSaQPG>Ti}P^#$U;=m98q*9{0g zlzs0c0uOn<@+`v6kCgg*>irsRd4M*2{duMS;bf&A+@sVtDeEEfOcD1__#f_8ipi+H zeZNwVQrEu*0Lu6`{EvNJsedma+-y?nd#eHR|F4Uc`j3cGKN?c%KdJL6(*JZXoAVdg zIS}^r1iOI85mH{K)N|y2p0MYiSL#=fDfMg0{Vn0Y8$dw05a|k-eS(!}3-Cv{`{_!( zM4CU)mOt%KYW@XeS&!1JxEfBcot+3C4y8zOqw*mMw2-H1JwX}kPY0-D18I**1Nb)&D1GenN^j+P>rSPQ|E$s{;GXoL(kIi$ zQ&uQ_+IFQ+-+}bU#~)HXLFXiOns5Pl`~y?t8gchI)0A65FAB}z}84m_{) zwG&ETmj~`w`g-bpZv=Qj>G$8O^i8Dsz?}#Yw*q^W{?L^inh}1-vr6B+10kZM^d~j| zq~GaL`cu^TY0~};&tIfpyEZBPrIVHZTk5!10p!1r=leZrrI(hzq z^8Vp*r5_~kH);1n+mxQdeK?`?zuchow<+h_JCuHuvc7Yn(%&6W`g=>1hE(?)(k2$Y8(8d~ zXOX*5IoRVkF~VYZ0{D}ASmc207UkrpSik}-T#sYWvRyfCCFOKJrJTxR%IQu3pI1)L ziOT6EKQ!wsIa@hPyOq;Vo`KVqvuu}gmOr4JAJNgBM`Hpgq8vuykO5GozIpf>GsM*ruF|h=cZ=H(#urw`@_)TdDJ{k11!z$CPvVkCbx-`L0~8oU6!t74=_T z0&Y^yH3Pr_-_Jnf&nm+$E?S_7wzul#rd#U$6;^B?X z{SPbW@2UH1pI6S;Y5zZ5tekI<=bLHeJVf|Ilr=@#M-s|`W}I(7s+>o+DCav5DCgfu z_wUsCU7jD`rJVn@M>$V?Ryj}JtDOJ1S~)-5pqw8)uACn~rkv?EdGWO}*}~S8K`K zNM)p2^Vf6LToR`;QpwfoJ>&ISZM@!9%jU8K`}{tCSFN|&TTM=!$*202uYBdqGbYdA zGlKVwGv{~fXe_Nu=~z^YZ+=>QtNx15{9c?XJUSvy;$V_(O`qPW_&8WqO{=XuWY9#a z)M&L<>#daizD%-~&Sgi2>*Hfdcf3AMD`*exng|ACu^=D$E#)GiP$Xx6^`s47P}bFI zew$9E((IGjHx!QIb%LvGb2nz1od;~{Yg`k^J=;obZXjm|m$<&5N zhHBYbPG|$V@Kvj|UU3Cuxm<17&`cwa@JvmxCpZ|Z4OND~2jePu19J^L=d$86VGMe0 zXmLC-V>Q9$PH^M6dMGOG4u@jPhdSD{>v6*Qnya(9d^#J8_I%)$2> z`d$ul$H!{5(W=n6uK6;S#4d|+L%_hVK>`)Za(};Z-2$$Mk3jCg2M^JzmP&xmV?Ti$Qb?!ZmMH-pTEXa z#>^3D9@>_070Mc_S^pI zZBp+a8vREuPnD%sGwVmGb-XTk@EPvf!){50&#BmQp+WSFc^t=jguoe#O?k zpfW*!>>qPl=W=DeE#GO$zhkL(`j)I+-G5`F4XIS(p?tZV%jpIVWGpt&mQh*D7y7F7&2H~F_v#va-czahJ-x2kouchw1{Vr$&-dOQ(6 zeka;~LT5UybvoU7p-K1&nr{{&oyx?olpK;XnP`^`e#z%4nB*p#q@fPM;~&A}r2e#= znxw{M6*L^dt-)dcJL+xl64n96xc*J4fYI_z`h%h5w8c@$VzgwRzI>5>i=>d0^LrBU z_=z_9L>t|l1A%W5wprVom`q>~(8OdQa}bl^NF2!?d7?2NKgCJp+QTp@^C6u{ zXNFj5gch13UeBe?>@;+1S8&!H=oJaz`JmRUtC8R>JqIVLv$TI=T|OGk<_d)zi^(CM zzDSZvmRAOv<^&Yb!dnW`F45-2i7-f!sDqg-9_S{WIE2!!8~j6bwUR^YberN^BV3Yjp%_N zjMsb2+N`fJbN40fi+DUm^*`cZLv0c1jM5kA#|Ft(-s} z=?5QWsmZL6T?g01uFNZj4%z9e8;isI&X+$UZ7dSarxrgL-i$@4?O)1gMnU>V-#~U& zdItZcmr$iEjn)47-#5FbC!~AxQ~yKv9OQs$Xm2ML25cQ0Yq8~1vKq^9E|vo98a0lD zDkN-YL{ml}^Pw%ri9%VHEZh3444G^_!b{uYiGy@*!%jSGJ93baJ>^teaY#4t6%Dku zw6%44n&fPQ=cf+ast6yO;u6Y~I#HbiMOXv;=!d;_&&KF>pEIWULK~ z`z^6hyP#T7kHD!;8XtF@@$r*vTQ;p+RW55?F0Wd-so_WF7;NhvX|}n)6o}fi{7S}& z!^F@@36e4`S`I78lv*T&g7R)M3IZ#OomA{LIL!U1|yAD?370 z_F#sB#*r#Uti(!}##!Or6x-T*E%&ovCKI@F30nd{Ljnx|eNOQzAwJHnh>$r&$?(QHb7LTfMrre7XE0qXk2u4X2*EVIUrh z#RtR}3I%05A}J;&__gxckw*@$6lW9B}2;n(aMz(0Nh!Gh=FqUNH zsU*ReaA65h(%)_ChDX{vwC-ph8D6(d`o2?8)a0bv1lia|N;2t*`KhK{EqFM%4x$73 zvvFIr8=&&P@HEjJhG|Rr(+vi=v-!MubS&Xd9_9!x4z*+Ouy!>0&dc^Di(6yrw*~%% znx|~TcD}4uTjvz`Uv;ofAxS~~SY(fA7>-4tfDCq9W3fr<+EO+|KRnFoebLv7(l5GjiZQ@C2W|(uO%vfWi zEXQPEOkA`Gz}nuniNmfqmtom2%{; z{nVj#vqJbH>M7Y0o0}=E4u7U^wmGu1KcvxWHvF*qmx2(hhp}2YnHqMlZMl1MG?PYW zqNV00)*D@JY$|y&)h-;|STOLT( zhVBa0sM*h=FkKWjUe9G?pZi=an{9{!?+zuCp?5bhozrM)&!!?$zI$Vg{LN9V}MnnS*3`(%7O zu{=F|jS!wx5lU-}3M@d>*UdG8D7#EF+0!5Vw=Uynyt;4c{9@D9t z4bX+L4U0LZ^*duj&9uv=q>!YM6`?c*@dxvwz=2HZyDC;u20>vr_6HX^4G}8E-p( z`_&QP^N^&nc%@l9Uk{@5CtNhZme)95^Y#NPMwVy#OHtuC3}x!HX}mj;pSG>vQksw;qS z7igAwB45L6WDw9EORRkBIdqaXl}XbWj^1jW+1%?tzr(`@Big>g(S_DxE+32fVyo&K zQ~5&L>v43{C`Q6jKl}J}Dji)}`t$UqlH>?yvXQ9Y=X%27XegZydA%!3`m|_kIv5JJ z#F(q0c%r?ddm^8WxB+y_T68%rp{aIqKcY?zV?e&;arF0i%cV}k+JDvu= zV%-oc>zA!Z%~5@&6=>4V2jO}6b{<@J8l$8e^JP)_tTzoFyI5!0?Ry%Ik^DMG!T#Ot+nIP0myaF<1OWOFa83p#RZqJ1eh>dc^Q z_Fj5QAeRfAa;X_ZR8}_!vpN5(UKPk@gEv!ORDVK#=YOobWhTr&rF%uOC8_5pGfqb5 z=6@y5q?9FNxv;SCbA2u6P@=Owr0?@veY(&r>(S!9&EmOQ*Ke1JF1+DA?-9W%jMm{p zA8IlW6J|6KANr6er7Q>e^rs~isl#8~)npZ)`Hbi*q=a2xTr>_njK5KbG}^Iv_sAM4 zvy2$px=K{TA^5>vcHr-l(T9j;ON$)EN+=xPYK-+_9oR%V7>LaO=8v}6`6+qS8F{pt*JLU&|5e){olM2`7W~xb zsK~;@dcS^!YL+6d(Xv^YTktnpyN-DmjYZR*NHUQs(yZAm#S zTwd+-`WZEZ+Ewt8U9tno&EuII)wV{&3MVmUvjG~$=NqV>Vu zsmgAyMei-K4VMG$svOLs3@0#G?ds}EvQ1!5*EnlTHny0ug3y*q%ACtq-&u-9T z2PI{C$q9V!)GYC_nBV8s|C%fN+B^FD2hWWy(MVe7UNksx58K>&siUKOtk>)9@aEe} zZIknRbwuE*i3w3}j@K{R&*!2wYqUOM)%KGEfk48qTb=ffTs9o*%&>Ku|HB84iFrMG zna3MncGg*EZCu;c6^Xps=^xbh=)u9`&dP;y(QJ~>S!X>vKe1}%rTwELy*N3&}>B&*0e2nNhAvl|_WdcB_ZVOC1GYv$-xt5#(=kM$gJ1cazFt6c4P zHsx8soct!zxTlV7K6TY9$62-N)YEWd+S3~$ywKU1zkOg}V57%%oW4HJXFVGSI8|{r zcsv^%kGZpKWSD8r>UTm#>|8Ni@S8;e1BJ%)^lPK3v;ynm*@oQ$<6R#ev)>XQ^jTda z`j}&mI;u9()7_(YIz8P3{rPYp7>=Y%OOnZ!Vj-b7k93uF`|8!J^`>DaNN!+oXDB}X)x z&O~EAUwHmWJ+*mkY)mJXv}QAra5$35789{(WW`r~B+5o(v6uw=eltIzrwqJ5-x}i- zrL8TSi?UWmju!>B&**8SeGzpQa^dyd-gua?Z|L}>A%3G7>h+f^^6fn|>@aaT;Nfdk zf+8ToYKCFo!y{Q?0QOt8L?LWg7`4A4uuEi4%C@OY?gpKS+N?^HB)7zuG)g^7Wl7gp z0ZE`q_Mq5+Uyc!ldD zCwc<^ee6*^+S|8uiT!Q&3JXVD>GgSCSMrO{==!|3iSlfIs;RcpMvyyrcQN%kTekGZi%KU3gS~gL?&8wFcXY)6@rL<-;-o zay7e@B$FOOGhg|Ec!sJ&MyP6XHbfuu^`ZtK*3W~;B|^eke|1=vF23@JJR)aW=3I*) zp}`@_r?;|29&6MiJ%7T6#M& z-a$7cdlnz9fJB!&Zfr#)7KsFs{!qv%`Te0_E|5+8Gnw|~ZWfWiaavkBds6AJj>nTB zhFhk-_4`VlCHJSXa4;Tk?apT1NW>XHJEQ$R zUnb0^HQUqH=GCsFSGq_?p`iEE>AWY5=<30=UU;`Nq2GScPOgj<#gM9_4@tOax z&0pSZKW#W|9BausUtIVnZf!q+giawJHb04Ha5&hCg6Lk<&MN*WF7N&V`TIor~F&IlgH2y>) zlS_8A_jMKuDEeZBLT7(#2Xb{eUMwdwkrc}6Sf&u;I3$yg>ufy5HGC#dFrE%aUX#qN z%UAOWs5-8(9uLK;RSrXR@IZHWx9%y9w&zdyRbO9UCW8Jmm4W|6bh5Ke#}lnXL%KCV zrb7F0IP8fPqRC(&iuqJHoq~v4PAJ6A2t(AtFlK1+@COs$*dnzgvf0GC;E~2aEG2yG z%83UIUE4E6rrOQ=ZUo8)^uOpII3XwFl%Z=_Wbc?|lGWNMXf*yxwN{2XSw9LB>qC+e zAHt*Yk>2`9-D`Yhk#iUvBpC@~9R2XEh99=Wn(Q~>nOtp%vvuQ#DVw7o#$0?u74jH= z+CM}dp@kf3KYS=EMQXyw*b&B(YWySC^w9c+=@}n#l=x7J7~c?eT0hG%IiN1WhjT-W zJexcG;}QzJ5z4Y{{9tAj25SAHP%=JxDL#a0;~Pa>ZukY0Ce%oA7?=44RYK%+)u5=i z3h8lxF$&qq=0wP_`5mFN;7qiM!pNBj;*~v56*{#A+dWQiy(+?mq>@BAqHR%NtCBOK z8cPW|te9lxf@!?zsMIGYqBFFj%#4zSrcsqCj}i_Rum6-q$(@2dd-6K&uwrAoq(kf( zJw?ayAr5%3tz_fr$srfOlaT;|h$3#%bz_dl$o|R^He|v&^}zm z7l(CM7uXj#ah*pLE`kfB8S*SYWjv@M}`B?%9(I7W~^I3z(QyMT1y~FG)rW3sd8FX+6ax8N&yt7_OC^^#$awXBGm2pTu7E#a zMxFId^w(cE`#m|MELZJZ@>QAbb`!xuCXBFg$|AFv6RHtdk&)GS+1G}8dmHvtLzOO{ zH(wYS9LZ<1a=@O;=5w*w=}x%6v-`Kz`$qfvQprf9S{<$}8_Z>WXVQjrI-kp=P|O6d zW!C3}!z1l!HlT;jd16@jn3GdEBW)~|V{GZrmBDyru$V+m$BDV?vw_=WeuYhaZ~ojw>lcpyyl zY1WPmwrONjedlw}Jtvb_dw!Kor2?_!>a|BsKK)d>j9_{)_Om9E`*RNOR-0lI}61lqnf2QopoAUm-zh* zeukS0=W7QgOcb$DGU#|L6C{J1OpaH&<$MA;enCH|C&g+(cXf5qQ~Q;n~#7$nnXlJpQhLoXRv$OAn&CxYj>qA>ndwo zV-2g;#Zq(_tp_U(qE0#E%Xwvy7eBU-BIdAgnlv()eyBl;@G&Nm&o24e!!-afJ9#a* z)9=FQ6%=ZHnbzwKHsAFw!U$+OA6~zHy>kf})@zNU^*{aWXFt>W;GYbi{+9eaWg@ix z=}+Z}1ReSx#V0>Pf1*SwL4VuO_p}+Dqlkb^ur1d=+k}=-tGMv zC1QTP<`v{4G**!xbG6h*fBoxU??C-A__nvb?YYNZxcu_Vcf6tW*vfMrfBf+me)7HV zeed6OmBKW-=Wpm)ZXLds(d(5v00;}FOTr;6Sv7sO%XJ|vVj52%;Sll3M3nGmh$+bs zCnB?ysvqr2Cd1*5&Vfxw9@!Rk+$c1k&vlj^CtL1x91aCo`a;0~`>{kU&axa%CSx4e zr4x~`54uFiOdw*mAf85|alhjc+bLLV*zY;Ny|c3i(DkO$sZ^%eRY0^(Cg8}imX=^3?hmCB3GL11S^{ztz;U?D z6AXBucXl?=ywUx|IT2oo72G!PX4#iWT*i36`m*Obb5xL)WL{=-4dsjoU)7X7Nszs< zJ!eNFEW6>C6`*VAGglR2XshxcJLLWG{4=^^{+X`4Sfl5=bVt*-t|e8Rf2Jr`EQ-1V z_nJeQKJ(gWEC+Y_7%m%#=y{U$<%P`OvM4i!BpQj?lSb(O{m|Z0-dl4v?>)MdcLCkN zyHD^CVGdBKXM!e05Opb}8Z2MS>GNR^%Js(Oa++9o{ zxn+Pj+9(mdy|oY>zqoHcXiQBJaU0NcJ}GF4u7*+PVBVuQ%)UzK&lP9_#MV z`VPlER(s@ozzUXsp)~1J=mo_uDPKCR~uGm$UCDN_MD>8F|!s- z%h&LOs@p4yMs~AxG{(ZR`Q~zU1bs%`%x+G*g*OOyV6!4;hU6C8k(@sTb220Wi>Na0 z5Cda^mPZ{mJ}$fZQfYkrsKx%jT9VBL-w^W#kLP$;mQ;Tt?)ZXEJmF_dko`7yEMLB2 zsDEkcTV*C#&>NfaIjh&4g%$Cim1WDFKfhyeaICAdCG5ySx6k809yx`D*&B;t63WVq zqS6g`QvHQuD&5^P{||ro!yo(}A8EA{E)@!AuUQKd@PoSxSr2lY3)fip&f#rH?^hp& z`kA(%h>pwtU5q|!W>?sqvv>phf=y8y)Fq1*lPVB9 zF(yre(NwKTL_-zMWD#-7HNILsmxTb#Ss;UMj@eQx-FqF*AwlqQ0dtqw2EkAxo{j z%;Gft72*}bB&1p%^TW(5a?4UAINNq>pC>Y(FH$bzI zTXL;JSFN#RD3ok--L{XR&z9BM>t7a>JEceql~%|y9BykbceS^L!@*E%v2v;|7OK@E zo5w=2S}hdyFbb)Jqw~y&ahg!k)+ok8pTEeIlu0ZeTM6H(41UgqR;DcbOp~^c!~dJFsXN- zKVHu*gx6weaF;?ECvus{;pU`OG&|!)-nMsRp&Axxp%`mvAkuki$jCUdSrT$YLn#Vn zZl<9Tm7p?qF&ucI#FDa7DDdRKP7;>Is*hb(vktM2(k8B%<4_(c%geMMM<{4kWba7H zK22!q8E|l02qxa@FWkn(TkX-em5Z&R)?lKA)AHNAI{YfI)aTXNkvEQxj&_dd0qypA zowGcIo&62;oL-}1A>$UBdL)CSJSq2SPGj?otXT$XQK=Xi{IFM+eXcjx(9A3)}K} z_J@6lr6UXo-dBD1s(U=%`A@Smq(QII^N*9*Msb=h&1U3Dug2OagGXKC5CXo2r3#`T1?QA~%IB}3k0)_S^g{lq( zWAjrn4C^^InZVWa2UxR%!FUWk5@y7qe>9J=IOIzjOhis^t$xQATkL?9Nb^ zY}^<`wHyl+b>Zl^Scb*FCFM!3Z}kUb+;^4&U%`=GG5qsAdJ~-UO}tI;ed;sF=7zmN z$D+{nRSmlmIyCzicpKOp8iQ(u9~!(GSK=iPv?svqs7eVYzoawq-m**;*`ms3wNmvj zeoj{^EY+6zjhctVZ#)KetS&c?DcZ=gIR|hmj*kErAWA?3!SCbtAnCL zLm_#AKVGU2_4W7zgB=3_EMoe*ash9!v|?Fr+3W2rj}P<~!me+AC%j2J+cgr)o0l8^ z2a#fLJ&s#{P~SR~qI#dVr6o5I<}f!|Ec7^kVwS+s&^7pAGcB3kbTsOE@@PpxI{Pr6 z$4RIAgP~$!a4q+19Nn634~GT={?=mu=#qg@sF-Nu)CGaeA+jA;2ORDT^W+4$PRIFL zIP47$wj>h)4(BmcVOK5Z{r{xpz5a6F>n!-txad0-$ghN}houSuCz!&?%W(yCl;Rq5_vaBD`Nm(9L5yXDwGU~Bfg zT<*N=)-Ca^!qK)VCJzw|Rw|VndxnO3Zfv?No#k?YPq|!#(Pa*cB+)JT z{GkMPOn<`~b31QjJx*?i^_Uy1as(#h(wIZcDCUs}z;?#T?m&Ek3iwt}uWT}8uJI*= z7?Fc(IlIFs6DDJyt=F8%_O`LXa(STSXIIbZF1C1;-g-x;&gc93#(H>YEtRUneSNfj z{*zqk&36`yBy)za6|W{+I`$4>+*Tf2J`{`hE=^}L*KMpW(Vd;gjdA4cYi(_HPUTp! zT0Ls>x^>km{C=ofK%VIBS-W=2JC`LP?T(J2p|NAJQOm5wV0-z$JDavmtaFdg6xMFc zz`J3wcF|_!g&JfZ1;K+5kr*waWOpR?L^T(cl9=H@6-0{d zXSIhVQKkr*rn)iYk&JcGJsC4plKb`2i0=ls-{p?O#tobX;=REadEfQiybN4_eb9S@ z4!!0zuQ~SPrT$$kKAchbmbc9JA>Dr*HGlAqr4Vd*{xKc;M8xNJ<8jyTi+lna9}VmI zhpN@;JFco0L{(KhpWOQ|IdAFKty@9AlUx73%PzZ2r-B%JoU)BG)&tO?pMJlZ_p$zq zF6bllxk$@+-dl<**}rPSi4AxS!`Wu)}9kaOkE<#a3+Oq4DA^uWORh1HI956Es$EooQIXP zcdSgRA*0>meH~J>#G1A-hggfnkgAc|Y>{nSWnPi0(#tqyq)sDs%X-3IxlXMTf+?H3 zbRWs-XYTkD&pU7ZglQ7hUtn~GILjp*^ARc9b&F?sSFbtkv}1U6Lx{!lB1dPt zx_Wy{<*ei7fDj}3d~dbCzuJo&NE=NV^YcQs2QjjP?GncX<{Eoa4+rdoz^V?sBdonZ3;ts`jL1ye?<}d1JB*uYpdp ztbsi9r3jl(SVyhPqE%8_SrA{f_G@i5d-{Y#GM`T->~Fs8yV6ak%H^d?moH!1-&Ibf z-79_N%CcpZ`2#wW#=%{Ca5)?NFs=aQY}f|E7YaGkalc||8=k-H0P|&Wy_YbUWopv zRO(y0Y*}XqE8+Ju=;&!gT0{S)56kS;n~=BpW-V{1oVzg`$>)$PP5q7bcw6FJz3J?T zL^{|D=i;eQODaiAg1LNDY%fu{HDsDJ_D{#k`_k)dIpyUsqFy)%UKB4CR4(>VQG_VK zJ(yBVZ)|ikhe^`ZwU2FM4V(n@PWdfO$ZJf$zg@^msll%fEo_31t zWzPl*-1KkWZTfSie-}e8v?MaC%pz+&E}fCD$VI$OtZ9L0ts||))q!ZNMts+)8Bv!<4yJU~E+0Vi-hH7liDb4CT4b2mp&6#U(i#uXEcM?Z68gk5T z9LG|_>(-Cb*#Os@2H{xnxdyY;?eD<6i3P=ISegfAe~z8#jvYI6v9*{Sk?pqAH6Kx((u_qL5?bOj|B7&)!)>tWUCn{JdaQ;cZbw@P9KGvHL1hz4jvfh7>#fg#C zXRpF8vnv_OWYLuc!pT&M7i~o3ux|}|KF;mDdQCXY?v@g~(G>`$9w<7(%Azs3h^M-H zx~r~>HHyE5w;Q!)bL>OS>l}_>JO8&x1P~7_C&Jk~5{KhHPnE8FN;2t|c)1$dhK^1Y zgJ)2h*JaH`U~s%4+9v`A8KEYxj*4@wPVJ z_T*-oUnZT>`3gb7}~-g2K#EpgDNDU6*Ea{@8#gp&zotIoLwf;>Gnbg{Al_7y-OP(ed2PM=%N&D?Ui!k zu3RqHmPm@Vc^Ffq_}Zb)l3vmHNC6`z)?C<5r+EvM3ad2d27jj?bT&F$oC};cJ0EdA z=G^Bzt1CBGRF!3`J5MNz<<4jR;(VqFUGB;#a zaHuZ7^0p>sV1`X3?OwKfQ{CU!G?`~U$lELX@=1J%8mkUm$a$w zV_0RsBCMOWsP6L*Bk_!zdSUytz&@KvJ|ev{qD{3djBBiHQuJcSk*!EuX&J3Rd=Z~; z4E9$;wNXlu5aCxtEWSe-dI8?yPqkjzuUTA=fK$Rp$vuRj3MGtT`5~$O?9jkBdOPYc z=C}TF_#NXyd-;-w^5~P)L6v-@hjMCWYm$;j!Jo87zT%2-maPjeBt6e{m{ZPR#)ilq zus&q`qb~ zJ=9loyOT-nut{yrx3y#DsJ#wXVZ8jiv0wlL2%p~{#s<=t$Yl`)y>M!FBXCT38LP1H z0*~MIiTr?^7=X1AgXvlT^`O@i!W@Zv61-57V81!G&Sq+TOGOlsa{Nh{EI!oPnCAt< z8XKr+OAALjK9@U|Y(Y3Q!CFy=eHuAGvq$xM1HzbO z-)Hwoq{Js%D4ON7+e}y(?A1?ZUl75PD9ko|{#8f0?XehXJYiovkxIoAfwNo|K;>@2%5TZLT2zzu(j2n$%zniR7iuvLR1`o1B3$P3bL#JuZig3vF zithGoI_!GSA%k2ICuv6kR*d2g#}JT3ES%*{J! zuQ$+=a#8BbxN-c3@D@UKErZ0ci=mD7aY!W#OE@lrhu=pbz9?!nPXdc`j8EAWie+5D z=N%|&7o)*Ga2gNFyH>dQh81Zjl+Lhac9$0lyw}i2!Sn_iq#}xjP8e!DT0b%WgxvlJ zCc;5qlrd@Jzw0@HD`}<y47GqZEdQ#iPuIfj$- z9pTLK9j{lBzhQqc%}j0-Eid1U*wBrSNtk>wwi{y6Bh^?A0aF$pIgt>HC3EM`f3OKC z-6cJR+r^}=ZxbVGK{})1VGjbM@pLf&G73(M2v>N5K@6;x4UTOd9CLEn0azGU6vlHc zo?N~=S4u4PR?9=(s8z9Qj5tnNtS?YFX>X>brNl99Cf&cfvyF*xnH(V`;sHvhSVWtg zTp|A$J+G=q}B%CYv*P;_W8@0) zfZr*1_AlpUfvJu>|DZ$O6Zbg(!SG&eaV~+fthopyD+9-H$j}JW7n-rU2)_xFftB%Z zp6Saov|?7qaiJ-5{N(eCHIC$~nB^ubRy*}xsD#wHn%)9FoPieJZC4pNOTV!$Dz*9> z^_y0-Mf*b8fm2WA4RgBMf9kQ-Jg5w1eW~K|Zf;|9NHADxW2Phe$7A72$11%oz^#r% zGM#QodeeEozZ8u+Ptf(ulD2BKXH0Kgd-26@Xp7gE$a8l4#*HoTt5|H1btw{!ne&zAe)|%2?SH%DZemfE=Yv>e zri!F+5Q}Ce{Y5NdebIXmhgtNo#&$B++xFcZsG{6ldCf81C@xDqM<3IZ z3bguT?WUwP~QM7)?P77G=Rug#=x>&J4b81AsE7TfP>g5=9Y)yczDqpTV6q{;Wc)ra_lBYak4uQ3n-4?{MIhD zHu8$t(R~+Qc;Qv&9(U^U%PxQIQ70_#{lXW%(6+1i%Dp@JiYu=8)N5b+u8*F1<{zKt z!<=d59m~)0j^(`SV*A3jRruJSwL;WDF2O1N?qiNQ=B}@P@UnLu^SLkIa>0(mk|j(2 zv~+?0+py=BTONG&-S3`%pFV#6KDHF-ogCHfT+RQx`ndW6|4r?mDc{QeLPOTp4O?cJ zKX&|~0CP%Zcs%rA7$<2tLl6!wbjREkN@>nd@#lD(05eg1P5(GPvogS@hsQ?AZBEVn zw%#-)Q4{CZP0KvOD+q)++R>Qx*$mYRQ9{l{=B#C}XnAY;hr#L+xruWem%BRBuvIQO zw+(NU^Ok&?`v&Ye*{!kpV%cWvjYgJDF?`G)Dg=Tt-iVswr8Fyx9UX~fh#NiScs$^G zY8gy%W0_d8hT27#E~^4>DM(~mTe)`PpD1;YoHFe0{m6z zK}K6fNA@K$k|Pz%&1FFqg_@)>RyS2y$C339Ph~i?-E3RFFJ(AEc?p2LE}&E_VxPp@ zn~Q}`=U;jAbAp!-CJMz)XR)7%Mai0Zu_LF1VM>a}iztfQbRixSe;Z0;CvW|)7*4)n zDaFo>L%Pl(?1>KbK56>a`2P&1S6%4QWY;6~J&yE(gu{LaeYy|B7VcC+lz$dsHKR7d zQn{XND*X<-l>MuYl)UCT)ltO>g)`MFs%dc+J=*YQx>sf_cVnX1(ZRoDa8PC^(wPLd z=>M&+nI2>qn?>_Z)Drq>;gTCT>BR8P-f*$nW~+U+8fbF~R8-jVICjt@Swv@DIT*58 z_iWz$laDlR+HT%_tb7_z6XJg4C!06V|70`2L~4or@aD!{+@^lB1B)-!gL2VuD&ZhT z+Xp>0c@9FL5UMqCsn&XU{jFcWC#IKj!?u5^Mi%!4`;Qr^a){%1++uEN|JYdn(%iWk zZPB^6wO7_HDS!RCr4N12Xin z>U#Ys>oq8ljkvHoF$|MImx;0XD~e1JdZgipe}$0DVoh%B%!IeH$49>*Ju`gRW)N+) z(d0CWmCDe1WD$g!uc9_!zs@gH5TE(MOFlrRN~Sl>Jx<~Am8ZZPeX!kO-D zy`^}W+zoNO5ew_iG?lSZvH6~=oLY>cq%ta-4*3d#=(Dxe6a_NcIuUP7ob-)& za@!Z4i7EzEN$)Z~+e;KW@-7Q1Hma%GhmSx0;{#X;CB#xI5=T6N%W@MglW*^kf0Mx@ z|1u%i-jUC+`Qs8iT0Q=g1twkS1f9X-W%uaKq(#EULeq745hL4R_UZ8T1h10zWYVY$ zd~9&B&J-CQVN&+lA_~b;gEANs1(uvBZ!bfk%PyLmcMc|)Yy$cC{pb>iN7>8K3IFEd z|Dx@^<0Lz)JMVh#t-7~zuDX?DS5@b(?&|95o}SRtlO!~wFhN2ZjiixBAci1;L^8o6 zqQMe~ur?U6$cSWeUV#ZBcBFQDCgfQnP=9zS}m0&PNBdOl-R1XWPP!b4-)+87~E#xRh31WmDpMB&l0BI+A5njf0- zAT;Ggo*$6<=YPY6ml&8U+U`1%S<&H*jh$ovN0V%bhuMx^dD(Y z+#g!|mWhjvaD-oysnTWQF@<|QaVCnQF7VmLNJNyIh$juht{4QyG+^sn=C1yX^lYIC z<9R#!?k`gmsSWEKJ(Q+5P?b){+)@%cG{-!^@3_PzGC zukDa$2740ofZ8Ksy<;lrdw9JO%9Z#NX}O1-$&eNThWN|eP^?!-U2z8YhjR-mq!c_ zkjX6!%`(D1C^t9cZOFUE!-#d!kHwSM*Q6LyNZBDf9)g{Fc5=iECuCfw;*${N3&?9(y=JegYd3E zpjrzDAj78F&Wj09Ur9>BaM-LjGbiRrt_<%nvR-e86(DX_y&8}7LS=G5#ZoDuRhUpY z6MC+%o{Aynmt%*k^$;WmoRK$65TbY^+3%Yhev=2J-!Yehj)ST~r-Y!2`4qDlboXzB z0P-v5umrwLe;kXnh4GtC;z*hdTshVvNT4?qw4thF5-9J8i98-55Llp2*plU@x-aNz zFLk*hs4PH&L69-oKH@eB}CO-a45 zPa4^Z6S6JQL2`N4eIn?i<7{CX_IpnJUu-NR?MI6lI#~)jjtCoq*h7FoU=xoNse$C5 z&@wST$$=NN4192Rhd!H{T(6VURkBE}lcLEk)5_kAlbxJe@y?eJFbjo6jQa6%@4}M( zan)$9tkiKb+G?3`Nwb^Aw;YM{t0S@?e|%e&N;9)$a>u9o?wCUBCp*1ymwFYs$iPRr zh*Y$>6-~EJlnxxqahnn>mHoqO&<8dsB(n>P~uGW9$61pJVSsj0nti8Bzrjen2+BRcCj z;x{QWnli;wqb! z5Vfei?NvM+Ph?%o2>>ke`@~zUa zTJ``T2TXVk|1<+1W+)phMzV z?i?6@-&t?V!@nYtlm|&9zcs$+x7;ns#IEt{y^nX{_oRNxnA-oChnDgb`V~*RM-30L zVac~dlemtT+=jkR-B&B;`}p1*NDqym)LY8srNy7Jh1u^5ZGfTp&e7)p|*OEa^0>*OSFH0U@By}9|!TZQH9pITjO*N`?y=oAUnK}&`gQ%T`rNYaT$bJvbY zWMO`qY^GC_9lw8hxjBLMCA)pe)M8iyUP-AMm*DhTdu??}=CsBt z*GxjRQnFznzV!(-N5nN<5~ee8^?Dp5uO})z$*fzMap^LK!?Mo?LqC=gmpZ$^eyFFxnbhEgi{k zlLR7AViDm-l$f(cqGs)}lvs3D0ac*?((iJ*^!BQ{a`;hoB?fW0Vmvqe=y>UW`iQ(E z*FYppO38?~7`7{Q@_nR&p$V+Pje0tR5EV@~7kAh4^!^i$HoRnV}kdYAhG z#sZ)~jfo4PCErM{(xBz%#B9cViP)rHVrFE`Zw2S=gdisqHt({1jP}SKJkE9g^OLKN zfFoul7Z&xHA?*A|-qTGaO+cN*!4Y7$A&>ufAm!ivzr48QS|>nHUq@fBb|Gu((f_BG z*xsjLamk!4Ca?>6gs=~}>Rr2oRcRnvX;x;Oo|EqIl))(?qF8_h<04k3?&1Y|7~+wg zn%=oa_}fAw8&6n_u~;mUz*RvQVzV)Yu2d^0os=IZKs0sX&VKLQ^o+<)r4kbw&_yzl z2QxsNVj>xy7^>6{2EY?MowxI4Fl|G;%z4;I8xivHii{czNS4n7na_=~XFR{>JkI;IZ_+ z0lj}R6rp}GdM|;tTCT%30KXg~-I;4v)2H`|48xkEjnX5@4{{+Yxt&q>4-p!-3WuB< zjmW>*+}zyPh@-@Y;t9$29ttK@fsM%P`8=kueW3K?@%&<(M4tDP2XJ^!sxP6L%lGiy z!w>&h&Xn^LT;<2N;xfh(7SEo2xGdS@OXb<;B0Zj`A$NLS;(665+sOMppWuyM_J5)5 zw{BV}m&o%U6RP0++IYO_3oXLA+0Ug3w82Cy6Y{#`BFYYQdJDvfwAN-ubW@s(Fwf3% zZwclDD5C*MBI#*UNNo=jJFIB1LW5m+L8F4x9mdiHGT?q%1j<7n3%mMsLw14@Fip^A+ zpoc`wN9d3dB}yZTsa_!8oh%rml2wm;xZ&@b0W!hcINj&-QINR_jF$q+B^;gfUu1)v z4@XcRy-8#s)K4FKGuk9zBl;+Ra(ZU<;M|-%7;*v>?DsOnytPuM+w+V)Lk*~ zvX4J34*H?6Y_i6m@DtHreu#p0ujYS1&oFh5NsO4gWtIusmv3SGqks$ipKcG1iH!O^ zJmUK{PhWQ^9Jy?DqEG-t6^np4P?^Fkw%*R_V3T0h%IrdAq8h1J%h{@$w5>zBF0NQS zXQi|%298pxLpXkQt(@zYrIzY!h0dti$yUZ2seydwdB3cELsUB%X_6wY$~ba8V*hsv zB2T`^H8iBzh5H))l@pJrAgA~2F&^4pBJcWr`z>e|6KV_*^kiz&mKnS|Yd`GuK;j(2yNJr_gGfEL>e zwj_==)h`+Q_n!qEUr-Tm$f1IQ&&rZ?5#Sw?yw95~TDc$!{Xqh*!&Wj`FryJf-N;tg@g?WUY?JvW zAK8Q0`a@N(udW_wH}T4VwFICUkEPd|O?)Ubn^#UxMIt$7Hw`9cN?)bipD)9kv)OtI zTd3EEWviBo5b`1okD3b*K^cc;@W1HG9#~x^Oz9!_D-=nRSuC6Nh7kv5XEyf`%WKTe z>?#*aVIW%}aE>OGZ{jo6nxRU?xtzM`db%jUO7g8Bu&Q3z!e-| zy$?y$?N~^-6yvKeVEO51a(p4ON-}FIzBe+cAf?iLzg)(6!XTjCl#QY>J$1z<9wXIk zuB9lA!AR7o*YA!mxLxK@Bq5=!K(2vPE76QaExV8@$KxcTRF&$|9JRp7&pboGHRud~ z$TD!~m5QZZGc$(jOzz$*-%LA9FQHhBOyyf5tI(b8GW4dz{a>7aW3v$%I;-(n(j<&1 z-H@)tb>5%t#(kZqqpr~kG3LU27C{Dk-&CO(Di@N1qDU6X0MyoQAS|^otA#`ASIWf8X2A+Rvcb3>97iveY z%oo|F-%g+aB0RbRqzIEDyYY(ZWu{tOIzFybbotUUWpqnpY{zOoZ$9%=pIIFYh?V%W zX!1B^IL0-PjP4SNGhiai%Z-LI$|Yx?Jr1eR{X$=SS^W-qmmFQy0-2CdI!36lD;{h# znq4_^yR0}4xN~0!S@Fy%e&!vNMgp>=QDQMiy_Rh_AR0|vzo)KKR4HogN80hInJL*{ zje`}c$~nUizOk4m?}+16-ptMv2`CMQ)w_^)sZI2#`b*j}iEZOnJboUGfI`h^LlI~h zE7?p-_zNFgP`H|8hQWh?o9F`s?kAjxXVrop027YxMfyjHDKB9sW8zC>oCT^rR zva0PwpAGoaDLf&8R2n~Y+eoFG6Vp>|W~R3-b?C5mOxYm9C4<83+!VP3@_>@O{z(ux z$rQ=pEi3CdS&NJ;%~Z-E1ahJ~(GdOP7}f0qm>Bf`=M#)AdFyc{h-#Wj^p@sY17;d@x`5|*N^Qyy>m|8 zxvMo1?)rWlN4oz$^``i{NzKmh{I;G8BFCRo_hZ9bK$A+DDbeavi*->zBxq0q4HvnQ z#JmZ3Pp(D#wZ&FUAduDQ~;-W&c$9}3Ey>h9s4%ggHS zbBq6}SUlX0#dg0D?2G1skElnuZ;cgf-V#(Nwrz0=%MI$=|I{NJ8ynyLQu?U>&R3;| zpNOj?q2b39>eslzz3TSiy;oj&7)IlTpD`j#sBau;a|_5J{ojiEz zCC9;oz%KFeyD4b&!vnj|+7DnlD*A(aBi;k348G{zkUjTj_uhN&Nnd1d*g9n->Zk1B zX2kpV=1h4pY=nRDaM*|(dDp-H`@g@Jwcj+$>+j-QkF)bS@B;X$C*qs(bcB(PpAP!S zGs8jIPf=|G=ghSn&Hc&0RsDkv@ANU_SN29P$wr zxMqd20t53zp#FRoUf?^MOj7_%1wJ)?7c|=YJ#kuA{7~A%;?7E$nT|<|(%&RGVL@-v zbCnIs|B5I0QHM{QIC1wIds^(X}`c?l|*MI%je?9+J-={zQ>G-E468!nKn}3&| z&hT%gvfiY6>f~#trlvYmFFkkeT=iUlCu$v6VSF|B=iWCt`GWiJ=b3!S=&oFu^t8Ya zp48b1+|ed8Lxz*g9OBJJym%m+WdboK1M(MqjQ5eSOV>I_n{o+buascxh~4!jb{Ndu)uJyVH@nomesg)|zY zt&Oy7l^KqYy|?|oa{n(7618<>d4R8wfj`fkNnu|a$Sp<>Fp<`4a(NyhO_KFi`a4f} zKY5Jv57$UPR&Jg35OJy)4$=cZZ}v2QzMFbKze(LYyq{?H`^N@#b<=q1(UPPVN+wDq zK9uj`J08CQVI5=pFs$%!A*wC@C-tISp7!KJAC*}Z{nSm#)$23eI_F;vgSqFQPhA}Yr}*~4&lxaMa`py zb88a>O(4Wwt%UN0iS=4799{^h(0nRssMw)^ItIQaaGX3EsIUSwsfCfV5w~jf;=RHB zAzuP-U0en3P=TWX^~wUcM$u;X`Xw>rc3V0E#l^KDcT@o@5Ek>8C)T#+EdR;i^|&V% z%70<%{>1^wEi1rR%95xxFl#Ma)^aEW+7aUyczsN;7pCpx8mp9x*I6^R83Jq{RK81; zZ`r4g#hG_ZRqrI7VC$Td2C~s3>c#Zyyzu`P`Hr*=R?F)hnLHYGM(fI8lY!U;8Khqi&|W*~i~9{2X5&{nb*V z(fG#4)r&v*$xl9vxXrwz#=(YqrMAbdNo&ynLgee?1>?}10ZKo0PSJd%&)Ue5=pg!eZpsqRp}uD(Ru zq=8DiHdu*~!6X4M(ZNz(Fvld7XtpuKi%C(}avdWrUAdWTT$&fTYw}VsFpXT7CB4p= z=37)T;Yo}d{b2;j2cFf_bu32fY$JiV8|VeAl;}ul!!{?%Fe8&7&&pk7qm0Ki!PS^7 z1)(Iy2MGmVac>}x!mUvd-Os=^hRVgbkPKBIb^;E>sTZs)H5% za(an1eW2Jo^=Gt(OG%&Q!Xm{0VoS0Qwz*Hkf2m(&bw-vwSv>y?OLBKEH`W%QU=lwr z*B)U^wGoe#`0!MMR|OYgIZ_8f%hh5%!W<|6SO-a_j6Zj=$e;n^e$1BOB#8<2#^ddo zL_&KNvVik~q}B(qXECz?33IZ%Dr83#<+ahu373xGQHd#XUxJM@IFCT;H06FQ zZ;Xg}vi4G+gA94VFl{*k#4;W#F--c3aRQN0xme6ss)W%2bWCQm*{~0!Aogjl2qOpH z3H2eMn@5kSN6|#R!DJ#Da3RpxZ!t?J;sF5FT)?YP7-$N_CTV(ULcWK8OIrzioIvH4 zlS&b{lSlwh%$EsMB?=~8C}zWUy_U!q%Ef}umV7443|st2PmuOfF6SqT5GNCziJcgk zsSpQrh|HE$yW(-GgYg~)@Oc1pBnrVZ2Tb1(6e-#ym$4%7yxAtACPhz&%<4nfLrbk>~X z)GBs>8Vxxt?qEBqQN)5Tm_xGh%gd5-H(&?iu~afiMYst5FvE!X({U#pSJdB2QvT1M zasUA&QnnR~INH`r+3X8_RP${AKXzcnK`3STrE0|)mvKXeAnkV#lwR^AXu%= z{bF#>o}&T(j&8TmH;yJ|X7*<3mF2b7?oTlAW_qm_aeui9K=c<8=$^BB7^st#&JtH@ z=d4^V+lB3rOQu=38jUW=dejoy$rqUmUSAeV)#T*dj^pob62QAYGegz^y9JDCY6oJ0 zIop~b(s{ewQ=9bgS5KB$wH1b zg&zwSx*415H@y`5y#_C8N0P~??AEFzpi$YcEHxX9_*g1TfJSzTveH4syMTYD#C)zd zCTH*)DS{L!=@bm5CXGm>==ax46r-#+X5O4}q>8W?N?EIRJLPSwwS`XkWGY!Af1MEr zZLN%a7&;{+5nse?DjAFAg@#6K=BN_^pUg~2B-*o?%($ICkG}eOM&dP$z`E8tz;o$V z(B^R79exTR3c*zxYpE}GI~(OyfIybU*NT}!*qnS2Ao;Jk4_GiA5{{pK_zx;E{0Fk9 z<7bg1aQ;1|5`&LEJ(ed@MRnslNasWd^3%m^bW*|hQEc$_wzuW zqQlE$5O4edm)7c79HA(}D}KD8o_NJ1)-BBz5L$YyLPi0L;o>4OlpW0pbl1D@Oj9=&tm1=vdhHe+lMv)p)~IY(Vt_9cISjmmGSxMu?HKoznqy4L_tc-yvm6 z37s9@&cU4gy79@cbH}`^dzGZZ@yMAf6lFZ5rTg^o?KpHF;+=4F=s;G->a#?w#!oIr z4(@n1KUjBjq*A~cmW+_dFXI4ix#-0H%eV3ah9Jp^6xbJ|FAU!b%KXIC{%!Ro^&8k{ zj*p*Jv?6&Lo(CO?XXPU;tEXU_K4>$r9D@4f7;#u+^ni3TDatm%r9mkWoaMVp0T!q) z_V1aQ%aWH-NcZP9%=LOb?2WmugD}ea7itnx` z!IR77Jn^lh0mkd)-A5MQCqwHQUSuA5FFu66I^3i#X_4Pv-t4GiFma#v;VTCL?RaJ`i*=f+zT5{uQxMmzG*s_x9oa- zW;&nK-(>lVCjf}VtJR5=RfR6-zpK(y%h4LVgyifK3AzAqXlu&BN$~tl-Lq^ z67WI~Tz>osd}#&f;CSY^tTuxdLHiA8Klr8F{0vHW^nhqT{=h9q9fw_07Gp$sw*Tp0V6X{jmqYi7DA?dXY&#C!bTb`CPgqXR#FXuEm z0)UgTpw4Bg{AALq+Fe)=hZiTOikWhSM0(`?&SnBJ+r(Sc^shI-bBk~YI5||^iBN^4 z6^~Ua^S%Z~2a^O%xm>3+_v)oMu^@1n-4jj0Xn|}g_mF|osTIsA#NkiiQctJXGwF1x zXp&csq_^bXn0MNg&qCA>`H7UErtDs-ZW>c9GnumO26}N4-^Yj11GCh^n$%vyI#nVy z4!4Pp>KZFR`}Nt}$IU`W^k|{Q0`H8~LaeC*AW4EVKBMk~Ri>`_DCK+IRoOK9J30KW zDh$7?cX8C6*>Wm<-F4|yIqRG_@vIXkeg|(x8UBu8W4nBj_Z;**fn8;!(vjJjXAqT| z_U}n9Xz2%fNxqquEYn{Xwx!&)Iagv>GnOOX3;|R~6RA|B6<|IU$=Vx-VQem$#-0ls zR31Lw%Oq6~lzt3vBHe%w)H}E-otmq`Xbk&uQ|+18z9zx!xO_2zH+c=tc$x@`*LdDB z_JeBWRGu8l>*jRSvqJluY~HWm2ZG6n)plOq4SL?pjPerjb}m)s{9X^J4jS!Pq+(CM zx#ejc@lwtwoJ*fAIBdB-dwM|X#{^RBXs+FvQn#~sH&qTa$Ev+4;++QKe0N$Q1*jQO2H?Q)Q&9F(*)uM6dD*CSzzN~ zMBj+I8`o*M+G;4Z_rGw3y9~4<(2;CW`9K_^6krx>pU*>mNph954TA~ zOv=nqXhlOb#DR^b_BVH*;*#4y3WOyg&tc3WD1fDKz2lthV@87@w+Eutq zzkhttpgG#D_5B}v`O9D4s!SeSY6i%mQVUE@uB}XVLNmc)vDGP+{OWjpc&JqLJ|uP9$8ykTfOOQ=Z1U2 z?RZ4;dJu=0+XR4d>nYWHJwHFaP96JYqtPrCBJp-Ek@(+YiP!w?ca_v{pC9wL#|U2)bvf?k zZn8bwahdM&w}RMH7Mmmuy8&|qk{gxI%p#$cYtykzo^PXWcDsiz!6XY74WTv@n^_Bo zQy{qFACfGIMJcU=UE~Y$uSlXnOl<%IyZ(e!R8LU*xm2x|eCjc9&k^*~AMh_W=NI}< zA<;pS+hgen#Jn&}v%oSpYsXibO~Yt5SK@7X7!@v<_?}D*F*i_~t%~jwXRfv5=s{J1 zW(N~%!10h9LMe=YShN_I=Y5uW&r$f$vjmOv1Ti}r%plz&w%e^%WNGC6cSn=R0gvsJ ztuC>&kcWZ9+VXdDne*MSA@I1zheinY>_-^qLcw_1FW{o3iD*)yS;~yKJ$t67%rfAk zY%@~jI91fQ<73B zoDO5TSL{%Sr1J3-+Mh6zZ!vmd#3)}f)?LL{CX3V>k=i0#OoGPaK;bsyL#Y9sN%t>q zaRS6Y^11E+C`)pTY_&=(QNuCf?;G!N8ssHXJ1(wueq6<$UIQE@C(O^oV&c!NGF1qs zs#5ei6IU-9d6TOPq2Pk-?_xv1QN}NA@Gt5d?Qt0t3P+0!rN_U9M11ui$WUT=S(n2~ z)5zP3hfEqn#@kkoMJxjUqH48;E|#FivXMh|zxq3%jd}){8q7lk0OgIV$47{J+xCC@ z;K761a#XD?9E`^g5!#8(;F2A2s<=^Qk@Sew%KQToJ9J>{xcgn(K$X|vT}HCpvMZmG z{6&oK?ngTb#E3-&FL^~BVZ>AO*%rj7%^vbf(#IO~s7n@OFU5S!JO!zY9o=;kV`D+h z#S$!j=BTQw*he4Ie=ipHIYuvQ3#gMrE^6--ORqdCi$Bm?-OVqe%A5XC>5u&D;a8nH^{S72@${~YEB;kY?laV=Ww>Z78y(Xe;ChtqcuaCDJ)A~ZRq4G3 z{77oq^f?hkh6r5X5IJkSk)hZBeds#0CInUQlLbY-g-%28FXY(&sXJZLlw6rx4#)p< zCR4>88_8CdBQcpPgw9Z^WWTVFeSD$dNifbkF9tC92tkGQ24RYUKM3}G`8rFfm}A_> z3VRy#ul?v}j5T`NCad0M^z7eye(3oZMI6p3UnF2f%~tVmA%V&Vw6E|`$y_2t+$HCT zse1Uz+sh~wL!2z5<^qHhX(hARH?>g8K+(Q7&d?XMDf9&RM!bX!dOgqOY?;DXH<>76 z!xYup{bt$WUN94cWj=bU=;@-@MM{FzXlK6kCKSSbY?)|FeK9k;A34|EV>4#ABEdTj z!bi!g_dAoA-`=fP$$h%B85aCNqu$DMwOYLar!l-3XhLC|n%E(q-;7Is<6JIEYDdy5TTz|EUYV^})b{xUiFl$_ zr?3Zxo3Dn=%Yhl<=l|U z;1dE}l53>1*bm9y5w+sH{m0m=)bQnVO-4PGC1ythcw&^doWZahW=j}!xk2`gsO1ey zyaPTuF3&B65CyAJ;Swx?1`~iRCzXCALLOMsB3Y=^+{v)*d_DlLAp0LSW@WS{78;c@ zUb-lam*kP=$+v3ees$NbUD4h<5WsMDi6@L7oL<;1D%dUFsb$McpjxkltGJqxbgbkF zmv3<&NSD*$3_FsO$wqBV<^Y-1sA%jKVRU66P*qXF799>|eKZ1ffHH@0K@n2jvs~3q zMzS0!<4#MT9ILveEYTj>Y-t(^ZKZ$g=<2E$L2dfO0dOt6gESJkY{-2W3fgRHT_?vU0_jVU&KxEB&G=B@`Nhuwv|f>Md~0C$VvJmh7z3h9n9IR zk6cakg?nTDUnFHGp71Ws&q}02FnDIRje(poA4^+|j!5LL+1Xh;lLg03oC5?nIy;v@ z$m6^m);2&M=}123AU)!4wi%e%Xff){ok1Fn#bUFWVyWPZ$Fq{65mE6tS0lq7;2A3# zBFZnQVzaYRF@uohF&mE&PMJ^Rv-H}rcuSp;v!c;#WM(c#)P8zAn|k@zMB46G+2?IX$lHmix4ADD!u1UOr5g?`Y*|?VK?{|zSmW?`oeoZ zxHQo+_Wn8v5wk>}L^4-^V>xyL%K>4i>ZxFF?_I6ccCBLwZ8mpZU)pWO6N%mGGwQPz z;p2Dwai+hFO=I}>d~W4H<`x`)IS9?M@84|n3!&gYHk%*aG1*~0wbyq|wA3{TT-zI# zUG1ali!Wg$(*=m3sA8eprWG`nzSh17MjIn!Ed92a(RBvH#s>uL;O2YId|>Zv&Srz z&8La7bUvQwyyDcjoS*xeSc8kFPUayZh3D0ii8Bpi5zIz>sV+eXgjv7LD3;XnU2}LW zy_c1#@bv*A(P9L8l?1^xe&LjaX>$&tRg9rBC;+i{#A4Cof zBr|}<0;IQ1r)n{#fgOv+K3sI;i;Ckoqp?*JbsMwhC~(bKT)LtI$v~>xSu9LV7Npc} zVNzYKB7>VZHb&Nxb7Dsz^q1InQnp|au((0YvaFW@`XpG8@ImmRz*o*2TIFsu?KYa6 zXFT34*)`m;quZpTN##~sfjbj6kDBKuv#Vqqz^I zMaPtuRFPnrh+;;P1CU_d!6$Rm-6eJmcObeu^$t=!>#3{9rx>^{>h8V8@-6iHDG{8eT)iXx`Csl20?aC|mBGy^BaAN(v%p*#ao9T<| z>BBd9i#{(lBU;LcdVN*$JF87ol>!0eL6wZdjLbPZl2nJiHQP^+QYM4!8O~XWtR8p# zL(bYj&YDHSLfV%QAJO(C%!h%bHCHipyHrggacB@ZMs3`D^Ue0j--yhT^X=3r`|A6m zGc4V#e&G|J_(bqr;5fA?PJJ@)OF_LLV?4@VpS&oS5zXA7mn2u&Q}B-5>-m`H%bss} ze&G3c#W4c}40|!%Z1g3nV0np~`9Mbflwz@aR8z43A1`v$;h^-9+3rP>6GTs1L z86N>{BFEXbYm7H&T7|buPSmHmJ34k-5S*ND3$_7*4gu0cPV^j+6i0X8x>*z0giJj- zOD3O-`H(HpOZ`}mP)IqoBi9w;H+r>><38ushURTdO3-rhhqqkR89egdyezu$)W3#Q z0KsO>fPY{;V1l*4VGByio1{bwNO8Iw%mqG;d=F z^K9y4wVL0*@o}Glb&m2N_Z!%pI0|9g-tmCXaICxKs&`wvl{IKikag7lDVhlnOLii) zQ`xWCD`=6uudxAISZ~-T0J(i{;7RR!+~s>P5Hk<{LcL7A4K#~uwQ`N1^qG8IH<>0L zW5*oi)4~YNHbw{3W1!BJa+P*Fm3Cq^biU+eIPTjs^>!vxEG({ONpur29f!DHRV*7u ztF`ha3?UZiD_r~b#Ke)yU;f;K2j^z@q@nIhSh)=G&Xe3HlP=FM?IdDL=8*UoKZjlC zt3>5AsLJhTvOXgC4+TqYGrVNXiRhkXZip7WEMhe?3cF$xg;^Gu=CY;Fe|#cRx@fdu zJN*nJ6S?2rl2QNs{qKK29R7YV=>C7?gCG3hksD`kJo3RW4EXtiUL`4#{A9;lRqej} z?(_Tav%>dQW5<QUyNm71JdTYBa9DezH==<{xilO0zq6Va4uDb|%ezn3x0QDDkL`Ho`v9^_j_~<>l4{ z%J)n#RDQBAl|&JUXE0!ftL2>E&gY5}%u1=4 zM7kjzk&Fx(xg0stPrL3K`(&H$ufEn?rQ&Q1Zq3=QFLSV_t8B#x(W}4K`u~-{WbA)yf+B!Kg;Z>Xap0P?&%eA$G zJC~Oypnek*3`__6p+WWnEbHVZs|B(0Itc6RNTrM<`e`iyA9q@<3K<~*DNMjanwhLu z<>%+Fy^XXPI?s+PgS+^GBlvY*>UkR+^lza6Z4?n&gQ*Qu;%^{9dg90y$OM`+bV^)s zj=NVY;9$TS90w(kBgjH5jfE7jG7x$qOBUJ?gI=ExTNQa~Ebotvh;mP~yRB~HJo&hr zmsMrHh1Ut z<*=&O`r`iXGd#90cW@&3Eqq9U@m>E*KHf_PHiYGE1d_dYo_Z9R#qzOb*(%$XfsyKM z>a|2Tmr7l1W%2n)Zun2OZHu?iPDF!?J9aDvVu{-$^Kpv6EC3r$nK`v4x_l%zIxQ9+ z{)qc?s%$7PaGh6g_v>z7{`p6DU*qZ6OQH$)w((eCVSUHq$9>7!bipCtZ#Y{>&nA8Q zOmm;!mSt1OakoJq41rp0)1}iRP5O3Zxi28WwaMo%NGS#YT`x0}d1{deh$4QF@F&ov zVW`Xo^cU?>kltn>H7&+P*PX8nE1fEUbO915;nHJ=;VVL`_6dk*fcr7S8Brq4TD<}L zxsG^~sMOM6mWU3HAB}5BZAI6;L6#!HP7YoubO|9r+(e{9aQu1PjLxGM)5h=Cf)T>e z4HCW!)B*ca65p_GO-tE}1Dj?vOne53%*v(g3o+GQ>NQD9qjM^oedRk#=O>+6YP4B3 z>X9<(Nz7Hc9U+BO&=67p{f2rTIcQ8Xl{P+mUK=~FbKUJ^vyM0m666e~4j|{+xjDvb zEMx`4sbHy13g~BGKf;G+U8b$9>8D9%sw^&z=}ky{)|ia>6M_S=$o++F2yE$(kTYI~ zUa$v!>Y1MBN#3CpwvP5_ZtIE(j>NFiXkxL~M43rSm&@E1Y%@JBWE`fcX@SilLe)i^ zX9EX_yn&+uO-BS3;jiO9Ln>iSj|Q906Kf!cEJ|dObl<20owW9Ae8-hPy$2#bA%BmQTN5Op^!c1(I6^veb8VMlMj{o}KnjP<%*PU>-A@KE zF>=jII>f0+g#r}1c)Jua|1ge-?Ttw-1TG(Vm4UwsRZadIXW+AJHhjMSm#l15w$W={zx0x8)ejNBNx(w&tmwl0oMZ#*bau?wsgi_# z9`S|J>8Z)(L!@d$F7fkjQoGpZ=&xzv4uSFPxFIy_+1kWFFa?2Q_a>4L*yLKDKu3aa?!5kZw zbB;vUKl+G4O72k%%`xmw&qj(^a-{irAI-3}e1+B0&Cb@5&J^1TFV$m#*(?eX4nS=E zdUB6W6gCYwhk+)qkD|2w$lhaD)m_0rbg**ivBAJF4yX3}tP;YpWz5eXx|QHhhu|bU zum13BD1u47QpuvN9x%GyeV5G78yt0sboffFf++PZKQ<sbI@ znRe!p?kdY}YIhzm+Jwerwe= zdlueqp|eLKso`5OMalpQ;k_$fiR-am!<-5k@Ty|5RwuR16-7u_xC-vN;58cw(@*`x ze5bvD{ax)MAzwQ|DX+MILE^Yq5|3TGjsU*@nvv=((P-wsidMn1hg!``re~tDNO(dQ zc))B(+OHx2=?U>YPR|^gmN7&$UE{ybr-R;DbN)=$d`VTYq=7ph7KxA$o@>yC=e*A?+O6=fmu&dBf!l|rh-EhMVfKBXDhct|4 z!y5|6UO8C?(-}A!Bf(_FWb+^T0zv<$B-r!oIMj%=gg1B|{d4Rp4}d)bA!wA(mIyqULz ziltJ4CJw7R8OXd`vfZ9v06!(R+IvlJBC(8m=v9HIHXDd=q$`d__QWuq;SShEPOP{d zlRo(HgV5D5lyzEHWEA>H7k4BASsX?(4yY+8!=yRL!k@>hO-2HKGu^y56Xye z;Yh}3bis#)e7noHhEu7!&)@BLI`(sd?e^L;|IHh^*00jmrNjx@lwI9>?WMi$WUJL| zb&|V`A7o;r2;ez1apgNI*!_x$p5|F)-yFA!d^!80eYDs6%& zxzlqG9M63;H|MxCyz>P3nt@GXG%+v9kd~z^!?)KPZSHA3V41!aG@EN26;F=tb&NBT z-rpsSOb?o%&1{iMx+3Ut6k2>wJuKG1I)haBoOxCQacbk79O@BS8eWU{Y^LLl`l1^u zN6^F#xK1bYlXo|=%1JZ$!?{W_g^GjJPFj-;VEfq*o7>2{tsl^=4kv$lRnk0aJvnjek zG`GY-D*8H10i*}?V|a9E`)||s@6dS#a-KS|tao}|=lKoK2R(n}`D^BOTdk@msnhCC z^;-3IqB*{${@Do8J2Iw3fNF_~EIftz#i(i`le_C!LKd-}Q0j>GOD`g_V*#2q6n2TH7@|Lat8~dg5+}R$U&%k zfOj!+qrnS>6I*G2bVWcLy(K#h>I^@BZ$&Tl2by>b{y>l&`o@l{O^PPKxZ$E$`Opv> z9mb1{NHJ5eCQetmw0n8?p)tNgBm}Rf&x5pLQRvW2qCYMlg~j}RNwf1QdF84PxS(o3WcqaZiMm;7`12)(F{ zD!~`=wiwb7CrrQa=P;w)mUDndO`uMQAVCZnKq}(JqJV!iIyFRTP~O2<_fz)`KZZ$N zBtrKE${Y>_a9UWKoPvDDJAlG!Fd0c^2dOqD^>)$*5VFrjrEK{4{oHSCaS}Q%A1|-8 zW4bv(Jao9#oZi7(wcW;&MjN#oupPwA(F$gy$NfO!mAdv~WZ-Tf2g>R0+rNO?+3Bo5 zV|HU>Zf;{^_6QOWc?-NPA9YX3yX?&n*6efe)uFx<^4=;?&6(iVzpdwQQfj3E!cIvRxq*<@u+se?mhCd0;$VU@jKuru6(PzC<`EKfWv1J76cW)#;h(>8eAr&>e8GF>eTZCOkVm$B=dIK+1ie z=RwaGJ^$VFO(@Ya+*}4Hfz9=c0wtE9D=V7U31mo82FgjzF^p8sXH{QEHZ!wDW&@?a zNTxkGPXkcI5+Evvp#R3x8Y2(Wnt9;36`x1K7uG~va4=Jbn1y8_tBb$&8vBfbj!rd%qO=MG?5 z$tEZK%??4C2-g_mBjMB{ASEE@@t8vmQwgIuO$v)79xx0|h-MUeD2Rmy3|;ss4nJam z#(uw_-EsA96&>Do)3s0Dy(c-Gwqt_X3k3cxoR7RqPvZNxxZq8)^eZsRWXjvD*N;Y% z(QNeSfS=>Xu~Uqmh3B$x5JW*er7bXdRM5@muyAks8GP{s952M2VodoH4ne7e%^fBA zM2z&ZM~6S-eH-;^HGGr3Vg<V{_XU7y+5=yr|qmf`(bDmTnua>>HNrHAU-np1!M zCDYT>$EL1Fs6X@iYp*5dr&Ky~W|ti0fxD07F+cd;NhGpUL~lHRb@eYiKl1#mmZaUh z_5xQDpD|LBRtf9d)`jIhfxxybe1y>s$)!4}c&X7mkgHb)g7C87OftWO&k!ODk8+P# zW?I^!mm;J!I1_14Bv#>&eB5H&X)UWG@jdni;;z5g4H_u7*48aJ)qO5}nWK$@?vy8K zH$ST~n1j+W^)yJC=?f&pC+=4zS@ZfqS>k{H#szuX1~zY!OvO!#_mPa*P;=@8)4&&q z;@-jiL%~xs;U&NQBvEqM){R2Q@KO|83bsL+y*Ptp>pRAm$q)px?J|UH>&wJpE?#|| z1rtI^2By_16n@7CRA-YqC2k%|eQ9;r34-UBMKE?XefYLFrzh&UwbIoa(z} zS!F24k|s4MhQ-l1w6tb$7~I#3JTHU#-|zV>biXa~CR|!D_|i8|VB4otETlA%>twDA zxn6QGc{JOj_##(^Lb_ubi$o`O3@!3FZ8S!K`Mc9!JVvk)8KY2xKKeYzIg+zL!kLAx z$d$F#u_@OSui^NLoGE?;#+v#;+?X)p&&4Gv)zmX@y%>ofo;4Q)IfiF7Aw_YG`6Rh; z!ipfFkUAiOOb8=!5NBTF2OYu3l4f6#t zmqeol{6hZ=8#SVe)knFhR?RP7h^+s#gVxpviR!?85*=kVi0s6*OFEs^rI=AB=~4VS z{%Reg)rpsg&}6*iB}t@-lK;cXKV`p15}YKe^?1DJ82)k~9{l41a9e5ak%}&J9BI?-Kr9>*BftRAbVAR6nq7CUdxRihWL&JEN&F=fEt76m z!F6RoPp6Vma>6#6PeNeejcZhr!_7T8?OhL^oR*08g8{oNrtzJ#q`RQ#W~F@j-g?7$ z>0&;2m86`&c#+RduK@8NP(B=;As0AIb#@W;gx4=r)r5V-BmlO%ju#gZF^z3Kovw#M z8<+w+?Srqz1rWtPp=}h85JM_CWS@im$Q7^0Q9VM`Mu|*py@yxf<-|%M4hQjFz)hs7 zTwP3)K^f6#9?}Tf6Gf#}j-#0-k@>-Uda2b3R_L-4>ZhZy5%q|ufI7fcheTkJt{u(Y%McWupX%L~yb znRTXxs3vn-K>8~Kq$1i0wL+WdS$k;dG}4j;Bg8;Zm4 z$p$rT4ZqHhEbD)&wts3`DeVl-JCbJa@#{C8AZC~p@(Z%l$v<{2H%`olJ!KZVgnyrH zj@XbKA*c4ZhBz%J8%1y)-9v+ywDQdD=mR}iX;dM$+)~eA`bH{2k)ls#E+zu@NPo#k z@CcSZ)}8zA`SLU!xet1|Ef-QJ!Ly4tMYhTm`O~6Q`(_Tt$Y_$vL6)L1GF1nII&Zwy zha=5B>Du0sC|}K{845}@3GDnKpK8?KPokqxyg{0`pdu?A1`{SeL7XZ;pFv0)$584ObFExbYR%8~HHV;5l;zi zkFBoF&4OlIeR92!4?Z1{nnEAJa-~uw&d0i8C+!pp&D}!ykxEd3pcMZqG4qAI9~WVo z?DClIZ1vei$C(DsEt*0Cuq;Y+EFd-5MR@>ZLW3f75StT@0P&%=t}i5k3;0LUXo9>8 z^?j-0-fGoeN)!qfVnmGXzCp`V)0y27n#n19ap@3mvnlE1MR-PNegs+g>X}C_#Fh5m zc;k)dZajH=?xdQ!pPxe)lVgUzrKX1u%il@j46u7eAN{(qq&|v9c^z`ai;*hs1VXe3ie?ocSxyKY0EbH8rA&Si$Dh0Q9KN1TB_Pd`tY7V7@kXCHXIu1|z#ov2R3T zAsqrA8UJ4rQzGJp{1^IzFgp5A`f~Uk>Stfb78D-2Lj;R1jw`tf)-YgkO9PzJeGX*9 z`C~ZLM`Ma0%%bhKYlovWj!tA{38O*zNy&2vHcubg;qr0@@`)ohPTAOF8*D<3?`K9Q zc39Mx-`au{F)^%&kz~N%^7*|_XD|8Y*)!lTIJ|=p7Wq+<2MU2>RV{nX z9y*NSZazrwH8*bl9PqbnND=38<*_R*T=e^`7bl)=7(0xck3Bc=>}NlF?LFQX3Ci`d zH}`J6QyV6FD6Hm91mVe=-x=W5beSQ1-r@a7^g`uvyBPnWjwn;dD znzX~4192o~n)B)pues(L(;G2v!Z9qSDNM4aaavM6UXK~edn5IP%xlS334MSxkW}|N zpc&?k)X+Bn=rBLWNvhV{v$C?H)J>R^jO&c$>z}f)uz)Qqe#w+%XM7$m44nCvC%@Qu;R|25YbTU~fG(1*8EPec=!$GMyXVBr zu~Th+4nG;=!PUw2cfx0{yHO6j@kVMLVNtvOSe78UT?fcOV?5*Z>C^D`cU{3vne-yN zq~J3jg3n|nBZTcD}fdQGPIoU5*Cqza9rNAHN` ztexG3`h2Iq5=~dU;ad+MZWb%ey&G4*wour;)T@-0HF4nJ4WBQjnn$mCPAPN8v15&Y zYtPje7kAqEbaZv)4V7Z^@*__Rd9U8wY|3++9-Bs7Q!gV*dVvUOkJ9tEtu56!9-$EA zcOB?(0Wu#-V;M@9QAU>M`(3nVYOa?1I#V#nx0($ zbgRC+x^re`=jw8;rKWcuT3cLPJG6UxrqO6DF0aqdt}ib(ngEC8ymqzPR9F4YU@GtE1I_b@ z@r%f}6P{&I_s2bFL=u5?x()CCCk?&sp0Ttmdr{d$+;ZVkjG5klaNQ_*jfL)^_1U>t zt~%l5lvyWm%V;#0)l0!)84SDW;RlUKm6;csKe?Sbps=xF$BEdalb}u!Wh^HU)Z*9v~hHZ$?U~~H3~o*eF^zy z<72-byKm(29v#B*pg6S|m65w$)RcLTC?~?AEDBSim$iG9b+i+$Gj}XFm&lF6DuqEZ z>QMqmxAeJJm!LnM%ETEY2E2r+xf%X+)UWy|f0$H^;TTCVaQ+1(o{p#MyI-S=jy6gf z0roxib82ARxTWs+3AmG{8_s=f!9V7|(W^_D->TMk0dE8Zu|viBQ2Png@6xhHmF2;Rw z$B?QwP7G)!pf_U!0@#y?#$G5FR9DOY;rr!(|1bWs{M*0%+h0XK+q$nPy8M+GR^5Sk>Fx zz-A&rbtNm?e};eB_!(&Q->0Tl=lrYY)oqvz-~j+RV7P$P(5I1{GoZH+#F7F^B=;~p zj1n~`8Xs!R)YVnPv+7reXK%il|1W_DUX8W-M`~t${bluF{ejS1_fh8kJf6#f9FuV@76aGNBLh#g#souA6vG6Ab)=h%D#G{_cYuxfgOPC@ zm7$54`VMt&Nb31n97ksn!Sm|NdBe;NKUI>LGD6n)=KnX`ukl88j>9J>@iG~?;U^_4 zh&r4zhJS_$p{y!}(O0d}jbajbYI$ajNVjGG z=uMb;nlZW*8O2$)kIv`#kpiY|25AyA$kE)eUSHZhJw4H!p4vGeH(jZ`RFiprV+=xLN;jybO+6%$ZD>;L zctFfBf%4<6;YKCnLpqi2HyXeI`pcK9&vX}#_sKdLjYyh?NHn#(MQfEx{ZezHP$ZjE zn%rRJy5CO3rwX}jVQPA&Nd`Ww#^!XfI7jvdE?+Ls%`F_BCE!lx0QOaFdnzF_y_g1Z zxv{Irh{s9@xO}8FkmJOK;)agN#*vv*K>kbu-6ph>ZZ~ala+lcNK&ohynO53RMo(9( z_p+4LR~OqtyQyBXd2;vC5^_|z`n<(85veL9YpA`wH)9`6c|qCrmoGnz^~LP>FTceX zjRKA(+XVK<9Ld3nLh&0|pd~9iu1bJ-RG>wkgBa4HzI?7zK=H?6v}ijM4j=a7TuMLrd3qxCY_AhNJ_JD&d* zbxOGC*0%}gMw?RS@C;ma!&SI;4n&SV_1bHndNjJf+kFT-@JdnL|IkCXcWd3Rf1Q7~ z55LZ#8@i7@L8hz3*>@xZ=LiNXtuLKO%ZsE1*${)G-lRKolqhh#QO}1@9YI?&dc7lu z-S5My2IWS2Zx=B7;3G}KQs=iPvbxMfai0b-}C&5=Wo#P13)xqh(kT1UZLKqKB~T= z{zUzq`iT)TYR00m-#8%>s|_9G56RKS$VEyRT2IC;CICK+U)J#ij%cmkqp5_9`_Y=T zxy%9ih&`5XWE)LsWSh(fY;H2GjN!Hq8N#iW}lVeFsGZ15f%umb$D{=w5 z-C>_dQ2H+1nIt=U1ImL`S?@0TTnxM%ZrP4Y-u2-uJG=@03PNAGu4OaF$Cr{<AR^e{w97;;OeqgbM_>pL2W12rBKapdR~|?=g2_mRfC?4jO@}$e!dTcTieV?Q4w#f+(4dF_k!|QxLQZ@Z8KE$Y zSXLocT-n@Qw|oU>aw1CxItggQrx8wo>>$mUMOBIz0e&%{G5nA-Bx+z)sQY~=g@L3H zN4)sl5;4ml!A~jn{`bcKs)O}-62Tz|Sx`(L_DvwK0kTS)LBEv?Nqr2T6pI*M2c7j3 z=wal2JQ+8P0?FsFM4-#7BZ1<^_dZwyxhM%8#@}~RzXC>2v|ucXO~Xq*JfY2q4wnWg z2?7cQ&jLcN_iPfQB3Gvlh0i;I)!)F)8aJ(E3SODU-}J> zgMi13vpi4?WU#_=8%pJz-}2@up%Fc}I((R9M`GEGU?PV5SfM}3N&!-bEGHs{hrJ~8 z{WgO}>fVx^7wD@}A0vYomeNpA>OK*35vAS);F*YRTli1>#TW^j;xIF+4FbCl1d_op zMM%i^#5;oX1a==_Xh=MlpYh?xVvMhOA~yrrhUN_Tl3|dqA`&Y>1V$T>u5l1EsJV)>58!En z3)=w#*Hpcl#dQa;E8vSbC5=FV5r#R$gyxrX#BQ6aQh#SQQ>#nG$ZUob9@!5geb}}W zg^OEpMil48tQFpjBBm;k&UmrjMFffBBe!G>p-lz-fWFcU2b|UtG(^i0dJqZ+=j>k^#m=B_LQ!NE6M7d z3^FhHFQ1V~7xPvOjVc&OreeG^`B2r1Cd9;Fnphuxk}4z70L4pyf1!5;KPr}Jbf16~ zr=m!#kcg`v;*-=aI0ClQt3b*B#0$zBT^(w8z_zCkzu1?= z&GGVA<;?GvM2C03-m@p>N-d+kCdSPcZKLEy!C#V`%MNKWaf@w}7k%OK}YbOB=< zxhqA~_#wQgZ}hyEQMn?;WCx@=3#+573vV|jR(L$76>-){&<>VVNPvvP7l_S8*kurF z0Yn>z5kmA>#g)Ja-%-2>l~~z{r4u&;wm%GotNN@W?#V1rPnCtcz!}w)x>CRRV(z6^Ct_02Ia)%;!?L&-P51&h(OMK4R{l~7aij~7 ze(A=tsjOVtQ0I2+qmzD5l0hOpkEHqnGP*02Ai#hvy~IP2*)P2fMKv!;k(fQYy9}(P13iUk{f`tyZx_LgEW~@J6>$f&BFKC|hb} z`TCXVY4Ckqo4!j=s?-L2spN)<2ZcE7L%yPG$oYcvdAy5=0 zr>X1-UEQ?>Bsj`gjkkOa80odOgGbiZ>NQ}|hifN}tVtxxXwzKZc*)g!_6VrSb+-_h zEqbRXLR`&jiR4>!t;5;_h}J3Jg8w2K{ZKl0ymNt5?&Za|@M`A5r%n}Da#xz*JGDu5YjS&>+Tm<6vdhSwk6AY#P8e8S}!`|7Yw{7;*Mx8%DuVRF=#q&iy4jXh${i4w)^d11OGx|Z7ube6L!{V*28}13&q5jsz=E0Y^U1k1o70sNMOwTsE7Vb3gZB#V{?4+He4!MCOUxkEO~B z>xsWos8PtgHp5#8rnt7R}vgdCl! z*EGlaw~RRH8|_;eH-SuwHZDD{J~(=>de!K?gc4%?S{m%zr=6JLP~v03a5&J)_QV;B zp%ERXf)zShlZ;{T3P{?-&IK zL(~O~piHJ2L>5U|v3Db7Sw#Cppvs}hvZ^*R%*A$Q4`#h*Xh*9~000o&+v8Y!S5@7PjdabM*uVHYpfqs?#6@^4RwNeMi z(NvH}M{xF#EqMH74JW&_MoT1edJ*y+c#lPUIn63FSph4- zlQYYeaLJnJ%84ht=)+ugkS?biE)Lzsc*EMYa5rYo8T~RA4?OO2p2j9gfsW%!|d_S z$^9RH{?UF|x@Xc=e>6F?9Kq`?jQc~EULJSs<;T7M!3Q6F>cKzQ>1PgfaMB-|_gp~c zx!{R=YVe*T$UU$UApvkyqF@d zwKM4}ZUfRl-Jdf0A56JLJ?{U$Km5Z##7!DF)mmQOI<~RV82viD*u|?He_uGd@yit~ zA&)?k82At;=i<%d!|FA*6hwpj9r(# z#LVNqLhv$VoQT&fQnXXAOQk|ic3BKg`8>8ES-Utt-;RZ|$Cr?RXY_ni)MM8{5 z)2>u|+3BhNY{JOl@Ai|Zo}m1jOA@|@jTW?8#;|)JX3y@ISfF0?HE!yDNu^_qeoQ~I z8nGM#O%TNfh9#*PO?LXdaz7Agk0E98jP$=e2c8Sh4GJi4%|wa@IL%UR1t^H*iux!f zk26;vMwhE>8s0{II6UZfqPe#+dM%FbY+_-4|Ni-f1ZZTbr2_}{9~j6S5V`X6JmO!+ zYro$`K2WPd?B&92898#@GJYmTd+rOv!YbY))^T6B^ZBHxq;L#b(HXK;Xuiz!iFIF= zMPHVlP~XBnzc#$%nga(jPQBK+W+g6F^$Nv)ej1o)yH)7wa>s#C2$k<(2CcyU}g+Gp|ASK8D}!J`m$S z;`vSPYwY!rd*JTe;6ho}&sbywuAh6-nv-~u^c~3|*M;u2}YW zkEKUU%90M$GLfvNYh={WU9K3Vr-uAwql`2*VVq?T6u9M#3_aOPJL({xh%Pj6nNSBJ zX(4!U(ay`EVH*0#$O4^>*%4EDyS+llcc3SZnRKRD%ur_=xS*LCELYv(up>~acum4a z@NdOLZup*4tNZukV5Oee>gr%n*oK?hEB#)nNEK`^slW@XloT`nc>U;+jrA08Ln^j^ z``T-cdWl+pTC%SIvM{6gi#U&P@I=zIZC{eg>G+={@Rh}|aSyf43Bxh`k>V{~A`gH~ z=`Z3Q@k;D`B+`S!Wuxizyi<34R;|0r4Rfgh3kQoC_&nhuSkm#)KY|lzdgjEzUN0DQ zoIPABrk0dww*+W#Yt{@HL{!TC^s3iO1TMfVf$IlL>YyZR-^cyZXne86xBKiw(jt4C z3q;C7bmpoFr-fb!9>(XG4-1}c5avbWa1D+^_vDGWkH^)}8Am)?9!JK39_Yj)paGB( zM6MiDz@-d>Om-I1zU-lxjyg1C>f%b{MGm|~PY_{)PQ=_);BP&L&-^@g ze~%lO*97%T^f4db;KaY;6|eZv18VWZuX{pWc*RRbBiYAu@w@8F>WAP#!htN;c}!k_UvahKXPMeEcnsQp6}l|p3ijvi-$u}OC{QaWztL~ z4quW9iRni~6LCrOSB9P=H*Eu)B*1iRb@6j)C%rk|Q@}D^!<~DjvQhpW`IjsHrwE=* zqN@&t)(qdw4@t5%&EzXjFAwC_VQs(g?JCidDohSEgBU(W?gC5;CseA?wh z+t|qNAZLG)+a^=TlAr;{jU{uf(mT^h68`Z1yBt}Tbt@fh#{`m{A?5@M$V5d#lu0Sa z)0B6`mWij$Oj?-10Qx#|V|)(fxK~mIDTM@Y^6uSx!wq})dL>wcYBqEtGQ_zK~0Y{L4cYMSv{{68NtF9onq%b1 z9*YtjD+>q&dS{tx0}de*O`uxX@eTWqUAw+PS|b>DLjn-VTQ-)LuUubpDizE^aU+>& z-Lz+e2)*w5+MKsXT$;KPx{%DxZPs-d;5Pn#7H*=yxL6wjzWHX zIJDga;;cAbqV~+_i?dU`a_Y#jTYAD#>MA}vyE0S420ioZ3Dyy{9@ix3)Q0tdz@@#lhxYU}C?m zG+5ru?H@SY#|F4t+itbD@4q9AJMge+Oik_6huLZ@6bgE0eHh$R*OaF zy5PZ()`k>hAXZv;)rNe#?Q2VJg|7Z8bir14ffn${ZP$MDo8NRkbj=N;-%-8M@67$< z2=evKH~-^r5c2WOYd`c;o!j2_p3i;mbN{uxaRopC&#vn+C$*dZ5L z8njmNCXuqD?v0m`X9V65a!+yTB5W8fpX{PP*w3qe!6+6AMdKHgck~>`;O|G|c+%j!ulBUpTdT>xWprT5 zB5>^GTd1Xv=!k&t)dsb<+(u8=e7@hittA;ct=oQ&;pE%)dbizAh@$X9reAH`}aiEt2#yvzbcTipJnFjopmq+S9u!YR@h zD?}2sg`PpzoOYxVCCDWdQA0wGZt$uLJ|Je17+RS;A(~42vh~4>s#vH}(L}K;3ScFj zVRvF*X7++=+92Q~=1`l*s3()4sWmZn8LLuM^isXcICCB=_&8?5WuPL%k0<;k=}dP7 z^IP8Zm~abM!WWh+8`Tkt;T<_bQs@7B+0@)MP0xYv*?z;|NIRET|DA>>*rUCh6zpEc z+>=w^IU&19e68nY*tv`3zU=p$Kx<(R3E!7MMzM8E?B|$NX$G!2y_6A_Mv`MET%Ei= znoC1=kSqkb^vpNv_)kKe%}&UwA7}+y2h>R--;WvgWpVC?-iF^@mP^_>!(N_el1?-m*<@`Yxmc9zkieFpTPk1#|A zkyfb23i8A!M;}jy9u22*YGMB9k(rr{X$(5WwS&E8!!(M`47z>NX*6Fs)RGe+sLm2RzGDPdvvC4Qy6bOri1)(t})%XM4nbUPnJK}7N+ZMtBU38=3W zQW-mlEW6K8^WEanXcKl74CV{%7OrA$6B(@rUgCN6D>~Pv$FtDYM!K*8EWtPwhdTB~ zct_XL^Ge&H9PS!>fV7almuH}!xy_4)-z@tTMLIPUq)no-`VPY_f^lD@4urjTvxxI z!CCv{Z=9{&cVF%7uRihem$UM&!G~qjT^@DuA1?lyVXI#t`$+o;FpMKh$+NZ~N-|nC z!4Zv>-;g3YN90m*$vH?2q8Cf*s=W2o>SCBv>WEYlfaEfV=f5xyfz(lrKH~_5U>fS) zl^RF0YAg4uMko^dJ1FR9&_SW6_&Xkd9G?e^n7cn?^rrd+byZKw>w0s&(*(Eoc&;IM z;@o+78xm5 zdam=_2BIr`L871$lPUIk$%IoE7^#fpKnY2ks06!nR-~$`CXJcNf{Y(%jx+hav!VOE z4eCN9oE&{1DVSv`buZrldIes!x%mKLn#h9p`qb#303%^zC5 z_Rc%i>qZ|?_l`b*d_CElZ+D&Sd2%o~seGdk$dUdD@uYpC!|O+6CLO>0=O4;Xmrl8T z(~>O7ls2x2fdwr>s|0B4W7i=M(tSG}Hm0SKrv2m3rNK@EY36zI%+-jvwt1#-BoJ;a zEp32?mk6g$=K_9%U>HI!oK|bGNg{n9lr7{*f(6`rk2(tq_);{6PBnoQ;^ zR*uX8iGvf-DVOV}IS*(dcv}7>^T;sBEhzJxMQ(NPB~2y(T9I&5tW4VKIu1(155;4Z z_1_yyWxGtQ)0NGxvfPma5H=0FmnGM5t7osQ7i~#~J#W6XfH3@LWdhtnOdIi#C>+G^ z8o%;Fp*h>oQDEcB4lW=QyNWuvO5IHIl6^*yv4{H-M4xEXjtBhFXdeC;KnU^{t2jof z3#_Iik*O)-p@L-PkkPI1{^{LJx-civ9#YXyWQz)paXjX!ITbw#-zhM zh~s@kXgvT1t_Y3Ir7pM&P3TS}aIg{=Yn;#u9?utn#jWr_Cm}ILK`p4Zg z?ku;f+|ksfiTj8osNEH`2<%rsYWu0xkwTgA+LZP#t*m!D=~TOg;oWZpGg-;lA{@|5 zd~i4)B@CelR9{pQRSd6_%@z_FLC?n4ML&NEMU@265+Z6e22u=VS(Wd9af|+d1n>%5 zSp`?VR-K)jKG7F#`{-LbqjV6@;bLtuTE&$cJ9a@8<#tkkV>z87%T<&IVEden6+@2E+y(7Jf z>5|Fi_8Hx@%d^ZTx>Y(=H$(1c8568Z7iYkjFzX=<+?(D9ltg<60{Ozipjr{5=U$*I zf|c6U3k#;X+MHjQUugEhic2~7V<1cANObgtTlG5Ns32z)om!8cRQ;=t<)&wP-(M>4 z1r1Rhdt`k`BH8-J!eS=aX|HVb`$o{o5KB%f)v?XC#DlcwSBJAvON+mUP{ zkjphffnp|0#beBL3k%&{b2blF#GC0OcM`q;N{@2w(&A0fcqDq{F$HxutRjEni|Yz8 z5_Th@uVNlvX3FZ`MULmE?CkcL3q>O^sj|j(lOYbhAYjkvGj&5%D$D7VO`KSV5Q9{z zS|u#OQpo~1BnEg<2BmqFO`-uV*2ero<4Lfjf~LZjk)?iam@;wTUQ+pkboCd;>=}Kl zGdowS8-V{mb>W0wYE+~4&^-|DivFc(I!h!5j~jZZ9g6YU4%x4T;xSLWn$ zwGyV)Fln=M*d0EE(I&l^#sR8NDXrb3lNL9=0bBizMPX=+ct!(zHc}Ku6x&NYmmMne zJfVtcuhCRvYO0Znf;}Trl4X@ci1> zHxZSDgmfHyPYaogTmx!5P+it)fMqb35T@EtwEQ_(kAM#C41& zi-4ol?m%@qJsk|0^5L|tU@8>-r zFhfJ?bsfQ#KuXCjAT{oKv1s)GfP~0ich}T z5z$oS?a9Ho+{wV!LthIb?%W$+j4%WD!q`)t8(omtyn3W_;I);bkdQR5FI1TV8GKwB}?ts_eRVZWDa2^BKr}aT`oXp?R%`62*C1?(ukG3uF0UX_$b4_i!Nb)MV2>~=?A1Vxy+!u>D- zs1OL}Cc%ggtTU21f(j*+fSw42xVJ!0@;$%PhzIHPb8yrLfF`Np5S)@{aNq%~2Aeq9WAIvwKUD=eJJ9-p35^I4E zx$^T`HhPWc-;vMqW1ymYm=_Yu!soC-L~57G`aPeFcC4@P`0x27#sb3w4E=jPVHY;a zbLV?Mn-2PbsCWssYumMG;9`alKqzDh*@n%?byU)~lYZ`WBfpJPIh#pUW|NVn&5*Ty zNU1~HR%ml6lANuisPD#T3VE~HWO+6b8AywR(!v+o97Gbc$stIxcW%8}*>VHvR#D-PHzk4 z$Lg~!Vlwdp^|uChpZjJIyYYg(rPPBdu+=KRQN-4hB0;+S8x$8-Yp*_e$Kqlp6RoKw zJC{oXr5K)>dHIvddAAEt7W0DU9ZP2SFb0Fv!V=%l1+a}?2M)}W*y2C!`6Bpa|674$ zk<##cLd+3VIx9ZckR|sgW=_5lq{PqR{)^lqOELws{0oP0NwA3XyWjlQ2bCkqa6)Dg zs4&+!m}$F;wd}wlgyv_Q<)O<(SSe-B(3d(Z`otpXt`1j#%8&>0FD|1f2>{ZuO_mR5+eNDcw00Flp$ypvFdS~7En+2_B)7^n z`sF$UalEL>q#4ZRX69?;^DYJ>g-qI)!FPBM(LT22ms)J+%iS(~HxsA{QWkcm$v?O& z5qrbq}_PQuy??RL3r5SJ`>NC}d#RGgqZvjH$ElwTLiR5RNI5Jb^QJ{pr8+)xPd zhFA0zl~R9dO2eCip=N|4;lV|@s~Ske>DqY7`?6%|YUOrkcmmmrW%nl39dZs+dYb^ly zcI0)2WZ?X%)Jbdp3rQvKO2jb=)yw60qE=5)AGls8yaKBUrBzqSU%9u*OAf-lOFhyH zn1Lp_ZZH9*S?-FBUcA2bn~`3?gv=6Mrc&GLArNG?D7lpzy-nQ~ zE9=z)85uK2=cyQ5ddlEaJPd-5%oUNM1B zKAET)E?_9GW?3t43t@P|nTF~CiUFxg7op|$*nPc|nIF9Q&Bdu&rjkh@HxtI#DDd@WzxOpAY+Tp?I*`W=7V={@BE5}1F z*E5G+;0^wrCg1Q$ga=J>yv$#DDL5w(95g;$cGUx=}$U(LL-Rc$uKrfc9X`wqE zqKTZWpL#O5aeP)ZC81+PrpBT+>K-DcX<-=*^bl(S9{7|K;V|+2>L6jbzF3(c9h9*u z!_-E^Ei^iv!BQ8vAe;vN$iBO8-Wok4VypV7ibwM~KJQ~Lx=$>Nu}bvKagxE z6Rny61(2ODmBez+RDaDxbhVA2DIj&*v8|i$-WL%xgjT)VT^e*c4H-j|oaGXcVUw&& zp)$J99oCAU_)05rHua$r*;_E^L z^Lk0e5i_XZvIpbT+Z6fR`?6RV;8t{pj7r?!8YHncV(@!$Qu7H|TchC=6sij_VF56u z$U~=;L@G&YK6CDHkS}bDsOIxAp1NoyK6g&}iK+OG&ed!FD-<`ygu~JE;zV=d)1UtI zOFsSLmpS^}hvl61PVPz!FIS!1amn`lU(Dz%q{w1Mb%u}_2kbbs0~kK3B4Tdj2Tw+{ z)Kxv=d1B-7EYC={Kxmn84EJ%lkHmepn304O@J4n(AC|*YZ-^#(ok$jwCoFArSTP}@ zY-PSkFuk;3#<*{HST{ z%lj}_C#1==&lTvz&(m08HC?2#^RD(tD zBn?b5rKI>x7{ySL85fHdin)9c7;ig_43YN!1tx9o2z(?GUDA`gK$+#vcttVj03~d| zt^5R9C22GxK^Yt_`rz*Av3q$M3EM|;Tj;Pq4gy%TOjLnslqy+*+(4vHBR-*>BGHKP zj449}lR_cK+;VazW?itD&{%^3D}sCm{sxW)(@6r8l8H#|hD4D{j((6!Qt6Y=LZ&YpdMqU+Q*qFxW;9c~0FMI1V` zs_g;}I4q%H?i~^HIzdGYBbUIRU3FndEEBbm>ay~_q`tsKFm!4rlkCpvrg zZf*84D4_BaV$N<>x>Cl5OioROui(E&77mpC!F-G=?umHMZ&Rt6X7B7KlGDMkho~g! zpI=r#&QceSd<~Jdk9&UJ^Xw$*0SQaokK!^G!OL|iyUSEVW&%0liRGqQlvzU;xO1!7 z6oE}96#Y!kicfdZZ7bdAQdmi9L>wkcQtzcHG^fxzjajK|)r@q}bs%Q2ym5vF7-F6I z+{usv&hc1go-cxll|WgUp#RB3t=~u{aO(iBmicNl6RFP8Pu@estTRFA3XF-C9iDFb zb+_|jcsCldj-*kZp7bdL9L{Le2&6~VkX7VSt%aF;0Jn_Z1n`)*pdKE*36O0}k?P?T zxgCMgo8I*3qsRB}-~Z?>x7>8oqr_3$&Et#cjKX*g zn`ba!iXjOzlGo~BX0hHkJzR&YR%z_;fO6N@8z^g(=a1lO`4b6h=(Tscf#u z>=ScaTklS6=}UjP)-kjV<2fCVoF`X}2x3(yxQFh#Gy+`&N)#PUdAb(zop8l$x8t%B z>3>H6!!P*(Tq9TSW4ri;|MCsU@!LoR+Mne zVxd3CB0htSj5~$EYfW$Yq&EeuoUPKYvR3z}y0Eox-`0`& zISUV4<+`nXTl;o?oc2x6Y;FSS<(rw_1jf=(=cTMxXmRoARHs|M&d;x%AAh#l=@`B# z8p`+d6h=~91YQ2FpQOoBs-+!zMS?-?UOO!Ookc4izma~corUwZx?zN3dY&(2}YYl+e1 z$!g)tcE6}|yR&Ap;F~lS_qN`zJ6VGZ+?`AGb(i{yGK1Xr5G9>|87MM~csRB#`H=3z z8E=xN5HMW{)7?!!G^;E5lf2zu^2uqr;K`eVjai{wj{9C(6|vHNGZJ{O?A+y@5H5)b zFy9lzswP{Tr?t5S}@O3mM|QK2U5)! zzX>Kf_Kb#|oR6&gR6K|W6mK&6r3xJLhshPDCe-6fzkzgzp`Dt#{A5O&s z8wkTT7A*gVB~wZM*FY7Mdkvg$?=u>BC(&C@N;OGI;!e|+RmtY<9Ny|&yV>+FB@)$G zr8*2(D$Yr&BN|c&Bn4FrVL?Qt;>PhRA{fEfVK>N|hy;mt+wq&32*Pd>>tu#v8u*kf z@Y5pEf}JpogfE>XJ-}~7Fq%`4I%<($=trhV-W*LPxYb1HG9Ix+jn;9MZxLdi=RT~X z(1=}tx;2c8gjPJpaYQIAf&>Ipg9eCVGKrL5(L7e{tlMMo&hhu?0wt%DMYTNv3~?*? zd`N|UiMy0U&+zAKK`;b0qEU2oVb|`p%lC1Qvk|jJF+F@3kD02~o>KmZpdE96IpR=0 zfgNhUu36)eFjxjSR%Ed#$;A@wq^C_omSBHE(%24x*1St5fxNjna%cF)%q{&ugRaaJ z*=V{Gl8K4?WlS$+sj2=0*;Bao0JZMN6&bdKsupIurEX*Xis>crR!~e1B~k{eb)B*e zMrh++kXO`xk{896nVoz;-7k{BmF*!{^!w`@%iVnS!jn%vnU>n6={FkH4&{OC-44lp zg1mC(UVx2i6!jzh6nq7dZU*RI%r-T zUHmKKVf8o>kau`K3dcZ-CLP=*4elqR)!696x4b1$d|7%;6BEV{VR947qPtl7Ouv!i zM3P&O5Qs?!J7~s2+O&B}(?B;ibo^T)L^0iCZra&_rJcj81519q>Gk^bK)5AdTNA~L z%rpBI0~DLMI*;OLdntuo5__=MB;&eQtswXiYES@f)|P6p0bji_Gv97`f6N5YlE|x4 z$qU+}z3$H!Fp>KjSW*c^APUVpGrM=s>>LVS2&{4wMpE|LfiE+;4`6BW)oas>osKC* z%t;9#XaF!x+h`CdMGVXvpb{jjU|1sV!7^Lzg@ty@B>F+b%ZP7!dVSCQJn;ZQh`_L2=V#V$7c8f@r4xc(g}-Wwb}!D^@~% z1w9`Ld-U~ez7WD&AM=x|hMvB)PbWQ^Ayd#FVHLQe?YX&mzYz*%%5AUVoZx31XSYPFR5?O{G2OD@b0SLJ(t zez^Y9ey^GvEH)c4!KG-owzf`1(DlU@@&&Ht0#fQkiWb30w0P~1>p~F5V^Ic#cv3H| zk#QsKvJN~*%i4@3u3z>Z4D~t!VF+qgo}=sQ%?31gW8>I?b)Prq4|Zp--`G&zjXl?W z{UO_`thUHRBu{plG-TLsRa81(r@gjsX4>2DZ4Npg63>3%|Dase8|&*wK;>vQjjGqm z*p%uq_wKoY@M~lAo_oOOQ)WKjnkggT=5rmJL?4V`Ywfnr==Jt(PEC1BKg{s6)n5ce z6-JkcVej~l%-tizX^*)vG*T=%y!F%(CZwIPE*WN<+e6YP+88mOeqw&a^uUxOdQv79 z^jRNZb@M@)wu1bts}XyG@F4$;5V+>JJy00xK1wE?dcSf{+im0&FB zZ-VeO`uACb5@Xc5#>(dpQCbp@(M4)Co>NznH!|ya*z=>F^PZpb{2YdaJk{&*S_|*C z;m*RjFMYeeTm=OG5N%*VZ1$mwxUFR5P6oBM1L0kAdAoe?K9+lIS?lO6m$r*4qg!@4 zfs8BO`gzcV1Z`Ve)f~=k+0Ia(dDtCafE?64;N;T=H$|S-D$g{%BwJUVog3J>pe~*j zhhOfAhg#y28!`fPn^A5{E)8$@Oma&+Zr4uYNPp1UIEU=mG@AT3%en&{vNxjw*>NWG$rLbjbx&lmuMifixt*1_nR%FWwdz@omwDko-}j84R6o? zmKjpwfRZLk7>iy!87i7T1hnK&SBw^i!04-RJZ3W9Emb4@D{M^98CT61v(wF3*JyXaey1cL5oS|8TANqH zYQ&GC%1vC6lx8qd>V)ov0MC< zlG+7XWQ$|-@MYl3_>uq>aVXLIwP{Sg)lqEAF@GrWqqqd468iAkRwCq&#ecWaXvF-%M8QsNNi;+QlU!`BQORV} zDSvGrh~*LWA`Xo2>^^~<$i;t|*vgvZD&0=+)?dt8rY3zl2KKtF&-G-!^i1gW=J$5E zJTFG|<1d!CF#0PTcXlinOTCkXJBj;P+ONA8zZ>0tb}J4cxPx+w^lUtoO=O~BT%$-P zwPk6H^$R5F(enzZk3Jf;L-D*n)mWt;)oYpwdW;vH_yiRsqa>o+(N3kE%chck%U>TN z!iYc_xH$4$2VGX=ip^6A^-fKjKkNCD=UYe&E|kBAQr?wFxL%EfuQ0MHlJu-VtBX|W{(_}&Zht0W+f6}rF;w?A;oweOMUxi6 zI_W^{3dvyXwkh8wSVEDQachQS2B=+{&W15l5X5uj6Pp-*#CDtzYmb%O{MVa!TVgY* zNvekc*@Gy{!GnER1mW6o?;IG#0e=B-I+ZoBuN->4mSsE_zin)*_v5z#p_S@v+J^<_ z6gnbfMC8jZ^*Es|vIgEMDxM6FAu^nNi%Krps`71XergdrC(t&AwJ|+&^_}Z}fDW{G$59zApQ`X3Z(EA_cJRRcB~-+%Db zmB)@Psm1>O16N(OfB#fG^_|t#)n}jO?--;3z~g*=3P(^dbQA!Xxw3=8Gym3Q@Vsk> zRb{JMZV2Y9v4NJg=$yR^^L{%8pbS{idvSX(NBVr_CPGW9obxnSL4abU1i_*c`HUBk&GBt(tf?4 z>VTt*7qMTw6|47^o)3Ed9F>W>FT>^w&M}y!pam4E=%6eBWh2M^3%Idd!j&5Vo<=bvR zzn*P+6f!I|J4dsg1Ubka!&P~1-Jd6EQ3^dsRz)}P#!FRGEzcLBwWS!?Q8&pje)f4^(M<4tWg%9 zo*f5*)i60dLF%|x2|`FYmBTe8KWxbu2CyQhB_PrX{-oFiRN%44aDj>z{+{;`$$&o2 zE`EQjbxjb7QoZ9H@`<;~?2XPkT-&l?Vvvy^x6nv`V5x{LxSmlTy# z13KjkQhv`WpozVrODcP{3aFXayhc%{oQG9Mbfu@jP4EYs&7u_~6DtoojwyDZvA=Jh z)}fij5TF+@=9*bO2=qXlFkYyv!~n`D(e83P(}kizqJhDXDI$<&lTBdyoFld3+}JET z{@ylH>4S+{oK%SIZRJa6a*2Z&AGhIn`MFG(xQ@(R9+#RrPaUVrb{<_M?h3g$+5EGU z4wc@VY`a;?X0r*F{dSg2d_pk-*ekp{a&U=C5O4K70o}F61KO2QT`AR-QvqjK?TS&! zwd!8_Uet4snS{R*EASE(2vDmmJ;$^Wo4Mr18}58F^JFH%hAe$Z4ojpG2Y@;ZcUDPY zw_ZiO(~C%-?>1xcLI?{_h>t*^ZNoWXsgy!xpd=Mlz=^zVV)r*gMKl~fn)w_#m;PkQ z+VU3)No-H1H|;pyfK6m3(Jst{RLZ=tJE&#%ax;%6F>6hm#*96S$G%L2Zg7cQM#ddf zk=dY#6Phv1S!?OiV#f~n!I48?TV~SzyvH8c43x2*}$qI(tY0qtvlb@Q*Oo2PlV+#dhEHE>eJ6-$I zZ!J%Wf-&B%e+wAMi?k=-_IvmLIAIO_qnSfhd~|O)bm&m>NLOfLI9&bD{K_05wkI5_ z{yfX6qg_E^tp3tvtxEb=AF!73rqq!sO5%m8>SU6YH=wpfdN<&9lX}+bhbV^|m8vmp z7%!~uEIqoj#Jceg^pnV1E?vukx_h7J$Km6vQbQ0UGd-l00sIMikU1`Q(|PNd!L(_` zb%bgRJ$w$dq^)i(dx*bO1k3SE(N~B>_|L(`3fN3sLcxGXU)= z^3>pF};fz7B9=V1yr{R}Dql=bclQNB$wbi=% zY`^FIoaEi(b^shtI5yNEF>8h+tvLcW970T4?JU)F02l-m)wLX+Imt1C{EgVw)GNFZO$|(An z$-Q#h8;RBi*-ZQ(2@G=O;c~eVTp$)JJm1XYLcm|0#(!Y?FQ6Hp z8o<7Ya15C7_`YrYtC-hmmEPLA>BOEr^}6}Hw_2~3XH@!YoE`z1Ki~hC2_Bcr#v(Bh+6~;6fQX=eN z^3}?-wtgUm2)ET7n0vIjcroG0zrHs|PqFbtOt`l%t7IehX{#-mDPcXWwnS@n+l4}e zC}IYwKWJPbp|;ls`7Jf&f-e?rb7&S(V|Mn??F@rKV4KOiNF(WlBuX(9 zxt_3O@2gpo!-oFn?pUDR%cFC<4=IPHdvyHO1?@MAiw{fma5oH8@pCw^&}bK`5} z0$v5?=!)kxo`*f}_k7&**@>Px)DJ@jl}o6!vSv}YmdBtyI3j;Dg>jsUaI=KLOY8xf ztcfke(d11;Cp}W-m%AjxQ;w<)i*h?`5eTo2sE-(c#rkFm-`f4NIYh>~v{j77HeDs^ z=%t2F5CE{ZM=CbCcA=n?TT9d%?RJR>si2CL#WRpjs(H9UXz^Plf)!Ruw8-K zoFF8J;(355Gy-|Rw$SK-|6*wg6*b19zv@Ol=R0(lpnwd z{qbrQEJ)5UACFVn%&d2)NIbnTGn1OZ7v&8^fc-WzMk14>pm(?zQhvY!fm4rHYt&GS6RvDqhUXcjeu@SwfKAv`B4q3~7%bYy_*#_z z7Az@pHF?N=2;0JUJ?D%cR1xf<2dF^vF!eCL$urmUNR%a5ljuJgqGbb*5P}{H~^r7Je?ImB$VUHvE6;-my9YGKGF3)$r|Q3tzeC! z!|hzbrQfoTqa6Yg2+lmYbaB$0&Ep%`In8eYV47-&%w|4h7Sgz`Epq2Wrd2BeEc0PN z*F#>b*Ny_TQ$R@}0RQi)nhQR}24ae@>GftP@VSsC2+Pi_C&7^*%~4%}j{t1MI3`hm z0smrwkCbgD(xmlZJ@m6JAji9dhIuX0imw~nM`{M`E^#24~fC|1< z1#hD=H>xG!Rq2dV3ORi;{Z+va<2IX7auQ8dCFlY(nj$2P5=Sw-kIPb;vEhFt5RBbv ztL7cH@{6t-=&?|j{ZA-g1rd(48EO@gxTs1!`BXuTaRc!|E_4f+ zx=)KIi;M!-SJxFX#9PEs7z!`fTqg08OP*%4`Q(#L6zX+kme;;2a>t$4qPeo_{kZql z_77Npi?02kde`W|!?2_+bR`^okRgM{ZHE|-VUInD zx+lXJ`xxGWB8TC7X<4{*gyHg|<+0FnvHBzTz%t z-PT>2vqBDmwjkH*68=WljawPtv}h1oj>VLym*rL`2OS?!e%s>MMjj^ZQu|3QuKBXdntNeB=HO|uJA>QsqETQ}eETbg7bE|M0>0YQyhhCDSO9ymlk4(>g@}S(UJY6}WaIY*4uc5$8 zpdn&#u;!%JBUaQedNBkbPE?bDnJ4iKprN& zKB}aPnnFP=*mNvYtYLq|%TmhCR8>^M<&))n+m@^e(;Fr!S*btINkk=}<)s+e+Q7$z zLJ)oGthY)W*V|5ULLcc6NlAqesU2@-sVyk_!~p$FA{?O{yb+dK5?ln{4{CeM<@jwN zGQhw|6QqybPb7a6FAzK9`X(=qxG)qZG9%&%ER&!T^WsjiaXGn49uFSyyu?h@^4K!~ zLK?l%AI+qKL@`m0HmD7c${)j|C}vd-L?KCzO0XDQlu*AYg>6OYz;Z)QcMMMxmNg$W zW-(3}lvEZIrePD9<)iqB+!h(qas{%)3X@P#T_qS0cpO>)0XZalU^mL## zjh6}7B6S55A(Eed5W9Oq-BQSgg8dv8EJaqNFS^mJB?Zq%LC?h?n$BTBP@xpL?P+c> z-YS%w+7BdXFSS-k65|?t3HUp{OnpJBG{=dOVIHkFS|YI>7C{VTqokiZmuyKlsHf6m zM7GRwDpai0(MWlUb|#aEm&A-rRpZ5g9VgDQloK;7B%EQ93**)+7CI#1`wVJw;pCTO zHe&0d_*7{o9xhVS;4}%Im+0L*BuvASr+}>)b`uW(91{UB1_Yya4ALl3X4tpEP6Obc zwseUiM3*Fva`0y&e&tJM5+gmV8|xBifxJt zVYJ0}sX~M~`6w*{H#8$0#|i+omB2XV%C#QyhjYl(hloY`KF>R0H3%=-ODlp1lUz@0 zNXrU@1JPA`Ud717){J0Y{#)C&wHMh$#+e{mM?mCPNtXOEq3>&w{8QN}A zpElnKn#ee8Ul>)BO_)evi^!Z^#Ccf|fu6UJUrpMz{hr_2f{)xsIeTFTJgsGprddM9 zcDfD(8iM^B0EefNMR7$KMEYOFr1aPoemE2EUJPxWQE!gpj0+vQ@PL|tv>gO zPkdsCSr$qrlD5=B#KWC0On(ExI!^0c5JQ`u|-QEaAJvEB*+@z z6V{^zaFv)Du~M=HNKy76?*nUPnk|GgbjK)1GAntix&inoa{qFN@}Q*`Fivj(B11Lt zgSb`H)`nUmWJVo4jcyyEJO^efNb2#ER~!>Jmas_`Nf=ihir+o@O(5IcQUhRVf0-Ww z4*}{d4fQ2s zsd~+=whZJ$9uPf#I!}6h*R3=Qd8DA?J#J3WQHb^Vk|-QK$}o14v2Fq$owbCk81nQ0zaS-umidd&x&2$TQ=;YHht zo$NXFllY_#;*}DsGa)0wgXE4}S)5_P6yPm^?G9_TRY-4_9&oqm&-!9!2vM|6(N<*k z*xDLBK9Y3wfalY;iHJ?p=zs5Rf2wx#EV3=((zfx7DC=!u1+OliXj$DKBG(^ zT-&l98WC{grXXFOmUMo)-6qx|+ip)^T2gx=`Fu^1F{&`Lpf8)PM)84U{eFA&&lIZZ z#Bvnt_IjgFAeBSuaGZ83Bn5;+@2Kw~T)^8Y6z$iO#bqqEym6{=hksYj`uy{c&T-z( z)Ktg4g7Ffx0AhpP;XKc%!BcVB98+F8R=UPzVR}T164-5ewqJR6eqPPa-2Br&eP(qC z9Kq({*Zj0P|N7UzerV1wZ0%iGG`Cf)K3H16Y2RUmhyAovRYes_j=k(CIq@{CmOOFtp?+rK9`uq6!f?y+^BNJAS zAg)A@Qdwua>E?1fx(Tb~Ku`(?>~z&A+ai6Vr0zb3ezV)^{2e8>;AA1R!LYwKOjCCH}53|>6k5V1u0R=}dufV9TS!qAB%pvn@;2kHKWVy(0y zc$Qp|psXVE`!^-D0)Kv2bo&zD3<@g{&Tk@QgSwQ}>8uLfolk3|~d@XKb&T5oV=pZ9(eEU(s|E*c|& zVL7qXX%}uQ)Xu0!N3T5d@Pk(b5X(sa%&Nfl9sc-Bh#EAi)v1NKrXnCld7|hL19XTM zR_Pu3Am(FN1JGg!f~G{jYHD%%!RwN*NF=)Xa2S2*BgTOPPke*d9gPko^#&O|KR$gs z@{RxEuWB5hmc%=b^V}!C+g;|V@f4E#b+ClWJSI%eW-c>hT{9drT$Y%BO5Jz(2&}KI zZ4jW;#DY*U-<8LY2@>St!>@ee`0?XF*hMx1fvYehdoTN;K5HB}c<<`$T%BQ<3Ph;x zL4uQHws2hlbKZOKfbokDKKLM7bzsJ__7dC`nEcpd@nih_E?~#Kz|))cY~W$jvYXpC zm(bi+c%B)N=A_G9A}gy_Tor{Q=kZm}igYdJj>xZm_bP{sn5jLHpek zuR3%sK0$QxrWjUfZCgvOMCw+6>+nd#L7|W1IE$Hou>#zp{ThmY#7-IZo~O&mU3R6T zUeTr;#bHXzV|kN_qoR*J_E?GVrF!52!^&0=ErL^kxKw+k{TlJR>%BB1qKizVqvtkLUb z8(U;q?*q4WTkwm}iSeGSb+8e{#0XA`d@fTqaCtb83ednlFE3$eN2!wQkw^`< z6_#enYeG+zAlQYK0X$pwlx2-#B<%r3)v+B*#Msl4$Q!*~KKYkpaSZljt1L@EZ0s{w#soYTh>0cuV;}8y;=C4`4EfpoyAi7u<4D#B;i|XYB>jh z)N&uY25{(@u>psk5svnvFRd|;w;JVsAElWoH(4?MzU)g|7j+ZiR{Hh)Z&^9OmhEnJ zKeh32_lnDxXM@pnwWq^^^+&Ioj>@f;FMWvV88HJEE7W;ksBSff$2&SO)Rz zS?{Hf-&W?b^wVV@Z}xdp;M#Bj6>8dth)1#nkqF~3u-yC3$PG?jnj!D}lwY#j?$^#n z*=zS7r{(2-PIf?GyZmJs-9iC-g}egPXLgq^`+VL$5*$1}Di^AMxo5p>Crvgv+0G-< zOZu1lp^P*8M&ET()kMH|MMX5e@)f>7qMFJbmHsL`u0IRzr%&DJ6_jpmMMs)i6f=uq zR+O(WZXxX+2e{Bfe*ZsS{FeHP`WQT~t+~0D>_w1=C+i92Qp_P=NW5A)ULE?_HeL^l zfvQSNWMh^w8So2y;!?R9pHUYEVa4gg5xP=HiolK0xrf8%cOy>hP z=ZC9Dw+BmQF4tRITRU>y_IBnTulWP9W5-@Tn2~cVtX{djuiN#$PpS8LyWM@;SFSF6 z1YuWd?Hcp$Wo38bdY;3cb{HLW@=eo5!Iuu5zvvfTVs)?x| zIML;`PFtyVXKl5&wf`ope}X=Yjc;+^!t_iF({nF;@4fdvw477a89CQ%QblHcopi14 zzWtYh6Q$ErPO)Ho-wmo?UCb9`tWDzfvPAMCqbWCr7kyR67c&DU!}$0YsxPHiq=bw7 zi)7cp5iJ8u-y1t-WpWAggq>?)MDCgG%P7?2a*lG66*c4a2b@GY9VNQlz%Eg2rc%E5 zW0B2`p2}g9l_hmrmLB5XDZX6k<_qG{z_>Zfc(TLwLb2{Qipoy6TdlUJYUN@n5mHu^ zLS?g><~LtHdP<#s{sHCCe+2x`{KAbr1=o%G?4gs*X*8)w#Oq{gT)4kM!dRq& zwiqmzyE0b|PYH~cJCVN+QU^y%xLR---#HkX*yy?+Bm!8>U=LsF!oJPnL{L}DKzqgc-xLIDUBUjGOp{vGv-Mw>ViRhdGE@5rBHmroz z`}&QBU8^VA60fr`As&E~$%n-9`{6Kkmr>LP#Kio$# zY)*Xr>t8pOL!<91pCC@MkC|Ua(R%FIp;UVGCQ}*x6$iim)o*;`8xI`%ZoD!&zY<49 z6!^1lx4Uz!r^G6wzkA?;2M&Eh{o6*Lw1a=jmh4#!Wm&8y{~G9sGU__swp0BTsHpr< zI%?mWzUD=1(OI`QpTt_l45V~ii5O*AHZ?WioHT1f$AhwMXiu8qQ?LOD4idmbOoLi0MkaRo$<(WlSwAIy8=mG zSSy%qaph-kcDn;5LC=BCaoYS8eYb$U<2JOgufZefCI-?g&6}P5&ZW-P&K=HkoO_)& zJ0C#jU`?=S7f2d}w+)S;DMAym8o{fNrv@!7Z3KtLJBCObQpQT9MN89UA~#!`NE>`= z@n=o+Cl*r-DmEr=bPKUC&}7M%T*&VQCK*?ftR^RaZY!z|su>?}KGP(FDRL5%eP=KOi^ap}&%D0gfyLJ!1 z{Ws)7wT*Aw?$c9_-`rOaGaK#GwSpp-wM)Gk%+_aruFL6W=wEbvb9kpy#@;2T=ny|> zR(`0g6dyRz=ra5+6t&kb4qQubVV#4pWFL$&l0$S!9!NH<3DT0iB71SEQB&wlOniul z5=`kH{|xS3WmJP*FDb#cOiz9qZ#43G=w#(-m+W;?S#{9S_QK` z%{CN6$nEhUj1WDNRL>MuD>6zXG)XTcBh+MgaKt|NVYp!?R?;Qu9;~tB5YLA@X*?Mz zmdM)anno)Xj>i&6O2Ie4P^yTWOtLPzJ(PJAX@kt0WQEHgp{fW8hC|8LtC@WYsU|-T z+9QMy)ODW-Q!_4w(!!@vnzD_i0`DJ038J*)prcYf&?P1jA;OVtl0fo+2Bg#sCt7(50COAgYZJ_q=m%GgzL&`~3j6jI z>)DJu6D8%4vo8|OlB_%ksv+@QIHiDRp2CfYMC9Pu8Ia&d-wA`4jAWc5-cqnd>15JeyIqB;_R*;cb6L>})NA|qY&#{lNNfDhzWRIYfD5Ffz_p>#QF zLMTq9R*rl9;!-3Q_KMNxEaXuRxxvy4OEhXImtQ#P@u0EdrNuseDF79rPDM2QMI2Rt zLjvz2b_CdhnokdWC zcFfiA8-A>iugQUr1XhQ&3d3;Ok|a?&Xr#Z?KwKb#+Arm_GgC;FC5LLq3`F+;n$sweuNdEYOT0R}dtKE)x+~ zLs^S(l7nK1gz1Rr1!JFdXr%ax0P#3OYIFG=Mq(jkVZ~+xo(W~-RLv)TLBQD*0yB_o zgiL`OO+Xa|RH=reoc8!*TB#r;Lod5<80nrukXY^D!pvP&MoP4_EU~WH2Nrd5lOExGQPvL8Y{^`1G$j{Fo|B?7RDoFtJ)sS01zu9cae6Ga zgcl``NJy$(H}_hse1ykEY3zve`5!sd7oQ+e z>688h$F(c_O(?G(m-dV|dM6)0;pnU0b^ANE%Oysg&5Teg4c~RE@4sW?h^m2yxzo-Q zc^(D@OeiC;yc4?OaI9ULDTgMUPsi2o{B=x)u7%s!JvgD-c`F_YAgj@n*7XOUDm+7}}UvOCB)o=(>6XO@XED zw??lw&mX;>;Il@Z?84@rU_L*EL=x&J=|^;F$x0|(4u#V2F6u_e_H%t9ncwUU;k#0q z6m>O~;Y}DA3~V@u5N;Jp#gZ(Bf<@*bPRJq!Om^?t!o(3%;o_=C+?;X{B1+ka=F1h`G^Sx+h2n9=(jy*whqpY0MftF>6y(2xmAl zGX!lR7FWI#i0g-M%XrWV4OG2YwVB%G7{0I;6W9_fg3iibtjq#!;T&u^xGvYr+f45s_x6J8dbF&q)Cl;%fjbpQOxORu2;Y^a#Nb*Cltm{yYEw{`3o?-l7Uk7WX# zr?I8-CO$B=HP1tDn@D6x0YVzZ&eE{oM=9APx`!C>0zuz+*5g4tsDpA05L>ETvc3?h zQabUz>l;483y4;P>E;WKzv=H^?5yESA!RU?y6&2wBDdFoOFoip0=;ipt0u%ao@&5T zUr{=WluWisROniPhc>?H6Uwv$+ueDLm41zu-+}nF+RfRgyJ;|v&lr%%>Tnb{KJB; z+*~-b@e@}Kw;X3{c-2Y&`=og;7dUgFi@4zTNZuLCYx zq*8)54Tb9UW}n&0+Ju8%bho#xsoqANdiIL;(xYc^&69ht&7{Hh@FzBIibz&Qrfo(W zi$Yt7NwHESPMhNBD4xY7&t1miWWL{Z26b6bHn=J>iA@Dc}BdeO3+mkPIo*QcqH8>B~-nA zmqkg}*0~m|>zQgek&E*D19!lj+bmJP?wC@n(7F_(h4b}83o8q9QD=-5H@XOKtnpy< zNddNj&!_KDPZ|VjvV>jByIsx5u5ZD3{8fvLy4Z z+PY}#ePSy`s{*Bb5~`cfVD(oERqxqHheId}=weL-8pFHFam4{oU>`^&^@QxQ(O*M; zN|nd8_2#+9@69casB_0}UxLulv3XCOMgi^6l_`#>ZJ*xu;-R|ACMWY`O#3EN-lXSCx?Ab5^M%CN>gA6@sk+SQ$iK#6_l5 zz9>k3I9Pwp{eWE7+|hR|KY;|u)Pq~KK~noLnWO23FhwHQ9@T#!*73P84cWwRS$wtPhoPCG3uT z<>DaYguW>h4*)WVr$LK>riQJ${NuAg@R@uuhGY^BNx^{LfjFW&;^>@XHm%49y~xrw zY!7UFc}miSF(3V&70>ZcBRzVQh={oKH$1LHmt>`Ym`%`{8%jkt5w~a)(suH64!h7& zc~QW!h`b6K#;W(tUeqYHY+<$RVdyO_hC-l|Tv; zncYc$%`FlPYZgdAOE5t>>v?a$Z?0%+m2%_;M2}tM!ngvn9g0G;)Nv zl5Be8z`=Ro!Qz!*NOBFzmN+TKqQyd;N0*`o54dtBPna;lBr&=bj*#Jm$1R$sc$#a{ zB97c}vuX1h1S0r6baJ5xct4Uq%LH{jtrV(ERm#%exuztI5+ZFb`GqLz85?L;$ma>U z(@k>72?N=V8U(`5Z~%!mlbJ%ego8zJOqN>V@V>b@RC1{(>02Xc^2vBrFA%sa;fz=~ z)|SjmrMIy%W*AwMC`1wm;bABU@&aKQh+r(P4Dk-`lguKLT?A{WjnIg&6o(Jwb2C-u zWyEAqi?H-Fi6k!4@Q%X)lFri%;;>0(1H4YkND*o!ZY$KX$;wn!Q=ksA9l-s#8m#g{ z>1Q#GsV5UfI4K4&YC@$tbRuX<8R{1$g||!d6IhtR86&)-aYMfFFfPm_I&&f^{O`QD zqNaa5l(e~-;cm_gSouavRe zuLze<2G0=5v12=HmjCt-AWpd+JM22*lT)3``^?gYYTiEyqG?x(!HjTd{PRVBE$7E6 z0EMAcp)&K6M~)xe-kzS8MOoIg1N-~__C|{{Q3_Zg9Nr5%%5XN#H2%VTmfWs&VBRYH@LOwf?bOxm<>B8mEv)VL;w6I1iNRkqVIkzp}*O$e6eE zo2~tOFX(TNKCxD-LLd`pFr7p$OWe(blHWM779z#`}ZG( zFc>q$F#t9nqJZ{QbeUlS3Pgr3EK3V6yRNluT0FW4mdA_Wv~i8>5d6~dTijYE5J6Zw zWW_DQKj@b@>6rlzqkP)7^s!CoHmi3N6W9xw)1w{54Ara9t8OG;GV`|_$aND<;v7(} zlqDWyvh~?QCzeH^n2Jpy8|3pK@{e|OF8}ZAUF^Cg=>8;!Qa!OMOc<;2BoC)=?Se^1RlxVmK!*09 zsi5>jrV7qeC%1*@jFU^<$5Y@gP9uowEbB5bN6hZTcFYv01&#?W(-PDsCD;9I>2}}6N2Iadr z4NcA|^j5HRQ%}$0U0c{sjKb>$>-nqtxA4r}Lfhzng0IGvY=(hyQJ6`(z%Y+xB+Fi0 z!sY1<5F?*(|0rU0U&S>%l-XFdSq`+WQ9&6Ki)tNia`J#$I9(PN4tkqK>Hc`x>?_$Pl;JG=5*+3Av1c>l~k&&_ah(qNOxJsZ-`uZ<(1dm zaOJ`C9(?e@S1xuso#pP5_FZ}MqUEl+RAtOC7#!LSWA0q~@_38Dh{?{;Z-fDAGS6|s zcWwql&o<_krRC++7r*$$THy;*qaVNZ)?0~#o%+M^i5o1fi>sSU-3xBJ?Y0{(siB3; zPdzn1m0Hs4?N5E`Q>XGIcNYCSZFRYB5bJ~Ce5hbAn`CJQ?eMquW_2Jnq0D0Cwh4}OJ0t?B7$zGjstVPw$67pH?O#2a|5jOeJ9eGY3XO6IHsmr&Eo98;l~tm)>cBH z@s~D2Cxhnr4qprhuFenb;eHewm4u_zzGsYn)13dq*V0vAe{3EfuYL2!_Rr15uw{~c z0A>URH4AxIShYM!z@xujKy2HNG9l&(7Vs72cB$Ch3^QQm*zE_=kI4eeoElhr)p={^ zN7a7P+pDX!dg&NiQ?)9j!|H+|dX%$mYmWv%M#97$=U%Gj+m#wwR%Z60s3ZH784QAD zthy-BD$eLnV7$y_XxFFe>2wHW&SYd}b{b~xGV`3TRMTmfsL*Vs_wcWkN~O!DO9)w< z_v_(&rRQCSL(*l^{#_a@-*WfecgN#*-$#TQd}YKGF$xER=O;Y!^v?blsY9XZ@-g}( z`s@N;mH`N7)`LS+WH26QY%zs>$nPw>L>GqkaM65n=iToyJKy}~C)>P^-gMJZv-21v z79=$jxZwu-MS#oKn zrNz4V1KXl@A;B0)%fczp>f#!Pi`0vU4>NlA~GS|168 zv7!bst|rOzhc6pBr>s2?Vb665B+RBWyC@LAi{VCt;YSoAr~jSF#_KWNWXLGcXg2!0 z`xYE$Vc%}Q*=XiV8PWr%L2nC(h%zSAY_$bFF<=;Ow5qkK0v>Mg^~A{8e)~N5P9F=@ z$O?C%;?C(KDV!!wMt;BfI6>o}&v66O#OU;Bcv@dJ=PkeGr2+@am`mLtj4%Pu{>n@ldI zvh`f<;MYXe*H%_Kz*?l{J+C`^K$KouPtH{(?6z0 z5SevLme>$nTv24_%$~p>^7`v@Kg|7Selv-gU;hZ7b}xQ|R_3A)m;NNX5<@Ow*$#}dKVtm3hYBexF9*vV7QuY(!c?63ZAZxD zSN8jRLCW@SU%ApI&H$Uyi}J-{e!SUU@i)xJ_IBsq?a}?2HUgs*UfD-u!QfZ@&95G4 zXCC!8N8j`5WdL7RJyU@>5a`o8A}4wPEe|4(MWsr#8+J+dpG}2igIhPJp7pF}b%xu= zk8ck<&${D|(f8l;04YEBjI!hDIiXKRf2-D=84R>|$sh=kl?{tA z0@u6AX_}P!%&%FbW!q1i8=KHucH_Oc3U^|4&DQj6y%sTQOJ%PTa22W$PIX}Bi;YI{ z84ImJaAkF8XLZ#XG#A#__kCr3XJ;)ILw~Uti(j{}kT`ho;)@R+NG>eYD)Zah+rxd8 z+8^SrUCfen2?YZt?8s|EVSbT*+liEl>tXkoT{Gxonl9C9rQpSdSgi2*TI_+V$kQ=* z)dR6wvw2`?(M50IhRf%le|~diwROYd;?m;v24zd@gzB9e`A+QFF0lhF()mE4l&p5;!YX_2@K3+)+AbKYF zMXT1@8a^6}9)ZG02?Ud{91K3>1V0wk-x>(~CR}F4*z}^&+)6(Gkp9qHKNO92C2#uRZqZ>SC z%mLy?apdu$O>QM03Ri&@GDjHUfxwQlW7^=KRG}tA@X~EWh}9g42LrCda%bYuI$^lw zqGi|=;mXWpo}Srp&X03SG3R)h_UO@j?{{`ar-;DaX}9m!*UqD-PoL%oKNZb;`gFT} zx_$4dQ}^EAzLzgHK!FSdjt~dFi&W4cV&yJyK|gFIy+0593u`6!02{atb+G;(bfXX= z#rM$fmf!GsP8>@Z31a=#-JBv?$siz)(V5w-r_^ZEh!Nqj{EIcvX|%0_rzHxc>x{ie ztntU^cr?al7WIb1a?^_#r1RY#F#l=11zIW}ODn&81${>A=^ zym$zGerU7=OUp3dfsLlNi82M?*qVUNt^jk*^rvd3W;(qUv)b*}evyXnv>c*VP(a2h z*6MUxriM>0?hZv9b8F_kMKmBOfJP%lxlTocZXTc0vPsR&unXUPFBWujzoCnnQ^Zpt zX(W5y6v1X}rKbC-i_q7D*p_jZi6|rKQO^6nP_r~@N2|48w`Y|I>A(pXr;%Dsw}(8_ zhsEsnR``uxA>ZfTfHq=xKAS5{6T(?6DnDznSg9>4aRd64sc2Y4BqQH42R$|uCr9FD z)CSa;wGLKbD7*AW9;I<{hcn0y z8u>15BlC8td~LARZZrv{DwXCTO!*!>W4dYpjsd~A&?hSmK^#uCM#q_L(`hd(tN={h z?%=|j-8pq?2YzAnSNKHX)bt;JUicp$_K*I*SEypbvBOtieORFLyEopr3pW%DmP*@> zCS3;6kKE~K2+6XCC2d~pUnLxkRLTn&Z>qH;qt9G?05e@8Sw3)aztgQRJ7%Tc?ey>1 z`<%Ov_XE)rBUa+R$2(@*XmZy7X9Z`2!CFPSyE4KKb`7Fyz|?|&@_D(kjf_&1%`S*+ z&qRy!4%T&FTcXjynC87kuoTP5CIlQkvQ%c!WYmZ#syA7EeL}o77z(pFD+*o~5&@L- z%*s?8uTa)o0E#&npS4LPMF{35)K+@5%`^B~Tu`%9GZQ^3RdOSPbC};&bM((&e%sql zoj>=S{o>LKQIj#z=a*l8d~V*n_QZ)3*a4HN6GDJOQNZsLCrCSvDkl}k?3cDqL@dOO z8sMjlW+bT-KBpNOz4p2PhhRY3KtD8({tP`8&2BjWo5sw>_KLZzdFb%v&t2&>o1K-1 z;>1*u-uHIA_Y=*mTXVA~Nbo5QwUSf=5f^l@DMX66~>`RdT##h6eX}k#LX48lBR!CdkaOHQmdwLmeovTsi(&*0=N2(!jrYt zUn}{=Y3dKC8*l%&dAZYSwu4T#QL8zhCOdaN7@EpJ#Ow71WSnSlo801Z)oZup#hbu% z2^u7_(r@5LI)zu8=XFe*pon0(=>VOgy{%xadaTZk>f*e-;_t@|#HbT$E-*66WoMfg@tG0*GJ2SJ^pH71@TWudac${PgYlNJmUuc(W z2~tVU4))XEd9L|u=z5yWu50Xdbww+3{BPHsnK;EwCY^4|-k>)&(uz{g4As;A-7+`X zGS547^>qghI>gfDlMQlW6{mos3={pL2-bsdtSm0f^c{4OS6zlK(&_gX_7$H4&#|=L zY=uL0e7A{)!K7Y2I6Lc@dyg9D@S&#;`ZKLocBTU|3HrLKmuEKJn_gj{CTUxXyOwsX`_jyh7jdeyZ(juDm~@)HC^#MmEYe{uk(_Mha#&Dg z4s#yLN&H2Cqr%!>KxV>kjV!=|a*~)NGnl-CCq;@5NVJqar$o#wMxqu&H5ws|Bx=5J z^UXIOy!6t8L<&KSpd;CAEQixhw4l93oDl#LEoQT$4=pS#A3nUixTw$HL_h6cI|?!u z_rp~LONzXf;8z}Bb#%w}(owWw!HCRxI0*r+C*_!b|D2^e(EaEulI(LY!);)oyhuFW z%3_hq#BpH4N6-wnxs?dowjy@->|1pY;m~D`-&Sh0txn6+I|3DR$J)(3$2hVz>pz98%>g8IiwcMNT6Ee>WsWeR>o^i9Y zbIqS2>I|A4|7@qzQE(F{ImwxR4>hin#9Is8DoSV4@`;Mp3xE`Vm=uUvL>EFVa=H5K z+FDD%+EXg1Tpy$TsUk{41+3J>Nf{5lAa#JMA#!MzDJMZQ2F7@*jMXoV~N z`8w#SxLl=@*?fv6x*#VYRhmc*y1Um<**`z)& zRphI4ht5Nnmq@d6MAD>e&Inx`oH61LbEQ&}^k*zgUYHb9#Q2~(t(2RcYAsA+IOaZU zPBuHsQ`T`#!NN=v0+}6*joxc=Su)?-h#QpJcn9J9!-_|mN8EWV$cr5F9I{s7jTNin zx|Ai!Bd&S-&@mLeNa}?Ss`8|DkfT}DHe`>$TaQcPSL-I-32{9PW#Px}*ZsIr z!uO;^cTF&tuKb-mmVj&|V#Y~D!e|=cP=1TV~zw%vhq zkRV3$rMK4#_zR|<(VcH~d(Ae)=25)fa^}YNbiaC_3WwEbE{q<=UY*InKD_$onlhfG zmM*>g(m1Yt7j13DmE9}c+a|J#CyS?&@f%+Ey4L|W9STm3-rqFuQ3A?BtF^sdC=_22 z15}NOy_Kz=e_nPqT^0QblRNdB=A&T4G{6g3+m&r^ z>_u%YcigMb4O#`c?H=hyq-n957`R9jG2+Epw_)r>x2z(^C&iZkKf_Rtb*j>Uh$s$p zl1?@s!>6r0i!0L9T?+WewW73gu)wX}b$>Y#C+hK?(#Qcfo_pb4cim+XmH}Mezt(}5 zzUwXJyl@slLM->GqVB1j{{K}8I#%lW0?-@f+lr|q%}RQ)(j1`O)#W4qLwVDcB>fk3 zm`Z6`Hna*re zS~*AR1IxMWIcjbmjf^uI&D97FAz=`Z{^PBOkwA-1>7A)maht*UAevyl&hEthgYrLo z<}XvMm`c5~|~jt&^lQJo(_t|eUKQ`v1(C&cKDHgK6i^UTg|S_IKCp$ z7GWh9$3a(ck{lhZ>yElar6<~{;b2hWOxqP@-=ZOsJT6j%*Fju7yTk0D#wCFjpg_}G zXEt6I^>9RGd9F`8o*VO`p?h#jC2w)WT#Yj=GY8ujSuN6;ZUzwML@8|68F8tEdnNJ7 zo+~s%m)D-{_Bj`@SNdIfDd%5zy)Xc}cd%kdqgl`M!oXZX6$wi3ck>0@*UJ|~$Q(#_ z+8X7WNbS$yN0dkw%Y^!{@8Bun>D1;4K$_G@F~ToeLc1^`qT3E z1^(Ez+JoOiN;3Ul!3vlfWC(HJdis8oayB-u*}>B7#FqMV9b(Phsi|(Ve`VJ<-i}oc zqgUQ{-+dPyg!b@QkA2cP0)}ahHE28VV~W)3cl8w3BVf{#^sRQuQ)aSj{hVDGQgEf! zSkpLAgN$dbmS&x&-~Lj~+_bf5j!Nv2W1$KQJw+M>wU4NU_L(|bS~#Utn&*tBpY4CK zkEi}d8ho;78e=_nqtrXfU=6Jer>9GG!1l@>(+{~Ow7wqV3%`1gg!60l()9FjeT}%j zT5a^d78hWls>-p_OszY?W4pK9vU@D3?{86|F7?Ep+`{(sRE>CnVj3ULs89&9L~CvA z?rt>eb*3lyn)vFbi*71ao0^_mTAKU&L?IIwurT_}h1u<$`FY2gpWoTpH*eR0y|nY# zkD#4-CN|@amXf2TQc*DGn7wwyK?2<#=*~|_^?nhB_j5^$Q@-SyCtd$mn4$Q)5y#5G zS}h&A^@%Cf=!W~UtXa3*@}Xq%A)H;zkK^4FcMl`OWXa&#XJF9>e66?I+6cK8;kjRH;;=HIE?OP}!}v(DwyP&J_N-MRN!Q z6jKeOv}lE=qLsP1xkxY7pu|#Y@FdKi)#2-An^+AEbx^>X9dUayzy<*vbfr;@8&Ox@`^{9-cMO>`C+fHTqlL2hX|zPiKC zxzzmgAWA#2<3CHz#MD;yJKW$+(PxoOqEuQeE#8Fp+*9ILJeg{CYm=Oo51WVKuM?mY z-xRomaYeIjsv+TthXa22vrjXwXr(&MKjUg9?|Ba_S+j)AvfnavYl@1Xo%8lMNvr+V z@EgaEAK%(Kehu?0O{NosqH_PBu;B(X2hBElmP#oSjuVXp$UwRnomp@)Aeq%_3rq}5 zooRBpl1Lg;P&ySS$9)>xFkGtsi4|_#^WUnkeB>05znPet>dn?0k*(Omz9UB#_C-g> z$jp?Dr_#XNkgY0}Lc$7qtAdQ5Z#Bak?!v_Z>U7e>*pN5s*cp@N#>_*@w^QZ0c0`{1aDR zx%F3M4PIM67M|$?>iYBBmuI`ZwY8leyZV~7wTQjmc>ONPKTJ?zXT7J@zFUmm;h2p+ zhd`cw%Uj-pL2P;X{0ju+yu5tDp~W{hN8f=GIu6th7bkshnYX>|ZTq$_TvovA@`d^~ z{kOJW=uG#AHh{RV?`b`^gJkke^Ktn1y2Xi;9*|3_o6iz)ZPC-3O?H@^JtFN0$6(et zZdGc-5+jQDWH^b=msQ`+!BF_T6Hk8fQGFA|j#9w&=68Ue3=1x$9(@6T(bb|KG=$qdw@U4>Fqzt5?#(Pzs6GXIaS=Ls4tE8<< z`_0R+=l_c99dN_PJwlVNaorm|@8{jfq8I)OH}^a6D33hy2t2CyWiPz%SG@?4;qHDF zy(#S85OE(+QTJWc@}I(?1=l?$H-M{L_u_E)t>JLj^*#e<`F_`Z>6gF!WtODydtG<_ zm%`xz1ZJqBH@NPFVfQ`Z@U%OT>yS-OqhHODtKb?WyGdL=4<-|V)dS(DBNoUfDjeXs zAkrM1iaED>W>eAKhKS`|*b+ z^}%6LhyR|`!#ACO?%S_f_o7IxqCL84^DqvaHMB&`Dx6$=5DD0EB{G1`#-~z|k0=BQ zltZ8*;D$g7bYosTg=qj0e5=tw%}3I4MQ>7%yxFae3)K^PHO4yLG|X|i1w`QD6|N}Y z8M=$QgHdH_!(SOu4z{d1MV&xuh#}KI1uQ90-Gufj|2XF=R1meI&@gQESfu#D4#n3o zf|6)7osgiD;q8cw6fg#HwV}lKFDKU^1}TIGDkqpvs&MW|4+wy;^5aoGKBZnJ4Q&Gs zAWFUks^$=+hcM8fDOH4DgD1rtnsjzYy>uoDsHY%)C`w45Zc+D6Ge{z|D#;L(47F<} zMl!aXjYdS}hOotbP&N`R;%Lq{!F)wfj=4)5Cdj|eaT(gcvuXo^OmwdJlGCKeeil9p(tvG%CHWez-(A5coMZhPPUcoCe+@XUT` zxme}wTl|SQxB+|4{h$2ukLwKab^7PiJjyt#4Yse$Mq;!wqewQB^PaX1(2`fUZae+b z^oOqc!1HhWLF*-N%&jhcdf&4W#n4P6ffE&S25<{lATK}OuO^gXS;=b$Q>3W8IGkKs zKT*kT#a^6y*2`utzGWtN%};LM9L@IQ)exX6vbYA|umXV-*dtC^AMd9Go)vf*($p{F zo%H#@_wgK=h8Fn5u{*$$z=ZL`?|m^6eZL>as5wdKx9|4nGXau`l`ndi9*d!&?Z-2S!H#0aftF%S^xz9Cq4=l0ANvWQF4mn#4~Xf_`j(d5Zl)a zk8|AmAz3vZhExA$$7d9EgF5UN;oxM4yqCm@`Uk|k_ndo!$4}fo(@i99KXJk_YfHEq z{op}TRNS73cl)=WI3C1hXmQOPig+o)ry=r8n?#Jn#E}SLiTX(>7P(4(0$&T0VPP=o zZU(YZbDY{hSfH|&@3(vKKC*jKiTx%z6G=OHCkn#Z(a0c@0uL5YoM0-l5jm(Sf@)in zgBknKYNw4m9$eL8hjf>Xo|r5qeW$aAmM_y;oHZh5W!RY@^Nxg@!pL(oqhC zl0iT@e1Q!Ll`J{Y2kkNgJDrXcI9VI((yeA>H?Bc+br-xh&6A$=r0br1?Ib+n-h02g_<~C=dHaFQ16PRCTHaLsW!o>bunb!6 zVKQ%C61WP9^%m&W-FV!;Eb!Arki9+dK0FJ5EAZQ#D8E2FO_)G-N-&x?Z1Oj?+RQ+X zBxko6&f^4e+dg>b-u`ot*gLUieOU}{u!qaEq`_S&~>-pUU=T~o)>g~CZEdQdFP#u^K2AhxBmyP z4?O$X&vu+UiB~_T(CEv5@fUxQOO3vk&i(hvfqyWoqu({FvB>B{tOwpFu!?BCdwwdv z=@)5(o^Cz`&=4>L!O(tSbTU0qBoimHpA64B=S5DXuZdL?ZzTdW_E2m&aU^nr>E?`X zO=d}%`26rY(q90K9tCY*NN$m`&(x^k8m{KKnf*tu) znVK*%0*{bI(Uc&$F#Lmf2vQ3R2;$WUcIZk$ZbEkqY$+}hAelOFMe(;KiliGS->!MX zk#>jp7T4?K(hp}H;eF+^52pcNmDagFwQ4VdG|dI9_aqz)5o8cKzAAtv=PKl3BX~v( zl8_K679PDGpLq~GL8{|S@(?@D!8C*}lu7Nm3Yww7W1lvEM!vura>JE@F9*IE_@AtZ z=pM)GA=)b2c(#$O6oH)WI~t8Og##-*A~1+QMPoQaZ*75y>xYz4h-O~HOO~b4lMsb{vVu{Zuh;~R1$$Ep;9ik>KxvVnCU6fK%73}!7gm~+9<{08FBt{Ch|7}ZJP&jNk zIZbYYHI>^E=d7y;M8~GXp>FtSt*PABnIEk1XMfN(tu_(=JKOugDI0I^-)4I>#3gEd z=&#Q zAWgt1BlKXqfbVo2Hv_H&`jv7FLmuNU6~Q(Y#cTF2)T5xBz~pfif&=P6y})~WPZ@uI zbay!HwA0ism-lQ>fn6B}f|ivs1jFXw@B4l8Db|C-*h~U>U)Lc!r0gNm zh?Q6k8FpnG>+5OqYuSXvo-M(M(tujc+VMM{>W~PAB14BE>5FJ~B`yCco(=6=(AWsl z_xLkP^a#c!><-0SkFyi&e(RPt0xOcj#6_M67zZQWHg;fFq;m6+QzL4w}EM@rQM5jJCa%ie-yW*X3%rf`I(VpSkK zNIUnrB9z|6(8XT=U6yuSN*TZ1OQPzYa!u(s9xqw}wC$OXN9XrF$>~imE%(-8s&K+R z2%{(WcfdDOnIrS_t`kaE!7_@VRBWfvOBD+VP=KbVH?f$4q#H9V7h35S8nXj}*Dsvu zdvzQuUMD`#v|Z!Q2MhRr%&@h9y+^y3?Xg~W-F5flH5ZShQkiVCiAb8x)Da{TST+#o z!r12Hh$Eht&vlsQp;#nWEyg|bhIlR~K=0=Et!S2KXLB2vLF7skL+6>rNrw3nPc)j_ zrw$*P`r9S+*|>^1aHNXuUW3*k%g)@6@@IGJn6X|xHLDo zFM&P;l8>bh|9sa=x$faknX5jB2=*|nT)5AOPP7r1&2}taojxVs#OFe}5VRcU5=b25f{pTLnOe##cae36fwr z12wO@YfQQ+!`mkv$iLu7+vD);wjT$NgR|>90)>*&i3X*^AW1IHWy!1-HtFD}UgGtP9U)!VZwF02sBOQYFoaOaY+mQBF zf75ezkq}8KpV39_tyx!)5mndL^;FN~Thga$*WSHXkkfmaz5cnnmooRKdUT)aZS}eq z#&vXDercVrH)omC^g^1UP7oEnB6W=c6 z8uSbPH+egkhoM1XE0rA#iplw8i9|xFVPPh`wdD?qo9T3ax}2C#l-*D~7|vE)GhJro zX*L&U>h)+6F3`z_U9z!yM)u7pNNT!+B4j>Pj1y$cjYW#U^x>L2l_&-qjbJfRmk&z9 zTLeLe``~WCts$NzHJdE=W-{rG@~o??m)5fB-b^Vqmo5yZQ<;szz};Aa(g4yCP| zjMnRe#YPhhnrW|+4F?k;wp@>sT1(4V*_u-9v7 z@AkLycPSItw>r)9juXv4XqDv}O+YOM@&Z~vTsn*0m8;5VZ0%k*(p+6Rc-;|}T9ObT z)RCqsXws&9zkYBeJlFgzePF(a{TBQ2#zNOq;-6dBJk6M zQA#G`-QDjW(c-_6lGTFoX_;9zc{QpMkE^~m8P zo$@Q@TJ1D2f-#a3Ic^6>i8z_bm!?W(x)uKH*Kiyn$PrUTtPBG~HsAP6y-_PAqS>?#b0=LsVI>qP?svT zTI0UYeC9KcWYD)=IX62Be1?%ys~tUDshV#wrL2B_iRb!QgYB(VTB)bJ<+uq9)n}>@jn__cc?dj$XM6RLE4gQa3Zm z1IbdPiqCf!mCS8`fkro5Ju}@}Cy*91muotyd@^nFsT_pMfGjZfBqYym}_L5kPhZgogL!AVu2z$&uyZn?+v^gjI2Okadew>JV7o6np(ag zZt;oHjlwKxo9bF*w#n>Q*OP31+&O#uUZWS~j79*xPB(GN*eIZDYI$U?pXpNU2I^9g zc!`+|aRD;@P%jc;ZUb-365960O0Htcg+D_OD~#F`ymIrXwnjV5T?LvPA{ZDiO(D{g z76>C8nzBfN=;cs6DqR43!(J*9do5@%Bo1yU_t5pu48HNiwPXvmzH!>cSm8F-Nn(jh z(@qF2WGK{#^}ju3hNgB@VFM^tl3yI%Z%&QwKXV(WCR;B=6;78XFF}yQQvu&jcsbZR zA>M=1Sxm7GNM{!$QgEw~NW6BL3`m4hDpCejjpIzA|H)*Iw@#kC#Z8;6)5VoXbbAVY z`EB?l)X3_0l1P||uZl3mTunn-*hl4AE9d#imPTxLWIVTc{6tK*BCMQ-o}jA>>Wv zVi7*lO=lW!NcX0ZEy-aJkJoq05F%1Pnm-=uDROSh?S=AVCCCHqk9w^&*# ztb3mnvj@?7*}|S6^14hsi;qUIfofdY-1ODtI_=E0{9{``Touj0Io{;_HC8j*n7A#j z^gNFx$KJN8AwJZ0f*rdJRA!7e@g5W>VsSa;C}7>4a|L!e|gf z3&c}#MJK!vLYqiC+;qoBKJt-CsSDUZJ#2zEhC#{?y_^M)s5|>uRh*~nQ7WTY4}LQk zN5?a;L?yQ*)M znLfVot?9*HYZ?$y+q+-K1{<5h0_u{nMDG{Xr!UD*PMK6Orj3!%p+nc7fAGNUAd#A% zzbYA?s)Z9IVaOFo30y>L951Kvst(0xd)<=!!-^){X&(;b-spt!z$=wot!4#umGEo` z`No8{x|^{`4<-4DtG2g;zj6ESZZcA-uB;w?>cy9I-Q@Wv65-5jvxLv_wip&%dcj zl^hYrs0t@fY~CwbiunS?ZZtbYgoJvnRgqbUUy%xExhHx7$cF%Zfcy^yB(n%-E{IY+!{ImVUCGe0MfOQtt5 z+x|CJ1j1c_1to`EtRY{97T&puR*Ni)!CqJA8RpL?=3Wm$Yy9GR*&mJZoq^8!W*5%;UCz5>heYoL5B1c|7aMjzbcIWA(B#m9E zP7~_k)N91rWK?gqnJ43Lv=Vl!4T02mI(MP9Z?yLr7BcKG$YX{=5S=hJEXA&4xMhzyl9lUVTyZ@?V<8E!CO3#yk^u z?++Hzy{a96mI@@ z;@!U%_$WM=dZ&s?(iJVNIRF6%fH z-N_SkQUNqR&Q@(iOz#lw!;NOqBK+e>8L)hw03v*0GuGxe47* zw$t>=b+i93v7uyFf)%Gq)`N7H3DZrZ>jf698eAd8Q@jrE48$I42?{>I$ZkjOz*})WvBrQE`4w@xLb6 z1-b!ZmH3fWpTK=~FesLCv&mM*nwgA|J!&^(Yy2?l!MBZ<2i< zvoPa|QDq4;Hg>irsv!2;;itjj6JEOXJt|P0uEvr%F*QC9Wxv_;&KCx$629+3(H!BlOe%m@W$V0;w?e@5wU$->~`)WwQ zn=$hEW(K>sP@4=fR_Ex~=AVN;QjR9PsnZ|fs?(RcHY~ix_nlUMf~j5j*Hin4?DJycPzrm$T44il5mrJ<_^FA^k}?0QH3fsrl)!#K|2wfF+%+T> zqaqW<`nE<(P*V8F2(c#;y;$0yOT#F*lfPO~>M)$W*;iU}eEe8dz^YixO?C;lL>X zNEIb%!NWb`fvIbg9pdQY$*5`EyhM7Oby?JuJC*dm+(RsjnlF!X*(lKr$~W94T+Hav zM2vvV@?Z|56UI@z_y{KeHh_t|FuEEiPvB-k*)pkjrH+G5ZN6HrOGFJoGDwsXCU}e> zmFGxU=NG$Kj-MQgA{8J+L{1p<6xP=yGDS2&bb=&Pf(B!iN;cu|lc`4HDrr%$=CYU- zW5NY6a)iiZV52E9EAyKUTJu|_twU?fR^OuY`6EiZ^*9VM1hR>EjNO$4Fh zLOrl|PuEH%Y;MpH@=cQM1N05S+|rb(TAE@wG!pYg0UU-ag(f1ImjpX59&+@@WQ!o&3N`uks;;>(!v<8e>>f8`=(*%*{b7jtQvz}KhMK_VT@Y!@-{2l0tyeY)+ zFaZHXI#FIW-XIm2V#_LmWE;x!?uF40vW{w*T@9LBFT3or?Ue@~ee|iL-`m{WeE##c zKKMa%?{(LW?lt$eKli!Ow@e57QwE>N2hIJgoLPMTEK(rW8!21!TAWw&L9U@INa2+K z%}X!6bY^A-AE)+%54JC7lGmO+wepIOKJ}@8bMeI&kN)QAPdA0pKke?yv6m3sz_qN! zv+x2%bm;qt=D#`c3Ui@(64zn%_v@5_qBr1rI2B306?33R@P^34S{tn<)M|RIN{$^q zu$*tn*hAl#;8w3@DM^u(Sdf9S`i&XSN^cMN>U1W*NBu({OA)>L1`Xe;>tub_P54oS zKI?+e56uw5y;v6U4EmNyOC)cG)!hEFalTsH^~>idq|viVJAP|F_wWSAM4zOteZ2Fu zU)NHoflP1WT>L8!=qehJ`=W#HBGzpqpFMIUyU5m{aQ6{yE@qFMOsBt+n|sFGhk>6U zBSVVZ&k!+QxX8$H4Oe!#$NEN< zb9u~Xt}C#@)&?KKnp{je#fJT5B^=p z2w^8s+5bhzdHiNX{}{QpNg#_-(hb+-`yukb{ zEB}mqbXcHJRxxodo}{0 zmDs+T$7uYH*E>=JHGe&c<157)-<=S`RqM!bc}v3J1vssXd0 zYSL9SpQO06xh^FmE#V({x@@glH+Zd29AWs zGPHd#!Rz?^yf0YWoz%n?tP>PSLE?9?m$Brt{ts7t2q`#ne+PGt%8<^1l51>hScYMR zS$kLv=wUDqQph-rD#=syZGxy1H$hZP+?F=jpS>`t(G`&&O|txHePDHRUHDS?0s~5o z3*M;cIIKg2T*+Jsim&CAdB8!0Ms(K*ovZ|iVhJx%DC6Iz)sz(j&l;EvNntp@q02%X zj-&`Bp$2>%xCk?si-}Kg!HANhJ9#q;`-p6bMaxsLu#z}=q5@iI1#Pg}{@|0iZz=Z{ zu{Zc2sRnIJTTO-KIH(SwgED(b=5-CEfb~yz5iy@aLdPE)9s?PvsPBB&{=CyVlnIUecd z#I==6B)F&9oUHKJoJu(@O{bcXwnhU8A{U)Yt>9DV#_LubZP)F`GxYPN=Dg7-{&jSz`KbQ?^-M?XFWf8^U5bGhb>Checp){!3yH<=GBkcNLo@eD-O>Di((khI3e>{Kev=@oN zKT+fbiX`S5nt*EN6z|L}FCnx_^SAb$7`-UKsJ$nDQ>4_b@n9i$^d!3_#iB+)p)>tcPh(nP!w5$@hQe2h`dZXlZ!j)=j#@$Rrq`JqGvz*(^IQLb7a0D zg2IOLLdhkEFu8=G_R@xqT!@{X2{b3oa%*ym6PhRcBXV{cKDk;MT-NUyL~#qPO|*a$tX~~9oO{W{>d~V|XEB(jv#;56DaNy7^9a3&@hn?uAV1dW zh)IHT6MG2L_U^a8{q5HsIRc>i!s79}pF^Irubb)7*YCOKT3%oOy5@y=LfOiX6U(xM z=lk{KLB5xmk`Dwv|uOQlrs_l z8DvAPFdBXcjT-~$aTw!b1JT#0ewPCRbn!Kvu#OzpqfjYt-%p8?d)~}|)lsY^>KE4= z&!AsosZWxwFbdgoy4~xLm1Y*;8sHM*(Hm%kh0*Vkda_iKN(IkiwEQ>-RV#IVVyel| z4OeF}?KaV~g$|#}CvKjMo&b(3AACI@c4q+BJ$7HeoFmc~szO;8?0`emx!koP$H zhJwuT;chU0bViHSJ8p-an`0~`FXU)Hb{r069)!bkiEN$Rm`Tl29z};pTQ~-4KKxs` z+?_?281ImO%uRdIY})f0#{m2JQgj{hBR@YV6klv2yO9L$wbaph2fh+<=-Ughv98f? zT5L6?)hiR-xSiIlv}%3&!gAf(_TTSvmOC^3?gbZIyRiWX0;r~)mO_lv>B{u{T>p}j z*AKVsjdeO`j`6ANkoz?IYBb05^Or6+fP(j`_=TqRMPC6j=~5g5#1&kC-u9XZlpLa;0K zmX>-w{2}VdsZAJWuYN41Fm_h zNN@b3#xh;YHwf^r4V z_B@xq4{%?OI+*F;h#Ev!qLv`(1ZgFB;rSJ<63H^%qed7uSxrrsbuVaMj5e2xH#1iA z6O45*lY-~h$|mGiM(I@JfW0;sVWH72u$P$Y=p)*&e~3Q0sPG?m73>qu-W3yOZH|MNOW29Ou;P;;f{xK;ol%)p&-C@G%O3Ld8X%L7z8vI zhEWDVh%cy$x(C^rXg8dMUoKQe$|K+M(h>fY3`x|6V*I;awIzNq_hNi_xIVmY@WP9b z31G2>S1x8-ZWpC!?7Hje0M0Sy86nV(WRdm#h#qxz%>Arsn}I6=KNt88bN2>Aehx-G z@Uu~fFw)%rc!Wbv1t%e z=+AkpfVPoj{`DaUA`)^onJm&0u?r%0XHMDJd?}Ntz|@IOWmD!|p2sI61B_1P`-T5A zvybO6^}9$18M!;~3gHZ=@q?z(E5*aXYDMD^7dFHj$21s%!coAQKmrBxvS2!m)S=N5 zM7m(&evC(Kc6Ja)ihL~c*c_U!4Ol?zYRO8ADUPEM*<7 z%1h&Qq0sIHrQ+=DRBd}5@rzI|Zfom!y9e|%SAvF=%I(&|ARKg~Yoz7|+%<;=RW;_!R0yaGYgaJ$`@&gShVjA`E8MHnar_t;9vRy#t z%YpQ-p468xj-J{6`Ms~-0>l1kCOrDLpSgNoA)TW@7_&DnOP7)1E$mI zXi8`8Jof>WvUdJUsVj~YP8;5IQ#mrFBNS_l-p{;p^pLq=^iT~G9Z95W<^pJ|wyLAw zKXvNVk>{NJ_SK*dVd*FgRT{`|A6^T1M||C_TnftT#8>%8lnQ*}=5d)29Zzg2hbyVk9H zyYKBaNvG4D(CLt!ENmfQ!f3)Ki-sB5lvjaKL;*!*5XB{mf`cE2h=3b|4mz*PC`R;E zXGGueo!3_sxcz>A&#CI}gb>42-CK3)EYJS@_r-)+Fs-?iBuuQQIU_>ZG&O`f`|jb> z*X|zf_2k-qc=y`Vhh-uD*wWIXq|2&{CdL(D3R5Rp*jq>0T3GE)N}>_Dc&@A18}Cm$Ew}K>%N1>tm9Yua?JcY z(!zVl5vo~oQZ$LcPELw!Rl1+2IQ!W4_VxqYk3W@P%9|_gmg8U{Q$+}&hmrAAFx_*U zR{P3xRmuNZH;;j9l#A$cR_h??kXV;KX3^v$LPgf;b=j}#M z9<~1+G3wITEWZppnD>W1DmqydrL6T#C<}NWlLrmKWKVGt%*nBWfiqG7XUHZ;ct=5u64Q^uh^YCvIV#F!)Hm18zXDT{Ip3<$+vr&QRW>zRe}sT|%B3xUIP((D}EcOQg4ik za5qk*GbRN^cMey+j9)Egt#CFMjYJQ=nyXaU_s)V{?XCuCcUNnO)(E0Rz$4-teXkgI zvG6zs5wG3qInHl7&d2i!(uLXw|J`xkY$Byn#cPnfy}4g}sh_BNWK_m`JiKDZGthw5 zX2ypx!`C6)%SNJLj9Rhq2>77vFZ>c<>GlFCeOC{W(f31S5yle=1|(l60;csPDn`;l z#WVw0;_+XBr@o&(yNhkpb3@9{^HZUab;*Um5B6%XZ_Og#90#K~9m!xU8Dw)ypAEu= z5i~zOcP7HS;d*sE6VAwD*+ggXbdm{XdU*!{G9+x4r6l(HRQ-&KvX0++)m8H&9KhzU zy6V;|k8i*B%;J)THUF7wZ@=>RJ^~HcubG$FYN04IP74zK6&Z z-yZrN)+&7!bx1D+f;bXnDGTDLf9i;i`8I|*ed|&H9-S_g#qe@8Cej~z}~ z_p6$(f4`k2PRCrM9wSli+*@ZB>vx=OcVdnc>$K0_5u8hv4!+?0i1VaB$cXoa!|!{- zr}g$SkyguP@~Hn~DU~kdhmpt-(RlFl;GZ1F=MO=F^~8f$>w-@1Kj{vQXY}H~;G_N> z&?1A-iO_x6alZ>m+9yMQ07f)Q6Znrn=i^FlYlabCfZ=6@@XM?jBLmhY#vVHiT{IvY zjY^=eGFw>N*lh9uYMX`0LelRU$>xq%4-)v6GRH+7bVL6N4CQ4qy~TUfK^CQeWN z*CE?y(>+l*Ypx4=s1UQHdBQ3q0z+oi8uYrwMjYQeM-nW5Ztm#*<}F^F-M_LyP_w8V zD`B2mz!7`y;c$gS$I)mLNPtEHtvWJQ(n{wGTL9&wX~Z`jd6?$N!x%e6b}75mK5}ID za2?HPJfEsJl8OF{F5Ea8RUaoE+uGVVlkSxLrjJwAFYF&XzLLo-u5E9RMhJt`n@h{s zqyd;Pjw(#Hk0oPoGTb^kM#x{!lT6mh5QZ48wUbF#8uj5qtDVg)*6LU%)LPB%qp@f{ zSE~)mxX|D+LskWH>}CqZ*1`W{TLs}D43R+*$yB*qJqn_ePrmIabR%>tMi8izvTlS3 zY72M_I8M=x(n~2`tmk6SLThLW*-YS<-wGac!f>(~MQp=%oHb<;|KX3oCqEv7RHZm3 z!2B~+SGna4w&d#-W?BHj< zd-#?c_l`LB?(VGz_uY5jt6rt&kX9V)^XzM^E-7BGxo&4dR3WR&L)V<5fS$GD9655~ z=EJ*=HQB!F*4iiyS!qt++65k(1SrL99lZH zvV8Ajt<|-ad!h)=8ofrRS1w}!R746KFMqpx=yj)y*i=E5uFZqf12$<7F{6;2fvD%T?ZmoXH;XT3M%j=^N zx(RItKB7+>-#=$yE#_!4*^qt=sR_)Iju;YXUNfcw)y58{Xhs+?2zDey&omfTpuJ}V zWs<5X2(8igccXs;lQDz)&**$D0PK15G9`E;;7yY=0v1hqZ zh~D{#Q!EmM7~T=T3xu1e8&0IuZsZgGXm1d8Z|n^E%|^`9!g1fsu=ZG*r>0K7?e=8n zx?m0u_MP3sH}~7k7Nl^hwLy55^dSIFBHrAwJi>+e_QwmYWXwhH5L<=oUx+8>4iy2~ ztn1xd8`ZrhjOkfos=oXi9aEq248~OBs--8xo0(yR)UQC2b$>Ee+_DL`${r%nVFe@k zbfd_II;~NReS71ud;IwRi5nH6W;oov4PB!%afioFF8T8(8yAX8i&ts1qKY2=w4>E& z?2MB6(az3bK<--~i?i>{yOmACU%%|$_$`}*ejAZ3gVU+6JbBH@Yw^UtvTL6L;9O$S zA%p^6{Y%dj;@tfUyy($0g)(mw%YI%~J!<=v@a8Q3md|Lnpt)neOqF|v0SO=vpmQ7m zlCs$+vMB@Dm~9~=nky$$RwG|G_WS9LO<>Ej!eke2G%7g~84eJ`r5mZ#+2ySw4m94mP*;v&9n98IY_IU#Xsa(zJMA19uYc)Uu#un%TmCAb zNv{tyG5bIObZ6%dEpz9{-i=pdW;o8{wc}K(c?J_d+(??pt^J2^j|z3;eUf$}IPQ*e$B!L3^{(}6tZ(@i%bTB{pBoLvD=Xi?e)}C{ zwbw94&_xiB$t?EA$17O2Y&MVW7cZbUCWGMWVcaFMxy+EQSy(DOX8yKVyE|f}$>HKoLUEi3W$0@J0dnlh@ohLg+*jip+e=@9EC0^|}JSP6O z_#j_0VQt0Y`WBl_@rO2obC8WfRM5<@`C2}V*=URCYQqudI9?lrk~x;shXHw|;@F%= zr=I4bLQDnLzNy1W74KPN3#r{f38^VgN=&@LG^dA`k>2q)6B4tw|YpMxkJVXFTcO zr2MZW1(FUG9tlQPmas5YFkJpH!%1AnIPYH#S@!XV^h3xcOvoZQ;Ed+-FWOR;X%Or)o`n~pj7z;KX>G%o$KS&Duiz4AB_z?#7+jQ9*kJCdnj34p_r4t$w7lr%{4 zr)Q2A_aK8|-1qpFfzTcSzPxQrETgRj00>_RMBw}1z&PwV%gb9^%gfH}d)tbpUr@+Y z+HL1hH7|9G>!mQcVQqwtBmX!ax&ci10A9l18wx3MS->KI#OREIt!y*>Xp!){f>!7c zJu}lR2-%bc`irSO5ys90M3%4-1tIynm8@_CRcrjRpudb-V`4~-@wUIcDV3jYHkRPB zTrnDO5e4J48&DtVlj-=&wmhw2Dx5JP(@H@-?%rP=l@l=LI-eI>-qj#Zzh00O4?GM}6W$k{H3upz!a2Z%KVxiq(qbJFt%14Is}U0z=8|MBNK~-al(g z)0TY$|KFP|ov;^U0=TtGrKNay3bzlC27?V7mR<1E&=o^hNYOJXZ zvI{WfG3r9D)LH0MNQcw6dpe(WBsg!JOxoza10gW`&;{qSeIeV zP;Pf>HP_ldw2HWPsoj>L$XUYCDQ7|!4@2|#DniC|sof!;EU8fO3x{k@c3*l`*-kt#Y8yMsC)fM9?tVLkIye@w-r;mH#>UN~_Q0jGWH9&ixk&dWUeaozB%~I~d=v2@nDn7ncfo2+iNkwLA0dO4vwD z_R3ODo$*}PDYLwctZAlCzZP5M?*RK@ebto`-EybUMIo|;+%~Xgkkx?RN;*x?4NS*- zR~GJ5GFyy~7Gi1AGcZ1o5Oan=yEvIKYBTMYqSB8UbgY+Hs^CYg>M^_5pa<%EtZ{J; ztV87xksOn9z(7Vp;w6Seer-FoN-|c-W^hi(m5a%YkB^{-EELv8*1hx+NK>-%Ep}P; zWhpP799Y)yvN6EH&$IqAxkJ_=+`fPf3{d95j7;dDqOm6T30@nSD-oRJP4QT&L-km% zigW|Q;22RS)l`k$P5k5)>uOnQOl8X1iyyN$tzRRHz&&INkhEgz{A--&XUmB1>HcCR z0!ycRR}0MSO&*)6n#uyCjG)W6K&tBrD(kn7N3$mtj?$n4vsAY!Q)QVH;!Kr>e#nDb zpyJESTSZVPE#O-dp@L1(P&ICU^aJaq76_`{I&?^u0M+WKvgU+$4nJpOGm$!b_8trc z_K$pb$r}##_fDTa6}I1Fr509J+DA@KUI@e<5JSSXy;d}XM<}Mm_`+tw_8Y2=p@*j& zIULD}3S(o(Q}~q{*((#5B9+ae7w^juDUO{PupciYY`Ee{m5?0=Id)B)T zpGno~J<~c`iJsLvzUt&trE9Of>+Zw57*E>K;`p8CuRS?O=$*dp96X#$`~K#OUqnE3 z$6ed2)JecH(^!9G(me7mwR(VEJEa7)8m_U{lNVBk# za=n>WDwxOM7PE3jxuMy&vu6b6pshyC>JvV}4MP3Hul|c3&2l^c(YIn@OKjx;d+s~FJ1Hamc zAhJ(}>otF{UCti8F6~}_0at<>F5giPqxMTh8nyCZQp)aMm-247$+9k7Z;0immQz-~ zwrSI5e&%Z%7c}(X{FMz8*Z95>1gg!qf=?Z2AMl%jlOU_jXs(!Z}-c! zI?1KfXu;$vz6At>MXFcAre%qhVyJIP*{1u`q&%4*t%LCL_%bp#W@fZLx_2-b^!v|- zgx%aME-aky_xpo^vQI9SHaAOFL%tJB-}>oKfBNv@PygP^%BuN&#|p3C)2UD>aRqO< zO9Z*=L*I>7{e47#e>C(lbn78MSYTggX{{F(xvzU1y@+Dt4*2uLJ{+mo@* zX<-WRh?x{RF4G|qAYc)GffiVb>fDT<)S}fBhVk?nl_1Xw7KGwUM*K8&@Z0BiKVt3> zowF&Dhdb84zA*g6))oX{du!{&<)g--x%~3(&hB!4u$syykCcx@!xt`uqa36%?aUKS zBs1-gqPl2!)oAbF(O$IbHS&wmo=#Zb#W80N{*W7%cUK3WAFNX54nm-(T$a|KJ*ge0 zMWrf!St=*iRiT>~rY%Wkh){ZE(~{XsO>0r%+@alNRhoaV=?4ePyRYWFX`*Rv-o%9b z3t~k5u<;u?Z({!ca_F-bYocK0NmdR9qffCtrX+9&0z7bkKpODTX!g0`2Vg0Xh{D&Q zt%E<9eRB6Yvn}|9B_f|vkj|i%5T@3SzGvrDvrt%Iw}@p2zgSMfWhz9C(5)r20*%9i zC={`g!ChiAMG+ge6E0T97J;}ns9EbwAw*3qQWmJtw)7?#knotk^;^~aO9Jw?04^|w z_LvY9utG>A35k$S;zF15Be7b{$s`)7_`q_GJJukcY9ulaXCpp&YZS>a(?Ji?X!adv zesQsuE|7|JvF}%KBq*Gox+b9)U5IK-JtwOPB{V;T8?(pFYRj4KtUPDf!Ilp@0 z@L??c9Jdk2t}LH}CNGxBN3l>C_Iks@0tOb4T8T6nC#sQn!zG4sfw(oG#xPmXYh`?S zjjT(f1AZMRxo!ZO`^We?Po=%qf;6MVd8y+}Z6ow5^o0?w7%5UmU~F{$k^ z{(}~2ctNqX7}83ZBH-2MtzWf10F0XD-xh}?(un2Cbn)(kC-r-JRvyqr7+hgbQBC?6 zIN=RRTLR>;tj+Vnn*v6{czE564M)W)Hs354)xq0r0nQpa%B37*$3y8xP{MuNBkp1W zS>Lk)6PdA#iA14b53y;Y4R#+74Qy?!R)lz0^b)FqUzKCWiev?W43dD>Y8Q_ktMni) z6ud4HY2!OWp#5+k=F7)+Y6zQ}NR%83hu^|rh8yD1co$k_T zL>Q#wn;YaA&J%~TNlcKvrKM(r_^A2(2C3|AxUk8g)oV}h?8?&ychKF_r`HZmVzITs z2Bx5?bfdYnv{xwL)7)+FP`|&ic^qSc;b^Jb8IOVrX}j{2}M7!a#;B}Zy# z(L!bL+ke1{_tVy2;{wySj|!(4PZ8s*Kf&orPPg*y=Q!A}+M3&=U`|A!5PzmT{tpRF9vp_gXm1tTJ%r|KP zCR!z&Rc(4&Z?z&obE=Iu=V-Osi~vUW@(w`8a3n>V>fjzRiL_rWGOaXd3g%MJ5EFpw z++)fY?8K}@Qtlu>iRqbHWkG~3)+8ml{bBH}znTH0zs2S#Q-rd7?J7z8OvG;0+QmPb$7?@TMagCUuX?8g?^Pq(kCuX4Z_a znOpb|&;WI)mSTTv9Vd!_K{3_gq-cg^f=~*I0cKNhUIjD1h8c24ex1zfq{-5~<_RLj5qeW>GbeCTiNvs)l7NZJ zNCNc-2ceQs7}$2s#q~uMbBBrflfa(^cAVQ|oR;TC6yqu$kJ#`TVSu@Oyl`ESAc;o9 z+2ZZ5ms%EAX>=q=e@Y>8vEjGNmdE;sVpOjjUrcKO5b|dcq)@|%2mt%y;xVTVU~5Me z#BkttszMz#?WXSL8il*0nxLur;lMYyRFW=8TR*MCKCKh87x4jt!&@;V^zxAt2|t(J zO7*(=QX;WD!B5jaKQX~cb-Lu2FD*PHaDV{(< zQ-YNzbaFV!C?qg(RGbDBb9qHTV5V_VBKNAMPfjtICKBuc8H0-}5O&hcGyG^uQ7cHo z$^?SYA_+n~%dw7gDDp^@<>^5!2{0&ygdO>mCnP<@#Yamkc&YuGd1R2m{Ms%e4e%J9 z<6f?qS%Aw79^od1jM0ZeC=vQ1c#NdCq@TxN5xYK*1%`iekKuw`s3 zFMgW*=^qLG5OGGIWBr`{73U`B{mwsxf&YaK?7L)0uk^1#yeZ9ScDZ)CU|C6u0^a(( z0^0QqsRpR%>y4}3sHe|M@OK&n&Ojddxf+aOunN##xCU4lK*K3aG>{Q_DQ+;ceoR-03Z#Nn>N)noQ?o)1+XP{y(D_Q1bhL!0h%z45=f-E(7+Jamx>0`3dUY~ zD^C@GRBx=x4N%pw{F*QKRhZCV!2rfiE1U?P&U|{N1rG$r+f#!QxDC*!7Z~9fc$1qnJYu4 zQ>w72c`-ZqM+MX?K9|Vfxneb<2Kqgoun-OFku?RIzivBnAV_!4$lXhI$Un93A zS7udl#L||RIl&Y)cd&fS7n(k?>{|Di2SrCgAv!V}^YXybT|-J4l4wfGnYL|DOfHe) zCK%j2#yXyEF*66u2(v@}2u1QVZ#sN=mKkZS0@@Ua7QTqDvVzMAkONAS$$Wmk-40yI z1LPO#1QsH2iDsd2K~6TiRRK9npX34gMJDsDr3CIA z0{I5b0tyY~Y>c5losf#K|_o7JPMMsDcrEkrhsmgR&M;wUB zHFsMd)6M+h<{Tr;fbN#&5dsjIFwVuOCI~!BJQ6&$!0qOt-~&(l2TWlJ)$Ary1>%^% z;fwXBaEbtx3(3b584WH*DhXVvgSLEx6O4)*&9~d=oD|-wKp;$9kchxFTjRuDu5I+o z5N+zTo|wK6*W(n8$UV7yBBj8Kl&Y!E;9;gQ(e0vks_>emC@BxgxDyX(z$zEew znk5Qd*+ZC_CLsh=NF>s47jk~q43D9=sE|cm&HI{Clgpm1gPkdrHS2z{S!&@a%}whH zib*fh3G(E4UMZhV(hjDD@S~!z=>pACJE7QkSX+`oqYcpnl6g+>Li@;itPo$aM2t&P zVX`k^jW54UOI+I>AV~^+v1*abFccj>w?mOlTlPB34Iwa;W>55;amS ze)3BtXwO{UrkC%SJ)}{fgrVwO(FcL(lC1`*m*N6lns|7XXj}_RkW?!l4PHSx9K@EH z!2&MEI6%#sBWf#8xL$+E8z}1W?o&cFGjEJA=Lj=r)+e!E&E7))m`CHMmYO}7H2%k* zLO%LSp;zFyN8}%Iq@cecpbSD!n99f^4GshA8jJ<<1ECAMjizTfZ|<03JTRcSVu(VH z&3T@M_Lx$-Q@SA#QTi$tV%NL3zqGiryf~OUdB_9kH=3x;E>TnruTZq*UOLsc!SAPNCRqcb1SX6MizLMRIFCbU_652E}A6JUdJ!8C5Zq9 zLd8;GuH7Ywy_;HE8nZN`Edn3Oo40=ms_Jl|xV3Vo-w20$b4Qog+hfwU+{iK@Q;%GI zukd?6jMdt6m;sa@64ALvF(o0L{>$hKbT;_kHY%>*3PL_Cmdtq(J|a3qt%xSsL~v{f zdP!d(y@vhJHP>8ok!3O)rG)XmuTM%Iinni zL^Z~fkrY#AurHmKQbwbE>BPFZ=}D(XPuF_?Y1$A7h=LYsGvor5loXd=(-)c^CpuiMxc1JyJtwyO@bPEg^!7DkeC*wMHU4{cr4mk+GCAv`Ur%jx(4^ht@rje;v3%g# z?eX~J3FN*UpTQ#M!l6%na<#uwsZ>7osml4v&egQ8;zlaPSUykr>`d~Dk^byWh*gpt zrjwEQ?GVXI72y|Sxt~?rH;*6N+{8KGYPB~vj~(AspFTj`#!r4~T0RtIQF*d687%tJZUgybd@#3~>-CS0?%MOh!^rxp zs51Mi^~f;n?cFsx+V5vq=LT_%sv53B8Hz(BZXv|2--@WzsGIIb8YQYCwLvf1!HagK zKL7sZLLKS|-bQ?H z_P`|g)Lv9!=N!LU$i-8&K_*itg@A2$WUp4r_6I9kFxMSA{qVp3oZ zlqO$dbpg&blPTJbdaqJlTG}Pxb&7m*cy3^Ic0-Nq<;9Bc>?|#zI_t3liy6`cgck{| zpCc&AX#(e~PPBL#=+E+@)w8Vs<$f=R?~WVkQl-)q zY;|Wa0R2a-E_lYW-&HrM8)IxXLN=l&vc`i!-1-dSphS+C45Wl2&^B-sMh%7oE*dEp zqXGp?l4v>wyIw@J#{Hi4EI48>4&|j78C-!kLA)g!Yl(0$Jg2z|6`oPV2rdDWv)vA< zwe#A%ZqctCI<#`g$HttUr82?7#qx$3?;^Aoov_pJt#k@bnn>GW z+6ijJeJo$Z!d>V(gK2t#bR||<`NNdk-G~EzwVh#5=#>e;M>mzz4_gpIGCG&+x8k9Z zc%%u0w5TG~&*P^fxC1LQDXFF46-D&KW0es6ix!*y|3SCgy)yUpmB(+d@#^-1|08>~ z+TM}BCm36|d$RYzuS>i>56iXUiEj7A?DN(mw;efGD4gT#R`GygY~mlY9)ey}Z1MTf z5fhG8V6{EA+t8M_NO-gluyu4ofd@nCxlmc>D#q8l6IHFs{O3yXui5) zZ)}`9yRm888=Gf$=jLpCZfB;R-ATK*}@=p@Jb!-RI(1!*mg~ld z!B@l80cFJ;6Rk9kF-f72CcOj9eYRL9eAjo88?AS!$I;62sZ;p9S_||04?cKddu-b~ zyElLCr;FK~$2I`_@lq1ZLZKd6nIDn0y5C#S6E+Cw*wV5$f9%*Wy1RQ5e*fXm(Ff&Y z{|YjYq52SUAyH@TGs9Zqj6o1;p?Qn4HPAOu)d|gTLH1O9OKdW-zW3yXE0@kar$Ky; z=JWUWu(7Vq&o6KFE$jIfYz{vcdzFygEw&q9e_x>ZNiRJ^@lgV(R^+W0O!N0usz3=@x_uuxlx4&4Aa=%Lb z!A$0r?a`>+Y`*vY;ADn$(#;>rG)o8ePK%qPUjOnnIC;bNm{io4kDyYg!|eyp zfV3Gvo%Dh|^xOIT$3Yy~kLUCMQGPw&lmPq|niYghvC3OPL3tO$Zsft7&A0r;e7<># zK;(bkBLh*g-{(7*+X2ysx<>yfGvd1)6HA}b4Z3rtm}~V2>t>1q*%sWQEfLg1K(zo z%-BS25VNcJoW2bq-& zSj%2>0QzEweOo@)TvYJ>WOA_yL0l?#;qI!nt>KYniH*l&tSM5 z(MKQc+gA7GFK5vDKU;#@j#`bkzC|*Nx4f0y);-9hhgxivYMWZ)mGW)?2{Yr3@bkqT>&W-c{T%#;Jk9TvF7Yh1=#jC zz_x92gJ0o$HxhQ%YM8z+SwLKBX0R5_K6Qq=eJpJ~3V&1qh9CBe2G#}1Ft=H0@ESZs z0U%Eq!%6)vUL33`hTZ%Yhq7VhPS)qWR%uR#wL0s69?T>?v4rfOlo$U_IS&__< zAC2I03GJ)UArP4m!azrW5rKxYHu0IyLvrS_kf9leFY9=`R4n`GvT@z>%f(VWF&M0@ z3iaZg38?T>uqBX1Jt@{I8W}&Q^OnlS6@YO%D2Veb@g1m|g_MixdpDJ7=_t?Jq z-+wcKkN1!6TW=5#aqziIxpNQc=-_j&y8ilCeeU|}Kj+}s{^A#7A3KwW))}mw81yj_~trOo6CtTFBqubU$+W?EK%;ddsCbeH<`yApLXXsTe5x_m*xj< zdEWekuetTP2dA$6gPXT*IQZn&`Sa(Wb>`Z6Yy050tnHi5|Jhrw<#qhs&pBp&q4nsu z96Q*sK6J2Y{pW+t@joAYW@LThz&~>2$O|9()3Nop2iI61GylJ4?f>F^_uXfe$Lx9K zqg`dJZzRrclbAG*;7RgV?0q z8=pahO~xS{aI0inW$hmReIbKUU~}T}EHno5xE=(9G~x$sS~B+-f?++NK$&&8tdsN1`CbF~Ei}VeyjLt^Jlx1@pV;Mu)jMqQpM;F&${oDqx zNb<}pwzjr#3yj_d-zLT#zch>3>xA>Lae>-`uRG}-&%$AHHL;Dworkb6Qi zSZ6m-4|=S%!3nt11Zs^`Gzqf~<6xWAb)c>o$tu%Fj7nNt!AXOrqNgz>fj`CY1F{@E z2nNeY59qu=O!H~X2I)xBvzN~(^_+pbvl!1e6VY?FJD(64Tyv$_(6?ke20NILM3*#J z%w3=f(#|b$EP1^EwDBPsSw&HezL1J3%C}w(zqWPo8GIuwtB9w>R+GdleH^4J!{OQ% zQ5Yhn($UGaXykwXIWK+b=7SI37LVtLqrpITAN*n}y#&N9Ts^-5$8NpPoD2#haAkq0 zW<6yICfHuPiY<@tE1q(@u(?@i6VR~_z)1bAsy_Hrq=`xxPa1DPG&$SJab*J=zY1*p zF1!Z6V7-g{5TCYx+x~+6cTU`CI*ZO-&MO?KqB(ZAMnt5aRy}WxkxU)OIuhk<&Q3KV zrt_W{O0Ho@h><(bNZuvkob-Y&&{q&o&+6^-OGy)Y&M4=-K8W%;3`A4&=R`VlP?LY2SRaOFT2uC=lIZn)P4b9Y&~htNi8`j{Q1m)% zw^(znZa}_J^Ke4OaE6MjXu;H!vez5ITVt3ZA#^~zb6TUqq-#X`C5qR=(m!KIdANR< z-C{XB&!xR)>qM#I{Whe*N?e?RXRaDT9c_qZNOOmmuqa!ETy@>RqSoqW#S$BxO$CrapB*N)slvJS+s#9hX68v_?v7=j!y zps^y&Ec!kaDdbKQ-G)^V)N(RfoTp_Nm5Vh@+|tiOD?+HC@U|*$E4qFa~7>z>FzKG?l=vp8)XHBg@OM*;cNAJrg;G zlJm!#R?2JSvhf;xETFtf(kg_e$ZFxgq7;ppl;d0CryPe6E>8Gi$D5`BmlF#J(sIO}lXy{$c?cPqt#!6&}#VnIT04f^hopK;Uf=2Odstav?|59>)D$ zj$Zf_MhM=FaG8c<-h{xIAjaMb;$)0M6%m&4p64T-gmg$+=eBBMu$k8ca%4>V~myr^X_R+{I;5e@!CjFS|WfE4Ao}`;YB-*)H zzO0nATx0wY8-ON>o3gODx<{nnyO}r$9+bWAzblu^%3-LqF|ax;@FZ-mC*wVOLte`) z-B4TrIuax8c03tNL{bDpBlWdR_=*W-ej<8%=qZY-`XYFRms>)^-sVBn+>b z0?W$>iA@#cOUQf4{wJCbk9kpx^#JQ)gd!dc|+xS`n6h_hj^v1O4E@T(pf z&K-P25hn5r$feM+6eMbn=ZK|G*b~RbE|C@7Cj4?XT`JYF!TOM&ry;7fO zyeuquX^C=*)}tNQK8!nL<4al%3fg6uCWN6y#aL+?(|Q-AmJq z)_%yk8)@Je8YY%OQ+pUR#@g51X<@nylo1nijf97ku|70wMPs3|p`oh6+X7S0lX4*B#R{HEp80^#Zk;hC1k7;g=l*aYGKwzZB zrA`M?P^{OTpKmoH&cfz~RC-RV)tp=Gb=}x=pWBWJ;&_1cd(tJTPD@RGMCt+dqgPAr-%WOEc?*-J}X;A!2bT3lj3>4ml!)asVP$rLVv zp2?TS=?I~A0tXPDjf9DqqsO52z|SNG)RVx{UoYoH52}NhFrk%5r5gAG2rCHXl}hEZ z0$!HSqZAY{mByV?@?dO%XD4kuGYNJkX5Q$ZMO6}_iPVKO4L9>b1gjd;H;M$tYD`hO z<8@M#g|VRuxT1@m{9Pbybsu5}*^xtt5t_|&=?hoXDqIDEK>z{h22mLfosK{lnUQfJ zS5$~bisn+5hov*4WRiHRq6qSkcqW=ir$}=KHVWfMpvjZ}y?U-c;siw_9Uc!uIdD^e z|Dk_`dGv$z;#Mo2VW&fCjp%52hnk{nb`TY&q0UFiuT8?%h4`J6p22P$?{;X%mndq3 z3Bj68;er}VV$JM%=UEMu3MKRVV0YT_m{rIVH=3{#;n#f|A-oC&-^WU<(rhXqfNl4B zhgL@;P_gSlpQ;@&BYN)?YcDb}g^bsH6#Q*yMnTm-zr)BWx*>dkg^Sg{-y7 zNV5j|=P~HS0xeS)K*mm9-C(`)Q()V&t~t#yl%HQGUF2VZRza*_ZZJ7f8|=*u*ZqEq z@!P|>1TmZoGK<1c>+HX!fT*#$S9KK8Y&CHhrPLH2K$_NknnWZ{7#bbh5RpDS7bN~8 z35SRU$RyhAkxP^batIENrkbiz+;OLC;Wr$MHrXc3EgX&NNHbMTN4#CkJPjnZh$iDh%F+>c3b-zZFaJaM;j~pBivP#HBe(ca4$b9F><$EObQ0NE9#r2WU?^pwC z!8&EV)OwxuJ=V`ahyAYgw|3bc+2`yxn7AFn1g*2`{n$a3tJ6j)#12Z@R>}L=GWQx)^#P8Kg(!lEJ_vmsfFH6F!kB1ULw3H5eW# zfha-nG`Jn=s=tkBxlD1}v}1$5A=U?q2Yaq}>#zWN)#V#2~Uq zqg%opVa%Q=O0tNtk!pC9NHPTLn=>rZC@lMzD2zVrs^Zr+t zl-c=Sn*^xYMrK8O@!+4?yFel@Zh&?qhr1(B0VddZzzMJl6bPgUvUao6!M&8nDH3@~ zZ~=5+e^QTNB4T?kXp`zLZh-U%kJMfxxe=byqn35>=io&|^~uDJqVQxA2r*#mLHY|A zMiEa{pec@dt5tQvFZ6vsJ-3xU<9Rox_x?cX*OS8$4xXtwiwKNhaFn>NTfCD1V~Z}^ zU}f1`^klgWbn8pn#XA8Hjy)Uxvp_&lK3Z60GFTDPcg2_ZzdT-rY`E=tBSHxl-Lm%% zght$GDVH-t=_nKgD1nKPt5(#l3OM1;@YyiwZ8eJkL8vw+$@tb1<$$x$ECQf3rG&*L z{(cE?5Wq|ZmKtfACTycm?okW|h(i%xLOza_07=`>DVifgJWwQrSU9;wBW|E2s5=l= zq|a?{Z@XRk<@_Lvfj?w05HobnOVb8oSg45sslhxlSM*7Cg`76CDVmWg)k7v!{(H0! z01gS~ai=hsIBp(b)tRQi+G_EU0{20PF%hA$W~RfGg^7hiB!>u=_A1UAF@N0XK?@-! zL*kMt(e%u+|As5WO{pQBwZR(&is8whYI0{KiGr0*e$ zcc}2L)vB=1M3 zGd>E%TsU@r0{P#tLn5=`{|w*HoL>`-Jeo=tR0ey*l#n|3D)JxeKPW8j>Dz{_Vav|H zu3)zwMyObL`$G@CeL4n@p&FN+vV&I3Rh5?$oYBNOw87({bM5sq|r8^w&S%= zCerW`hO$iL8Dd$+BxDL2KXnoF0R8Lpe+Dn>hlASx3_aUnvX>VzEnpFmMa03n2x}SR zm`LrpJQ`MnWYO4O9r;)+lg4{F0u@E=SkRX%a5dDQf!yb>g_i%a-LP-4Z?(VE{;>Uf_LrS` z=Wm^VbS{Pm;mz>zFdF?S3T3P{172he4CZPAG#v~%1V@0Grt|2Q(1vN{i%!scWG2+C z^I)!xUM84U@SMt`Bm^DCaR|i95uy|J0*hWt0K$mcpnbGucss!^U>#7Ux!Ie{rkf?_ zua6{X3EHQPqo{dhv^OHxTuN2xK^xGvf~Dp3YOpeQYMX-RwJCX&%H$=WlkzS!2$+>8 zrzN;L{AN>HfWGl2wfR|g-cg?<~d4`R#0uxoxykTRB)^X7hFU4 z89c=k(sc8if998`Xd8oKWP+nPm=v>3P|%y1=LVL6#!0J{L{z3ARcvVEfX`4h%!ru@ zWQOYR<#n^&H?(ot*p*Ste**&}Ko>BJrSSRTC+#W_ zk$0_)`>s2?xCni-wtKj1E$;81+3)r6(H4a#_A`NF0xYrgL&DO~EJ6ez>xG45$Id<< zo5n~2_dUoal1RdQ$1(X#2O*Fh#oTbvEt(gUv#165deyDqUHT3?69^n=0HvrA4~v3B zWFJ5o`33aZijfR}g}DWa$PhU+LnZM5cS;h+{f1uBRdcBmgJ$6d#|na;NJLZ!zODfC=eWSL4tnV_J6#-UAf5Tqg_X$BMx`jsd&P8@9*7zFV{ zLUJb6CLIz1WR#(YZrKDW@o=CGrx)oW^c(l6fzWFrK`9uuZvxkLDnSm0dJiNRR_mZu zrGJYzQ7Nh*Xj6s@N{@jd0EvU*PC^F8Nb&|KTGt}VB7z}l7GW}wcZnQE>*A#13|_R4 z=i=g>-asdaNTxy>n5s2NAXnmszdf+KOH?8bxc*~2CK_j`~cRdJC zT1duJ!f{FyRZZp!^R+O3HQ{@b>6~IXJGsaaKZn&HEC?&hsQBDiuheOG=C+UQ)yWKg zKhg|F^=;^B+;XD1+-XOXam#JCR_?s&)NrT_Yo||t%kMdHlO#!Vi_Uvr(lr~!we5*s z6YLU@0T9hZe}T$Lkn4`B^jQNFv-{?Gg<`w_IYz@n$>-PrJ=}B>HkE=B73K!RF8`!*MZ;nmesK7bPqw9lK-JC+Q!!X6Se>GQ~Vw z)=Ww}XjlR!Kze$H_?(27--D?y}p{@ftFB3Xk|15=}F)+=JC{ zE}MH6T(Xune4bRu^p)j@7)$}zfnSE*kp-N1s%1LN=8%#PJ7fF#f4b2&0i?{CZ_SXvzX(%Sf9@Me^%Wb#a*4g>&7dxN%zD}p}ir?;j zarDl2zVjaIc?U1Hta}fB`?n5$%=*4iE##21;416aL;27gUc|2py(jeJq2CJqPU!E5 zM80cXWxd#XrS*N-wSAZ-kL;`LpR@nS{-S-+*>%oA%NjCKxKiYtY*c;!YfmZhNKeAJ zk!#eHD4I$x3d#)>TtaL^Awy_{@JUou%G07H zjfwDRks4 zF7cuKAVEaFx;zJQ4~b^31R7+{LGX+MOIxF!9(vQ;y=geznIW8>M+O_zOPOL^A^xE6 zMi9cBmUvY3plO5}IU;bguL|fb$8fcJ3}Q)ylkSv!FJM}?>4=V~f)43yz+RZ9sv@3t zJt{t5uumHQl*&{FfpO>Aa7v1P@ z(gk|us84^A%M*f$H1C6XV&K*4sg#YNEWNliSzYV+5JpP;w%zFx4WZg>CK?;1et*pk z?gUl3UZ!wzd(GTR>L)Alkn7!b@FUP>xyI7c`s!*CilFW88BD|~g8`-^j0XhPD&hy)QCTOcCJ&Ahf1OyO5hqxHr&;(7Yw5j?BD1kgDX1R6@X4$Jx_I!HFet zMGkVAE?QK2dIDA=f54@&2=ws%`vGjbJzb%Qz z2Kp!yxsYk+Y8`^F-As6iZtyc5Py2~h;u`1_(|9lZW-okXex3wBnNcJ%WWu33y1o5a z_-wDoqDi=n|1g8WG=|vmg#Ef^Dv^XAxO}JUo$dA*T({aE5GrzO?o9+=B;3sjC)}t; zBCQ^RMszW?TJhkzCtm@H9&I+l--(c#xh@xD;W%#f7#GcQ_E)DhZvy^jmd@?Dr<|- zD;(W?c>p}Kmx<1X!*~12(LHXSc)_KSQrs*1;^SZn-jziKcnPL1nube27OW`%lh#5lbJ6QIKYY?J$rWNFK<3~ z?&@n!H0pA`v{zTJx#slg^$kca$=oc_J=TAxZ9ipnh63&SA7Qs-BqgAQ%SdC2KsKX=xgqKPYT0n|d2wRC*e(cNNV%kE zf`r%R))9|G;3}bv+?7-lE(Bw9H>XtSrYJ}*Nmi=TR0tSeXK5clM=I6o;fQ?h71v*X z{Yo4KSt7Br(La#+sB9ta6NFt^<}?rBwN9LfH;zfZz_`0p5bk6kJ!9y zCVm8)4^j}Rp8+{+BW)huguQ=BD%Pr2mKJZ!71Gg-NGiwDd)c*T78bE8wZ3AmTg_^9 zaq)bvn2v6SlX$bYUUnw9VUUWQbdy^-g8j@#W5{S8N_*JMr?>G*UKz0ocT%wv_^;}Y z)I2dIQx6e4h%7DJ>D2P_yo>#)d_w=d{YdEVOx%eTyh4u=UE_tU$JdgX^SeVo9QqKw zHmn!ZJVL@8sLCZ1RRn-Q#bq<5$HejtKN;`1&)cTW-1K#>o49->;Pq&%bSSxC_M;ar1ZkZ~XVI7K9!q{@@rSDv`(p zn#1!@p^ZJ)txNqW$sB>RFhq{*;?#;}5I6}B?#e9eh8C~!cn?XK>$QXvs>IazYhcC8 zwCc?GX$<)nkHUL~8Ls?gptzv<7-rM_V+g`q;%GtdVA&ZagEPJ9YBg}3s~ULM3(6ag zzG7pMg+I2;=ZNi0R3@VASPuKPg@L+M&8>D9_jaLmVvT?W41xzlX3OnbO`=5z7kopz zEg)?=gLM=dRf<9v9*d<3R%YJ?#;hx^EN~fknawh;XuR0M*aG5JRzb!=gk*_QbGb@a zG1Tl_zSe7E3I=^avS1kQ{UI0IJuj;zudt{jNu>rkQ>Q9&W70O#KA&0Q9V?`Y;mtVQ_{bX$| zr!#IGj95)g_8wecS5%R9E4zrE(z+SsS1l*4-!J>ew+~KW=;W^cAOV3~ql|u`)AKTm8!`OZ8EQ84~HWS1ZFIQ>{zjS>xK9|k8 zUXSQVd2(ZbH!XWf4tpmEVt&-xGz&hoYlR#)oKwY5}0~P58fp^ zX9##Oqj-Xq7_37kf>kaZ+4`Ir#*xm;0+zRj-4ps6nf1zU~AmN~B6wjedo^psBD zn=jNU@R8$nXgdzg=e^K)IwUAizH!Vt!OsRaz5eyIL(OvBV(;B z#Q;7HY0ePL#-DzYGfNbMIw=|%an|E_s&<_Idg8Sw{sQSRpaKx0rdhSDN_|TQ%lM<< z1$g@<>&*v`TIUZQRZ3WPSj9R&J9y<4eCsRiaqoEU$6XqRL4J8kn;LaR~Yhrm&fmq-eE$|1zvJvMnRTlX!0u7-!JhVZHR=9eIVn$y+ZCzW*9FJWL#aE6hHAFOE_u z0zlbG;-f`tE74lFD-<3Jd!5+zu=)rpilub16T3QAZZ>jxB1%hvMX&R@f%QHLenJHg z5rG2J@tRftYlgO5DnObL8b8{6QD^Abb9iNSbM?V;l^oz<0CD|UgZa4#NuZaqake^E zbxm&@0BK+R7kI+|51w!UpAfnX0cRwn){D=OpxLL(8k~_xbs-?n`XA%{s}H|+??^H^ zM>KHqkvAJV_mAd@HEM&^*OJM9fZ*lzS?)XXn!O_=_zv!CG$;4Zk1Scfb6+}rM{u9o zb1~%FueTl|7Sc=A9?=Pgjx$3Zz+z_7aG(a&4b`q-RqIZ(vPA^zoLZ~n>AIiY$Jsfc z6r~tw4R0Rsub%xa#b$@x^4UstLZGV@L3py6WFnr<7djL06bxCXT}H-}Ott0+8J4M3 zhI6$V>5&Ta3-EQRT6H+&K6uSuzlE`O_TYD+Ryu5{e6DWQ*!6q z`&Xjqe7?p39ANt5KVST~^+Uuo{Q>fh{<77<^yrMzP#v zLjg@00vnTIy*XxAFg(b|`R47;{_%#^L}&tx4S-lXXsUK*Rx`6ZZFlXpcip{^I9`_| zc1(OF-I>vjnsucq4iG~UCvhMoq(MR+kOBlkc|1rUG(&7iNJ34a*#rpX!6Uo?X_Php z?_OyXQ3dda}y${v5jh`HNx#_=wOYQdXwd+9?U$#AlZ!LIhm zztA_JM#5`k03^Ogbn&w7e!FK@Dd%?zt;%{7pR9*x# z3GXI%KgnIYx8aC16`CO3aZ7e#e^eWRBua|ch&PG3Fr-5gg6j1}{Gc;55wOrKbwX1$ z`7#aiJ7S+FN*4_aHeJG%h0!3mqzgE0>=^w`ptiX7U;2nWN6x#q^1sEZ*qT?eP!8R$1c5pbk zJ2)lG!ANh6(Jrg!m(wt7C~c*`KwF zW~Cx%B$xV}VHlHm6%qs@Uc1CfM*_H*qDqiSlfYXZTMQ%;0i%M^D5xpwY$A3!hH4L5 zG-*o=14dhH#JI&0^n`;f&VQ3eY;tmndf?s(o-Y}Z^3)N@;5GpmB&H@ONhFkTOvcI7 z%zac<6B!3@2Y)7$$wt+LSj|PLC&gZ{@DfkW*a9jd)dD=ujX}ToQlp7Oua6WA%n2w0 zZW4Wj2_D;Uc4#I!70qU1Hn@9`{IL>#MoLj^`i@rtmxv3q*ohF$slrOyEqQ&p1sXn4 z<`n}vTG-%80(i{_4;_Yw7NS;R<)xRPH~nAwFPA1Q1z8AQZL%$#xF77uF!R|EdtPQh)F~W3 z6!4{y+W<7+&;)h&$nc1Gi^N&agPGiToM}dP8jfTmDKtjZ^R5ucGm0!t zcJR?*nnh+&z9V?+@$o5S#U#95pf3oo_faI0JcG1LTOVgZekW7V&eXmB7pmq%4?Xl+`+{*vq7%a33FUWr~h`M`a5-F4SnVsF3W<7$+78-UmP33x5h$sXagBt93uUaSP` z=sB5$wFyVylG$=d!)#vt1OfeblSEYK^Vh2A{ZV~QK7Zv)ct1=`c;tO2^q22Gdq(Rs zXI@P0f`LsGCeh6SsuvVcQX~omRMPPRo(fO(jiRF{GpYmB!jRn7j^=(tNS*)*glIPJ zfP-*OJsD1XK)bLdw1TG4I??94LA(YgdkoODa62KzljwuQ8Nt!&%NZC2k*T}AuqQC; zeB`#SRN}OAVAk1pu0@_cv>H5p2f4ygkcdgxfqVhy4Y{iuppwbz+k<%h%ij{EECcrygPqo(s3 zl6nbUg6F9Z=@Ipbz6gFc$B}Zc>$|J3PYEPA2nRUw9o-SA>p@wb7>T3j;E@D5aUIuE z{>}kHI*_iI@~rxdnwgoMAziS1UwOQ@H#;+<%(3$qUO-`m(D8|hRBnpwzTKvB67h1y z>nX&J;UG7B*xK=YZUU1qg)caV4g}!V0 zUetF#dT=zbU6EYWcJ7)$B_ir@cKEn&E$-a%-aa=@jvcr9edzVkg|}`L#%|m zk@Vz#CQhc*C&{Rj9wFj|TyGKb+(cutfLM{9=8YK=%}va$q6~b@d-KiB+4RAjXR!kMO3sIdr2}A3v_ukKXV*$Ixkea2Z4)ApeN95~H6evB5{AGrdpZ zXumR;S{@vX{#YzD6d`R3G2XGQp2*Rz03t#N9q@5S zlT&;+Bx5I|D4@tGr^zhG1!j@onGA<2I8uxVleBlzr?I^O9pbr;eDdm%;r{eoC^|Gm zs6B`s)=q{EJcc?+;=tf1VfgS|BxoIc=*RysA-*^UacI&U0UneYl-Me7NaPu%r|^me zgKw&diPNWVJeqFX-M-B`NNPa5Z^IFP3?CQ#70F=$gGrPf*;WW%0?|t4I;t^-aicL5 zQEo;yFgz3s`HW zRnpXh+l-T~mD{0>h)?6r#AP|=AD3`n5^0P@`O;@Uwfi>T1TOdU-d;U1koF~J`XMpG z8OPv)J?a?V!MM_lsvStNFoR6!UV#a9#bV`Q~3S0a9 ztPvnAemD@Ac_er2*vKirkGS7?c<|7P<(YhjlFdZgCliBs#e$O9mvu5WF#!?@jVxU| zj;l%*m3wS;h=|SpvC&hBvC;gAv9Zvp(J?YHdA;AXG<|})H}MnGOSdxo;};4ihy)xP zn>%rOO?yX2^RZlRb~d++kc=-&JU;00Y}|1D$)Taa$mqKNY$ULwpO-8(l(iFf0Ac3pO}9A$mWGdRX9 zc7;^=aY<3Xo}xxKG5nLmBHU9vcIJ$c=uZzN(#B9YnE?M^HA#|(>;=-jDf~Q$Obtcz z%P~q;4o;3!X*P&GDl<9x(y=j+arDFsC%h+oo_KuaopI`GqLzz(jsi;IV;=9w_Xh$w z=th74*kV2w*2(}ny$g7=78^*Df8<)f63?R1{X(vx#MVd=>)%-$M zj~p+IQYa)Gi8?~FeiaGn$SDU7hy?wkxrr$xK%IFK5!D+_r<1D_Ne_!S-|vr)jHCxu z=-B#zPiHd6iDr--8)|-ZltSUuw23B_F*=Z>@W{YP$pNAO>AArIo-9UuXn5rE>FMDd zzEs}RMEoU@rm`PI>`bK-i4Vb=F?`7BdUg>tKw)ew+JEBOHRTy~^QjNsc2Nb-P`M|u(@PMW3&kB$*+BjJf+Wx}o$(c$-;p}u1T;({n6bpQ-} ztj-{#g^`+?AUIPJL7dQee9Uz-eMREW$Ry^P&cdT$l&mBW>AzXn1XSC8(j8{`j(&b;77igNQ|T9hv9lxq{@THo&G$Y8XGupWW}+g`)jNrn$8;NMCGjf_Ri)d zAF0#s@QnK4*YWGOV>O9aaw(S zR@|9-yPl$l|K1i3FIwO0@wneIuVkc9|DYbCzQZE1#Q3X2GMvC+nS-^H6DK7-vTO?x z?iZ9YrLgPC5s)%w?Jo1`Fj9H3<_R_s%b_fO_2`v{)I(PuB5ahJj1Rr-ZL+~yO1c}#0}&CkzEDW7W> z=GEJ%+Bcr#>h<+Y!Uw9S{#-qz-iz%0D*T`NSj=Ed;kI!ZM|yQqsR{=oGHU9mEnSc& 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 L91&+)2qFIkg+O=) literal 129428 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 diff --git a/webfonts/fa-brands-400.woff2 b/webfonts/fa-brands-400.woff2 index e916d751a7f3955ec89ce0ebd0e0565ba05e3dd6..64bf1ea454dd543dc8ef4be7720190edd7d7a7fb 100644 GIT binary patch literal 117860 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 Pe& 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 V!DH6x8}&I3KU>H5y@3k@0|2$XHs=5U literal 74740 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 diff --git a/webfonts/fa-regular-400.eot b/webfonts/fa-regular-400.eot deleted file mode 100644 index 54c89910c1db23d3c8cca0b6fad9d7a668ed0eeb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34394 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 - - - - -Created by FontForge 20190112 at Fri Aug 2 14:41:09 2019 - By Robert Madole -Copyright (c) Font Awesome - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/webfonts/fa-regular-400.ttf b/webfonts/fa-regular-400.ttf index ef43cfd3b2ab3effb636936b82058ac3bf1bd589..3d041f4d4ad08d8b5f0ea1df1954c5392ba9ec39 100644 GIT binary patch literal 67860 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 Md{EAUs9moA1GMxP#Q*>R literal 34096 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 diff --git a/webfonts/fa-regular-400.woff2 b/webfonts/fa-regular-400.woff2 index 004b29b6d1364b691b260ec98cc2df9b432948ed..ed14925f29677750a66d06d056a0b5d9dbb07e58 100644 GIT binary patch literal 25392 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 literal 13656 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

      g3AW6u%Nb`%Y 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

      9%&RMAgP0F@?ZD~Z$-n7dAkpK(=q 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 PJN#M{L?#5={i#Jk0xipRv`;yvQM;?KnU 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�`@bVvrini;EKR2PwoUK?L-uI*>}cVC7DDRgGfvc3ow;2!*#;PAWQ=F;to43%3adpSScm z$m;kI36sdYXFg?tyeyV46Q&q|Kgfhu2B|9t)e(@e2yM>HgzZyUKXSKH z+(zEH4s`-tC6#wu;4~mjAUNi7rc4?$RH`Bbe)1kznzaDJ>~n|-p`2z*Kz?gl=X zsYTMFiX_dwODYEDrWb#)! zy?@rcHHUeFuCWBG9|RjfBh*P9Iv~9iguPHmfqgkf7+ddxp*g)!fzTU7yh|GQLkMsz zhMiqAikMU^7lT^LYMI=vx2}XU<zciF&!jYMBbumDP zBxGk0sZ_z|Kp#CQpqK()4DOzG&PetldIO6jXcq)3@P50TTconhRdR);B9J4h8aXEr zMaaqn0~u~?r2RovL-Z|G0oAvkW(zZ9<;j!P0D=q*bhre%Usm&oOBlR4XpUJE77D^j zh4W3D{AJV)zcN`TQy^FARM0uGl?2P{oLae*K3|3~nl>eV3m!Vq&4wyKeO?T$my*^p zaL}jD74^65GWb3KtVz||Wg;qNyo4S`dZANPwe~#~07BISBBO;}CQAk$6K<>`if?}j zmFP=K$qo1qsPj7b2gzQd#4`m~%6x)ADPI;skFrUdWjzbbtW;+;{F-^~X3`?%0`yIg z43eR!x2i;Mvl*P0Pr>T$RY%ppZx`*4b?T|PA6AxmAU5$e2#|I0GP5CRD$&qw3!NII z1=zb`_f5`%#xI1aR0g0Bl)?aGc|c%bm@8DEw3o@(Qi8q$7ng02p_b6#36=@?4AL9s zz$#Xh22se(g2^hyLXnJsvMZ7JpIb`hL-tt)#^y4?oxc$#bqk_(y1e3{Uz#pZ5M`1} zE~N^_I;=VjnFh>f6#?Bzppcmtzlio02tx2=)2J5bpiIrdBLw4D7A{~M z6-@|$pDL!gNd78FO{qEf)X)}A6-R~wn1KYA9T}idQF0gR~ug;_(#u_j#q~?ntlYnr1I83VLTrN3}8Feq^Fu19DOu-^a%=o0_3gA27 zh=WN*3vHngb|2`2z(RtlLIx&qij4r+duQnsGGn8_-f+-^;_F%NC3psQno2o#R zC%c|InUjho_ z)0CJDTX`YlQ^dm7-JopJ7%c*;NSlQ&s!lO_)Me<<>YR#EXEc?8iZr3r640hT!m70= z0~r+LqT*4WzAB)b>;(8Ah=~>+38GWUB0L3-BTPL+L_8M;058l9uuX%h!x+9;oDakN zhdY!IktA*xYOH{L&$9$}ms~MZ8c3@$m(8vOW>d37oxu|@(8g@8m`%}?$k}`m_5#SQ zD%1ex{=oVPLI@TBMTLwa>n7q+V3n`nx&_{4&ST=ua+E|YfHQb7ne1&55B7u-T@2I< z&>qUB2V@F%ABd3@5djGw(j)X9c!$cC6a53shW%s3kz~k+Rx(MdD3S5Vw4xiuWL*q! z!~F=F=vM*?JQuLg7htb|832rdG)@I(G$9#1m(IZp|y8K3+5|3?>+M#SE^ONMFk8mTds_Sh+<7OS-jy2N7^Cp0spfErOWC0;vEGt#mqBOcgxz3zoVJ>JC(M+Yn4VFOS$P5JsRLJg@jN4Kg^9}(;0Qi(VyX_Fny$oIqcj$tLTPz79)s<0u#ZYRj~kM#|WshRat?z4`Pu6C~T!%z_)qlom=rxCf%P@*-+ar~n*AwG&< bsm^e~f7HVD&6%xqkLz1EAG*@{eb)a2Wxt@* diff --git a/webfonts/fa-solid-900.svg b/webfonts/fa-solid-900.svg deleted file mode 100644 index b80d477..0000000 --- a/webfonts/fa-solid-900.svg +++ /dev/null @@ -1,4649 +0,0 @@ - - - - - -Created by FontForge 20190112 at Fri Aug 2 14:41:09 2019 - By Robert Madole -Copyright (c) Font Awesome - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/webfonts/fa-solid-900.ttf b/webfonts/fa-solid-900.ttf index 5a6d7476eb5fda7d62cf2c513a4cad8a4edfd07c..19a4d2bb1a6f7997137789bcfd0ea00a4bead440 100644 GIT binary patch literal 420332 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%0AaW6vhN|A78qgb5Z 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%0Dy16JK$f>)?<_p9iGkGTtnMk!dX^! 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 `GTC$U2x}@{i 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≠GKtBUQSJc0Bw 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 J(zN!c{{aS`t&{)& literal 191836 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�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 N-@fJGRqpRI{vTk`d*%QD diff --git a/webfonts/fa-solid-900.woff b/webfonts/fa-solid-900.woff deleted file mode 100644 index d92df456040295b40ffea3ae6a8c66bb7834914d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 98020 zcmZUYV~{3Gw}s!fZA{zKwr$(CZQFMDG^TCawr$(C?ws%Mt%#>G*UFt4krfq**lu#7 zq5vQO0088B2!Q)n0$*tZN%GYHtNp)6R8(2!Um*Rz2AqH3Mln~TiwTQ}{_~{&X}teI z1u`V3M928gv;L>${-G}vbo6XwV_^T!>jVJ6-2ng?M=C=mFEazDe;y?BzZl5>`1t{V zm|1(6{;P5WfTSt_z_EycG}Bje69Z!akkaYD7?yvqqICnWoBuNbK*|LF^nZ|m3V{R6 zZJgczdHetXNCyA_|7joz+-_}W^e;~B699l30RRvHphjipHU{qY03d_GfBo?PK>$h! zq-1MgWAe{C{PzLi0RXVyI7I|R_I6Ir03f4B008?I0HAH`So9`x&oa{2*Ea?P;y`6` z5WJhFDnTa0g8{e!V1fUp_ir@Vf1v*Z_@4p+>Hb%O{!jgT{nyvvb8NG}cf7avbRd1W zw|5u5sE1LUv5}sho}reJsTWWH009OqY%8W`_SS!8$iD0S0fF_5Hp3Le_P6YXuEIsL&b?Y#_ivXIK<%-_!1HrRlBK9#@-x@v`K$RRz_bAJu`kk z7${94@6YwJhbFrb*MJ^r@WxO4&;#gGvqU+`n9bT)E3q@gxggHnU-R%z>3_ zBU?wdPU#%i8J>$}+M#5*%n3V->?Haj#Hp|C@^h=L%%{EKx)^_+$Aynaov)1ek%C7w zZh>zJ<;lr2F(<#|%>64er^>JDG`n4IRQk-d6nttvWgKSuu zrD5{-af@l51S6$s+gpK#&2px6l8NIa#IcZ)dE}(7lI6He2#5K%rRAi8)8=9Zy3>$0 z(>(id`h{)yg%elXOPkIXetTToz?Q>xgKaX-m8_dt2h_D7+nUaCaT}J6P3jQMc5Ik^ zE_r>Fp0ONW-^e|MoH4H77D^jC0pk`*##qCvXm?E7L&0Yu`8{<{FNa$QY3Xf5b zzQLRvEMm}*l3_5pV^%srzHoFn%9vqBgA+ zn#eYt*ErBU6o;T}JPJ=jPXd&0LYZ&Eg>mX8H6L{NCf)BN1r0y3!uVJ{%Zb zN&?0)6pd#+5%^nS_%{S1zoQ86J`@h6uIq@b67+JCl>G?pBE_Y3|4~B~Y($N#2<|fM zC5@%?V2-nCaPpP4{Y&S_tgdO^lKC>%Sa4xhUzx+0nuyDb2wc~+QFA%tN^-~092c=e z{6}Cp<3!!#2yZbnFky5sVPD6z(S`R)y+gFAA4jz;xdX;0Po>9$*AswQPj?)O(2VvfKJ7HS; zq|M|FBA=JnKpz2Kn2lTX?cR%5G;C$_0{+;QTWH<>D0jS>eJtyK@X8U+Ph7sC0riNm zTLM*mtkhlI&7h%Hkd_11PbPFjAlo6D^f-@JC?^NvV|`ZIK2+&JFm`+td%W)G279vU zUiRprTqEXhSaL&>*kJ{BWa3*3+;EUuzUMytJ>pduFMV=j@iiIOpeDvNO0o?7l~oSc zP?iR=E3nNx#Ixrb8-XOt~*Cv(=Rd>nH!pSW%*CUZ`iBD;l_Q^|KS9oe)w zQsxY@IT2?~VkTmw-*njb2`O$C#p((-`Uoj&M*iiduSHZz* z(VF>r4+UtggKHQWh7yvs&^~KGehwhM@b3`} zXW}USZDm0J_G)1Ftj;c|EL<@kip?dpCl(%_1)c?`t4mz2k?n%)?2M%*?5gUNBO|y( z8XPg*je62(qeBq-;a+T9#9)YenP{jLWJrfstb9cH0T_cTb_8;u5fW`WM54s_lf$E~ zSFc;-u-&yAJ(Vpco`&CR-*;cU7A5WF?d{hGei&iPe%;-}6Xr2a9PoSUK4f@K!wPu} z8=JA%DUJ;}xe*0^AJ^K0DmhA-KJtFBnNdqs##cv`}hVO;xWQ< z4jB={*&Xw^H!5dZ;V74%#7wn{OtVgoQ;(0!_eR@qA_|&Q1S_(aoXZxeBlLJ5XC{M; zG4PYDW5YUoz&&alBxq+Gids=b9SyKk+=$x5@5!Eq<@r5|Ikad;;olLWnO6Ho?l$+) z+;+ZBw@^|;{d^ztgxK&C2{?oHVoYUvqdIETvj$!fJ;0W9{S3Zv>Hf+&DnJ@1s7W>~ zMI#g}a|_DJO&r8oQC{6Scz8atn2b>NfNyDanSD~qcv*htSSnPp%Zh|_L)Q3(>;&SS zAjiu&nWmF_v^jWS8?<%82+Ujyipy7=Uqj#ybaGH06508Ak&u(vvBI4IJ+7HQcC+iT z%5m#=oNsq&_WSMzYaAaG=1S;Q628tD&`voJSH8jLL?94~(H_IhQX0SRGtr^+Nxm#q$vbc;=bm_D* zpx~8okxb$DF6<}ag!}mEclJ6-Uu2ofv}LgoCj46lw&r;V=g!{~CYAj&C(ao+p$J{-UmvzQPTDbAySjZkGh5SLF<$-$m+Cc`TFe3 z*rl#>3~$|_?tio0cZ25nx$gK|nd86Nq_0F3-R!%=UEav{A;?#vrX$o7K3_|^#MjOF zz&yR!nopd&CHVfrb9M=P5594r_Ip>(l*%cZ%su2h=j?JX`{0LbUwO#6?j#+N*`*Vw z^_3rJg7EOJ>OJ%Ot#32k%q02aKL>?!-SW=*0p0xR*t!Md44U_ibMMYIH_d<9U$edO zZr>nz6tBt4cAbgCJ0tU`#F&_dg%|kP8RwWim-KMOSff^mVy`XgyZ%_)>1z!(8ZSFZ z#&owo={ab9r^Fp0hK^7Y?cI2@3OQ`(o(`FFIc2Se^l1A=3OIx3m3rO`*!1(%Ryoj= z)(dVh99B$G!4~1+i-6nj#4g? zo~e9=Eyr>ah4sDoIV1C8Uj?Ouz89yA|e&%`TDXFXI2@Qavc+>0<2S zW#QsE=-&gg0(S0@$9apZ`@`vpcTPWUQ$+rI^48D*n$rw#Zh(c>NGY7-?p?ZpL91Fi zPsbc@@7n}X$js8|C3n^7BWF=rHbx?q!tgiNT=h=RO=toxx`&Pss6xY1 zx($ntxy>f292=hKZ4rXu7lKN7vWW?|j=YvkRXm>3k)yEu2&h4Hx5CKipVW0P;t4*@ z^c>yvZn;J50(I&3Ve}X_Sltc7RtcmyR%J>otO$}bE6TdPCNi?9p)rd@h(-&aU(eH9 zwQi;oe@^GGul^_+bDq$i18(l znwU=l^@Bq6Q$jFqsEDXX50h6>$4qX(-1mUshg^}_343E;Y%DXBy9qoNY#`wtc#?}) zXmG#8)b2Yc0A+Nxf>l~n$p>b&&)|Omc#j2!73(#ogm=lj?w7lU$nF05F1ZoYVg_g~ zH7hWYJg$C`T>nw8GIu}Us%1AxxD>hgfy%fBd9C7?v&S?s_cCdQ#mb-vH3(?2HYa!8 zpItRA0N!PE28H9-y{+6wXVz0aqI?aoo5ya~4TZdWCxmIT!Qhm4zFLElP$-1*R#hy_tfX*+ z<3?50Ebvl}#yL3$_&KtMr1ahy*w-hqo^{WGIc&X7(k2Q&KbIH3eDY?|iV0=D*IJJu zRA`=-MwspbDiTD#cT;cG-6w)FJ>m?oLR}bK<}%B85`!P(xuL>TP97-}(X(jwZqXl1 z6Nf*DZ`mH5aNarKnGifV0ImbYLrF@@DfU}cE$3*yvOu$3C&tNthT=mK@;V$(HpI4* zxl+6q66`Sdyr3X`?N(pY3&#jeyo<6Hfl>#V9H6TfeurCYQcy?pkYxt3$ZxK07jW!KRNh#xVoCC`1 zBMqBhrdW@Ws{Zho%dk0@vIr1TRX2qAEEiOVfp4M}qX+~6cf@sdYb=j8k-bV%m(}S}E{iC@5A>ICcLoTb8oD2*jScCq+=qLW(BY1C+9t}waM z9G1l~vxaokbegOj7`Rwdbx534@*Z{_P6^X1>@$V7(|b{dfMefI@L>HGLh9V~C-bPC zE1T)ESXyqdIWjVHSy*87Cj^0a0Stb-B=0G>v7&z13Sv>$4A5%bG>plk#K|#toyAxp zl2-ag4I$TAg)9b(VX3XUTJHoW7R({LUqU;+;!4uKFC-ymC<|{Jyq;RVnP6mY55>Tz z3qouw$>HJTZW-ABR-o_t4cm@ry4l`p32M>g^{MFNJD9<|k5 zQ|D?7!N6S#Y?ad*6SFmpO-z8VM20tx_B3Cu%}c9OT8QOo)U1Ii4gc`tkNXc->Wpa0 zSgNu*Om_J83O>IL%&HjdMBF-3qw)Al$X#sbTp#S`>KTCyG}|1l^~z1fnoW-!AfpEW zq97^&k^~-J4f|yH4y+;^-Su*-L&(8dVM?x~*;YYht4ubwoHYxyoCg&iVXeHBWBk-5 z$Oh}Q;zfD;e!E54c+9czbvlY_L++S#Br!+b*F-TDbtyF_A)+h-NvN4PG0WO^-ac}t z|5Fdl91{c=_t;t;O5`-iA$B9;yiT%m+kDArNVNb{2o9ZA05eboGVx~!`g2)z{kPSw zb9j(r+mW_cTlPfX4hQmrZA~A7uHuiRtp`m@;=~bqg_IUlYHn!L=s7){mlTX_mkw?V zsp3!3x0nh`d2H#KxhCn4;+%8xr&56hGLp#e>=eCYjLjEf?Zihs9a~V7TRBU+p9%II z`$@Y$$83{S+}9PRj7yVAJNAr-rGg~fIb-pow0KSXM;z;Ndqxv$5L~3a>QwX_#Yh86 zvp;uIe~)+sqV~+h7tNH)_|^o=Z;5;O!%%+!G*2xA`weGN^Kyyj_S@^XFQY`!qqvK} z&kQ41dvo8#bVIBqGHXYwIXM&NGH9S^{IMhDPEIO~kcdN>pEhkDFM$Nk-@L{fc?ICh zW-cOOUkLL}6;8#j6~q&g?<2u2$z{0Xk0LWR%O#1lk-4z_Wg#y zNZ4c*wuP7*#HFCzwqXsMxhkkXBKDhlnZQ95!(71`vjvN>P`ms|4>etGQ2P3LzJ%g@ovD`_G{F*s z=7z$NR zu{ou)3?56$M5eqCI`^JGVPh8>oPKM%^iW*~xglLi1&V`Dee7O%3gc-yWon2b6BOk~ zBzUsyTk#*RgyqYNrMJ&!aWW^$(n$37>sLAWTa}@LmM3{kFM@o+d3Y}ZJfWDn@E^4B zcm@fE{=g&yvBKa*n1r;^B<&>GNJVPQJt9uUZ+<=(L-n_6YV%55X;Rv6X>~fp4Ih-y z5sr@z?iZsj6ZBtPC-+KkN|&FUVe9f?L`5+CNg**Y2#X*BTCOxQUajV{ant<2IIRMT zJ*S>6mQP-J8fOsT`5T8uLy?Jx06>+o@AiOFSfO=DR}>?6CR8T1B6miIawlEV*Q{y^ zseDRW%1GS`Fc9-4p#rCDGhmhKBksj^r{zAW#Kz!kC!M&J*q*!N=}^}}*2aRl9eB~C ze2K9DsWS!85kmJVjT&e-()I^Rhcq>&$MU{%_QLOEPyOt3m7nAzBs9*SHjfIz-MJzQ zoOb84Wr8nzg3ITDC>Lf#c%&@&vB9g)&XXU=GTAU!Ce5q2G_*2l-5`)!qZNF0(hKdG z9t|Ie34GWMkjH~vNg|}m7PjR}>_7nb#>wB!<0U~GY8440`{lNrAJQkgOObOv%w|tC zIOR{2ps%UV6VDXb>fsb!xf%#hpM`h$U5KYN9A3SjoEiMngA|Mh#mqM+d*3XqzZnSg zgAo1K{OXQy-|S1PdLC?C&%iIqdboJekrv#`S^B{CLx^;R!3bI9^n;+qw~stNyseI6IbE zWUzJ2#(UxldDxvu)pjI6ck)ws!!!rd*Q^*;^yMC6FrLD0t3o5kFW?iL6i3ViJwA^; z6eSP#XSw{8f=EYCSp{?rhD!0qbn=>?5z3#UnS~$h5H6iqr;n)!(2AuInzm~N-%iWb>Ih0!&rcX=D%~c z+>;=(9Z`18rx9>sEI=IEc^!j+s{j&Au>@|J+;cvG&WAs z^Sjt_ zhG6lpC|z84^yg-D`JH*|BgNQ_!YlEmqw_pH-Z!MN2fhQRRs2oZj%*eJW^}c{!}3_A zMO{pUu_n|z+<-cY;?a5cOE&kIthw(VT`$%c9Yb zG3%7sq%(MxX;LwQ(>LaGO5B1|pi@Uav~^RmCoUGYODHYsKEaJd)*eA!)iHwT@SgW- zM)n^ZRgd_kGJJ z4Thr*+hT|#uP?cAaTPP|+{8alvu3K4%@*Eum4zcWGMi#}u%_nNv`sSKUu&z=Pbf6xiuQ^Q zWgWYGVV$6EeL(~9#uEg)mYkEP3KUZ*opI;RT^ME=#{KLJ8+q~YA{cKi=JV@F>-j@2 z40WnAnt9|#uBdP1u|0F*6CL2a{jQ=JOfxu*i$ zOLH=1;mmQpqW?EQQ_6t3r{LQhJ?U^s4tdyNK)iP&xX)#VRS>4!QEF2GcumOn zVDzw#9F#tUDkrO-+tMQ+TI0|V(&H|^U&@L|+iXV&I+K<4;_3HVReh`P8R{kJhuvZW z;=JAF46t6-YEcaKaA~s@Fwr}(>v*%$NiUO&#jh8iL$L1JF)`{}(fcx<*^<0nXv7jk zQ5l9PP4VaVn}vxIGbAdv>o7C3uFEGKYYjTLWizH*e)CkLdXn1j75y)Sw~L)LJi-kL zwdUa|qQMU1tA(LhomJ>-!2xCM;}JIll3E#n*GK;^W!gRX_Musx4|4nBIYw(aiXn36 zOTjIhI>wN1^V;y~I7%&J%t(H_Zhb7|%a$Ls>E67*-f&!|#R_Uv0kwP6NmF7VCL<}| z^%mcLFmE;UzUSkcwMM>}E^%5!oNoyasJCtyr+huRzN5sC8^Ifq-pG-Z?6nPQrJxbB zM3bbCo%vZTj9Smrt%MB47*=Z;QE8@3;QM)R^5B{hQ6iPpmk17*v`419>v>q6XXjNYh{gNMBfJ!^x3sbMl6f21ae=bF0w9` zGeRX;!u?63M6_RQ`agOJPCgCzz$VBbanL|emuVR)rDD&ZbSo2yzoLJQhg>r8+&Bdx zO-daNPxn?o;|6rG%Hx~s!n*2X$%jpm;@C(2fa$SPcBS0HmOzE`pEpJEGh5$z+=~s^ z12c@2RegSk3BqH@gvt=n4T>q({`SG8|Bwv{ zWt&JGD+{HK1rv0zYA(mDU);;=UD>fQ)=a#btc z$Me7m>sS`8!i9Q#_pQx}c{nXeGG~dYCOW?dAjRpM?pVI2MrI!k!TLE23|gO$G!>6> zW(Jc}&G~SdnH6Y%20YfIBBg}_$ux`yk|D`#TFr6H9ch0XNfM%i9Xi`J#m=jOmZnE* z$`sm-GD5A`qDEj(5+)`Fr!i&&O1<_adLps;BSp?cDHCWTE-8blktZlPLSXxQk^ztK z(m_-tqu?!Pve>e}xEbIyuG<1|>U$|W6w7? zO|(P?92v{+Fjo7eR%CRS|IS=|Ki$G-o^puSH6b%DMjK%nrm?xv4GmmuiWqk_Y4>lF zvsg55Qq#TFtDwmhM%o`!1Ru>?9zd5-A%QwrJdJji^-T&~$(y@2K9+}#fc81-(I~H< zYHHY%h#>2|g3L4^+cX+7iUIL~gXK4(vC8#;@W-xSb0nqKryq#n!A?tt<=M>2y!>7w@T zb}?+)1OvUkrAJc{12tvG(NLSnpLzTU5vZu>4n+$w(bz#CMK`8(T>6NCG#G!23}>9C zg(9@`N;%Wh%e$*( zqsC+Y_tjs}?{N>1V8vw%vn)-2Ol!i52V8=sof67)z<2h^9q~Pl{*Cl#VwkAFWJ ztNzqRM>;!4PO-uS>5_}ob{^EL9O;Z`glMDsfVX_Pz@tp+2cfpb(9CvZnn7ScBJZ!@1t!8?JaVwO@v+7DKtL*>+jJM z1%LcdsG^y`{X_D_UYYjKhv3`OG-Zy$WC>&;cgjBM{A+8p?o(KQNkXm_DaaV;rF)irR0O z@2OK>bs;bCx**ZH1EpzsP3({+QiSf+h<79?1ohY@v)7d!$hMtuAVB!uIevL0*uXc_ zRHdN&NcPElU@PC%*n#l*Iw9R~PdE*al_eiGxm~t9y?@Xcw@ww z#d*|+0qYA|NRauvQR9!NAGzTTzS*B7TNv&Om`OJ{Vg7}8!5_nQEkM{osYd~KIM&DR z!2_oddWMVblh9e`I^g&fiVV>j{S;vTEwbGabVZtu+&*YTMKRx8UGtD4L-Z5s_}db+ z(=aQ-Eq>MQv4Q#7E&Jz~Bf7>o3^AmZbLR2vuko%jfhTNQZ{);F60;7K%oOWuzOc3< zZYb7OIo=bfXeQqEFLHnJg`mE}bfp4ZNIQx;svXLSQksfauz;CvtyKIxVC=9mf6?vW z^@R4K@vr2CtVk9j)COw3U=;&JyacWprM@_~e`ufy>7`q8gmf@U#(5!=Irj|mLeCqG z-w**{z>IzF405;}=nYA0bs3weQUJp}MY4LjT<-hSXgGq)eJFyOW&M^U3tx(GKdPKc z9p3N3!eDXXvNP{9D?j0WIPXU6O3(H^!&@^xNgwcY)sJA8zva^yIruYqBtCMyd8Ad@ zWXqvv6X}ZeB4$900shH2h?@{{A>vHn!Y>~rFMS8o#&5oRUmk#1sPHTinX{iD=({W; z3k9VFRGDUHl1T9uW4J(5&uLw|vAtOJ3A5vieX(+KP93Lki?^3--jc zBX8w7M^R^rjHM+Q)Y{!2bGdzIw312( zPrt5`B1%05`~HM`-OjB8oDb{*1c1!;C=Ox|3b-)PA} zPNDRaL^@k)-4TvFE-PD9nitg9Dmo|MD5e_WTNqb&csC(-KQ~MRM8zqzSl-&$XFgoW>$pjh9AgfY>dSopNd7% zKzpHXL0bUHof~|AMlVNl(h)AB@ZgLh$uCN!X7$k$_Gv3C(v>VxO<<)W!>$awS^2cf zi=;$PK13;XP^OTOO)SYZrZ{tJb+S>{k6l)1kwX^S+Qxu$V(3hjf>-~H)81=x1i&OY zIcodpx!~b8HkEt5Qeys6p+wQm8Y1WqFyYTN{KB~KgKW5xs1|Rn!A%K_`s0`ZiT>b! zk$Q5({z$OZ0m*u1?BQ0-D`XzILswefZ=_p6eYw-@k4Xp;VqEQ;NY1vw2@~4Q6oDJ${YdWu+u$D|}^;I#Fs!XaE^K_^a0H z5x*!qMQ+EWSF~Qwe;5v*D%Cg{jRo)O+1w3O&O7UOuAb6gufW6uA9;h_DK(|_Yj;<3 zSVSIdsA-w2ikfv1jK3+raAtB&=b1c+{6_5+sbaEUj!l01Ywi2v58ZDw9&AXrnNG3W z^zKB~nfKz)bODBl0BBVWW_h;-K9;+n2$Qd^vpe}Cb0cMVU+A$9MbbKP|1w%s+slHF z=&XZKzl%iMHecb8N? zG5Jjg_6Kb6^}px;W=jm|&RrkHuR4Tj9b%3SRY+4gs!{1-Q{S-4&O+<1u5fnNX_dty zbCYiwx!fk)kyDAgPD`U?3jKQfbZUl>wQs;>+t)8|kWd-Y-)1N*7OV@Q)t9p1qvxTw zei~Yho@jAOEvgVhk2M}d%`ytZB^|?zG zKUL9xJWS7|F`=swxGsT@4mUMixJ+k^Tt;&m_u{Uz#HsMKQ7*@krMWBT`J)Sf$1?URdA!EIIjbSwpZ=^Ha6Flo2G-Y zFu?gx&?j`c{eVcV+*+MP##Hri7^6dQqRDuHZ5t~!h1PL6&fS7M#j_q#q?}4} zc_)9RBkq@y{H5XsIM(uA;UgcMAuN{+f}@HIvFyVVqX|>#LG0@|wEAMTg7ZozY`22T zPFb~Xsh19}Q3a*Up4OY!&4Ozn`_*RqY4!{cQnLN<80;c?kh?@x>@b2cf;Yw*Bp14J zyU)C%i-p>{!Vvf*T&h)TGV0*FERQqa^Wu(o^?Z4ErqO$+de9QJh4*&^7445gsf zDzLl}D9mDjU`8i*Wpo9syb&o*+(bb3_tln0EaXEX^x42L=1+-d0J{dxOrOyYq zvx2cc`K=h0w4)KsVUAe>SVz@m*vGc5c?d7dmO70vmz54)AuHNu6jg zdHnO3AeC}88@PLj%k|XD0t2%`jcVnU?tPb&nYokuquWeH6MX4dp3SLNoIBg|b)-yd z++pOgrAv^j(^JAKOt6@@jyD0Vu@UJCS^vDkaQ1+lfc#>9T3LhDHvZ_Q7nsB*J~Q&C zvIVQoYI}!L;$A(gi(sb!1O>&5eA{tJ7;6Kv3>bb$p1PU1nH)Wd#6R!A^79y`YjN}h zQmz{ePpu0KnM#wh$dIX-2R+Q0%P^6GN`bgo!;J1zvq;085!HEBfrZn|71uWQmsWZ!MJi_b^j8e?{3I*SeEt|QE|(M&D;vy?zOK= z2(wC|ocQifMUl>lKu@=MbYp080|&y*?>WH;iX`OI+RCrDqk*a4%3`PU_5 zoIeu-uEDf+$)|=wCm-w-#FJuK?*Hz(61m0sQZI<+0Lwp`VVdz8lO1vLp71cd_o9Zd zph}W(oJASgHys|%i);fThVa0!ZP9DGz^$hTo3Oo}(&LLyB{oTk7^BKX{b>!`pv4PW zLm0y&bAv6=BlmBgY5Q01utPg$hzg@j<>k9{Ap@o?pJ`?9hW85CAE$>}`AK%!pSpSS zt*k$KIz;nWe)1~^q2C0BYTbr0Ap?6i{n3)yEYYpDS=o=n3A5zkzP2gzyn&#R+n-f6OYO%8@vpgO12DWjxH*Q zC=`oqg!lVaTb5H(1Ou1pYlPZ48xo!n|8X^w*LcPyvH8u7kireUt)df60w<&_EHbQK zS7&31lx=K7$>XDG`m=varp)R1JjFQ1Vu>3naYFw`9DoG(;NtkMfa?G)<5uLlS;;R0 z(&sUKj99fT!y0$51>@!9)o=eC0|Vd~FPjx)MuXGA;v*w!Wba^ORhj=x3p5R;?_>qe z3_l~(ptYWgGewd>5{oqGJAq>8vc{~}<}*LB`H88dG^8qrUu`e+jCc-3i5w%e=58BR zT#o=JN2!{^(kwa)IpaTF^%)nSpcdj}vDR~G`(9&UdwKiyKh=BhyBJ@PVWnH)r zY%YE&CBDrxy2abk-X5tM&ct7$qpSP$)9Hw5v$G=w*lsGBqvhA>59g^n{Kx>~0gh@O z^$65L^PV0*qJFI^#))D6oaLQy;=%oU^Y7q^q$1MN>-3TG^m~?3#!6#?S%UKm?B?x8 zGqO-Mt`|kILQY$uXa0bTUK57n!VQ#!uZ&(Gp^ay%jL@{-0P?M*>&KdfY6w#fq7Z!K z8TylYoz#Y$X)k?bY8rIojAA`egM+tDS}YJ#i-0ec@nDgl%xR*m_xRQ0;FU5ouJ2GY zuTeE@J((scXOrIWY0a??2qym&rK%8|ngElVd|F8fg02#2#WHRFOz}gn%z>#9cH0%I zioOEM6|zal^~AcpQB#sn%s;*;DgINNODEqor}g)oD*L|ku*1tyPZ$#Z{GykMRJYm^ zVj3vjYhpBAXq(BaXi>ZT8=h;xeYWgP!O^$fsJ4cX+MFX152(qMT!gt~aLlT6ZZx4h9U;Am|Sj;r_k_*1ZZ|?Gfg&bOqUR?Dt zjP;NVp7$Q0GY=2~9=lmMRPg9Agc{R5pt?0Rlm=$Izl=5EM`K7n3*ERuZO(j!XKhaA zsmlS5^X*?(;JoZBU;a1ak+1_;V_?kSV|bwEVycxhlTlS$zcr_r8qeMu-({I-0Ehq-}OdF z;z_ZPZ47z1YyURC2vI*9{L%ys{!~~aU=yhWC312@$cmvIc6@TwP`Qy`I7jswO;aN+ zm-FA5JZvl65P#*{eKC!W7!DBTl@Ky~4d&fN$>^+4@#;jqg)(*j#$K1QkxSx;0n3mD zCW@B2>|(gHS7wp%M*kB^DcuEx!#GX|xSHX&hdn|TJ;5TjBZ7~!PtzUKTUGjkztz#%%%fW|K5^!(VqFLU&%~gqr8&>(DzFc0mjM{oJ zFT2or&L#9JYo@tu_S$R4*;cJsO7&#m2{WpPkZ!h493N4jfy+?8Dw8p=gsbi)8mB3D z6n=})AVGQ!QmBiV^~sv<0N)V}O|)!G%m-r9R&Zv*RSBzz)ej$Aw$@~jzw}uFAiGU{ zaPB~fQCo55;wq64pGoG&F6{u()1Xkr8u{nJZq1^WDfYU14^HaKwC&l_NLv0{y6&D} z-bu~HlMF^KH#nt&Uj>eI5Sm1f|8+qX-@j?Jr5Ep`C1%@Ybv9{KoK#mZvH{KV=H>C2 ze|nVZu|5^2Fur##F>`uq@!%RrOsikWJz*_-;s~1HO-zdS{h)-ZRH-n~XTpz$Q9IM| ziMLI z=1Q}FTylR`nrGGwL=eD8d|V4GH&nf3eLfZ<$~bxW2Ge-LH>|gw-l#7Jh|*=C}VBbsEg8-#IcHD^uYw!a&I;(hVA`f{FHch|+m z-KvR^t@2F%_o|>P<$E7`ZWV$I%^?!DgESgAD2+&He$lDThi$8CjqlPjLK)$cNcJ#BY500KO6_Bu1e4K&Z_$|uYmbqcvliD0mPqYs3*Zc%gW6yD!7u%n3t`InN$mVpK1pXM1$FkZT=ey%O)& z?T;LO-vY%OD)a@rK*o~=`tb)N^9+ZrqPCDV89JuiVE6TM5rTR%clvpEz z)pT^qtBFNUgaTZtmFJ>Y1bo(1o->&9&&m%5A7=+_d^>i~FZ;(MBls#9bEOeIGS#}` zNlKPik2r)LXWWCZfSKgB6HiPr1U^`Wm>lFfydzOhY^0}$YT5|<*LLe}T0JI$e}5wN z$tm(=HnG)geRw^nO@_#n@0=x55yZ|Pp>3k8O50}68Q9_yU0U&^98-H7x#%Je`99Br z@F+C*MVu6H0`c1(6*t0Wft?PQv>6(@nnmQAieW=H^(G!LowBA477@D3G7Yyu!=)8c z%M-)9bd#UOA|7-r7L#Fb z)8fA%zRpy9*^xTeN|q6yIyjnZiao+D3%}Qj+qtuQ*c9eO(;s)Ss2pCZyz1W76*o%^ z#}QySeH^u)d?#EBb<^SX>bNqu7%pRvt=Cp!3`S?mWUdJEl)6wex~OzD&sFm;t|}(T zTCYMb5grv(Hb7J%-{YI~9&w0w+d$c(eKB+(>=)AQLIQvZvYr2zY~6$n@Q zRD?_pFPr=cIOT-pB{1JbaKme+JTqikV9YB7@E^F>g0#3!q%8-3zP0Ct1HecUS z$$}NYcUBmc4HS?>5x+_&PRZD4@KOrTsjm|TQ*_wELbdLg9)-g3;tno4eW!8 z|CbS8kJN9@xld+d7gu>!KVwZEd}azrhJvuSst>NS|M$I9JVe7!dBjNV&T_ z%hE0ys}f~h-a3v#cSpUXS4y!&cTXy(^qL=b?Ve5@AA2Fh3gq$3AopftN$aImyE{jI z8sW`VzLWffM+RWouUc&`K=?9d8DodTa zmBOO3MwWM+T09P7*Oz~(QAFDCaBpAx>ZW|yJlHw^k|VVGbmEn1()~_MK_c^8js%vN z{oS&RE z4^rC+?j_d*s%)McAA#IJ(4=Morl4xd?^yrYEPL=}$IFVZe@SXV)|UHAgl;_cPgb_GZxL2Ao#!l2V6M5@hXw&Y_UK%dK!$6N70A!I* zs#b_AYI7B}T>G{fXgen95BND#E8&59gRpknJcXK}3Hm}L%a;14&0ya`V7ll-$+8%ihVT1Q5&bTCrlJ%ntr<&S(R`W$JBVV(74T9m65mD1Ej$M}#UC0nW}H$KvH z|Bcl)9C(QP4jg!~Rj6~p>r0fNyWi;+1krtd<@Hf^SGzM{=vi#=3)r+zgrROH0U`XG zhwb+w`kJ`>4m;pT{L2%VVUWp+^OemnDF9ne{}CJjm2+1X@kgENgZO5h#1SE}_WR+f z=KhA??{e+%un@W~0w7`_P(9i`4ue!2XA}|gTNhXKT2_dg26GT?r?S+H`6{|Ry5hV- z7pzpO_~KVd&ALJ#{|*bNyYp}~m&#Fg`Ma!0wqi;VsYv$qd+{j_Lg*J^<;c#lV(`7i zf&_n+Jz}C`gZACwO)Xs@#I3V+6iP`8h>C133*(d2$wN~<9tx8df?0IKxXz;eYzS(u7_z=}i+bF`F&))y%Z@F?J_nl^)6u-tnxjA?AhuYCE->ww=kFGm)h9 zgAhVWFQ)U82bZ@~BWv4#+SMhaa_B?~eLr_8)uqM6Y#P;t%Oc+#5S3)5!GN)E$wIGNa*NMx~&BB?NhJKv)i zxl7%DXV`fyHKvTEEL-L!MN-t!Bw^J@hvU*ycq~o)=`nmpmw7=~LkTIKi$dHqC3SY* zMIWf;5k3VfSBPMbaXkyj@vdMY6R~3AR<36XG+-8VmP%vUGBJKa*P~1M?lo1NB+`VF z)ZpD@Y-~qtQc8KYp`>GEmQ;;)0hH@u6he3QfZoT+=wgRF z9E$tGnB7h9TH8W39*9g#00f*TN_7p-P!Ca@nF46RKi2uj>5z=+@EE ztz8(OBQQRZKjm8Weva0FvV~t4$8i+HP);cZeLf6MbH~`&jDWaQZu!C z6lrNmQub^T7c@`4tYT5f5t)`{s#kXE6w@}l;|@F+4)QQoSljY1(l+7$_qJ`;G9sDt zB28oGC6l#Jk@J#CgXOz|Fyz22K`UD5|Gf8%VRSz1n9HV#IJ0W5nw>wsXX*C6pM5W} zXtoS75Dl@_EpJ}hkQN*H^rE^OI)7-qs;b(PT0SF0ysycTXy3-l#*3hJx(QlZJQ`lX_L$y|*HR`Kiq zvHoTLop3Ie;Pl}nvJ+Q4;KRG=i~xXcGf<)M##KrxOaa1{3k~A$HdIG5Uibt0_=CA> zY9b}2bXp7N;$YQh<>BcxHfN%iriGG*ioQ-C@1CsA!8fa>2C@iO-&5J ziBggILXgH0q7qyAnE;KW6woF2?D%!>42{QNV>3K!No&N|UdE|;?3fxvaYpAC6s{MI z3Bwq1G6aDkKWd_w@#1N@b6mSCi$Vncim`0)OaK6Qj5j4_JgwO(Q?0}LY^!_OaN5@ColK*{VpdMbQ5;ew!Hz0oc88wNW(vwS?Ot{~e+ntmov=k^cq=VN6T=pj zdj9u(LrL?3tc7etRj{pI98PbUOj~@^JB!&}--z1Dn(-~W#R!#OF7_GG@%ASo=15F< zxbbdf{{!#cVd>XPa5%-alvY<&_oQYDTcnh6vV7xWJ*S-L!%_CFXydirJ%YF&@`+943H`{>PnsUBet~y`A z8~P_;%h&6cfQp)@nzl&+zNx~EJ=dMj`~tvfl<(ducsPg5Ow#%{?ovq9rMq)r|B6wY zw!JS1nZ4p0%?~NEv{zB~O0rTkUs0n=Xk=@(+8W8sQoB^OSD3|Knw<6CPruhf93^cm zhgo#EvPJ$QSeTMFGhE$@&|GDBMw95ZAb%upsrac5UU}s~l4 z{CTzSPq9k`FQA0~aE%yWB+i9sJ)2nf3D9~TefXAJ9=_%6R6OG*rVYeqVduxUkXPTJ z!WXZjiawOitZ;Y1JW;%IxDhr}w(A_u`cvE^-Fo}A z-odl#^4>&W82lC~8w=q2??WLJzwPIzNxL&mY7u~p12qyrrKkI1`ZN?6fB9(dm@2~swo^|nl z+ZMwcZ_lg@+WI~d;BEeRz~Xn`-Iv!tMq?k^Pt%;#eO*AWtPJ5m4wfc_5xLiv3KvrUy8(T65?)nbO|sKeu#$^92i z59w!=HQ16Q!;m$<^WUgSN;W1+b<{@T)4E|TYHnqF)d=ClWus&B<+!?N89HpP--44F ziGapmq+kaut@F<Qa~|%M*y$m(HaEfU@iRvI3b?sHO6HcKDK0c2>eh4DoSz$mBes47I%%pgf1vo?8j2ZaN=0X8to+siCCD> zd9hkl>RXL;Dxp+wC19!?bJ$v&EyrmeWXO^1Cdd9t)o1&-D<7vm%5gfjq?*lZO zF^tS*J6qE#9>Quitwu~8i-!&4@SCu-Otixo9K6svP{i7ZBHN;(g-nIW9=)|LVc%X4 z8Ut8zH`P)i=7YLcGzwH84^|%2c_DO=N;xQZHA9ucp^~23jQg#LNz2$a!lYu#GA|c2 zEo?7@BC!*NDN)?Lh2QwfP`?*CJejX}H@s&hQv$39+yZ96h3z)h`UuR3yHeTqTk3brqLlOn;< z|Mi-W8^*^mbQ8mx0Ln8y(Z2lh4_`7;trk~^C>y|jlrNMsCMEnA#$_v)|KOp~Vxh|U zdev>ZPA}zN!ClQA=T4H*@-IoiY@mw%)9aP~-a++N@agxi)GCr2Fy~={7G09KQk1dV zD#C)_Li)4l^0T`zoP0;dcx|i7kGI%!6qd(+W!^AqQ7C^*<0HT7@alxdJGYv=HU%r& zt{I)XjIu5xgoLbex%{>iFYpF0+-p<}K|qMl;>$7ONbA3(s$U{M+5uJLa!FOMxPtwp z%OT>SW^>v|+?&g(x?$*VZ8r6U5r1DU=fSk>K3B3oZq%LirK8Ug323czmVl&Bt**!# zz8<4F&FnlzDb&ws=H2oN#CdXpUYJ22+{#j)RT~AyQq)p;%v@Zrq`h@1F}_PHbC1d zj+)wjkKoqz9^nPZEELjJEbyzkej~Mox=9=DpoxR7u!Z!?w9(qw#^smOMwIg#*?ESl z^wm~gMk6KCMo*Wivr_9yf$6}>o92=TJ)ge6H4cb22W*HBwc%HXI6+Ddd+Xj@AcY)j=udZOa? z4ZNoThc4RCto$%-R%WwK_)f2p-j%dpy+Es;->e(92Zo%qx+}AWJXx>38#So9iWLq8 zkcnv`&(az;d1}9o?MBqD7S$lcB8FtmkPU4tKP1!^ixI%X zorY!VrlZG_;d7os4>(Lo1-&u33&V+RN2VgqsF{kICZDsg^j%4aT@nsYY?Hzx8``j+ z<0Abwyc$hU#)s6lLX3^lmd#Ljfl4_5Tnm47ww+R*1Mjr}oGPme??64x%&-MOV5GQM z6Jp7cghE;)heQS0#pI1B7f!~Axm2$qGqm}gXSYp+L)Gz!02Rkp4oM+BnleWnXqBCH zi+EQuITDr#JSMHLasNsAZX-QfgdHEa`Grwz<3#h)y^)%O_>y26bChT`XP82b4=H-7 zq$?pFtxhpFxrR12m*O7DC9zK3p3xQc+MTMzt-qDYDPi`x5MxBupcMBb88 z$C}6980EuqcFgUwvqWrlmN>57y)`0esdLbvL(ad*Z6C5o}C}ECU#LQn2je<4JAD-7d>FE&^6)Zn*%1>6`?v)c$%{53H_IYm0z6YIVaRI zcdB+uYgX$;nyrvyhvuf~n}4Kn({mxa^HzF_g2SA=BPIMc>f4sqHqh7pA5*(j7KXp{QmX6Zb!}3FRVpK5E1uA0ix(1@xo< zJ!;<~Wp8_wzSESm-K9zKFqfHbCc7N5JWWkbQZWu<%#oZFJti;l(V1LvO|O?*ao4}^ zr-hy~1ySB@q~!Vc7*ReK9gZf8$V^(&+sJ6XQMylwh+9jt@x@f^%ErMHJ7+{GIlM46 zwo9JR$RQywtHwJl{l{W78$oC!X$?jBJl*hfI)0PQi<#E+wi5?iR}tIU_2H?7)~HV- zxtHOjFyms>grj%mCCrCL*AuwfluU-MhuNn`cfub2rW==xEwZY%r~`=Uz3_Y|b@pG6 zr8O)aKV>|wL*}CzZ)APXKEtRFF@HAedp>r_qKJK&VS=01sU3tk5mL*;5oC%)XO~hR z2&&#-F4QDeZ_H!`7f}8D44!G0shA^w`SkSczRura_37%u_*ko8IT>QC(zd9AXt&J5{YJZKa=1TB7#+ z2B^Kna{SCZpzbY#DCY@1J1)uC6bn;Ag@{WY#kxPYrWqLwE?#sq34tY!GaTt^eht5vr_jSM7D9R4g)gqR52R00Rhh|09R4mNi{QJah#I){h6STjiu3W7Iqr8{9l)I5= zpA>hYc*!5_$R=7qGKQ@n%*$@vmDy#PWW5t2EDU@Tj_nfJ$RcE>wB#(JR)6b^h{h~G z;fM9Iu1M&ws6^Sbh%?#%)U^%cb~UCdSS5xgHJ#YcS7bdJu^i&jLZO_l8!w!NDU#?s ztC`yoFN>}!s5{^XHQ~1kYEBitT`uQiD{OwD_FWb;B5oP6xTdSJC}PM+Rb|c8v2KP8 za3FWBSiA-B_B9w^0DsisVO5iVS5boU>OK7DM($Q7H5JqvkowmLrP#z{!Uj#Q{;>NZ z?^{d^su*i~chtd=NKJ+?!y!KnsZ(kIi`x{>={Xkso*{Rq^~{dsAaKsl7BUNUKGOZ< zon7A>H;H=#(RMsT=27q7D4*`KlRF6gbRA4Fe?fK6Hgul*pxj;@lja6r>pYa2pdWqS zU<#^4F}`yyC>T6TpLY)46~+E?WNjjwcEUJ30dpaW(JnFD zK~Os$PXUlkpgrNQFTQ5JTu5GQM=wbh%JWIfiJMthQk;p8PESUiM0hwUtN%OhSYs28 zBDvZ3CY$u}y=N=D*j=O~; zZ@B5Eo1#aKfQzo6kN>77Z;fj+iZVN^C^K68)}%UeOHwUMQdv#jf)0-CdmkDdMdi+y z4plDuP^B`q-+K~S(_gHAmG(`Bo1<1g7zz>hZ{sZVu9}X!Ey|+w#7;egg2`+WfemW9 zn#ntR=0@ozOt>0f=A&x0u0?G^+a77E(fX(==(oa|dXGAyMrFOA;b`XO%ve>83Q1m< zZ`B30`k8QIGQI5JCBs<4&axfV(pZC(U(rHx@^ULr#Ey0sE>B4@_y*&H;qZ_q$7OA3 za&jRlhqPNU=95B9N`2UEjAtmOuj>@`&s!53j>#G)u6JOO@n{9cX*ah-_7UVUtf(}9 z7jMgVeH26YZ`Nwf3(T%r3FkeNW_TMvFL<{h=KVV;V@_7shS1LlH%m~RxJ7r^b&fu) zxT6X(^!kp7982dSD}}8_r1L|f{VXNT6*IY&56QZWg+d07;Y-bE)Kpyy;C5XO0YoDw zRC}nFh&JiIO*iglG*KI})r72$h0{^3oEwYI%!DG5-$T3rizOe0j51NnRYh6gQJ<{^ za>odjXDKmpw)6BrlVQ$5vjA>a|K00~uHj7dbUc#_wm6rG$MJYtr?y}8^f>N(i1KV3 zC>}wY_+3LlAsX?tSafS6_GqtZqtQ~$Es96d1$LKeA^pdc-}@_jB*pxkFUUe<;J=1` z4dyk~4JQ~|7y4;<7IUb>%&=0+bcF6p6QR2`BmAzcsH)4VDrVmmHngSTu%TWy6qaS} zR^k7p?oHt1ILA9x|gTY`9%nXPd7|aYvg1`_w#S@e$lAFp~Jd- zLGlqPmL1BLZOKV&*l`@m(Z;l%W6O#U_>7#56UOp7j<03%oUD?~^Gc34t9Y&9tM9As znH~V7rR2Te`#loVRb5@(U0vr_-|_!cRh3?6sA{n1pl$_wcbeVFaV;3s#*^LV@sxSF z9WdV@iK6rdGhknCraT$8XII#T7L+)Na^*!=a}ZJD5?Lqi#mLIruGn&7njfBd+b%M( ziwESck<4H$7sKNlPhWP>dyym_0^NR|v7%!i@(E z`^iY(XxKJ2gHe82yA(2JVp24(2Y*Nnb%{1VLPMlozg!+O4ZHMpWHEWF#!DzarASu7 zU}en?#z~BlOd!?BCaV!rSYITw(I5#iE$Tf6JCdkqbTLA(C>ljwN)jT+CB0;bCBg>S z!Sy6H=LF-rbntdvzg_FT%Fxxvb^RL4Ii~B6%T#`+E3@%`$0Y29){$1B{y~sTdSAe2 zYfcz*!gu}hPs@}Rs8lRUETHnVd!CoVQJJT#EAsleYN2P;=%O|iW+}9x#doDL5N{aX_Z00tKsu}L;D5oZ*SUHDb6uK2f*9-*D zp@~y1y9z;Zvc&7>0bf7Av7AnqdzSk({Y1Z}^^=`gEn^*hIE1QG-(6%GPC}+Jzx+^R zBXof6)egdL&8;nQqGiictFNg!*gjHr5Zyga6@e}IFJ6dO+#glRJy?$)2?zCPcT~U2 zSDz=djiqeYM6VnXjYPKnFRGBEd}Mu&2B;YdnKba1{;I`X&81S;QNwpz_O;1QnP`s9 zyIX*NyteKM+4DG@ZiR1h&m6r)#&7TWTQa^)iL^%V9wB!jJh^cY$tcn z=vMXaZqrDb8yf4%N^gEZQ`J6e%IZ_qDKn+&@y#)l?Y?RBbp{L42hwIr(Ffk}kyhW9 zI{M6{zsIcCql0A4CX0Px)$2IR{;ycbm~{lY!9(55xP2$tQDi`zub13Rwo$5cAFN78 zxhldgVc~+knbuLMgde%LCeVFleQm75CcQ~W9)sjqJmzpE*_MANibq%o)*Aq~$B5Y9 zFOnExl*Cq1+{#FdDv`;IoW|o9coOkvTX&Sa7-vf+>FZ+|#5f^aL|NQI#^vV-;AZjQ z1g4SBjBJ%_^B@C4TF@`TEuKxq z8sYRUnDR4>yS&RTJozZ{!N2Fb%(HSl%yWOr%JLap<6XU9F4r8rih(=0|Vdw<$s%vur8;jw9P{+ji>2k$1)=+X_dN(ABg1ZoYZn z?A0M9;^I4;`x90h-w+ZlTfb4xd5qRdRAEbbo%|@!CGHmE#+w^P_C-mPn}2(wEe6OJ zX*k%NH!Wpyf4~eMB1MHtFAu31&&S7~l7C}$T68Vu3whTMeG7w;wp_`A;vl19@ZBwn z5Iq~c^zeye+clz@YLreipy(H|$xAaIrh1G{?7rqipBmG)qG9U>O;kzw+wZN@ILl6y zepU|?6&lm&!=^?jb~K;SB(?GYpS{>!tgbyC9H8%q*UAbDYt2Q%9j0C!yl^$3VS%h< zTZR`|e|-I9vfu|#Uh<258|$Y-Kgqg0&m5-({W8t4Pgul@MOHlgBQAT+f;IUI>;9;C^Jjo#zZj&$Oew^0*y~FS`7yl0AD?q`f(gi0e$)1^NfffAm4gt^8>M zEO^KQBK3>cr}AJTluunRB4R&8SmF|%m_{ScBJqY{Vr~{mu%r%oOLZOGr93UO<*v?$ z5$N(c6qqR>!KgbN6LB^2(y2sfyC`lCC7fJtBX*hE4llR_xWOzfE#%OACzhxyYYb==@(IR?S3u~9cA*_ctyJ7Pqr4%$<{}kBl zoSXz$pYVp^Bloh$M8cGIPg=?3G(03Zs7Kfx>=(voMY`DS5U!+3?A|G`-s1ZGK3_!x zg3nt~xz6@F5U8}y0=De2r7lq~&oT-dE>hPnNSAh!0KNi z-}d>uze2b{c!O}C@NVHT;rE44GnxqzN72Lx;n2tHCF+d1!0DLca3x2OC&gcFT=@^= zKi|E|_RoE8yP*v#rX(FT)rAGsJSs`1GALaL*5N;Z?m&)hA0OXt1a@eoAP2~Fp)gGX za)D?&6h-^f3xPd=cg9zkF8Hz3bs@v(tS#t&)kVUcNGM2N6^odw04|*> zaGQA|L{m`|e}^urH|iJROuE|k76EE@^HoNJVdCfKEu}yqY3gI>6gSr?cF-Dt$ z9np-iM>w)ZuE%w+#R*_w*L^JcoG)HJPkOy=|4{*NwrsNOcX9|Y&>sr@!m=KXS ztX)vuNqA-nMfXzPy;PeJ->4{g(|ld?d#^LiyrLZa=}*t05(qKz!tCR-JpFl6lx;}4 z_F71=W-xs^XnQ#XN8Die9(p}t4 zTpev95lToVLp%Us3-CK4b6s7{tgR9xdTs1fdNo^FxEF3FOJ60j3yq1>PEOUb5`U>g(3 zG$XN8VCLe!Z5y&vVRs+(XR<6yd6{kL6kSutvbn*eEXoB*Qe+}&R9EGTw``azB}1J$ zCYykxK+tHNwTxKyR6tniTzz#l;ka-ToSx#a$CQ(LQLbr^6bcb;e9xYJ!H{E1fq~f2 zHnwwRO@E0w+R0Blxj!&-#xcx8Rdo)Zs0d?;Rwgq^+^dHPM)&K@Re&}j{a`zKW zbbiFJ8amOmSgc%}%|za{hl*2;W7|X>gxuT7rgS3O{gKy7)o4t&LzWXM^iFk$TwVqA z=YlZFW~V)<*PCaguO~#zt1h&>Up)eSQ<^%(l~sVky2l z6g<5P!NuijSsJlv7s#V<5&B`SioSmdTb-IoBx0(vDIRYw9hCy|r3g|Ct5oyP&&rbW zg_92}M7a&u@^imB_a!mM`i;g~uz-6QFvS}sb!4)lPiVz~Zcfof7wh$LF+>ewZ86P{ z{6wc`4SLy9^B;akA?ozrg;SDr*KuktoAi=RhWX*G)HusV+|q}BM+wSd;TV)GeZ7Ug1xJLZ0)?r&Vi2f4!MsN(2>|p=LHmDghyI`b@i$>5~ayvvX%9>WF z;m%HckJvl|SR!|ZES6i>_l%%XhG<4?dd(gmIS z0uRn_v!p;_e&e$mZRyXcPKJo2x|fi>)ycgZf=6gz(%dmr-Mf!%95UmEO-*`~>bC_e zs0AOO2NKQal7sS|WWRpMwzXkR&y9|Lea}*|PklK*F`6@sVM$U0YCsx}5i&%C{nhFo z_VmfAQu1BqKy7bra<4XK8>&ee&6q^o3G>a`o>Jn@RHDneNF1FTUAVhHJGLN><#VIr zZuTUdJ#kmEw|B_(JpuF6B&(-=;6sXZa2evO6&<#$VLU*7p(TFgq>D$Iw4{&-Nu}AA ziZaL*JO-j1UGn}f+~0f~iX6v?0L%0_IFb;D3v8hF@+Zt-wk?QcwEHq9kL5>3@?*^x zxERuPXTc7OZGV2PxuFa?6l?U`RPO5;w3oFDXSSt>XIf$Mr%r1mb+Eu zJn25324Z}o@W!W-)S)82N?pm557+QpU&=Wg9>+EwpPI+m(^Q|Idfc!%c#f0PDM>oH zCg-g^YS`?eXIjzx{?t6^WTD{(Bi_-c9hB`$=;Naz90e~#4*D)ic>X);1&D%6Z9oQ- z+M_DNW@GN=s9d-(s5vUf{#)~hDhZgjsAhA?M3#`qcfy5ayqBl}edkW-MJE)4GCJ@< z%a%svJH~Jvc!1?@bSWD#yMhHLmrZnqLrH+)>y4YSph}J+7gW)e;fQ%A`Y89=hxhrS zo~@zxy*vN?-|MQ`xfbWI`t$A?w360f3xwj8e%I2pWlekF6P^w*>{F+~VxpMwOg;+v zG7`7!D^zcPIsrP1wOP{XIk)05n~QN|Syjo4_Ld>HN+>L9rhSL^*t2H1LqE6at?* zRuaY1v6f76g?yE*kTpi19`W=h+8##Gwz5>^I+s8IBs>SPjOvPUOX>P3aq29XtXJX7 z<71UX95krd7uP^jo&{v7r@-Be6f<42p>2vZcG}%EVWe$4Z6s*7y|WS7tQpet+2q7; z4ooEXs6&$zBS2uwb}Xifwn%#ts`gN1OM!bF>6?j6Yj$rg5RC=K^SYwgl-i1-=f^<< zJ=be%|HS6(m6dG&Q<7w=s>$XAO;W>QRgDJ~mCMIkYus)&_HN;GTS6^!4y!FX32%u* zqZX%L;%;D;(Gj%&Y<1GKad)X>L}$Kt zkO+GxYx~$zx49e-ZWvA)!GYTTT4lFL)L55o7yh1k;SbC zKk(fT9NemDxk~!pC-2=-(e@)>fvrO6m=!LCtyr2Zbph7n@3cnJ=rUr&(q%^pMonNP zhq|dFKZgv4zmEpk%A#rM*g_z>z*#zob#qn}$w!3%=ph!J3KD#kI(W>9vcXpKx{_{RLcUPK4#y2T(x$pX%+$WV@2Qu{6mHvF_8C88| z_gi(H1d2EG*LD5s`*q_;{|!a4zdzkmF1KtMvM4v%!0{i?WBBa?Kzg(w$zOk?ozxRUV}@($#Ut8 zJFK7*K9pc@I6OU2m=7ze_E`?+w`3h;GiG?cFu>k$_u<5$uo7&pU@^RXf0p%&&1esC z;cu&>4{01n=(ea(wcvT!eYR>V0Kp6FF_pfn>Sy2Inp~F1o2xTV3++u2b@Cr6&=J=~`OXqfu5UD7G4o zMRl!*ZJ|Sj!>{bCX#eK?Kp_;<*lqYARXYf8i}I9MDAD=JKG`3Pk)y9>lql!P2DP@o5WVWmK@O0&X;GaLi zSLOk)Ro6K3_O*|@clELWTaSHF%$;XPNMS5L4s$QxwH~&pA%(}i0Xzm({sG=fpHZlL zZMryHmU9`F7%wKIpp@&ue9(>xmBM4*5FdxO;k9yzD(!3e&3#gkh)^wwVmyqeYsfGSRUUpPHc?ra?QbDOWf`|zs9eSNE+w!Wda zD~oN@o9e~yY(NXGY1fC^W08Fe&sKv`F-^YNo? z_Y5OE7}6GGn-9z_;h9zb>i{d!K&C$inrE>jdp$T`QdKRaIReXJh2=$-K}H_|k|3%s0ZkaaHPyGZRjwjn`Onyz-DA>H3rs zOu|H>_jqrGc_kTC{sqhOtXDwGiuGr_^0N~t{i)IR9M9L?FnXRu6hth7H-mUB#O4I{ zbes!5&D#OSI*4BQ825UE_ib7BZQORy^B>^yp!wYoL6HxW5Z?8A7?F3wy}Hl8tAkPx zF2_D9T*XS~Lm!6*@;nl>JQMr}uamRQM$0^=f`-Wl@ObQ1rjsm^WOz8n9iebXi?1rV zJ!dQ-k980+qhEoZhKCwSS4$WeIl*0%ajsmW9c}(Svbsw3gIqn~U_D&eS9oD{HXa>A zKG;nM>jS`d7^oi%h1zBP4fHoxK>G-90_ebQ$F-JTu#5+WEz2>@krC5$ENi&qtofn! zN_u9!tnS&&I>qIDK%o67NKtDZ&Zb|l$Wy8DF*|^``75{gkIeC!^FctI)hVBJ4$X}q z&IAg0DM1O&nNw8v>5Dt4rNOmG*!~A9VAl6Cx=IG;sjZTg1Cz6|q&Cl}k~}+k;NbYm z#DOtC>i%ORpb6Ow646C2Bf#W#M+(@C^zphPkvwDb+V^1xWzb>T8~T9$R5 zdu8mqP+4EH4Q^&{*w4139E7m>Q`cw410r2BhjyE#XkYh>yD-pth6{6?)%gx?zz&vUIKaL(Snh-2`l`cH_#49x^=| zt?seA7)5G}ElyXPZkwdsN@PX^T@nWZ(9odDVW6=N16AQWdJmdQ#xPEJoFyUL6=_(9ZDTjaxUr?1t!Y@WrG z2N2nV^}CaJy2Nw%GGnx{+)mkz{gmCb8&CcC4TxV>go(5R!vW3Jpq!}g{*vb&l3op( z{7a~F&fP^eU#edXCIM}{eb5=nt(8cGEAdqdKrTVKI6FONw6=FL!o@yBJP{Q=CgibYI@M-^+LmRlB6xWa15NiI7 z$G_+Nk^!LUJ^hXtdN5f9STc!jOFYynR2L<<7H+Rrw_}r@=4XX^FLxcf<;WJYg3Rk} zH$@^hZNsQ{ZcQB=#(1-_`O-@_`}M@2EVWlvnh`K|jMl1!m~-JWDS?UUiNG`F8S|Bt zY^iT(sE-Jld_J?bu6}*7IL&SYie@23PM)t!fJpS?BU{dpr3)1X52r5OyxCh9yt2IV zlBgFh!z*~d_wN6Sek5kOhi`6Cj9=<%x4V|i71!e|k5tx1CTrxc0`Y)0rl}@j!%y_|0NLk{wC10aTY=T6CoVJ0&M9l>lZuKE23M%zW=Avc4 z&#;T#Z_*-CLNbhh0DVVtz(}gU7tC(4=`PAvneL*cRrFBKVf`kcH(z$rcc6{PiYSq< zq9q5S$hKPrw7lSJtK||nNn*`YK@Ad+6;|qCw;u#J0rFSbh}u#tta$H_u>9fcKgtZFf5DOI{Yk$L+D+nfaEvw4wmT!)wZMtRjl576${+NJr91= z+OW7FOCSp9;8EpLs?-z;xV+*WBv3PnPE4AS^a)+;jSx{}r!|!l)}UK;X)r`|ZBWv; znuIJcGICI%F9I?8B2@;h=C=dpJ8JpZrIcP;%Ou|cXe|Av_SR}P{#MOgrK2B&xwVKs zyeAT#x1?yPTtj)a-%B;ObtOINj1#wih+2j6ASvCrOAiKh$FNgF)K1#=i#=18>&0RD zpqQMv%r;OBWcMY3q~Mo7clx!Bclfn!d3#5{w&;fRzoRO46Lme7|0kq~p{C$@wdD>K zqS+3ww(UKA52H?ZA)m?z2HfFkg?*^f;g>}@zthPo`OIopEX{pwM=iUpX_g3LcMM3j z(=$t-m2JCid8nO_{RzUVGS^>anSBb|7cL`v-P6{Ei?-saVE+f}u@m8+a`gwUV{_p$ z2F7$ft?6T9$W0#WIJ;oUm)E<)JrmY^&*oS8J!PM}0`?IX{)WrgD{mY@-uK12_FES& z_d;6NZXDHEX|=$+BF2&$)j?e}*e;_tb|HO0=!Xt>K4OCL9U2Q8+WU_ZwWN5qE;* ze_Pg|Za3cwU+_3m^^e*53!LeR^GfrrwmyiN9&3=BOmj#_9WmD~t+{a#_^QOgM12UZ zXR~e{{Djd29~BJ2hFxBG65zJOz;mdFop6*b$gHkywi?5t@X&8+_R7j9Rh_~K*`r#9 zIMrO5l?-i+EH#=-U;!dzrIc!( zO_i>cDLu?iv#HXmx!Unt*{-$?Sk3d}isH|sju%(-YDZnA@Xsx`Oe$N4PW^A{^QbbZ ztosIXtbO;I=eG5AR#1+?bqLzV(tMEy`+3A~@p%3%*~Y@cXs&rSH@d*Kmn%!9$dXMn(hzLg0 z_+0GNeetp{E;hhTwit+8%|{~LQVJOf+iucQ30a%}=Xp&|q_ms10gHf_X^{tKdGI_V z89!%6O(*g>+;+UrltU@=mRrnJNH*VRKeG;JwSDmP%+Hdqu(@Fy&dTs*p7#gpVy_fh zkvtz%^;X0~oNq(VgJM*HlFy6AL1(X`5seu0L9VZ0UmYUG1{MkKWe56eb3Ef*;}FAG z(v^PWh@mSN;{ndrBs~ROO$F(@ulsz554XAho*c;Y6YlksDEKLJ=_*qD@N4GgUNiR^ zWIW&Ri=WKew$^-@T6xF3NLK z`Qm8OOyJabFF(*4=Dm2nrfH*6N@mS9TKUwlLy; zAu76;5TF2X3F7D`4p26^{^J(jlN|CUQB=e?Ysy>5i?fQE>{9yVzEr9&^?Fs*XpCM@ zM49x?$;mEDsf9q3YYSzoADt!gUr6)}yZLJ$vbqe@I!2~baO2msn96RwPn1PczWI+W zOHT&g|4g zl#%LRWiqN^q`H#hS6|g;*QI~)xTZZWsj{SJGP*(!X9gXrJg(45wg>wK>;LzWZ?ZYE z!p8F@g5V&u8z2pGL)1c9b?Os{H{qs46ESq*T0%Gv&~mH;l7}yWt~!5hV|ZlNuo@c4 z$`&D0+3XY{mYgM8Ls96%x-OZlzsT$#>o4Y2!^4`P=vuL;>55V6?$!*IHD!!yskN- zal%vMU{hj=`}^f16E%3NlQUwKo4sQu@2kC9h9qjbr5w7RG#|^)=f42= zz)B4v8@-=6aZ&eRDi+m;XW0#zL{~9d>YCWOa{{hk^bY*)Tk!aokRlSY{q+esZYsJ= z#O{ZVNPo;8ihPS-p8KZwPV$T}A#4@y5bkGdV2Oe&$O0OD6v}+wniY}10*ZQIssqy- zL^&WfEw!xc>a|L#mX{U> zxh+W=vKa+x4yLZ$Mr~vrsKo;LeltRdVo@hPJZMlwi5HDTFlL1Ggh9h$ zvbZX@9_!4l`(KcL4ZPs+l@y z5m{z?xkq$Y2m8ye4*D!$eK>88$*UuEh?F_YFVW_2g7>)^a{p9-*N%Luc7l+w6X~|loRkYEIZq#idS@3x|1 zR1W=Ygx$_=37Z8&6G_+@3n#4OL3vp)9*q(ZMSyE{f2oN^%9I&Tw%?{wB(G{&{Z&h==p<1gZ02G+g@uPzZ@I+(k zuVRreMZ$^1hPy(6H{UuP47M*-`v)$2{{#8?sZ=sLP>OV!F)Pw#E0OP;Df95)CN0J` zb&^J|(*w;HMQPI?hNDmQU!P32FYPvt{z}wYnmyEnVK+{4(mRbO~9Z zAJ;6<0A;Imyaf19sG%K)d1SI)WiyOZ0Z5$cCc;Trg-iZC3Ri($2qFr>0e*!lkXL{V zm|;X0`9A`BU6$XQvJ54l%m?y@5x80pd~E8E8i|kCK!me_ zXanPHr(;^|fpW=`jZj<-UwpQ%?~P4^Q}ynaeDf=8FAct$TT~Zo%rO+Di{oH{K})RN z$3XCoP~s(oyaJ)4JTW7Ibh0{G76ndlMK-)CZ9AIg*y%TIh|I~funW#)50y9!j+ zMX7J6n6RCAEbiC|ac7?-qGAD|NjrNyuA8PFKc2OdbE@23VW+C8+oaMhtF|c0QffjB z8v#`f7-4ZDCCQ@b=M4e)9>rK?-e(q+S4GTQ?H3aLj;lFxwn9Dkf& z$@!Eq>wD-ib*!9Lq61MS(i;irpV0#(3nKRhXD4y8lXIA|=tlKVqshFc1-nC0%`^qS zFEXH>V+iHV%rj{3u;(4&Q{c*34asbO3g2uW%6&m+t zR-b#W4M5FhzJSw#Z`~%VpE*|UDCoskw~1)?yZvQ9`Kj4 zkQ)_6aNnvC&{)&JL#rspi}9_D#0D`zmMr||;#hU>zUo-tf9{`}YMva;sTP|XbXg}q zhIaWeVbdI&Doh$LCguTDzZm&PkURWi#8>8^kcTp_E=qmPC&Z;S9{{z#;*}@cE_`VH zqLbWcgBRloD8>_!G5-hjH_u+6{G-DE*JZu|%6!BBzskIUBOm{J%S_oSxVgP!eN|;G z)^@y-f?kfB%=oJ*V5q}R1#E}53Kua-{W9UT!VSW$!ac%$!h^!Y!ei*K7;!PcR~T-P z!i6x0{YW_IW+SG0954?d-`kyc`tzRXOkSIP{o7j%Hg#1<-uYn~qZXxIVltY@jx;XW zT;Gt|l)yxnXu;!AJbn<56FA2%_)`3N?()U?@gh7rz9X6XFl8@@(agbKYb4wJ3o^0! zlA>ltFm*RR-|-zeErx%-bAOKd`nlaWKX%A}c6R8Pp9dz~uX7Hq<#78cWC6KN*+X2r z{48>v&j}c0xw7VHZXnsmc2Ab3U8Tb@BnR|JAj;KJ%juar*fltBLz3< zSK+PU(P%IlK>rbK{=doAFX(H6qUI5fVFHY%(SELsX7_*t1aa5^u#o|Kb2Y+EY}68( z^0Jjc;%G7snCrTpv^|anG1WaPwU_KSD5_0mW#s6VjTaMfOp&RrDm|Mw6sw}BJoC1l zQ<6$#QXGop25aeyP7L%(>{OLD?)V0dsSS?Pb*VEnEEzX6syHSBE9X3xtqI1S?-P{4~+Cwhq93qyN3@XMJd`P%VPJkaqPX zJ^P6@bcRyp;97p90dfkUvpOj#bX?(+3knNh$+6n&mj5XW=@?RMS*~l_w&e=D(wH#E zG%0al6TnMcji1QLhzgM9W23n z^y6l|RroEh9Bsj-6L(Fjs+9?!`tB<}FIM6OpEcHG{Z*bry`S|Iq1A{wFu)Gy3!9k> zUREQlZdxQ?`hcaX>X@otf1c1{KNaE&=Z|0?IQL67w!X>g^AFIb8OOP&JuSvt@J6i( zf_h*_)wUZ6&jy5J%>uiDGtFu(yAa?zut%JCwpR+HCD* z9TyfVNXXNwB!#G*Q$hyvs90nfo+n}#$ypQ5TL z6O-<2G-+?OIVVjB)jXy}12Ob>n3&j6g*DAWBtrU;-jm6qJvCC|~J^((-qBzaAJT{<3 zZf(MeCnoAMVzuU)JhMo2gm8^`cevKigo@b!2^tL}NCNTRa7Y{yS*sISf(T_%ap<0* zd~{$Vdia_$*|kq!#cs5IW(0%A&$OO_RQ{@9=slun?%GU3A?=-__?}Snxx$fsb0x0R z5Hi?&2lBXoBcBHyKH~Yr!5)gN*Ltl))l~q=MA&xQwuet#wad`^HEnEm=W7YMZpYl% zfN6!^Y1kRFZx?xb?)Ggb9&TtX2OYS2$F6G#85%G%w(-u8W%ljx+2MfS!yM;cIjvn6 zN0#1#io*0f@l~^P3r{ZVLBx=d?jumVfHc;E%!SB&^E8`5NbD>kvYhAeL?`@Qr%XSM zp4@TY%v+FKf7V(CR&@m>!3ltyb8Xx~OWZZgu94fv=Qdq#i^fKklJJAaui4$_)mQVc z;W#ipSK2-;oJNmr(zb9i34Cgi$JCdQSAy(&~Wp$oM8%z(X!Dmqb zbA7_K4j29QPhjbA`raq+y>4&XvhKF5^wdx{>i_hR{Asklu==f2NAA7%$o@B2d9LD= z*ZaCrIf$(rS3fFin*6BcjgeomI(s{7`EgbbPkW<9VZqFY2(6wjDK}^ExB_wV;^St9 z`xDKWkJIL})?pyiVGW1<#bN7HkF#%Hu#E-7USKu%IE{VMn(ANapJJto237*mRylrw za?WljN6xDT4=>U+mxuN%$m=0NPzY>dZlu}>GS}*J8FaH*!b2|&han_;#d>*{5 zl8*ku=AUv2Ah1A!f^J=qw@-v?ceQ%Pz}Vc5>j-)6&e<_d>(`B4SDkqHz2xb3R~Q%~ z_jOQ%8dqfwSP)gQ>BER8EF1rDA`&fihNpDh&DYnUBr}w za(_2l^fTT4a-xtKi1wsPqq(lQIMp8vmr^~^flT3Y6k**hQ!2-^*#$1nlUqC;PJc~u zosIxJ!w4WI>(^oESo!)fTReG=E!O9gs@|C1=Sh0lZ9iN_5hptvYaO> zAaOSD#nZ9vs2;H}w&>>La-8P5FQM<%0P5@X<6f|ZGM9*zv5C3A+ZqBH1;uKCE%8 zft^C4?R(Z&*j%1-k!0~1v==3TD$Iq5K;eEb`MLMRKe_ahZ{%+qWv@}{`A41W5lrtc zGe_?9p5K3%<)|y{rK7jyA5C0unvQARX>nRTaPGef|H9gwO~v&}r}J=_CmtVRL*xh> zbw}867_p|T>oe?>on^>~Wx?7n>}P9G1@Gq$zb3iIuN>kYzSE!m(bW%wy#l-cE9`!@ z^cQj7$`F;$6R7!EA)D9}6iHIpGn(JAtmp9=ie)LShq&KymVL)Zp&Zddr(<|Fx~j)k zznY}HlEG73`xdmV+U#j#_yuhC0n3&}Sfg*c2_}(6T+bn% zIbZt8SCGe_?z7d2qwhnZ)BOnYaae2mIR7nvYa9J-zBE~4WA3x4^0iz2jLQDlD&E@B zf$Cp+5;elEjj3u(6?l8Iep&%!OTw3#77T%}@hjwBuX=ycijaiA4LTacYr`+IHv9@a zyYBCb)s6;@fA74H*}3+mojQY{wBWL9XuJ)0=IT?sDDUsvrK#%ens&RYYP+n4t;Yqc&Sd#-1lj`(q02Nwb3SYIJ0);wTp-8Zd%W=o?I3=dgBS#_wc()VL) z9_dOGe%&)`E(@z(*VcW&W$S#s*uo`=10E=M_17Z$-60{>I#5C@9B;0W z3+EUKFE&`m{ukD84yC_m!Yls@nml&~09$$j4{|m}8$LPPnU}&DR z0-@7hPtCBb&6QII^=J~$=R#o}p9_V&U)h`E`E__$I0geP`!!wf)%34rfk5;-Rp`sW zHLX{NYdAvPcm4~b2j0!;OepM9besxZi1lRWM%VY=Q5&?DYt*M@`NZ6&auP2*MYBBAk zVTBrp6$zkMzHZo!kTtcaX^UnL3CUARkadQqds_B%JJ|f#h5PIl>L%*UhTS>RA)DZF zw()fUoRO5n>~RLXh3qzaz{yfjnUYDU$6N%ein#Ui71+B99UgKxL$6@cG%hQ#^slB%>o@d!5L9q4IEnmNPi;MlfPZu28xQOBB>IcG z)HE;keneosbnY5GkGb%W*KgR4T$X{#0a@KY#X9lwRR1#Uy|j>)b$=c<1^b=`@+6%O zizIh4^U#OuVYI3bv2pZxW5`}G9&z@z&STc3U(Pz$5DL(a&q_+o~P$Ypm)(oS3H z$@zT~nX!TymvuIJG9$Ho+B&Tf@lhiXoF{tMhPk1kOS?4N>YXU{L<0&r77Q4V(gYua zp>tm#FQ9!58{_Ci!Ir369+9e(GZIcv(hMV_$#?8fW@O98bR;sczfqPHs;et(mWu4X zMm$Y!R+7Ql+b`L+!PK`-G?7Fz&^+tY?T*T=rFg{y*PuX_4M`En-&QFVzlnk(c~ zI>uEupoUo;v#uQ5=NZ9+?K{b?+`;zyTq@*65U~|8ihLLq6m|!F7eIm{(`XA8s_x}Y zy0=;{>?x@d+gP+etutOfUZ`(Fq@7MLYISe|^I>lto zpRAY1J@e@oWmzv90&PTxqx_XsTAHk*uR=D4&~qXC{!+PEE7Jt6tL#FZEJky?uf2A6 zHr5kP*J|ldPc*yx+1=S_PbgihcZZwjy1IH3@qg{=%ES|g%e^~y_Ll8jdix)3@6H8F z8FpH-bKP*7kL=%XY}PivJ+77SKb;8_t$$m%Sr(sIoK970C{XTl2W(NI3{ zt6OBrYS95?LImB$v!KKX#zL-yqW?AD)!2{=mqTc*!ie5|Wx<$E0T< zEBWmH`hlT88`*iaJefZ*Any3!$cJYy5r6YHR(&~?!g-e9ng*OWCV|&(eOS#sS)VZdbo{k}4D z&{7D=lFzxkc?ZdwJGx9YrFN+`_DiW|m-LoVn1t?PnO1nFC91!0T#~4sb)N}Ti%uo! zIFdM9XJ@x!(X-##IdWe+66!j z@55l}N;ni9m$Jzg=HPgt+TLNgwW{qJFl_|Mv&~ZOW>K_6Dqh}iIj-Yqw?OqM8KH$Av5JTw%(!so0p+iG{dj|d7;*2}ulV!X^o!ze3ho%M-X zw0i?j+m{GOh0BGjglmKo!cD^KSzoz}^_I5^=sAp5;^<&H%EB`Hq1RUSgHUlD`GOg0 zl!XMZaE~Y;K?aXvl*REGEG)ZmxCZ&b!C0AvAU%fkGCULRWuXK23k^WMV*eo|OYGQO zVYLk|QkLM*gd|LCkcOLz7aEOoLWAG8(oSX1YvRqVN3dK=knG;D;)VntjsI2}zEbdl z;N=w_#pgHND?VRHK|rU;t=23+$y<=*E<6eeqWQQU1r|Y=wWs;LJtP`f26xQbmaqI~ariV}#9xtCcm)~4x}Q6F~}eX8T&g92>!6d`9&cnt#XATl=DWIpL(-L3ip zMygTW7Oh7P-r8KTV%A18lmM;fprtZGEo51YAnk9L{`NT`NI<`M6(`CGoOpedRxKlhw0=}JfoXeP&bnA`P)3LK-AmXi-rigKG)-z1rKMQj32RyI$iF`7B?3W>88$2t zwjnk!7;_UJb;G505{r@rMinA5z)3d9*aMb$0BBa2y27rbrSapBxA6lY?qB;=^!>M_H81DkH(&p7@Nd|U98SC0ogPK;LQ7H8 zozG7Aa<#5{IGxMLqb;yq{S;W!)+^XlYHL@I_(H{)Ez*KJ5m1y@CRA2)EU-x#2NX|X zu?4mR51~XBL(;HQeTg3pSMPoD-p|<41nr4wyAz7(1T@EvHt?K9&`k~)8L;rj-PNIz zoxY-e!FEJM+-QHoQUn`=P{qpDJnz+VVZEhbs4Odxkc6ozWV|8SO3MVE(83%TMCe!~qV5eXo|04SNgB@ZOuw`K{3Ti(HtP~`mo5Fgy>jij5jDkQ1bb-no z`iV^S#vU}%`AaP6kJ#yKc))9L!uZd+1cD_uFcB?f$Z@PQ2^VenO1#4e``q zWZ>wc|4;hq&0QI#R%%O|%g9JgZk* z4qU>3l;nM`y6W>==c$E-R7q@r%yFT4mIyoBXc_kFd~pCDX|9w~L@1?JQYBE)?+{#ehpj{5sYQC*_V7-v?(8+qk&TUw&$A&u0U*BTeyj;Zw+>btO&IpDPPeYAO900`2G== z?d-_h%up^CAOEdI_`Jp8O;;pzYeTq$*BeJ}`r5iia=Rs)@8B>c>V9r7Na$XX>te}EoE+E7g{@1|XzA}di<*edJ?efRZCwtD(%g>H$XufQU2^;dk- zH-!1${dhdNj$z)KPisEv8`1pu6ds!&M)|-=-_iAfj5uz<1FE10oxN-i-r^d1ev}k6 zU#=%=Rp=XP0#+`r7|duzwo8U}t8dM8?cTeZPXAvx<^B%Z`87Wtp^9ZjlJz5drgtdW zQ9JDfWE!CHmq#0Xf?}urZ8Tf`mxTXWcA++m~KS|3UMYy7eRLWuj<-A6g^v(d`%Y^jx%k zG)_%hGYri(X{3L4W1}n4V~OEt-|?vwyP{g`BTdp3OD0c-LZRlF5O8y0+;l)`G z-@@hst{(2x8KIOBxt4bc={xkgSuXh<;yKX-VkWdaM6#uTsPas1OKytaD>m!W{!q1O(lzo%Ma^K+=S_Q_>gqa=1s?3y?sq9Xkt(r+jmr zCZrHEIMIWy?i~uUtB$!PdLh`tdjN}?))AnZiv^x-tXfo#0)#ca&#*y?&9;7LSnT`$ z6-D#=%N|A4SzjR#Cvt*yhYEKE>pCfG$u^;gj#qk;ZIxtaK{UjTiR19aJRTF3ceB^A zB0h$tMyPEp)8jj3`L-c81|jU1*>v>0Vc&q|7JT}ZI(km4_^Bn(+eSOtR-NE%+N!Uj zx8Dx4wUn)>OQdm5SXDtd<&Kd>@NW!}m1d)J$#u0{u(dq8rHicy<7~8CBwQ!lD!lnZ zlmR))Yh)oB zXrAI+zCe`oK$=hDrHAl%hcEtF-&537^GCi*LWk_B(1AI}zpUd+D)@zbV@eiTy)Uqz z8;})D|GO77?btC*Put?Wc$ zaZjf~v@9Ch?=B%zymO^pSXf5M@iPI+&7cD`K$aK4?VrycJ&yF_j$cRBL@&_x7orn5 zwX?gkXKSb7?|dXr^Cumh{8`UdU-r$V;B~oy^XXbb+$qG@YPoovPnXNAR15JO`(cM# zY&1}_Xo+*#_>#@zBG^PUpI9bK%PUB%^XU{KjrOAKkHSA*)*p%6+1$W=SaUQ*cr%v6 zap~4Nm?0uCb%wa$S*ZCix6CHCQwQVWGZ?{y~@M;3xTRO}pFuooNG|gKz** zavQ8|yx&Tj^|x9_q6_#nYxv_W+m`wTW=f7f&tI!~rCPm~_+H)2k_9Z=H#)Z`Ek8>+`JM`KV{eCp_iMVRk*WoZVx58w4=D5A0XCU9?-ORD`IRyj>+lkA^F|}#`obc zK07z!>uB6R&)aUI$L*!AUr4FI2Jm_0Jo;T()SfeG8A|Z^9Cg^{Hk~% z*X9Sis3M3MBk3BlZ5=4V^F z8k1J_HW>26m)Doo@jXtw8>V-ycf$w^`g(iV5o^FTdRRD3v{VKzO|!!>%MmU9P)MwYYOF3H6;suJ`2pS>u7vc9$A+$e`Xv^Zm(+_;&U!CZh6=;N0i>lB(9&PAd+4!x6E}T19A0eAJx_YuDa=xlUB6c}7xn zGRh8@PiN`_X+@F5-orQ%vUzdmb2vG&QzGo�Yw6(>3h3Ki)UqBdO#joC{%U+==re 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 >hNirOq;xo+rToYKzif&sP)YJ+_y5pjP+_E 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
    p<=F8Nbk(|sCm+c&bWP>V_Z|C4I!FMNG&tXn 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�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 rMhNcN9wJ!uUK>^9D+k>)TT4=sfp}|9 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 DzJFX* diff --git a/webfonts/fa-v4compatibility.ttf b/webfonts/fa-v4compatibility.ttf new file mode 100644 index 0000000000000000000000000000000000000000..0b7ac89fb7cc4aab0837e7165ac968c150843a86 GIT binary patch literal 10832 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 T+d^g83zNAFk&~)4pqu{(yrUf9 literal 0 HcmV?d00001 diff --git a/webfonts/fa-v4compatibility.woff2 b/webfonts/fa-v4compatibility.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..e7a938178691ff6a9ab01e170fc211dbf38372b0 GIT binary patch literal 4792 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 literal 0 HcmV?d00001