shikeying
2023-03-17 8c1a723d62a6aa5d6266ca613ae4eb77c789db06
添加activiti7若依界面
153个文件已添加
1个文件已修改
111135 ■■■■■ 已修改文件
public/bpmnjs/css/app.css 749 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
public/bpmnjs/css/diagram-js.css 717 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
public/bpmnjs/favicon.ico 补丁 | 查看 | 原始文档 | blame | 历史
public/bpmnjs/index.html 110 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
public/bpmnjs/index.js 90062 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
public/bpmnjs/vendor/bpmn-font/css/bpmn-codes.css 108 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
public/bpmnjs/vendor/bpmn-font/css/bpmn-embedded.css 161 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
public/bpmnjs/vendor/bpmn-font/css/bpmn.css 164 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
public/bpmnjs/vendor/bpmn-font/font/bpmn.eot 补丁 | 查看 | 原始文档 | blame | 历史
public/bpmnjs/vendor/bpmn-font/font/bpmn.svg 224 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
public/bpmnjs/vendor/bpmn-font/font/bpmn.ttf 补丁 | 查看 | 原始文档 | blame | 历史
public/bpmnjs/vendor/bpmn-font/font/bpmn.woff 补丁 | 查看 | 原始文档 | blame | 历史
public/bpmnjs/vendor/bpmn-font/font/bpmn.woff2 补丁 | 查看 | 原始文档 | blame | 历史
public/bpmnjs/vendor/diagram-js.css 820 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-bpmnjs/.gitignore 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-bpmnjs/.npmrc 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-bpmnjs/Gruntfile.js 140 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-bpmnjs/README.md 76 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-bpmnjs/app/favicon.ico 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-bpmnjs/app/index.html 110 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-bpmnjs/app/index.js 146 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-bpmnjs/package.json 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-bpmnjs/resources/activiti.json 1087 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-bpmnjs/resources/customControls/CustomContextPad.js 76 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-bpmnjs/resources/customControls/CustomPalette.js 54 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-bpmnjs/resources/customControls/index.js 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-bpmnjs/resources/customTranslate/customTranslate.js 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-bpmnjs/resources/customTranslate/translationsGerman.js 239 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-bpmnjs/resources/newDiagram.bpmn 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-bpmnjs/resources/properties-panel/PropertiesActivator.js 67 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-bpmnjs/resources/properties-panel/PropertiesPanel.js 1269 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-bpmnjs/resources/properties-panel/Utils.js 252 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-bpmnjs/resources/properties-panel/cmd/CreateAndReferenceHandler.js 101 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-bpmnjs/resources/properties-panel/cmd/CreateBusinessObjectListHandler.js 110 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-bpmnjs/resources/properties-panel/cmd/MultiCommandHandler.js 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-bpmnjs/resources/properties-panel/cmd/UpdateBusinessObjectHandler.js 131 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-bpmnjs/resources/properties-panel/cmd/UpdateBusinessObjectListHandler.js 115 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-bpmnjs/resources/properties-panel/cmd/index.js 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-bpmnjs/resources/properties-panel/factory/CheckboxEntryFactory.js 77 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-bpmnjs/resources/properties-panel/factory/ComboEntryFactory.js 118 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-bpmnjs/resources/properties-panel/factory/EntryFactory.js 163 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-bpmnjs/resources/properties-panel/factory/EntryFieldDescription.js 49 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-bpmnjs/resources/properties-panel/factory/LabelFactory.js 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-bpmnjs/resources/properties-panel/factory/LinkEntryFactory.js 78 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-bpmnjs/resources/properties-panel/factory/SelectEntryFactory.js 137 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-bpmnjs/resources/properties-panel/factory/TableEntryFactory.js 338 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-bpmnjs/resources/properties-panel/factory/TextBoxEntryFactory.js 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-bpmnjs/resources/properties-panel/factory/TextInputEntryFactory.js 85 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-bpmnjs/resources/properties-panel/factory/ValidationAwareTextInput.js 56 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-bpmnjs/resources/properties-panel/helper/AsyncCapableHelper.js 76 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-bpmnjs/resources/properties-panel/helper/CategoryHelper.js 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-bpmnjs/resources/properties-panel/helper/CmdHelper.js 77 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-bpmnjs/resources/properties-panel/helper/ElementHelper.js 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-bpmnjs/resources/properties-panel/helper/EventDefinitionHelper.js 57 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-bpmnjs/resources/properties-panel/helper/ExtensionElementsHelper.js 55 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-bpmnjs/resources/properties-panel/helper/FormHelper.js 97 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-bpmnjs/resources/properties-panel/helper/ImplementationTypeHelper.js 192 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-bpmnjs/resources/properties-panel/helper/InputOutputHelper.js 144 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-bpmnjs/resources/properties-panel/helper/ParticipantHelper.js 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-bpmnjs/resources/properties-panel/index.js 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-bpmnjs/resources/properties-panel/popup.js 103 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-bpmnjs/resources/properties-panel/provider/activiti/ActivitiPropertiesProvider.js 542 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-bpmnjs/resources/properties-panel/provider/activiti/element-templates/CreateHelper.js 251 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-bpmnjs/resources/properties-panel/provider/activiti/element-templates/CustomElementsPropertiesActivator.js 132 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-bpmnjs/resources/properties-panel/provider/activiti/element-templates/ElementTemplates.js 56 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-bpmnjs/resources/properties-panel/provider/activiti/element-templates/ElementTemplatesLoader.js 96 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-bpmnjs/resources/properties-panel/provider/activiti/element-templates/Helper.js 239 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-bpmnjs/resources/properties-panel/provider/activiti/element-templates/Validator.js 303 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-bpmnjs/resources/properties-panel/provider/activiti/element-templates/cmd/ChangeElementTemplateHandler.js 471 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-bpmnjs/resources/properties-panel/provider/activiti/element-templates/cmd/index.js 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-bpmnjs/resources/properties-panel/provider/activiti/element-templates/index.js 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-bpmnjs/resources/properties-panel/provider/activiti/element-templates/parts/ChooserProps.js 151 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-bpmnjs/resources/properties-panel/provider/activiti/element-templates/parts/CustomProps.js 770 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-bpmnjs/resources/properties-panel/provider/activiti/element-templates/util/validate.js 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-bpmnjs/resources/properties-panel/provider/activiti/index.js 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-bpmnjs/resources/properties-panel/provider/activiti/parts/AsynchronousContinuationProps.js 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-bpmnjs/resources/properties-panel/provider/activiti/parts/CallActivityProps.js 90 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-bpmnjs/resources/properties-panel/provider/activiti/parts/CandidateStarterProps.js 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-bpmnjs/resources/properties-panel/provider/activiti/parts/ConditionalProps.js 185 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-bpmnjs/resources/properties-panel/provider/activiti/parts/ConnectorDetailProps.js 57 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-bpmnjs/resources/properties-panel/provider/activiti/parts/ConnectorInputOutputParameterProps.js 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-bpmnjs/resources/properties-panel/provider/activiti/parts/ConnectorInputOutputProps.js 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-bpmnjs/resources/properties-panel/provider/activiti/parts/ErrorEventProps.js 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-bpmnjs/resources/properties-panel/provider/activiti/parts/ExternalTaskConfigurationProps.js 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-bpmnjs/resources/properties-panel/provider/activiti/parts/FieldInjectionProps.js 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-bpmnjs/resources/properties-panel/provider/activiti/parts/FormProps.js 476 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-bpmnjs/resources/properties-panel/provider/activiti/parts/HistoryTimeToLiveProps.js 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-bpmnjs/resources/properties-panel/provider/activiti/parts/InputOutputParameterProps.js 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-bpmnjs/resources/properties-panel/provider/activiti/parts/InputOutputProps.js 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-bpmnjs/resources/properties-panel/provider/activiti/parts/JobConfigurationProps.js 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-bpmnjs/resources/properties-panel/provider/activiti/parts/ListenerDetailProps.js 208 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-bpmnjs/resources/properties-panel/provider/activiti/parts/ListenerFieldInjectionProps.js 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-bpmnjs/resources/properties-panel/provider/activiti/parts/ListenerProps.js 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-bpmnjs/resources/properties-panel/provider/activiti/parts/MultiInstanceLoopProps.js 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-bpmnjs/resources/properties-panel/provider/activiti/parts/PropertiesProps.js 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-bpmnjs/resources/properties-panel/provider/activiti/parts/ScriptTaskProps.js 68 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-bpmnjs/resources/properties-panel/provider/activiti/parts/ServiceTaskDelegateProps.js 151 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-bpmnjs/resources/properties-panel/provider/activiti/parts/StartEventInitiator.js 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-bpmnjs/resources/properties-panel/provider/activiti/parts/TasklistProps.js 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-bpmnjs/resources/properties-panel/provider/activiti/parts/UserTaskProps.js 55 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-bpmnjs/resources/properties-panel/provider/activiti/parts/VariableMappingProps.js 397 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-bpmnjs/resources/properties-panel/provider/activiti/parts/VersionTagProps.js 45 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-bpmnjs/resources/properties-panel/provider/activiti/parts/implementation/AsyncContinuation.js 130 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-bpmnjs/resources/properties-panel/provider/activiti/parts/implementation/Callable.js 625 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-bpmnjs/resources/properties-panel/provider/activiti/parts/implementation/CandidateStarter.js 63 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-bpmnjs/resources/properties-panel/provider/activiti/parts/implementation/Delegate.js 83 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-bpmnjs/resources/properties-panel/provider/activiti/parts/implementation/ErrorEventDefinition.js 65 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-bpmnjs/resources/properties-panel/provider/activiti/parts/implementation/ExtensionElements.js 235 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-bpmnjs/resources/properties-panel/provider/activiti/parts/implementation/External.js 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-bpmnjs/resources/properties-panel/provider/activiti/parts/implementation/ExternalTaskPriority.js 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-bpmnjs/resources/properties-panel/provider/activiti/parts/implementation/FieldInjection.js 310 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-bpmnjs/resources/properties-panel/provider/activiti/parts/implementation/HistoryTimeToLive.js 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-bpmnjs/resources/properties-panel/provider/activiti/parts/implementation/ImplementationType.js 173 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-bpmnjs/resources/properties-panel/provider/activiti/parts/implementation/InputOutput.js 225 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-bpmnjs/resources/properties-panel/provider/activiti/parts/implementation/InputOutputParameter.js 364 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-bpmnjs/resources/properties-panel/provider/activiti/parts/implementation/JobPriority.js 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-bpmnjs/resources/properties-panel/provider/activiti/parts/implementation/JobRetryTimeCycle.js 113 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-bpmnjs/resources/properties-panel/provider/activiti/parts/implementation/Listener.js 156 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-bpmnjs/resources/properties-panel/provider/activiti/parts/implementation/MultiInstanceLoopCharacteristics.js 290 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-bpmnjs/resources/properties-panel/provider/activiti/parts/implementation/Properties.js 209 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-bpmnjs/resources/properties-panel/provider/activiti/parts/implementation/ResultVariable.js 53 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-bpmnjs/resources/properties-panel/provider/activiti/parts/implementation/Script.js 173 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-bpmnjs/resources/properties-panel/provider/activiti/parts/implementation/Tasklist.js 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-bpmnjs/resources/properties-panel/provider/bpmn/BpmnPropertiesProvider.js 84 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-bpmnjs/resources/properties-panel/provider/bpmn/index.js 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-bpmnjs/resources/properties-panel/provider/bpmn/parts/DocumentationProps.js 73 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-bpmnjs/resources/properties-panel/provider/bpmn/parts/EventProps.js 150 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-bpmnjs/resources/properties-panel/provider/bpmn/parts/ExecutableProps.js 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-bpmnjs/resources/properties-panel/provider/bpmn/parts/IdProps.js 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-bpmnjs/resources/properties-panel/provider/bpmn/parts/LinkProps.js 57 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-bpmnjs/resources/properties-panel/provider/bpmn/parts/NameProps.js 63 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-bpmnjs/resources/properties-panel/provider/bpmn/parts/ProcessProps.js 71 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-bpmnjs/resources/properties-panel/provider/bpmn/parts/implementation/CompensateEventDefinition.js 130 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-bpmnjs/resources/properties-panel/provider/bpmn/parts/implementation/ConditionalEventDefinition.js 54 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-bpmnjs/resources/properties-panel/provider/bpmn/parts/implementation/ElementReferenceProperty.js 67 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-bpmnjs/resources/properties-panel/provider/bpmn/parts/implementation/ErrorEventDefinition.js 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-bpmnjs/resources/properties-panel/provider/bpmn/parts/implementation/EscalationEventDefinition.js 58 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-bpmnjs/resources/properties-panel/provider/bpmn/parts/implementation/EventDefinitionReference.js 150 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-bpmnjs/resources/properties-panel/provider/bpmn/parts/implementation/MessageEventDefinition.js 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-bpmnjs/resources/properties-panel/provider/bpmn/parts/implementation/Name.js 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-bpmnjs/resources/properties-panel/provider/bpmn/parts/implementation/SignalEventDefinition.js 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-bpmnjs/resources/properties-panel/provider/bpmn/parts/implementation/TimerEventDefinition.js 139 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-bpmnjs/resources/tools.js 273 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-bpmnjs/styles/app.less 135 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/activiti/definition.js 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/activiti/historyFormdata.js 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/activiti/task.js 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/workflow/leave.js 62 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/activiti/definition/index.vue 292 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/activiti/task/index.vue 188 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/system/user/index.vue 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/workflow/leave/index.vue 469 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/workflow/leave/leaveAll.vue 242 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/workflow/leave/leaveHistoryForm.vue 76 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
public/bpmnjs/css/app.css
New file
@@ -0,0 +1,749 @@
@font-face {
  font-family: 'bpmn-js-pp';
  src: url("data:;base64,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");
  src: url("data:;base64,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") format('embedded-opentype'), url("data:application/font-woff;base64,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") format('woff'), url("data:application/x-font-ttf;base64,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IDxZIyAuRrACJUZQWCA8WS6xKwEUKy2wPiywNSsjIC5GsAIlRlJYIDxZLrErARQrLbA/LLA2K4ogIDywBCNCijgjIC5GsAIlRlJYIDxZLrErARQrsARDLrArKy2wQCywABawBCWwBCYgLkcjRyNhsAlDKyMgPCAuIzixKwEUKy2wQSyxCAQlQrAAFrAEJbAEJSAuRyNHI2EgsAQjQrAJQysgsGBQWCCwQFFYswIgAyAbswImAxpZQkIjIEewBEOwAmIgsABQWLBAYFlmsAFjYCCwASsgiophILACQ2BkI7ADQ2FkUFiwAkNhG7ADQ2BZsAMlsAJiILAAUFiwQGBZZrABY2GwAiVGYTgjIDwjOBshICBGI0ewASsjYTghWbErARQrLbBCLLA1Ky6xKwEUKy2wQyywNishIyAgPLAEI0IjOLErARQrsARDLrArKy2wRCywABUgR7AAI0KyAAEBFRQTLrAxKi2wRSywABUgR7AAI0KyAAEBFRQTLrAxKi2wRiyxAAEUE7AyKi2wRyywNCotsEgssAAWRSMgLiBGiiNhOLErARQrLbBJLLAII0KwSCstsEossgAAQSstsEsssgABQSstsEwssgEAQSstsE0ssgEBQSstsE4ssgAAQistsE8ssgABQistsFAssgEAQistsFEssgEBQistsFIssgAAPistsFMssgABPistsFQssgEAPistsFUssgEBPistsFYssgAAQCstsFcssgABQCstsFgssgEAQCstsFkssgEBQCstsFossgAAQystsFsssgABQystsFwssgEAQystsF0ssgEBQystsF4ssgAAPystsF8ssgABPystsGAssgEAPystsGEssgEBPystsGIssDcrLrErARQrLbBjLLA3K7A7Ky2wZCywNyuwPCstsGUssAAWsDcrsD0rLbBmLLA4Ky6xKwEUKy2wZyywOCuwOystsGgssDgrsDwrLbBpLLA4K7A9Ky2waiywOSsusSsBFCstsGsssDkrsDsrLbBsLLA5K7A8Ky2wbSywOSuwPSstsG4ssDorLrErARQrLbBvLLA6K7A7Ky2wcCywOiuwPCstsHEssDorsD0rLbByLLMJBAIDRVghGyMhWUIrsAhlsAMkUHiwARUwLQBLuADIUlixAQGOWbABuQgACABjcLEABUKxAAAqsQAFQrEACCqxAAVCsQAIKrEABUK5AAAACSqxAAVCuQAAAAkqsQMARLEkAYhRWLBAiFixA2REsSYBiFFYugiAAAEEQIhjVFixAwBEWVlZWbEADCq4Af+FsASNsQIARAA=") format('truetype'), url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBzdGFuZGFsb25lPSJubyI/Pgo8IURPQ1RZUEUgc3ZnIFBVQkxJQyAiLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiPgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxtZXRhZGF0YT5Db3B5cmlnaHQgKEMpIDIwMTYgYnkgb3JpZ2luYWwgYXV0aG9ycyBAIGZvbnRlbGxvLmNvbTwvbWV0YWRhdGE+CjxkZWZzPgo8Zm9udCBpZD0iYnBtbi1pby1wcCIgaG9yaXotYWR2LXg9IjEwMDAiID4KPGZvbnQtZmFjZSBmb250LWZhbWlseT0iYnBtbi1pby1wcCIgZm9udC13ZWlnaHQ9IjQwMCIgZm9udC1zdHJldGNoPSJub3JtYWwiIHVuaXRzLXBlci1lbT0iMTAwMCIgYXNjZW50PSI4NTAiIGRlc2NlbnQ9Ii0xNTAiIC8+CjxtaXNzaW5nLWdseXBoIGhvcml6LWFkdi14PSIxMDAwIiAvPgo8Z2x5cGggZ2x5cGgtbmFtZT0iY2xlYXIiIHVuaWNvZGU9IiYjeGU4MDI7IiBkPSJNNDUyIDE5NHExOC0xOCAxOC00M3QtMTgtNDNxLTE4LTE2LTQzLTE2dC00MyAxNmwtMTMyIDE1Mi0xMzItMTUycS0xOC0xNi00My0xNnQtNDMgMTZxLTE2IDE4LTE2IDQzdDE2IDQzbDEzOCAxNTYtMTM4IDE1OHEtMTYgMTgtMTYgNDN0MTYgNDNxMTggMTYgNDMgMTZ0NDMtMTZsMTMyLTE1MiAxMzIgMTUycTE4IDE2IDQzIDE2dDQzLTE2cTE4LTE4IDE4LTQzdC0xOC00M2wtMTM4LTE1OHoiIGhvcml6LWFkdi14PSI0NzAiIC8+CjxnbHlwaCBnbHlwaC1uYW1lPSJhZGQiIHVuaWNvZGU9IiYjeGU4MDM7IiBkPSJNNTUwIDQwMHEzMCAwIDMwLTUwdC0zMC01MGwtMjEwIDAgMC0yMTBxMC0zMC01MC0zMHQtNTAgMzBsMCAyMTAtMjEwIDBxLTMwIDAtMzAgNTB0MzAgNTBsMjEwIDAgMCAyMTBxMCAzMCA1MCAzMHQ1MC0zMGwwLTIxMCAyMTAgMHoiIGhvcml6LWFkdi14PSI1ODAiIC8+CjxnbHlwaCBnbHlwaC1uYW1lPSJzZWFyY2giIHVuaWNvZGU9IiYjeGU4MDU7IiBkPSJNNzcyIDc4cTMwLTM0IDYtNjJsLTQ2LTQ2cS0zNi0zMi02OCAwbC0xOTAgMTkwcS03NC00Mi0xNTYtNDItMTI4IDAtMjIzIDk1dC05NSAyMjMgOTAgMjE5IDIxOCA5MSAyMjQtOTUgOTYtMjIzcTAtODgtNDYtMTYyeiBtLTY3OCAzNThxMC04OCA2OC0xNTZ0MTU2LTY4IDE1MSA2MyA2MyAxNTNxMCA4OC02OCAxNTV0LTE1NiA2Ny0xNTEtNjMtNjMtMTUxeiIgaG9yaXotYWR2LXg9Ijc4OSIgLz4KPGdseXBoIGdseXBoLW5hbWU9ImF0dGVudGlvbiIgdW5pY29kZT0iJiN4ZTgwNjsiIGQ9Ik05NTctMjRxMTAtMTYgMC0zNC0xMC0xNi0zMC0xNmwtODkyIDBxLTE4IDAtMjggMTYtMTMgMTgtMiAzNGw0NDYgNzgycTggMTggMzAgMTh0MzAtMTh6IG0tNDIwIDUwbDAgMTAwLTExMCAwIDAtMTAwIDExMCAweiBtMCAxNzRsMCAzMDAtMTEwIDAgMC0zMDAgMTEwIDB6IiBob3Jpei1hZHYteD0iOTYyIiAvPgo8Z2x5cGggZ2x5cGgtbmFtZT0iY2xlYXItY2lyY2xlZCIgdW5pY29kZT0iJiN4ZTkwMjsiIGQ9Ik00MjAgNzcwcTE3NCAwIDI5Ny0xMjN0MTIzLTI5Ny0xMjMtMjk3LTI5Ny0xMjMtMjk3IDEyMy0xMjMgMjk3IDEyMyAyOTcgMjk3IDEyM3ogbTg2LTQyMGwxNTQgMTU0LTg2IDg2LTE1NC0xNTItMTUyIDE1Mi04OC04NiAxNTQtMTU0LTE1NC0xNTIgODgtODYgMTUyIDE1MiAxNTQtMTUyIDg2IDg2eiIgaG9yaXotYWR2LXg9Ijg0MCIgLz4KPGdseXBoIGdseXBoLW5hbWU9ImFkZC1jaXJjbGVkIiB1bmljb2RlPSImI3hlOTAzOyIgZD0iTTQyMCA3NzBxMTc0IDAgMjk3LTEyM3QxMjMtMjk3LTEyMy0yOTctMjk3LTEyMy0yOTcgMTIzLTEyMyAyOTcgMTIzIDI5NyAyOTcgMTIzeiBtNTItNDcwbDIwMCAwIDAgMTAyLTIwMCAwIDAgMjAyLTEwMiAwIDAtMjAyLTIwMiAwIDAtMTAyIDIwMiAwIDAtMjAyIDEwMiAwIDAgMjAyeiIgaG9yaXotYWR2LXg9Ijg0MCIgLz4KPC9mb250Pgo8L2RlZnM+Cjwvc3ZnPg==") format('svg');
  font-weight: normal;
  font-style: normal;
}
/* line 16, node_modules\bpmn-js-properties-panel\styles\properties.less */
.bpp-properties-panel {
  background-color: #f8f8f8;
  position: relative;
}
/* line 20, node_modules\bpmn-js-properties-panel\styles\properties.less */
.bpp-properties-panel:empty {
  display: none;
}
/* line 24, node_modules\bpmn-js-properties-panel\styles\properties.less */
.bpp-properties-panel label,
.bpp-properties-panel input {
  vertical-align: middle;
}
/* line 29, node_modules\bpmn-js-properties-panel\styles\properties.less */
.bpp-properties-panel input,
.bpp-properties-panel button,
.bpp-properties-panel textarea,
.bpp-properties-panel [contenteditable] {
  padding: 3px 6px;
  border: 1px solid #ccc;
}
/* line 36, node_modules\bpmn-js-properties-panel\styles\properties.less */
.bpp-properties-panel input:focus,
.bpp-properties-panel button:focus,
.bpp-properties-panel textarea:focus,
.bpp-properties-panel [contenteditable]:focus {
  outline: none;
  border-color: #52B415;
  box-shadow: 0 0 1px 2px rgba(82, 180, 21, 0.2);
}
/* line 40, node_modules\bpmn-js-properties-panel\styles\properties.less */
.bpp-properties-panel input.invalid,
.bpp-properties-panel button.invalid,
.bpp-properties-panel textarea.invalid,
.bpp-properties-panel [contenteditable].invalid {
  border-color: #cc3333;
  background: #f0c2c2;
}
/* line 42, node_modules\bpmn-js-properties-panel\styles\properties.less */
.bpp-properties-panel input.invalid:focus,
.bpp-properties-panel button.invalid:focus,
.bpp-properties-panel textarea.invalid:focus,
.bpp-properties-panel [contenteditable].invalid:focus {
  box-shadow: 0 0 1px 2px rgba(204, 51, 51, 0.2);
}
/* line 48, node_modules\bpmn-js-properties-panel\styles\properties.less */
.bpp-properties-panel [type=text],
.bpp-properties-panel [contenteditable],
.bpp-properties-panel textarea,
.bpp-properties-panel select {
  width: 100%;
}
/* line 55, node_modules\bpmn-js-properties-panel\styles\properties.less */
.bpp-properties-panel [contenteditable],
.bpp-properties-panel textarea {
  resize: vertical;
}
/* line 60, node_modules\bpmn-js-properties-panel\styles\properties.less */
.bpp-properties-panel [contenteditable] {
  outline: 0px solid transparent;
  background-color: white;
  overflow-y: auto;
  white-space: pre-wrap;
  /* css-3 */
  white-space: -moz-pre-wrap;
  /* Mozilla, since 1999 */
  white-space: -pre-wrap;
  /* Opera 4-6 */
  white-space: -o-pre-wrap;
  /* Opera 7 */
  word-wrap: break-word;
  /* Internet Explorer 5.5+ */
}
/* line 72, node_modules\bpmn-js-properties-panel\styles\properties.less */
.bpp-properties-panel [contenteditable]:before {
  content: "\feff";
}
/* line 77, node_modules\bpmn-js-properties-panel\styles\properties.less */
.bpp-properties-panel [disabled] {
  color: #808080;
}
/* line 81, node_modules\bpmn-js-properties-panel\styles\properties.less */
.bpp-properties-panel label {
  font-weight: bolder;
  display: inline-block;
  vertical-align: middle;
  color: #666;
  margin-bottom: 3px;
}
/* line 71, node_modules\bpmn-js-properties-panel\styles\_mixins.less */
.bpp-properties-panel label[for] {
  cursor: pointer;
}
/* line 74, node_modules\bpmn-js-properties-panel\styles\_mixins.less */
.bpp-properties-panel label.bpp-hidden {
  display: none;
}
/* line 87, node_modules\bpmn-js-properties-panel\styles\properties.less */
.bpp-properties-panel .entry-label {
  font-weight: bolder;
  display: inline-block;
  vertical-align: middle;
  color: #666;
  font-size: 120%;
  margin-top: 5px;
  margin-bottom: 10px;
  transition: margin 0.218s linear;
  font-style: italic;
}
/* line 71, node_modules\bpmn-js-properties-panel\styles\_mixins.less */
.bpp-properties-panel .entry-label[for] {
  cursor: pointer;
}
/* line 74, node_modules\bpmn-js-properties-panel\styles\_mixins.less */
.bpp-properties-panel .entry-label.bpp-hidden {
  display: none;
}
/* line 95, node_modules\bpmn-js-properties-panel\styles\properties.less */
.bpp-properties-panel .entry-label.divider {
  border-top: 1px dotted #ccc;
  padding-top: 8px;
  margin-top: 16px;
  width: 100%;
}
/* line 103, node_modules\bpmn-js-properties-panel\styles\properties.less */
.bpp-properties-panel button {
  position: absolute;
  top: 0;
  height: 23px;
  width: 24px;
  overflow: hidden;
  cursor: pointer;
  background-color: #f8f8f8;
  border: 1px solid #ccc;
}
/* line 44, node_modules\bpmn-js-properties-panel\styles\_mixins.less */
.bpp-properties-panel button > span {
  display: none;
}
/* line 48, node_modules\bpmn-js-properties-panel\styles\_mixins.less */
.bpp-properties-panel button:before {
  font-family: "bpmn-js-pp";
  font-style: normal;
  font-weight: normal;
  speak: none;
  display: inline-block;
  text-decoration: inherit;
  text-align: center;
  font-variant: normal;
  text-transform: none;
  line-height: 1em;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  position: relative;
}
/* line 53, node_modules\bpmn-js-properties-panel\styles\_mixins.less */
.bpp-properties-panel button.add:before {
  content: '\E803';
}
/* line 57, node_modules\bpmn-js-properties-panel\styles\_mixins.less */
.bpp-properties-panel button.clear:before {
  content: '\E802';
}
/* line 61, node_modules\bpmn-js-properties-panel\styles\_mixins.less */
.bpp-properties-panel button:hover {
  color: #52B415;
}
/* line 109, node_modules\bpmn-js-properties-panel\styles\properties.less */
.bpp-error-message,
.bpp-error-message.bpp-entry-link {
  margin-top: 5px;
  color: #cc3333;
}
/* line 115, node_modules\bpmn-js-properties-panel\styles\properties.less */
.bpp-row {
  margin-top: 10px;
  margin-bottom: 10px;
}
/* line 118, node_modules\bpmn-js-properties-panel\styles\properties.less */
.bpp-row:first-of-type {
  margin-top: 0;
}
/* line 121, node_modules\bpmn-js-properties-panel\styles\properties.less */
.bpp-row:last-of-type {
  margin-bottom: 0;
}
/* line 126, node_modules\bpmn-js-properties-panel\styles\properties.less */
.bpp-textfield,
.bpp-textbox {
  margin-bottom: 3px;
}
/* line 131, node_modules\bpmn-js-properties-panel\styles\properties.less */
.bpp-radios-group {
  list-style: none;
  padding: 0;
  margin: 0 0 9px 0;
}
/* line 136, node_modules\bpmn-js-properties-panel\styles\properties.less */
.bpp-radios-group .bpp-radio-wrapper {
  margin: 6px 0;
}
/* line 140, node_modules\bpmn-js-properties-panel\styles\properties.less */
.bpp-radios-group input,
.bpp-radios-group label {
  vertical-align: middle;
}
/* line 145, node_modules\bpmn-js-properties-panel\styles\properties.less */
.bpp-radios-group input {
  margin-top: 0;
  margin-left: 0;
}
/* line 153, node_modules\bpmn-js-properties-panel\styles\properties.less */
.bpp-radios-group input,
.bpp-checkbox input {
  margin-left: 0;
}
/* line 158, node_modules\bpmn-js-properties-panel\styles\properties.less */
.bpp-radios-group label:after,
.bpp-checkbox label:after {
  display: none;
}
/* line 165, node_modules\bpmn-js-properties-panel\styles\properties.less */
.bpp-textfield input {
  padding-right: 28px;
}
/* line 169, node_modules\bpmn-js-properties-panel\styles\properties.less */
.bpp-textfield .clear {
  background: transparent;
  border: none;
  top: 0;
  right: 0;
}
/* line 177, node_modules\bpmn-js-properties-panel\styles\properties.less */
.bpp-combo-input {
  margin-top: 7px;
}
/* line 182, node_modules\bpmn-js-properties-panel\styles\properties.less */
.bpp-select select {
  height: 23px;
}
/* line 185, node_modules\bpmn-js-properties-panel\styles\properties.less */
.bpp-select button.add {
  top: -22px;
  right: 0;
}
/* line 195, node_modules\bpmn-js-properties-panel\styles\properties.less */
.bpp-select button.add,
.bpp-element-list button.add,
.bpp-select button.clear,
.bpp-element-list button.clear {
  top: -23px;
  border-bottom: none;
}
/* line 202, node_modules\bpmn-js-properties-panel\styles\properties.less */
.bpp-select button.add,
.bpp-element-list button.add {
  right: 0px;
}
/* line 206, node_modules\bpmn-js-properties-panel\styles\properties.less */
.bpp-select button.clear,
.bpp-element-list button.clear {
  right: 23px;
}
/* line 211, node_modules\bpmn-js-properties-panel\styles\properties.less */
.bpp-properties-entry {
  margin-bottom: 9px;
}
/* line 214, node_modules\bpmn-js-properties-panel\styles\properties.less */
.bpp-properties-entry .bpp-field-wrapper {
  position: relative;
}
/* line 217, node_modules\bpmn-js-properties-panel\styles\properties.less */
.bpp-properties-entry .bpp-field-wrapper input[readonly] + .clear {
  display: none;
}
/* line 221, node_modules\bpmn-js-properties-panel\styles\properties.less */
.bpp-properties-entry .bpp-field-wrapper select {
  resize: vertical;
}
/* line 227, node_modules\bpmn-js-properties-panel\styles\properties.less */
.bpp-hidden {
  display: none;
}
/* line 231, node_modules\bpmn-js-properties-panel\styles\properties.less */
label.bpp-hidden {
  display: none;
}
/* line 236, node_modules\bpmn-js-properties-panel\styles\properties.less */
.bpp-table-add-row > button {
  position: relative;
  margin-left: 10px;
}
/* line 242, node_modules\bpmn-js-properties-panel\styles\properties.less */
.bpp-table {
  margin-top: 10px;
}
/* line 246, node_modules\bpmn-js-properties-panel\styles\properties.less */
.bpp-table-row {
  margin-bottom: 2px;
  overflow: hidden;
}
/* line 250, node_modules\bpmn-js-properties-panel\styles\properties.less */
.bpp-table-row > input,
.bpp-table-row > button {
  float: left;
}
/* line 255, node_modules\bpmn-js-properties-panel\styles\properties.less */
.bpp-table-row > label {
  padding-left: 5px;
}
/* line 262, node_modules\bpmn-js-properties-panel\styles\properties.less */
.bpp-table-row > label.bpp-table-row-columns-1,
.bpp-table-row > input.bpp-table-row-columns-1 {
  width: 100%;
}
/* line 264, node_modules\bpmn-js-properties-panel\styles\properties.less */
.bpp-table-row > label.bpp-table-row-columns-1.bpp-table-row-removable,
.bpp-table-row > input.bpp-table-row-columns-1.bpp-table-row-removable {
  width: calc(100% - 24px);
}
/* line 269, node_modules\bpmn-js-properties-panel\styles\properties.less */
.bpp-table-row > label.bpp-table-row-columns-2,
.bpp-table-row > input.bpp-table-row-columns-2 {
  width: 50%;
  box-sizing: border-box;
}
/* line 272, node_modules\bpmn-js-properties-panel\styles\properties.less */
.bpp-table-row > label.bpp-table-row-columns-2.bpp-table-row-removable,
.bpp-table-row > input.bpp-table-row-columns-2.bpp-table-row-removable {
  width: calc(50% - 12px);
}
/* line 275, node_modules\bpmn-js-properties-panel\styles\properties.less */
.bpp-table-row > label.bpp-table-row-columns-2:nth-child(2),
.bpp-table-row > input.bpp-table-row-columns-2:nth-child(2) {
  border-left: none;
}
/* line 281, node_modules\bpmn-js-properties-panel\styles\properties.less */
.bpp-table-row > button {
  border-left: none;
  position: static;
}
/* line 287, node_modules\bpmn-js-properties-panel\styles\properties.less */
.bpp-properties-static {
  margin-bottom: 0;
  margin-top: 0;
  border: 1px solid #ccc;
  background-color: white;
  padding: 3px 6px;
  font: 13.3333px Arial;
  width: 100%;
}
/* line 297, node_modules\bpmn-js-properties-panel\styles\properties.less */
.bpp-entry-link {
  cursor: pointer;
  color: #52B415;
}
/* line 302, node_modules\bpmn-js-properties-panel\styles\properties.less */
.bpp-icon-warning:before {
  font-family: "bpmn-js-pp";
  font-style: normal;
  font-weight: normal;
  speak: none;
  display: inline-block;
  text-decoration: inherit;
  text-align: center;
  font-variant: normal;
  text-transform: none;
  line-height: 1em;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  content: '\E806';
}
/* line 307, node_modules\bpmn-js-properties-panel\styles\properties.less */
.bpp-field-description {
  margin-top: 5px;
  color: #999;
}
/* line 311, node_modules\bpmn-js-properties-panel\styles\properties.less */
.bpp-field-description a {
  color: #3d8610;
  text-decoration: none;
}
/* line 315, node_modules\bpmn-js-properties-panel\styles\properties.less */
.bpp-field-description a:hover {
  color: #52B415;
}
/* line 1, node_modules\bpmn-js-properties-panel\styles\header.less */
.bpp-properties-header {
  padding: 15px;
  padding-bottom: 5px;
}
/* line 5, node_modules\bpmn-js-properties-panel\styles\header.less */
.bpp-properties-header > .label {
  font-size: 120%;
  font-weight: bolder;
}
/* line 10, node_modules\bpmn-js-properties-panel\styles\header.less */
.bpp-properties-header > .search {
  display: none;
  margin-top: 5px;
  position: relative;
}
/* line 15, node_modules\bpmn-js-properties-panel\styles\header.less */
.bpp-properties-header > .search input {
  position: relative;
  border-radius: 15px;
  width: 100%;
  z-index: 1;
}
/* line 22, node_modules\bpmn-js-properties-panel\styles\header.less */
.bpp-properties-header > .search button {
  position: absolute;
  top: 0;
  bottom: 0;
  right: 0;
  border: none;
  background-color: transparent;
  z-index: 2;
}
/* line 30, node_modules\bpmn-js-properties-panel\styles\header.less */
.bpp-properties-header > .search button:before {
  content: '\E805';
}
/* line 1, node_modules\bpmn-js-properties-panel\styles\groups.less */
.bpp-properties-group {
  padding: 6px 15px 6px 15px;
  position: relative;
  overflow: hidden;
  transition: max-height 0.218s ease-in-out, padding-top 0.218s ease-in-out, padding-bottom 0.218s ease-in-out;
}
/* line 9, node_modules\bpmn-js-properties-panel\styles\groups.less */
.bpp-properties-group:empty {
  display: none;
}
/* line 13, node_modules\bpmn-js-properties-panel\styles\groups.less */
.bpp-properties-group > .group-toggle {
  position: absolute;
  top: 0;
  left: 0;
  bottom: 0;
  width: 4px;
  cursor: pointer;
  transition: background-color 0.218s linear;
}
/* line 21, node_modules\bpmn-js-properties-panel\styles\groups.less */
.bpp-properties-group > .group-toggle:hover {
  background-color: #8fc071;
}
/* line 26, node_modules\bpmn-js-properties-panel\styles\groups.less */
.bpp-properties-group > .group-label {
  font-weight: bolder;
  display: inline-block;
  vertical-align: middle;
  color: #666;
  font-size: 120%;
  margin-top: 5px;
  margin-bottom: 10px;
  transition: margin 0.218s linear;
  font-style: italic;
}
/* line 71, node_modules\bpmn-js-properties-panel\styles\_mixins.less */
.bpp-properties-group > .group-label[for] {
  cursor: pointer;
}
/* line 74, node_modules\bpmn-js-properties-panel\styles\_mixins.less */
.bpp-properties-group > .group-label.bpp-hidden {
  display: none;
}
/* line 35, node_modules\bpmn-js-properties-panel\styles\groups.less */
.bpp-properties-group:hover > .group-toggle {
  background-color: #ccc;
}
/* line 37, node_modules\bpmn-js-properties-panel\styles\groups.less */
.bpp-properties-group:hover > .group-toggle:hover {
  background-color: #8fc071;
}
/* line 42, node_modules\bpmn-js-properties-panel\styles\groups.less */
.bpp-properties-group.group-closed {
  max-height: 20px;
  border-top: none;
  cursor: pointer;
  background-color: rgba(143, 192, 113, 0.2);
  padding-top: 0;
  padding-bottom: 0;
}
/* line 50, node_modules\bpmn-js-properties-panel\styles\groups.less */
.bpp-properties-group.group-closed > div {
  visibility: hidden;
}
/* line 54, node_modules\bpmn-js-properties-panel\styles\groups.less */
.bpp-properties-group.group-closed > .group-label {
  margin-top: 2px;
  margin-bottom: 2px;
}
/* line 59, node_modules\bpmn-js-properties-panel\styles\groups.less */
.bpp-properties-group.group-closed:hover > .group-label {
  color: #52B415;
}
/* line 64, node_modules\bpmn-js-properties-panel\styles\groups.less */
.bpp-properties-group + .bpp-properties-group {
  border-top: 1px dotted #ccc;
}
/* line 68, node_modules\bpmn-js-properties-panel\styles\groups.less */
.bpp-properties-group:last-child {
  padding-bottom: 9px;
}
/* line 2, node_modules\bpmn-js-properties-panel\styles\listeners.less */
.cam-add-listener > button {
  position: relative;
  margin-left: 10px;
}
/* line 8, node_modules\bpmn-js-properties-panel\styles\listeners.less */
[data-list-entry-container] > .bpp-listener-area {
  border: 1px solid #ccc;
  margin: 10px 1px;
  padding: 10px;
}
/* line 14, node_modules\bpmn-js-properties-panel\styles\listeners.less */
.bpp-listener-area {
  position: relative;
}
/* line 16, node_modules\bpmn-js-properties-panel\styles\listeners.less */
.bpp-listener-area > button {
  position: absolute;
  right: 0;
  top: 0;
  border: none;
  background: none;
}
/* line 25, node_modules\bpmn-js-properties-panel\styles\listeners.less */
.bpp-listener-area + .bpp-listener-area {
  margin-top: 20px;
}
/* line 1, node_modules\bpmn-js-properties-panel\styles\tabs.less */
.bpp-properties-tab-bar {
  border-bottom: 1px solid #ccc;
  padding: 0 15px;
}
/* line 5, node_modules\bpmn-js-properties-panel\styles\tabs.less */
.bpp-properties-tab-bar .scroll-tabs-button {
  cursor: pointer;
  font-size: 16px;
  padding: 3px 4px 3px 4px;
  color: #666;
}
/* line 11, node_modules\bpmn-js-properties-panel\styles\tabs.less */
.bpp-properties-tab-bar .scroll-tabs-button:hover {
  font-weight: bold;
}
/* line 15, node_modules\bpmn-js-properties-panel\styles\tabs.less */
.bpp-properties-tab-bar .scroll-tabs-button.scroll-tabs-left {
  float: left;
  margin-left: -15px;
}
/* line 20, node_modules\bpmn-js-properties-panel\styles\tabs.less */
.bpp-properties-tab-bar .scroll-tabs-button.scroll-tabs-right {
  float: right;
  margin-right: -15px;
}
/* line 27, node_modules\bpmn-js-properties-panel\styles\tabs.less */
.bpp-properties-tab-bar:not(.scroll-tabs-overflow) .scroll-tabs-button {
  display: none;
}
/* line 33, node_modules\bpmn-js-properties-panel\styles\tabs.less */
ul.bpp-properties-tabs-links {
  margin: 5px 0 -1px 0;
  padding: 0;
  white-space: nowrap;
  overflow: hidden;
}
/* line 39, node_modules\bpmn-js-properties-panel\styles\tabs.less */
ul.bpp-properties-tabs-links > li {
  display: inline-block;
  margin: 0;
}
/* line 43, node_modules\bpmn-js-properties-panel\styles\tabs.less */
ul.bpp-properties-tabs-links > li.bpp-hidden {
  display: none;
}
/* line 47, node_modules\bpmn-js-properties-panel\styles\tabs.less */
ul.bpp-properties-tabs-links > li > a {
  display: inline-block;
  font-size: 12px;
  padding: 4px 7px;
  border: 1px solid #ccc;
  border-radius: 3px 3px 0 0;
  border-bottom: transparent;
  background-color: #f8f8f8;
  color: #666;
  text-decoration: none;
}
/* line 62, node_modules\bpmn-js-properties-panel\styles\tabs.less */
ul.bpp-properties-tabs-links > li > a:hover {
  color: #4d4d4d;
}
/* line 68, node_modules\bpmn-js-properties-panel\styles\tabs.less */
ul.bpp-properties-tabs-links > li + li {
  margin-left: 4px;
}
/* line 74, node_modules\bpmn-js-properties-panel\styles\tabs.less */
ul.bpp-properties-tabs-links > li.bpp-active a {
  padding-bottom: 5px;
  border-top: 2px solid #52B415;
  border-bottom: none;
}
/* line 83, node_modules\bpmn-js-properties-panel\styles\tabs.less */
.bpp-properties-tab,
.bpp-properties-tab.bpp-hidden {
  display: none;
}
/* line 88, node_modules\bpmn-js-properties-panel\styles\tabs.less */
.bpp-properties-tab.bpp-active {
  display: block;
}
/* line 3, styles/app.less */
* {
  box-sizing: border-box;
}
/* line 7, styles/app.less */
body,
html {
  font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
  font-size: 12px;
  height: 100%;
  max-height: 100%;
  padding: 0;
  margin: 0;
}
/* line 20, styles/app.less */
a:link {
  text-decoration: none;
}
/* line 24, styles/app.less */
.content {
  position: relative;
  width: 100%;
  height: 100%;
}
/* line 29, styles/app.less */
.content > .message {
  width: 100%;
  height: 100%;
  text-align: center;
  display: table;
  font-size: 16px;
  color: #111;
}
/* line 38, styles/app.less */
.content > .message .note {
  vertical-align: middle;
  text-align: center;
  display: table-cell;
}
/* line 45, styles/app.less */
.content > .message.error .details {
  max-width: 500px;
  font-size: 12px;
  margin: 20px auto;
  text-align: left;
  color: #BD2828;
}
/* line 53, styles/app.less */
.content > .message.error pre {
  border: solid 1px #BD2828;
  background: #fefafa;
  padding: 10px;
  color: #BD2828;
}
/* line 61, styles/app.less */
.content:not(.with-error) .error,
.content.with-error .intro,
.content.with-diagram .intro {
  display: none;
}
/* line 67, styles/app.less */
.content .canvas {
  position: absolute;
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;
}
/* line 75, styles/app.less */
.content .canvas,
.content .properties-panel-parent {
  display: none;
}
/* line 81, styles/app.less */
.content.with-diagram .canvas,
.content.with-diagram .properties-panel-parent {
  display: block;
}
/* line 89, styles/app.less */
.buttons {
  position: fixed;
  bottom: 20px;
  left: 20px;
  padding: 0;
  margin: 0;
  list-style: none;
}
/* line 98, styles/app.less */
.buttons > li {
  display: inline-block;
  margin-right: 10px;
}
/* line 102, styles/app.less */
.buttons > li > a {
  background: #DDD;
  border: solid 1px #666;
  display: inline-block;
  padding: 5px;
}
/* line 110, styles/app.less */
.buttons a {
  opacity: 0.3;
}
/* line 114, styles/app.less */
.buttons a.active {
  opacity: 1;
}
/* line 119, styles/app.less */
.properties-panel-parent {
  position: absolute;
  top: 0;
  bottom: 0;
  right: 0;
  width: 260px;
  z-index: 10;
  border-left: 1px solid #ccc;
  overflow: auto;
}
/* line 128, styles/app.less */
.properties-panel-parent:empty {
  display: none;
}
/* line 131, styles/app.less */
.properties-panel-parent > .djs-properties-panel {
  padding-bottom: 70px;
  min-height: 100%;
}
public/bpmnjs/css/diagram-js.css
New file
@@ -0,0 +1,717 @@
/**
 * outline styles
 */
.djs-outline {
  fill: none;
  visibility: hidden;
}
.djs-element.hover .djs-outline,
.djs-element.selected .djs-outline {
  visibility: visible;
  shape-rendering: crispEdges;
  stroke-dasharray: 3,3;
}
.djs-element.selected .djs-outline {
  stroke: #8888FF;
  stroke-width: 1px;
}
.djs-element.hover .djs-outline {
  stroke: #FF8888;
  stroke-width: 1px;
}
.djs-shape.connect-ok .djs-visual > :nth-child(1) {
  fill: #DCFECC /* light-green */ !important;
}
.djs-shape.connect-not-ok .djs-visual > :nth-child(1),
.djs-shape.drop-not-ok .djs-visual > :nth-child(1) {
  fill: #f9dee5 /* light-red */ !important;
}
.djs-shape.new-parent .djs-visual > :nth-child(1) {
  fill: #F7F9FF !important;
}
svg.drop-not-ok {
  background: #f9dee5 /* light-red */ !important;
}
svg.new-parent {
  background: #F7F9FF /* light-blue */ !important;
}
.djs-connection.connect-ok .djs-visual > :nth-child(1),
.djs-connection.drop-ok .djs-visual > :nth-child(1) {
  stroke: #90DD5F /* light-green */ !important;
}
.djs-connection.connect-not-ok .djs-visual > :nth-child(1),
.djs-connection.drop-not-ok .djs-visual > :nth-child(1) {
  stroke: #E56283 /* light-red */ !important;
}
.drop-not-ok,
.connect-not-ok {
  cursor: not-allowed;
}
.djs-element.attach-ok .djs-visual > :nth-child(1) {
  stroke-width: 5px !important;
  stroke: rgba(255, 116, 0, 0.7) !important;
}
.djs-frame.connect-not-ok .djs-visual > :nth-child(1),
.djs-frame.drop-not-ok .djs-visual > :nth-child(1) {
  stroke-width: 3px !important;
  stroke: #E56283 /* light-red */ !important;
  fill: none !important;
}
/**
* Selection box style
*
*/
.djs-lasso-overlay {
  fill: rgb(255, 116, 0);
  fill-opacity: 0.1;
  stroke-dasharray: 5 1 3 1;
  stroke: rgb(255, 116, 0);
  shape-rendering: crispEdges;
  pointer-events: none;
}
/**
 * Resize styles
 */
.djs-resize-overlay {
  fill: none;
  stroke-dasharray: 5 1 3 1;
  stroke: rgb(255, 116, 0);
  pointer-events: none;
}
.djs-resizer-hit {
  fill: none;
  pointer-events: all;
}
.djs-resizer-visual {
  fill: white;
  stroke-width: 1px;
  stroke: black;
  shape-rendering: crispEdges;
  stroke-opacity: 0.2;
}
.djs-cursor-resize-nwse,
.djs-resizer-nw,
.djs-resizer-se {
  cursor: nwse-resize;
}
.djs-cursor-resize-nesw,
.djs-resizer-ne,
.djs-resizer-sw {
  cursor: nesw-resize;
}
.djs-shape.djs-resizing > .djs-outline {
  visibility: hidden !important;
}
.djs-shape.djs-resizing > .djs-resizer {
  visibility: hidden;
}
.djs-dragger > .djs-resizer {
  visibility: hidden;
}
/**
 * drag styles
 */
.djs-dragger * {
  fill: none !important;
  stroke: rgb(255, 116, 0) !important;
}
.djs-dragger tspan,
.djs-dragger text {
  fill: rgb(255, 116, 0) !important;
  stroke: none !important;
}
marker.djs-dragger circle,
marker.djs-dragger path,
marker.djs-dragger polygon,
marker.djs-dragger polyline,
marker.djs-dragger rect {
  fill: rgb(255, 116, 0) !important;
  stroke: none !important;
}
marker.djs-dragger text,
marker.djs-dragger tspan {
  fill: none !important;
  stroke: rgb(255, 116, 0) !important;
}
.djs-dragging {
  opacity: 0.3;
}
.djs-dragging,
.djs-dragging > * {
  pointer-events: none !important;
}
.djs-dragging .djs-context-pad,
.djs-dragging .djs-outline {
  display: none !important;
}
/**
 * no pointer events for visual
 */
.djs-visual,
.djs-outline {
  pointer-events: none;
}
.djs-element.attach-ok .djs-hit {
  stroke-width: 60px !important;
}
/**
 * all pointer events for hit shape
 */
.djs-element > .djs-hit-all {
  pointer-events: all;
}
.djs-element > .djs-hit-stroke,
.djs-element > .djs-hit-click-stroke {
  pointer-events: stroke;
}
/**
 * all pointer events for hit shape
 */
.djs-drag-active .djs-element > .djs-hit-click-stroke {
  pointer-events: all;
}
/**
 * shape / connection basic styles
 */
.djs-connection .djs-visual {
  stroke-width: 2px;
  fill: none;
}
.djs-cursor-grab {
  cursor: -webkit-grab;
  cursor: -moz-grab;
  cursor: grab;
}
.djs-cursor-grabbing {
  cursor: -webkit-grabbing;
  cursor: -moz-grabbing;
  cursor: grabbing;
}
.djs-cursor-crosshair {
  cursor: crosshair;
}
.djs-cursor-move {
  cursor: move;
}
.djs-cursor-resize-ns {
  cursor: ns-resize;
}
.djs-cursor-resize-ew {
  cursor: ew-resize;
}
/**
 * snapping
 */
.djs-snap-line {
  stroke: rgb(255, 195, 66);
  stroke: rgba(255, 195, 66, 0.50);
  stroke-linecap: round;
  stroke-width: 2px;
  pointer-events: none;
}
/**
 * snapping
 */
.djs-crosshair {
  stroke: #555;
  stroke-linecap: round;
  stroke-width: 1px;
  pointer-events: none;
  shape-rendering: crispEdges;
  stroke-dasharray: 5, 5;
}
/**
 * palette
 */
.djs-palette {
  position: absolute;
  left: 20px;
  top: 20px;
  box-sizing: border-box;
  width: 48px;
}
.djs-palette .separator {
  margin: 0 5px;
  padding-top: 5px;
  border: none;
  border-bottom: solid 1px #DDD;
  clear: both;
}
.djs-palette .entry:before {
  vertical-align: text-bottom;
}
.djs-palette .djs-palette-toggle {
  cursor: pointer;
}
.djs-palette .entry,
.djs-palette .djs-palette-toggle {
  color: #333;
  font-size: 30px;
  text-align: center;
}
.djs-palette .entry {
  float: left;
}
.djs-palette .entry img {
  max-width: 100%;
}
.djs-palette .djs-palette-entries:after {
  content: '';
  display: table;
  clear: both;
}
.djs-palette .djs-palette-toggle:hover {
  background: #666;
}
.djs-palette .entry:hover {
  color: rgb(255, 116, 0);
}
.djs-palette .highlighted-entry {
  color: rgb(255, 116, 0) !important;
}
.djs-palette .entry,
.djs-palette .djs-palette-toggle {
  width: 46px;
  height: 46px;
  line-height: 46px;
  cursor: default;
}
/**
 * Palette open / two-column layout is controlled via
 * classes on the palette. Events to hook into palette
 * changed life-cycle are available in addition.
 */
.djs-palette.two-column.open {
  width: 94px;
}
.djs-palette:not(.open) .djs-palette-entries {
  display: none;
}
.djs-palette:not(.open) {
  overflow: hidden;
}
.djs-palette.open .djs-palette-toggle {
  display: none;
}
/**
 * context-pad
 */
.djs-overlay-context-pad {
  width: 72px;
}
.djs-context-pad {
  position: absolute;
  display: none;
  pointer-events: none;
}
.djs-context-pad .entry {
  width: 22px;
  height: 22px;
  text-align: center;
  display: inline-block;
  font-size: 22px;
  margin: 0 2px 2px 0;
  border-radius: 3px;
  cursor: default;
  background-color: #FEFEFE;
  box-shadow: 0 0 2px 1px #FEFEFE;
  pointer-events: all;
}
.djs-context-pad .entry:before {
  vertical-align: top;
}
.djs-context-pad .entry:hover {
  background: rgb(255, 252, 176);
}
.djs-context-pad.open {
  display: block;
}
/**
 * popup styles
 */
.djs-popup .entry {
  line-height: 20px;
  white-space: nowrap;
  cursor: default;
}
/* larger font for prefixed icons */
.djs-popup .entry:before {
  vertical-align: middle;
  font-size: 20px;
}
.djs-popup .entry > span {
  vertical-align: middle;
  font-size: 14px;
}
.djs-popup .entry:hover,
.djs-popup .entry.active:hover {
  background: rgb(255, 252, 176);
}
.djs-popup .entry.disabled {
  background: inherit;
}
.djs-popup .djs-popup-header .entry {
  display: inline-block;
  padding: 2px 3px 2px 3px;
  border: solid 1px transparent;
  border-radius: 3px;
}
.djs-popup .djs-popup-header .entry.active {
  color: rgb(255, 116, 0);
  border: solid 1px rgb(255, 116, 0);
  background-color: #F6F6F6;
}
.djs-popup-body .entry {
  padding: 4px 10px 4px 5px;
}
.djs-popup-body .entry > span {
  margin-left: 5px;
}
.djs-popup-body {
  background-color: #FEFEFE;
}
.djs-popup-header {
  border-bottom: 1px solid #DDD;
}
.djs-popup-header .entry {
  margin: 1px;
  margin-left: 3px;
}
.djs-popup-header .entry:last-child {
  margin-right: 3px;
}
/**
 * popup / palette styles
 */
.djs-popup, .djs-palette {
  background: #FAFAFA;
  border: solid 1px #CCC;
  border-radius: 2px;
}
/**
 * touch
 */
.djs-shape,
.djs-connection {
  touch-action: none;
}
.djs-segment-dragger,
.djs-bendpoint {
  display: none;
}
/**
 * bendpoints
 */
.djs-segment-dragger .djs-visual {
  fill: rgba(255, 255, 121, 0.2);
  stroke-width: 1px;
  stroke-opacity: 1;
  stroke: rgba(255, 255, 121, 0.3);
}
.djs-bendpoint .djs-visual {
  fill: rgba(255, 255, 121, 0.8);
  stroke-width: 1px;
  stroke-opacity: 0.5;
  stroke: black;
}
.djs-segment-dragger:hover,
.djs-bendpoints.hover .djs-segment-dragger,
.djs-bendpoints.selected .djs-segment-dragger,
.djs-bendpoint:hover,
.djs-bendpoints.hover .djs-bendpoint,
.djs-bendpoints.selected .djs-bendpoint {
  display: block;
}
.djs-drag-active .djs-bendpoints * {
  display: none;
}
.djs-bendpoints:not(.hover) .floating {
  display: none;
}
.djs-segment-dragger:hover .djs-visual,
.djs-segment-dragger.djs-dragging .djs-visual,
.djs-bendpoint:hover .djs-visual,
.djs-bendpoint.floating .djs-visual {
  fill: yellow;
  stroke-opacity: 0.5;
  stroke: black;
}
.djs-bendpoint.floating .djs-hit {
  pointer-events: none;
}
.djs-segment-dragger .djs-hit,
.djs-bendpoint .djs-hit {
  pointer-events: all;
  fill: none;
}
.djs-segment-dragger.horizontal .djs-hit {
  cursor: ns-resize;
}
.djs-segment-dragger.vertical .djs-hit {
  cursor: ew-resize;
}
.djs-segment-dragger.djs-dragging .djs-hit {
  pointer-events: none;
}
.djs-updating,
.djs-updating > * {
  pointer-events: none !important;
}
.djs-updating .djs-context-pad,
.djs-updating .djs-outline,
.djs-updating .djs-bendpoint,
.connect-ok .djs-bendpoint,
.connect-not-ok .djs-bendpoint,
.drop-ok .djs-bendpoint,
.drop-not-ok .djs-bendpoint {
  display: none !important;
}
.djs-segment-dragger.djs-dragging,
.djs-bendpoint.djs-dragging {
  display: block;
  opacity: 1.0;
}
.djs-segment-dragger.djs-dragging .djs-visual,
.djs-bendpoint.djs-dragging .djs-visual {
  fill: yellow;
  stroke-opacity: 0.5;
}
/**
 * tooltips
 */
.djs-tooltip-error {
  font-size: 11px;
  line-height: 18px;
  text-align: left;
  padding: 5px;
  opacity: 0.7;
}
.djs-tooltip-error > * {
  width: 160px;
  background: rgb(252, 236, 240);
  color: rgb(158, 76, 76);
  padding: 3px 7px;
  border-radius: 5px;
  border-left: solid 5px rgb(174, 73, 73);
}
.djs-tooltip-error:hover {
  opacity: 1;
}
/**
 * search pad
 */
.djs-search-container {
  position: absolute;
  top: 20px;
  left: 0;
  right: 0;
  margin-left: auto;
  margin-right: auto;
  width: 25%;
  min-width: 300px;
  max-width: 400px;
  z-index: 10;
  font-size: 1.05em;
  opacity: 0.9;
  background: #FAFAFA;
  border: solid 1px #CCC;
  border-radius: 2px;
}
.djs-search-container:not(.open) {
  display: none;
}
.djs-search-input input {
  font-size: 1.05em;
  width: 100%;
  padding: 6px 10px;
  border: 1px solid #ccc;
}
.djs-search-input input:focus {
  outline: none;
  border-color: #52B415;
}
.djs-search-results {
  position: relative;
  overflow-y: auto;
  max-height: 200px;
}
.djs-search-results:hover {
  /*background: #fffdd7;*/
  cursor: pointer;
}
.djs-search-result {
  width: 100%;
  padding: 6px 10px;
  background: white;
  border-bottom: solid 1px #AAA;
  border-radius: 1px;
}
.djs-search-highlight {
  color: black;
}
.djs-search-result-primary {
  margin: 0 0 10px;
}
.djs-search-result-secondary {
  font-family: monospace;
  margin: 0;
}
.djs-search-result:hover {
  background: #fdffd6;
}
.djs-search-result-selected {
  background: #fffcb0;
}
.djs-search-result-selected:hover {
  background: #f7f388;
}
.djs-search-overlay {
  background: yellow;
  opacity: 0.3;
}
/**
 * hidden styles
 */
.djs-element-hidden,
.djs-element-hidden .djs-hit,
.djs-element-hidden .djs-outline,
.djs-label-hidden .djs-label {
  display: none !important;
}
public/bpmnjs/favicon.ico
public/bpmnjs/index.html
New file
@@ -0,0 +1,110 @@
<!DOCTYPE html>
<html >
<head>
  <meta charset="utf-8" />
  <title>在线绘制流程</title>
  <link rel="icon" href="favicon.ico">
  <link rel="stylesheet" href="css/diagram-js.css" />
  <link rel="stylesheet" href="vendor/bpmn-font/css/bpmn-embedded.css" />
  <link rel="stylesheet" href="css/app.css" />
  <style>
    .item{
      display: none;
      cursor: pointer;
    }
    .bjs-powered-by {
      display: none;
    }
    .buttons > li {
      /* display: inline-block; */
      margin-right: 10px;
      height: 26px;
      line-height: 26px;
      float: left;
    }
    .buttons > li > a.btn  {
      background: #00BCD4;
      border: none;
      outline: none;
      padding: 0px 10px;
      color: #fff;
      display: inline-block;
      opacity: 1;
      height: 26px;
      font-size: 14px;
      line-height: 26px;
    }
    .label  {
      background: #00BCD4;
      border: none;
      outline: none;
      padding: 0px 10px;
      color: #fff;
      display: inline-block;
      cursor: pointer;
      opacity: 1;
      height: 26px;
      font-size: 14px;
      line-height: 26px;
    }
    .sy-mask{width:100%;
      height:100%;
      position:fixed;
      background:rgba(0,0,0,0.8);
      left:0;top:0;z-index:1000;
      display: none;
    }
    .sy-alert{
      position:fixed;display:none;background:#fff;border-radius:5px;overflow:hidden;width:300px;max-width:90%;max-height:80%;left:0;right:0;margin:0 auto;z-index:9999}.sy-alert.animated{-webkit-animation-duration:.3s;animation-duration:.3s}.sy-alert .sy-title{height:45px;color:#333;line-height:45px;font-size:15px;border-bottom:1px solid #eee;padding:0 12px}.sy-alert .sy-content{padding:20px;text-align:center;font-size:14px;line-height:24px;color:#666;overflow-y:auto}.sy-alert .sy-btn{height:50%;border-top:1px solid #eee;overflow:hidden}.sy-alert .sy-btn button{float:left;border:0;color:#333;cursor:pointer;background:#fff;width:50%;line-height:45px;font-size:15px;text-align:center}.sy-alert .sy-btn button:nth-child(1){color:#888;border-right:1px solid #eee}.sy-alert.sy-alert-alert .sy-btn button{float:none;width:100%}.sy-alert.sy-alert-tips{text-align:center;width:150px;background:rgba(0,0,0,0.7)}.sy-alert.sy-alert-tips .sy-content{padding:8px;color:#fff;font-size:14px}.sy-alert.sy-alert-model .sy-content{text-align:left}.sy-alert.sy-alert-model .sy-content .form .input-item{margin-bottom:12px;position:relative}.sy-alert.sy-alert-model .sy-content .form .input-item input{display:block;position:relative;width:100%;border:1px solid #eee;padding:10px}.sy-alert.sy-alert-model .sy-content .form .input-item .getcode{border:0;top:0;right:0;position:absolute;background:0;line-height:37px;color:#f60;width:100px;text-align:center}
  </style>
</head>
<body>
<div class="content with-diagram" id="js-drop-zone">
  <div class="message error">
    <div class="note">
      <p>无法显示bpms2.0</p>
      <div class="details">
        <span>错误详细信息</span>
        <pre></pre>
      </div>
    </div>
  </div>
  <div class="canvas" id="js-canvas"></div>
  <div class="properties-panel-parent" id="js-properties-panel"></div>
</div>
<ul class="buttons">
  <li class="item upload">
    <form id="form1" name="myForm" onsubmit="return false" method="post" enctype="multipart/form-data" title="上传文件">
      <input type="file" name="uploadFile" id="uploadFile" accept=".bpmn" style="display: none">
      <label class="label" for="uploadFile" >导入</label>
    </form>
  </li>
  <li class="item download">
    <a class="btn" href id="downloadBpmn">导出</a>
  </li>
  <li class="item submit">
    <a class="btn" id="js-download-diagram">
      部署
    </a>
  </li>
</ul>
<div class="sy-alert sy-alert-model animated" sy-enter="zoomIn" sy-leave="zoomOut" sy-type="confirm" sy-mask="true" id="alert" >
  <div class="sy-title">部署流程</div>
  <div class="sy-content">
        确认是否部署该流程
<!--    <div class="form">-->
<!--      <p class="input-item"><input id="deploymentName" type="text" placeholder="请输入流程名称"></p>-->
<!--    </div>-->
  </div>
  <div class="sy-btn">
    <button id="sure">确定</button>
    <button class="cancel" >取消</button>
  </div>
</div>
<div class="sy-mask cancel"></div>
<script src="index.js"></script>
</body>
</html>
public/bpmnjs/index.js
New file
Diff too large
public/bpmnjs/vendor/bpmn-font/css/bpmn-codes.css
New file
@@ -0,0 +1,108 @@
.bpmn-icon-screw-wrench:before { content: '\e800'; } /* '' */
.bpmn-icon-trash:before { content: '\e801'; } /* '' */
.bpmn-icon-conditional-flow:before { content: '\e802'; } /* '' */
.bpmn-icon-default-flow:before { content: '\e803'; } /* '' */
.bpmn-icon-gateway-parallel:before { content: '\e804'; } /* '' */
.bpmn-icon-intermediate-event-catch-cancel:before { content: '\e805'; } /* '' */
.bpmn-icon-intermediate-event-catch-non-interrupting-message:before { content: '\e806'; } /* '' */
.bpmn-icon-start-event-compensation:before { content: '\e807'; } /* '' */
.bpmn-icon-start-event-non-interrupting-parallel-multiple:before { content: '\e808'; } /* '' */
.bpmn-icon-loop-marker:before { content: '\e809'; } /* '' */
.bpmn-icon-parallel-mi-marker:before { content: '\e80a'; } /* '' */
.bpmn-icon-start-event-non-interrupting-signal:before { content: '\e80b'; } /* '' */
.bpmn-icon-intermediate-event-catch-non-interrupting-timer:before { content: '\e80c'; } /* '' */
.bpmn-icon-intermediate-event-catch-parallel-multiple:before { content: '\e80d'; } /* '' */
.bpmn-icon-intermediate-event-catch-compensation:before { content: '\e80e'; } /* '' */
.bpmn-icon-gateway-xor:before { content: '\e80f'; } /* '' */
.bpmn-icon-connection:before { content: '\e810'; } /* '' */
.bpmn-icon-end-event-cancel:before { content: '\e811'; } /* '' */
.bpmn-icon-intermediate-event-catch-condition:before { content: '\e812'; } /* '' */
.bpmn-icon-intermediate-event-catch-non-interrupting-parallel-multiple:before { content: '\e813'; } /* '' */
.bpmn-icon-start-event-condition:before { content: '\e814'; } /* '' */
.bpmn-icon-start-event-non-interrupting-timer:before { content: '\e815'; } /* '' */
.bpmn-icon-sequential-mi-marker:before { content: '\e816'; } /* '' */
.bpmn-icon-user-task:before { content: '\e817'; } /* '' */
.bpmn-icon-business-rule:before { content: '\e818'; } /* '' */
.bpmn-icon-sub-process-marker:before { content: '\e819'; } /* '' */
.bpmn-icon-start-event-parallel-multiple:before { content: '\e81a'; } /* '' */
.bpmn-icon-start-event-error:before { content: '\e81b'; } /* '' */
.bpmn-icon-intermediate-event-catch-signal:before { content: '\e81c'; } /* '' */
.bpmn-icon-intermediate-event-catch-error:before { content: '\e81d'; } /* '' */
.bpmn-icon-end-event-compensation:before { content: '\e81e'; } /* '' */
.bpmn-icon-subprocess-collapsed:before { content: '\e81f'; } /* '' */
.bpmn-icon-subprocess-expanded:before { content: '\e820'; } /* '' */
.bpmn-icon-task:before { content: '\e821'; } /* '' */
.bpmn-icon-end-event-error:before { content: '\e822'; } /* '' */
.bpmn-icon-intermediate-event-catch-escalation:before { content: '\e823'; } /* '' */
.bpmn-icon-intermediate-event-catch-timer:before { content: '\e824'; } /* '' */
.bpmn-icon-start-event-escalation:before { content: '\e825'; } /* '' */
.bpmn-icon-start-event-signal:before { content: '\e826'; } /* '' */
.bpmn-icon-business-rule-task:before { content: '\e827'; } /* '' */
.bpmn-icon-manual:before { content: '\e828'; } /* '' */
.bpmn-icon-receive:before { content: '\e829'; } /* '' */
.bpmn-icon-call-activity:before { content: '\e82a'; } /* '' */
.bpmn-icon-start-event-timer:before { content: '\e82b'; } /* '' */
.bpmn-icon-start-event-message:before { content: '\e82c'; } /* '' */
.bpmn-icon-intermediate-event-none:before { content: '\e82d'; } /* '' */
.bpmn-icon-intermediate-event-catch-link:before { content: '\e82e'; } /* '' */
.bpmn-icon-end-event-escalation:before { content: '\e82f'; } /* '' */
.bpmn-icon-text-annotation:before { content: '\e830'; } /* '' */
.bpmn-icon-bpmn-io:before { content: '\e831'; } /* '' */
.bpmn-icon-gateway-complex:before { content: '\e832'; } /* '' */
.bpmn-icon-gateway-eventbased:before { content: '\e833'; } /* '' */
.bpmn-icon-gateway-none:before { content: '\e834'; } /* '' */
.bpmn-icon-gateway-or:before { content: '\e835'; } /* '' */
.bpmn-icon-end-event-terminate:before { content: '\e836'; } /* '' */
.bpmn-icon-end-event-signal:before { content: '\e837'; } /* '' */
.bpmn-icon-end-event-none:before { content: '\e838'; } /* '' */
.bpmn-icon-end-event-multiple:before { content: '\e839'; } /* '' */
.bpmn-icon-end-event-message:before { content: '\e83a'; } /* '' */
.bpmn-icon-end-event-link:before { content: '\e83b'; } /* '' */
.bpmn-icon-intermediate-event-catch-message:before { content: '\e83c'; } /* '' */
.bpmn-icon-intermediate-event-throw-compensation:before { content: '\e83d'; } /* '' */
.bpmn-icon-start-event-multiple:before { content: '\e83e'; } /* '' */
.bpmn-icon-script:before { content: '\e83f'; } /* '' */
.bpmn-icon-manual-task:before { content: '\e840'; } /* '' */
.bpmn-icon-send:before { content: '\e841'; } /* '' */
.bpmn-icon-service:before { content: '\e842'; } /* '' */
.bpmn-icon-receive-task:before { content: '\e843'; } /* '' */
.bpmn-icon-user:before { content: '\e844'; } /* '' */
.bpmn-icon-start-event-none:before { content: '\e845'; } /* '' */
.bpmn-icon-intermediate-event-throw-escalation:before { content: '\e846'; } /* '' */
.bpmn-icon-intermediate-event-catch-multiple:before { content: '\e847'; } /* '' */
.bpmn-icon-intermediate-event-catch-non-interrupting-escalation:before { content: '\e848'; } /* '' */
.bpmn-icon-intermediate-event-throw-link:before { content: '\e849'; } /* '' */
.bpmn-icon-start-event-non-interrupting-condition:before { content: '\e84a'; } /* '' */
.bpmn-icon-data-object:before { content: '\e84b'; } /* '' */
.bpmn-icon-script-task:before { content: '\e84c'; } /* '' */
.bpmn-icon-send-task:before { content: '\e84d'; } /* '' */
.bpmn-icon-data-store:before { content: '\e84e'; } /* '' */
.bpmn-icon-start-event-non-interrupting-escalation:before { content: '\e84f'; } /* '' */
.bpmn-icon-intermediate-event-throw-message:before { content: '\e850'; } /* '' */
.bpmn-icon-intermediate-event-catch-non-interrupting-multiple:before { content: '\e851'; } /* '' */
.bpmn-icon-intermediate-event-catch-non-interrupting-signal:before { content: '\e852'; } /* '' */
.bpmn-icon-intermediate-event-throw-multiple:before { content: '\e853'; } /* '' */
.bpmn-icon-start-event-non-interrupting-message:before { content: '\e854'; } /* '' */
.bpmn-icon-ad-hoc-marker:before { content: '\e855'; } /* '' */
.bpmn-icon-service-task:before { content: '\e856'; } /* '' */
.bpmn-icon-task-none:before { content: '\e857'; } /* '' */
.bpmn-icon-compensation-marker:before { content: '\e858'; } /* '' */
.bpmn-icon-start-event-non-interrupting-multiple:before { content: '\e859'; } /* '' */
.bpmn-icon-intermediate-event-throw-signal:before { content: '\e85a'; } /* '' */
.bpmn-icon-intermediate-event-catch-non-interrupting-condition:before { content: '\e85b'; } /* '' */
.bpmn-icon-participant:before { content: '\e85c'; } /* '' */
.bpmn-icon-event-subprocess-expanded:before { content: '\e85d'; } /* '' */
.bpmn-icon-lane-insert-below:before { content: '\e85e'; } /* '' */
.bpmn-icon-space-tool:before { content: '\e85f'; } /* '' */
.bpmn-icon-connection-multi:before { content: '\e860'; } /* '' */
.bpmn-icon-lane:before { content: '\e861'; } /* '' */
.bpmn-icon-lasso-tool:before { content: '\e862'; } /* '' */
.bpmn-icon-lane-insert-above:before { content: '\e863'; } /* '' */
.bpmn-icon-lane-divide-three:before { content: '\e864'; } /* '' */
.bpmn-icon-lane-divide-two:before { content: '\e865'; } /* '' */
.bpmn-icon-data-input:before { content: '\e866'; } /* '' */
.bpmn-icon-data-output:before { content: '\e867'; } /* '' */
.bpmn-icon-hand-tool:before { content: '\e868'; } /* '' */
.bpmn-icon-group:before { content: '\e869'; } /* '' */
.bpmn-icon-transaction:before { content: '\e8c4'; } /* '' */
public/bpmnjs/vendor/bpmn-font/css/bpmn-embedded.css
New file
@@ -0,0 +1,161 @@
@font-face {
  font-family: 'bpmn';
  src: url('../font/bpmn.eot?68866489');
  src: url('../font/bpmn.eot?68866489#iefix') format('embedded-opentype'),
       url('../font/bpmn.svg?68866489#bpmn') format('svg');
  font-weight: normal;
  font-style: normal;
}
@font-face {
  font-family: 'bpmn';
  src: url('data:application/octet-stream;base64,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') format('woff'),
       url('data:application/octet-stream;base64,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AAAAGgAA6BoAAOgaAAAAGwAA6BsAAOgbAAAAHAAA6BwAAOgcAAAAHQAA6B0AAOgdAAAAHgAA6B4AAOgeAAAAHwAA6B8AAOgfAAAAIAAA6CAAAOggAAAAIQAA6CEAAOghAAAAIgAA6CIAAOgiAAAAIwAA6CMAAOgjAAAAJAAA6CQAAOgkAAAAJQAA6CUAAOglAAAAJgAA6CYAAOgmAAAAJwAA6CcAAOgnAAAAKAAA6CgAAOgoAAAAKQAA6CkAAOgpAAAAKgAA6CoAAOgqAAAAKwAA6CsAAOgrAAAALAAA6CwAAOgsAAAALQAA6C0AAOgtAAAALgAA6C4AAOguAAAALwAA6C8AAOgvAAAAMAAA6DAAAOgwAAAAMQAA6DEAAOgxAAAAMgAA6DIAAOgyAAAAMwAA6DMAAOgzAAAANAAA6DQAAOg0AAAANQAA6DUAAOg1AAAANgAA6DYAAOg2AAAANwAA6DcAAOg3AAAAOAAA6DgAAOg4AAAAOQAA6DkAAOg5AAAAOgAA6DoAAOg6AAAAOwAA6DsAAOg7AAAAPAAA6DwAAOg8AAAAPQAA6D0AAOg9AAAAPgAA6D4AAOg+AAAAPwAA6D8AAOg/AAAAQAAA6EAAAOhAAAAAQQAA6EEAAOhBAAAAQgAA6EIAAOhCAAAAQwAA6EMAAOhDAAAARAAA6EQAAOhEAAAARQAA6EUAAOhFAAAARgAA6EYAAOhGAAAARwAA6EcAAOhHAAAASAAA6EgAAOhIAAAASQAA6EkAAOhJAAAASgAA6EoAAOhKAAAASwAA6EsAAOhLAAAATAAA6EwAAOhMAAAATQAA6E0AAOhNAAAATgAA6E4AAOhOAAAATwAA6E8AAOhPAAAAUAAA6FAAAOhQAAAAUQAA6FEAAOhRAAAAUgAA6FIAAOhSAAAAUwAA6FMAAOhTAAAAVAAA6FQAAOhUAAAAVQAA6FUAAOhVAAAAVgAA6FYAAOhWAAAAVwAA6FcAAOhXAAAAWAAA6FgAAOhYAAAAWQAA6FkAAOhZAAAAWgAA6FoAAOhaAAAAWwAA6FsAAOhbAAAAXAAA6FwAAOhcAAAAXQAA6F0AAOhdAAAAXgAA6F4AAOheAAAAXwAA6F8AAOhfAAAAYAAA6GAAAOhgAAAAYQAA6GEAAOhhAAAAYgAA6GIAAOhiAAAAYwAA6GMAAOhjAAAAZAAA6GQAAOhk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AgIEARYBAQQDDAUJBAYFBAMKAggBAgECAgIHAQEBAQEEAwQI/KcFCAgEAgEBAQIGAgICAQQBBgIKAwQBAwYEBQkEBAQDBAIBEgECAQIBAgICBwIBAQEBAgcDBQLwBAUEBAMEAgIHAgMFAgQBAgMMCgMEAgQBAQQDBAQJCAUHAw8CAQYFCAEBAQYBAgECAQICAgkBAgIDBAj9rQQIBAMCAgIFBgwGAQwBBgcDAQMDAQcHAwEHBwEDAQMECAQEDAQEBAQJBAQEBQIBAQQEAxUDBAoHGQMKAgMDAwMDAwMCBgMCAwIDAggBnAUEBAEHChwLBxIECwQHBAQHBAgEEAgEAwICAQQEAwQFDAUNBAUEBQgFJgQJBAQEBAQEAQQDAQMBAwQECAQJBAICAQIGAwQF/kQEBQQGAgIBAgMDBQQBBA0JAQ0BBAUFBAEEBQUKBRkBBAEUBgUFBQsKCQUEBAMEAQIDAwQHEwUEBQUEBQUEJR4IBAQJDAMNAhIFBAUDARQEBAkIFiwFBQQFBQUEBRsEBgQBAQIDAwQEBAkDBgULBQUFBhQBHgUKBQUEAQQBBAUcDQQBBAUDAgECAgMECAH6/sgBODFaPrq6fQHyAQEBAQcCAgQDBAQECQQFBgMCCQIBAQEBAQECBQECAwMIBAUECQMDAwcBAQEBUwECAgQHCQkKAQkHBgcDBAMEAwQHCAcUBA0EBCADAwICAgIDAwgJBQYFBQQBBAEEBRwNBAEIBAEEBAQIAQMBAwEDBAgDAQMEAwEGBAcIAQQEAQMEAwEDDAMBAwEDAQgEBAQBBAQEAQQNFwUFBAEEAQkFCgUMBAUEBAMEAQIFBwweCAQJBBQHCAcEAwQDBAMHBgQDBwUEBAkEBAMEAQICBQwFCQQDBgIBAQEBAQICBwICAwICAgECAwMIBQkIAwUCAQIBAgECAgIJAgEBAScCAwUCBAECDwMCAQIJDAkBCQQDAwEDAwEDCwcHCQkEAwQEAQEEAwwDBAYDAwIDAwMDAwMCAwMCAwIDAgMCAwQDFgMDCAkJBwMEOwECAwMEDQULAgMDAwMDAwIDAwojAwcDBwQOCwMHAwgDAwIBAQMCBAgJBAIECQQEBAQEBQMBAwEDBAEDEAQDAQMIAwEKAQMDAQMDAQMDAQYECQEDAgMDqQEEBAMECAQECQUECQ0EGwUNCQQECQQBBCIEBQEE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BgcDBAMEAwQHCAQEBwIBAgIDBAgEAq8ECAYCAQEBAQECCAIBAgIEARYBAQQDDAUJBAYFBAMKAggBAgECAgIHAQEBAQEEAwQIBPymBAQIBAIBAQECBgICAgEEAQYCCgMEAQMGBAUJBAQEAwQCARIBAgECAQICAgcCAQEBAQIHAwUElAUEBgICAQIDAwUEAQQNCQENAQQFBQQBBAUFCgUZAQQBFAYFBQULCgkFBAQDBAECAwMEBxMFBAUFBAUFBCUeCAQECQwDDQ0CGgQFAwEUBAQJCBYsBQUEBQUFBAUbBAYEAQECAwMEBAQJAwYFCwUFBQYUAR4FCgUFBAEEAQQFHA0EAQQFAwIBAgIDBAgEAjQBSzs5gFkeFRVtQD5xGhUnASI9JTduHRUHGjhNUSElLDISIzYBDxEDAwEGGSJECO0BAgIFDAUJBAMGAgEBAQEBAgIHAgIDAgICAQIDAwgFCQgDBQIBAgECAQICAgkCAQEBJwEBAwUCBAECDwMCAQIJDAkBCQQDAwEDAwEDCwcHCQkEAwQEAQEEAwwDBAYDAwIDAwMDAwMCAwMCAwIDAgMCAwQDFgMDCAkJBwMEPAEBAwMEDQULAgMDAwMDAwIDAwojAwcDBwQOCwMHAwgDAwIBAQMCBAgJBAIECQQEBAQEBQMBAwEDBAEDEAQDAQMIAwEKAQMDAQMDAQMDAQYECQEDAgMDAqsBBAQDBAgEBAkFBAkNBBsFDQkEBAkEAQQiBAUBBAQDAwIBAgIDBAgJBQQSBAsEBwQEBwQIBB4ECAQHBAQHBAQJBAQEAwQBdwECAwMIBwQHBBoDCwsHBgQDBxQPAwcBCAUEBQgDAwICAgIHAQMVAQMLAQcQBAQMBAQEBAQECQQmBQUIBAQDBKECAgMDBAkJCQYBDAEGDAYFAwMCAQQBBAECBQQCAgEBAQQBAQEGAQEBAgEBAgMHBQQFBAgDAwkCAQYDEAMGAwIDAgMCAwIDBgIDAwMDAwcDTQECAQMGDAMDBQMCAQEBBAMDBAkFBAgDAwIBAQEBAgkCAgIBAgECAQEBAgICAQEBBAEBAQUEAwUEBQgIAwIBAs4BAQEBBwICBAMEBAQJBAUGAwIJAgEBAQEBAQIFAQIDAwgEBQQJAwMDBwEBAQFTAQICBAcJCQoBCQcGBwMEAwQDBAcIBxQEDQQEIAMDAgICAgMDCAkFBgUF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FRczFzMfARUfATMXFR8EMxczHwYzPwU1LxYhIw8XFR8GMz8IMz8ENTczNzM3NT8BNT8BMz8ENS8EAa59fYx9fXVefX1efX0vCwYLBQwFBQYmBgoIBAIDAQECBgQJBCsFCQUFBQUKBR4FCgUFBQUKBBgJBQQDBAQBAQQDBAcmBQYFCwYLBvQFBAUDBAQCAggCDAcIBwQDBAMEAwcGBw8CCQIDEQQDBAkJBAQDBAECAwIBAgMCAQISAQkEBgEDBAMBAwgEAwEDAQMBCAQEBAEECAEECv3xBQQIBQQBBAQEDAQEBAgDAQMEAwQDBAkBDwIBAgMDBQIBBAMDAQIDAwgECQUHBQUQBgIGAg8HBgcDBAMEAwQHCAQEBwIBAgIDBAgBBBINCgUHBgICAwgIBAEIBCYECAMEBAQHBAgDGgMIBwcDCQUEBAQDBAEEAwcBAwUEBAQEBAkEJgQJBQQEBQ2tBAgGBwEDCAMBFQMBAwMBCQEMAQkJAwMCAQIDAwgEAQQCAgIDAwgEBQQJAwgDAgQDAgMCAwIDAgMDAwIDAwMDAwMDAwYDIwIDBAQCAgUECAGEBQgEAwMDAQYDAwIDAgMCAwIDBxYBBAEEAQYDAgIEBAMEBQkEBAQDBAECAgIBAgECAQICAgEBAQgBAQECAgQBAgcDAgECAwIBAgYDCQMDAwT9wwUECAMDAgIBAgEBAQEBAQIBCAIBAQEDAwQEBAUJBAMDBAECBQMCAQEBAQEBAgEBAgMDCQLuBQQIBgIBAQEBAQIIAgECAgQBFgEBBAMMBQkEBgUEAwoCCAECAQICAgcBAQEBAQQDBAj8pwUICAQCAQEBAgYCAgIBBAEGAgoDBAEDBgQFCQQEBAMEAgESAQIBAgECAgIHAgEBAQECBwMFAvAEBQQEAwQCAgcCAwUCBAECAwwKAwQCBAEBBAMEBAkIBQcDDwIBBgUIAQEBBgECAQIBAgICCQECAgMECP2tBAgEAwICAgUGDAYBDAEGBwMBAwMBBwcDAQcHAQMBAwQIBAQMBAQEBAkEBAQFAgEBBAQDFQMECgcZAwoCAwMDAwMDAwIGAwIDAgMCCAGcBQQEAQcKHAsHEgQLBAcEBAcECAQQCAQDAgIBBAQDBAUMBQ0EBQQFCAUmBAkEBAQEBAQBBAMBAwEDBAQIBAkEAgIBAgYDBAX+RAQFBAYCAgECAwMFBAEEDQkBDQEEBQUEAQQFBQoFGQEEARQGBQUFCwoJBQQEAwQBAgMDBAcTBQQFBQQFBQQlHggEBAkMAw0CEgUEBQMBFAQECQgWLAUFBAUFBQQFGwQGBAEBAgMDBAQECQMGBQsFBQUGFAEeBQoFBQQBBAEEBRwNBAEEBQMCAQICAwQIAiF9jH19jH0XfV59fl0BlQEBAQEHAgIEAwQEBAkEBQYDAgkCAQEBAQEBAgUBAgMDCAQFBAkDAwMHAQEBAVMBAgIEBwkJCgEJBwYHAwQDBAMEBwgHFAQNBAQgAwMCAgICAwMICQUGBQUEAQQBBAUcDQQBCAQBBAQECAEDAQMBAwQIAwEDBAMBBgQHCAEEBAEDBAMBAwwDAQMBAwEIBAQEAQQEBAEEDRcFBQQBBAEJBQoFDAQFBAQDBAECBQcMHggECQQUBwgHBAMEAwQDBwYEAwcFBAQJBAQDBAECAgUMBQkEAwYCAQEBAQECAgcCAgMCAgIBAgMDCAUJCAMFAgECAQIBAgICCQIBAQEnAgMFAgQBAg8DAgECCQwJAQkEAwMBAwMBAwsHBwkJBAMEBAEBBAMMAwQGAwMCAwMDAwMDAgMDAgMCAwIDAgMEAxYDAwgJCQcDBDsBAgMDBA0FCwIDAwMDAwMCAwMKIwMHAwcEDgsDBwMIAwMCAQEDAgQICQQCBAkEBAQEBAUDAQMBAwQBAxAEAwEDCAMBCgEDAwEDAwEDAwEGBAkBAwIDA6kBBAQDBAgEBAkFBAkNBBsFDQkEBAkEAQQiBAUBBAQDAwIBAgIDBAgJBQQSBAsEBwQEBwQIBB4ECAQHBAQHBAQJBAQEAwQtAQQIBAQEBB4FCgUFBQUJBScFBAUJCgQyBAUECAQGAgIGCAoFGQEEARQGBQUFCwYmBQYFCwYLBhYGCQgDAwQQAgYICAkGEQUGBQYLBSEGCwUFCgYPAQQBGQUKAQQGAgEBAwIECAkIASkEBQUEBQUJBSIFCQUFBQUKBRcFBAcCAjkBAgMDCAcEBwQaAwsLBwYEAwcUDwMHAQgFBAUIAwMCAgICBwEDFQEDCwEHEAQEDAQEBAQEBAkEJgUFCAQEAwSgAQQDAwQJCQkGAQwBBgwGBQMDAgEEAQQBAgUEAgIBAQEEAQEBBgEBAQIBAQIDBwUEBQQIAwMJAgEGAxADBgMCAwIDAgMCAwYCAwMDAwMHSgECAQMGDAMDBQMCAQEBBAMDBAkFBAgDAwIBAQEBAgkCAgIBAgECAQEBAgICAQEBBAEBAQUEAwUEBQgIAwIBJwEBAwYECQUEBAQCBQMECQEGCQMCAQIDAgECAwQDCgIIAQIBAgIDAQIDAwgFBAkEAwMDBAIBAgECAQIBEBAGAgMFCQMKAQICAg8CAwUGDBQBAgECAQIBAgYCBgkEBQQEBAMDAgEBAQICAgECAQgMAwQDAgECAwIBAhIBCQQDBQQEBAUJBAMDBAAAAAAIAAD/mgO4AyIAFAApAC4AMgA2ADoAPgBCAAABIgcGBwYUFxYXFjI3Njc2NCcmJyYHMhcWFxYUBwYHBiInJicmNDc2NzYHFREhEQUzESMTFTM1BxUzNQcVMzUHFTM1AfR6amY8Pj48Zmr0amY8Pj48Zmp6bl5bNTc3NVte3F5bNTc3NVteKQEu/ur+/hrKysrKysrKAyI+PGZq9GpmPD4+PGZq9GpmPD4xNzVbXtxeWzU3NzVbXtxeWzU31Qz+kAF8GP60AScZGUoYGFUYGE0YGAAAAAoAAP+iA7gDIAAPACAAMgBtANYBXwG8AgMCTQK5AAABJgYHBh4CNz4BNzYmJyYHNh4BFxYGBw4BLgI2Nz4BFwYPAQ4BFhcWPgE7ATUjNjcmAysBByMHIwcVDwUVHwUzPwMzNzM3MzczFzMXMxczHwEzPwM1LwQjNSMnIycXDwYVHwozHwYVHwIzHw0zPwQ1LwE1JyMvBiMvATUjLwsjLwEjLwcjNSc1LwQjBQ8BIw8EFQ8EFQcjBxUPAyMVBxUHIxUPBBUHIw8BFQ8CFQ8CIw8DFQ8DFQcVDwoVBxUfBD8EMz8ENT8mNS8DAQ8FFRcVBxUHFQcVBxUHFQcVBxUHFQcVBxUHFQ8HFR8EPwUzPwEzPwE1PwEzNzM3NTc1MzU3NTc1NzU3NTc1NzU3NTc1JzUvBAUPBRUXFRcVFzMfBTMfARUXFRcVFxUzFxUXFR8EPwQ1Lw01JzUnNSc1LwMBDxcfBD8EMz8DMzczNzM3MzczNzU3Mzc1NzM/AjM3MzU/AzUvBAUPBRUfAxUfATMfAjMfAhUfATMfARUfATMXMxczFzMfAjMXMxcVMx8HMxcVFzMVMxczPwQ1LwQjJyMnIycjLwojLwQjLwUjAfRAbxcZGFZ+Oj1RAQREOSsyJkgzCQ8tMSFQSzgaCRYYUGMJFB0JCQQIBAkNBFlZEiYOOwcNBg0NBycNDgQDAwQBAgMDCQQFBgwGFwYLBgYGBikGBgYGBgUfBAUMAwMCAgYDCicGBwYNB+kFBAQDAwECAgIGAgIDBgUEAwgBDgIIAgYCBAECAgECAwIDBQQDBAMKBQYDCQQJBAQDBAIEBgEEAwIDAgMCAQIIAQUDBAIEAgIFAgcCAgECCQECAgMHAwIDAgECAwIGAgoF/fMFBwECAwIDAgMCAwIDBAECAgMCBAEEBAECAgICAgIBAgICBAICBAEBAQIDAgIKAQICAgEEAQIBAgECAQICAQQEAw4ECAQDAQECAwECAgIBAgECAQIBAgIDAgECCAIBAgICAQQCBAEGAgoCBgMKAwYDBQMCAQQGCAUCsgQFAwYCAQEBAQEBAQECAQMFAwUDBAMCBgMBAgMGBAkJBAQDAgEBAwIBAgMDAgEFAQwDAQIBAQEBAQEBAQQDBAQI/KYEBQMEBAEBAwIBAwIBBAEKAQQDAgMCAQIDAQIEBwkJBAQDBAIEAgMCBwQBBgECAQIIAQEBAQUICAKxBAQJBAUKBA8FBQsPBgULBSEGCxAIBAUCAgQDBA0JBgYUBQESBgcFAQUBBQEFARwBCwUBBQUBBQsPAQQBAwMCAQQDBAQI/d4EBAQDAgIBAgMEDQIBAgMCAQIDAwsCAQgDAwUBAgECAQIBAgMDAQIBAgECBAMGAw0DHQIDDQQDDQkFCAUCAQQDBAQDBAgDFAIRAwkFEQIGBQMFBQUCAQ8CBQICAQQDBBEEBAUCNAFLOzmAWR4VFW1APnEaFScBIj0lN24dFQcaOE1RISUsMhIjNgEPEQMDAQYZIkQIAUgBAgYBAgQCAwQICQUEBAMEAQICAgQCAQEBAQEFAQYEAwkFCAgCBAYBAQFPAQEDAwQEBAUJBAYBAgEGAwQCCA4DCAMGAwQBAgIDBAMEAwcHAwgDEgoIAgQCAgMDCAoHBwEMCAQEBAQEBAQLAQcDBgIGAgMFAwcDAgMJAwICBwICAgIBAQECAgQCBQwBBAICAgICAQICAgICAQQCAQICAwQBBAEEAQIDAgMCAQIDAgECBgIBAgYDAwIFAgECDwMCAQIBAgMGAwMDAwMDAwMBBAkFCAMDAwEEAwMEBgUDAgUBAgMCAwIDAgMDAgUCAwIMAgMCAwIDBAMEAwYDCgMGAgoBBgIFBAQECQkGBAH+xgECAggEBAQEMwMJAwYCBgMDAwMDAwYCAwMJAg4DCAENBQsFBgoHBAUJBAYCAgICAwMDAwYGBgUBBQcPJgMKAwMHAwMEAwMEAwMEAwcDDgMsBQkIBAIDAhMBAgMDCAQbBgcTBw0TBgcNBh8NBQEFAQUBBQEFAQUBAQQEBAICAgMDCQkIBgYFBhALBhEFBgYFLwYFBgYMBgcFBwYC/rIBAgYEBAYECQQDBQkCAwQDDAEEAwQDBwkJCAMDAwICAQYCBgMCAwIDAw8GAQMDAQMEBwwEAQMEBAQJCAQDAgICAQMCBAQJBAUEBAMBCgICAgICAgEBBwIFAQEBAwICAQIBAgEBAQEBAgICBAIJAQEEAQQBBAcFBAkIBAIDAQMHBgMDBgICAwEDAgMCCQIDAgEEAQQNAQIAAAAAAwAAAAADIAJYAAMABwALAAATFSE1BRUhNQUVITXIAlj9qAJY/agCWAJYZGTIZGTIZGQAAAUAAP/TA9QC6QAaAFQAdACIAJwAAAEiBgc5ARQXFhcGBwYPARUhNScmJzY1OQE0JgcyMxcWFxYfARYXFjMxMj8BFhUUBwYHFxYXFhUWFRQPAQ4BIiYvASY1NDc0NzY/AScuATU0NzI3MzYHMDEGFxYXHgEyNjc2NzYnMDEWFxUjNSMVIzUjFSM1NhMiDgEVERQeATMhMj4BNRE0LgEjBSEyHgEVERQOASMhIi4BNRE0PgEBSCUyAQoGCSIXHg8BAUwBGksXMUkCAgQPCQYGAgUDBgoMCgQGBQYSAgYKAgEBAQkeJB4JAQEBAgoFAgQKDggDAQIJIgIBAgYMJiomDAYCAQIyEjAUnBUvEw41WTU1WTUCOjVaNDRaNf3GAjolPiQkPiX9xiU+JCQ+AmMxIxIWDgsMDxQcAoWFAjEaFyojMS8BAQICBAEEAQIFAwwPFg0PCxIBBAYGBAkCAgEKCgoKAQICCQQGBgQBFAMIIg4REAEDggwGDAUNDQ0NBQwGDBYgbExMTExsIgFLNFk1/m41WTQ0WTUBkjVZNDwkPSX+biU9JCQ9JQGSJT0kAAAAAAUAAAAAA48CkwADAAcACwAPABMAABMRIREFMxUjNyEVIQczFSM3IRUhWQM2/O2fn8ICLv3Swp+fwgIu/dICk/2XAmnRra2tI6WlpQADAAAAAANSArwABAAIABQAABMVESERBSERIQEVIxUzFTM1MzUjNZYCvP1wAmT9nAEFm5tam5sCvBn9XQK8LP2cAfqbWpubWpsAAAAABAAA/5YDvQMiABcAMwA/AEsAAAEiDgMWFx4CNz4BNzY3NicuAScmIxcyFxYXFhcWBgcGBwYHBicmJyYnJicmNz4CFwcVIxUzFTM1MzUjNQczFTMVIxUjNSM1MwHwV6V/RAFAPTuhsFFUhicpAwYeHnZOXmsIVVBOOToWFxcrLERGWlhWWENDJyYDAyMecpRPRn19jH19dV59fV59fQMiRn2hs6Y+P0kJHh16UVNYV1VThyYvMScmQkRST6dISi80EA8WFjk1UU9XWk5JcD4B0H2MfX2MfRd9Xn1+XQAAAAAEAAD/lgO9AyMAFgAxADsARAAAASYOAxYXHgI3PgE3Njc2Jy4BJyYHNhcWFxYXFgYHBgcGBwYnJicmJyYnJjc+AhcGDwEnAzc2NxcDFhcWFzcHJwcB9FimgUQBQD07obBRVIYnKQMGHh52Tl5rVlJQOjsXFxcrLERGWlhWWENDJyYDAyMecpT8ESIzgHQXSCOGiQcOQyIeHXwyAyIBRn6hs6Y+P0kJHh16UVNYV1VThyYvMQEmJUNEVE+nSEovNBAPFhY5NlBPV1pOSXA+0yNFaab+qh5bLpoBBgkSVSpDdJFNAAAGAAD/lQO+AyQAGwAxAEkAYABkAGkAAAEmBwYHBgcGFhcWFx4BNz4CNzYnLgEnJicjJgc2FxYXFhcWBgcOASYnLgI3Njc+ARcmBwYHBgcGFxYXFhcWNjc+AicmJy4BBzYXFhcWBxYGBwYHBiYnJicmNjc2NzYXBgchAxYXITYB82xlYUFCCww3PD1TT7dWWIRPBgYeHHdPUFcDFRBjXVk6PAgJPT5AprRNUGQgFRc5OKJfW1VRMjUBBCQkQURSTZ4/QUUEHiA8MHxCUEpHKywBAUg+QEtHjDM2FBUUJyc9SlVgYAGAwGQz/tIzAyICNjVaXWxctklKKCgLHB13pFlbU1OGKCkFAjEDMTBTVmNYrEBDOxArLI+zVVlCRE4rAzAvT1JbU1BONjgQECUwMoyiSUwyKzAwAiwqRkpQS4ssLwcJMTM1RUKQOz0iK2OsrQEmtFpaAAAAAAYAAP+VA74DJAAbADEASQBgAGoAdQAAASYHBgcGBwYWFxYXHgE3PgI3NicuAScmJyMmBzYXFhcWFxYGBw4BJicuAjc2Nz4BFyYHBgcGBwYXFhcWFxY2Nz4CJyYnLgEHNhcWFxYHFgYHBgcGJicmJyY2NzY3NgUGDwEnAzc2NxcDFhcWFzcHJwcGBwHzbGVhQUILDDc8PVNPt1ZYhE8GBh4cd09QVwMVEGNdWTo8CAk9PkCmtE1QZCAVFzk4ol9bVVEyNQEEJCRBRFJNnj9BRQQeIDwwfEJQSkcrLAEBSD5AS0eMMzYUFRQnJz1KAQIRIjOAdBdII4aJBw5DIh4dfA4ZCwMiAjY1Wl1sXLZJSigoCxwdd6RZW1NThigpBQIxAzEwU1ZjWKxAQzsQKyyPs1VZQkROKwMwL09SW1NQTjY4EBAlMDKMoklMMiswMAIsKkZKUEuLLC8HCTEzNUVCkDs9Iit2I0Vppv6qHlsumgEGCRJVKkN0kRYkEwAAAwAA/5YDvwMiABsAMgA7AAABIgcGBwYHBhYXFhceATc2Nz4BNzYnLgEnJicmBzYXFhcWFxYGBwYHBiYnLgE2NzY3PgEXBg8BFzUXEQcB62xjYD9ACgs5PT5UTrRTV0BDUAgHHRt5UVNZDQ9PSEcrLAEDQDk8SEaQNzkyECYoQCNSGTZsL9HKygMiNzZbXWtct0dKJyYLHB07OaFYW1NViykqBAGOAikoRUdPSYkuMQwOKTAxh5c+QSMVFqImTSGUj48BKI8AAAAEAAD/8AOrAswAEwAnACsAOAAAEyIOARURFB4BMyEyPgE1ETQuASMFITIWFREUBisBESERIyImNRE0NhMhESE3HQEjFTMVMzUzNSM12CpHKipHKgI5KkcpKUcq/ccCOSw+Pix0/q5zLT09vwEU/uxzTU0uTU0CzClHKv5YKkcpKUcqAagqRykwPiz+WCw+ATT+zD4sAagsPv6Z/uztFzYuTU0uTQAAAAAEAAD/8AOrAswAEwAnACsALwAAEyIOARURFB4BMyEyPgE1ETQuASMFITIWFREUBisBESERIyImNRE0NhMhESE3FTM11ypHKSlHKgI6KkcpKUcq/cYCOiw+Pix0/q50LD09vwEU/uwlywLMKUcq/lgqRykpRyoBqCpHKTA+LP5YLD4BNP7MPiwBqCw+/pn+66cvLwAAAgAA//ADqwLMABMAIwAAEyIOARURFB4BMyEyPgE1ETQuASMFITIWFREUBiMhIiY1ETQ21ypHKSlHKgI6KkcpKUcq/cYCOiw+Piz9xiw9PQLMKUcq/lgqRykpRyoBqCpHKTA+LP5YLD4+LAGoLD4AAAMAAP+WA78DIgAbADIAPAAAASIHBgcGBwYWFxYXHgE3Njc+ATc2Jy4BJyYnJgc2FxYXFhcWBgcGBwYmJy4BNjc2Nz4BFwYPAScDNzY3FwHrbGNgP0AKCzk9PlROtFNXQENQCAcdG3lRU1kND09IRyssAQNAOTxIRpA3OTIQJihAI1LWESIzgHQXSCOGAyI3Nltda1y3R0onJgscHTs5oVhbU1WLKSoEAY4CKShFR09JiS4xDA4pMDGHlz5BIxUWdSNFaab+qh5bLpoAAAYAAP+VA74DJAAbADEASQBgAGsAeQAAASYHBgcGBwYWFxYXHgE3PgI3NicuAScmJyMmBzYXFhcWFxYGBw4BJicuAjc2Nz4BFyYHBgcGBwYXFhcWFxY2Nz4CJyYnLgEHNhcWFxYHFgYHBgcGJicmJyY2NzY3NhcGAgc2NzY3FyYvARYfAScGBwYHBjc2NzYB82xlYUFCCww3PD1TT7dWWIRPBgYeHHdPUFcDFRBjXVk6PAgJPT5AprRNUGQgFRc5OKJfW1VRMjUBBCQkQURSTZ4/QUUEHiA8MHxCUEpHKywBAUg+QEtHjDM2FBUUJyc9SlUYTRcXKicUfRkxMgwWIkQIGRIGCgELFBYDIgI2NVpdbFy2SUooKAscHXekWVtTU4YoKQUCMQMxMFNWY1isQEM7ECssj7NVWUJETisDMC9PUltTUE42OBAQJTAyjKJJTDIrMDACLCpGSlBLiywvBwkxMzVFQpA7PSIrb0L+80EXMCsVh06eUSRJbkoHHRQHCwYhQ0wAAAAABwAA/5IDwQMjABwANwBRAGoAewCNAJ8AAAEiIyIHBgcGBwYWFxYXHgE3Njc+ATc2LgEnJicmBzIzNhcWFxYXFgYHBgcOAScmJyYnJjc2Nz4BFyIjIgcGBwYHBhYXFhcWNjc2Nz4BJyYnLgEHMjMyFxYXFhcWBgcGBwYuAScuATc2Nz4BFyIGBwYeAjc+ATc2JicmIxcyHgEXFgYHDgEuAjY3PgEfAQYPAQ4BFhcWPgE7ATUjNjcmAfMBAmNeW0BCFhUeLi9ISLJZXEtKaBUWG15ISVY4OwUFXFZUOToPECo0NUpMtFNVOz0dHAkKLjW4bgUFVE9LMjQJCzY4OkxInUVGLTAeFBU2M45PAwNLRUMrLAYINzU4RUSPdiAiAh8hOihjLz9sFxkYVn46PVEBBEQ5KzIEJUYyCQ8tMSFQSzgaCRYYUCw3CRQdCQkECAQJDQRZWRImDgMiLi1OUGFWs01OMzUqDg8wLpFWV62bNjcUDjEBLStMTVtSqERGJyoKICFAP1dUWVtKV2krKypISVRPnTs8GxsNJSY/QKNPUjs6QzAnJkBBS0eLMjQSFBtVPkCWQkUrHyJhSjs5gFkeFRVtQD5xGhUnIzwkN24dFQcaOE1RISUsATESIzYBDxEDAwEGGSJECAAEAAD/lgO9AyMAFgAxADwASgAAASYOAxYXHgI3PgE3Njc2Jy4BJyYHNhcWFxYXFgYHBgcGBwYnJicmJyYnJjc+AhcGAgc2NzY3FyYvARYfAScGBwYHBjc2NzYB9FimgUQBQD07obBRVIYnKQMGHh52Tl5rVlJQOjsXFxcrLERGWlhWWENDJyYDAyMecpRPGE0XFyonFH0ZMTIMFiJECBkSBgoBCxQWAyIBRn6hs6Y+P0kJHh16UVNYV1VThyYvMQEmJUNEVE+nSEovNBAPFhY5NlBPV1pOSXA+zEL+80EXMCsVh06eUSRJbkoHHRQHCwYhQ0wABAAA/5YDvQMjABYAMQA1ADoAAAEmDgMWFx4CNz4BNzY3NicuAScmBzYXFhcWFxYGBwYHBgcGJyYnJicmJyY3PgIXBgchAxYXITYB9FimgUQBQD07obBRVIYnKQMGHh52Tl5rVlJQOjsXFxcrLERGWlhWWENDJyYDAyMecpRPYGABgMBkM/7SMwMiAUZ+obOmPj9JCR4delFTWFdVU4cmLzEBJiVDRFRPp0hKLzQQDxYWOTZQT1daTklwPsCsrQEmtFpaAAcAAP/TA9QC6QATACcAKwAzADcAOwA/AAATIg4BFREUHgEzITI+ATURNC4BIwUhMh4BFREUDgEjISIuATURND4BFxEhEQUhFSE1IxUjFTMVIzchFSEDFSE11zVZNTVZNQI6NVo0NFo1/cYCOiU+JCQ+Jf3GJT4kJD4BAfr+GwHP/qkWYmJieAFX/ql2Ac0C6TRZNf5uNVk0NFk1AZI1WTQ8JD0l/m4lPSQkPSUBkiU9JEj+hAF8g2hnZxVmZmYBTmxsAAACAAAAAAN9ApMASgCzAAABIgc5AQYHOQEGBzkBBgcGHQEUFzAxFhcWMxY3OQEyNjU0JzMyNzY3MTYnPgE0Jy4BKwE2NTkBNCcuASMFNzY/ATY3PgEnLgEvATEHMDIVMhc5ARYGBzkBBg8BDgEVFBcxHgEXFjsBFjczMhYXFhQHBisBFSEyFhcWFTEUBiMhFSEyFhcWBzkBDgEjIRUzMhYXFhU5ARQHDgEjBic5ASInJic1Jj0BNDc2NzY3MTY3MTYzNDMBzA0SPbgvEwgCAQgQLShB3NsaHQUQGg4NBgYMGxsOCBgOFQYPCBgO/sMFBgQOEwYPBA0GEgoFAQEFBQUCBwgdDBYKAgIFBwMCDEuWcQYIBAgHBA/yAT4GCAQHCg/+wgEPBwkECAMDCwv+8c0FBgMGBgIGBtvbOR4hDQcBAgYRJMMxBwQBApMKKIAgPxggEyQNMSJBHhoBASMcDxEOCxgeFwMhOxQKDQ4RHRMLDAEFBwMOFQcTLhIKDAIBIwEIBxoJCh0MFQ0GAwYFBgEBAQEEBQwfCQYjBAUKEhMMIwYGDRUMCSMDBAgRDwgDAgEBFBY0AR4sCiQSHRUzGYcgBAEAAAMAAAAAA4oCagADAAYACwAAExEhEQUhBSUFJREhXwMr/SgChP6+/o4BcgFz/RsCav3pAhcj1Mr09P45AAIAAP/TA9QC6QATACMAABMiDgEVERQeATMhMj4BNRE0LgEjBSEyFhURFAYjISImNRE0Nuc5YTk5YTkCGjlhOTlhOf3mAhorOjor/eYrOjoC6ThfOf6KOV84OF85AXY5XzhuOSn+iik5OSkBdik5AAAFAAD/mgO4AyIAFAApADoATABeAAABIgcGBwYUFxYXFjI3Njc2NCcmJyYHMhcWFxYUBwYHBiInJicmNDc2NzYXIgYHBh4CNz4BNzYmJyYjFzIeARcWBgcOAS4CNjc+AR8BBg8BDgEWFxY+ATsBNSM2NyYB9HpqZjw+PjxmavRqZjw+PjxmanpuXls1Nzc1W17cXls1Nzc1W15qP2wXGRhWfjo9UQEERDkrMgQlRjIJDy0xIVBLOBoJFhhQLDcJFB0JCQQIBAkNBFlZEiYOAyI+PGZq9GpmPD4+PGZq9GpmPD4xNzVbXtxeWzU3NzVbXtxeWzU3vUo7OYBZHhUVbUA+cRoVJyM8JDduHRUHGjhNUSElLAExEiM2AQ8RAwMBBhkiRAgABQAA/5YDvQMjABYAMQA2AEAARgAAASYOAxYXHgI3PgE3Njc2Jy4BJyYHNhcWFxYXFgYHBgcGBwYnJicmJyYnJjc+AgcUFSERBTIzBgcGBwYHJjcUFSE1FwH0WKaBRAFAPTuhsFFUhicpAwYeHnZOXmtWUlA6OxcXFyssREZaWFZYQ0MnJgMDIx5ylH4Bmv7BcnIPIBgNFRBA4/7InAMiAUZ+obOmPj9JCR4delFTWFdVU4cmLzEBJiVDRFRPp0hKLzQQDxYWOTZQT1daTklwPvicnAE4MQkcFgkPAjQFXV26fQAABAAA/5UDvgMjABsAMwBKAGEAAAEmBwYHBgcGFhcWFx4BNz4CNzYnLgEnJicjJgc2FxYXFhcWBgcGBwYmJyYnLgE3Njc+ARciBwYHBhUGFhcWFxY2Nz4CJyYnLgEHMhcWFxYHFAYHBgcGJicmJyY2NzY3NgHwbGRhP0ILDDc8PVNPt1ZYhE8GBh4cdU5PVgMbBWNbWDg6BghBQEJUUbFMTjAzIBYWOjqnTVtSUDEyAkxCRVJMmz5ARAQfIDwygDVRSUcpKgNJPUBKR4wzNhQVFCcoPU0DIgE2NVpda1y2SUooKAscHXekWVtTUoYoKQYCMQEzMlRXY1irQEEbHBMqLEdHs1ZZQkZOLjIwUFNbU5s1Nw4PJzAxjKJJTDIsLzEtK0hKUUqHLC0HCTEzNUVCkDs+IS0AAAAABgAA/5UDvgMkABsAMQBJAGAAaABxAAABJgcGBwYHBhYXFhceATc+Ajc2Jy4BJyYnIyYHNhcWFxYXFgYHDgEmJy4CNzY3PgEXJgcGBwYHBhcWFxYXFjY3PgInJicuAQc2FxYXFgcWBgcGBwYmJyYnJjY3Njc2FxQVIxUzFTcnFh8BBzUjNTMB82xlYUFCCww3PD1TT7dWWIRPBgYeHHdPUFcDFRBjXVk6PAgJPT5AprRNUGQgFRc5OKJfW1VRMjUBBCQkQURSTZ4/QUUEHiA8MHxCUEpHKywBAUg+QEtHjDM2FBUUJyc9Sofi4qWJESIzZt/fAyICNjVaXWxctklKKCgLHB13pFlbU1OGKCkFAjEDMTBTVmNYrEBDOxArLI+zVVlCRE4rAzAvT1JbU1BONjgQECUwMoyiSUwyKzAwAiwqRkpQS4ssLwcJMTM1RUKQOz0iK3QyMr5kw3oUKD15NoUAAAADAAD/lgO/AyIAGwAyAD0AAAEiBwYHBgcGFhcWFx4BNzY3PgE3NicuAScmJyYHNhcWFxYXFgYHBgcGJicuATY3Njc+ARcGAgc2NzY3FyYnAetsY2A/QAoLOT0+VE60U1dAQ1AIBx0beVFTWQ0PT0hHKywBA0A5PEhGkDc5MhAmKEAjUikYTRcXKicUfRkxAyI3Nltda1y3R0onJgscHTs5oVhbU1WLKSoEAY4CKShFR09JiS4xDA4pMDGHlz5BIxUWbkL+80EXMCsVh06eAAAABQAA/6wDtgMbAAgADAAQABQAGAAAARURITUjETM1AQcXNw8BFzcPARc3DwEXNwKlARHg4P6eSzxL00s8S9JMPEvSTDxMAxsZ/LExAwUy/n48SzwsPEs7LDtMPCw8SzsABAAA/2oCogNSAAMAFAAeACkAACUhFSEBETMyNj0BNCc+AT0BNCcmIwczMhYdARQGKwEHMzIXFh0BFAYrAQKi/qQBXP6ksFVWUSMgJihUOTkfGiAiMAU1JRASHB1DKb8D6P02VFI6eyISRjccUCgqZCQoJikjbhIUMD4mIQAAAAAEAAD/mgO4AyIAEAAUAGoAbwAAASIHAQYUFwEWMjcBNjQnASYHCQIlMQ8DFS8CDwQfAiMPAxUfAzMPAh8EPwIVHwMzPwM1HwI/BC8CMz8CNS8CIz8CLwQPAjUvAgcwOQEwAfQPC/5hCgoBnwsfCgGfCwv+YQsPAYb+ev56AX0EBAIBYwMEBAQNAgEBAmOMBAMCAQECAwSMYwIBAQINBAQEA2MBAgQEEgQEAgFjAwQEBA0CAQECY4wEAwMDAwSMYwIBAQINBAQEA2MBAgSLAyIL/mEKHwv+YQoKAZ8LHwoBnws+/nr+egGGxgECAwSMYwIBAQINBAQEA2MBAgQEEgQEAgFjAwQEBA0CAQECY4wEAwIBAQIDBIxjAgEBAg0EBAQEYgECBBoEAgFjAwQEBA0CAQECY4wEAwMwAAAABAAA/5oDuAMiABAAFAAaAB8AAAEiBwEGFBcBFjI3ATY0JwEmBwkCJQ8BFyE3JxcHIycB9A8L/mEKCgGfCx8KAZ8LC/5hCw8Bhv56/noBhgfQUgEKUte7SOZIAyIL/mEKHwv+YQoKAZ8LHwoBnws+/nr+egGG4AWX/f1+h9zcAAACAAD/mgO4AyIADwATAAATBhQXARYyNwE2NCcBJiIHCQM7CgoBnwsfCgGfCwv+YQofC/6UAYYBhv56AXgKHwv+YQoKAZ8LHwoBnwsL/kcBhv56/noAAAAABAAA/5oDuAMiABAAFAAhAC4AAAEiBwEGFBcBFjI3ATY0JwEmBwkCJSIOARQeATI+ATQuAQcyHgEUDgEiLgE0PgEB9A8L/mEKCgGfCx8KAZ8LC/5hCw8Bhv56/noBhjlhODhhcmE4OGE5M1YyMlZmVjIyVgMiC/5hCh8L/mEKCgGfCx8KAZ8LPv56/noBhtI4YXJhODhhcmE4FzJWZlYyMlZmVjIAAAAAAwAA/5YDvwMiABsAMgBKAAABIgcGBwYHBhYXFhceATc2Nz4BNzYnLgEnJicmBzYXFhcWFxYGBwYHBiYnLgE2NzY3PgEXJgcOAQcGFxYXHgE3Njc2Nz4BJyYnLgEB62xjYD9ACgs5PT5UTrRTV0BDUAgHHRt5UVNZDQ9PSEcrLAEDQDk8SEaQNzkyECYoQCNSKTYyL0IJCxIOKCVpNTgsLhoZBBYWLB5LAyI3Nltda1y3R0onJgscHTs5oVhbU1WLKSoEAY4CKShFR09JiS4xDA4pMDGHlz5BIxUWUQIaGVk0ODM0KCUlBgcgHTIvbzA0IBgaAAMAAP+WA78DIgAbADIANgAAASIHBgcGBwYWFxYXHgE3Njc+ATc2Jy4BJyYnJgc2FxYXFhcWBgcGBwYmJy4BNjc2Nz4BFwYHIQHrbGNgP0AKCzk9PlROtFNXQENQCAcdG3lRU1kND09IRyssAQNAOTxIRpA3OTIQJihAI1IpYGABgAMiNzZbXWtct0dKJyYLHB07OaFYW1NViykqBAGOAikoRUdPSYkuMQwOKTAxh5c+QSMVFmKsrQACAAD/kgPBAyMAGgAxAAABIgcGBwYHBh4BFx4BNzY3PgE3NicuAScmJyYHMhcWFxYXFgYHDgEmJyYnLgE3Njc+AQHwZF5bQUIVFCBgSUevWFpJSmkWFw4NYkpMWTQnSkRBKy0HCTAzNIaQPD4iJgcfIDwqZgMiLy1QUWJWs5syMygODy8tkVVYVlqeNjgSC44lJD4/SUaLMzUrFCcoPUCaRUgsICEAAAADAAD/lgO/AyIAGgAvADkAAAEiBwYHBgcGFhcWFx4BNzY3PgE3NicuAScmJwc2FxYXFhcWBgcOASYnLgE2NzY3NhcGDwEXITY/ASYB62xjYD9ACgs5PD5UT7RTV0BDUAgHHRt5UVNZHE9IRyssAQNAOjuOkDc5Mg8nKEBIViRHbFIBChcrEEcDIjg2Wl5rXLZHSicmCxwcOzqhWFtTVYspKgSNAikoRUdPSYkvMBopMDGHlj9BIytWGjRO/USIMTQAAAAABAAA/5YDvwMiABsAMgA3AD0AAAEiBwYHBgcGFhcWFx4BNzY3PgE3NicuAScmJyYHNhcWFxYXFgYHBgcGJicuATY3Njc+AQcWFzY3BRQVIREHAetsY2A/QAoLOT0+VE60U1dAQ1AIBx0beVFTWQ0PT0hHKywBA0A5PEhGkDc5MhAmKEAjUn5WVThy/oUBmskDIjc2W11rXLdHSicmCxwdOzmhWFtTVYspKgQBjgIpKEVHT0mJLjEMDikwMYeXPkEjFRaaRUUuXCCMjAESowAAAAMAAP+WA78DIgAbADIAOgAAASIHBgcGBwYWFxYXHgE3Njc+ATc2Jy4BJyYnJgc2FxYXFhcWBgcGBwYmJy4BNjc2Nz4BFxQVIxUzFTcB62xjYD9ACgs5PT5UTrRTV0BDUAgHHRt5UVNZDQ9PSEcrLAEDQDk8SEaQNzkyECYoQCNSW+LipQMiNzZbXWtct0dKJyYLHB07OaFYW1NViykqBAGOAikoRUdPSYkuMQwOKTAxh5c+QSMVFnMyMr5kwwAAAAcAAP+VA74DJAAbADEASQBgAGUAbwB1AAABJgcGBwYHBhYXFhceATc+Ajc2Jy4BJyYnIyYHNhcWFxYXFgYHDgEmJy4CNzY3PgEXJgcGBwYHBhcWFxYXFjY3PgInJicuAQc2FxYXFgcWBgcGBwYmJyYnJjY3Njc2BxQVIREFMjMGBwYHBgcmNxQVITUXAfNsZWFBQgsMNzw9U0+3VliETwYGHhx3T1BXAxUQY11ZOjwICT0+QKa0TVBkIBUXOTiiX1tVUTI1AQQkJEFEUk2eP0FFBB4gPDB8QlBKRyssAQFIPkBLR4wzNhQVFCcnPUp4AZr+wXJyDyAYDRUQQOP+yJwDIgI2NVpdbFy2SUooKAscHXekWVtTU4YoKQUCMQMxMFNWY1isQEM7ECssj7NVWUJETisDMC9PUltTUE42OBAQJTAyjKJJTDIrMDACLCpGSlBLiywvBwkxMzVFQpA7PSIrm5ycATgxCRwWCQ8CNAVdXbp9AAUAAP+VA74DJAAbADEASQBgAGkAAAEmBwYHBgcGFhcWFx4BNz4CNzYnLgEnJicjJgc2FxYXFhcWBgcOASYnLgI3Njc+ARcmBwYHBgcGFxYXFhcWNjc+AicmJy4BBzYXFhcWBxYGBwYHBiYnJicmNjc2NzYXBg8BFzUXEQcB82xlYUFCCww3PD1TT7dWWIRPBgYeHHdPUFcDFRBjXVk6PAgJPT5AprRNUGQgFRc5OKJfW1VRMjUBBCQkQURSTZ4/QUUEHiA8MHxCUEpHKywBAUg+QEtHjDM2FBUUJyc9SkU2bC/RysoDIgI2NVpdbFy2SUooKAscHXekWVtTU4YoKQUCMQMxMFNWY1isQEM7ECssj7NVWUJETisDMC9PUltTUE42OBAQJTAyjKJJTDIrMDACLCpGSlBLiywvBwkxMzVFQpA7PSIroyZNIZSPjwEojwAAAAAEAAD/lgO9AyMAFgAxADsAQgAAASYOAxYXHgI3PgE3Njc2Jy4BJyYHNhcWFxYXFgYHBgcGBwYnJicmJyYnJjc+AhcGDwEXITY/ASYnFhcHIyc2AfRYpoFEAUA9O6GwUVSGJykDBh4edk5ea1ZSUDo7FxcXKyxERlpYVlhDQycmAwMjHnKUTyRHbFIBChcrEEeQfD9I5kg/AyIBRn6hs6Y+P0kJHh16UVNYV1VThyYvMQEmJUNEVE+nSEovNBAPFhY5NlBPV1pOSXA+tBo0Tv1EiDE0Slot3NwtAAAABgAAAAADRQKVACgATgBSAFYAWgBeAAABDwEGBwYHFBcWFzEWFxYXFgcGDwEhNzM+AScmJyYvASYnJjU0NzY/AQUhBgcGFQYXFhcxFhcWFxYHBgcGByE2NzYnJicmLwEmJyY3NDc2FxUzNQcVMzUHFTM1BxUzNQF8BAJUKSYCGxAoJBAXAwIWG0hKAcoFAU1FBQQXDyMNIhAUHSRNSf5EARonFScBGxAoJBAXAwEEBA0ZRf7lHxAjBQQYDyQMIg8VARwhCtzl5X3dvuUClQIBMjAuLigoGCklFR4VGhwjKysDLVctISIUJA4iFx4ZHSEqLisuHRouLigoGCklFR4VDQwODyEpFxYsLCIiFCUMIxYeGR0hJyIVFXMWFnQVFXMWFgAAAAQAAP/TA9QC6QATACcAawDGAAATIg4BFREUHgEzITI+ATURNC4BIwUhMh4BFREUDgEjISIuATURND4BFyIHOQEGDwEGBzkBBgcGHQExFBcwMR4BMxY3OQEyNjU0JzMyNjcwMTYnPgE3NjQmKwE2NTkBNCcuASsBNzY3PgEnJicHMDEyFzkBFgYHOQEGDwEGFzEWHwEzFjczMhcWFAcGIyInFRYzMhYVMRQHDgErARUzMhYHOQEOASsBFTMxMhYVOQEUBwYHITEmJyYnOQEmNTE0NzY/ATY/ATYz1zVZNTVZNQI6NVo0NFo1/cYCOiU+JCQ+Jf3GJT4kJD6qCggXaRkdDQUBAQULNCmJiRERAwoQEQQDBwgOBAgTEw4FCgQQCMYJFAUJAgcKDAMEAwMCBAIVGQQDAgcCAjFkRAkCBQUDCGYzQ4UHCQQDBAXIqwcLAwEHB6uCBgYDAwb+7iITFgcFBgsWQUgPAgQBAuk0WTX+bjVZNDRZNQGSNVk0PCQ9Jf5uJT0kJD0lAZIlPSQoBg9IERUnDxQMFwccGCsqAgIWEAoJEQ8UDgEJBgwlHAwMEgsGBwkUBgwdCw4BFgUFDwYDFRkGBwcBAQEBBQUXBQYBFgENCwsIAwMWEA4HBxYHDAcGAwECEBMgFRoyFSAQLDIKAQEAAgAAAAADhgJgAAIABwAAEwUlBREhEQVjAZEBkfzfAyL+bgJg4+NU/kABwOAAAAAABQAAAAADLAJ3ACYATgCGAI8AmAAAARQVBgcnBxcGByMVMxYXNQc1Mzc2PwEnNxc3Nj8BNTMVMyYnJic1BxUGBycHFwYHIxU3FhcHFzcWFxUzNTY3FzcnNjczNSMmJzcnByYnNwczBxcWHwE3FwcXFh8BMxUPAQYPARcHJwcGDwEVIzUnJi8BByc3JyYvAQc1Mzc2PwEnNxc3Nj8BFyIGFBYyNjQmBzIWFAYiJjQ2AZ0WFihKKAwGODgIFDExAwYRCCIZIgwaIA4kXgYWEQ4GGxEoSicLBjk5BwsoSykTGWkZEylKKQwGODgICydLJxYWAUckAQ8eHAsiGSEIEgYDMTEDBhEIJBojDBsfDiMPHxsLJBokCBIGAzIyAwYRCCMZIwwYIg4SIC8vQC8vIBMZGSUaGgJ3HBwGDCdKKBMYahkeWwEkDh8aDCMZIggQCAMwMAcJCAQ3ZTcICyhLKBQXagEVFyhKKAwGOToGDChLKBYWaRkSJ0onDAY3IzADBhEIIhkiDBseDiMBDh8aDCMaJAgSBgMzMgMGEggkGSMMGx8OASQOHhwMIhkiCBAIA1AvQS4uQS8jGiUZGSUaAAAAAAUAAP/TA9QC6QATACcAKwAuADMAABMiDgEVERQeATMhMj4BNRE0LgEjBSEyHgEVERQOASMhIi4BNRE0PgEHESERBSEHJxc3ESHXNVk1NVk1Ajo1WjQ0WjX9xgI6JT4kJD4l/cYlPiQkPgECDv4oAaLR8PDx/h8C6TRZNf5uNVk0NFk1AZI1WTQ8JD0l/m4lPSQkPSUBkiU9JFP+pQFbF4mDnp7+2QAAAAMAAAAAAxECnQAgAFgAeQAAASIHDgEVOQEUFxYXBgcGDwEVITUnJicmJzY1OQE0JicmBzIXFhcWHwEWFxYXMTY/ATY3FhUUBwYHHwIWFQYPAQ4BIiYvASYnND8DJicuAScmNTQ/ATYHMBUGFxYXFhcWMjc2NzY3Nic1FhcVIzUjFSE1IxUjNTYB8CskIicQCxA7KDUaAgJCAhk0KDooJyIkaAkFGhAMCQQIBgoQGQ4CBAIKCQweBBwEAQEBARA3OjcQAQEBAQQbAwQDBxAGDQ8GDDQDAgILFiIgSCAiFgsCAwRWIFMj/vAjUyACnBUTRCYiJRoRFBojMQTn5wQwIxoUKUomRBMVUwEBBQQGAgYCAwEBCAICARQaJxYbEiAJFAgPBAQCEBISEAIEBA8IFAkiBAIFFw0fGh8ZAgXhAQwSFAsWDAsLDBYKFQ0RASY5u4SEhIS7OQAAAgAA/5YDvQMiABcAMwAAASIOAxYXHgI3PgE3Njc2Jy4BJyYjFzIXFhcWFxYGBwYHBgcGJyYnJicmJyY3PgIXAfBXpX9EAUA9O6GwUVSGJykDBh4edk5eawhVUE45OhYXFyssREZaWFZYQ0MnJgMDIx5ylE8DIkZ9obOmPj9JCR4delFTWFdVU4cmLzEnJkJEUk+nSEovNBAPFhY5NlBPV1pOSXA+AQAABQAA/5UDvgMkABsAMQBJAGAAawAAASYHBgcGBwYWFxYXHgE3PgI3NicuAScmJyMmBzYXFhcWFxYGBw4BJicuAjc2Nz4BFyYHBgcGBwYXFhcWFxY2Nz4CJyYnLgEHNhcWFxYHFgYHBgcGJicmJyY2NzY3NhcGAgc2NzY3FyYnAfNsZWFBQgsMNzw9U0+3VliETwYGHhx3T1BXAxUQY11ZOjwICT0+QKa0TVBkIBUXOTiiX1tVUTI1AQQkJEFEUk2eP0FFBB4gPDB8QlBKRyssAQFIPkBLR4wzNhQVFCcnPUpVGE0XFyonFH0ZMQMiAjY1Wl1sXLZJSigoCxwdd6RZW1NThigpBQIxAzEwU1ZjWKxAQzsQKyyPs1VZQkROKwMwL09SW1NQTjY4EBAlMDKMoklMMiswMAIsKkZKUEuLLC8HCTEzNUVCkDs9IitvQv7zQRcwKxWHTp4AAAAABgAA/5UDvgMkABsAMQBJAGAAagBxAAABJgcGBwYHBhYXFhceATc+Ajc2Jy4BJyYnIyYHNhcWFxYXFgYHDgEmJy4CNzY3PgEXJgcGBwYHBhcWFxYXFjY3PgInJicuAQc2FxYXFgcWBgcGBwYmJyYnJjY3Njc2FwYPARchNj8BJicWFwcjJzYB82xlYUFCCww3PD1TT7dWWIRPBgYeHHdPUFcDFRBjXVk6PAgJPT5AprRNUGQgFRc5OKJfW1VRMjUBBCQkQURSTZ4/QUUEHiA8MHxCUEpHKywBAUg+QEtHjDM2FBUUJyc9SlUkR2xSAQoXKxBHkHw/SOZIPwMiAjY1Wl1sXLZJSigoCxwdd6RZW1NThigpBQIxAzEwU1ZjWKxAQzsQKyyPs1VZQkROKwMwL09SW1NQTjY4EBAlMDKMoklMMiswMAIsKkZKUEuLLC8HCTEzNUVCkDs9IitXGjRO/USIMTRKWi3c3C0AABAAAP+gA7sDIgAKABgAJgA1AEcAWABpAHcAhACTAKEArgC8AM4A3ADvAAABBgIHNjc2NxcmLwEWHwEnBgcGBwY3Njc2EwYHDgEWNzYXFjYmJyYXJgYWFxYXFj4BJy4BJyYFBgcGBwYHBgcGFjI3Njc2LgEzIgciBw4BHgE3NhcWNjQnJgcGBwYPAQYHBh4BNzY3NjQmBSYGFhcWFxYyNicmJyYFJgcGFx4BNicmNzYmBSYGFxYHBh4BNz4BJy4BBSYGFxYXFj4BJyY3LgEFJgcGBwYeATc2Ny4BBSIGFhcWFxY2JicmJyYFDgEHBgcGDwEOARY3Njc+ASYFIgYWFxYXFjYmJyYnJgUGBwYHBgcGBw4BFjc+ATc2LgEB9BhNFxcqJxR9GTEyDBYiRAgZEgYKAQsUFgxKLwwBEwxeZgwOBQwxygwPAwtMLQcZDwQYSS4E/fULCgYLCAVBIQQRGAcpUQYBDf8EChIHDQkJFAlORwwSC0LqDQ4JEAo9GQURGQYpUAgOAX8MDgIKNBkHGRAEGkQE/cMZBQsbBhgSAhoQAQ4C6Q8NAwEwBBAYBx0bBAIO/KQPDgMCMQcZDwUvAgENAuwaAg0yBg8ZCD0MAQ39qAsMAgg/VAwRAQtPNwYBnwwrCxMZDx4RDAUPDGFQCAEN/j0LDQMKWWkMDgUMZE8GAhgJCQUKDgg0WQsCEQ02ZSkHAg0CJkL+80EXMCsVh06eUSRJbkoHHRQHCwYhQ0wBdAIQBhkRBBkWARMZBAxTARMYBThbCgETDDJYIAIKAQcFCwgEPlAMEgtdQAcTDgECBBURCAMGHwQRGQYfJwIIBQwHMDAMEwELQC4HEw87ARIXBjVUCxMMXUEDqQIrVk0LAxEMUFQKDi0BGg5lXgwSAQo2eT4IChABGg5rWgoCEwxbZggLOAIpP0MMFAMLT1sJDqARFgZJHQMSGAYeQgZNAxUDBwQDAwIEGBQBAjAHFQ8nExYFSBMBFBgEFUIDAwEFAwkLAyMWBhkSAwsxIwcTDgAAAAAFAAD/lQO+AyQAGwAxAEkAYABoAAABJgcGBwYHBhYXFhceATc+Ajc2Jy4BJyYnIyYHNhcWFxYXFgYHDgEmJy4CNzY3PgEXJgcGBwYHBhcWFxYXFjY3PgInJicuAQc2FxYXFgcWBgcGBwYmJyYnJjY3Njc2FxQVIxUzFTcB82xlYUFCCww3PD1TT7dWWIRPBgYeHHdPUFcDFRBjXVk6PAgJPT5AprRNUGQgFRc5OKJfW1VRMjUBBCQkQURSTZ4/QUUEHiA8MHxCUEpHKywBAUg+QEtHjDM2FBUUJyc9Sofi4qUDIgI2NVpdbFy2SUooKAscHXekWVtTU4YoKQUCMQMxMFNWY1isQEM7ECssj7NVWUJETisDMC9PUltTUE42OBAQJTAyjKJJTDIrMDACLCpGSlBLiywvBwkxMzVFQpA7PSIrdDIyvmTDAAAAAA0AAP+iA7gDIAAEAAgADAAQABQAGABTALwBRQGiAekCMwKfAAABFREhEQUzESMTFTM1BxUzNQcVMzUHFTM1AysBByMHIwcVDwUVHwUzPwMzNzM3MzczFzMXMxczHwEzPwM1LwQjNSMnIycXDwYVHwozHwYVHwIzHw0zPwQ1LwE1JyMvBiMvATUjLwsjLwEjLwcjNSc1LwQjBQ8BIw8EFQ8EFQcjBxUPAyMVBxUHIxUPBBUHIw8BFQ8CFQ8CIw8DFQ8DFQcVDwoVBxUfBD8EMz8ENT8mNS8DAQ8FFRcVBxUHFQcVBxUHFQcVBxUHFQcVBxUHFQ8HFR8EPwUzPwEzPwE1PwEzNzM3NTc1MzU3NTc1NzU3NTc1NzU3NTc1JzUvBAUPBRUXFRcVFzMfBTMfARUXFRcVFxUzFxUXFR8EPwQ1Lw01JzUnNSc1LwMBDxcfBD8EMz8DMzczNzM3MzczNzU3Mzc1NzM/AjM3MzU/AzUvBAUPBRUfAxUfATMfAjMfAhUfATMfARUfATMXMxczFzMfAjMXMxcVMx8HMxcVFzMVMxczPwQ1LwQjJyMnIycjLwojLwQjLwUjAV0BLv7q/v4aysrKysrKymEHDQYNDQcnDQ4EAwMEAQIDAwkEBQYMBhcGCwYGBgYpBgYGBgYFHwQFDAMDAgIGAwonBgcGDQfpBQQEAwMBAgICBgICAwYFBAMIAQ4CCAIGAgQBAgIBAgMCAwUEAwQDCgUGAwkECQQEAwQCBAYBBAMCAwIDAgECCAEFAwQCBAICBQIHAgIBAgkBAgIDBwMCAwIBAgMCBgIKBf3zBQcBAgMCAwIDAgMCAwQBAgIDAgQBBAQBAgICAgICAQICAgQCAgQBAQECAwICCgECAgIBBAECAQIBAgECAgEEBAMOBAgEAwEBAgMBAgICAQIBAgECAQICAwIBAggCAQICAgEEAgQBBgIKAgYDCgMGAwUDAgEEBggFArIEBQMGAgEBAQEBAQEBAgEDBQMFAwQDAgYDAQIDBgQJCQQEAwIBAQMCAQIDAwIBBQEMAwECAQEBAQEBAQEEAwQECPymBAUDBAQBAQMCAQMCAQQBCgEEAwIDAgECAwECBAcJCQQEAwQCBAIDAgcEAQYBAgECCAEBAQEFCAgCsQQECQQFCgQPBQULDwYFCwUhBgsQCAQFAgIEAwQNCQYGFAUBEgYHBQEFAQUBBQEcAQsFAQUFAQULDwEEAQMDAgEEAwQECP3eBAQEAwICAQIDBA0CAQIDAgECAwMLAgEIAwMFAQIBAgECAQIDAwECAQIBAgQDBgMNAx0CAw0EAw0JBQgFAgEEAwQEAwQIAxQCEQMJBRECBgUDBQUFAgEPAgUCAgEEAwQRBAQFAhwM/pABfBj+tAEnGRlKGBhVGBhNGBgCLQECBgECBAIDBAgJBQQEAwQBAgICBAIBAQEBAQUBBgQDCQUICAIEBgEBAU8BAQMDBAQEBQkEBgECAQYDBAIIDgMIAwYDBAECAgMEAwQDBwcDCAMSCggCBAICAwMICgcHAQwIBAQEBAQEBAsBBwMGAgYCAwUDBwMCAwkDAgIHAgICAgEBAQICBAIFDAEEAgICAgIBAgICAgIBBAIBAgIDBAEEAQQBAgMCAwIBAgMCAQIGAgECBgMDAgUCAQIPAwIBAgECAwYDAwMDAwMDAwEECQUIAwMDAQQDAwQGBQMCBQECAwIDAgMCAwMCBQIDAgwCAwIDAgMEAwQDBgMKAwYCCgEGAgUEBAQJCQYEAf7GAQICCAQEBAQzAwkDBgIGAwMDAwMDBgIDAwkCDgMIAQ0FCwUGCgcEBQkEBgICAgIDAwMDBgYGBQEFBw8mAwoDAwcDAwQDAwQDAwQDBwMOAywFCQgEAgMCEwECAwMIBBsGBxMHDRMGBw0GHw0FAQUBBQEFAQUBBQEBBAQEAgICAwMJCQgGBgUGEAsGEQUGBgUvBgUGBgwGBwUHBgL+sgECBgQEBgQJBAMFCQIDBAMMAQQDBAMHCQkIAwMDAgIBBgIGAwIDAgMDDwYBAwMBAwQHDAQBAwQEBAkIBAMCAgIBAwIEBAkEBQQEAwEKAgICAgICAQEHAgUBAQEDAgIBAgECAQEBAQECAgIEAgkBAQQBBAEEBwUECQgEAgMBAwcGAwMGAgIDAQMCAwIJAgMCAQQBBA0BAgAAAAMAAP/SAyMC6gAFAAwAEQAAASIjESERJxQVMxEhEQUWHwEjAnLW1wJe5bj9/AF5FSo+fQLq/OgCYoldXf38Ar4MFStBAAAAAAgAAP/TA9QC6QATACcATgByAHYAegB+AIIAABMiDgEVERQeATMhMj4BNRE0LgEjBSEyHgEVERQOASMhIi4BNRE0PgEXByMOARQXFhcxFhcWFxYHBg8BITc2NzYnJicmLwEmJyY1NDc2PwEHMwYHBhUUFxYfARYXFhcWBwYHIzY3NicmJyYvASYnJjU0NzYXFTM1BxUzNQcVMzUHFTM11zVZNTVZNQI6NVo0NFo1/cYCOiU+JCQ+Jf3GJT4kJD5/AwEwLA8IFxUJDQECDRMlKQEBAy4QFAMCDQgUCBMIDBARLyn5nhYLFw4JFgIUCQ0BAg0OJ54TBxMCAg4IFQYTCQsQFAR7gIBGfGqAAuk0WTX+bjVZNDRZNQGSNVk0PCQ9Jf5uJT0kJD0lAZIlPSRcAhw2LxYNGBULEQwPDxYVGQIcFhkYEhMLFQgUDBENEBMVHRgaEQ4aGRYWDRcCFAwRDA8PExcQChcaExMLFQcTDRENEBMXFAwMQAwMQQwMQQwMAAQAAP/TA9QC6QATACcAKgAvAAATIg4BFREUHgEzITI+ATURNC4BIwUhMh4BFREUDgEjISIuATURND4BBxc3BREhEQfXNVk1NVk1Ajo1WjQ0WjX9xgI6JT4kJD4l/cYlPiQkPgX6+v4NAfT7Auk0WTX+bjVZNDRZNQGSNVk0PCQ9Jf5uJT0kJD0lAZIlPSRfjY00/ukBF4wABQAAAAADSAKpABsAMgBKAGIAegAAASIHBgcGDwERFhcWFxYgNzY3NjcRNCcmJyYnJgcyFxYXFhcGBwYHBiInJicmJzY3Njc2BzIfARYXFjI3Nj8BFQYHBgcGIicmJyYnFTIfARYXFjI3Nj8BFQYHBgcGIicmJyYnFTIfARYXFiA3Nj8BFQYHBgcGIicmJyYnAfR9XjAfIgcBBiQgL1cBCFcvICMHAQciHzBefXtZKxoRBgYRGSxc8FwsGREGBhEaK1m2AQMDGzRe+l40GwcEFBksXPBcLBkUBAEDAxs0XvpeNBsHBBQZLFzwXCwZFAQBAwMbNFcBCFc0GwcEFBksVf5VLBkUBAKpFAsQERoE/iUaFBEJFBQJERMbAdsDARoREAsUIxQJDQkKCgkOCRMTCQ4JCgoJDQkUawICDgwUFAwOBCkLCg4JExMJDgsKMAICDgwUFAwOBCkLCg4JExMJDgsKMAICDgwUFAwOBPMLCg4JExMJDgsKAAkAAP+fA70DIAAKABgAJgA0AEoAWgBoAHoAjgAAAQYCBzY3NjcXJi8BFh8BJwYHBgcGNzY3NhMGBw4BFjc2FxY2JicmFyYGFhcWFxY+AScmJyYFBgcGDwEGBwYHBhY2NzY3PgE3NjQmASYGFxYGBwYeATc+AScuAQUmBhcWFxY+AScmJy4BAQYHBgcGBwYHDgEWNzY3Ni4BBSIGFhcWHwEWMzI2JicmLwEmJyYB9BhNFxcqJxR9GTEyDBYiRAgZEgYKAQsUFhBQLwsBEgxhYw0OBgwrxQwPBAtCOAkYDQY4UwT98AoLBgsLLykJAgMZGQQlLQQWBAgNAq0PDQMDGBkEDxkHHxoHAg38pA8OAwUvBxkPBC0CAQ0CrgkJBgoNCDZWDAESDG5VBwIN/dkLDQMKQ2AGEggPDREOYTsDBgQGAiZC/vNBFzArFYdOnlEkSW5KBx0UBwsGIUNMAXICDwYZEgQYFAEUGAQLTwETGAUvZgoFFQtrOwMLAQgECwsuSw8LDxEPD0QvBREFCBMO/sgBGw8yZC0MEwEKNn0+BwkSARoPaFwKARMMW2cIC/6zAQYDCQoEJBcGGBIDGUgHEw4BEhcFORoCBRkYARgxAwUCBAAAAAYAAP+VA74DJAAbADEASQBgAGUAawAAASYHBgcGBwYWFxYXHgE3PgI3NicuAScmJyMmBzYXFhcWFxYGBw4BJicuAjc2Nz4BFyYHBgcGBwYXFhcWFxY2Nz4CJyYnLgEHNhcWFxYHFgYHBgcGJicmJyY2NzY3NgcWFzY3BRQVIREHAfNsZWFBQgsMNzw9U0+3VliETwYGHhx3T1BXAxUQY11ZOjwICT0+QKa0TVBkIBUXOTiiX1tVUTI1AQQkJEFEUk2eP0FFBB4gPDB8QlBKRyssAQFIPkBLR4wzNhQVFCcnPUpSVlU4cv6FAZrJAyICNjVaXWxctklKKCgLHB13pFlbU1OGKCkFAjEDMTBTVmNYrEBDOxArLI+zVVlCRE4rAzAvT1JbU1BONjgQECUwMoyiSUwyKzAwAiwqRkpQS4ssLwcJMTM1RUKQOz0iK5tFRS5cIIyMARKjAAAAABAAAP+gA7sDIgAHAA8AHQAsAD4ATwBgAG4AewCKAJgApQCzAMUA0wDmAAABJicHFyE2NycGByMnNjcWAwYHDgEWNzYXFjYmJyYXJgYWFxYXFj4BJy4BJyYFBgcGBwYHBgcGFjI3Njc2LgEzIgciBw4BHgE3NhcWNjQnJgcGBwYPAQYHBh4BNzY3NjQmBSYGFhcWFxYyNicmJyYFJgcGFx4BNicmNzYmBSYGFxYHBh4BNz4BJy4BBSYGFxYXFj4BJyY3LgEFJgcGBwYeATc2Ny4BBSIGFhcWFxY2JicmJyYFDgEHBgcGDwEOARY3Njc+ASYFIgYWFxYXFjYmJyYnJgUGBwYHBgcGBw4BFjc+ATc2LgECy0eQ11IBChcrDBgw5kg/fHx8Si8MARMMXmYMDgUMMcoMDwMLTC0HGQ8EGEkuBP31CwoGCwgFQSEEERgHKVEGAQ3/BAoSBw0JCRQJTkcMEgtC6g0OCRAKPRkFERkGKVAIDgF/DA4CCjQZBxkQBBpEBP3DGQULGwYYEgIaEAEOAukPDQMBMAQQGAcdGwQCDvykDw4DAjEHGQ8FLwIBDQLsGgINMgYPGQg9DAEN/agLDAIIP1QMEQELTzcGAZ8MKwsTGQ8eEQwFDwxhUAgBDf49Cw0DCllpDA4FDGRPBgIYCQkFCg4INFkLAhENNmUpBwINAaI0aJz9RIgoSpLcLVpaAVwCEAYZEQQZFgETGQQMUwETGAU4WwoBEwwyWCACCgEHBQsIBD5QDBILXUAHEw4BAgQVEQgDBh8EERkGHycCCAUMBzAwDBMBC0AuBxMPOwESFwY1VAsTDF1BA6kCK1ZNCwMRDFBUCg4tARoOZV4MEgEKNnk+CAoQARoOa1oKAhMMW2YICzgCKT9DDBQDC09bCQ6gERYGSR0DEhgGHkIGTQMVAwcEAwMCBBgUAQIwBxUPJxMWBUgTARQYBBVCAwMBBQMJCwMjFgYZEgMLMSMHEw4AEAAA/6ADuwMiAAMACAAWACUANwBIAFkAZwB0AIMAkQCeAKwAvgDMAN8AAAEGByEDFhchNhMGBw4BFjc2FxY2JicmFyYGFhcWFxY+AScuAScmBQYHBgcGBwYHBhYyNzY3Ni4BMyIHIgcOAR4BNzYXFjY0JyYHBgcGDwEGBwYeATc2NzY0JgUmBhYXFhcWMjYnJicmBSYHBhceATYnJjc2JgUmBhcWBwYeATc+AScuAQUmBhcWFxY+AScmNy4BBSYHBgcGHgE3NjcuAQUiBhYXFhcWNiYnJicmBQ4BBwYHBg8BDgEWNzY3PgEmBSIGFhcWFxY2JicmJyYFBgcGBwYHBgcOARY3PgE3Ni4BAfRgYAGAwGQz/tIzZEovDAETDF5mDA4FDDHKDA8DC0wtBxkPBBhJLgT99QsKBgsIBUEhBBEYBylRBgEN/wQKEgcNCQkUCU5HDBILQuoNDgkQCj0ZBREZBilQCA4BfwwOAgo0GQcZEAQaRAT9wxkFCxsGGBICGhABDgLpDw0DATAEEBgHHRsEAg78pA8OAwIxBxkPBS8CAQ0C7BoCDTIGDxkIPQwBDf2oCwwCCD9UDBEBC083BgGfDCsLExkPHhEMBQ8MYVAIAQ3+PQsNAwpZaQwOBQxkTwYCGAkJBQoOCDRZCwIRDTZlKQcCDQIyrK0BJrRaWgHXAhAGGREEGRYBExkEDFMBExgFOFsKARMMMlggAgoBBwULCAQ+UAwSC11ABxMOAQIEFREIAwYfBBEZBh8nAggFDAcwMAwTAQtALgcTDzsBEhcGNVQLEwxdQQOpAitWTQsDEQxQVAoOLQEaDmVeDBIBCjZ5PggKEAEaDmtaCgITDFtmCAs4Aik/QwwUAwtPWwkOoBEWBkkdAxIYBh5CBk0DFQMHBAMDAgQYFAECMAcVDycTFgVIEwEUGAQVQgMDAQUDCQsDIxYGGRIDCzEjBxMOAAAAAAUAAP+VA74DJAAbADEASQBgAGkAAAEmBwYHBgcGFhcWFx4BNz4CNzYnLgEnJicjJgc2FxYXFhcWBgcOASYnLgI3Njc+ARcmBwYHBgcGFxYXFhcWNjc+AicmJy4BBzYXFhcWBxYGBwYHBiYnJicmNjc2NzYXBgcXITY/ASYB82xlYUFCCww3PD1TT7dWWIRPBgYeHHdPUFcDFRBjXVk6PAgJPT5AprRNUGQgFRc5OKJfW1VRMjUBBCQkQURSTZ4/QUUEHiA8MHxCUEpHKywBAUg+QEtHjDM2FBUUJyc9SlWQR1IBChcrEEcDIgI2NVpdbFy2SUooKAscHXekWVtTU4YoKQUCMQMxMFNWY1isQEM7ECssj7NVWUJETisDMC9PUltTUE42OBAQJTAyjKJJTDIrMDACLCpGSlBLiywvBwkxMzVFQpA7PSIrV2g0/USIMTQAAAAKAAD/nwO9AyAABAAOABQAIgAwAEYAVgBkAHYAigAAARQVIREFMjMGBwYHBgcmNxQVITUXEwYHDgEWNzYXFjYmJyYXJgYWFxYXFj4BJyYnJgUGBwYPAQYHBgcGFjY3Njc+ATc2NCYBJgYXFgYHBh4BNz4BJy4BBSYGFxYXFj4BJyYnLgEBBgcGBwYHBgcOARY3Njc2LgEFIgYWFxYfARYzMjYmJyYvASYnJgEnAZr+wXJyDyAYDRUQQOP+yJwEUC8LARIMYWMNDgYMK8UMDwQLQjgJGA0GOFME/fAKCwYLCy8pCQIDGRkEJS0EFgQIDQKtDw0DAxgZBA8ZBx8aBwIN/KQPDgMFLwcZDwQtAgENAq4JCQYKDQg2VgwBEgxuVQcCDf3ZCw0DCkNgBhIIDw0RDmE7AwYEBgH6nJwBODEJHBYJDwI0BV1dun0B8AIPBhkSBBgUARQYBAtPARMYBS9mCgUVC2s7AwsBCAQLCy5LDwsPEQ8PRC8FEQUIEw7+yAEbDzJkLQwTAQo2fT4HCRIBGg9oXAoBEwxbZwgL/rMBBgMJCgQkFwYYEgMZSAcTDgESFwU5GgIFGRgBGDEDBQIEAAAAAAEAAAAAA1MCEwAuAAATNjc2NzYXFhcWFxYXFhcWNzY/ATY3NjcVBgcGBwYnJicmJyYnLgEGBwYHBgcGB5YaGyMtIi0mJhgbECA7IR0kIRgVHw0XCxwaJCsmKygjHDIhEh02PBUbGQ8bEAgBSj4nNBsUBwYYDxUOGzQVEQoJGxgiEh4dpTciLRQQCAcZEy4fDhgbBxQYJBcuHA4AAAcAAP/TA9QC6QATACcATQB1AK0AtgC/AAATIg4BFREUHgEzITI+ATURNC4BIwUhMh4BFREUDgEjISIuATURND4BFxQVBgcnBxcGByMVMxYXNSM1Mzc2PwEnNxc3Nj8BNTMVMy4BJzUHFQYHJwcXBgcjFTMWFwcXNxYXFTM1NjcXNyc2PwE1ByYnNycHJic1BzMVFxYfATcXBxcWHwE3FSMHBg8BFwcnBwYPARUjNScmLwEHJzcnJi8BIzUzNzY/ASc3Fzc2PwEXIgYUFjI2NCYHMhYUBiImNDbXNVk1NVk1Ajo1WjQ0WjX9xgI6JT4kJD4l/cYlPiQkPkkNDhkuGAgDIyQDDh8fAgMLBRUPFggPFQgXOwQaBwQODhgvGQgDJCQFBxovGgwPQg0PGS8aCAQiIwMIGC8YChIsFgkUEAgVEBUFCwQCHh4CAwwFFxAWCBAUCRYJExEIFhAXBgoFAh8fAgUKBRYQFgcREwkLFB0dKR0dFQwQEBcQEALpNFk1/m41WTQ0WTUBkjVZNDwkPSX+biU9JCQ9JQGSJT0kMhESBAgZLxgSCkINFjkWCRISCBUQFgULBQEfHgQLAiNAIgQIGS8ZDQ5CDwwZLxoHBSQlAwgZLxkODQFCAQoSGC4YBgUiFR8BBAsFFQ8WBxAUCQEXCRQQBxYQFgUKBQIgIAIDDAQWEBYIEBMJFgkUEAgVEBYFDAMCMh0oHh4oHRYQFxAQFxAAAgAA/9MD1ALpABMAJwAAEyIOARURFB4BMyEyPgE1ETQuASMFITIeARURFA4BIyEiLgE1ETQ+Adc1WTU1WTUCOjVaNDRaNf3GAjolPiQkPiX9xiU+JCQ+Auk0WTX+bjVZNDRZNQGSNVk0PCQ9Jf5uJT0kJD0lAZIlPSQAAAMAAAAAA14CTwAiACYALAAAAQYHDgEPAQYHBhYXBRY+ASc1FhcWPgEnETQmIgcFPAEnLgEHFBUnJRQVJic2AfYJCgUWBUaMRg0GDwE1ChcOAoOYChYOAhMYCP7sAQISJ+UCLGp7ewJOAQYDEAMvXi8KIwfPBgYUC59aZAYGFAsBogwPCLodcRwLDleampqamppJUVEAAAAACQAA/58DvQMgAAcADwAdACsAQQBRAF8AcQCFAAABJicHFyE2NycGByMnNjcWAwYHDgEWNzYXFjYmJyYXJgYWFxYXFj4BJyYnJgUGBwYPAQYHBgcGFjY3Njc+ATc2NCYBJgYXFgYHBh4BNz4BJy4BBSYGFxYXFj4BJyYnLgEBBgcGBwYHBgcOARY3Njc2LgEFIgYWFxYfARYzMjYmJyYvASYnJgLLR5DXUgEKFysMGDDmSD98fHhQLwsBEgxhYw0OBgwrxQwPBAtCOAkYDQY4UwT98AoLBgsLLykJAgMZGQQlLQQWBAgNAq0PDQMDGBkEDxkHHxoHAg38pA8OAwUvBxkPBC0CAQ0CrgkJBgoNCDZWDAESDG5VBwIN/dkLDQMKQ2AGEggPDREOYTsDBgQGAaI0aJz9RIgoSpLcLVpaAVoCDwYZEgQYFAEUGAQLTwETGAUvZgoFFQtrOwMLAQgECwsuSw8LDxEPD0QvBREFCBMO/sgBGw8yZC0MEwEKNn0+BwkSARoPaFwKARMMW2cIC/6zAQYDCQoEJBcGGBIDGUgHEw4BEhcFORoCBRkYARgxAwUCBAAAAAAFAAD/lQO+AyQAGwAxAEkAYABkAAABJgcGBwYHBhYXFhceATc+Ajc2Jy4BJyYnIyYHNhcWFxYXFgYHDgEmJy4CNzY3PgEXJgcGBwYHBhcWFxYXFjY3PgInJicuAQc2FxYXFgcWBgcGBwYmJyYnJjY3Njc2FwYHIQHzbGVhQUILDDc8PVNPt1ZYhE8GBh4cd09QVwMVEGNdWTo8CAk9PkCmtE1QZCAVFzk4ol9bVVEyNQEEJCRBRFJNnj9BRQQeIDwwfEJQSkcrLAEBSD5AS0eMMzYUFRQnJz1KVWBgAYADIgI2NVpdbFy2SUooKAscHXekWVtTU4YoKQUCMQMxMFNWY1isQEM7ECssj7NVWUJETisDMC9PUltTUE42OBAQJTAyjKJJTDIrMDACLCpGSlBLiywvBwkxMzVFQpA7PSIrY6ytAAAUAAD/owO4AyIABAAIAAwAEAAUABgAWwCzAQkBTAGhAf4CSQKLAs8DEgNpA7YEAgRMAAABFREhEQUzESMTFTM1BxUzNQcVMzUHFTM1AzEjByMHIxUjByMPBxUfBDM3MzczNzM3MzczFzMXMxczFzMXMz8FNS8FIycjNSMnIycXIw8FHxk/BDUvAyMnNSc1JyMvASMvATUnIyc1LwEjLwE1JzUnIzUnIycjLwE1LwEjJzUnIy8BBSMPAhUHIw8BFQ8CFQcVBxUPASMPARUPAhUPASMPASMPARUHFQ8BIw8CFR8FMz8ZNS8EITEjFSMPAxUfBDM3MzczFzMXMxczFzMXMx8GMz8FNS8CIy8JIycjJyMnIzUHIw8CIw8BFQcjDwEjBxUHIwcjByMHFQ8DIxUPARUPAiMPAR8FMz8dMz8DLwMFDwUfFhUfBDM/BDUnNS8INSc1LwQjJyMnNS8BIyc1JzUvATUjLwE1JyMnNS8CNS8DBSMPBRUjFQcVBxUjFQcVFxUzFRcVFxUXFR8JMz8ENS8CNSc1JzUnNSc1JzU3NTc1NzU3NTc1LwQFIw8DFQcXFQcVBxUHFQcVDwgVHwMzPwY1NzU/BzU3NTM1NzU3NSc1LwMFIw8DFRcVFxUXFRcVHwcVFxUfAjMVHwMzPwQ1Lws1JzUnNSc1JzUvBAUjDwUVBxUPDxUfBT8CNT8BNTczNzU/AjM/CjU3LwQFDwUfAhUXFRczFzMfAjMfATMVFxUXFRczHwEzFzMXFRcVHwEVHwIVHwIzPwU1LxwFIw8IIwcjByMHIwcjByMPBBUfBTM3MzczNzM3Mz8LMzczPwE1PwE1NzU/BDUvBAUPBRUfBTMfARUXMxczHwEVHwEzFxUfBDMXMx8GMz8FNS8WISMPFxUfBjM/CDM/BDU3MzczNzU/ATU/ATM/BDUvBAFdAS7+6v7+GsrKysrKysplCwYLBQwFBQYmBgoIBAIDAQECBgQJBCsFCQUFBQUKBR4FCgUFBQUKBBgJBQQDBAQBAQQDBAcmBQYFCwYLBvQFBAUDBAQCAggCDAcIBwQDBAMEAwcGBw8CCQIDEQQDBAkJBAQDBAECAwIBAgMCAQISAQkEBgEDBAMBAwgEAwEDAQMBCAQEBAEECAEECv3xBQQIBQQBBAQEDAQEBAgDAQMEAwQDBAkBDwIBAgMDBQIBBAMDAQIDAwgECQUHBQUQBgIGAg8HBgcDBAMEAwQHCAQEBwIBAgIDBAgBBBINCgUHBgICAwgIBAEIBCYECAMEBAQHBAgDGgMIBwcDCQUEBAQDBAEEAwcBAwUEBAQEBAkEJgQJBQQEBQ2tBAgGBwEDCAMBFQMBAwMBCQEMAQkJAwMCAQIDAwgEAQQCAgIDAwgEBQQJAwgDAgQDAgMCAwIDAgMDAwIDAwMDAwMDAwYDIwIDBAQCAgUECAGEBQgEAwMDAQYDAwIDAgMCAwIDBxYBBAEEAQYDAgIEBAMEBQkEBAQDBAECAgIBAgECAQICAgEBAQgBAQECAgQBAgcDAgECAwIBAgYDCQMDAwT9wwUECAMDAgIBAgEBAQEBAQIBCAIBAQEDAwQEBAUJBAMDBAECBQMCAQEBAQEBAgEBAgMDCQLuBQQIBgIBAQEBAQIIAgECAgQBFgEBBAMMBQkEBgUEAwoCCAECAQICAgcBAQEBAQQDBAj8pwUICAQCAQEBAgYCAgIBBAEGAgoDBAEDBgQFCQQEBAMEAgESAQIBAgECAgIHAgEBAQECBwMFAvAEBQQEAwQCAgcCAwUCBAECAwwKAwQCBAEBBAMEBAkIBQcDDwIBBgUIAQEBBgECAQIBAgICCQECAgMECP2tBAgEAwICAgUGDAYBDAEGBwMBAwMBBwcDAQcHAQMBAwQIBAQMBAQEBAkEBAQFAgEBBAQDFQMECgcZAwoCAwMDAwMDAwIGAwIDAgMCCAGcBQQEAQcKHAsHEgQLBAcEBAcECAQQCAQDAgIBBAQDBAUMBQ0EBQQFCAUmBAkEBAQEBAQBBAMBAwEDBAQIBAkEAgIBAgYDBAX+RAQFBAYCAgECAwMFBAEEDQkBDQEEBQUEAQQFBQoFGQEEARQGBQUFCwoJBQQEAwQBAgMDBAcTBQQFBQQFBQQlHggEBAkMAw0CEgUEBQMBFAQECQgWLAUFBAUFBQQFGwQGBAEBAgMDBAQECQMGBQsFBQUGFAEeBQoFBQQBBAEEBRwNBAEEBQMCAQICAwQIAhwM/pABfBj+tAEnGRlKGBhVGBhNGBgCLwEBAQEHAgIEAwQEBAkEBQYDAgkCAQEBAQEBAgUBAgMDCAQFBAkDAwMHAQEBAVMBAgIEBwkJCgEJBwYHAwQDBAMEBwgHFAQNBAQgAwMCAgICAwMICQUGBQUEAQQBBAUcDQQBCAQBBAQECAEDAQMBAwQIAwEDBAMBBgQHCAEEBAEDBAMBAwwDAQMBAwEIBAQEAQQEBAEEDRcFBQQBBAEJBQoFDAQFBAQDBAECBQcMHggECQQUBwgHBAMEAwQDBwYEAwcFBAQJBAQDBAECAgUMBQkEAwYCAQEBAQECAgcCAgMCAgIBAgMDCAUJCAMFAgECAQIBAgICCQIBAQEnAgMFAgQBAg8DAgECCQwJAQkEAwMBAwMBAwsHBwkJBAMEBAEBBAMMAwQGAwMCAwMDAwMDAgMDAgMCAwIDAgMEAxYDAwgJCQcDBDsBAgMDBA0FCwIDAwMDAwMCAwMKIwMHAwcEDgsDBwMIAwMCAQEDAgQICQQCBAkEBAQEBAUDAQMBAwQBAxAEAwEDCAMBCgEDAwEDAwEDAwEGBAkBAwIDA6kBBAQDBAgEBAkFBAkNBBsFDQkEBAkEAQQiBAUBBAQDAwIBAgIDBAgJBQQSBAsEBwQEBwQIBB4ECAQHBAQHBAQJBAQEAwQtAQQIBAQEBB4FCgUFBQUJBScFBAUJCgQyBAUECAQGAgIGCAoFGQEEARQGBQUFCwYmBQYFCwYLBhYGCQgDAwQQAgYICAkGEQUGBQYLBSEGCwUFCgYPAQQBGQUKAQQGAgEBAwIECAkIASkEBQUEBQUJBSIFCQUFBQUKBRcFBAcCAjkBAgMDCAcEBwQaAwsLBwYEAwcUDwMHAQgFBAUIAwMCAgICBwEDFQEDCwEHEAQEDAQEBAQEBAkEJgUFCAQEAwSgAQQDAwQJCQkGAQwBBgwGBQMDAgEEAQQBAgUEAgIBAQEEAQEBBgEBAQIBAQIDBwUEBQQIAwMJAgEGAxADBgMCAwIDAgMCAwYCAwMDAwMHSgECAQMGDAMDBQMCAQEBBAMDBAkFBAgDAwIBAQEBAgkCAgIBAgECAQEBAgICAQEBBAEBAQUEAwUEBQgIAwIBJwEBAwYECQUEBAQCBQMECQEGCQMCAQIDAgECAwQDCgIIAQIBAgIDAQIDAwgFBAkEAwMDBAIBAgECAQIBEBAGAgMFCQMKAQICAg8CAwUGDBQBAgECAQIBAgYCBgkEBQQEBAMDAgEBAQICAgECAQgMAwQDAgECAwIBAhIBCQQDBQQEBAUJBAMDBAAAAAADAAAAAAO5Ao4AAwAHAAsAABMRIREHESERIzMRIy8DijH9YoxeXgKO/Y8CcTD96wIV/esAIAAA/+4DrALPAAQACQAOABMAGAAhAC0ANgBBAE4AVQBaAF8AZABpAG4AcwB4AH0AiACOAJcAoQCmAKsAsAC1ALoAvwDEAMkAzgAAATIzNSMXMjM1IxcyMzUjFzIzNSMXMjM1IxcyMzYXNyYrASEiBxc2MjYnJjY1JgUWFzY3NjcmJwUGBxYXFhc2NycmBQ4BFxYGFjIzMjc0JwUGFTMmNycFMjM1IwUyMzUjBTIzNSMFMjM1IwUyMzUjBTIzNSMFMjM1IwUyMzUjBQYHFhcWFzY3JyYFFhc3JicFBgcWHwE2NycFFhc3NjcmJwcGFzIzNSMXMjM1IxcyMzUjFzIzNSMXMjM1IxcyMzUjBzQ1IRETMjMRITcUFTM1AQUZGDFiGRgxYRkYMWIZGDFiGRgxYQQHGAsGCxUU/e0NDAkDDgYDAQIBAmISDQUKEQUUGP0zGBMFCxAHEA4KCgLxCwMEAgECCg0SBwr8owcxAQYuAzUZGDH8wxkYMQM9GRgx/MMZGDEDPRkYMfzDGRgxAz0ZGDH8wxkYMQM7BQkGCxEIDwUQFvy/BhEoCwQC3BERBQgDGxce/TAbGQUFAhMQBw5jGRgxYRkYMWIZGDFiGBgwXhkYMWUZGDE1/q4fior+7CXLAp0xMTExMTExMTExAQIwAgMwAQQIBBUEBz0JEAQJDAcXDQMPFgQJDQQSBxASVgEKCwIPBgEeGggYHRMVD5UxNTGOMTYxjjE1MY8xNTFZFg8DBwsDGRsDBQ0cGRsSE0EMBQwZCQcTJyoSBxIUCQYMCRUpMTExMTExMTExMTEirKv+qQE4/uunFxgvAAALAAD/zgO5AvIABQAJAA0AEQAVABkAHwAjACcAKwAvAAAXNTMVMxUzNTMVMzUzFTM1MxUzNTMVMzUzFTM1MzUzFSU1MxUhNTMVJREhEScRIREuMRAxYTFiMWExYjFhMA0x/HUxAykx/HYDijH81jJZKDExMTExMTExMTExMShZilxcXFyLAg/98TABs/5NAAAEAAD/nAPDAyAAAwAHAA4AFQAAAREzETMRMxEBBxc1MzUjJRUHFTMVNwFuJsMm/lCkpF1dAlNeXqMDIPx8A4T8fAOE/uGjo29pbmwBam+jAAYAAP+eA5QDHgAGAAkADQARABUAGQAAAQUXARcBFyUFFycHFzcPARc3DwEXNw8BFzcDlP5mQP4aGQHmPgED/mWXlT8ZP5c+GT6ePxk/lyYZJgMebV/+uSYBSFwFbeBYKyUqLyomKzUrJSswGiUaAAACAAAAAAO5AmYAAwAHAAATESERAREhES8DivylAyoCZv3wAhD+HQGz/k0AAAkAAP+nA7IDHgADAAcACwARABUAGQAfACUAKQAAARUzNQUVMzUzFTM1FxUzFTM1BRUzNQUVMzUHFSMVMzUFFTM1IzUXFTM1AS9n/qHaoduCeyj9fWcB9Cgod5/9np934FIDHtra9mdnZ2ceKHWdaNran01NvnQonAGdKHV1KCgACwAA/84DuQLyAAUACQANABEAFQAZAB8AIwAnACsALwAAExUzNTM1MxUzNTMVMzUzFTM1MxUzNTMVMzUzFTMVMzUFFTM1IRUzNQURIREHESERLjEQMWExYjFhMWIxYTANMfx1MQMpMfx2A4ox/NYC8lkpMDAwMDAwMDAwMDAwKVmJXFxcXIv98AIQMP5NAbMADAAA//oDuQLCAAQAGAAcACAAJAAoACwAMAA0ADgAPABAAAATFREhEQUhFSMVMxUjFTMVITUzNSM1MzUjMxUzNTMVMzUzFTM1MxUzNTMVMzUFFTM1MxUzNTMVMzUzFTM1MxUzNS8DivylAyoMDAwM/NYRERERQmIxYTFiMWExYv1UYjFhMWIxYTFiAsLY/hACyCysMbYxqakxtjExMTExMTExMTEx5zExMTExMTExMTEAAAAABwAA//oDuQLCAAQAEAAUABgAHAAgACQAABMZASERBSERIxUzESERMzUjMxUzNTMVMzUzFTM1MxUzNTMVMzUvA4r8pQMqDAz81hERQmIxYTFiMWExYgLC/rT+hALILP7gMP7jAR0wMDAwMDAwMDAwMAAAAAAFAAD/0gMjAuoABQALAA4AFgAdAAABIiMRIREnFTMRIREFFyMnHQEjFTMVNycXBzUjNTMCctbXAl7luP38AXl9feNqao15XFxqagLq/OgCYom6/fwCvgyBbBhFUFyEVlZWQigABAAA/9IDIwLqAAUACwAOABUAAAEiIxEhEScVMxEhEQUXIycVIxUzFTcCctbXAl7luP38AXl9feNqao0C6vzo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AAAAAAAAAAAAbAECAQMBBAEFAQYBBwEIAQkBCgELAQwBDQEOAQ8BEAERARIBEwEUARUBFgEXARgBGQEaARsBHAEdAR4BHwEgASEBIgEjASQBJQEmAScBKAEpASoBKwEsAS0BLgEvATABMQEyATMBNAE1ATYBNwE4ATkBOgE7ATwBPQE+AT8BQAFBAUIBQwFEAUUBRgFHAUgBSQFKAUsBTAFNAU4BTwFQAVEBUgFTAVQBVQFWAVcBWAFZAVoBWwFcAV0BXgFfAWABYQFiAWMBZAFlAWYBZwFoAWkBagFrAWwBbQAMc2NyZXctd3JlbmNoBXRyYXNoEGNvbmRpdGlvbmFsLWZsb3cMZGVmYXVsdC1mbG93EGdhdGV3YXktcGFyYWxsZWwfaW50ZXJtZWRpYXRlLWV2ZW50LWNhdGNoLWNhbmNlbDFpbnRlcm1lZGlhdGUtZXZlbnQtY2F0Y2gtbm9uLWludGVycnVwdGluZy1tZXNzYWdlGHN0YXJ0LWV2ZW50LWNvbXBlbnNhdGlvbi5zdGFydC1ldmVudC1ub24taW50ZXJydXB0aW5nLXBhcmFsbGVsLW11bHRpcGxlC2xvb3AtbWFya2VyEnBhcmFsbGVsLW1pLW1hcmtlciNzdGFydC1ldmVudC1ub24taW50ZXJydXB0aW5nLXNpZ25hbC9pbnRlcm1lZGlhdGUtZXZlbnQtY2F0Y2gtbm9uLWludGVycnVwdGluZy10aW1lcippbnRlcm1lZGlhdGUtZXZlbnQtY2F0Y2gtcGFyYWxsZWwtbXVsdGlwbGUlaW50ZXJtZWRpYXRlLWV2ZW50LWNhdGNoLWNvbXBlbnNhdGlvbgtnYXRld2F5LXhvcgpjb25uZWN0aW9uEGVuZC1ldmVudC1jYW5jZWwiaW50ZXJtZWRpYXRlLWV2ZW50LWNhdGNoLWNvbmRpdGlvbjtpbnRlcm1lZGlhdGUtZXZlbnQtY2F0Y2gtbm9uLWludGVycnVwdGluZy1wYXJhbGxlbC1tdWx0aXBsZRVzdGFydC1ldmVudC1jb25kaXRpb24ic3RhcnQtZXZlbnQtbm9uLWludGVycnVwdGluZy10aW1lchRzZXF1ZW50aWFsLW1pLW1hcmtlcgl1c2VyLXRhc2sNYnVzaW5lc3MtcnVsZRJzdWItcHJvY2Vzcy1tYXJrZXIdc3RhcnQtZXZlbnQtcGFyYWxsZWwtbXVsdGlwbGURc3RhcnQtZXZlbnQtZXJyb3IfaW50ZXJtZWRpYXRlLWV2ZW50LWNhdGNoLXNpZ25hbB5pbnRlcm1lZGlhdGUtZXZlbnQtY2F0Y2gtZXJyb3IWZW5kLWV2ZW50LWNvbXBlbnNhdGlvbhRzdWJwcm9jZXNzLWNvbGxhcHNlZBNzdWJwcm9jZXNzLWV4cGFuZGVkBHRhc2sPZW5kLWV2ZW50LWVycm9yI2ludGVybWVkaWF0ZS1ldmVudC1jYXRjaC1lc2NhbGF0aW9uHmludGVybWVkaWF0ZS1ldmVudC1jYXRjaC10aW1lchZzdGFydC1ldmVudC1lc2NhbGF0aW9uEnN0YXJ0LWV2ZW50LXNpZ25hbBJidXNpbmVzcy1ydWxlLXRhc2sGbWFudWFsB3JlY2VpdmUNY2FsbC1hY3Rpdml0eRFzdGFydC1ldmVudC10aW1lchNzdGFydC1ldmVudC1tZXNzYWdlF2ludGVybWVkaWF0ZS1ldmVudC1ub25lHWludGVybWVkaWF0ZS1ldmVudC1jYXRjaC1saW5rFGVuZC1ldmVudC1lc2NhbGF0aW9uD3RleHQtYW5ub3RhdGlvbgdicG1uLWlvD2dhdGV3YXktY29tcGxleBJnYXRld2F5LWV2ZW50YmFzZWQMZ2F0ZXdheS1ub25lCmdhdGV3YXktb3ITZW5kLWV2ZW50LXRlcm1pbmF0ZRBlbmQtZXZlbnQtc2lnbmFsDmVuZC1ldmVudC1ub25lEmVuZC1ldmVudC1tdWx0aXBsZRFlbmQtZXZlbnQtbWVzc2FnZQ5lbmQtZXZlbnQtbGluayBpbnRlcm1lZGlhdGUtZXZlbnQtY2F0Y2gtbWVzc2FnZSVpbnRlcm1lZGlhdGUtZXZlbnQtdGhyb3ctY29tcGVuc2F0aW9uFHN0YXJ0LWV2ZW50LW11bHRpcGxlBnNjcmlwdAttYW51YWwtdGFzawRzZW5kB3NlcnZpY2UMcmVjZWl2ZS10YXNrBHVzZXIQc3RhcnQtZXZlbnQtbm9uZSNpbnRlcm1lZGlhdGUtZXZlbnQtdGhyb3ctZXNjYWxhdGlvbiFpbnRlcm1lZGlhdGUtZXZlbnQtY2F0Y2gtbXVsdGlwbGU0aW50ZXJtZWRpYXRlLWV2ZW50LWNhdGNoLW5vbi1pbnRlcnJ1cHRpbmctZXNjYWxhdGlvbh1pbnRlcm1lZGlhdGUtZXZlbnQtdGhyb3ctbGluayZzdGFydC1ldmVudC1ub24taW50ZXJydXB0aW5nLWNvbmRpdGlvbgtkYXRhLW9iamVjdAtzY3JpcHQtdGFzawlzZW5kLXRhc2sKZGF0YS1zdG9yZSdzdGFydC1ldmVudC1ub24taW50ZXJydXB0aW5nLWVzY2FsYXRpb24gaW50ZXJtZWRpYXRlLWV2ZW50LXRocm93LW1lc3NhZ2UyaW50ZXJtZWRpYXRlLWV2ZW50LWNhdGNoLW5vbi1pbnRlcnJ1cHRpbmctbXVsdGlwbGUwaW50ZXJtZWRpYXRlLWV2ZW50LWNhdGNoLW5vbi1pbnRlcnJ1cHRpbmctc2lnbmFsIWludGVybWVkaWF0ZS1ldmVudC10aHJvdy1tdWx0aXBsZSRzdGFydC1ldmVudC1ub24taW50ZXJydXB0aW5nLW1lc3NhZ2UNYWQtaG9jLW1hcmtlcgxzZXJ2aWNlLXRhc2sJdGFzay1ub25lE2NvbXBlbnNhdGlvbi1tYXJrZXIlc3RhcnQtZXZlbnQtbm9uLWludGVycnVwdGluZy1tdWx0aXBsZR9pbnRlcm1lZGlhdGUtZXZlbnQtdGhyb3ctc2lnbmFsM2ludGVybWVkaWF0ZS1ldmVudC1jYXRjaC1ub24taW50ZXJydXB0aW5nLWNvbmRpdGlvbgtwYXJ0aWNpcGFudBlldmVudC1zdWJwcm9jZXNzLWV4cGFuZGVkEWxhbmUtaW5zZXJ0LWJlbG93CnNwYWNlLXRvb2wQY29ubmVjdGlvbi1tdWx0aQRsYW5lCmxhc3NvLXRvb2wRbGFuZS1pbnNlcnQtYWJvdmURbGFuZS1kaXZpZGUtdGhyZWUPbGFuZS1kaXZpZGUtdHdvCmRhdGEtaW5wdXQLZGF0YS1vdXRwdXQJaGFuZC10b29sBWdyb3VwC3RyYW5zYWN0aW9uAAA=') format('truetype');
}
/* Chrome hack: SVG is rendered more smooth in Windozze. 100% magic, uncomment if you need it. */
/* Note, that will break hinting! In other OS-es font will be not as sharp as it could be */
/*
@media screen and (-webkit-min-device-pixel-ratio:0) {
  @font-face {
    font-family: 'bpmn';
    src: url('../font/bpmn.svg?68866489#bpmn') format('svg');
  }
}
*/
 [class^="bpmn-icon-"]:before, [class*=" bpmn-icon-"]:before {
  font-family: "bpmn";
  font-style: normal;
  font-weight: normal;
  speak: never;
  display: inline-block;
  text-decoration: inherit;
  width: 1em;
  /* margin-right: .2em; */
  text-align: center;
  /* opacity: .8; */
  /* For safety - reset parent styles, that can break glyph codes*/
  font-variant: normal;
  text-transform: none;
  /* fix buttons height, for twitter bootstrap */
  line-height: 1em;
  /* Animation center compensation - margins should be symmetric */
  /* remove if not needed */
  /* margin-left: .2em; */
  /* you can be more comfortable with increased icons size */
  /* font-size: 120%; */
  /* Uncomment for 3D effect */
  /* text-shadow: 1px 1px 1px rgba(127, 127, 127, 0.3); */
}
.bpmn-icon-screw-wrench:before { content: '\e800'; } /* '' */
.bpmn-icon-trash:before { content: '\e801'; } /* '' */
.bpmn-icon-conditional-flow:before { content: '\e802'; } /* '' */
.bpmn-icon-default-flow:before { content: '\e803'; } /* '' */
.bpmn-icon-gateway-parallel:before { content: '\e804'; } /* '' */
.bpmn-icon-intermediate-event-catch-cancel:before { content: '\e805'; } /* '' */
.bpmn-icon-intermediate-event-catch-non-interrupting-message:before { content: '\e806'; } /* '' */
.bpmn-icon-start-event-compensation:before { content: '\e807'; } /* '' */
.bpmn-icon-start-event-non-interrupting-parallel-multiple:before { content: '\e808'; } /* '' */
.bpmn-icon-loop-marker:before { content: '\e809'; } /* '' */
.bpmn-icon-parallel-mi-marker:before { content: '\e80a'; } /* '' */
.bpmn-icon-start-event-non-interrupting-signal:before { content: '\e80b'; } /* '' */
.bpmn-icon-intermediate-event-catch-non-interrupting-timer:before { content: '\e80c'; } /* '' */
.bpmn-icon-intermediate-event-catch-parallel-multiple:before { content: '\e80d'; } /* '' */
.bpmn-icon-intermediate-event-catch-compensation:before { content: '\e80e'; } /* '' */
.bpmn-icon-gateway-xor:before { content: '\e80f'; } /* '' */
.bpmn-icon-connection:before { content: '\e810'; } /* '' */
.bpmn-icon-end-event-cancel:before { content: '\e811'; } /* '' */
.bpmn-icon-intermediate-event-catch-condition:before { content: '\e812'; } /* '' */
.bpmn-icon-intermediate-event-catch-non-interrupting-parallel-multiple:before { content: '\e813'; } /* '' */
.bpmn-icon-start-event-condition:before { content: '\e814'; } /* '' */
.bpmn-icon-start-event-non-interrupting-timer:before { content: '\e815'; } /* '' */
.bpmn-icon-sequential-mi-marker:before { content: '\e816'; } /* '' */
.bpmn-icon-user-task:before { content: '\e817'; } /* '' */
.bpmn-icon-business-rule:before { content: '\e818'; } /* '' */
.bpmn-icon-sub-process-marker:before { content: '\e819'; } /* '' */
.bpmn-icon-start-event-parallel-multiple:before { content: '\e81a'; } /* '' */
.bpmn-icon-start-event-error:before { content: '\e81b'; } /* '' */
.bpmn-icon-intermediate-event-catch-signal:before { content: '\e81c'; } /* '' */
.bpmn-icon-intermediate-event-catch-error:before { content: '\e81d'; } /* '' */
.bpmn-icon-end-event-compensation:before { content: '\e81e'; } /* '' */
.bpmn-icon-subprocess-collapsed:before { content: '\e81f'; } /* '' */
.bpmn-icon-subprocess-expanded:before { content: '\e820'; } /* '' */
.bpmn-icon-task:before { content: '\e821'; } /* '' */
.bpmn-icon-end-event-error:before { content: '\e822'; } /* '' */
.bpmn-icon-intermediate-event-catch-escalation:before { content: '\e823'; } /* '' */
.bpmn-icon-intermediate-event-catch-timer:before { content: '\e824'; } /* '' */
.bpmn-icon-start-event-escalation:before { content: '\e825'; } /* '' */
.bpmn-icon-start-event-signal:before { content: '\e826'; } /* '' */
.bpmn-icon-business-rule-task:before { content: '\e827'; } /* '' */
.bpmn-icon-manual:before { content: '\e828'; } /* '' */
.bpmn-icon-receive:before { content: '\e829'; } /* '' */
.bpmn-icon-call-activity:before { content: '\e82a'; } /* '' */
.bpmn-icon-start-event-timer:before { content: '\e82b'; } /* '' */
.bpmn-icon-start-event-message:before { content: '\e82c'; } /* '' */
.bpmn-icon-intermediate-event-none:before { content: '\e82d'; } /* '' */
.bpmn-icon-intermediate-event-catch-link:before { content: '\e82e'; } /* '' */
.bpmn-icon-end-event-escalation:before { content: '\e82f'; } /* '' */
.bpmn-icon-text-annotation:before { content: '\e830'; } /* '' */
.bpmn-icon-bpmn-io:before { content: '\e831'; } /* '' */
.bpmn-icon-gateway-complex:before { content: '\e832'; } /* '' */
.bpmn-icon-gateway-eventbased:before { content: '\e833'; } /* '' */
.bpmn-icon-gateway-none:before { content: '\e834'; } /* '' */
.bpmn-icon-gateway-or:before { content: '\e835'; } /* '' */
.bpmn-icon-end-event-terminate:before { content: '\e836'; } /* '' */
.bpmn-icon-end-event-signal:before { content: '\e837'; } /* '' */
.bpmn-icon-end-event-none:before { content: '\e838'; } /* '' */
.bpmn-icon-end-event-multiple:before { content: '\e839'; } /* '' */
.bpmn-icon-end-event-message:before { content: '\e83a'; } /* '' */
.bpmn-icon-end-event-link:before { content: '\e83b'; } /* '' */
.bpmn-icon-intermediate-event-catch-message:before { content: '\e83c'; } /* '' */
.bpmn-icon-intermediate-event-throw-compensation:before { content: '\e83d'; } /* '' */
.bpmn-icon-start-event-multiple:before { content: '\e83e'; } /* '' */
.bpmn-icon-script:before { content: '\e83f'; } /* '' */
.bpmn-icon-manual-task:before { content: '\e840'; } /* '' */
.bpmn-icon-send:before { content: '\e841'; } /* '' */
.bpmn-icon-service:before { content: '\e842'; } /* '' */
.bpmn-icon-receive-task:before { content: '\e843'; } /* '' */
.bpmn-icon-user:before { content: '\e844'; } /* '' */
.bpmn-icon-start-event-none:before { content: '\e845'; } /* '' */
.bpmn-icon-intermediate-event-throw-escalation:before { content: '\e846'; } /* '' */
.bpmn-icon-intermediate-event-catch-multiple:before { content: '\e847'; } /* '' */
.bpmn-icon-intermediate-event-catch-non-interrupting-escalation:before { content: '\e848'; } /* '' */
.bpmn-icon-intermediate-event-throw-link:before { content: '\e849'; } /* '' */
.bpmn-icon-start-event-non-interrupting-condition:before { content: '\e84a'; } /* '' */
.bpmn-icon-data-object:before { content: '\e84b'; } /* '' */
.bpmn-icon-script-task:before { content: '\e84c'; } /* '' */
.bpmn-icon-send-task:before { content: '\e84d'; } /* '' */
.bpmn-icon-data-store:before { content: '\e84e'; } /* '' */
.bpmn-icon-start-event-non-interrupting-escalation:before { content: '\e84f'; } /* '' */
.bpmn-icon-intermediate-event-throw-message:before { content: '\e850'; } /* '' */
.bpmn-icon-intermediate-event-catch-non-interrupting-multiple:before { content: '\e851'; } /* '' */
.bpmn-icon-intermediate-event-catch-non-interrupting-signal:before { content: '\e852'; } /* '' */
.bpmn-icon-intermediate-event-throw-multiple:before { content: '\e853'; } /* '' */
.bpmn-icon-start-event-non-interrupting-message:before { content: '\e854'; } /* '' */
.bpmn-icon-ad-hoc-marker:before { content: '\e855'; } /* '' */
.bpmn-icon-service-task:before { content: '\e856'; } /* '' */
.bpmn-icon-task-none:before { content: '\e857'; } /* '' */
.bpmn-icon-compensation-marker:before { content: '\e858'; } /* '' */
.bpmn-icon-start-event-non-interrupting-multiple:before { content: '\e859'; } /* '' */
.bpmn-icon-intermediate-event-throw-signal:before { content: '\e85a'; } /* '' */
.bpmn-icon-intermediate-event-catch-non-interrupting-condition:before { content: '\e85b'; } /* '' */
.bpmn-icon-participant:before { content: '\e85c'; } /* '' */
.bpmn-icon-event-subprocess-expanded:before { content: '\e85d'; } /* '' */
.bpmn-icon-lane-insert-below:before { content: '\e85e'; } /* '' */
.bpmn-icon-space-tool:before { content: '\e85f'; } /* '' */
.bpmn-icon-connection-multi:before { content: '\e860'; } /* '' */
.bpmn-icon-lane:before { content: '\e861'; } /* '' */
.bpmn-icon-lasso-tool:before { content: '\e862'; } /* '' */
.bpmn-icon-lane-insert-above:before { content: '\e863'; } /* '' */
.bpmn-icon-lane-divide-three:before { content: '\e864'; } /* '' */
.bpmn-icon-lane-divide-two:before { content: '\e865'; } /* '' */
.bpmn-icon-data-input:before { content: '\e866'; } /* '' */
.bpmn-icon-data-output:before { content: '\e867'; } /* '' */
.bpmn-icon-hand-tool:before { content: '\e868'; } /* '' */
.bpmn-icon-group:before { content: '\e869'; } /* '' */
.bpmn-icon-transaction:before { content: '\e8c4'; } /* '' */
public/bpmnjs/vendor/bpmn-font/css/bpmn.css
New file
@@ -0,0 +1,164 @@
@font-face {
  font-family: 'bpmn';
  src: url('../font/bpmn.eot?26374340');
  src: url('../font/bpmn.eot?26374340#iefix') format('embedded-opentype'),
       url('../font/bpmn.woff2?26374340') format('woff2'),
       url('../font/bpmn.woff?26374340') format('woff'),
       url('../font/bpmn.ttf?26374340') format('truetype'),
       url('../font/bpmn.svg?26374340#bpmn') format('svg');
  font-weight: normal;
  font-style: normal;
}
/* Chrome hack: SVG is rendered more smooth in Windozze. 100% magic, uncomment if you need it. */
/* Note, that will break hinting! In other OS-es font will be not as sharp as it could be */
/*
@media screen and (-webkit-min-device-pixel-ratio:0) {
  @font-face {
    font-family: 'bpmn';
    src: url('../font/bpmn.svg?26374340#bpmn') format('svg');
  }
}
*/
 [class^="bpmn-icon-"]:before, [class*=" bpmn-icon-"]:before {
  font-family: "bpmn";
  font-style: normal;
  font-weight: normal;
  speak: never;
  display: inline-block;
  text-decoration: inherit;
  width: 1em;
  /* margin-right: .2em; */
  text-align: center;
  /* opacity: .8; */
  /* For safety - reset parent styles, that can break glyph codes*/
  font-variant: normal;
  text-transform: none;
  /* fix buttons height, for twitter bootstrap */
  line-height: 1em;
  /* Animation center compensation - margins should be symmetric */
  /* remove if not needed */
  /* margin-left: .2em; */
  /* you can be more comfortable with increased icons size */
  /* font-size: 120%; */
  /* Font smoothing. That was taken from TWBS */
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  /* Uncomment for 3D effect */
  /* text-shadow: 1px 1px 1px rgba(127, 127, 127, 0.3); */
}
.bpmn-icon-screw-wrench:before { content: '\e800'; } /* '' */
.bpmn-icon-trash:before { content: '\e801'; } /* '' */
.bpmn-icon-conditional-flow:before { content: '\e802'; } /* '' */
.bpmn-icon-default-flow:before { content: '\e803'; } /* '' */
.bpmn-icon-gateway-parallel:before { content: '\e804'; } /* '' */
.bpmn-icon-intermediate-event-catch-cancel:before { content: '\e805'; } /* '' */
.bpmn-icon-intermediate-event-catch-non-interrupting-message:before { content: '\e806'; } /* '' */
.bpmn-icon-start-event-compensation:before { content: '\e807'; } /* '' */
.bpmn-icon-start-event-non-interrupting-parallel-multiple:before { content: '\e808'; } /* '' */
.bpmn-icon-loop-marker:before { content: '\e809'; } /* '' */
.bpmn-icon-parallel-mi-marker:before { content: '\e80a'; } /* '' */
.bpmn-icon-start-event-non-interrupting-signal:before { content: '\e80b'; } /* '' */
.bpmn-icon-intermediate-event-catch-non-interrupting-timer:before { content: '\e80c'; } /* '' */
.bpmn-icon-intermediate-event-catch-parallel-multiple:before { content: '\e80d'; } /* '' */
.bpmn-icon-intermediate-event-catch-compensation:before { content: '\e80e'; } /* '' */
.bpmn-icon-gateway-xor:before { content: '\e80f'; } /* '' */
.bpmn-icon-connection:before { content: '\e810'; } /* '' */
.bpmn-icon-end-event-cancel:before { content: '\e811'; } /* '' */
.bpmn-icon-intermediate-event-catch-condition:before { content: '\e812'; } /* '' */
.bpmn-icon-intermediate-event-catch-non-interrupting-parallel-multiple:before { content: '\e813'; } /* '' */
.bpmn-icon-start-event-condition:before { content: '\e814'; } /* '' */
.bpmn-icon-start-event-non-interrupting-timer:before { content: '\e815'; } /* '' */
.bpmn-icon-sequential-mi-marker:before { content: '\e816'; } /* '' */
.bpmn-icon-user-task:before { content: '\e817'; } /* '' */
.bpmn-icon-business-rule:before { content: '\e818'; } /* '' */
.bpmn-icon-sub-process-marker:before { content: '\e819'; } /* '' */
.bpmn-icon-start-event-parallel-multiple:before { content: '\e81a'; } /* '' */
.bpmn-icon-start-event-error:before { content: '\e81b'; } /* '' */
.bpmn-icon-intermediate-event-catch-signal:before { content: '\e81c'; } /* '' */
.bpmn-icon-intermediate-event-catch-error:before { content: '\e81d'; } /* '' */
.bpmn-icon-end-event-compensation:before { content: '\e81e'; } /* '' */
.bpmn-icon-subprocess-collapsed:before { content: '\e81f'; } /* '' */
.bpmn-icon-subprocess-expanded:before { content: '\e820'; } /* '' */
.bpmn-icon-task:before { content: '\e821'; } /* '' */
.bpmn-icon-end-event-error:before { content: '\e822'; } /* '' */
.bpmn-icon-intermediate-event-catch-escalation:before { content: '\e823'; } /* '' */
.bpmn-icon-intermediate-event-catch-timer:before { content: '\e824'; } /* '' */
.bpmn-icon-start-event-escalation:before { content: '\e825'; } /* '' */
.bpmn-icon-start-event-signal:before { content: '\e826'; } /* '' */
.bpmn-icon-business-rule-task:before { content: '\e827'; } /* '' */
.bpmn-icon-manual:before { content: '\e828'; } /* '' */
.bpmn-icon-receive:before { content: '\e829'; } /* '' */
.bpmn-icon-call-activity:before { content: '\e82a'; } /* '' */
.bpmn-icon-start-event-timer:before { content: '\e82b'; } /* '' */
.bpmn-icon-start-event-message:before { content: '\e82c'; } /* '' */
.bpmn-icon-intermediate-event-none:before { content: '\e82d'; } /* '' */
.bpmn-icon-intermediate-event-catch-link:before { content: '\e82e'; } /* '' */
.bpmn-icon-end-event-escalation:before { content: '\e82f'; } /* '' */
.bpmn-icon-text-annotation:before { content: '\e830'; } /* '' */
.bpmn-icon-bpmn-io:before { content: '\e831'; } /* '' */
.bpmn-icon-gateway-complex:before { content: '\e832'; } /* '' */
.bpmn-icon-gateway-eventbased:before { content: '\e833'; } /* '' */
.bpmn-icon-gateway-none:before { content: '\e834'; } /* '' */
.bpmn-icon-gateway-or:before { content: '\e835'; } /* '' */
.bpmn-icon-end-event-terminate:before { content: '\e836'; } /* '' */
.bpmn-icon-end-event-signal:before { content: '\e837'; } /* '' */
.bpmn-icon-end-event-none:before { content: '\e838'; } /* '' */
.bpmn-icon-end-event-multiple:before { content: '\e839'; } /* '' */
.bpmn-icon-end-event-message:before { content: '\e83a'; } /* '' */
.bpmn-icon-end-event-link:before { content: '\e83b'; } /* '' */
.bpmn-icon-intermediate-event-catch-message:before { content: '\e83c'; } /* '' */
.bpmn-icon-intermediate-event-throw-compensation:before { content: '\e83d'; } /* '' */
.bpmn-icon-start-event-multiple:before { content: '\e83e'; } /* '' */
.bpmn-icon-script:before { content: '\e83f'; } /* '' */
.bpmn-icon-manual-task:before { content: '\e840'; } /* '' */
.bpmn-icon-send:before { content: '\e841'; } /* '' */
.bpmn-icon-service:before { content: '\e842'; } /* '' */
.bpmn-icon-receive-task:before { content: '\e843'; } /* '' */
.bpmn-icon-user:before { content: '\e844'; } /* '' */
.bpmn-icon-start-event-none:before { content: '\e845'; } /* '' */
.bpmn-icon-intermediate-event-throw-escalation:before { content: '\e846'; } /* '' */
.bpmn-icon-intermediate-event-catch-multiple:before { content: '\e847'; } /* '' */
.bpmn-icon-intermediate-event-catch-non-interrupting-escalation:before { content: '\e848'; } /* '' */
.bpmn-icon-intermediate-event-throw-link:before { content: '\e849'; } /* '' */
.bpmn-icon-start-event-non-interrupting-condition:before { content: '\e84a'; } /* '' */
.bpmn-icon-data-object:before { content: '\e84b'; } /* '' */
.bpmn-icon-script-task:before { content: '\e84c'; } /* '' */
.bpmn-icon-send-task:before { content: '\e84d'; } /* '' */
.bpmn-icon-data-store:before { content: '\e84e'; } /* '' */
.bpmn-icon-start-event-non-interrupting-escalation:before { content: '\e84f'; } /* '' */
.bpmn-icon-intermediate-event-throw-message:before { content: '\e850'; } /* '' */
.bpmn-icon-intermediate-event-catch-non-interrupting-multiple:before { content: '\e851'; } /* '' */
.bpmn-icon-intermediate-event-catch-non-interrupting-signal:before { content: '\e852'; } /* '' */
.bpmn-icon-intermediate-event-throw-multiple:before { content: '\e853'; } /* '' */
.bpmn-icon-start-event-non-interrupting-message:before { content: '\e854'; } /* '' */
.bpmn-icon-ad-hoc-marker:before { content: '\e855'; } /* '' */
.bpmn-icon-service-task:before { content: '\e856'; } /* '' */
.bpmn-icon-task-none:before { content: '\e857'; } /* '' */
.bpmn-icon-compensation-marker:before { content: '\e858'; } /* '' */
.bpmn-icon-start-event-non-interrupting-multiple:before { content: '\e859'; } /* '' */
.bpmn-icon-intermediate-event-throw-signal:before { content: '\e85a'; } /* '' */
.bpmn-icon-intermediate-event-catch-non-interrupting-condition:before { content: '\e85b'; } /* '' */
.bpmn-icon-participant:before { content: '\e85c'; } /* '' */
.bpmn-icon-event-subprocess-expanded:before { content: '\e85d'; } /* '' */
.bpmn-icon-lane-insert-below:before { content: '\e85e'; } /* '' */
.bpmn-icon-space-tool:before { content: '\e85f'; } /* '' */
.bpmn-icon-connection-multi:before { content: '\e860'; } /* '' */
.bpmn-icon-lane:before { content: '\e861'; } /* '' */
.bpmn-icon-lasso-tool:before { content: '\e862'; } /* '' */
.bpmn-icon-lane-insert-above:before { content: '\e863'; } /* '' */
.bpmn-icon-lane-divide-three:before { content: '\e864'; } /* '' */
.bpmn-icon-lane-divide-two:before { content: '\e865'; } /* '' */
.bpmn-icon-data-input:before { content: '\e866'; } /* '' */
.bpmn-icon-data-output:before { content: '\e867'; } /* '' */
.bpmn-icon-hand-tool:before { content: '\e868'; } /* '' */
.bpmn-icon-group:before { content: '\e869'; } /* '' */
.bpmn-icon-transaction:before { content: '\e8c4'; } /* '' */
public/bpmnjs/vendor/bpmn-font/font/bpmn.eot
Binary files differ
public/bpmnjs/vendor/bpmn-font/font/bpmn.svg
New file
@@ -0,0 +1,224 @@
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg xmlns="http://www.w3.org/2000/svg">
<metadata>camunda Services GmbH</metadata>
<defs>
<font id="bpmn" horiz-adv-x="1000" >
<font-face font-family="bpmn" font-weight="400" font-stretch="normal" units-per-em="1000" ascent="850" descent="-150" />
<missing-glyph horiz-adv-x="1000" />
<glyph glyph-name="screw-wrench" unicode="&#xe800;" d="M756 704c-55 0-108-22-147-61-39-39-61-92-61-147 0-55 22-108 61-147 39-39 92-61 147-61 91 0 171 59 198 146l-149-40-116 77 62 124 79 21 78 21c-39 42-94 67-152 67z m-247-278l-461-316c-14-42 32-111 80-114l451 310c-36 31-61 73-70 120z" horiz-adv-x="1000" />
<glyph glyph-name="trash" unicode="&#xe801;" d="M429 743c-58-4-70 11-71-52l0-9-172-56c-20-5-20-29 0-30l624 0c19 0 19 25 0 30l-168 55 0 10c0 62-7 48-71 52l-71 0z m-215-204c-14 0-25-12-24-26l50-555c1-12 11-22 24-22l457 0c13 0 23 9 25 22l64 554c2 15-9 27-24 27l-143 0-143 0z m27-49l259 0 259 0-59-505-414 0z m120-73c-1 0-2 0-3 0-16-1-28-15-25-31l44-320c2-15 16-26 31-24 15 2 25 17 22 32l-44 319c-2 13-12 23-25 24z m280 0c-13 0-25-10-27-24l-44-319c-3-15 7-30 22-32 16-2 29 9 31 24l44 320c3 16-9 30-26 31z" horiz-adv-x="1000" />
<glyph glyph-name="conditional-flow" unicode="&#xe802;" d="M911 749c0 0-285-146-431-214 31-28 60-59 90-89-140-142-77-81-199-205l-209-34-41-247 247 40 3 15 31 194c123 125 60 64 201 206 30-29 60-60 90-90 77 153 218 424 218 424z m-552-552l-27-160-160-27 26 161 161 26z" horiz-adv-x="1000" />
<glyph glyph-name="default-flow" unicode="&#xe803;" d="M911 749c0 0-285-146-431-214 31-28 60-59 90-89-91-93-183-186-275-279l-166 0 0-43 124 0c-42-42-84-84-126-126 11-11 22-21 33-31 52 52 104 105 156 157l175 0 0 43-133 0c82 83 163 166 245 248 30-29 60-60 90-90 77 153 218 424 218 424z" horiz-adv-x="1000" />
<glyph glyph-name="gateway-parallel" unicode="&#xe804;" d="M500 802c-9 0-19-4-26-11l-415-415c-14-14-14-38 0-52l415-415c14-14 38-14 52 0l415 415c14 14 14 38 0 52l-415 415c-7 7-17 11-26 11z m0-62l390-390-390-390-390 390 390 390z m-11-161c0 0-4-1-4-1 0 0-4-3-4-3 0 0-3-4-3-4 0 0-1-4-1-4l0-194-194 0 0 0c0 0-4-1-4-1 0 0-4-3-4-3l0 0c0 0-3-4-3-4 0 0-1-4-1-4l0-21c0 0 1-5 1-5 0 0 3-4 3-4 0 0 4-3 4-3 0 0 4-1 4-1l194 0 0-194 0 0c0 0 1-4 1-4 0 0 3-4 3-4 0 0 4-3 4-3 0 0 4-1 4-1l22 0c0 0 4 1 4 1 0 0 4 3 4 3 0 0 3 4 3 4 0 0 1 4 1 4l0 194 194 0c0 0 4 1 4 1 0 0 4 3 4 3 0 0 3 4 3 4 0 0 1 4 1 4l0 22c0 0-1 4-1 4 0 0-3 4-3 4 0 0-4 3-4 3 0 0-4 1-4 1l-194 0 0 194c0 0-1 4-1 4 0 0-3 4-3 4 0 0-4 3-4 3 0 0-4 1-4 1l-22 0z" horiz-adv-x="1000" />
<glyph glyph-name="intermediate-event-catch-cancel" unicode="&#xe805;" d="M499 802c-220 4-425-177-448-396-24-185 78-380 247-461 160-80 368-56 501 66 134 118 190 318 128 486-57 167-217 293-393 303-12 1-23 2-35 2z m-5-49c202 7 391-161 407-362 19-178-92-361-262-420-166-61-368-2-468 145-103 144-99 356 18 490 74 90 188 146 305 147z m8-44c-186 6-358-158-361-344-9-169 116-334 283-367 155-33 328 46 397 190 71 140 39 327-83 430-64 57-150 91-236 91z m-2-48c164 4 314-144 311-308 3-152-119-297-272-312-143-19-295 73-336 213-43 134 14 295 138 364 48 28 103 43 159 43z m-112-111c-29-30-58-59-87-88 37-38 75-75 112-113-37-36-74-73-110-110 28-29 57-58 86-86 37 37 73 73 110 110 38-37 75-75 113-112 29 29 58 58 88 87-38 38-76 75-113 113 37 37 74 73 110 110-28 29-57 58-86 86-37-36-73-73-110-110-38 37-75 75-113 113z m0-35c38-38 75-75 113-113 37 37 73 74 110 111 17-17 35-35 52-52-37-37-74-73-111-110 38-38 75-75 113-113-18-18-35-35-53-53-38 38-75 75-113 113-36-37-73-74-110-111-17 17-35 35-52 52 37 37 74 74 111 110-38 38-75 76-113 113 18 18 35 35 53 53z" horiz-adv-x="1000" />
<glyph glyph-name="intermediate-event-catch-non-interrupting-message" unicode="&#xe806;" d="M295 506l0-312 410 0 0 312-410 0z m91-49l228 0c-38-30-76-60-114-90-38 30-76 60-114 90z m270-28l0-186-312 0 0 186c52-42 104-83 156-125 52 42 104 83 156 125z m-156 373l0 0-5 0-1 0 0 0-5 0 0 0 0 0-6-1 0 0 0 0-5 0 0 0 0 0-6 0 0 0 0 0-5-1 0 0-1 0-5 0 0 0 0 0-5 0-1 0 0-1-5 0 0 0 0 0-5-1-1 0 0 0-5 0 0 0 0 0-5-1-1 0 0 0-5-1 0 0 0 0-5-1-1 0 0 0-5-1 0 0 0 0-5-1 0 0-1 0-5-1 0 0 0 0-5-1 0 0 0 0-6-2 0 0 0 0-5-1 0 0 0 0-5-1-4-2-4-2-4-3-2-4-3-4-1-4 0-5 0-4 1-4 2-5 3-3 3-3 4-3 4-1 5-1 4 0 4 1 5 1 5 1 4 1 5 1 5 1 5 1 5 1 5 1 5 0 4 1 5 1 5 0 5 1 5 0 5 1 5 0 5 0 5 1 5 0 5 0 5 0 5 0 5 0 5 0 5-1 5 0 5 0 5-1 5 0 5-1 5 0 5-1 5-1 4 0 5-1 5-1 5-1 5-1 4-1 5 0 4 0 5 1 4 2 3 3 4 3 2 4 2 4 1 4 0 5-1 4-2 5-2 4-3 3-4 3-4 2-3 1-5 1 0 0 0 0-5 1 0 0-1 0-5 1 0 0 0 0-5 1 0 0 0 0-6 1 0 0 0 0-5 1 0 0 0 0-6 1 0 0 0 0-5 0 0 0 0 0-6 1 0 0 0 0-5 0 0 1 0 0-6 0 0 0 0 0-5 0 0 0-1 0-5 1 0 0 0 0-5 0-1 0 0 0-5 0 0 0 0 0-6 1 0 0 0 0-5 0 0 0 0 0-6 0 0 0z m255-83l-5 0-4-1-5-2-3-2-4-4-2-3-2-4-1-5-1-4 1-5 1-4 3-4 3-4 2-2 2-1 4-3 4-3 4-3 3-3 4-4 4-3 4-3 3-3 4-4 4-3 3-4 4-3 3-4 4-3 3-4 4-4 3-3 3-4 3-4 4-4 3-3 3-4 3-4 3-4 3-4 3-4 2-4 3-4 3-5 3-4 2-4 3-4 2-4 3-5 2-4 2-4 3-5 2-4 1-2 2-4 4-3 3-3 4-2 5-1 4-1 5 1 4 1 4 2 4 3 3 3 2 4 2 4 0 5 0 4-1 5-1 3-1 3 0 0 0 0-3 5 0 0 0 0-2 5 0 0-1 0-2 4 0 1 0 0-3 4 0 0 0 1-2 4-1 0 0 0-2 5 0 0 0 0-3 5 0 0 0 0-3 4 0 0 0 0-3 5 0 0 0 0-3 5 0 0 0 0-3 4 0 0 0 0-3 5 0 0-1 0-3 4 0 0 0 0-3 5 0 0 0 0-3 4 0 0 0 0-4 4 0 1 0 0-3 4 0 0 0 0-3 4-1 0 0 0-3 4 0 1 0 0-4 4 0 0 0 0-3 4 0 0-1 0-3 4 0 0 0 0-4 4 0 0 0 0-4 4 0 0 0 1-4 3 0 0 0 1-3 3-1 0 0 1-3 3-1 0 0 0-3 4-1 0 0 0-4 4 0 0 0 0-4 4 0 0 0 0-4 3 0 1 0 0-4 3 0 0 0 0-4 4 0 0-1 0-4 3 0 0 0 1-4 3 0 0 0 0-4 3 0 0-1 0-4 4 0 0 0 0-4 3 0 0 0 0-2 1-4 3-4 1-4 1z m-519-10l-5 0-4-1-4-2-4-2-1-1 0 0 0 0-4-3 0-1 0 0-4-3 0 0-1 0-4-4 0 0 0 0-4-3 0 0 0-1-4-3 0 0 0 0-4-4 0 0 0 0-4-4 0 0 0 0-4-4 0 0 0 0-4-3 0-1 0 0-4-3 0-1 0 0-4-3 0-1 0 0-4-4 0 0 0 0-4-4 0 0 0 0-3-4 0 0-1 0-3-4 0 0 0 0-4-4 0 0 0-1-3-4 0 0 0 0-4-4 0 0 0 0-3-4 0 0 0-1-4-4 0 0 0 0-3-4 0 0 0 0-3-5 0 0 0 0-3-4 0 0-1 0-3-5 0 0 0 0-3-4 0 0 0 0-3-5 0 0 0 0-3-5 0 0 0 0-3-4 0 0 0 0-2-5-1 0 0 0-2-5 0 0 0 0-3-4 0-1 0 0-3-4 0 0 0-1-2-4 0 0 0 0-3-5 0 0 0 0-2-5 0 0-1 0-2-5 0 0 0 0-2-5 0 0 0 0-3-5 0 0 0 0-1-3-1-4-1-5 0-4 1-5 2-4 3-4 3-3 4-2 4-2 4-1 5 0 4 0 5 2 3 2 4 3 3 4 2 3 1 3 2 4 2 5 2 4 2 4 3 5 2 4 2 4 3 5 2 4 3 4 3 4 2 4 3 5 3 4 2 4 3 4 3 4 3 4 3 4 3 4 3 3 4 4 3 4 3 4 3 3 4 4 3 4 4 3 3 4 4 3 3 4 4 3 4 4 3 3 4 3 4 3 4 4 4 3 1 1 3 3 3 3 2 5 1 4 0 4-1 5-1 4-2 4-3 4-4 3-4 2-4 2-4 0z m264 0l0 0-4 0 0 0-1 0-4 0 0 0 0 0-4 0 0 0 0 0-5 0 0-1 0 0-4 0 0 0 0 0-4 0-1 0 0 0-4 0 0 0 0 0-4-1 0 0-1 0-1 0-4-1-5-2-3-2-4-3-2-4-2-4-2-4 0-5 1-4 1-5 2-4 3-3 4-3 4-3 4-1 4-1 4 0 1 1 4 0 4 0 4 1 4 0 3 0 4 0 4 0 4 0 4 0 4 0 4 0 3 0 4 0 4-1 4 0 4 0 3-1 4 0 4-1 4 0 4-1 3-1 4 0 4-1 4-1 3 0 4-1 4-1 3-1 4-1 4-1 3-1 4-1 3-2 4-1 4-1 3-1 4-2 3-1 4-1 3-2 0 0 0 0 4-1 5-1 5 0 4 1 4 2 4 3 3 3 2 4 2 4 1 5 0 4 0 5-2 4-2 4-3 3-4 3-3 2 0 0-1 0 0 0-3 2-1 0 0 0-4 1 0 0 0 0-4 2 0 0 0 0-4 1 0 0 0 0-4 2 0 0 0 0-4 1 0 0 0 0-4 2 0 0 0 0-4 1 0 0-1 0-3 1-1 0 0 0-4 2 0 0 0 0-4 1 0 0 0 0-4 1 0 0 0 0-4 1 0 0-1 0-4 1 0 0 0 0-4 1 0 0 0 0-4 1 0 0 0 0-4 1-1 0 0 0-4 1 0 0 0 0-4 1 0 0 0 0-4 0-1 0 0 0-4 1 0 0 0 0-4 1 0 0 0 0-5 0 0 0 0 0-4 1 0 0 0 0-4 0 0 0-1 0-4 1 0 0 0 0-4 0 0 0 0 0-5 0 0 0 0 0-4 0 0 0 0 1-4 0-1 0 0 0-4 0 0 0 0 0-4 0 0 0-1 0-4 0 0 0z m-155-39l-4 0-5-1-3-1-2-1 0 0 0 0-4-2 0 0 0 0-3-2-1-1 0 0-3-2 0 0-1 0-3-2 0 0 0 0-4-2 0 0 0 0-4-2 0-1 0 0-3-2 0 0-1 0-3-2 0 0 0 0-4-3 0 0 0 0-3-2 0 0 0 0-4-3 0 0 0 0-3-2 0 0-1-1-3-2 0 0 0 0-3-3 0 0-1 0-3-2 0-1 0 0-3-2 0 0-1 0-3-3 0 0 0 0-3-3 0 0 0 0-3-3-1 0 0 0-3-3 0 0 0 0-3-3 0 0 0 0-3-3 0 0 0 0-3-3-1 0 0 0-3-3 0 0 0 0-3-3 0 0 0 0-3-3 0-1 0 0-3-3 0 0 0 0-3-3 0 0 0 0-3-3 0 0 0 0-3-4 0 0 0 0-3-3 0 0 0 0-2-3-1 0 0-1-2-3 0 0 0 0-3-3 0 0 0-1-3-3 0 0 0 0-2-3 0 0-1-1-2-3 0 0 0 0-2-3-1-1 0 0-2-3 0 0 0 0-2-4-1 0 0 0-2-3-2-4-1-4-1-5 1-4 1-5 2-4 3-3 3-4 4-2 4-2 4-1 5 0 4 1 5 2 4 2 3 3 2 3 2 3 2 3 2 3 3 3 2 4 2 3 2 3 3 3 2 3 3 2 2 3 3 3 2 3 3 3 2 3 3 3 3 2 3 3 2 3 3 2 3 3 3 2 3 3 3 2 3 3 3 2 3 3 3 2 3 2 3 3 3 2 3 2 3 2 3 2 3 2 4 2 3 2 3 2 3 2 4 2 3 2 2 0 3 3 4 3 2 4 2 4 1 4 1 5-1 4-1 5-3 4-2 3-4 3-4 2-4 2-5 0z m393-59l-5-1-4-1-4-1-4-3-3-3-3-4-1-4-1-5-1-4 1-5 2-4 2-4 2-3 3-2 3-3 2-3 3-3 2-3 3-3 2-3 3-2 2-3 3-3 2-3 2-3 3-4 2-3 2-3 2-3 2-3 2-3 2-4 2-3 2-3 2-3 2-4 2-3 1-3 2-4 2-3 1-3 2-4 2-3 1-4 1-3 2-4 1-3 2-4 1-3 1-4 1-4 2-3 1-4 1-3 0-3 2-4 2-4 4-3 3-3 4-2 5-1 4 0 5 0 4 1 4 3 4 2 3 4 2 4 2 4 0 5 0 4-1 4 0 2 0 0 0 0-2 4 0 0 0 1-1 3 0 1 0 0-1 4 0 0 0 0-2 4 0 0 0 0-1 4 0 0 0 0-2 4 0 0 0 0-1 4 0 0 0 0-2 4 0 0 0 0-1 4 0 0 0 1-2 3 0 0 0 1-2 3 0 0 0 1-2 3 0 0 0 1-1 3 0 0-1 1-1 3 0 0 0 0-2 4 0 0 0 0-2 4 0 0 0 0-2 4 0 0 0 0-2 4 0 0-1 0-1 4-1 0 0 0-2 3 0 1 0 0-2 3 0 0 0 0-2 4 0 0 0 0-2 4-1 0 0 0-2 3 0 0 0 1-2 3 0 0 0 0-3 4 0 0 0 0-2 3 0 0 0 1-3 3 0 0 0 0-2 3 0 1-1 0-2 3 0 0 0 0-3 3 0 1 0 0-2 3-1 0 0 0-2 3 0 1 0 0-3 3 0 0 0 0-3 3 0 0 0 0-3 4 0 0 0 0-3 3 0 0 0 0-3 3 0 0 0 0-3 3 0 0 0 1-3 3 0 0 0 0-3 2-3 3-4 3-5 1-4 1z m-564-171l-5 0-4-1-4-2-4-2-3-4-3-3-2-4-1-4-1-4 0 0 0 0 0-4 0 0-1 0 0-4 0-1 0 0-1-4 0 0 0 0-1-4 0 0 0 0 0-5 0 0 0 0-1-4 0 0 0 0 0-4 0 0 0-1 0-4 0 0-1 0 0-4 0 0 0 0 0-5 0 0 0 0 0-4 0 0 0 0-1-4 0-1 0 0 0-4 0 0 0 0 0-4 0 0 0-1 0-4 0 0 0 0 0-4 0 0 0-1 0-4 0 0 0 0 0-4 0 0 0 0 1-5 0 0 0 0 0-4 0 0 0 0 0-4 0-1 0 0 0-4 1 0 0 0 0-4 0 0 0-1 0-4 0 0 0 0 1-4 0 0 0 0 0-4 0-1 0 0 1-4 0 0 0 0 1-4 0 0 0 0 0-4 1-1 0 0 0-4 0 0 0 0 1-4 0 0 0 0 1-4 0-1 0 0 1-4 0 0 0 0 1-4 0 0 0 0 1-4 0 0 0-1 1-4 0 0 0 0 1-4 0 0 0 0 1-4 0 0 0 0 2-4 0 0 0 0 1-4 0-1 0 0 1-1 1-4 3-4 3-3 4-3 4-2 4-1 5 0 4 1 5 1 4 2 3 3 3 4 2 4 2 4 0 5 0 4-1 4 0 1-2 4-1 4-1 3-1 4-1 3-1 4 0 4-1 4-1 3-1 4 0 4-1 4-1 3 0 4-1 4 0 4 0 3-1 4 0 4 0 4-1 4 0 4 0 3 0 4 0 4 0 4 0 4 0 4 0 3 1 4 0 4 0 4 1 4 0 3 0 4 1 4 0 4 1 4 1 3 0 4 1 4 0 4 0 5-1 4-2 4-3 4-3 3-4 2-5 2-4 1z m754-46l-5 0-4-1-4-2-4-2-3-4-3-4-2-4 0-4-1-4 1-4 0-5 0-5 0-5 0-5 0-5 0-5-1-5 0-5 0-5-1-5 0-5-1-5 0-5-1-5-1-4 0-5-1-5-1-5-1-5-1-5-1-5-1-4-1-5-1-5-2-5-1-4-2-5-1-5-1-4-2-5-2-5-1-4-2-5-2-4-2-5-2-5-2-4-2-5-2-4-2-4-2-5-2-4-2-5-1-4 0-5 1-4 2-4 2-4 3-4 4-2 4-2 4-2 5 0 4 1 5 1 4 2 3 3 3 3 2 3 3 5 0 0 0 0 2 5 0 0 0 0 2 5 0 0 0 0 3 5 0 0 0 0 2 5 0 0 0 0 2 5 0 0 0 0 2 5 0 0 0 0 2 5 0 0 0 0 2 5 0 0 0 1 2 4 0 1 0 0 2 5 0 0 0 0 2 5 0 0 0 0 2 5 0 0 0 0 2 5 0 0 0 1 1 5 0 0 0 0 2 5 0 0 0 0 1 5 0 0 0 0 2 5 0 1 0 0 1 5 0 0 0 0 1 5 0 0 0 0 2 6 0 0 0 0 1 5 0 0 0 0 1 5 0 1 0 0 1 5 0 0 0 0 1 5 0 0 0 1 1 5 0 0 0 0 1 5 0 0 0 1 1 5 0 0 0 0 0 5 0 0 0 1 1 5 0 0 0 0 0 5 1 0 0 1 0 5 0 0 0 0 0 5 0 1 0 0 1 5 0 0 0 0 0 6 0 0 0 0 0 5 0 0 0 0 1 6 0 0 0 0 0 5 0 0 0 1 0 5 0 0 0 0 0 6 0 0 0 0 0 5 0 0 0 0-1 6 0 0 0 0 0 4 0 5-2 4-2 4-3 3-4 3-4 2-4 2-4 0z m-853-16l-5 0-4-1-4-1-4-3-4-3-2-4-2-4-1-4-1-4 0-4 0 0 0 0 0-5 0-1 0 0 1-5 0 0 0 0 0-6 0 0 0 0 0-5 0 0 0 0 0-6 0 0 0 0 1-5 0 0 0-1 0-5 0 0 0 0 1-5 0-1 0 0 0-5 0 0 0 0 1-5 0-1 0 0 1-5 0 0 0 0 0-5 0-1 0 0 1-5 0 0 0 0 1-5 0-1 0 0 1-5 0 0 0 0 1-5 0 0 0-1 1-5 0 0 0 0 1-5 0 0 0 0 2-6 0 0 0 0 1-5 0 0 0 0 1-5 0 0 0-1 2-5 0 0 0 0 1-5 0 0 0 0 2-5 0 0 0 0 2-5 0-1 0 0 1-5 0 0 0 0 2-5 0 0 0 0 2-5 0 0 0 0 2-5 0 0 0-1 2-4 0-1 0 0 2-5 0 0 0 0 2-5 0 0 0 0 2-5 0 0 0 0 2-5 0 0 0 0 2-5 0 0 0 0 3-5 0 0 0 0 2-5 0 0 0 0 2-5 1 0 0 0 0-1 3-4 3-3 3-3 4-2 5-1 4 0 5 0 4 1 4 3 4 2 3 4 2 4 2 4 0 5 0 4-1 5-1 3-1 1-2 5-2 4-2 4-2 5-2 4-2 5-2 5-2 4-2 5-1 4-2 5-1 5-2 4-1 5-2 5-1 4-1 5-2 5-1 5-1 4-1 5-1 5-1 5-1 5-1 5 0 5-1 4-1 5 0 5-1 5 0 5-1 5 0 5 0 5-1 5 0 5 0 5 0 5 0 4 0 4-1 5-2 4-3 3-4 4-3 2-5 2-4 0z m756-57l-4 0-5-1-4-2-4-3-3-3-2-4-2-4-1-3 0 0 0 0 0 0 0 0-1-4 0-4-1-4-1-3 0-4-1-4-1-4-1-3-1-4-1-3-1-4-1-4-2-3-1-4-1-3-1-4-2-4-1-3-2-4-1-3-1-4-2-3-2-3-1-4-2-3-2-4-1-3-2-3-2-4-2-3-2-3-2-3-2-4-2-3-2-3-2-3-2-3-2-3-3-3-2-3-2-4-2-1-2-4-2-4-1-5 0-4 1-5 2-4 2-4 3-3 4-3 4-2 4-1 5-1 4 1 4 1 5 2 3 3 3 3 1 1 0 1 0 0 3 3 0 0 0 0 2 3 1 1 0 0 2 3 0 0 0 0 3 4 0 0 0 0 2 3 0 0 0 0 3 4 0 0 0 0 2 3 0 1 0 0 2 3 0 0 1 0 2 4 0 0 0 0 2 4 0 0 0 0 2 3 0 1 0 0 2 3 0 0 1 1 2 3 0 0 0 0 2 4 0 0 0 0 2 4 0 0 0 0 2 4 0 0 0 0 2 4 0 0 0 0 1 4 1 0 0 0 1 4 0 0 0 0 2 4 0 0 0 0 2 4 0 0 0 0 2 4 0 0 0 0 1 4 0 0 0 0 2 4 0 0 0 0 1 4 0 0 0 0 2 4 0 0 0 0 1 4 0 0 0 0 2 4 0 0 0 0 1 4 0 0 0 1 1 4 0 0 0 0 2 4 0 0 0 0 1 4 0 0 0 0 1 4 0 0 0 0 1 4 0 1 0 0 1 4 0 0 0 0 1 4 0 0 0 0 1 4 0 0 0 1 1 4 0 0 0 0 1 4 0 0 0 0 1 4 0 0 0 1 0 4 0 0 0 0 0 0 1 5-1 4-1 4-2 4-3 4-4 3-4 2-4 2-5 0z m-590-160l-4-1-4-2-4-2-4-3-3-3-2-4-1-5-1-4 1-5 1-4 2-4 2-3 1-2 0 0 0 0 3-3 0 0 0 0 3-3 0-1 0 0 3-3 0 0 0 0 3-3 0 0 0 0 3-3 0 0 0 0 3-3 0-1 0 0 3-3 0 0 0 0 3-3 0 0 1 0 3-3 0 0 0 0 3-3 0 0 0 0 3-3 0 0 0 0 3-3 0 0 1 0 3-3 0 0 0 0 3-3 0 0 0 0 3-2 1-1 0 0 3-2 0 0 0 0 3-3 1 0 0 0 3-3 0 0 0 0 3-2 1 0 0-1 3-2 0 0 0 0 4-2 0-1 0 0 3-2 0 0 0 0 4-2 0-1 0 0 3-2 1 0 0 0 3-2 0 0 0 0 4-3 0 0 0 0 4-2 0 0 0 0 3-2 1 0 0 0 3-2 0 0 1 0 3-2 0 0 0-1 4-1 0-1 0 0 4-2 0 0 0 0 4-2 0 0 0 0 4-1 0-1 0 0 4-1 0 0 0 0 4-2 0 0 0 0 4-2 0 0 0 0 4-2 0 0 0 0 4-1 0-1 0 0 4-1 0 0 0 0 4-2 4-1 4 0 5 0 4 1 4 2 4 3 3 4 2 3 2 5 1 4 0 5-1 4-2 4-2 4-4 3-3 3-4 2-3 1-4 2-3 1-4 2-3 1-3 2-4 1-3 2-4 2-3 2-3 1-4 2-3 2-3 2-3 2-4 2-3 2-3 2-3 2-3 2-3 3-3 2-4 2-3 2-2 3-3 2-3 3-3 2-3 3-3 2-3 3-3 2-2 3-3 3-3 3-3 2-2 3-3 3-2 3-3 3-2 3-1 1-4 3-3 3-5 1-4 1-5 1z m426-77l-5 0-4-1-4-2-1-1-4-2-3-1-3-2-4-2-3-2-3-1-4-2-3-1-4-2-3-1-4-2-3-1-4-2-3-1-4-1-4-1-3-1-4-2-3-1-4-1-4-1-3-1-4-1-4 0-3-1-4-1-4-1-4 0-3-1-4-1-4 0-4-1-3 0-4 0-4-1-4 0-4 0-4-1-3 0-4 0-4 0-5 0-4-2-4-2-4-3-3-3-2-4-1-4-1-5 0-5 1-4 2-4 2-4 4-3 3-3 4-2 5-1 4 0 4 0 0 0 0 0 4 0 0 0 1 0 4 1 0 0 0 0 4 0 0 0 0 0 5 0 0 0 0 0 4 0 0 0 0 0 4 1 1 0 0 0 4 0 0 0 0 0 4 1 0 0 0 0 5 0 0 0 0 0 4 1 0 0 0 0 4 1 0 0 1 0 4 0 0 0 0 0 4 1 0 0 0 0 4 1 0 0 1 0 4 1 0 0 0 0 4 1 0 0 0 0 4 1 0 0 0 0 4 1 1 0 0 0 4 1 0 0 0 0 4 1 0 0 0 0 4 1 0 0 0 0 4 2 0 0 1 0 3 1 1 0 0 0 4 1 0 0 0 0 4 2 0 0 0 0 4 1 0 0 0 0 4 2 0 0 0 0 4 1 0 0 0 0 4 2 0 0 0 0 4 1 0 0 1 1 3 1 0 0 1 0 3 2 0 0 1 0 3 2 0 0 1 0 3 2 0 0 1 0 3 1 0 0 0 1 4 1 0 0 0 0 4 2 0 0 0 0 4 2 0 0 0 1 4 1 0 1 0 0 4 2 0 0 0 0 2 1 3 2 4 4 2 3 2 5 1 4 0 5-1 4-1 4-3 4-3 4-3 3-4 2-5 1-4 0z m-440-39l-4-1-5-1-4-3-3-3-3-3-2-4-1-5-1-4 0-5 1-4 2-4 3-4 3-2 1-1 0 0 0 0 4-4 0 0 0 0 4-3 0 0 1 0 4-4 0 0 0 0 4-3 0 0 0 0 5-3 0 0 0 0 4-3 0-1 0 0 5-3 0 0 0 0 4-3 0 0 1 0 4-3 0 0 0 0 5-3 0 0 0 0 4-3 0 0 1 0 4-3 0 0 0 0 5-2 0 0 0-1 5-2 0 0 0 0 4-3 1 0 0 0 4-2 0 0 0-1 5-2 0 0 0 0 5-3 0 0 0 0 5-2 0 0 0 0 5-2 0 0 0 0 5-3 0 0 0 0 5-2 0 0 0 0 5-2 0 0 0 0 5-2 0 0 0 0 5-2 0 0 0 0 5-2 0 0 1 0 4-2 1 0 0 0 5-2 0 0 0 0 5-2 0 0 0 0 5-2 0 0 0 0 5-2 0 0 1 0 5-1 0 0 0 0 5-2 0 0 0 0 5-1 0 0 0 0 5-2 1 0 0 0 5-1 0 0 0 0 5-1 0 0 0 0 6-2 0 0 0 0 4-1 5 0 4 0 5 1 4 2 4 3 3 3 2 4 2 4 1 5 0 4-1 5-1 4-3 4-3 3-4 3-4 2-3 1-5 1-4 1-5 1-5 1-5 2-4 1-5 2-5 1-4 2-5 1-5 2-4 1-5 2-5 2-4 2-5 2-4 2-5 2-4 2-5 2-4 2-4 2-5 3-4 2-4 2-5 3-4 2-4 3-4 3-4 2-4 3-5 3-4 2-4 3-4 3-4 3-3 3-4 3-4 3-1 1-4 3-4 1-4 1-5 1z m543-3l-5 0-4-1-5-2-3-2-1-2-4-3-4-3-4-3-4-3-4-3-4-2-4-3-5-3-4-2-4-3-4-3-4-2-5-3-4-2-4-2-5-3-4-2-4-2-5-2-4-2-5-2-4-2-5-2-4-2-5-2-4-2-5-1-5-2-4-1-5-2-5-1-5-2-4-1-5-2-5-1-5-1-4-1-5-1-3-1-5-1-4-2-3-3-3-3-2-4-2-5-1-4 0-5 1-4 2-4 3-4 3-3 4-3 4-2 4-1 5 0 4 0 3 1 0 0 0 0 5 1 0 0 1 0 5 2 0 0 0 0 5 1 0 0 0 0 5 1 0 0 1 0 5 2 0 0 0 0 5 1 0 0 0 0 5 2 0 0 1 0 5 1 0 0 0 0 5 2 0 0 0 0 5 2 0 0 0 0 5 2 0 0 0 0 5 2 1 0 0 0 5 2 0 0 0 0 5 2 0 0 0 0 5 2 0 0 0 0 5 2 0 0 0 0 5 2 0 0 0 0 5 2 0 0 0 0 5 3 0 0 0 0 5 2 0 0 0 0 5 2 0 0 0 0 5 3 0 0 0 0 5 2 0 1 0 0 4 2 1 0 0 0 4 3 0 0 1 0 4 2 0 1 0 0 5 2 0 0 0 0 5 3 0 0 0 0 4 3 0 0 0 0 5 3 0 0 0 0 5 3 0 0 0 0 4 3 0 0 0 0 5 3 0 0 0 1 4 3 0 0 0 0 5 3 0 0 0 0 4 3 0 0 0 0 4 4 1 0 0 0 4 3 0 0 0 0 2 2 3 3 3 4 2 4 1 4 0 5-1 4-1 5-2 4-3 3-4 3-4 2-4 2-4 0z" horiz-adv-x="1000" />
<glyph glyph-name="start-event-compensation" unicode="&#xe807;" d="M500 802c-178 2-349-112-416-276-70-161-34-362 89-487 119-128 314-175 477-115 169 58 294 224 301 403 12 176-92 351-250 428-62 31-132 47-201 47z m0-49c175 3 342-123 388-293 47-159-17-344-155-439-143-105-354-97-489 18-136 109-185 309-115 468 60 147 212 248 371 246z m-16-255c-70-49-140-99-209-148 70-49 139-99 209-148 0 48 0 95 0 143 67-48 135-95 202-143 0 99 0 197 0 296-67-48-135-95-202-143 0 48 0 95 0 143z m-24-47c0-67 0-134 0-201-48 33-95 67-143 100 48 34 95 67 143 101z m202 0c0-67 0-134 0-202-48 34-95 68-143 101 48 34 95 67 143 101z" horiz-adv-x="1000" />
<glyph glyph-name="start-event-non-interrupting-parallel-multiple" unicode="&#xe808;" d="M430 545l0-125-125 0 0-140 125 0 0-125 140 0 0 125 125 0 0 140-125 0 0 125z m23-23l94 0 0-125 125 0 0-94-125 0 0-125-94 0 0 126-125 0 0 93 125 0z m51 278l-7 0 0 0 0 0-6 0 0 0 0 0-7 0 0 0 0 0-6-1 0 0-1 0-6 0 0 0 0 0-6 0-1 0 0 0-6-1 0 0 0 0-6-1-1 0 0 0-6 0 0 0 0 0-6-1-1 0 0 0-6-1 0 0 0 0-6-1-1 0 0 0-6-1 0 0 0 0-6-1-1 0 0 0-6-1 0-1 0 0-6-1 0 0-1 0-6-1 0 0 0 0-6-2 0 0 0 0-4-1-4-1-4-2-3-3-3-4-2-4-2-4 0-5 0-4 1-5 2-4 3-4 3-3 4-2 5-2 4-1 5 0 3 1 3 1 6 1 6 1 6 2 5 1 6 1 6 1 6 1 6 0 6 1 5 1 6 0 6 1 6 0 6 1 6 0 6 0 6 0 6 0 6 0 5 0 6 0 6-1 6 0 6-1 6 0 6-1 5 0 6-1 6-1 6-1 6-1 5-1 2 0 4-1 5 0 4 2 4 2 4 2 3 4 3 3 1 5 1 4 0 5-1 4-1 4-3 4-3 4-3 2-5 2-3 1-2 1 0 0 0 0-6 1 0 0-1 0-6 1 0 0 0 0-6 1 0 0-1 0-6 1 0 0 0 0-6 1 0 0 0 0-7 1 0 0 0 0-6 0 0 1-1 0-6 0 0 0 0 0-6 1 0 0-1 0-6 0 0 0 0 0-6 0-1 0 0 0-6 1 0 0 0 0-6 0-1 0 0 0-6 0 0 0z m246-79l-5-1-4-1-4-3-3-3-3-4-1-4-2-4 0-5 1-4 1-5 2-4 3-3 3-3 2-1 0 0 2-2 0 0 3-1 0 0 2-2 0 0 2-2 2-2 0 0 3-2 0 0 2-1 2-2 0 0 2-2 3-2 0 0 2-2 2-2 0 0 2-2 2-2 1 0 2-2 2-2 2-2 0 0 2-2 0 0 2-2 0 0 2-2 2-2 0 0 2-3 0 0 2-2 2-2 0 0 2-2 2-2 0 0 2-3 0 0 2-2 2-2 2-2 0 0 2-3 2-2 2-2 0-1 1-2 0 0 2-2 0 0 2-3 0 0 1 0 2-4 3-3 2-4 3-3 2-3 3-4 2-3 2-4 0 0 3-3 2-4 2-4 3-3 2-4 2-3 2-4 2-4 2-3 2-4 2-4 1-2 3-4 3-4 3-2 4-2 5-2 4 0 5 1 4 1 4 2 4 3 3 3 2 4 2 4 0 5 0 5-1 4-1 3-2 3 0 0 0 0-2 4 0 0 0 1-2 4 0 0 0 0-2 4 0 0 0 0-2 4-1 0 0 0-2 4 0 0 0 0-2 4 0 0 0 0-3 4 0 0 0 0-2 4 0 0 0 0-3 4 0 0 0 0-2 4 0 0 0 0-3 4 0 0 0 0-2 4 0 0-1 0-2 4 0 0 0 0-3 4 0 0 0 0-3 4 0 0 0 0-2 3 0 1-1 0-2 3 0 0 0 0-3 4 0 0 0 0-3 3-2 3 0 0 0 0-2 3 0 0 0 0-2 2 0 0 0 0-2 3 0 0 0 0-2 3 0 0 0 0-2 2 0 0 0 0-2 3 0 0 0 0-3 3 0 0 0 0-2 2 0 0 0 0-2 3 0 0 0 0-2 2 0 0 0 0-3 3 0 0 0 0-2 2 0 0 0 0-2 3 0 0 0 0-2 2-1 0 0 0-2 3 0 0 0 0-2 2 0 0 0 0-3 3 0 0 0 0-2 2 0 0 0 0-2 2 0 0-1 0-2 3 0 0 0 0-2 2 0 0 0 0-3 2 0 0 0 0-2 2 0 0 0 0-3 3 0 0 0 0-2 2 0 0 0 0-3 2 0 0 0 0-2 2 0 0 0 0-3 2 0 0 0 0-2 2-1 0 0 1-2 1 0 1 0 0-3 2 0 0 0 0-2 2 0 0 0 0-3 2 0 0 0 0-3 2 0 0 0 0-2 2 0 0 0 0-2 1-4 2-4 2-5 0z m-521-12l-5-1-4-2-3-2 0 0 0 0-1 0-2-2 0 0 0 0-3-2 0 0 0 0-2-2 0 0 0 0-3-2 0 0 0 0-2-2 0 0 0-1-3-2 0 0 0 0-2-2 0 0 0 0-3-2 0 0 0 0-2-2 0 0 0 0-3-2 0-1 0 0-2-2 0 0 0 0-2-2 0 0-1 0-2-2 0 0 0-1-2-2 0 0 0 0-3-2 0 0 0 0-2-3 0 0 0 0-2-2 0 0 0 0-2-2-1 0 0-1-2-2 0 0 0 0-2-2 0 0 0-1-2-2 0 0 0 0-2-2-1 0 0-1-2-2 0 0 0 0-2-3 0 0 0 0-2-2 0 0 0 0-2-3 0 0 0 0-2-2 0 0 0-1-2-2-1 0 0 0-2-3 0 0 0 0-2-2 0 0 0-1-2-2 0 0 0 0-2-3 0 0 0 0-2-3 0 0 0 0-2-2 0-1 0 0-2-2 0 0 0 0-2-3 0 0 0 0-2-3 0 0 0 0-1-3 0 0-1 0-1-3 0 0 0 0-2-2-1-2 0 0 0 0-2-3 0 0 0 0-2-2 0-1 0 0-2-2 0 0 0 0-2-3 0 0 0 0-2-3 0 0 0 0-2-3 0 0 0 0-2-3 0 0 0 0-2-3 0 0 0 0-1-3 0 0 0 0-2-2 0-1 0 0-2-2 0 0 0-1-2-2 0 0 0 0-1-3 0 0 0 0-2-3 0 0 0 0-2-3 0 0 0 0-1-3 0 0 0 0-2-3 0 0 0 0-1-3 0 0 0 0-2-3 0 0 0 0-1-3 0 0 0 0-2-3 0 0 0 0-1-3 0 0 0 0-2-3 0 0 0 0 0-1-2-4 0-5 0-4 1-5 2-4 2-4 4-3 3-3 5-1 4-1 5-1 4 1 4 2 4 2 4 3 3 3 1 4 1 0 1 3 1 3 0 0 1 2 0 0 2 3 1 3 0 0 2 2 0 0 1 3 1 2 0 1 2 2 1 3 0 0 2 2 0 0 1 3 2 2 0 0 1 3 2 2 1 3 0 0 2 3 0 0 2 2 0 0 1 2 2 3 2 2 0 0 1 3 2 2 2 3 1 1 0 0 2 3 1 2 0 0 2 3 2 2 0 0 1 3 2 2 0 0 2 3 0 0 2 2 1 3 2 2 0 0 2 2 2 3 2 2 0 0 2 2 1 3 2 2 0 0 2 2 2 2 0 0 2 3 0 0 2 2 0 0 2 2 0 0 2 2 2 2 0 0 2 2 0 0 2 3 0 0 2 2 2 2 0 0 2 2 3 2 0 0 2 2 2 2 0 0 2 2 0 0 2 2 0 0 2 2 0 0 3 1 0 0 2 2 0 0 2 2 0 0 2 2 3 2 0 0 2 2 0 0 0 0 3 3 3 4 2 4 1 4 0 5 0 4-2 5-2 4-3 3-3 3-4 2-4 2-5 1z m694-313l-4-1-5-2-3-2-3-4-3-4-2-4-1-4 0-4 1-4 0-4 0-4 0-5 0-4 0 0 0-1 0-3 0-3 0 0 0-3 0 0 0-3 0-3 0 0 0-3 0 0 0-3 0-3 0-3 0-3 0-3-1-3 0-3 0 0 0-3 0 0 0-3-1-3 0-3 0-3-1-2 0-1 0-3 0 0 0-2-1-3 0-3 0 0-1-3 0-3-1-3 0 0 0-3-1-3-1-3 0 0 0-2-1-3 0 0 0-3-1-3 0 0-1-3-1-3 0 0 0-2 0 0-1-3 0 0-1-3 0 0-1-3 0 0-1-3-1-2 0 0 0-3-1-3 0 0-1-3 0 0-1-2 0-1-1-2 0 0-1-3 0 0-1-3-1-2 0 0-1-3-3-5-2-6-2-5-3-5-2-6-3-5-3-5-1-3-2-4-1-4 0-5 1-4 1-5 3-4 3-3 3-3 4-2 5-1 4-1 5 1 4 1 4 2 4 3 3 3 2 3 1 3 1 0 0 0 3 6 0 0 0 0 2 6 1 0 0 0 2 6 0 0 0 0 3 5 0 1 0 0 3 5 0 1 0 0 2 6 0 0 1 0 2 6 0 0 0 0 1 3 0 0 0 0 1 3 0 0 0 0 1 3 0 0 1 0 1 3 0 0 0 0 1 3 0 0 0 0 1 3 0 0 0 0 1 3 0 0 0 1 1 3 0 0 0 0 1 3 0 0 0 0 1 3 0 0 0 0 1 3 0 0 0 0 1 3 0 0 0 0 1 3 0 0 0 1 1 3 0 0 0 0 1 3 0 0 0 0 0 3 0 0 0 0 1 3 0 0 0 0 1 3 0 1 0 0 1 3 0 0 0 0 0 3 0 0 1 0 0 3 0 0 0 0 1 3 0 1 0 0 1 3 0 0 0 0 0 3 0 0 0 0 1 3 0 0 0 0 0 4 0 0 0 0 1 3 0 0 0 0 0 3 0 0 0 0 1 4 0 0 0 0 0 3 0 0 0 0 1 3 0 0 0 0 0 4 0 0 0 0 1 3 0 0 0 0 0 3 0 0 0 0 0 4 0 0 0 0 1 3 0 0 0 0 0 3 0 0 0 1 0 3 0 0 0 0 0 3 0 0 0 0 0 4 0 0 0 0 1 3 0 0 0 0 0 3 0 0 0 1 0 3 0 0 0 0 0 3 0 0 0 0 0 4 0 0 0 0 0 3 0 0 0 0 0 4 0 0 0 0 0 3 0 0 0 0 0 3 0 1 0 0 0 3 0 4 0 0 0 0 0 4 0 0 0 1 0 4 0 0 0 0-1 5 0 0 0 0 0 4 0 5-2 4-2 4-3 4-4 2-4 3-4 1-4 1z m-853-18l-4-1-5-2-3-3-4-3-2-4-2-4-1-4 0-4 0-3 0 0 0 0 0-7 0 0 0 0 0-6 0 0 0 0 0-7 0 0 0 0 1-6 0 0 0-1 0-6 0 0 0 0 1-6 0 0 0-1 1-6 0 0 0 0 1-6 0 0 0-1 0-6 0 0 0 0 1-6 0 0 0-1 1-6 1 0 0 0 1-6 0 0 0-1 1-6 0 0 0 0 1-6 0 0 0 0 2-6 0-1 0 0 1-6 0 0 0 0 2-6 0 0 0-1 2-6 0 0 0 0 1-6 0 0 0 0 2-6 0 0 0 0 2-6 0-1 0 0 2-6 0 0 0 0 2-6 0 0 0 0 2-6 1 0 0 0 2-6 0 0 0 0 2-6 0 0 0-1 3-5 0-1 0 0 2-5 0-1 0 0 3-5 0-1 0 0 2-5 0-1 1 0 2-5 0-1 0 0 3-5 0 0 0-1 1-1 2-4 4-4 3-2 4-2 5-1 4-1 5 1 4 1 4 2 4 3 3 3 2 4 2 5 0 4 0 5-1 4-1 4-1 1-3 5-2 6-3 5-2 6-2 5-2 5-3 6-2 6-2 5-1 6-2 5-2 6-2 6-1 5-2 6-1 6-2 5-1 6-1 6-1 6-1 6-1 5-1 6-1 6-1 6 0 6-1 5 0 6-1 6 0 6 0 6-1 6 0 3 0 4-1 5-3 4-2 3-4 3-4 3-4 1-4 1z m694-334l-4-1-4-2-4-3 0 0-5-3-4-4-5-4-5-3-5-3-4-4-5-3-5-3-5-3-5-4-5-3-6-3-5-2-5-3-5-3-5-3-6-2-5-3-5-2-6-2-5-3-6-2-5-2-6-2-5-2-6-2-5-2-6-1-5-2-6-2-6-1-5-1-5-1-4-2-4-2-4-3-2-3-3-4-1-5-1-4 1-5 1-4 2-4 2-4 3-3 4-3 4-1 5-1 4-1 4 1 5 1 0 0 0 0 6 2 0 0 0 0 6 1 1 0 0 0 6 2 0 0 0 0 6 2 0 0 0 0 6 2 0 0 1 0 5 2 1 0 0 0 6 2 0 0 0 0 6 2 0 0 0 0 6 2 0 0 0 0 6 3 0 0 0 0 6 2 0 0 1 0 5 3 0 0 1 0 5 2 0 0 1 0 5 3 0 0 1 0 5 3 0 0 1 0 5 3 0 0 0 0 6 3 0 0 0 0 6 3 0 0 0 0 6 3 0 0 0 0 5 3 0 0 1 0 5 3 0 0 0 0 6 3 0 1 0 0 5 3 0 0 1 0 5 3 0 0 0 1 5 3 0 0 1 0 5 4 0 0 0 0 5 3 0 0 0 0 6 4 0 0 0 0 5 4 0 0 0 0 5 4 0 0 0 0 5 4 0 0 1 0 4 4 1 0 0 0 0 1 3 3 3 4 2 4 1 4 0 5 0 4-2 4-2 4-3 4-4 3-4 2-4 1-4 1z m-541-2l-4-1-4-3-4-2-3-4-2-4-1-4-1-5 0-4 1-5 2-4 3-4 3-2 1-1 0-1 0 0 5-4 0 0 0 0 5-4 0 0 0 0 3-2 0 0 0 0 2-2 1 0 0 0 2-2 0 0 0 0 3-2 0 0 0 0 2-2 1 0 0 0 2-2 0 0 0 0 3-2 0 0 0 0 3-1 0-1 0 0 2-1 0 0 0 0 3-2 0 0 0 0 3-2 0 0 0 0 3-2 0 0 0 0 2-2 0 0 1 0 2-1 0 0 0 0 3-2 0 0 0 0 3-2 0 0 0 0 3-1 0 0 0-1 3-1 0 0 0 0 3-2 0 0 0 0 2-1 1 0 0 0 2-2 1 0 0 0 2-2 0 0 1 0 2-1 0 0 1 0 2-2 0 0 0 0 3-1 0 0 0 0 3-2 0 0 1 0 2-1 0 0 1 0 2-1 0-1 1 0 2-1 1 0 0 0 3-1 0 0 0 0 3-2 0 0 0 0 3-1 0 0 0 0 3-1 0 0 0 0 3-2 0 0 0 0 3-1 0 0 0 0 3-1 0 0 0 0 3-1 1 0 0 0 3-1 0 0 0 0 3-2 0 0 0 0 3-1 0 0 0 0 3-1 0 0 1 0 3-1 0 0 0 0 3-1 0 0 0 0 3-1 0 0 0 0 3-1 0 0 1 0 3-1 0 0 0 0 3-1 0 0 0 0 3-1 2 0 0 0 0 0 3-1 0 0 0-1 3-1 1 0 0 0 3-1 0 0 0 0 3-1 0 0 0 0 3-1 0 0 0 0 4 0 0-1 0 0 3 0 0 0 0 0 3-1 0 0 0 0 3-1 1 0 0 0 3-1 0 0 0 0 3-1 0 0 0 0 0 0 5 0 4 0 5 1 4 2 4 2 3 4 2 3 2 5 1 4 0 5 0 4-2 4-2 4-3 4-4 2-4 3-3 1 0 0-1 0-3 0-2 1 0 0-3 1 0 0-3 1 0 0-3 0 0 0-3 1-3 1-3 1 0 0-3 1-2 1-3 1-3 1-1 0-1 0-3 1-3 1-3 1 0 0-2 1-3 1-3 1-3 0-3 1 0 0-3 1-3 1-2 1 0 0-3 2-3 1 0 0-3 1 0 0-2 1-3 1 0 0-3 1-3 1-2 2-3 1 0 0-3 1-2 1-3 2-3 1-2 1 0 0-3 2-2 1 0 0-3 1 0 0-3 2 0 0-2 1-2 2-1 0-2 1 0 0-3 2-2 1 0 0-3 2-2 1 0 0-3 2 0 0-2 2 0 0-2 1-3 2 0 0-2 2-2 1-1 0-2 2 0 0-2 2-3 1 0 0-2 2 0 0-2 2 0 0-3 2-4 3-5 4-1 1-4 3-4 1-4 2-5 0z" horiz-adv-x="1000" />
<glyph glyph-name="loop-marker" unicode="&#xe809;" d="M529 645c-126 1-247-86-283-207-28-87-12-187 42-260-44 8-89 17-134 26-4-20-8-40-12-59 81-16 162-32 242-47 16 80 32 160 47 240-19 4-39 8-59 11-9-48-19-97-28-145-69 82-68 214 2 295 69 86 200 111 295 57 92-47 143-159 118-259-22-104-124-184-230-182-28 2-42-38-19-53 20-13 45-4 67-3 124 19 229 125 245 250 19 119-46 244-152 300-43 23-92 36-141 36z" horiz-adv-x="1000" />
<glyph glyph-name="parallel-mi-marker" unicode="&#xe80a;" d="M250 650l0-600 100 0 0 600-100 0z m200 0l0-600 100 0 0 600-100 0z m200 0l0-600 100 0 0 600-100 0z" horiz-adv-x="1000" />
<glyph glyph-name="start-event-non-interrupting-signal" unicode="&#xe80b;" d="M500 562c-64-115-128-230-192-345 128 0 256 0 384 0-64 115-128 230-192 345z m0-51c50-90 100-180 151-270-101 0-201 0-302 0 51 90 101 180 151 270z m4 289c-45-7-119 8-139-39 18-48 78-2 116-10 40 3 80-6 119-8 49 46-38 58-72 56-8 1-16 1-24 1z m250-79c-62-19 12-63 34-87 30-33 55-70 76-109 42-29 52 35 23 57-33 54-74 105-127 138l-6 1 0 0z m-521-11c-51-21-82-73-113-115-22-23-63-104 0-91 32 41 53 93 92 130 19 20 77 57 21 76z m695-313c-47-13-14-76-28-111-7-43-22-86-43-125-6-47 57-33 57 6 31 66 44 141 36 213-3 10-13 16-22 17z m-853-19c-48-11-18-76-18-110 11-46 23-94 51-133 67-9 16 67 8 99-12 40-19 82-19 124-2 11-12 19-22 20z m694-334c-50-24-94-64-149-78-33 0-87-36-38-60 75 13 146 49 204 98 14 14 2 40-17 40z m-542-1c-56-22 12-68 41-83 45-25 95-46 147-53 50 23-6 59-38 59-50 15-97 39-136 73l-6 3-8 1 0 0z" horiz-adv-x="1000" />
<glyph glyph-name="intermediate-event-catch-non-interrupting-timer" unicode="&#xe80c;" d="M500 564c-85 2-167-54-198-133-33-76-15-170 43-229 56-60 149-82 226-54 81 28 141 108 143 194 5 83-46 166-121 201-29 14-61 21-93 21z m0-39c78 2 152-55 170-131 20-73-14-156-79-194-67-42-160-31-215 26-58 56-68 152-24 219 32 49 89 81 148 80z m55-49c-19-36-39-71-58-107-18-2-23-29-6-36 11-8 20 5 30 4 30 0 59 0 89 0 0 8 0 17 0 25-30 0-60 0-89 0 18 34 37 68 56 102-7 4-14 8-22 12z m-55 233l-4 0 0 0-1 0-4 0 0 0 0 0-4 0 0 0 0 0-5 0 0-1 0 0-4 0 0 0 0 0-4 0-1 0 0 0-4 0 0 0 0 0-4-1 0 0-1 0-1 0-4-1-5-2-3-2-4-3-2-4-2-4-2-4 0-5 1-4 1-5 2-4 3-3 4-3 4-3 4-1 4-1 4 0 1 1 4 0 4 0 4 1 4 0 3 0 4 0 4 0 4 0 4 0 4 0 4 0 3 0 4 0 4-1 4 0 4 0 3-1 4 0 4-1 4 0 4-1 3-1 4 0 4-1 4-1 3 0 4-1 4-1 3-1 4-1 4-1 3-1 4-1 3-2 4-1 4-1 3-1 4-2 3-1 4-1 3-2 0 0 0 0 4-1 5-1 5 0 4 1 4 2 4 3 3 3 2 4 2 4 1 5 0 4 0 5-2 4-2 4-3 3-4 3-3 2 0 0-1 0 0 0-3 2-1 0 0 0-4 1 0 0 0 0-4 2 0 0 0 0-4 1 0 0 0 0-4 2 0 0 0 0-4 1 0 0 0 0-4 2 0 0 0 0-4 1 0 0-1 0-3 1-1 0 0 0-4 2 0 0 0 0-4 1 0 0 0 0-4 1 0 0 0 0-4 1 0 0-1 0-4 1 0 0 0 0-4 1 0 0 0 0-4 1 0 0 0 0-4 1-1 0 0 0-4 1 0 0 0 0-4 1 0 0 0 0-4 0-1 0 0 0-4 1 0 0 0 0-4 1 0 0 0 0-5 0 0 0 0 0-4 1 0 0 0 0-4 0 0 0-1 0-4 1 0 0 0 0-4 0 0 0 0 0-5 0 0 0 0 0-4 0 0 0 0 1-4 0-1 0 0 0-4 0 0 0 0 0-4 0 0 0-1 0-4 0 0 0z m-159-39l-5-1-3-1-2-1 0 0 0 0-4-2 0 0 0 0-3-2-1-1 0 0-3-2 0 0-1 0-3-2 0 0 0 0-4-2 0 0 0 0-4-2 0-1 0 0-3-2 0 0-1 0-3-2 0 0 0 0-4-3 0 0 0 0-3-2 0 0 0 0-4-3 0 0 0 0-3-2 0 0-1-1-3-2 0 0 0 0-3-3 0 0-1 0-3-2 0-1 0 0-3-2 0 0-1 0-3-3 0 0 0 0-3-3 0 0 0 0-3-3-1 0 0 0-3-3 0 0 0 0-3-3 0 0 0 0-3-3 0 0 0 0-3-3-1 0 0 0-3-3 0 0 0 0-3-3 0 0 0 0-3-3 0-1 0 0-3-3 0 0 0 0-3-3 0 0 0 0-3-3 0 0 0 0-3-4 0 0 0 0-3-3 0 0 0 0-2-3-1 0 0-1-2-3 0 0 0 0-3-3 0 0 0-1-3-3 0 0 0 0-2-3 0 0-1-1-2-3 0 0 0 0-2-3-1-1 0 0-2-3 0 0 0 0-2-4-1 0 0 0-2-3-2-4-1-4-1-5 1-4 1-5 2-4 3-3 3-4 4-2 4-2 4-1 5 0 4 1 5 2 4 2 3 3 2 3 2 3 2 3 2 3 3 3 2 4 2 3 2 3 3 3 2 3 3 2 2 3 3 3 2 3 3 3 2 3 3 3 3 2 3 3 2 3 3 2 3 3 3 2 3 3 3 2 3 3 3 2 3 3 3 2 3 2 3 3 3 2 3 2 3 2 3 2 3 2 4 2 3 2 3 2 3 2 4 2 3 2 2 0 3 3 4 3 2 4 2 4 1 4 1 5-1 4-1 5-3 4-2 3-4 3-4 2-4 2-5 0z m392-60l-4-1-4-1-4-3-3-3-3-4-1-4-1-5-1-4 1-5 2-4 2-4 2-3 3-2 3-3 2-3 3-3 2-3 3-3 2-3 3-2 2-3 3-3 2-3 2-3 3-4 2-3 2-3 2-3 2-3 2-3 2-4 2-3 2-3 2-3 2-4 2-3 1-3 2-4 2-3 1-3 2-4 2-3 1-4 1-3 2-4 1-3 2-4 1-3 1-4 1-4 2-3 1-4 1-3 0-3 2-4 2-4 4-3 3-3 4-2 5-1 4 0 5 0 4 1 4 3 4 2 3 4 2 4 2 4 0 5 0 4-1 4 0 2 0 0 0 0-2 4 0 0 0 1-1 3 0 1 0 0-1 4 0 0 0 0-2 4 0 0 0 0-1 4 0 0 0 0-2 4 0 0 0 0-1 4 0 0 0 0-2 4 0 0 0 0-1 4 0 0 0 1-2 3 0 0 0 1-2 3 0 0 0 1-2 3 0 0 0 1-1 3 0 0-1 1-1 3 0 0 0 0-2 4 0 0 0 0-2 4 0 0 0 0-2 4 0 0 0 0-2 4 0 0-1 0-1 4-1 0 0 0-2 3 0 1 0 0-2 3 0 0 0 0-2 4 0 0 0 0-2 4-1 0 0 0-2 3 0 0 0 1-2 3 0 0 0 0-3 4 0 0 0 0-2 3 0 0 0 1-3 3 0 0 0 0-2 3 0 1-1 0-2 3 0 0 0 0-3 3 0 1 0 0-2 3-1 0 0 0-2 3 0 1 0 0-3 3 0 0 0 0-3 3 0 0 0 0-3 4 0 0 0 0-3 3 0 0 0 0-3 3 0 0 0 0-3 3 0 0 0 1-3 3 0 0 0 0-3 2-3 3-4 3-5 1-4 1z m-564-170l-4-1-4-2-4-2-3-4-3-3-2-4-1-4-1-4 0 0 0 0 0-4 0 0-1 0 0-4 0-1 0 0-1-4 0 0 0 0-1-4 0 0 0 0 0-5 0 0 0 0-1-4 0 0 0 0 0-4 0 0 0-1 0-4 0 0-1 0 0-4 0 0 0 0 0-5 0 0 0 0 0-4 0 0 0 0-1-4 0-1 0 0 0-4 0 0 0 0 0-4 0 0 0-1 0-4 0 0 0 0 0-4 0 0 0-1 0-4 0 0 0 0 0-4 0 0 0 0 1-5 0 0 0 0 0-4 0 0 0 0 0-4 0-1 0 0 0-4 1 0 0 0 0-4 0 0 0-1 0-4 0 0 0 0 1-4 0 0 0 0 0-4 0-1 0 0 1-4 0 0 0 0 1-4 0 0 0 0 0-4 1-1 0 0 0-4 0 0 0 0 1-4 0 0 0 0 1-4 0-1 0 0 1-4 0 0 0 0 1-4 0 0 0 0 1-4 0 0 0-1 1-4 0 0 0 0 1-4 0 0 0 0 1-4 0 0 0 0 2-4 0 0 0 0 1-4 0-1 0 0 1-1 1-4 3-4 3-3 4-3 4-2 4-1 5 0 4 1 5 1 4 2 3 3 3 4 2 4 2 4 0 5 0 4-1 4 0 1-2 4-1 4-1 3-1 4-1 3-1 4 0 4-1 4-1 3-1 4 0 4-1 4-1 3 0 4-1 4 0 4 0 3-1 4 0 4 0 4-1 4 0 4 0 3 0 4 0 4 0 4 0 4 0 4 0 3 1 4 0 4 0 4 1 4 0 3 0 4 1 4 0 4 1 4 1 3 0 4 1 4 0 4 0 5-1 4-2 4-3 4-3 3-4 2-5 2-4 1z m658-119l-5-1-4-2-4-3-3-3-2-4-2-4-1-3 0 0 0 0 0 0 0 0-1-4 0-4-1-4-1-3 0-4-1-4-1-4-1-3-1-4-1-3-1-4-1-4-2-3-1-4-1-3-1-4-2-4-1-3-2-4-1-3-1-4-2-3-2-3-1-4-2-3-2-4-1-3-2-3-2-4-2-3-2-3-2-3-2-4-2-3-2-3-2-3-2-3-2-3-3-3-2-3-2-4-2-1-2-4-2-4-1-5 0-4 1-5 2-4 2-4 3-3 4-3 4-2 4-1 5-1 4 1 4 1 5 2 3 3 3 3 1 1 0 1 0 0 3 3 0 0 0 0 2 3 1 1 0 0 2 3 0 0 0 0 3 4 0 0 0 0 2 3 0 0 0 0 3 4 0 0 0 0 2 3 0 1 0 0 2 3 0 0 1 0 2 4 0 0 0 0 2 4 0 0 0 0 2 3 0 1 0 0 2 3 0 0 1 1 2 3 0 0 0 0 2 4 0 0 0 0 2 4 0 0 0 0 2 4 0 0 0 0 2 4 0 0 0 0 1 4 1 0 0 0 1 4 0 0 0 0 2 4 0 0 0 0 2 4 0 0 0 0 2 4 0 0 0 0 1 4 0 0 0 0 2 4 0 0 0 0 1 4 0 0 0 0 2 4 0 0 0 0 1 4 0 0 0 0 2 4 0 0 0 0 1 4 0 0 0 1 1 4 0 0 0 0 2 4 0 0 0 0 1 4 0 0 0 0 1 4 0 0 0 0 1 4 0 1 0 0 1 4 0 0 0 0 1 4 0 0 0 0 1 4 0 0 0 1 1 4 0 0 0 0 1 4 0 0 0 0 1 4 0 0 0 1 0 4 0 0 0 0 0 0 1 5-1 4-1 4-2 4-3 4-4 3-4 2-4 2-5 0z m-590-161l-4-2-4-2-4-3-3-3-2-4-1-5-1-4 1-5 1-4 2-4 2-3 1-2 0 0 0 0 3-3 0 0 0 0 3-3 0-1 0 0 3-3 0 0 0 0 3-3 0 0 0 0 3-3 0 0 0 0 3-3 0-1 0 0 3-3 0 0 0 0 3-3 0 0 1 0 3-3 0 0 0 0 3-3 0 0 0 0 3-3 0 0 0 0 3-3 0 0 1 0 3-3 0 0 0 0 3-3 0 0 0 0 3-2 1-1 0 0 3-2 0 0 0 0 3-3 1 0 0 0 3-3 0 0 0 0 3-2 1 0 0-1 3-2 0 0 0 0 4-2 0-1 0 0 3-2 0 0 0 0 4-2 0-1 0 0 3-2 1 0 0 0 3-2 0 0 0 0 4-3 0 0 0 0 4-2 0 0 0 0 3-2 1 0 0 0 3-2 0 0 1 0 3-2 0 0 0-1 4-1 0-1 0 0 4-2 0 0 0 0 4-2 0 0 0 0 4-1 0-1 0 0 4-1 0 0 0 0 4-2 0 0 0 0 4-2 0 0 0 0 4-2 0 0 0 0 4-1 0-1 0 0 4-1 0 0 0 0 4-2 4-1 4 0 5 0 4 1 4 2 4 3 3 4 2 3 2 5 1 4 0 5-1 4-2 4-2 4-4 3-3 3-4 2-3 1-4 2-3 1-4 2-3 1-3 2-4 1-3 2-4 2-3 2-3 1-4 2-3 2-3 2-3 2-4 2-3 2-3 2-3 2-3 2-3 3-3 2-4 2-3 2-2 3-3 2-3 3-3 2-3 3-3 2-3 3-3 2-2 3-3 3-3 3-3 2-2 3-3 3-2 3-3 3-2 3-1 1-4 3-3 3-5 1-4 1-5 1z m425-76l-4-1-4-2-1-1-4-2-3-1-3-2-4-2-3-2-3-1-4-2-3-1-4-2-3-1-4-2-3-1-4-2-3-1-4-1-4-1-3-1-4-2-3-1-4-1-4-1-3-1-4-1-4 0-3-1-4-1-4-1-4 0-3-1-4-1-4 0-4-1-3 0-4 0-4-1-4 0-4 0-4-1-3 0-4 0-4 0-5 0-4-2-4-2-4-3-3-3-2-4-1-4-1-5 0-5 1-4 2-4 2-4 4-3 3-3 4-2 5-1 4 0 4 0 0 0 0 0 4 0 0 0 1 0 4 0 0 1 0 0 4 0 0 0 0 0 5 0 0 0 0 0 4 0 0 0 0 0 4 1 1 0 0 0 4 0 0 0 0 0 4 1 0 0 0 0 5 0 0 0 0 0 4 1 0 0 0 0 4 1 0 0 1 0 4 0 0 0 0 0 4 1 0 0 0 0 4 1 0 0 1 0 4 1 0 0 0 0 4 1 0 0 0 0 4 1 0 0 0 0 4 1 1 0 0 0 4 1 0 0 0 0 4 1 0 0 0 0 4 1 0 0 0 0 4 2 0 0 1 0 3 1 1 0 0 0 4 1 0 0 0 0 4 2 0 0 0 0 4 1 0 0 0 0 4 2 0 0 0 0 4 1 0 0 0 0 4 2 0 0 0 0 4 1 0 0 1 1 3 1 0 0 1 0 3 2 0 0 1 0 3 2 0 0 1 0 3 2 0 0 1 0 3 1 0 0 0 1 4 1 0 0 0 0 4 2 0 0 0 0 4 2 0 0 0 1 4 1 0 1 0 0 4 2 0 0 0 0 2 1 3 2 4 4 2 3 2 5 1 4 0 5-1 4-1 4-3 4-3 4-3 3-4 2-5 1-4 0z m-162 718l-5 0-1 0 0 0-5 0 0 0 0 0-6-1 0 0 0 0-5 0 0 0 0 0-6 0 0 0 0 0-5-1 0 0-1 0-5 0 0 0 0 0-5 0-1 0 0-1-5 0 0 0 0 0-5-1-1 0 0 0-5 0 0 0 0 0-5-1-1 0 0 0-5-1 0 0 0 0-5-1-1 0 0 0-5-1 0 0 0 0-5-1 0 0-1 0-5-1 0 0 0 0-5-1 0 0 0 0-6-2 0 0 0 0-5-1 0 0 0 0-5-1-4-2-4-2-4-3-2-4-3-4-1-4 0-5 0-4 1-4 2-5 3-3 3-3 4-3 4-1 5-1 4 0 4 1 5 1 5 1 4 1 5 1 5 1 5 1 5 1 5 1 5 0 4 1 5 1 5 0 5 1 5 0 5 1 5 0 5 0 5 1 5 0 5 0 5 0 5 0 5 0 5 0 5-1 5 0 5 0 5-1 5 0 5-1 5 0 5-1 5-1 4 0 5-1 5-1 5-1 5-1 4-1 5 0 4 0 5 1 4 2 3 3 4 3 2 4 2 4 1 4 0 5-1 4-2 5-2 4-3 3-4 3-4 2-3 1-5 1 0 0 0 0-5 1 0 0-1 0-5 1 0 0 0 0-5 1 0 0 0 0-6 1 0 0 0 0-5 1 0 0 0 0-6 1 0 0 0 0-5 0 0 0 0 0-6 1 0 0 0 0-5 0 0 1 0 0-6 0 0 0 0 0-5 0 0 0-1 0-5 1 0 0 0 0-5 0-1 0 0 0-5 0 0 0 0 0-6 1 0 0 0 0-5 0 0 0 0 0-6 0 0 0z m250-83l-4-1-5-2-3-2-4-4-2-3-2-4-1-5-1-4 1-5 1-4 3-4 3-4 2-2 2-1 4-3 4-3 4-3 3-3 4-4 4-3 4-3 3-3 4-4 4-3 3-4 4-3 3-4 4-3 3-4 4-4 3-3 3-4 3-4 4-4 3-3 3-4 3-4 3-4 3-4 3-4 2-4 3-4 3-5 3-4 2-4 3-4 2-4 3-5 2-4 2-4 3-5 2-4 1-2 2-4 4-3 3-3 4-2 5-1 4-1 5 1 4 1 4 2 4 3 3 3 2 4 2 4 0 5 0 4-1 5-1 3-1 3 0 0 0 0-3 5 0 0 0 0-2 5 0 0-1 0-2 4 0 1 0 0-3 4 0 0 0 1-2 4-1 0 0 0-2 5 0 0 0 0-3 5 0 0 0 0-3 4 0 0 0 0-3 5 0 0 0 0-3 5 0 0 0 0-3 4 0 0 0 0-3 5 0 0-1 0-3 4 0 0 0 0-3 5 0 0 0 0-3 4 0 0 0 0-4 4 0 1 0 0-3 4 0 0 0 0-3 4-1 0 0 0-3 4 0 1 0 0-4 4 0 0 0 0-3 4 0 0-1 0-3 4 0 0 0 0-4 4 0 0 0 0-4 4 0 0 0 1-4 3 0 0 0 1-3 3-1 0 0 1-3 3-1 0 0 0-3 4-1 0 0 0-4 4 0 0 0 0-4 4 0 0 0 0-4 3 0 1 0 0-4 3 0 0 0 0-4 4 0 0-1 0-4 3 0 0 0 1-4 3 0 0 0 0-4 3 0 0-1 0-4 4 0 0 0 0-4 3 0 0 0 0-2 1-4 3-4 1-4 1z m-519-10l-4-1-4-2-4-2-1-1 0 0 0 0-4-3 0-1 0 0-4-3 0 0-1 0-4-4 0 0 0 0-4-3 0 0 0-1-4-3 0 0 0 0-4-4 0 0 0 0-4-4 0 0 0 0-4-4 0 0 0 0-4-3 0-1 0 0-4-3 0-1 0 0-4-3 0-1 0 0-4-4 0 0 0 0-4-4 0 0 0 0-3-4 0 0-1 0-3-4 0 0 0 0-4-4 0 0 0-1-3-4 0 0 0 0-4-4 0 0 0 0-3-4 0 0 0-1-4-4 0 0 0 0-3-4 0 0 0 0-3-5 0 0 0 0-3-4 0 0-1 0-3-5 0 0 0 0-3-4 0 0 0 0-3-5 0 0 0 0-3-5 0 0 0 0-3-4 0 0 0 0-2-5-1 0 0 0-2-5 0 0 0 0-3-4 0-1 0 0-3-4 0 0 0-1-2-4 0 0 0 0-3-5 0 0 0 0-2-5 0 0-1 0-2-5 0 0 0 0-2-5 0 0 0 0-3-5 0 0 0 0-1-3-1-4-1-5 0-4 1-5 2-4 3-4 3-3 4-2 4-2 4-1 5 0 4 0 5 2 3 2 4 3 3 4 2 3 1 3 2 4 2 5 2 4 2 4 3 5 2 4 2 4 3 5 2 4 3 4 3 4 2 4 3 5 3 4 2 4 3 4 3 4 3 4 3 4 3 4 3 3 4 4 3 4 3 4 3 3 4 4 3 4 4 3 3 4 4 3 3 4 4 3 4 4 3 3 4 3 4 3 4 4 4 3 1 1 3 3 3 3 2 5 1 4 0 4-1 5-1 4-2 4-3 4-4 3-4 2-4 2-4 0z m692-315l-4-1-4-2-4-2-3-4-3-4-2-4 0-4-1-4 1-4 0-5 0-5 0-5 0-5 0-5 0-5-1-5 0-5 0-5-1-5 0-5-1-5 0-5-1-5-1-4 0-5-1-5-1-5-1-5-1-5-1-5-1-4-1-5-1-5-2-5-1-4-2-5-1-5-1-4-2-5-2-5-1-4-2-5-2-4-2-5-2-5-2-4-2-5-2-4-2-4-2-5-2-4-2-5-1-4 0-5 1-4 2-4 2-4 3-4 4-2 4-2 4-2 5 0 4 1 5 1 4 2 3 3 3 3 2 3 3 5 0 0 0 0 2 5 0 0 0 0 2 5 0 0 0 0 3 5 0 0 0 0 2 5 0 0 0 0 2 5 0 0 0 0 2 5 0 0 0 0 2 5 0 0 0 0 2 5 0 0 0 1 2 4 0 1 0 0 2 5 0 0 0 0 2 5 0 0 0 0 2 5 0 0 0 0 2 5 0 0 0 1 1 5 0 0 0 0 2 5 0 0 0 0 1 5 0 0 0 0 2 5 0 1 0 0 1 5 0 0 0 0 1 5 0 0 0 0 2 6 0 0 0 0 1 5 0 0 0 0 1 5 0 1 0 0 1 5 0 0 0 0 1 5 0 0 0 1 1 5 0 0 0 0 1 5 0 0 0 1 1 5 0 0 0 0 0 5 0 0 0 1 1 5 0 0 0 0 0 5 1 0 0 1 0 5 0 0 0 0 0 5 0 1 0 0 1 5 0 0 0 0 0 6 0 0 0 0 0 5 0 0 0 0 1 6 0 0 0 0 0 5 0 0 0 1 0 5 0 0 0 0 0 6 0 0 0 0 0 5 0 0 0 0-1 6 0 0 0 0 0 4 0 5-2 4-2 4-3 3-4 3-4 2-4 2-4 0z m-853-16l-4-1-4-1-4-3-4-3-2-4-2-4-1-4-1-4 0-4 0 0 0 0 0-5 0-1 0 0 1-5 0 0 0 0 0-6 0 0 0 0 0-5 0 0 0 0 0-6 0 0 0 0 1-5 0 0 0-1 0-5 0 0 0 0 1-5 0-1 0 0 0-5 0 0 0 0 1-5 0-1 0 0 1-5 0 0 0 0 0-5 0-1 0 0 1-5 0 0 0 0 1-5 0-1 0 0 1-5 0 0 0 0 1-5 0 0 0-1 1-5 0 0 0 0 1-5 0 0 0 0 2-6 0 0 0 0 1-5 0 0 0 0 1-5 0 0 0-1 2-5 0 0 0 0 1-5 0 0 0 0 2-5 0 0 0 0 2-5 0-1 0 0 1-5 0 0 0 0 2-5 0 0 0 0 2-5 0 0 0 0 2-5 0 0 0-1 2-4 0-1 0 0 2-5 0 0 0 0 2-5 0 0 0 0 2-5 0 0 0 0 2-5 0 0 0 0 2-5 0 0 0 0 3-5 0 0 0 0 2-5 0 0 0 0 2-5 1 0 0 0 0-1 3-4 3-3 3-3 4-2 5-1 4 0 5 0 4 1 4 3 4 2 3 4 2 4 2 4 0 5 0 4-1 5-1 3-1 1-2 5-2 4-2 4-2 5-2 4-2 5-2 5-2 4-2 5-1 4-2 5-1 5-2 4-1 5-2 5-1 4-1 5-2 5-1 5-1 4-1 5-1 5-1 5-1 5-1 5 0 5-1 4-1 5 0 5-1 5 0 5-1 5 0 5 0 5-1 5 0 5 0 5 0 5 0 4 0 4-1 5-2 4-3 3-4 4-3 2-5 2-4 0z m153-334l-5-1-4-3-3-3-3-3-2-4-1-5-1-4 0-5 1-4 2-4 3-4 3-2 1-1 0 0 0 0 4-4 0 0 0 0 4-3 0 0 1 0 4-4 0 0 0 0 4-3 0 0 0 0 5-3 0 0 0 0 4-3 0-1 0 0 5-3 0 0 0 0 4-3 0 0 1 0 4-3 0 0 0 0 5-3 0 0 0 0 4-3 0 0 1 0 4-3 0 0 0 0 5-2 0 0 0-1 5-2 0 0 0 0 4-3 1 0 0 0 4-2 0 0 0-1 5-2 0 0 0 0 5-3 0 0 0 0 5-2 0 0 0 0 5-2 0 0 0 0 5-3 0 0 0 0 5-2 0 0 0 0 5-2 0 0 0 0 5-2 0 0 0 0 5-2 0 0 0 0 5-2 0 0 1 0 4-2 1 0 0 0 5-2 0 0 0 0 5-2 0 0 0 0 5-2 0 0 0 0 5-2 0 0 1 0 5-1 0 0 0 0 5-2 0 0 0 0 5-1 0 0 0 0 5-2 1 0 0 0 5-1 0 0 0 0 5-1 0 0 0 0 6-2 0 0 0 0 4-1 5 0 4 0 5 1 4 2 4 3 3 3 2 4 2 4 1 5 0 4-1 5-1 4-3 4-3 3-4 3-4 2-3 1-5 1-4 1-5 1-5 1-5 2-4 1-5 2-5 1-4 2-5 1-5 2-4 1-5 2-5 2-4 2-5 2-4 2-5 2-4 2-5 2-4 2-4 2-5 3-4 2-4 2-5 3-4 2-4 3-4 3-4 2-4 3-5 3-4 2-4 3-4 3-4 3-3 3-4 3-4 3-1 1-4 3-4 1-4 1-5 1z m542-2l-4-1-5-2-3-2-1-2-4-3-4-3-4-3-4-3-4-3-4-2-4-3-5-3-4-2-4-3-4-3-4-2-5-3-4-2-4-2-5-3-4-2-4-2-5-2-4-2-5-2-4-2-5-2-4-2-5-2-4-2-5-1-5-2-4-1-5-2-5-1-5-2-4-1-5-2-5-1-5-1-4-1-5-1-3-1-5-1-4-2-3-3-3-3-2-4-2-5-1-4 0-5 1-4 2-4 3-4 3-3 4-3 4-2 4-1 5 0 4 0 3 1 0 0 0 0 5 1 0 0 1 0 5 2 0 0 0 0 5 1 0 0 0 0 5 1 0 0 1 0 5 2 0 0 0 0 5 1 0 0 0 0 5 2 0 0 1 0 5 1 0 0 0 0 5 2 0 0 0 0 5 2 0 0 0 0 5 2 0 0 0 0 5 2 1 0 0 0 5 2 0 0 0 0 5 2 0 0 0 0 5 2 0 0 0 0 5 2 0 0 0 0 5 2 0 0 0 0 5 2 0 0 0 0 5 3 0 0 0 0 5 2 0 0 0 0 5 2 0 0 0 0 5 3 0 0 0 0 5 2 0 1 0 0 4 2 1 0 0 0 4 3 0 0 1 0 4 2 0 1 0 0 5 2 0 0 0 0 5 3 0 0 0 0 4 3 0 0 0 0 5 3 0 0 0 0 5 3 0 0 0 0 4 3 0 0 0 0 5 3 0 0 0 1 4 3 0 0 0 0 5 3 0 0 0 0 4 3 0 0 0 0 4 4 1 0 0 0 4 3 0 0 0 0 2 2 3 3 3 4 2 4 1 4 0 5-1 4-1 5-2 4-3 3-4 3-4 2-4 2-4 0z" horiz-adv-x="1000" />
<glyph glyph-name="intermediate-event-catch-parallel-multiple" unicode="&#xe80d;" d="M499 802c-220 4-425-177-448-396-24-185 78-380 247-461 160-80 368-56 501 66 134 118 190 318 128 486-57 167-217 293-393 303-12 1-23 2-35 2z m-5-49c202 7 391-161 407-362 19-178-92-361-262-420-166-61-368-2-468 145-103 144-99 356 18 490 74 90 188 146 305 147z m8-44c-186 6-358-158-361-344-9-169 116-334 283-367 155-33 328 46 397 190 71 140 39 327-83 430-64 57-150 91-236 91z m-2-48c164 4 314-144 311-308 3-152-119-297-272-312-143-19-295 73-336 213-43 134 14 295 138 364 48 28 103 43 159 43z m-61-93c0-52 0-104 0-156-53 0-106 0-159 0 0-41 0-83 0-124 53 0 106 0 159 0 0-52 0-104 0-156 41 0 81 0 122 0 0 52 0 104 0 156 53 0 106 0 159 0 0 41 0 83 0 124-53 0-106 0-159 0 0 52 0 104 0 156-41 0-81 0-122 0z m25-24c24 0 48 0 73 0 0-52 0-104 0-157 53 0 106 0 159 0 0-24 0-49 0-74-53 0-106 0-159 0 0-53 0-105 0-157-25 0-49 0-73 0 0 52 0 104 0 157-54 0-107 0-160 0 0 25 0 50 0 74 53 0 106 0 160 0 0 53 0 105 0 157z" horiz-adv-x="1000" />
<glyph glyph-name="intermediate-event-catch-compensation" unicode="&#xe80e;" d="M499 802c-220 4-425-177-448-396-24-185 78-380 247-461 160-80 368-56 501 66 134 118 190 318 128 486-57 167-217 293-393 303-12 1-23 2-35 2z m-5-49c202 7 391-161 407-362 19-178-92-361-262-420-166-61-368-2-468 145-103 144-99 356 18 490 74 90 188 146 305 147z m8-44c-186 6-358-158-361-344-9-169 116-334 283-367 155-33 328 46 397 190 71 140 39 327-83 430-64 57-150 91-236 91z m-2-48c164 4 314-144 311-308 3-152-119-297-272-312-143-19-295 73-336 213-43 134 14 295 138 364 48 28 103 43 159 43z m-16-163c-70-49-140-99-209-148 70-49 139-99 209-148 0 48 0 95 0 143 67-48 135-95 202-143 0 99 0 197 0 296-67-48-135-95-202-143 0 48 0 95 0 143z m-24-47c0-67 0-134 0-201-48 33-95 67-143 100 48 34 95 67 143 101z m202 0c0-67 0-134 0-202-48 34-95 68-143 101 48 34 95 67 143 101z" horiz-adv-x="1000" />
<glyph glyph-name="gateway-xor" unicode="&#xe80f;" d="M500 802c-9 0-19-4-26-11l-415-415c-14-14-14-38 0-52l415-415c14-14 38-14 52 0l415 415c14 14 14 38 0 52l-415 415c-7 7-17 11-26 11z m0-62l390-390-390-390-390 390 390 390z m-146-217c0 0-4-1-4-1 0 0-4-3-4-3l-15-15c0 0-3-4-3-4 0 0-1-4-1-4 0 0 1-5 1-5 0 0 3-4 3-4l137-137-137-137 0 0c0 0-3-4-3-4 0 0-1-5-1-5 0 0 1-4 1-4 0 0 3-4 3-4l15-15c0 0 4-3 4-3 0 0 4-1 4-1 0 0 5 1 5 1 0 0 4 3 4 3l137 137 137-137c0 0 4-3 4-3 0 0 5-1 5-1 0 0 4 1 4 1 0 0 4 3 4 3l15 15c0 0 3 4 3 4 0 0 1 4 1 4 0 0-1 5-1 5 0 0-3 4-3 4l-137 137 137 137c0 0 3 4 3 4 0 0 1 5 1 5 0 0-1 4-1 4 0 0-3 4-3 4l-15 15c0 0-4 3-4 3 0 0-4 1-4 1 0 0-5-1-5-1 0 0-4-3-4-3l-137-137-137 137 0 1c0 0-4 2-4 2 0 0-5 1-5 1l0 0z" horiz-adv-x="1000" />
<glyph glyph-name="connection" unicode="&#xe810;" d="M911 749c0 0-285-146-431-214 31-28 60-59 90-89-147-149-295-299-443-448 11-11 22-21 33-31 148 149 295 299 443 448 30-29 60-60 90-90 77 153 218 424 218 424z" horiz-adv-x="1000" />
<glyph glyph-name="end-event-cancel" unicode="&#xe811;" d="M491 802c-219 0-420-183-440-400-22-186 82-380 253-459 158-77 361-53 492 67 134 115 192 312 133 480-55 172-220 303-401 311-13 1-25 1-37 1z m9-142c161 5 308-137 310-298 7-147-103-292-250-317-142-28-300 54-350 192-53 136 2 309 132 380 47 28 103 43 158 43z m-112-110c-29-30-58-59-87-88 37-38 75-75 112-113-37-36-74-73-110-110 28-29 57-58 86-86 37 37 73 73 110 110 38-37 75-75 113-112 29 29 58 58 88 87-38 38-76 75-113 113 37 37 74 73 110 110-28 29-57 58-86 86-37-36-73-73-110-110-38 37-75 75-113 113z" horiz-adv-x="1000" />
<glyph glyph-name="intermediate-event-catch-condition" unicode="&#xe812;" d="M499 802c-1 0-2 0-3 0-202 1-391-150-436-346-42-173 28-368 174-471 145-107 354-116 506-18 149 93 235 276 207 450-26 176-164 330-338 371-36 9-73 14-110 14z m-5-49c3 0 7 0 10 0 187 2 362-146 392-331 32-167-54-348-205-427-154-85-363-54-483 77-124 127-147 338-53 488 71 116 203 192 339 193z m8-44c-3 0-7 0-10 0-172 0-330-143-349-314-22-161 79-328 233-382 145-55 322-3 413 124 98 129 92 326-17 447-67 77-167 125-270 125z m-2-48c2 0 4 0 6 0 153 0 292-129 304-281 16-145-84-293-225-330-137-40-296 27-361 154-69 129-33 305 86 392 54 42 122 65 190 65z m-151-121l0-12 0-368 50 0 202 0 50 0 0 380-302 0z m24-24l254 0 0-332-26 0-202 0-26 0 0 332z m26-37l0-25 202 0 0 25-202 0z m0-74l0-24 202 0 0 24-202 0z m0-85l0-24 202 0 0 24-202 0z m0-77l0-24 202 0 0 24-202 0z" horiz-adv-x="1000" />
<glyph glyph-name="intermediate-event-catch-non-interrupting-parallel-multiple" unicode="&#xe813;" d="M430 545l0-125-125 0 0-140 125 0 0-125 140 0 0 125 125 0 0 140-125 0 0 125z m23-23l94 0 0-125 125 0 0-94-125 0 0-125-94 0 0 126-125 0 0 93 125 0z m47 280l0 0-5 0-1 0 0 0-5 0 0 0 0 0-6-1 0 0 0 0-5 0 0 0 0 0-6 0 0 0 0 0-5-1 0 0-1 0-5 0 0 0 0 0-5 0-1 0 0-1-5 0 0 0 0 0-5-1-1 0 0 0-5 0 0 0 0 0-5-1-1 0 0 0-5-1 0 0 0 0-5-1-1 0 0 0-5-1 0 0 0 0-5-1 0 0-1 0-5-1 0 0 0 0-5-1 0 0 0 0-6-2 0 0 0 0-5-1 0 0 0 0-5-1-4-2-4-2-4-3-2-4-3-4-1-4 0-5 0-4 1-4 2-5 3-3 3-3 4-3 4-1 5-1 4 0 4 1 5 1 5 1 4 1 5 1 5 1 5 1 5 1 5 1 5 0 4 1 5 1 5 0 5 1 5 0 5 1 5 0 5 0 5 1 5 0 5 0 5 0 5 0 5 0 5 0 5-1 5 0 5 0 5-1 5 0 5-1 5 0 5-1 5-1 4 0 5-1 5-1 5-1 5-1 4-1 5 0 4 0 5 1 4 2 3 3 4 3 2 4 2 4 1 4 0 5-1 4-2 5-2 4-3 3-4 3-4 2-3 1-5 1 0 0 0 0-5 1 0 0-1 0-5 1 0 0 0 0-5 1 0 0 0 0-6 1 0 0 0 0-5 1 0 0 0 0-6 1 0 0 0 0-5 0 0 0 0 0-6 1 0 0 0 0-5 0 0 1 0 0-6 0 0 0 0 0-5 0 0 0-1 0-5 1 0 0 0 0-5 0-1 0 0 0-5 0 0 0 0 0-6 1 0 0 0 0-5 0 0 0 0 0-6 0 0 0z m255-83l-5 0-4-1-5-2-3-2-4-4-2-3-2-4-1-5-1-4 1-5 1-4 3-4 3-4 2-2 2-1 4-3 4-3 4-3 3-3 4-4 4-3 4-3 3-3 4-4 4-3 3-4 4-3 3-4 4-3 3-4 4-4 3-3 3-4 3-4 4-4 3-3 3-4 3-4 3-4 3-4 3-4 2-4 3-4 3-5 3-4 2-4 3-4 2-4 3-5 2-4 2-4 3-5 2-4 1-2 2-4 4-3 3-3 4-2 5-1 4-1 5 1 4 1 4 2 4 3 3 3 2 4 2 4 0 5 0 4-1 5-1 3-1 3 0 0 0 0-3 5 0 0 0 0-2 5 0 0-1 0-2 4 0 1 0 0-3 4 0 0 0 1-2 4-1 0 0 0-2 5 0 0 0 0-3 5 0 0 0 0-3 4 0 0 0 0-3 5 0 0 0 0-3 5 0 0 0 0-3 4 0 0 0 0-3 5 0 0-1 0-3 4 0 0 0 0-3 5 0 0 0 0-3 4 0 0 0 0-4 4 0 1 0 0-3 4 0 0 0 0-3 4-1 0 0 0-3 4 0 1 0 0-4 4 0 0 0 0-3 4 0 0-1 0-3 4 0 0 0 0-4 4 0 0 0 0-4 4 0 0 0 1-4 3 0 0 0 1-3 3-1 0 0 1-3 3-1 0 0 0-3 4-1 0 0 0-4 4 0 0 0 0-4 4 0 0 0 0-4 3 0 1 0 0-4 3 0 0 0 0-4 4 0 0-1 0-4 3 0 0 0 1-4 3 0 0 0 0-4 3 0 0-1 0-4 4 0 0 0 0-4 3 0 0 0 0-2 1-4 3-4 1-4 1z m-519-10l-5 0-4-1-4-2-4-2-1-1 0 0 0 0-4-3 0-1 0 0-4-3 0 0-1 0-4-4 0 0 0 0-4-3 0 0 0-1-4-3 0 0 0 0-4-4 0 0 0 0-4-4 0 0 0 0-4-4 0 0 0 0-4-3 0-1 0 0-4-3 0-1 0 0-4-3 0-1 0 0-4-4 0 0 0 0-4-4 0 0 0 0-3-4 0 0-1 0-3-4 0 0 0 0-4-4 0 0 0-1-3-4 0 0 0 0-4-4 0 0 0 0-3-4 0 0 0-1-4-4 0 0 0 0-3-4 0 0 0 0-3-5 0 0 0 0-3-4 0 0-1 0-3-5 0 0 0 0-3-4 0 0 0 0-3-5 0 0 0 0-3-5 0 0 0 0-3-4 0 0 0 0-2-5-1 0 0 0-2-5 0 0 0 0-3-4 0-1 0 0-3-4 0 0 0-1-2-4 0 0 0 0-3-5 0 0 0 0-2-5 0 0-1 0-2-5 0 0 0 0-2-5 0 0 0 0-3-5 0 0 0 0-1-3-1-4-1-5 0-4 1-5 2-4 3-4 3-3 4-2 4-2 4-1 5 0 4 0 5 2 3 2 4 3 3 4 2 3 1 3 2 4 2 5 2 4 2 4 3 5 2 4 2 4 3 5 2 4 3 4 3 4 2 4 3 5 3 4 2 4 3 4 3 4 3 4 3 4 3 4 3 3 4 4 3 4 3 4 3 3 4 4 3 4 4 3 3 4 4 3 3 4 4 3 4 4 3 3 4 3 4 3 4 4 4 3 1 1 3 3 3 3 2 5 1 4 0 4-1 5-1 4-2 4-3 4-4 3-4 2-4 2-4 0z m264 0l0 0-4 0 0 0-1 0-4 0 0 0 0 0-4 0 0 0 0 0-5 0 0-1 0 0-4 0 0 0 0 0-4 0-1 0 0 0-4 0 0 0 0 0-4-1 0 0-1 0-1 0-4-1-5-2-3-2-4-3-2-4-2-4-2-4 0-5 1-4 1-5 2-4 3-3 4-3 4-3 4-1 4-1 4 0 1 1 4 0 4 0 4 1 4 0 3 0 4 0 4 0 4 0 4 0 4 0 4 0 3 0 4 0 4-1 4 0 4 0 3-1 4 0 4-1 4 0 4-1 3-1 4 0 4-1 4-1 3 0 4-1 4-1 3-1 4-1 4-1 3-1 4-1 3-2 4-1 4-1 3-1 4-2 3-1 4-1 3-2 0 0 0 0 4-1 5-1 5 0 4 1 4 2 4 3 3 3 2 4 2 4 1 5 0 4 0 5-2 4-2 4-3 3-4 3-3 2 0 0-1 0 0 0-3 2-1 0 0 0-4 1 0 0 0 0-4 2 0 0 0 0-4 1 0 0 0 0-4 2 0 0 0 0-4 1 0 0 0 0-4 2 0 0 0 0-4 1 0 0-1 0-3 1-1 0 0 0-4 2 0 0 0 0-4 1 0 0 0 0-4 1 0 0 0 0-4 1 0 0-1 0-4 1 0 0 0 0-4 1 0 0 0 0-4 1 0 0 0 0-4 1-1 0 0 0-4 1 0 0 0 0-4 1 0 0 0 0-4 0-1 0 0 0-4 1 0 0 0 0-4 1 0 0 0 0-5 0 0 0 0 0-4 1 0 0 0 0-4 0 0 0-1 0-4 1 0 0 0 0-4 0 0 0 0 0-5 0 0 0 0 0-4 0 0 0 0 1-4 0-1 0 0 0-4 0 0 0 0 0-4 0 0 0-1 0-4 0 0 0z m-155-39l-4 0-5-1-3-1-2-1 0 0 0 0-4-2 0 0 0 0-3-2-1-1 0 0-3-2 0 0-1 0-3-2 0 0 0 0-4-2 0 0 0 0-4-2 0-1 0 0-3-2 0 0-1 0-3-2 0 0 0 0-4-3 0 0 0 0-3-2 0 0 0 0-4-3 0 0 0 0-3-2 0 0-1-1-3-2 0 0 0 0-3-3 0 0-1 0-3-2 0-1 0 0-3-2 0 0-1 0-3-3 0 0 0 0-3-3 0 0 0 0-3-3-1 0 0 0-3-3 0 0 0 0-3-3 0 0 0 0-3-3 0 0 0 0-3-3-1 0 0 0-3-3 0 0 0 0-3-3 0 0 0 0-3-3 0-1 0 0-3-3 0 0 0 0-3-3 0 0 0 0-3-3 0 0 0 0-3-4 0 0 0 0-3-3 0 0 0 0-2-3-1 0 0-1-2-3 0 0 0 0-3-3 0 0 0-1-3-3 0 0 0 0-2-3 0 0-1-1-2-3 0 0 0 0-2-3-1-1 0 0-2-3 0 0 0 0-2-4-1 0 0 0-2-3-2-4-1-4-1-5 1-4 1-5 2-4 3-3 3-4 4-2 4-2 4-1 5 0 4 1 5 2 4 2 3 3 2 3 2 3 2 3 2 3 3 3 2 4 2 3 2 3 3 3 2 3 3 2 2 3 3 3 2 3 3 3 2 3 3 3 3 2 3 3 2 3 3 2 3 3 3 2 3 3 3 2 3 3 3 2 3 3 3 2 3 2 3 3 3 2 3 2 3 2 3 2 3 2 4 2 3 2 3 2 3 2 4 2 3 2 2 0 3 3 4 3 2 4 2 4 1 4 1 5-1 4-1 5-3 4-2 3-4 3-4 2-4 2-5 0z m393-59l-5-1-4-1-4-1-4-3-3-3-3-4-1-4-1-5-1-4 1-5 2-4 2-4 2-3 3-2 3-3 2-3 3-3 2-3 3-3 2-3 3-2 2-3 3-3 2-3 2-3 3-4 2-3 2-3 2-3 2-3 2-3 2-4 2-3 2-3 2-3 2-4 2-3 1-3 2-4 2-3 1-3 2-4 2-3 1-4 1-3 2-4 1-3 2-4 1-3 1-4 1-4 2-3 1-4 1-3 0-3 2-4 2-4 4-3 3-3 4-2 5-1 4 0 5 0 4 1 4 3 4 2 3 4 2 4 2 4 0 5 0 4-1 4 0 2 0 0 0 0-2 4 0 0 0 1-1 3 0 1 0 0-1 4 0 0 0 0-2 4 0 0 0 0-1 4 0 0 0 0-2 4 0 0 0 0-1 4 0 0 0 0-2 4 0 0 0 0-1 4 0 0 0 1-2 3 0 0 0 1-2 3 0 0 0 1-2 3 0 0 0 1-1 3 0 0-1 1-1 3 0 0 0 0-2 4 0 0 0 0-2 4 0 0 0 0-2 4 0 0 0 0-2 4 0 0-1 0-1 4-1 0 0 0-2 3 0 1 0 0-2 3 0 0 0 0-2 4 0 0 0 0-2 4-1 0 0 0-2 3 0 0 0 1-2 3 0 0 0 0-3 4 0 0 0 0-2 3 0 0 0 1-3 3 0 0 0 0-2 3 0 1-1 0-2 3 0 0 0 0-3 3 0 1 0 0-2 3-1 0 0 0-2 3 0 1 0 0-3 3 0 0 0 0-3 3 0 0 0 0-3 4 0 0 0 0-3 3 0 0 0 0-3 3 0 0 0 0-3 3 0 0 0 1-3 3 0 0 0 0-3 2-3 3-4 3-5 1-4 1z m-564-171l-5 0-4-1-4-2-4-2-3-4-3-3-2-4-1-4-1-4 0 0 0 0 0-4 0 0-1 0 0-4 0-1 0 0-1-4 0 0 0 0-1-4 0 0 0 0 0-5 0 0 0 0-1-4 0 0 0 0 0-4 0 0 0-1 0-4 0 0-1 0 0-4 0 0 0 0 0-5 0 0 0 0 0-4 0 0 0 0-1-4 0-1 0 0 0-4 0 0 0 0 0-4 0 0 0-1 0-4 0 0 0 0 0-4 0 0 0-1 0-4 0 0 0 0 0-4 0 0 0 0 1-5 0 0 0 0 0-4 0 0 0 0 0-4 0-1 0 0 0-4 1 0 0 0 0-4 0 0 0-1 0-4 0 0 0 0 1-4 0 0 0 0 0-4 0-1 0 0 1-4 0 0 0 0 1-4 0 0 0 0 0-4 1-1 0 0 0-4 0 0 0 0 1-4 0 0 0 0 1-4 0-1 0 0 1-4 0 0 0 0 1-4 0 0 0 0 1-4 0 0 0-1 1-4 0 0 0 0 1-4 0 0 0 0 1-4 0 0 0 0 2-4 0 0 0 0 1-4 0-1 0 0 1-1 1-4 3-4 3-3 4-3 4-2 4-1 5 0 4 1 5 1 4 2 3 3 3 4 2 4 2 4 0 5 0 4-1 4 0 1-2 4-1 4-1 3-1 4-1 3-1 4 0 4-1 4-1 3-1 4 0 4-1 4-1 3 0 4-1 4 0 4 0 3-1 4 0 4 0 4-1 4 0 4 0 3 0 4 0 4 0 4 0 4 0 4 0 3 1 4 0 4 0 4 1 4 0 3 0 4 1 4 0 4 1 4 1 3 0 4 1 4 0 4 0 5-1 4-2 4-3 4-3 3-4 2-5 2-4 1z m754-46l-5 0-4-1-4-2-4-2-3-4-3-4-2-4 0-4-1-4 1-4 0-5 0-5 0-5 0-5 0-5 0-5-1-5 0-5 0-5-1-5 0-5-1-5 0-5-1-5-1-4 0-5-1-5-1-5-1-5-1-5-1-5-1-4-1-5-1-5-2-5-1-4-2-5-1-5-1-4-2-5-2-5-1-4-2-5-2-4-2-5-2-5-2-4-2-5-2-4-2-4-2-5-2-4-2-5-1-4 0-5 1-4 2-4 2-4 3-4 4-2 4-2 4-2 5 0 4 1 5 1 4 2 3 3 3 3 2 3 3 5 0 0 0 0 2 5 0 0 0 0 2 5 0 0 0 0 3 5 0 0 0 0 2 5 0 0 0 0 2 5 0 0 0 0 2 5 0 0 0 0 2 5 0 0 0 0 2 5 0 0 0 1 2 4 0 1 0 0 2 5 0 0 0 0 2 5 0 0 0 0 2 5 0 0 0 0 2 5 0 0 0 1 1 5 0 0 0 0 2 5 0 0 0 0 1 5 0 0 0 0 2 5 0 1 0 0 1 5 0 0 0 0 1 5 0 0 0 0 2 6 0 0 0 0 1 5 0 0 0 0 1 5 0 1 0 0 1 5 0 0 0 0 1 5 0 0 0 1 1 5 0 0 0 0 1 5 0 0 0 1 1 5 0 0 0 0 0 5 0 0 0 1 1 5 0 0 0 0 0 5 1 0 0 1 0 5 0 0 0 0 0 5 0 1 0 0 1 5 0 0 0 0 0 6 0 0 0 0 0 5 0 0 0 0 1 6 0 0 0 0 0 5 0 0 0 1 0 5 0 0 0 0 0 6 0 0 0 0 0 5 0 0 0 0-1 6 0 0 0 0 0 4 0 5-2 4-2 4-3 3-4 3-4 2-4 2-4 0z m-853-16l-5 0-4-1-4-1-4-3-4-3-2-4-2-4-1-4-1-4 0-4 0 0 0 0 0-5 0-1 0 0 1-5 0 0 0 0 0-6 0 0 0 0 0-5 0 0 0 0 0-6 0 0 0 0 1-5 0 0 0-1 0-5 0 0 0 0 1-5 0-1 0 0 0-5 0 0 0 0 1-5 0-1 0 0 1-5 0 0 0 0 0-5 0-1 0 0 1-5 0 0 0 0 1-5 0-1 0 0 1-5 0 0 0 0 1-5 0 0 0-1 1-5 0 0 0 0 1-5 0 0 0 0 2-6 0 0 0 0 1-5 0 0 0 0 1-5 0 0 0-1 2-5 0 0 0 0 1-5 0 0 0 0 2-5 0 0 0 0 2-5 0-1 0 0 1-5 0 0 0 0 2-5 0 0 0 0 2-5 0 0 0 0 2-5 0 0 0-1 2-4 0-1 0 0 2-5 0 0 0 0 2-5 0 0 0 0 2-5 0 0 0 0 2-5 0 0 0 0 2-5 0 0 0 0 3-5 0 0 0 0 2-5 0 0 0 0 2-5 1 0 0 0 0-1 3-4 3-3 3-3 4-2 5-1 4 0 5 0 4 1 4 3 4 2 3 4 2 4 2 4 0 5 0 4-1 5-1 3-1 1-2 5-2 4-2 4-2 5-2 4-2 5-2 5-2 4-2 5-1 4-2 5-1 5-2 4-1 5-2 5-1 4-1 5-2 5-1 5-1 4-1 5-1 5-1 5-1 5-1 5 0 5-1 4-1 5 0 5-1 5 0 5-1 5 0 5 0 5-1 5 0 5 0 5 0 5 0 4 0 4-1 5-2 4-3 3-4 4-3 2-5 2-4 0z m756-57l-4 0-5-1-4-2-4-3-3-3-2-4-2-4-1-3 0 0 0 0 0 0 0 0-1-4 0-4-1-4-1-3 0-4-1-4-1-4-1-3-1-4-1-3-1-4-1-4-2-3-1-4-1-3-1-4-2-4-1-3-2-4-1-3-1-4-2-3-2-3-1-4-2-3-2-4-1-3-2-3-2-4-2-3-2-3-2-3-2-4-2-3-2-3-2-3-2-3-2-3-3-3-2-3-2-4-2-1-2-4-2-4-1-5 0-4 1-5 2-4 2-4 3-3 4-3 4-2 4-1 5-1 4 1 4 1 5 2 3 3 3 3 1 1 0 1 0 0 3 3 0 0 0 0 2 3 1 1 0 0 2 3 0 0 0 0 3 4 0 0 0 0 2 3 0 0 0 0 3 4 0 0 0 0 2 3 0 1 0 0 2 3 0 0 1 0 2 4 0 0 0 0 2 4 0 0 0 0 2 3 0 1 0 0 2 3 0 0 1 1 2 3 0 0 0 0 2 4 0 0 0 0 2 4 0 0 0 0 2 4 0 0 0 0 2 4 0 0 0 0 1 4 1 0 0 0 1 4 0 0 0 0 2 4 0 0 0 0 2 4 0 0 0 0 2 4 0 0 0 0 1 4 0 0 0 0 2 4 0 0 0 0 1 4 0 0 0 0 2 4 0 0 0 0 1 4 0 0 0 0 2 4 0 0 0 0 1 4 0 0 0 1 1 4 0 0 0 0 2 4 0 0 0 0 1 4 0 0 0 0 1 4 0 0 0 0 1 4 0 1 0 0 1 4 0 0 0 0 1 4 0 0 0 0 1 4 0 0 0 1 1 4 0 0 0 0 1 4 0 0 0 0 1 4 0 0 0 1 0 4 0 0 0 0 0 0 1 5-1 4-1 4-2 4-3 4-4 3-4 2-4 2-5 0z m-590-160l-4-1-4-2-4-2-4-3-3-3-2-4-1-5-1-4 1-5 1-4 2-4 2-3 1-2 0 0 0 0 3-3 0 0 0 0 3-3 0-1 0 0 3-3 0 0 0 0 3-3 0 0 0 0 3-3 0 0 0 0 3-3 0-1 0 0 3-3 0 0 0 0 3-3 0 0 1 0 3-3 0 0 0 0 3-3 0 0 0 0 3-3 0 0 0 0 3-3 0 0 1 0 3-3 0 0 0 0 3-3 0 0 0 0 3-2 1-1 0 0 3-2 0 0 0 0 3-3 1 0 0 0 3-3 0 0 0 0 3-2 1 0 0-1 3-2 0 0 0 0 4-2 0-1 0 0 3-2 0 0 0 0 4-2 0-1 0 0 3-2 1 0 0 0 3-2 0 0 0 0 4-3 0 0 0 0 4-2 0 0 0 0 3-2 1 0 0 0 3-2 0 0 1 0 3-2 0 0 0-1 4-1 0-1 0 0 4-2 0 0 0 0 4-2 0 0 0 0 4-1 0-1 0 0 4-1 0 0 0 0 4-2 0 0 0 0 4-2 0 0 0 0 4-2 0 0 0 0 4-1 0-1 0 0 4-1 0 0 0 0 4-2 4-1 4 0 5 0 4 1 4 2 4 3 3 4 2 3 2 5 1 4 0 5-1 4-2 4-2 4-4 3-3 3-4 2-3 1-4 2-3 1-4 2-3 1-3 2-4 1-3 2-4 2-3 2-3 1-4 2-3 2-3 2-3 2-4 2-3 2-3 2-3 2-3 2-3 3-3 2-4 2-3 2-2 3-3 2-3 3-3 2-3 3-3 2-3 3-3 2-2 3-3 3-3 3-3 2-2 3-3 3-2 3-3 3-2 3-1 1-4 3-3 3-5 1-4 1-5 1z m426-77l-5 0-4-1-4-2-1-1-4-2-3-1-3-2-4-2-3-2-3-1-4-2-3-1-4-2-3-1-4-2-3-1-4-2-3-1-4-1-4-1-3-1-4-2-3-1-4-1-4-1-3-1-4-1-4 0-3-1-4-1-4-1-4 0-3-1-4-1-4 0-4-1-3 0-4 0-4-1-4 0-4 0-4-1-3 0-4 0-4 0-5 0-4-2-4-2-4-3-3-3-2-4-1-4-1-5 0-5 1-4 2-4 2-4 4-3 3-3 4-2 5-1 4 0 4 0 0 0 0 0 4 0 0 0 1 0 4 1 0 0 0 0 4 0 0 0 0 0 5 0 0 0 0 0 4 0 0 0 0 0 4 1 1 0 0 0 4 0 0 0 0 0 4 1 0 0 0 0 5 0 0 0 0 0 4 1 0 0 0 0 4 1 0 0 1 0 4 0 0 0 0 0 4 1 0 0 0 0 4 1 0 0 1 0 4 1 0 0 0 0 4 1 0 0 0 0 4 1 0 0 0 0 4 1 1 0 0 0 4 1 0 0 0 0 4 1 0 0 0 0 4 1 0 0 0 0 4 2 0 0 1 0 3 1 1 0 0 0 4 1 0 0 0 0 4 2 0 0 0 0 4 1 0 0 0 0 4 2 0 0 0 0 4 1 0 0 0 0 4 2 0 0 0 0 4 1 0 0 1 1 3 1 0 0 1 0 3 2 0 0 1 0 3 2 0 0 1 0 3 2 0 0 1 0 3 1 0 0 0 1 4 1 0 0 0 0 4 2 0 0 0 0 4 2 0 0 0 1 4 1 0 1 0 0 4 2 0 0 0 0 2 1 3 2 4 4 2 3 2 5 1 4 0 5-1 4-1 4-3 4-3 4-3 3-4 2-5 1-4 0z m-440-39l-4-1-5-1-4-3-3-3-3-3-2-4-1-5-1-4 0-5 1-4 2-4 3-4 3-2 1-1 0 0 0 0 4-4 0 0 0 0 4-3 0 0 1 0 4-4 0 0 0 0 4-3 0 0 0 0 5-3 0 0 0 0 4-3 0-1 0 0 5-3 0 0 0 0 4-3 0 0 1 0 4-3 0 0 0 0 5-3 0 0 0 0 4-3 0 0 1 0 4-3 0 0 0 0 5-2 0 0 0-1 5-2 0 0 0 0 4-3 1 0 0 0 4-2 0 0 0-1 5-2 0 0 0 0 5-3 0 0 0 0 5-2 0 0 0 0 5-2 0 0 0 0 5-3 0 0 0 0 5-2 0 0 0 0 5-2 0 0 0 0 5-2 0 0 0 0 5-2 0 0 0 0 5-2 0 0 1 0 4-2 1 0 0 0 5-2 0 0 0 0 5-2 0 0 0 0 5-2 0 0 0 0 5-2 0 0 1 0 5-1 0 0 0 0 5-2 0 0 0 0 5-1 0 0 0 0 5-2 1 0 0 0 5-1 0 0 0 0 5-1 0 0 0 0 6-2 0 0 0 0 4-1 5 0 4 0 5 1 4 2 4 3 3 3 2 4 2 4 1 5 0 4-1 5-1 4-3 4-3 3-4 3-4 2-3 1-5 1-4 1-5 1-5 1-5 2-4 1-5 2-5 1-4 2-5 1-5 2-4 1-5 2-5 2-4 2-5 2-4 2-5 2-4 2-5 2-4 2-4 2-5 3-4 2-4 2-5 3-4 2-4 3-4 3-4 2-4 3-5 3-4 2-4 3-4 3-4 3-3 3-4 3-4 3-1 1-4 3-4 1-4 1-5 1z m543-3l-5 0-4-1-5-2-3-2-1-2-4-3-4-3-4-3-4-3-4-3-4-2-4-3-5-3-4-2-4-3-4-3-4-2-5-3-4-2-4-2-5-3-4-2-4-2-5-2-4-2-5-2-4-2-5-2-4-2-5-2-4-2-5-1-5-2-4-1-5-2-5-1-5-2-4-1-5-2-5-1-5-1-4-1-5-1-3-1-5-1-4-2-3-3-3-3-2-4-2-5-1-4 0-5 1-4 2-4 3-4 3-3 4-3 4-2 4-1 5 0 4 0 3 1 0 0 0 0 5 1 0 0 1 0 5 2 0 0 0 0 5 1 0 0 0 0 5 1 0 0 1 0 5 2 0 0 0 0 5 1 0 0 0 0 5 2 0 0 1 0 5 1 0 0 0 0 5 2 0 0 0 0 5 2 0 0 0 0 5 2 0 0 0 0 5 2 1 0 0 0 5 2 0 0 0 0 5 2 0 0 0 0 5 2 0 0 0 0 5 2 0 0 0 0 5 2 0 0 0 0 5 2 0 0 0 0 5 3 0 0 0 0 5 2 0 0 0 0 5 2 0 0 0 0 5 3 0 0 0 0 5 2 0 1 0 0 4 2 1 0 0 0 4 3 0 0 1 0 4 2 0 1 0 0 5 2 0 0 0 0 5 3 0 0 0 0 4 3 0 0 0 0 5 3 0 0 0 0 5 3 0 0 0 0 4 3 0 0 0 0 5 3 0 0 0 1 4 3 0 0 0 0 5 3 0 0 0 0 4 3 0 0 0 0 4 4 1 0 0 0 4 3 0 0 0 0 2 2 3 3 3 4 2 4 1 4 0 5-1 4-1 5-2 4-3 3-4 3-4 2-4 2-4 0z" horiz-adv-x="1000" />
<glyph glyph-name="start-event-condition" unicode="&#xe814;" d="M500 802c-249 0-452-203-452-452 0-249 203-452 452-452 249 0 452 203 452 452 0 249-203 452-452 452z m0-49c223 0 403-180 403-403 0-223-180-403-403-403-223 0-403 180-403 403 0 223 180 403 403 403z m-151-213l0-12 0-368 50 0 202 0 50 0 0 380-302 0z m24-24l254 0 0-332-26 0-202 0-26 0 0 332z m26-37l0-25 202 0 0 25-202 0z m0-74l0-24 202 0 0 24-202 0z m0-85l0-24 202 0 0 24-202 0z m0-77l0-24 202 0 0 24-202 0z" horiz-adv-x="1000" />
<glyph glyph-name="start-event-non-interrupting-timer" unicode="&#xe815;" d="M500 564c-85 2-167-54-198-133-33-76-15-170 43-229 56-60 149-82 226-54 81 28 141 108 143 194 5 83-46 166-121 201-29 14-61 21-93 21z m0-39c78 2 152-55 170-131 20-73-14-156-79-194-67-42-160-31-215 26-58 56-68 152-24 219 32 49 89 81 148 80z m55-49c-19-36-39-71-58-107-18-2-23-29-6-36 11-8 20 5 30 4 30 0 59 0 89 0 0 8 0 17 0 25-30 0-60 0-89 0 18 34 37 68 56 102-7 4-14 8-22 12z m-51 324l-7 0 0 0 0 0-6 0 0 0 0 0-7 0 0 0 0 0-6-1 0 0-1 0-6 0 0 0 0 0-6 0-1 0 0 0-6-1 0 0 0 0-6-1-1 0 0 0-6 0 0 0 0 0-6-1-1 0 0 0-6-1 0 0 0 0-6-1-1 0 0 0-6-1 0 0 0 0-6-1-1 0 0 0-6-1 0-1 0 0-6-1 0 0-1 0-6-1 0 0 0 0-6-2 0 0 0 0-4-1-4-1-4-2-3-3-3-4-2-4-2-4 0-5 0-4 1-5 2-4 3-4 3-3 4-2 5-2 4-1 5 0 3 1 3 1 6 1 6 1 6 2 5 1 6 1 6 1 6 1 6 0 6 1 5 1 6 0 6 1 6 0 6 1 6 0 6 0 6 0 6 0 6 0 5 0 6 0 6-1 6 0 6-1 6 0 6-1 5 0 6-1 6-1 6-1 6-1 5-1 2 0 4-1 5 0 4 2 4 2 4 2 3 4 3 3 1 5 1 4 0 5-1 4-1 4-3 4-3 4-3 2-5 2-3 1-2 1 0 0 0 0-6 1 0 0-1 0-6 1 0 0 0 0-6 1 0 0-1 0-6 1 0 0 0 0-6 1 0 0 0 0-7 1 0 0 0 0-6 0 0 1-1 0-6 0 0 0 0 0-6 1 0 0-1 0-6 0 0 0 0 0-6 0-1 0 0 0-6 1 0 0 0 0-6 0-1 0 0 0-6 0 0 0z m246-79l-5-1-4-1-4-3-3-3-3-4-1-4-2-4 0-5 1-4 1-5 2-4 3-3 3-3 2-1 0 0 2-2 0 0 3-1 0 0 2-2 0 0 2-2 2-2 0 0 3-2 0 0 2-1 2-2 0 0 2-2 3-2 0 0 2-2 2-2 0 0 2-2 2-2 1 0 2-2 2-2 2-2 0 0 2-2 0 0 2-2 0 0 2-2 2-2 0 0 2-3 0 0 2-2 2-2 0 0 2-2 2-2 0 0 2-3 0 0 2-2 2-2 2-2 0 0 2-3 2-2 2-2 0-1 1-2 0 0 2-2 0 0 2-3 0 0 1 0 2-4 3-3 2-4 3-3 2-3 3-4 2-3 2-4 0 0 3-3 2-4 2-4 3-3 2-4 2-3 2-4 2-4 2-3 2-4 2-4 1-2 3-4 3-4 3-2 4-2 5-2 4 0 5 1 4 1 4 2 4 3 3 3 2 4 2 4 0 5 0 5-1 4-1 3-2 3 0 0 0 0-2 4 0 0 0 1-2 4 0 0 0 0-2 4 0 0 0 0-2 4-1 0 0 0-2 4 0 0 0 0-2 4 0 0 0 0-3 4 0 0 0 0-2 4 0 0 0 0-3 4 0 0 0 0-2 4 0 0 0 0-3 4 0 0 0 0-2 4 0 0-1 0-2 4 0 0 0 0-3 4 0 0 0 0-3 4 0 0 0 0-2 3 0 1-1 0-2 3 0 0 0 0-3 4 0 0 0 0-3 3-2 3 0 0 0 0-2 3 0 0 0 0-2 2 0 0 0 0-2 3 0 0 0 0-2 3 0 0 0 0-2 2 0 0 0 0-2 3 0 0 0 0-3 3 0 0 0 0-2 2 0 0 0 0-2 3 0 0 0 0-2 2 0 0 0 0-3 3 0 0 0 0-2 2 0 0 0 0-2 3 0 0 0 0-2 2-1 0 0 0-2 3 0 0 0 0-2 2 0 0 0 0-3 3 0 0 0 0-2 2 0 0 0 0-2 2 0 0-1 0-2 3 0 0 0 0-2 2 0 0 0 0-3 2 0 0 0 0-2 2 0 0 0 0-3 3 0 0 0 0-2 2 0 0 0 0-3 2 0 0 0 0-2 2 0 0 0 0-3 2 0 0 0 0-2 2-1 0 0 1-2 1 0 1 0 0-3 2 0 0 0 0-2 2 0 0 0 0-3 2 0 0 0 0-3 2 0 0 0 0-2 2 0 0 0 0-2 1-4 2-4 2-5 0z m-521-12l-5-1-4-2-3-2 0 0 0 0-1 0-2-2 0 0 0 0-3-2 0 0 0 0-2-2 0 0 0 0-3-2 0 0 0 0-2-2 0 0 0-1-3-2 0 0 0 0-2-2 0 0 0 0-3-2 0 0 0 0-2-2 0 0 0 0-3-2 0-1 0 0-2-2 0 0 0 0-2-2 0 0-1 0-2-2 0 0 0-1-2-2 0 0 0 0-3-2 0 0 0 0-2-3 0 0 0 0-2-2 0 0 0 0-2-2-1 0 0-1-2-2 0 0 0 0-2-2 0 0 0-1-2-2 0 0 0 0-2-2-1 0 0-1-2-2 0 0 0 0-2-3 0 0 0 0-2-2 0 0 0 0-2-3 0 0 0 0-2-2 0 0 0-1-2-2-1 0 0 0-2-3 0 0 0 0-2-2 0 0 0-1-2-2 0 0 0 0-2-3 0 0 0 0-2-3 0 0 0 0-2-2 0-1 0 0-2-2 0 0 0 0-2-3 0 0 0 0-2-3 0 0 0 0-1-3 0 0-1 0-1-3 0 0 0 0-2-2-1-2 0 0 0 0-2-3 0 0 0 0-2-2 0-1 0 0-2-2 0 0 0 0-2-3 0 0 0 0-2-3 0 0 0 0-2-3 0 0 0 0-2-3 0 0 0 0-2-3 0 0 0 0-1-3 0 0 0 0-2-2 0-1 0 0-2-2 0 0 0-1-2-2 0 0 0 0-1-3 0 0 0 0-2-3 0 0 0 0-2-3 0 0 0 0-1-3 0 0 0 0-2-3 0 0 0 0-1-3 0 0 0 0-2-3 0 0 0 0-1-3 0 0 0 0-2-3 0 0 0 0-1-3 0 0 0 0-2-3 0 0 0 0 0-1-2-4 0-5 0-4 1-5 2-4 2-4 4-3 3-3 5-1 4-1 5-1 4 1 4 2 4 2 4 3 3 3 1 4 1 0 1 3 1 3 0 0 1 2 0 0 2 3 1 3 0 0 2 2 0 0 1 3 1 2 0 1 2 2 1 3 0 0 2 2 0 0 1 3 2 2 0 0 1 3 2 2 1 3 0 0 2 3 0 0 2 2 0 0 1 2 2 3 2 2 0 0 1 3 2 2 2 3 1 1 0 0 2 3 1 2 0 0 2 3 2 2 0 0 1 3 2 2 0 0 2 3 0 0 2 2 1 3 2 2 0 0 2 2 2 3 2 2 0 0 2 2 1 3 2 2 0 0 2 2 2 2 0 0 2 3 0 0 2 2 0 0 2 2 0 0 2 2 2 2 0 0 2 2 0 0 2 3 0 0 2 2 2 2 0 0 2 2 3 2 0 0 2 2 2 2 0 0 2 2 0 0 2 2 0 0 2 2 0 0 3 1 0 0 2 2 0 0 2 2 0 0 2 2 3 2 0 0 2 2 0 0 0 0 3 3 3 4 2 4 1 4 0 5 0 4-2 5-2 4-3 3-3 3-4 2-4 2-5 1z m694-313l-4-1-5-2-3-2-3-4-3-4-2-4-1-4 0-4 1-4 0-4 0-4 0-5 0-4 0 0 0-1 0-3 0-3 0 0 0-3 0 0 0-3 0-3 0 0 0-3 0 0 0-3 0-3 0-3 0-3 0-3-1-3 0-3 0 0 0-3 0 0 0-3-1-3 0-3 0-3-1-2 0-1 0-3 0 0 0-2-1-3 0-3 0 0-1-3 0-3-1-3 0 0 0-3-1-3-1-3 0 0 0-2-1-3 0 0 0-3-1-3 0 0-1-3-1-3 0 0 0-2 0 0-1-3 0 0-1-3 0 0-1-3 0 0-1-3-1-2 0 0 0-3-1-3 0 0-1-3 0 0-1-2 0-1-1-2 0 0-1-3 0 0-1-3-1-2 0 0-1-3-3-5-2-6-2-5-3-5-2-6-3-5-3-5-1-3-2-4-1-4 0-5 1-4 1-5 3-4 3-3 3-3 4-2 5-1 4-1 5 1 4 1 4 2 4 3 3 3 2 3 1 3 1 0 0 0 3 6 0 0 0 0 2 6 1 0 0 0 2 6 0 0 0 0 3 5 0 1 0 0 3 5 0 1 0 0 2 6 0 0 1 0 2 6 0 0 0 0 1 3 0 0 0 0 1 3 0 0 0 0 1 3 0 0 1 0 1 3 0 0 0 0 1 3 0 0 0 0 1 3 0 0 0 0 1 3 0 0 0 1 1 3 0 0 0 0 1 3 0 0 0 0 1 3 0 0 0 0 1 3 0 0 0 0 1 3 0 0 0 0 1 3 0 0 0 1 1 3 0 0 0 0 1 3 0 0 0 0 0 3 0 0 0 0 1 3 0 0 0 0 1 3 0 1 0 0 1 3 0 0 0 0 0 3 0 0 1 0 0 3 0 0 0 0 1 3 0 1 0 0 1 3 0 0 0 0 0 3 0 0 0 0 1 3 0 0 0 0 0 4 0 0 0 0 1 3 0 0 0 0 0 3 0 0 0 0 1 4 0 0 0 0 0 3 0 0 0 0 1 3 0 0 0 0 0 4 0 0 0 0 1 3 0 0 0 0 0 3 0 0 0 0 0 4 0 0 0 0 1 3 0 0 0 0 0 3 0 0 0 1 0 3 0 0 0 0 0 3 0 0 0 0 0 4 0 0 0 0 1 3 0 0 0 0 0 3 0 0 0 1 0 3 0 0 0 0 0 3 0 0 0 0 0 4 0 0 0 0 0 3 0 0 0 0 0 4 0 0 0 0 0 3 0 0 0 0 0 3 0 1 0 0 0 3 0 4 0 0 0 0 0 4 0 0 0 1 0 4 0 0 0 0-1 5 0 0 0 0 0 4 0 5-2 4-2 4-3 4-4 2-4 3-4 1-4 1z m-853-18l-4-1-5-2-3-3-4-3-2-4-2-4-1-4 0-4 0-3 0 0 0 0 0-7 0 0 0 0 0-6 0 0 0 0 0-7 0 0 0 0 1-6 0 0 0-1 0-6 0 0 0 0 1-6 0 0 0-1 1-6 0 0 0 0 1-6 0 0 0-1 0-6 0 0 0 0 1-6 0 0 0-1 1-6 1 0 0 0 1-6 0 0 0-1 1-6 0 0 0 0 1-6 0 0 0 0 2-6 0-1 0 0 1-6 0 0 0 0 2-6 0 0 0-1 2-6 0 0 0 0 1-6 0 0 0 0 2-6 0 0 0 0 2-6 0-1 0 0 2-6 0 0 0 0 2-6 0 0 0 0 2-6 1 0 0 0 2-6 0 0 0 0 2-6 0 0 0-1 3-5 0-1 0 0 2-5 0-1 0 0 3-5 0-1 0 0 2-5 0-1 1 0 2-5 0-1 0 0 3-5 0 0 0-1 1-1 2-4 4-4 3-2 4-2 5-1 4-1 5 1 4 1 4 2 4 3 3 3 2 4 2 5 0 4 0 5-1 4-1 4-1 1-3 5-2 6-3 5-2 6-2 5-2 5-3 6-2 6-2 5-1 6-2 5-2 6-2 6-1 5-2 6-1 6-2 5-1 6-1 6-1 6-1 6-1 5-1 6-1 6-1 6 0 6-1 5 0 6-1 6 0 6 0 6-1 6 0 3 0 4-1 5-3 4-2 3-4 3-4 3-4 1-4 1z m694-334l-4-1-4-2-4-3 0 0-5-3-4-4-5-4-5-3-5-3-4-4-5-3-5-3-5-3-5-4-5-3-6-3-5-2-5-3-5-3-5-3-6-2-5-3-5-2-6-2-5-3-6-2-5-2-6-2-5-2-6-2-5-2-6-1-5-2-6-2-6-1-5-1-5-1-4-2-4-2-4-3-2-3-3-4-1-5-1-4 1-5 1-4 2-4 2-4 3-3 4-3 4-1 5-1 4-1 4 1 5 1 0 0 0 0 6 2 0 0 0 0 6 1 1 0 0 0 6 2 0 0 0 0 6 2 0 0 0 0 6 2 0 0 1 0 5 2 1 0 0 0 6 2 0 0 0 0 6 2 0 0 0 0 6 2 0 0 0 0 6 3 0 0 0 0 6 2 0 0 1 0 5 3 0 0 1 0 5 2 0 0 1 0 5 3 0 0 1 0 5 3 0 0 1 0 5 3 0 0 0 0 6 3 0 0 0 0 6 3 0 0 0 0 6 3 0 0 0 0 5 3 0 0 1 0 5 3 0 0 0 0 6 3 0 1 0 0 5 3 0 0 1 0 5 3 0 0 0 1 5 3 0 0 1 0 5 4 0 0 0 0 5 3 0 0 0 0 6 4 0 0 0 0 5 4 0 0 0 0 5 4 0 0 0 0 5 4 0 0 1 0 4 4 1 0 0 0 0 1 3 3 3 4 2 4 1 4 0 5 0 4-2 4-2 4-3 4-4 3-4 2-4 1-4 1z m-541-2l-4-1-4-3-4-2-3-4-2-4-1-4-1-5 0-4 1-5 2-4 3-4 3-2 1-1 0-1 0 0 5-4 0 0 0 0 5-4 0 0 0 0 3-2 0 0 0 0 2-2 1 0 0 0 2-2 0 0 0 0 3-2 0 0 0 0 2-2 1 0 0 0 2-2 0 0 0 0 3-2 0 0 0 0 3-1 0-1 0 0 2-1 0 0 0 0 3-2 0 0 0 0 3-2 0 0 0 0 3-2 0 0 0 0 2-2 0 0 1 0 2-1 0 0 0 0 3-2 0 0 0 0 3-2 0 0 0 0 3-1 0 0 0-1 3-1 0 0 0 0 3-2 0 0 0 0 2-1 1 0 0 0 2-2 1 0 0 0 2-2 0 0 1 0 2-1 0 0 1 0 2-2 0 0 0 0 3-1 0 0 0 0 3-2 0 0 1 0 2-1 0 0 1 0 2-1 0-1 1 0 2-1 1 0 0 0 3-1 0 0 0 0 3-2 0 0 0 0 3-1 0 0 0 0 3-1 0 0 0 0 3-2 0 0 0 0 3-1 0 0 0 0 3-1 0 0 0 0 3-1 1 0 0 0 3-1 0 0 0 0 3-2 0 0 0 0 3-1 0 0 0 0 3-1 0 0 1 0 3-1 0 0 0 0 3-1 0 0 0 0 3-1 0 0 0 0 3-1 0 0 1 0 3-1 0 0 0 0 3-1 0 0 0 0 3-1 2 0 0 0 0 0 3-1 0 0 0-1 3-1 1 0 0 0 3-1 0 0 0 0 3-1 0 0 0 0 3-1 0 0 0 0 4 0 0-1 0 0 3 0 0 0 0 0 3-1 0 0 0 0 3-1 1 0 0 0 3-1 0 0 0 0 3-1 0 0 0 0 0 0 5 0 4 0 5 1 4 2 4 2 3 4 2 3 2 5 1 4 0 5 0 4-2 4-2 4-3 4-4 2-4 3-3 1 0 0-1 0-3 0-2 1 0 0-3 1 0 0-3 1 0 0-3 0 0 0-3 1-3 1-3 1 0 0-3 1-2 1-3 1-3 1-1 0-1 0-3 1-3 1-3 1 0 0-2 1-3 1-3 1-3 0-3 1 0 0-3 1-3 1-2 1 0 0-3 2-3 1 0 0-3 1 0 0-2 1-3 1 0 0-3 1-3 1-2 2-3 1 0 0-3 1-2 1-3 2-3 1-2 1 0 0-3 2-2 1 0 0-3 1 0 0-3 2 0 0-2 1-2 2-1 0-2 1 0 0-3 2-2 1 0 0-3 2-2 1 0 0-3 2 0 0-2 2 0 0-2 1-3 2 0 0-2 2-2 1-1 0-2 2 0 0-2 2-3 1 0 0-2 2 0 0-2 2 0 0-3 2-4 3-5 4-1 1-4 3-4 1-4 2-5 0z" horiz-adv-x="1000" />
<glyph glyph-name="sequential-mi-marker" unicode="&#xe816;" d="M200 600l0-100 600 0 0 100-600 0z m0-200l0-100 600 0 0 100-600 0z m0-200l0-100 600 0 0 100-600 0z" horiz-adv-x="1000" />
<glyph glyph-name="user-task" unicode="&#xe817;" d="M328 611c-51 0-87-39-88-84l0 0 0 0c0-13 4-27 10-40 4-10 9-18 15-25-37-13-80-33-102-75l-1-2 0-133 332 0 0 133-1 2c-22 41-64 62-101 75 18 18 23 41 23 65l0 0 0 0c0 45-36 84-87 84z m-35-47c3 0 5-1 8-1 23-1 30-5 36-9 6-4 10-8 26-8l0 0 0 0c12 0 18 3 22 5 1 1 3 2 4 3 4-8 6-17 6-27 0-27-4-45-29-61l2-18c6-1 11-3 16-5 1-3 2-7 2-12 1-4 1-9 1-13 0-3-2-5-2-5-12-13-34-20-57-20-23 0-45 7-57 20 0 0-2 2-2 5 0 4 0 9 1 13 0 5 1 9 2 12 5 2 10 4 15 5l2 20c-1 1-3 2-4 3-5 4-12 13-17 24-4 10-7 23-7 32 0 12 3 23 8 33 2 0 3 0 4 1 4 1 10 3 20 3z m-43-130c0 0 0 0 0 0-1-6-2-12-1-18 1-6 2-12 8-17 17-18 44-26 71-26 27 0 54 8 71 26 6 5 7 11 8 17 1 6 0 12-1 18 0 0 0 0 0 0 27-12 54-29 68-54l0-108-48 0 0 76-20 0 0-76-156 0 0 76-21 0 0-76-47 0 0 108c14 25 41 43 68 54z m-35 311c-107 0-195-87-195-194l0-402c0-107 88-194 195-194l570 0c108 0 195 87 195 194l0 402c0 107-87 194-195 194l-570 0z m0-60l570 0c75 0 135-59 135-134l0-402c0-75-60-134-135-134l-570 0c-75 0-135 59-135 134l0 402c0 75 60 134 135 134z" horiz-adv-x="1000" />
<glyph glyph-name="business-rule" unicode="&#xe818;" d="M89 659l0-617 822 0 0 617-822 0z m35-209l159 0 0-173-159 0 0 173z m194 0l558 0 0-173-558 0 0 173z m-194-208l159 0 0-165-159 0 0 165z m194 0l558 0 0-165-558 0 0 165z" horiz-adv-x="1000" />
<glyph glyph-name="sub-process-marker" unicode="&#xe819;" d="M150 700l0-25 0-675 700 0 0 700z m44-44l612 0 0-612-612 0z m261-106l0-155-155 0 0-90 155 0 0-155 90 0 0 155 155 0 0 90-155 0 0 155z" horiz-adv-x="1000" />
<glyph glyph-name="start-event-parallel-multiple" unicode="&#xe81a;" d="M496 802c-176 0-345-113-412-276-70-161-34-362 89-487 119-128 314-175 477-115 169 58 294 224 301 403 12 176-92 351-250 428-62 31-132 47-201 47-1 0-3 0-4 0z m12-49c173-1 335-126 380-293 47-159-17-344-155-439-143-105-354-97-489 18-136 108-185 309-115 468 60 147 212 248 371 246 3 0 6 0 8 0z m-78-208l0-125-125 0 0-140 125 0 0-125 140 0 0 125 125 0 0 140-125 0 0 125-140 0z m23-23l94 0 0-125 125 0 0-94-125 0 0-125-94 0 0 126-125 0 0 93 125 0 0 125z" horiz-adv-x="1000" />
<glyph glyph-name="start-event-error" unicode="&#xe81b;" d="M500 802c-178 2-349-112-416-276-70-161-34-362 89-487 119-128 314-175 477-115 169 58 294 224 301 403 12 176-92 351-250 428-62 31-132 47-201 47z m0-49c175 3 342-123 388-293 47-159-17-344-155-439-143-105-354-97-489 18-136 109-185 309-115 468 60 147 212 248 371 246z m173-210c-34-70-68-139-102-209-43 56-86 111-128 166-39-114-77-228-116-342 43 55 87 111 130 167 45-51 89-103 134-154 27 124 55 248 82 372z m-219-110c41-52 81-103 122-154 10 22 20 45 30 67-10-39-19-78-29-116-41 48-83 97-124 145-17-26-34-52-50-77 17 45 34 90 51 135z" horiz-adv-x="1000" />
<glyph glyph-name="intermediate-event-catch-signal" unicode="&#xe81c;" d="M499 802c-220 4-425-177-448-396-24-185 78-380 247-461 160-80 368-56 501 66 134 118 190 318 128 486-57 167-217 293-393 303-12 1-23 2-35 2z m-5-49c202 7 391-161 407-362 19-178-92-361-262-420-166-61-368-2-468 145-103 144-99 356 18 490 74 90 188 146 305 147z m8-44c-186 6-358-158-361-344-9-169 116-334 283-367 155-33 328 46 397 190 71 140 39 327-83 430-64 57-150 91-236 91z m-2-48c164 4 314-144 311-308 3-152-119-297-272-312-143-19-295 73-336 213-43 134 14 295 138 364 48 28 103 43 159 43z m0-99c-64-115-128-230-192-345 128 0 256 0 384 0-64 115-128 230-192 345z m0-51c50-90 100-180 151-270-101 0-201 0-302 0 51 90 101 180 151 270z" horiz-adv-x="1000" />
<glyph glyph-name="intermediate-event-catch-error" unicode="&#xe81d;" d="M499 802c-220 4-425-177-448-396-24-185 78-380 247-461 160-80 368-56 501 66 134 118 190 318 128 486-57 167-217 293-393 303-12 1-23 2-35 2z m-5-49c202 7 391-161 407-362 19-178-92-361-262-420-166-61-368-2-468 145-103 144-99 356 18 490 74 90 188 146 305 147z m8-44c-186 6-358-158-361-344-9-169 116-334 283-367 155-33 328 46 397 190 71 140 39 327-83 430-64 57-150 91-236 91z m-2-48c164 4 314-144 311-308 3-152-119-297-272-312-143-19-295 73-336 213-43 134 14 295 138 364 48 28 103 43 159 43z m173-118c-34-70-68-139-102-209-43 56-86 111-128 166-39-114-77-228-116-342 43 55 87 111 130 167 45-51 89-103 134-154 27 124 55 248 82 372z m-219-110c41-52 81-103 122-154 10 22 20 45 30 67-10-39-19-78-29-116-41 48-83 97-124 145-17-26-34-51-50-77 17 45 34 90 51 135z" horiz-adv-x="1000" />
<glyph glyph-name="end-event-compensation" unicode="&#xe81e;" d="M491 802c-219 0-420-183-440-400-22-186 82-380 253-459 158-77 361-53 492 67 134 115 192 312 133 480-55 172-220 303-401 311-13 1-25 1-37 1z m9-142c161 5 308-137 310-298 7-147-103-292-250-317-142-28-300 54-350 192-53 136 2 309 132 380 47 28 103 43 158 43z m-16-162c-70-49-140-99-209-148 70-49 139-99 209-148 0 48 0 95 0 143 67-48 135-95 202-143 0 99 0 197 0 296-67-48-135-95-202-143 0 48 0 95 0 143z" horiz-adv-x="1000" />
<glyph glyph-name="subprocess-collapsed" unicode="&#xe81f;" d="M216 716c-86 0-155-69-155-154l0-424c0-85 69-154 155-154l569 0c85 0 154 69 154 154l0 424c0 85-69 154-154 154l-569 0z m0-48l569 0c59 0 106-47 106-106l0-424c0-59-47-106-106-106l-116 0 0 308-338 0 0-15 0-293-115 0c-60 0-106 47-106 106l0 424c0 59 46 106 106 106z m146-359l276 0 0-276-276 0 0 276z m115-39l0-23 0-54-54 0-23 0 0-46 23 0 54 0 0-54 0-23 46 0 0 23 0 54 54 0 23 0 0 46-23 0-54 0 0 54 0 23-46 0z" horiz-adv-x="1000" />
<glyph glyph-name="subprocess-expanded" unicode="&#xe820;" d="M215 716c-85 0-154-69-154-154l0-424c0-85 69-154 154-154l570 0c85 0 154 69 154 154l0 424c0 85-69 154-154 154l-570 0z m0-48l570 0c59 0 106-47 106-106l0-424c0-59-47-106-106-106l-116 0 0 292 0 16-15 0-308 0-15 0 0-16 0-292-116 0c-59 0-105 47-105 106l0 424c0 59 46 106 105 106z m147-359l276 0 0-277-276 0 0 277z m37-110l0-47 203 0 0 47-203 0z" horiz-adv-x="1000" />
<glyph glyph-name="task" unicode="&#xe821;" d="M215 716c-85 0-154-69-154-154l0-424c0-85 69-154 154-154l570 0c85 0 154 69 154 154l0 424c0 85-69 154-154 154l-570 0z m0-48l570 0c59 0 106-47 106-106l0-424c0-59-47-106-106-106l-570 0c-59 0-105 47-105 106l0 424c0 59 46 106 105 106z" horiz-adv-x="1000" />
<glyph glyph-name="end-event-error" unicode="&#xe822;" d="M491 802c-219 0-420-183-440-400-22-186 82-380 253-459 158-77 361-53 492 67 134 115 192 312 133 480-55 172-220 303-401 311-13 1-25 1-37 1z m9-142c161 5 308-137 310-298 7-147-103-292-250-317-142-28-300 54-350 192-53 136 2 309 132 380 47 28 103 43 158 43z m173-117c-34-70-68-139-102-209-43 56-86 111-128 166-39-114-77-228-116-342 43 55 87 111 130 167 45-51 89-103 134-154 27 124 55 248 82 372z" horiz-adv-x="1000" />
<glyph glyph-name="intermediate-event-catch-escalation" unicode="&#xe823;" d="M499 802c-220 4-425-177-448-396-24-185 78-380 247-461 160-80 368-56 501 66 134 118 190 318 128 486-57 167-217 293-393 303-12 1-23 2-35 2z m-5-49c202 7 391-161 407-362 19-178-92-361-262-420-166-61-368-2-468 145-103 144-99 356 18 490 74 90 188 146 305 147z m8-44c-186 6-358-158-361-344-9-169 116-334 283-367 155-33 328 46 397 190 71 140 39 327-83 430-64 57-150 91-236 91z m-2-48c164 4 314-144 311-308 3-152-119-297-272-312-143-19-295 73-336 213-43 134 14 295 138 364 48 28 103 43 159 43z m0-111c-47-131-77-268-124-400 43 43 81 91 124 135 42-45 83-90 125-135-43 133-83 267-125 400z m1-83c23-73 45-146 68-219-22 24-45 49-68 74-19-17-69-82-66-68 24 70 41 143 66 213z" horiz-adv-x="1000" />
<glyph glyph-name="intermediate-event-catch-timer" unicode="&#xe824;" d="M499 802c-1 0-2 0-3 0-202 1-391-150-436-346-42-173 28-368 174-471 145-107 354-116 506-18 149 93 235 276 207 450-26 176-164 330-338 371-36 9-73 14-110 14z m-5-49c3 0 7 0 10 0 187 2 362-146 392-331 32-167-54-348-205-427-154-85-363-54-483 77-124 127-147 338-53 488 71 116 203 192 339 193z m8-44c-3 0-7 0-10 0-172 0-330-143-349-314-22-161 79-328 233-382 145-55 322-3 413 124 98 129 92 326-17 447-67 77-167 125-270 125z m-2-48c2 0 4 0 6 0 153 0 292-129 304-281 16-145-84-293-225-330-137-40-296 27-361 154-69 129-33 305 86 392 54 42 122 65 190 65z m-4-97c-84 0-164-55-194-133-33-76-15-170 43-229 56-60 149-82 226-54 81 28 141 108 143 194 5 83-46 166-121 201-29 14-61 21-93 21-1 0-3 0-4 0z m8-39c76 0 148-57 166-131 20-73-14-156-79-194-67-42-160-31-215 26-58 56-68 152-24 219 32 49 89 81 148 80 1 0 2 0 4 0z m51-49c-19-36-39-71-58-107-18-2-23-29-6-36 11-8 20 5 30 4l89 0 0 25-89 0c18 34 37 68 56 102-7 4-14 8-22 12z" horiz-adv-x="1000" />
<glyph glyph-name="start-event-escalation" unicode="&#xe825;" d="M500 802c-178 2-349-112-416-276-70-161-34-362 89-487 119-128 314-175 477-115 169 58 294 224 301 403 12 176-92 351-250 428-62 31-132 47-201 47z m0-49c175 3 342-123 388-293 47-159-17-344-155-439-143-105-354-97-489 18-136 109-185 309-115 468 60 147 212 248 371 246z m0-203c-47-131-77-268-124-400 43 43 81 91 124 135 42-45 83-90 125-135-43 133-83 267-125 400z m1-83c23-73 45-146 68-219-22 24-45 49-68 74-19-17-69-82-66-68 24 70 41 143 66 213z" horiz-adv-x="1000" />
<glyph glyph-name="start-event-signal" unicode="&#xe826;" d="M500 802c-178 2-349-112-416-276-70-161-34-362 89-487 119-128 314-175 477-115 169 58 294 224 301 403 12 176-92 351-250 428-62 31-132 47-201 47z m0-49c175 3 342-123 388-293 47-159-17-344-155-439-143-105-354-97-489 18-136 109-185 309-115 468 60 147 212 248 371 246z m0-191c-64-115-128-230-192-345 128 0 256 0 384 0-64 115-128 230-192 345z m0-51c50-90 100-180 151-270-101 0-201 0-302 0 51 90 101 180 151 270z" horiz-adv-x="1000" />
<glyph glyph-name="business-rule-task" unicode="&#xe827;" d="M215 745c-107 0-195-87-195-194l0-402c0-107 88-194 195-194l570 0c108 0 195 87 195 194l0 402c0 107-87 194-195 194l-570 0z m0-60l570 0c75 0 135-59 135-134l0-402c0-75-60-134-135-134l-570 0c-75 0-135 59-135 134l0 402c0 75 60 134 135 134z m-36-72l0-380 506 0 0 380-506 0z m21-131l463 0 0-104-343 0 0 103-22 0 0-103-98 0 0 104z m0-125l98 0 0-102-98 0 0 102z m120 0l343 0 0-102-343 0 0 102z m-118 232l0-108 461 0 0 108z" horiz-adv-x="1000" />
<glyph glyph-name="manual" unicode="&#xe828;" d="M460 659c-11 0-22-5-31-10l0 0 0 0c-47-31-209-143-245-168l0 0 0 0c-32-22-54-55-66-95l0 0 0 0c-13-41-11-86-11-124l0 0 0 0c0-28 1-53 8-83 0 0 0 0 0 0 11-44 31-75 61-95 29-19 65-26 105-26 147-1 293-1 439 0l0 0 0 0c16 0 31 6 41 18 10 12 14 28 14 45 0 11-2 22-5 32l16 0c16 0 30 4 40 14 11 9 16 22 19 35l0 0c4 19 2 38-6 53 17 2 31 8 41 19 10 13 13 29 13 47 0 18-4 35-14 49-10 13-27 23-46 23l0 0 0 0c-7 0-13 0-21 0 4 9 6 19 6 31l0 0 0 0c0 17-5 35-15 48-10 14-27 23-46 23-112 0-223-1-317-1 5 5 9 10 15 15 16 17 31 32 39 42 20 25 23 59 6 83-8 13-21 22-34 24-2 0-4 1-5 1l0 0c-1 0-1 0-1 0z m0-35c0 0 1 0 1-1 3 0 6-1 10-8l0 0 0 0c6-9 6-29-4-42l0 0 0 0c-4-5-21-23-37-39-16-16-32-31-39-40-8-9-5-16-3-21 2-5 4-10 14-12 3-1 4-1 5-1 0 0 1 0 3 0 2 0 5 0 9 0 113-1 225 0 338 0l0 0 0 0c9 0 13-3 18-9 4-6 8-16 8-28 0-12-3-19-7-24-3-4-8-6-19-6l-242 0 0-35 242 0 0 0c34 0 51 0 76 0 9 0 13-3 18-9 4-6 7-16 7-28l0 0c0-13-2-21-5-24-3-4-8-7-20-7-4 0-34 0-47 0 0 0 0 0-1 0-90 0-180 0-270 0l0 0 0-35 0 0c0 0 191 0 271 0 10 0 15-4 20-12 5-8 7-20 5-34l0 0 0 0c-2-9-5-14-8-17-3-2-7-4-17-4-90 0-181 0-271 0l0 0 0-35 0 0 205 0 0 0c7 0 10-2 14-7 3-4 6-13 6-25l0 0 0 0c0-11-3-19-6-23-3-4-6-5-14-5-146-1-292-1-438 0l0 0 0 0c-37 0-66 6-87 20-21 14-37 37-46 74l0 1 0 0c-6 26-7 47-7 74l0 0c0 39-1 80 9 114 11 34 28 59 53 76l0 0c36 25 199 138 244 167l0 0c5 3 8 4 11 4 0 1 1 1 1 1z" horiz-adv-x="1000" />
<glyph glyph-name="receive" unicode="&#xe829;" d="M95 618l0-535 811 0 0 535-811 0z m83-35l644 0-322-212-322 212z m-48-10l370-244 371 244 0-455-741 0 0 455z" horiz-adv-x="1000" />
<glyph glyph-name="call-activity" unicode="&#xe82a;" d="M231 745c-116 0-211-93-211-208l0-374c0-115 95-208 211-208l538 0c116 0 211 93 211 208l0 374c0 115-95 208-211 208l-538 0z m0-110l538 0c58 0 101-43 101-98l0-374c0-55-43-98-101-98l-538 0c-58 0-101 43-101 98l0 374c0 55 43 98 101 98z" horiz-adv-x="1000" />
<glyph glyph-name="start-event-timer" unicode="&#xe82b;" d="M500 802c-249 0-452-203-452-452 0-249 203-452 452-452 249 0 452 203 452 452 0 249-203 452-452 452z m0-49c223 0 403-180 403-403 0-223-180-403-403-403-223 0-403 180-403 403 0 223 180 403 403 403z m-4-189c-84 0-164-55-194-133-33-76-15-170 43-229 56-60 149-82 226-54 81 28 141 108 143 194 5 83-46 166-121 201-29 14-61 21-93 21-1 0-3 0-4 0z m8-39c76 0 148-57 166-131 20-73-14-156-79-194-67-42-160-31-215 26-58 56-68 152-24 219 32 49 89 81 148 80 1 0 2 0 4 0z m51-49c-19-36-39-71-58-107-18-2-23-29-6-36 11-8 20 5 30 4l89 0 0 25-89 0c18 34 37 68 56 102-7 4-14 8-22 12z" horiz-adv-x="1000" />
<glyph glyph-name="start-event-message" unicode="&#xe82c;" d="M500 802c-178 2-349-112-416-276-70-161-34-362 89-487 119-128 314-175 477-115 169 58 294 224 301 403 12 176-92 351-250 428-62 31-132 47-201 47z m0-49c175 3 342-123 388-293 47-159-17-344-155-439-143-105-354-97-489 18-136 109-185 309-115 468 60 147 212 248 371 246z m-205-247c0-104 0-208 0-312 137 0 273 0 410 0 0 104 0 208 0 312-137 0-273 0-410 0z m91-49c76 0 152 0 228 0-40-24-81-79-121-85-36 29-71 57-107 85z m270-28c0-62 0-124 0-186-104 0-208 0-312 0 0 62 0 124 0 186 52-42 104-83 156-125 52 42 104 83 156 125z" horiz-adv-x="1000" />
<glyph glyph-name="intermediate-event-none" unicode="&#xe82d;" d="M496 802c-219 2-422-178-445-396-24-185 78-380 247-461 160-80 368-56 501 66 134 118 190 318 128 486-57 165-214 291-388 303-15 1-29 2-43 2z m8-49c201 3 386-169 398-370 16-178-100-360-271-415-164-56-362 4-460 148-103 144-99 357 19 491 76 92 194 149 314 146z m-12-44c-185 0-352-166-352-352-4-168 124-331 291-360 153-30 322 49 390 191 71 141 39 329-84 431-67 59-156 92-245 90z m14-48c165 1 312-150 305-315 0-150-121-290-272-305-143-19-295 73-336 213-43 134 14 296 139 364 50 29 107 44 164 43z" horiz-adv-x="1000" />
<glyph glyph-name="intermediate-event-catch-link" unicode="&#xe82e;" d="M499 802c-220 4-425-177-448-396-24-185 78-380 247-461 160-80 368-56 501 66 134 118 190 318 128 486-57 167-217 293-393 303-12 1-23 2-35 2z m-5-49c202 7 391-161 407-362 19-178-92-361-262-420-166-61-368-2-468 145-103 144-99 356 18 490 74 90 188 146 305 147z m8-44c-186 6-358-158-361-344-9-169 116-334 283-367 155-33 328 46 397 190 71 140 39 327-83 430-64 57-150 91-236 91z m-2-48c164 4 314-144 311-308 3-152-119-297-272-312-143-19-295 73-336 213-43 134 14 295 138 364 48 28 103 43 159 43z m50-116c0-33 0-67 0-100-75 0-150 0-226 0 0-63 0-127 0-190 76 0 151 0 226 0 0-33 0-67 0-100 55 65 110 130 165 195-55 65-110 130-165 195z m28-73c34-40 68-81 102-121-34-40-68-81-102-121 0 18 0 36 0 54-75 0-149 0-223 0 0 44 0 89 0 133 74 0 148 0 223 0 0 18 0 37 0 55z" horiz-adv-x="1000" />
<glyph glyph-name="end-event-escalation" unicode="&#xe82f;" d="M491 802c-219 0-420-183-440-400-22-186 82-380 253-459 158-77 361-53 492 67 134 115 192 312 133 480-55 172-220 303-401 311-13 1-25 1-37 1z m9-142c161 5 308-137 310-298 7-147-103-292-250-317-142-28-300 54-350 192-53 136 2 309 132 380 47 28 103 43 158 43z m0-110c-47-131-77-268-124-400 43 43 81 91 124 135 42-45 83-90 125-135-43 133-83 267-125 400z" horiz-adv-x="1000" />
<glyph glyph-name="text-annotation" unicode="&#xe830;" d="M677 795l0-25 0-411 0-412 0-24 24 0 224 0 25 0 0 49-25 0-199 0 0 387 0 386 199 0 25 0 0 50-25 0-224 0-24 0z m-81-386l-75-60 60-75 75 60-60 75z m-151-119l-75-60 60-75 75 59-60 76z m-150-120l-76-59 60-76 75 60-59 75z m-151-119l-76-60 60-75 76 59-60 76z" horiz-adv-x="1000" />
<glyph glyph-name="bpmn-io" unicode="&#xe831;" d="M674 41h-348v-191h348z m-348 809v-714h176c114 0 171 57 171 166v58c0 76-23 133-81 157 48 24 67 71 67 143v28c0 105-48 162-162 162z m114-100h57c43 0 57-24 57-76v-38c0-57-23-76-66-76h-48z m-5-300h53c47 0 71-19 71-86v-62c0-52-19-71-57-71h-67z" horiz-adv-x="1000" />
<glyph glyph-name="gateway-complex" unicode="&#xe832;" d="M500 802c-9 0-19-4-26-11l-415-415c-14-14-14-38 0-52l415-415c14-14 38-14 52 0l415 415c14 14 14 38 0 52l-415 415c-7 7-17 11-26 11z m0-62l390-390-390-390-390 390 390 390z m-9-192l0 0c0 0-4-1-4-1 0 0-4-2-4-2 0 0-2-3-2-3 0 0-1-4-1-4l0-140-99 99 0 0c0 0-3 2-3 2 0 0-4 1-4 1 0 0-4-1-4-1 0 0-4-2-4-2l-13-13c0 0-2-4-2-4 0 0-1-4-1-4 0 0 1-4 1-4 0 0 2-3 2-3l99-99-140 0 0 0c0 0-4-1-4-1 0 0-3-2-3-2l0 0c0 0-2-4-2-4 0 0-1-4-1-4l0-18c0 0 1-4 1-4 0 0 2-4 2-4 0 0 3-2 3-2 0 0 4-1 4-1l140 0-99-99 0 0c0 0-2-3-2-3 0 0-1-4-1-4 0 0 1-4 1-4 0 0 2-4 2-4l13-13c0 0 4-2 4-2 0 0 4-1 4-1 0 0 4 1 4 1 0 0 3 2 3 2l99 99 0-140 0 0c0 0 1-4 1-4 0 0 2-3 2-3 0 0 4-2 4-2 0 0 4-1 4-1l18 0c0 0 4 1 4 1 0 0 4 2 4 2 0 0 2 3 2 3 0 0 1 4 1 4l0 140 99-99c0 0 3-2 3-2 0 0 4-1 4-1 0 0 4 1 4 1 0 0 4 2 4 2l13 13c0 0 2 4 2 4 0 0 1 4 1 4 0 0-1 4-1 4 0 0-2 4-2 4l-99 98 140 0c0 0 4 1 4 1 0 0 3 2 3 2 0 0 3 4 3 4 0 0 0 4 0 4l0 18c0 0 0 4 0 4 0 0-3 4-3 4 0 0-3 2-3 2 0 0-4 1-4 1l-140 0 99 99c0 0 2 3 2 3 0 0 1 4 1 4 0 0-1 4-1 4 0 0-2 4-2 4l-13 13c0 0-4 2-4 2 0 0-4 1-4 1 0 0-4-1-4-1 0 0-3-2-3-2l-99-99 0 140c0 0-1 4-1 4 0 0-2 3-2 3 0 0-4 3-4 3 0 0-4 0-4 0l-18 0z m-117-48c0 0 0 0 0 0l0 0c0 0 0 0 0 0z" horiz-adv-x="1000" />
<glyph glyph-name="gateway-eventbased" unicode="&#xe833;" d="M500 802c-9 0-19-4-26-11l-415-415c-14-14-14-38 0-52l415-415c14-14 38-14 52 0l415 415c14 14 14 38 0 52l-415 415c-7 7-17 11-26 11z m0-62l390-390-390-390-390 390 390 390z m0-166l-7-5-208-151 82-253 266 0 82 253-215 156z m0-30l187-135-72-220-230 0-72 220 187 135z" horiz-adv-x="1000" />
<glyph glyph-name="gateway-none" unicode="&#xe834;" d="M59 376c-14-14-14-38 0-52l415-415c14-14 38-14 52 0l415 415c14 14 14 38 0 52l-415 415c-14 14-38 14-52 0l-415-415z m51-26l390 390 390-390-390-390-390 390z" horiz-adv-x="1000" />
<glyph glyph-name="gateway-or" unicode="&#xe835;" d="M500 802c-9 0-19-4-26-11l-415-415c-14-14-14-38 0-52l415-415c14-14 38-14 52 0l415 415c14 14 14 38 0 52l-415 415c-7 7-17 11-26 11z m0-62l390-390-390-390-390 390 390 390z m0-180c-116 0-210-94-210-210 0-116 94-210 210-210 116 0 210 94 210 210 0 116-94 210-210 210z m0-23c103 0 187-84 187-187 0-103-84-187-187-187-103 0-187 84-187 187 0 103 84 187 187 187z" horiz-adv-x="1000" />
<glyph glyph-name="end-event-terminate" unicode="&#xe836;" d="M491 802c-219 0-420-183-440-400-22-186 82-380 253-459 158-77 361-53 492 67 134 115 192 312 133 480-55 172-220 303-401 311-13 1-25 1-37 1z m9-142c161 5 308-137 310-298 7-147-103-292-250-317-142-28-300 54-350 192-53 136 2 309 132 380 47 28 103 43 158 43z m0-81c-149 6-268-156-219-297 38-143 229-210 349-121 126 79 133 281 13 369-40 32-92 50-143 49z" horiz-adv-x="1000" />
<glyph glyph-name="end-event-signal" unicode="&#xe837;" d="M491 802c-219 0-420-183-440-400-22-186 82-380 253-459 158-77 361-53 492 67 134 115 192 312 133 480-55 172-220 303-401 311-13 1-25 1-37 1z m9-142c161 5 308-137 310-298 7-147-103-292-250-317-142-28-300 54-350 192-53 136 2 309 132 380 47 28 103 43 158 43z m0-98c-64-115-128-230-192-345 128 0 256 0 384 0-64 115-128 230-192 345z" horiz-adv-x="1000" />
<glyph glyph-name="end-event-none" unicode="&#xe838;" d="M496 802c-203 1-394-153-437-351-41-174 33-368 181-470 143-103 348-111 497-15 150 91 238 275 210 449-26 181-170 339-350 376-33 7-67 11-101 11z m10-142c150 1 287-123 302-271 19-142-72-291-210-334-134-45-296 13-366 138-77 129-45 313 78 403 56 43 126 66 196 64z" horiz-adv-x="1000" />
<glyph glyph-name="end-event-multiple" unicode="&#xe839;" d="M491 802c-219-1-420-183-440-401-22-185 82-379 252-458 159-77 362-53 493 66 134 116 192 313 133 481-55 171-220 303-401 311-13 0-25 1-37 1z m9-142c161 5 308-137 310-298 7-148-104-292-250-317-142-28-300 54-350 192-53 136 1 308 132 380 47 28 102 43 158 43z m0-86c-72-52-143-104-215-156 27-84 55-169 82-253 89 0 177 0 266 0 28 84 55 169 82 253-71 52-143 104-215 156z" horiz-adv-x="1000" />
<glyph glyph-name="end-event-message" unicode="&#xe83a;" d="M491 802c-219 0-420-183-440-400-22-186 82-380 253-459 158-77 361-53 492 67 134 115 192 312 133 480-55 172-220 303-401 311-13 1-25 1-37 1z m9-142c161 5 308-137 310-298 7-147-103-292-250-317-142-28-300 54-350 192-53 136 2 309 132 380 47 28 103 43 158 43z m-167-154c57-46 114-92 171-138 56 46 113 92 170 138-114 0-227 0-341 0z m-38-32c0-93 0-187 0-280 137 0 273 0 410 0 0 91 0 183 0 274-67-54-134-109-201-163-70 56-139 113-209 169z" horiz-adv-x="1000" />
<glyph glyph-name="end-event-link" unicode="&#xe83b;" d="M491 802c-219 0-420-183-440-400-22-186 82-380 253-459 158-77 361-53 492 67 134 115 192 312 133 480-55 172-220 303-401 311-13 1-25 1-37 1z m9-142c161 5 308-137 310-298 7-147-103-292-250-317-142-28-300 54-350 192-53 136 2 309 132 380 47 28 103 43 158 43z m50-115c0-33 0-67 0-100-75 0-150 0-226 0 0-63 0-127 0-190 76 0 151 0 226 0 0-33 0-67 0-100 55 65 110 130 165 195-55 65-110 130-165 195z" horiz-adv-x="1000" />
<glyph glyph-name="intermediate-event-catch-message" unicode="&#xe83c;" d="M499 802c-220 4-425-177-448-396-24-185 78-380 247-461 160-80 368-56 501 66 134 118 190 318 128 486-57 167-217 293-393 303-12 1-23 2-35 2z m-5-49c202 7 391-161 407-362 19-178-92-361-262-420-166-61-368-2-468 145-103 144-99 356 18 490 74 90 188 146 305 147z m8-44c-186 6-358-158-361-344-9-169 116-334 283-367 155-33 328 46 397 190 71 140 39 327-83 430-64 57-150 91-236 91z m-2-48c164 4 314-144 311-308 3-152-119-297-272-312-143-19-295 73-336 213-43 134 14 295 138 364 48 28 103 43 159 43z m-205-155c0-104 0-208 0-312 137 0 273 0 410 0 0 104 0 208 0 312-137 0-273 0-410 0z m91-49c76 0 152 0 228 0-40-24-81-79-121-85-36 29-71 57-107 85z m270-28c0-62 0-124 0-186-104 0-208 0-312 0 0 62 0 124 0 186 52-42 104-83 156-125 52 42 104 83 156 125z" horiz-adv-x="1000" />
<glyph glyph-name="intermediate-event-throw-compensation" unicode="&#xe83d;" d="M499 802c-220 4-425-177-448-396-24-185 78-380 247-461 160-80 368-56 501 66 134 118 190 318 128 486-57 167-217 293-393 303-12 1-23 2-35 2z m-5-49c202 7 391-161 407-362 19-178-92-361-262-420-166-61-368-2-468 145-103 144-99 356 18 490 74 90 188 146 305 147z m8-44c-186 6-358-158-361-344-9-169 116-334 283-367 155-33 328 46 397 190 71 140 39 327-83 430-64 57-150 91-236 91z m-2-48c164 4 314-144 311-308 3-152-119-297-272-312-143-19-295 73-336 213-43 134 14 295 138 364 48 28 103 43 159 43z m-16-163c-70-49-140-99-209-148 70-49 139-99 209-148 0 48 0 95 0 143 67-48 135-95 202-143 0 99 0 197 0 296-67-48-135-95-202-143 0 48 0 95 0 143z" horiz-adv-x="1000" />
<glyph glyph-name="start-event-multiple" unicode="&#xe83e;" d="M500 802c-178 2-349-112-416-276-70-161-34-362 89-487 119-128 314-175 477-115 169 58 294 224 301 403 12 176-92 351-250 428-62 31-132 47-201 47z m0-49c175 3 342-123 388-293 47-159-17-344-155-439-143-105-354-97-489 18-136 109-185 309-115 468 60 147 212 248 371 246z m0-179c-72-52-143-104-215-156 27-84 55-169 82-253 89 0 177 0 266 0 28 84 55 169 82 253-71 52-143 104-215 156z m0-30c62-45 124-90 187-135-24-74-48-147-72-220-77 0-153 0-230 0-24 73-48 146-72 220 63 45 125 90 187 135z" horiz-adv-x="1000" />
<glyph glyph-name="script" unicode="&#xe83f;" d="M380 661l-4-2-2-1c-58-35-98-67-125-98-26-31-39-62-40-92 0-60 44-105 83-145 39-40 74-78 78-109 1-16-3-32-20-54-17-22-49-48-99-78l-74-43 458 0 5 3 1 0c53 31 89 60 112 89 23 29 32 59 29 88-6 56-52 97-90 137-39 39-70 76-70 112 0 17 7 37 29 62 21 25 57 55 113 88l0 0 73 43-457 0z m13-46l282 0c-25-19-45-37-60-55-26-31-39-62-39-92-1-60 43-105 82-145 39-40 74-78 78-109 1-16-2-32-20-54-16-21-47-46-94-74l-283 0c20 15 36 30 47 45 23 29 33 59 30 88-6 56-52 97-91 137-38 39-70 76-69 112 0 17 7 37 28 62 21 25 56 53 109 85z m-66-80l0-21 220 0 0 21-220 0z m-9-115l0-22 229 0 0 22-229 0z m104-116l0-21 221 0 0 21-221 0z m31-115l0-22 229 0 0 22-229 0z" horiz-adv-x="1000" />
<glyph glyph-name="manual-task" unicode="&#xe840;" d="M215 745c-107 0-195-87-195-194l0-402c0-107 88-194 195-194l570 0c108 0 195 87 195 194l0 402c0 107-87 194-195 194l-570 0z m0-60l570 0c75 0 135-59 135-134l0-402c0-75-60-134-135-134l-570 0c-75 0-135 59-135 134l0 402c0 75 60 134 135 134z m133-40c-7 0-13-2-18-6l0 0 0 0c-30-19-131-89-153-104l0 0 0 0c-20-14-34-35-42-60l0 0 0 0c-8-25-7-53-7-77l0 0 0 0c0-18 1-33 5-52 0 0 0 0 0 0 7-27 19-49 37-63 18-15 41-22 67-22 91-1 183-1 274 0l0 0 0 0c10 0 19 3 25 11 6 7 9 17 9 27 0 7-1 13-3 19l10 0c10 0 19 3 25 9 7 7 10 15 12 23 0 0 0 0 0 0 2 12 1 24-4 34 11 1 21 8 26 16 6 9 8 20 8 31 0 11-3 22-9 31-6 9-16 15-29 15l0 0 0 0c-4 0-9 0-14 0 3 7 5 15 5 24l0 0 0 0c0 11-3 21-10 29-6 8-17 13-28 13-68 0-127 0-192 0-3 0-4 0-6 0 3 3 6 6 9 9 10 10 20 20 25 26 12 16 14 37 4 52-6 8-13 14-22 15-1 0-2 0-3 0 0 0-1 0-1 0z m1-22c0 0 0 0 0 0 2 0 4 0 7-5l0 0 0 0c4-6 3-18-3-26l0 0 0 0c-2-3-13-14-23-24-10-10-20-20-25-25-4-6-2-11-1-13 1-3 2-7 9-8 2-1 2-1 2-1 1 0 1 0 2 0 73-1 150 0 217 0l0 0 0 0c6 0 9-1 11-5 3-3 5-8 5-16 0-7-2-14-5-17-2-4-5-6-11-6-51 0-102 0-153 1l0-22c67-1 133-1 200-1 5 0 8-2 11-6 3-4 5-11 5-18l0 0c0-8-2-15-4-19-3-4-5-6-12-6-69 0-136 0-200 0l0-22c57 0 114 0 171 0 6 0 9-3 12-8 4-5 5-13 3-22l0 0 0 0c-1-5-3-9-5-11-2-2-4-3-10-3l-171 0c0-8 0-15 0-22 43 0 86 0 130 0l0 0 0 0c5 0 7-1 9-4 2-2 3-7 3-15l0 0 0 0c0-7-2-11-3-13-2-2-4-3-9-4-91 0-183 0-274 0l0 0 0 0c-22 1-39 6-53 18-13 11-24 28-29 51l0 0 0 0c-4 17-5 30-5 47l0 0c0 24 0 50 6 71 7 21 18 37 33 48l0 0c23 15 124 86 152 104l0 0c3 1 5 2 7 2 0 0 0 0 1 0z" horiz-adv-x="1000" />
<glyph glyph-name="send" unicode="&#xe841;" d="M99 608l401-227 401 227-802 0z m1-84l0-448 802 0 0 448-402-224-400 224z" horiz-adv-x="1000" />
<glyph glyph-name="service" unicode="&#xe842;" d="M413 631c0-19 0-37 0-56-16-4-30-10-44-18l-40 39-74-74 40-40c-8-13-14-28-18-43l-56 0 0-106 56 0c6-20 17-39 28-55l0 91-49-1 0 36 49 0 3 14c4 20 12 40 23 57l8 12-34 35 25 25 34-34 12 8c18 11 38 19 58 24l14 3 0 48 36 0 0-48 14 0 80 0c-9 10-46 24-59 28l0 55c-39 0-70 0-106 0z m100-101l0-55c-16-5-31-11-44-19l-40 40-74-75 39-40c-7-13-13-28-17-43l-57 0 0-106 57 1c5-16 11-30 18-44l-40-40 75-74 41 40c13-8 28-14 44-18l0-57c36 0 74 0 105 0l0 58c16 4 31 10 44 18l41-40 74 75-41 40c8 14 14 28 18 44l56 0 0 105-56 0c-5 16-11 30-19 43l39 39-75 74-39-39c-14 8-28 14-44 18l1 55-106 0z m35-35l36 0-1-48 15-3c20-4 40-12 58-23l11-8 34 34 25-25-33-34 8-12c12-18 20-37 24-57l3-14 49 0 0-35-49-1-3-14c-4-20-12-40-23-57l-8-12 36-35-26-26-35 36-12-8c-18-12-38-20-58-24l-14-3 0-51c-9 0-20 0-35 0l0 50-15 3c-20 4-40 12-58 24l-11 8-36-36-26 25 36 35-8 12c-12 18-20 38-24 58l-3 14-50-1 0 36 50 0 3 14c4 21 12 40 23 58l8 12-35 34 25 25 35-34 12 8c18 12 37 19 58 24l14 3 0 48z m18-128c-43 0-79-36-79-79 0-44 36-79 79-79 43 0 79 35 79 79 0 43-36 79-79 79z m0-35c25 0 44-20 44-44 0-25-19-44-44-44-24 0-44 19-44 44 0 24 20 44 44 44z" horiz-adv-x="1000" />
<glyph glyph-name="receive-task" unicode="&#xe843;" d="M215 745c-107 0-195-87-195-194l0-402c0-107 88-194 195-194l570 0c108 0 195 87 195 194l0 402c0 107-87 194-195 194l-570 0z m0-60l570 0c75 0 135-59 135-134l0-402c0-75-60-134-135-134l-570 0c-75 0-135 59-135 134l0 402c0 75 60 134 135 134z m-38-83l0-347 526 0 0 347-526 0z m54-23l418 0-209-137-209 137z m-31-6l240-158 241 158 0-295-481 0 0 295z" horiz-adv-x="1000" />
<glyph glyph-name="user" unicode="&#xe844;" d="M496 668c-89 0-152-69-152-146l0 0 0 0c0-24 6-48 16-71 7-16 16-31 27-43-65-22-140-58-178-130l-2-4 0-231 578 0 0 231-2 4c-37 71-111 107-175 129 31 32 40 73 40 115l0 0 0 0c0 77-63 146-152 146z m-61-83c5 0 9 0 14-1 39-2 53-9 63-16 10-6 17-13 44-14l0 0 0 0c21 1 32 5 39 9 3 2 5 4 8 5 7-14 10-30 10-46 0-47-8-80-51-106l4-32c9-3 19-6 28-9 1-5 3-13 4-20 1-8 1-16 1-23-1-6-3-9-3-10-22-21-61-34-100-34-39 0-78 13-100 34 0 1-2 4-3 10 0 7 0 15 1 23 1 7 3 15 4 20 9 3 19 6 27 9l3 34c-2 2-4 4-7 6-9 7-21 23-29 41-8 19-13 40-13 57 0 20 5 39 15 56 2 1 4 1 6 2 7 3 18 5 35 5z m-75-225c0 0 0 0 0-1-2-9-2-20-1-30 1-11 4-22 13-31 31-31 78-45 124-45 46 0 93 14 124 45 10 9 12 20 13 31 2 10 1 21-1 30 0 1 0 1 0 1 48-21 93-50 118-95l0-187-83 0 0 132-35 0 0-132-272 0 0 132-35 0 0-132-83 0 0 187c25 45 70 74 118 95z" horiz-adv-x="1000" />
<glyph glyph-name="start-event-none" unicode="&#xe845;" d="M496 802c-176 0-345-113-412-276-70-161-34-362 89-487 119-128 314-175 477-115 169 58 294 224 301 403 12 176-92 351-250 428-62 31-132 47-201 47-1 0-3 0-4 0z m12-49c173-1 335-126 380-293 47-159-17-344-155-439-143-105-354-97-489 18-136 109-185 309-115 468 60 147 212 248 371 246 3 0 6 0 8 0z" horiz-adv-x="1000" />
<glyph glyph-name="intermediate-event-throw-escalation" unicode="&#xe846;" d="M499 802c-220 4-425-177-448-396-24-185 78-380 247-461 160-80 368-56 501 66 134 118 190 318 128 486-57 167-217 293-393 303-12 1-23 2-35 2z m-5-49c202 7 391-161 407-362 19-178-92-361-262-420-166-61-368-2-468 145-103 144-99 356 18 490 74 90 188 146 305 147z m8-44c-186 6-358-158-361-344-9-169 116-334 283-367 155-33 328 46 397 190 71 140 39 327-83 430-64 57-150 91-236 91z m-2-48c164 4 314-144 311-308 3-152-119-297-272-312-143-19-295 73-336 213-43 134 14 295 138 364 48 28 103 43 159 43z m0-111c-47-131-77-268-124-400 43 43 81 91 124 135 42-45 83-90 125-135-43 133-83 267-125 400z" horiz-adv-x="1000" />
<glyph glyph-name="intermediate-event-catch-multiple" unicode="&#xe847;" d="M499 802c-220 4-425-177-448-396-24-185 78-380 247-461 160-80 368-56 501 66 134 118 190 318 128 486-57 167-217 293-393 303-12 1-23 2-35 2z m-5-49c202 7 391-161 407-362 19-178-92-361-262-420-166-61-368-2-468 145-103 144-99 356 18 490 74 90 188 146 305 147z m8-44c-186 6-358-158-361-344-9-169 116-334 283-367 155-33 328 46 397 190 71 140 39 327-83 430-64 57-150 91-236 91z m-2-48c164 4 314-144 311-308 3-152-119-297-272-312-143-19-295 73-336 213-43 134 14 295 138 364 48 28 103 43 159 43z m0-87c-72-52-143-104-215-156 27-84 55-169 82-253 89 0 177 0 266 0 28 84 55 169 82 253-71 52-143 104-215 156z m0-30c62-45 124-90 187-135-24-74-48-147-72-220-77 0-153 0-230 0-24 73-48 146-72 220 63 45 125 90 187 135z" horiz-adv-x="1000" />
<glyph glyph-name="intermediate-event-catch-non-interrupting-escalation" unicode="&#xe848;" d="M500 550c-47-131-77-268-124-400 43 43 81 91 124 135 42-45 83-90 125-135-43 133-83 267-125 400z m1-83c23-73 45-146 68-219-22 24-45 49-68 74-19-17-69-82-66-68 24 70 41 143 66 213z m-1 335c-41-1-83-5-121-18-25-13-8-53 18-44 64 17 131 17 196 3 26-3 34 38 9 47-33 8-68 12-102 12z m255-83c-26 3-36-36-13-47 52-38 93-90 121-147 15-22 52-3 43 22-32 67-82 127-143 170-2 1-5 2-8 2z m-519-10c-22-2-35-23-51-36-42-40-76-89-98-142-8-26 30-42 44-19 27 61 69 115 122 157 13 14 2 40-17 40z m264 0c-20-2-48 4-57-18-8-21 15-38 34-32 51 4 103-5 149-25 26-8 42 31 19 44-45 21-95 31-145 31z m-155-39c-23-4-43-21-62-34-34-27-66-58-86-96-10-26 30-44 43-21 30 47 74 83 121 110 16 14 5 41-16 41z m393-59c-25 2-35-33-14-46 37-38 62-87 77-137 14-24 53-6 44 20-17 60-49 115-94 158-4 3-8 4-13 5z m-564-171c-23 2-28-24-30-41-7-55-2-112 16-163 12-24 51-11 46 15-17 53-20 110-10 164 1 13-10 24-22 25z m754-46c-21 1-29-22-25-39 1-68-16-135-47-195-9-25 29-43 43-21 39 72 57 155 52 237-3 10-13 18-23 18z m-853-16c-22 2-30-22-26-39 1-69 18-137 51-197 15-22 52-2 42 23-30 59-46 126-45 193-2 11-11 19-22 20z m756-57c-22 2-27-22-28-39-10-48-34-91-63-130-12-25 26-47 42-24 38 49 65 108 73 170-1 12-11 23-24 23z m-590-160c-22-1-30-32-13-45 40-46 90-82 147-102 26-6 40 33 17 45-52 20-98 53-134 96-4 4-10 6-17 6z m426-77c-23-5-43-21-66-27-34-13-71-15-106-19-25-9-16-49 10-47 62 1 124 18 177 50 17 14 7 44-15 43z m-440-39c-23-1-31-35-11-46 56-45 123-78 194-91 26-2 35 39 9 47-65 14-127 44-179 87-4 2-8 3-13 3z m543-3c-22-2-36-24-55-32-43-29-92-45-141-57-24-12-10-52 17-46 71 15 140 47 196 95 14 15 2 40-17 40z" horiz-adv-x="1000" />
<glyph glyph-name="intermediate-event-throw-link" unicode="&#xe849;" d="M499 802c-220 4-425-177-448-396-24-185 78-380 247-461 160-80 368-56 501 66 134 118 190 318 128 486-57 167-217 293-393 303-12 1-23 2-35 2z m-5-49c202 7 391-161 407-362 19-178-92-361-262-420-166-61-368-2-468 145-103 144-99 356 18 490 74 90 188 146 305 147z m8-44c-186 6-358-158-361-344-9-169 116-334 283-367 155-33 328 46 397 190 71 140 39 327-83 430-64 57-150 91-236 91z m-2-48c164 4 314-144 311-308 3-152-119-297-272-312-143-19-295 73-336 213-43 134 14 295 138 364 48 28 103 43 159 43z m50-116c0-33 0-67 0-100-75 0-150 0-226 0 0-63 0-127 0-190 76 0 151 0 226 0 0-33 0-67 0-100 55 65 110 130 165 195-55 65-110 130-165 195z" horiz-adv-x="1000" />
<glyph glyph-name="start-event-non-interrupting-condition" unicode="&#xe84a;" d="M349 540l0-12 0-368 50 0 202 0 50 0 0 380-302 0z m24-24l254 0 0-332-26 0-202 0-26 0 0 332z m26-37l0-25 202 0 0 25-202 0z m0-74l0-24 202 0 0 24-202 0z m0-85l0-24 202 0 0 24-202 0z m0-77l0-24 202 0 0 24-202 0z m105 557l-7 0 0 0 0 0-6 0 0 0 0 0-7 0 0 0 0 0-6-1 0 0-1 0-6 0 0 0 0 0-6 0-1 0 0 0-6-1 0 0 0 0-6-1-1 0 0 0-6 0 0 0 0 0-6-1-1 0 0 0-6-1 0 0 0 0-6-1-1 0 0 0-6-1 0 0 0 0-6-1-1 0 0 0-6-1 0-1 0 0-6-1 0 0-1 0-6-1 0 0 0 0-6-2 0 0 0 0-4-1-4-1-4-2-3-3-3-4-2-4-2-4 0-5 0-4 1-5 2-4 3-4 3-3 4-2 5-2 4-1 5 0 3 1 3 1 6 1 6 1 6 2 5 1 6 1 6 1 6 1 6 0 6 1 5 1 6 0 6 1 6 0 6 1 6 0 6 0 6 0 6 0 6 0 5 0 6 0 6-1 6 0 6-1 6 0 6-1 5 0 6-1 6-1 6-1 6-1 5-1 2 0 4-1 5 0 4 2 4 2 4 2 3 4 3 3 1 5 1 4 0 5-1 4-1 4-3 4-3 4-3 2-5 2-3 1-2 1 0 0 0 0-6 1 0 0-1 0-6 1 0 0 0 0-6 1 0 0-1 0-6 1 0 0 0 0-6 1 0 0 0 0-7 1 0 0 0 0-6 0 0 1-1 0-6 0 0 0 0 0-6 1 0 0-1 0-6 0 0 0 0 0-6 0-1 0 0 0-6 1 0 0 0 0-6 0-1 0 0 0-6 0 0 0z m246-79l-5-1-4-1-4-3-3-3-3-4-1-4-2-4 0-5 1-4 1-5 2-4 3-3 3-3 2-1 0 0 2-2 0 0 3-1 0 0 2-2 0 0 2-2 2-2 0 0 3-2 0 0 2-1 2-2 0 0 2-2 3-2 0 0 2-2 2-2 0 0 2-2 2-2 1 0 2-2 2-2 2-2 0 0 2-2 0 0 2-2 0 0 2-2 2-2 0 0 2-3 0 0 2-2 2-2 0 0 2-2 2-2 0 0 2-3 0 0 2-2 2-2 2-2 0 0 2-3 2-2 2-2 0-1 1-2 0 0 2-2 0 0 2-3 0 0 1 0 2-4 3-3 2-4 3-3 2-3 3-4 2-3 2-4 0 0 3-3 2-4 2-4 3-3 2-4 2-3 2-4 2-4 2-3 2-4 2-4 1-2 3-4 3-4 3-2 4-2 5-2 4 0 5 1 4 1 4 2 4 3 3 3 2 4 2 4 0 5 0 5-1 4-1 3-2 3 0 0 0 0-2 4 0 0 0 1-2 4 0 0 0 0-2 4 0 0 0 0-2 4-1 0 0 0-2 4 0 0 0 0-2 4 0 0 0 0-3 4 0 0 0 0-2 4 0 0 0 0-3 4 0 0 0 0-2 4 0 0 0 0-3 4 0 0 0 0-2 4 0 0-1 0-2 4 0 0 0 0-3 4 0 0 0 0-3 4 0 0 0 0-2 3 0 1-1 0-2 3 0 0 0 0-3 4 0 0 0 0-3 3-2 3 0 0 0 0-2 3 0 0 0 0-2 2 0 0 0 0-2 3 0 0 0 0-2 3 0 0 0 0-2 2 0 0 0 0-2 3 0 0 0 0-3 3 0 0 0 0-2 2 0 0 0 0-2 3 0 0 0 0-2 2 0 0 0 0-3 3 0 0 0 0-2 2 0 0 0 0-2 3 0 0 0 0-2 2-1 0 0 0-2 3 0 0 0 0-2 2 0 0 0 0-3 3 0 0 0 0-2 2 0 0 0 0-2 2 0 0-1 0-2 3 0 0 0 0-2 2 0 0 0 0-3 2 0 0 0 0-2 2 0 0 0 0-3 3 0 0 0 0-2 2 0 0 0 0-3 2 0 0 0 0-2 2 0 0 0 0-3 2 0 0 0 0-2 2-1 0 0 1-2 1 0 1 0 0-3 2 0 0 0 0-2 2 0 0 0 0-3 2 0 0 0 0-3 2 0 0 0 0-2 2 0 0 0 0-2 1-4 2-4 2-5 0z m-521-12l-5-1-4-2-3-2 0 0 0 0-1 0-2-2 0 0 0 0-3-2 0 0 0 0-2-2 0 0 0 0-3-2 0 0 0 0-2-2 0 0 0-1-3-2 0 0 0 0-2-2 0 0 0 0-3-2 0 0 0 0-2-2 0 0 0 0-3-2 0-1 0 0-2-2 0 0 0 0-2-2 0 0-1 0-2-2 0 0 0-1-2-2 0 0 0 0-3-2 0 0 0 0-2-3 0 0 0 0-2-2 0 0 0 0-2-2-1 0 0-1-2-2 0 0 0 0-2-2 0 0 0-1-2-2 0 0 0 0-2-2-1 0 0-1-2-2 0 0 0 0-2-3 0 0 0 0-2-2 0 0 0 0-2-3 0 0 0 0-2-2 0 0 0-1-2-2-1 0 0 0-2-3 0 0 0 0-2-2 0 0 0-1-2-2 0 0 0 0-2-3 0 0 0 0-2-3 0 0 0 0-2-2 0-1 0 0-2-2 0 0 0 0-2-3 0 0 0 0-2-3 0 0 0 0-1-3 0 0-1 0-1-3 0 0 0 0-2-2-1-2 0 0 0 0-2-3 0 0 0 0-2-2 0-1 0 0-2-2 0 0 0 0-2-3 0 0 0 0-2-3 0 0 0 0-2-3 0 0 0 0-2-3 0 0 0 0-2-3 0 0 0 0-1-3 0 0 0 0-2-2 0-1 0 0-2-2 0 0 0-1-2-2 0 0 0 0-1-3 0 0 0 0-2-3 0 0 0 0-2-3 0 0 0 0-1-3 0 0 0 0-2-3 0 0 0 0-1-3 0 0 0 0-2-3 0 0 0 0-1-3 0 0 0 0-2-3 0 0 0 0-1-3 0 0 0 0-2-3 0 0 0 0 0-1-2-4 0-5 0-4 1-5 2-4 2-4 4-3 3-3 5-1 4-1 5-1 4 1 4 2 4 2 4 3 3 3 1 4 1 0 1 3 1 3 0 0 1 2 0 0 2 3 1 3 0 0 2 2 0 0 1 3 1 2 0 1 2 2 1 3 0 0 2 2 0 0 1 3 2 2 0 0 1 3 2 2 1 3 0 0 2 3 0 0 2 2 0 0 1 2 2 3 2 2 0 0 1 3 2 2 2 3 1 1 0 0 2 3 1 2 0 0 2 3 2 2 0 0 1 3 2 2 0 0 2 3 0 0 2 2 1 3 2 2 0 0 2 2 2 3 2 2 0 0 2 2 1 3 2 2 0 0 2 2 2 2 0 0 2 3 0 0 2 2 0 0 2 2 0 0 2 2 2 2 0 0 2 2 0 0 2 3 0 0 2 2 2 2 0 0 2 2 3 2 0 0 2 2 2 2 0 0 2 2 0 0 2 2 0 0 2 2 0 0 3 1 0 0 2 2 0 0 2 2 0 0 2 2 3 2 0 0 2 2 0 0 0 0 3 3 3 4 2 4 1 4 0 5 0 4-2 5-2 4-3 3-3 3-4 2-4 2-5 1z m694-313l-4-1-5-2-3-2-3-4-3-4-2-4-1-4 0-4 1-4 0-4 0-4 0-5 0-4 0 0 0-1 0-3 0-3 0 0 0-3 0 0 0-3 0-3 0 0 0-3 0 0 0-3 0-3 0-3 0-3 0-3-1-3 0-3 0 0 0-3 0 0 0-3-1-3 0-3 0-3-1-2 0-1 0-3 0 0 0-2-1-3 0-3 0 0-1-3 0-3-1-3 0 0 0-3-1-3-1-3 0 0 0-2-1-3 0 0 0-3-1-3 0 0-1-3-1-3 0 0 0-2 0 0-1-3 0 0-1-3 0 0-1-3 0 0-1-3-1-2 0 0 0-3-1-3 0 0-1-3 0 0-1-2 0-1-1-2 0 0-1-3 0 0-1-3-1-2 0 0-1-3-3-5-2-6-2-5-3-5-2-6-3-5-3-5-1-3-2-4-1-4 0-5 1-4 1-5 3-4 3-3 3-3 4-2 5-1 4-1 5 1 4 1 4 2 4 3 3 3 2 3 1 3 1 0 0 0 3 6 0 0 0 0 2 6 1 0 0 0 2 6 0 0 0 0 3 5 0 1 0 0 3 5 0 1 0 0 2 6 0 0 1 0 2 6 0 0 0 0 1 3 0 0 0 0 1 3 0 0 0 0 1 3 0 0 1 0 1 3 0 0 0 0 1 3 0 0 0 0 1 3 0 0 0 0 1 3 0 0 0 1 1 3 0 0 0 0 1 3 0 0 0 0 1 3 0 0 0 0 1 3 0 0 0 0 1 3 0 0 0 0 1 3 0 0 0 1 1 3 0 0 0 0 1 3 0 0 0 0 0 3 0 0 0 0 1 3 0 0 0 0 1 3 0 1 0 0 1 3 0 0 0 0 0 3 0 0 1 0 0 3 0 0 0 0 1 3 0 1 0 0 1 3 0 0 0 0 0 3 0 0 0 0 1 3 0 0 0 0 0 4 0 0 0 0 1 3 0 0 0 0 0 3 0 0 0 0 1 4 0 0 0 0 0 3 0 0 0 0 1 3 0 0 0 0 0 4 0 0 0 0 1 3 0 0 0 0 0 3 0 0 0 0 0 4 0 0 0 0 1 3 0 0 0 0 0 3 0 0 0 1 0 3 0 0 0 0 0 3 0 0 0 0 0 4 0 0 0 0 1 3 0 0 0 0 0 3 0 0 0 1 0 3 0 0 0 0 0 3 0 0 0 0 0 4 0 0 0 0 0 3 0 0 0 0 0 4 0 0 0 0 0 3 0 0 0 0 0 3 0 1 0 0 0 3 0 4 0 0 0 0 0 4 0 0 0 1 0 4 0 0 0 0-1 5 0 0 0 0 0 4 0 5-2 4-2 4-3 4-4 2-4 3-4 1-4 1z m-853-18l-4-1-5-2-3-3-4-3-2-4-2-4-1-4 0-4 0-3 0 0 0 0 0-7 0 0 0 0 0-6 0 0 0 0 0-7 0 0 0 0 1-6 0 0 0-1 0-6 0 0 0 0 1-6 0 0 0-1 1-6 0 0 0 0 1-6 0 0 0-1 0-6 0 0 0 0 1-6 0 0 0-1 1-6 1 0 0 0 1-6 0 0 0-1 1-6 0 0 0 0 1-6 0 0 0 0 2-6 0-1 0 0 1-6 0 0 0 0 2-6 0 0 0-1 2-6 0 0 0 0 1-6 0 0 0 0 2-6 0 0 0 0 2-6 0-1 0 0 2-6 0 0 0 0 2-6 0 0 0 0 2-6 1 0 0 0 2-6 0 0 0 0 2-6 0 0 0-1 3-5 0-1 0 0 2-5 0-1 0 0 3-5 0-1 0 0 2-5 0-1 1 0 2-5 0-1 0 0 3-5 0 0 0-1 1-1 2-4 4-4 3-2 4-2 5-1 4-1 5 1 4 1 4 2 4 3 3 3 2 4 2 5 0 4 0 5-1 4-1 4-1 1-3 5-2 6-3 5-2 6-2 5-2 5-3 6-2 6-2 5-1 6-2 5-2 6-2 6-1 5-2 6-1 6-2 5-1 6-1 6-1 6-1 6-1 5-1 6-1 6-1 6 0 6-1 5 0 6-1 6 0 6 0 6-1 6 0 3 0 4-1 5-3 4-2 3-4 3-4 3-4 1-4 1z m694-334l-4-1-4-2-4-3 0 0-5-3-4-4-5-4-5-3-5-3-4-4-5-3-5-3-5-3-5-4-5-3-6-3-5-2-5-3-5-3-5-3-6-2-5-3-5-2-6-2-5-3-6-2-5-2-6-2-5-2-6-2-5-2-6-1-5-2-6-2-6-1-5-1-5-1-4-2-4-2-4-3-2-3-3-4-1-5-1-4 1-5 1-4 2-4 2-4 3-3 4-3 4-1 5-1 4-1 4 1 5 1 0 0 0 0 6 2 0 0 0 0 6 1 1 0 0 0 6 2 0 0 0 0 6 2 0 0 0 0 6 2 0 0 1 0 5 2 1 0 0 0 6 2 0 0 0 0 6 2 0 0 0 0 6 2 0 0 0 0 6 3 0 0 0 0 6 2 0 0 1 0 5 3 0 0 1 0 5 2 0 0 1 0 5 3 0 0 1 0 5 3 0 0 1 0 5 3 0 0 0 0 6 3 0 0 0 0 6 3 0 0 0 0 6 3 0 0 0 0 5 3 0 0 1 0 5 3 0 0 0 0 6 3 0 1 0 0 5 3 0 0 1 0 5 3 0 0 0 1 5 3 0 0 1 0 5 4 0 0 0 0 5 3 0 0 0 0 6 4 0 0 0 0 5 4 0 0 0 0 5 4 0 0 0 0 5 4 0 0 1 0 4 4 1 0 0 0 0 1 3 3 3 4 2 4 1 4 0 5 0 4-2 4-2 4-3 4-4 3-4 2-4 1-4 1z m-541-2l-4-1-4-3-4-2-3-4-2-4-1-4-1-5 0-4 1-5 2-4 3-4 3-2 1-1 0-1 0 0 5-4 0 0 0 0 5-4 0 0 0 0 3-2 0 0 0 0 2-2 1 0 0 0 2-2 0 0 0 0 3-2 0 0 0 0 2-2 1 0 0 0 2-2 0 0 0 0 3-2 0 0 0 0 3-1 0-1 0 0 2-1 0 0 0 0 3-2 0 0 0 0 3-2 0 0 0 0 3-2 0 0 0 0 2-2 0 0 1 0 2-1 0 0 0 0 3-2 0 0 0 0 3-2 0 0 0 0 3-1 0 0 0-1 3-1 0 0 0 0 3-2 0 0 0 0 2-1 1 0 0 0 2-2 1 0 0 0 2-2 0 0 1 0 2-1 0 0 1 0 2-2 0 0 0 0 3-1 0 0 0 0 3-2 0 0 1 0 2-1 0 0 1 0 2-1 0-1 1 0 2-1 1 0 0 0 3-1 0 0 0 0 3-2 0 0 0 0 3-1 0 0 0 0 3-1 0 0 0 0 3-2 0 0 0 0 3-1 0 0 0 0 3-1 0 0 0 0 3-1 1 0 0 0 3-1 0 0 0 0 3-2 0 0 0 0 3-1 0 0 0 0 3-1 0 0 1 0 3-1 0 0 0 0 3-1 0 0 0 0 3-1 0 0 0 0 3-1 0 0 1 0 3-1 0 0 0 0 3-1 0 0 0 0 3-1 2 0 0 0 0 0 3-1 0 0 0-1 3-1 1 0 0 0 3-1 0 0 0 0 3-1 0 0 0 0 3-1 0 0 0 0 4 0 0-1 0 0 3 0 0 0 0 0 3-1 0 0 0 0 3-1 1 0 0 0 3-1 0 0 0 0 3-1 0 0 0 0 0 0 5 0 4 0 5 1 4 2 4 2 3 4 2 3 2 5 1 4 0 5 0 4-2 4-2 4-3 4-4 2-4 3-3 1 0 0-1 0-3 0-2 1 0 0-3 1 0 0-3 1 0 0-3 0 0 0-3 1-3 1-3 1 0 0-3 1-2 1-3 1-3 1-1 0-1 0-3 1-3 1-3 1 0 0-2 1-3 1-3 1-3 0-3 1 0 0-3 1-3 1-2 1 0 0-3 2-3 1 0 0-3 1 0 0-2 1-3 1 0 0-3 1-3 1-2 2-3 1 0 0-3 1-2 1-3 2-3 1-2 1 0 0-3 2-2 1 0 0-3 1 0 0-3 2 0 0-2 1-2 2-1 0-2 1 0 0-3 2-2 1 0 0-3 2-2 1 0 0-3 2 0 0-2 2 0 0-2 1-3 2 0 0-2 2-2 1-1 0-2 2 0 0-2 2-3 1 0 0-2 2 0 0-2 2 0 0-3 2-4 3-5 4-1 1-4 3-4 1-4 2-5 0z" horiz-adv-x="1000" />
<glyph glyph-name="data-object" unicode="&#xe84b;" d="M626 746c-143 0-286 0-429 0 0-264 0-528 0-792 202 0 404 0 606 0 0 203 0 407 0 610-59 61-118 121-177 182z m-52-45c0-62 0-124 0-186 61 0 123 0 184 0 0-172 0-344 0-516-172 0-344 0-516 0 0 234 0 468 0 702 110 0 221 0 332 0z m45-12c42-43 83-86 125-129-42 0-83 0-125 0 0 43 0 86 0 129z" horiz-adv-x="1000" />
<glyph glyph-name="script-task" unicode="&#xe84c;" d="M215 745c-107 0-195-87-195-194l0-402c0-107 88-194 195-194l570 0c108 0 195 87 195 194l0 402c0 107-87 194-195 194l-570 0z m0-60l570 0c75 0 135-59 135-134l0-402c0-75-60-134-135-134l-570 0c-75 0-135 59-135 134l0 402c0 75 60 134 135 134z m90-92l-3-2-1 0c-32-19-55-37-70-55-14-17-22-34-22-51 0-34 24-59 46-82 22-22 42-43 44-61 1-9-1-18-11-30-10-12-27-27-56-43l-41-25 257 0 3 2 0 0c29 18 50 34 62 50 13 16 19 33 17 49-3 31-29 54-51 77-21 22-39 43-39 62 0 10 4 21 16 35 12 15 33 31 64 50l0 0 41 24-256 0z m7-26l158 0c-14-11-25-21-33-31-15-17-23-34-23-51 0-34 25-59 47-82 22-22 41-43 43-61 1-9-1-18-11-30-9-12-26-26-53-42l-158 0c11 9 20 17 26 26 13 16 18 33 17 49-4 31-29 54-51 77-22 22-39 43-39 62 0 10 4 21 16 35 12 14 31 30 61 48z m-37-45l0-12 123 0 0 12-123 0z m-5-64l0-12 128 0 0 12-128 0z m58-65l0-12 124 0 0 12-124 0z m18-65l0-12 128 0 0 12-128 0z" horiz-adv-x="1000" />
<glyph glyph-name="send-task" unicode="&#xe84d;" d="M215 745c-107 0-195-87-195-194l0-402c0-107 88-194 195-194l570 0c108 0 195 87 195 194l0 402c0 107-87 194-195 194l-570 0z m0-60l570 0c75 0 135-59 135-134l0-402c0-75-60-134-135-134l-570 0c-75 0-135 59-135 134l0 402c0 75 60 134 135 134z m-42-95l250-141 250 141-500 0z m1-52l0-279 500 0 0 279-251-140-249 140z" horiz-adv-x="1000" />
<glyph glyph-name="data-store" unicode="&#xe84e;" d="M500 681c-79 0-158-7-219-20-31-7-58-16-79-27-20-10-36-24-41-43 0-1-1-3-1-4l0-2 0-2c0-158 0-307 0-469l0-2c5-21 22-35 42-46 21-11 48-20 79-26 61-14 140-20 219-20 79 0 158 6 219 20 31 6 58 15 79 26 21 11 37 25 42 46l0 2c0 154 0 323 0 470 0 1 0 1 0 2l0 1 0 0c0 1 0 3-1 4-5 19-21 33-41 43-21 11-48 20-79 27-61 13-140 20-219 20z m0-35c77 0 154-7 212-20 29-6 53-14 69-22 13-7 20-14 23-19-3-5-10-12-23-19-16-9-40-17-69-23-58-12-135-19-212-19-77 0-154 7-212 19-29 6-53 14-69 23-13 7-20 14-23 19 3 5 10 12 23 19 16 8 40 16 69 22 58 13 135 20 212 20z m-305-107c2-1 5-3 7-4 21-11 48-19 79-26 61-13 140-20 219-20 79 0 158 7 219 20 31 7 58 15 79 26 2 1 5 3 7 4l0-41c-2-5-8-13-24-21-16-9-40-17-69-23-58-12-135-19-212-19-77 0-154 7-212 19-29 6-53 14-69 23-15 8-22 16-24 21z m0-89c2-1 5-3 7-4 21-11 48-19 79-26 61-13 140-20 219-20 79 0 158 7 219 20 31 7 58 15 79 26 2 1 5 3 7 4l0-41c-2-5-8-13-24-21-16-9-40-17-69-23-58-12-135-19-212-19-77 0-154 7-212 19-29 6-53 14-69 23-15 8-22 16-24 21z m0-89c2-1 5-3 7-4 21-11 48-19 79-26 61-14 140-20 219-20 79 0 158 6 219 20 31 7 58 15 79 26 2 1 5 3 7 4l0-243c-2-5-8-13-24-21-16-9-40-17-69-23-58-13-135-19-212-19-77 0-154 6-212 19-29 6-53 14-69 23-15 8-22 16-24 21z" horiz-adv-x="1000" />
<glyph glyph-name="start-event-non-interrupting-escalation" unicode="&#xe84f;" d="M500 550c-47-131-77-268-124-400 43 43 81 91 124 135 42-45 83-90 125-135-43 133-83 267-125 400z m1-83c23-73 45-146 68-219-22 24-45 49-68 74-19-17-69-82-66-68 24 70 41 143 66 213z m3 333c-43-1-87-4-127-17-24-13-8-53 18-45 64 16 132 17 196 4 27-2 35 39 9 47-31 8-64 11-96 11z m250-79c-26 3-35-36-12-47 53-38 91-93 122-149 18-21 53 4 40 27-34 65-80 124-139 166-3 2-7 3-11 3z m-521-11c-21-3-34-22-49-35-36-35-64-77-88-121-9-15-20-37-1-49 17-13 36 3 41 21 22 41 49 81 82 115 13 15 37 23 38 45 0 12-10 23-23 24z m695-313c-22 1-29-24-25-41 4-68-13-136-46-195-9-25 28-44 43-22 41 72 59 158 50 241-3 10-13 16-22 17z m-853-19c-22 1-30-22-26-40 3-68 21-136 52-196 15-22 52-3 43 22-30 60-46 127-47 194-2 11-12 19-22 20z m694-334c-22-3-36-24-55-33-42-28-91-46-140-59-25-12-9-52 17-45 72 16 139 49 195 97 14 15 2 40-17 40z m-542-1c-24 0-31-35-11-46 47-40 104-67 163-83 17-5 42-16 53 5 10 18-6 37-24 38-56 14-111 36-156 73-7 6-14 14-25 13z" horiz-adv-x="1000" />
<glyph glyph-name="intermediate-event-throw-message" unicode="&#xe850;" d="M499 802c-220 4-425-177-448-396-24-185 78-380 247-461 160-80 368-56 501 66 134 118 190 318 128 486-57 167-217 293-393 303-12 1-23 2-35 2z m-5-49c202 7 391-161 407-362 19-178-92-361-262-420-166-61-368-2-468 145-103 144-99 356 18 490 74 90 188 146 305 147z m8-44c-186 6-358-158-361-344-9-169 116-334 283-367 155-33 328 46 397 190 71 140 39 327-83 430-64 57-150 91-236 91z m-2-48c164 4 314-144 311-308 3-152-119-297-272-312-143-19-295 73-336 213-43 134 14 295 138 364 48 28 103 43 159 43z m-167-155c57-46 114-92 171-138 56 46 113 92 170 138-114 0-227 0-341 0z m-38-32c0-93 0-187 0-280 137 0 273 0 410 0 0 91 0 183 0 274-67-54-134-109-201-163-70 56-139 113-209 169z" horiz-adv-x="1000" />
<glyph glyph-name="intermediate-event-catch-non-interrupting-multiple" unicode="&#xe851;" d="M715 418c-71 52-143 104-215 156-72-52-143-104-215-156 27-84 55-169 82-253 89 0 177 0 266 0 28 84 55 169 82 253z m-28-9c-24-74-48-147-72-220-77 0-153 0-230 0-24 73-48 146-72 220 63 45 125 90 187 135 62-45 124-90 187-135z m-187 393c-41-1-83-5-121-18-25-13-8-53 18-44 64 17 131 17 196 3 26-3 34 38 9 47-33 8-68 12-102 12z m255-83c-26 3-36-36-13-47 52-38 93-90 121-147 15-22 52-3 43 22-32 67-82 127-143 170-2 1-5 2-8 2z m-519-10c-22-2-35-23-51-36-42-40-76-89-98-142-8-26 30-42 44-19 27 61 69 115 122 157 13 14 2 40-17 40z m264 0c-20-2-48 4-57-18-8-21 15-38 34-32 51 4 103-5 149-25 26-8 42 31 19 44-45 21-95 31-145 31z m-155-39c-23-4-43-21-62-34-34-27-66-58-86-96-10-26 30-44 43-21 30 47 74 83 121 110 16 14 5 41-16 41z m393-59c-25 2-35-33-14-46 37-38 62-87 77-137 14-24 53-6 44 20-17 60-49 115-94 158-4 3-8 4-13 5z m-564-171c-23 2-28-24-30-41-7-55-2-112 16-163 12-24 51-11 46 15-17 53-20 110-10 164 1 13-10 24-22 25z m754-46c-21 1-29-22-25-39 1-68-16-135-47-195-9-25 29-43 43-21 39 72 57 155 52 237-3 10-13 18-23 18z m-853-16c-22 2-30-22-26-39 1-69 18-137 51-197 15-22 52-2 42 23-30 59-46 126-45 193-2 11-11 19-22 20z m756-57c-22 2-27-22-28-39-10-48-34-91-63-130-12-25 26-47 42-24 38 49 65 108 73 170-1 12-11 23-24 23z m-590-160c-22-1-30-32-13-45 40-46 90-82 147-102 26-6 40 33 17 45-52 20-98 53-134 96-4 4-10 6-17 6z m426-77c-23-5-43-21-66-27-34-13-71-15-106-19-25-9-16-49 10-47 62 1 124 18 177 50 17 14 7 44-15 43z m-440-39c-23-1-31-35-11-46 56-45 123-78 194-91 26-2 35 39 9 47-65 14-127 44-179 87-4 2-8 3-13 3z m543-3c-22-2-36-24-55-32-43-29-92-45-141-57-24-12-10-52 17-46 71 15 140 47 196 95 14 15 2 40-17 40z" horiz-adv-x="1000" />
<glyph glyph-name="intermediate-event-catch-non-interrupting-signal" unicode="&#xe852;" d="M500 562c-64-115-128-230-192-345 128 0 256 0 384 0-64 115-128 230-192 345z m0-51c50-90 100-180 151-270-101 0-201 0-302 0 51 90 101 180 151 270z m0 291c-41-1-83-5-121-18-25-13-8-53 18-44 64 17 131 17 196 3 26-3 34 38 9 47-33 8-68 12-102 12z m255-83c-26 3-36-36-13-47 52-38 93-90 121-147 15-22 52-3 43 22-32 67-82 127-143 170-2 1-5 2-8 2z m-519-10c-22-2-35-23-51-36-42-40-76-89-98-142-8-26 30-42 44-19 27 61 69 115 122 157 13 14 2 40-17 40z m264 0c-20-2-48 4-57-18-8-21 15-38 34-32 51 4 103-5 149-25 26-8 42 31 19 44-45 21-95 31-145 31z m-155-39c-23-4-43-21-62-34-34-27-66-58-86-96-10-26 30-44 43-21 30 47 74 83 121 110 16 14 5 41-16 41z m393-59c-25 2-35-33-14-46 37-38 62-87 77-137 14-24 53-6 44 20-17 60-49 115-94 158-4 3-8 4-13 5z m-564-171c-23 2-28-24-30-41-7-55-2-112 16-163 12-24 51-11 46 15-17 53-20 110-10 164 1 13-10 24-22 25z m754-46c-21 1-29-22-25-39 1-68-16-135-47-195-9-25 29-43 43-21 39 72 57 155 52 237-3 10-13 18-23 18z m-853-16c-22 2-30-22-26-39 1-69 18-137 51-197 15-22 52-2 42 23-30 59-46 126-45 193-2 11-11 19-22 20z m756-57c-22 2-27-22-28-39-10-48-34-91-63-130-12-25 26-47 42-24 38 49 65 108 73 170-1 12-11 23-24 23z m-590-160c-22-1-30-32-13-45 40-46 90-82 147-102 26-6 40 33 17 45-52 20-98 53-134 96-4 4-10 6-17 6z m426-77c-23-5-43-21-66-27-34-13-71-15-106-19-25-9-16-49 10-47 62 1 124 18 177 50 17 14 7 44-15 43z m-440-39c-23-1-31-35-11-46 56-45 123-78 194-91 26-2 35 39 9 47-65 14-127 44-179 87-4 2-8 3-13 3z m543-3c-22-2-36-24-55-32-43-29-92-45-141-57-24-12-10-52 17-46 71 15 140 47 196 95 14 15 2 40-17 40z" horiz-adv-x="1000" />
<glyph glyph-name="intermediate-event-throw-multiple" unicode="&#xe853;" d="M499 802c-220 4-425-177-448-396-24-185 78-380 247-461 160-80 368-56 501 66 134 118 190 318 128 486-57 167-217 293-393 303-12 1-23 2-35 2z m-5-49c202 7 391-161 407-362 19-178-92-361-262-420-166-61-368-2-468 145-103 144-99 356 18 490 74 90 188 146 305 147z m8-44c-186 6-358-158-361-344-9-169 116-334 283-367 155-33 328 46 397 190 71 140 39 327-83 430-64 57-150 91-236 91z m-2-48c164 4 314-144 311-308 3-152-119-297-272-312-143-19-295 73-336 213-43 134 14 295 138 364 48 28 103 43 159 43z m0-87c-72-52-144-104-215-156 27-84 55-169 82-253 89 0 177 0 266 0 28 84 55 169 82 253-71 52-143 104-215 156z" horiz-adv-x="1000" />
<glyph glyph-name="start-event-non-interrupting-message" unicode="&#xe854;" d="M295 506c0-104 0-208 0-312 137 0 273 0 410 0 0 104 0 208 0 312-137 0-273 0-410 0z m91-49c76 0 152 0 228 0-40-24-81-79-121-85-36 29-71 57-107 85z m270-28c0-62 0-124 0-186-104 0-208 0-312 0 0 62 0 124 0 186 52-42 104-83 156-125 52 42 104 83 156 125z m-152 371c-43-1-87-4-127-17-24-13-8-53 18-45 64 16 132 17 196 4 27-2 35 39 9 47-31 8-64 11-96 11z m250-79c-26 3-35-36-12-47 53-38 91-93 122-149 18-21 53 4 40 27-34 65-80 124-139 166-3 2-7 3-11 3z m-521-11c-21-3-34-22-49-35-36-35-64-77-88-121-9-15-20-37-1-49 17-13 36 3 41 21 22 41 49 81 82 115 13 15 37 23 38 45 0 12-10 23-23 24z m695-313c-22 1-29-24-25-41 4-68-13-136-46-195-9-25 28-44 43-22 41 72 59 158 50 241-3 10-13 16-22 17z m-853-19c-22 1-30-22-26-40 3-68 21-136 52-196 15-22 52-3 43 22-30 60-46 127-47 194-2 11-12 19-22 20z m694-334c-22-3-36-24-55-33-42-28-91-46-140-59-25-12-9-52 17-45 72 16 139 49 195 97 14 15 2 40-17 40z m-542-1c-24 0-31-35-11-46 47-40 104-67 163-83 17-5 42-16 53 5 10 18-6 37-24 38-56 14-111 36-156 73-7 6-14 14-25 13z" horiz-adv-x="1000" />
<glyph glyph-name="ad-hoc-marker" unicode="&#xe855;" d="M150 330c29 69 67 141 133 180 49 29 110 11 155-17 69-43 123-106 191-150 41-24 92-4 122 29 36 42 78 82 99 135 0-55 0-110 0-165-31-61-70-124-133-154-52-22-112-8-156 24-66 44-114 112-185 147-35 18-79 14-108-13-52-46-82-112-118-171 0 52 0 103 0 155z" horiz-adv-x="1000" />
<glyph glyph-name="service-task" unicode="&#xe856;" d="M215 745c-107 0-195-87-195-194l0-402c0-107 88-194 195-194l570 0c108 0 195 87 195 194l0 402c0 107-87 194-195 194l-570 0z m0-60l570 0c75 0 135-59 135-134l0-402c0-75-60-134-135-134l-570 0c-75 0-135 59-135 134l0 402c0 75 60 134 135 134z m36-50c0-12 0-24 0-35-9-3-18-7-27-12l-25 25-46-47 24-24c-4-9-8-18-11-28l-35 0 0-66 36 0c3-13 10-24 17-35l0 57-31 0 0 22 31 0 2 9c2 13 7 25 14 36l5 8-21 21 15 16 22-22 8 5c11 8 23 13 36 16l8 1 0 31 23 0 0-30 9 0 50 0c-6 6-29 15-37 17l0 35c-25 0-44 0-67 0z m63-64l0-34c-10-3-19-7-28-12l-24 25-47-47 25-25c-5-8-9-17-11-27l-36 0 0-66 36 0c3-10 7-19 12-27l-26-25 47-47 26 26c8-5 17-9 27-12l0-36c23 0 47 0 66 0l0 37c10 2 19 6 28 11l25-25 47 47-26 25c5 9 9 18 12 27l34 1 0 66-35-1c-3 10-7 19-11 28l24 24-47 46-24-24c-9 5-18 8-28 11l0 34-66 0 0 0z m22-21l22 0 0-31 9-1c13-3 25-8 36-15l8-5 21 21 16-15-21-22 5-7c7-11 12-23 15-36l2-9 30 1 0-23-30 0-2-9c-2-12-7-25-15-36l-5-7 23-22-16-16-22 22-8-5c-11-7-23-12-36-15l-9-2 0-32c-6 0-12 0-22 0l0 32-9 2c-13 2-25 7-36 15l-8 4-22-22-16 16 23 22-6 8c-7 11-12 23-15 35l-2 9-31 0 0 22 31 0 2 9c3 13 8 25 15 36l5 8-22 21 16 16 22-22 7 5c11 8 23 13 36 15l9 2 0 31z m11-81c-27 0-49-22-49-49 0-27 22-50 49-50 28 0 50 23 50 50 0 27-22 49-50 49z m0-22c16 0 28-12 28-27 0-16-12-28-28-28-15 0-27 12-27 28 0 15 12 27 27 27z" horiz-adv-x="1000" />
<glyph glyph-name="task-none" unicode="&#xe857;" d="M215 745c-107 0-195-87-195-194l0-402c0-107 88-194 195-194l570 0c108 0 195 87 195 194l0 402c0 107-87 194-195 194l-570 0z m0-60l570 0c75 0 135-59 135-134l0-402c0-75-60-134-135-134l-570 0c-75 0-135 59-135 134l0 402c0 75 60 134 135 134z" horiz-adv-x="1000" />
<glyph glyph-name="compensation-marker" unicode="&#xe858;" d="M502 590c-20-3-34-19-51-29-94-63-187-125-280-188-18-14-12-43 8-52 103-69 206-138 309-207 21-13 49 8 45 31 0 53 0 106 0 159 94-64 188-127 283-190 21-13 48 8 44 31 0 139 0 279 0 418-1 24-34 36-51 19-92-62-184-124-276-186-1 57 0 113-1 170-3 14-16 25-30 24z m-29-86c0-103 0-205 0-308-77 52-153 103-229 154 76 51 152 102 229 154z m327 0c0-103 0-205 0-308-76 52-152 103-229 154 77 51 153 102 229 154z" horiz-adv-x="1000" />
<glyph glyph-name="start-event-non-interrupting-multiple" unicode="&#xe859;" d="M715 418c-71 52-143 104-215 156-72-52-143-104-215-156 27-84 55-169 82-253 89 0 177 0 266 0 28 84 55 169 82 253z m-28-9c-24-74-48-147-72-220-77 0-153 0-230 0-24 73-48 146-72 220 63 45 125 90 187 135 62-45 124-90 187-135z m-183 391c-43-1-87-4-127-17-24-13-8-53 18-45 64 16 132 17 196 4 27-2 35 39 9 47-31 8-64 11-96 11z m250-79c-26 3-35-36-12-47 53-38 91-93 122-149 18-21 53 4 40 27-34 65-80 124-139 166-3 2-7 3-11 3z m-521-11c-21-3-34-22-49-35-36-35-64-77-88-121-9-15-20-37-1-49 17-13 36 3 41 21 22 41 49 81 82 115 13 15 37 23 38 45 0 12-10 23-23 24z m695-313c-22 1-29-24-25-41 4-68-13-136-46-195-9-25 28-44 43-22 41 72 59 158 50 241-3 10-13 16-22 17z m-853-19c-22 1-30-22-26-40 3-68 21-136 52-196 15-22 52-3 43 22-30 60-46 127-47 194-2 11-12 19-22 20z m694-334c-22-3-36-24-55-33-42-28-91-46-140-59-25-12-9-52 17-45 72 16 139 49 195 97 14 15 2 40-17 40z m-542-1c-24 0-31-35-11-46 47-40 104-67 163-83 17-5 42-16 53 5 10 18-6 37-24 38-56 14-111 36-156 73-7 6-14 14-25 13z" horiz-adv-x="1000" />
<glyph glyph-name="intermediate-event-throw-signal" unicode="&#xe85a;" d="M499 802c-220 4-425-177-448-396-24-185 78-380 247-461 160-80 368-56 501 66 134 118 190 318 128 486-57 167-217 293-393 303-12 1-23 2-35 2z m-5-49c202 7 391-161 407-362 19-178-92-361-262-420-166-61-368-2-468 145-103 144-99 356 18 490 74 90 188 146 305 147z m8-44c-186 6-358-158-361-344-9-169 116-334 283-367 155-33 328 46 397 190 71 140 39 327-83 430-64 57-150 91-236 91z m-2-48c164 4 314-144 311-308 3-152-119-297-272-312-143-19-295 73-336 213-43 134 14 295 138 364 48 28 103 43 159 43z m0-99c-64-115-128-230-192-345 128 0 256 0 384 0-64 115-128 230-192 345z" horiz-adv-x="1000" />
<glyph glyph-name="intermediate-event-catch-non-interrupting-condition" unicode="&#xe85b;" d="M349 540l0-12 0-368 50 0 202 0 50 0 0 380-302 0z m24-24l254 0 0-332-26 0-202 0-26 0 0 332z m26-37l0-25 202 0 0 25-202 0z m0-74l0-24 202 0 0 24-202 0z m0-85l0-24 202 0 0 24-202 0z m0-77l0-24 202 0 0 24-202 0z m101 559l0 0-5 0-1 0 0 0-5 0 0 0 0 0-6-1 0 0 0 0-5 0 0 0 0 0-6 0 0 0 0 0-5-1 0 0-1 0-5 0 0 0 0 0-5 0-1 0 0-1-5 0 0 0 0 0-5-1-1 0 0 0-5 0 0 0 0 0-5-1-1 0 0 0-5-1 0 0 0 0-5-1-1 0 0 0-5-1 0 0 0 0-5-1 0 0-1 0-5-1 0 0 0 0-5-1 0 0 0 0-6-2 0 0 0 0-5-1 0 0 0 0-5-1-4-2-4-2-4-3-2-4-3-4-1-4 0-5 0-4 1-4 2-5 3-3 3-3 4-3 4-1 5-1 4 0 4 1 5 1 5 1 4 1 5 1 5 1 5 1 5 1 5 1 5 0 4 1 5 1 5 0 5 1 5 0 5 1 5 0 5 0 5 1 5 0 5 0 5 0 5 0 5 0 5 0 5-1 5 0 5 0 5-1 5 0 5-1 5 0 5-1 5-1 4 0 5-1 5-1 5-1 5-1 4-1 5 0 4 0 5 1 4 2 3 3 4 3 2 4 2 4 1 4 0 5-1 4-2 5-2 4-3 3-4 3-4 2-3 1-5 1 0 0 0 0-5 1 0 0-1 0-5 1 0 0 0 0-5 1 0 0 0 0-6 1 0 0 0 0-5 1 0 0 0 0-6 1 0 0 0 0-5 0 0 0 0 0-6 1 0 0 0 0-5 0 0 1 0 0-6 0 0 0 0 0-5 0 0 0-1 0-5 1 0 0 0 0-5 0-1 0 0 0-5 0 0 0 0 0-6 1 0 0 0 0-5 0 0 0 0 0-6 0 0 0z m255-83l-5 0-4-1-5-2-3-2-4-4-2-3-2-4-1-5-1-4 1-5 1-4 3-4 3-4 2-2 2-1 4-3 4-3 4-3 3-3 4-4 4-3 4-3 3-3 4-4 4-3 3-4 4-3 3-4 4-3 3-4 4-4 3-3 3-4 3-4 4-4 3-3 3-4 3-4 3-4 3-4 3-4 2-4 3-4 3-5 3-4 2-4 3-4 2-4 3-5 2-4 2-4 3-5 2-4 1-2 2-4 4-3 3-3 4-2 5-1 4-1 5 1 4 1 4 2 4 3 3 3 2 4 2 4 0 5 0 4-1 5-1 3-1 3 0 0 0 0-3 5 0 0 0 0-2 5 0 0-1 0-2 4 0 1 0 0-3 4 0 0 0 1-2 4-1 0 0 0-2 5 0 0 0 0-3 5 0 0 0 0-3 4 0 0 0 0-3 5 0 0 0 0-3 5 0 0 0 0-3 4 0 0 0 0-3 5 0 0-1 0-3 4 0 0 0 0-3 5 0 0 0 0-3 4 0 0 0 0-4 4 0 1 0 0-3 4 0 0 0 0-3 4-1 0 0 0-3 4 0 1 0 0-4 4 0 0 0 0-3 4 0 0-1 0-3 4 0 0 0 0-4 4 0 0 0 0-4 4 0 0 0 1-4 3 0 0 0 1-3 3-1 0 0 1-3 3-1 0 0 0-3 4-1 0 0 0-4 4 0 0 0 0-4 4 0 0 0 0-4 3 0 1 0 0-4 3 0 0 0 0-4 4 0 0-1 0-4 3 0 0 0 1-4 3 0 0 0 0-4 3 0 0-1 0-4 4 0 0 0 0-4 3 0 0 0 0-2 1-4 3-4 1-4 1z m-519-10l-5 0-4-1-4-2-4-2-1-1 0 0 0 0-4-3 0-1 0 0-4-3 0 0-1 0-4-4 0 0 0 0-4-3 0 0 0-1-4-3 0 0 0 0-4-4 0 0 0 0-4-4 0 0 0 0-4-4 0 0 0 0-4-3 0-1 0 0-4-3 0-1 0 0-4-3 0-1 0 0-4-4 0 0 0 0-4-4 0 0 0 0-3-4 0 0-1 0-3-4 0 0 0 0-4-4 0 0 0-1-3-4 0 0 0 0-4-4 0 0 0 0-3-4 0 0 0-1-4-4 0 0 0 0-3-4 0 0 0 0-3-5 0 0 0 0-3-4 0 0-1 0-3-5 0 0 0 0-3-4 0 0 0 0-3-5 0 0 0 0-3-5 0 0 0 0-3-4 0 0 0 0-2-5-1 0 0 0-2-5 0 0 0 0-3-4 0-1 0 0-3-4 0 0 0-1-2-4 0 0 0 0-3-5 0 0 0 0-2-5 0 0-1 0-2-5 0 0 0 0-2-5 0 0 0 0-3-5 0 0 0 0-1-3-1-4-1-5 0-4 1-5 2-4 3-4 3-3 4-2 4-2 4-1 5 0 4 0 5 2 3 2 4 3 3 4 2 3 1 3 2 4 2 5 2 4 2 4 3 5 2 4 2 4 3 5 2 4 3 4 3 4 2 4 3 5 3 4 2 4 3 4 3 4 3 4 3 4 3 4 3 3 4 4 3 4 3 4 3 3 4 4 3 4 4 3 3 4 4 3 3 4 4 3 4 4 3 3 4 3 4 3 4 4 4 3 1 1 3 3 3 3 2 5 1 4 0 4-1 5-1 4-2 4-3 4-4 3-4 2-4 2-4 0z m264 0l0 0-4 0 0 0-1 0-4 0 0 0 0 0-4 0 0 0 0 0-5 0 0-1 0 0-4 0 0 0 0 0-4 0-1 0 0 0-4 0 0 0 0 0-4-1 0 0-1 0-1 0-4-1-5-2-3-2-4-3-2-4-2-4-2-4 0-5 1-4 1-5 2-4 3-3 4-3 4-3 4-1 4-1 4 0 1 1 4 0 4 0 4 1 4 0 3 0 4 0 4 0 4 0 4 0 4 0 4 0 3 0 4 0 4-1 4 0 4 0 3-1 4 0 4-1 4 0 4-1 3-1 4 0 4-1 4-1 3 0 4-1 4-1 3-1 4-1 4-1 3-1 4-1 3-2 4-1 4-1 3-1 4-2 3-1 4-1 3-2 0 0 0 0 4-1 5-1 5 0 4 1 4 2 4 3 3 3 2 4 2 4 1 5 0 4 0 5-2 4-2 4-3 3-4 3-3 2 0 0-1 0 0 0-3 2-1 0 0 0-4 1 0 0 0 0-4 2 0 0 0 0-4 1 0 0 0 0-4 2 0 0 0 0-4 1 0 0 0 0-4 2 0 0 0 0-4 1 0 0-1 0-3 1-1 0 0 0-4 2 0 0 0 0-4 1 0 0 0 0-4 1 0 0 0 0-4 1 0 0-1 0-4 1 0 0 0 0-4 1 0 0 0 0-4 1 0 0 0 0-4 1-1 0 0 0-4 1 0 0 0 0-4 1 0 0 0 0-4 0-1 0 0 0-4 1 0 0 0 0-4 1 0 0 0 0-5 0 0 0 0 0-4 1 0 0 0 0-4 0 0 0-1 0-4 1 0 0 0 0-4 0 0 0 0 0-5 0 0 0 0 0-4 0 0 0 0 1-4 0-1 0 0 0-4 0 0 0 0 0-4 0 0 0-1 0-4 0 0 0z m-155-39l-4 0-5-1-3-1-2-1 0 0 0 0-4-2 0 0 0 0-3-2-1-1 0 0-3-2 0 0-1 0-3-2 0 0 0 0-4-2 0 0 0 0-4-2 0-1 0 0-3-2 0 0-1 0-3-2 0 0 0 0-4-3 0 0 0 0-3-2 0 0 0 0-4-3 0 0 0 0-3-2 0 0-1-1-3-2 0 0 0 0-3-3 0 0-1 0-3-2 0-1 0 0-3-2 0 0-1 0-3-3 0 0 0 0-3-3 0 0 0 0-3-3-1 0 0 0-3-3 0 0 0 0-3-3 0 0 0 0-3-3 0 0 0 0-3-3-1 0 0 0-3-3 0 0 0 0-3-3 0 0 0 0-3-3 0-1 0 0-3-3 0 0 0 0-3-3 0 0 0 0-3-3 0 0 0 0-3-4 0 0 0 0-3-3 0 0 0 0-2-3-1 0 0-1-2-3 0 0 0 0-3-3 0 0 0-1-3-3 0 0 0 0-2-3 0 0-1-1-2-3 0 0 0 0-2-3-1-1 0 0-2-3 0 0 0 0-2-4-1 0 0 0-2-3-2-4-1-4-1-5 1-4 1-5 2-4 3-3 3-4 4-2 4-2 4-1 5 0 4 1 5 2 4 2 3 3 2 3 2 3 2 3 2 3 3 3 2 4 2 3 2 3 3 3 2 3 3 2 2 3 3 3 2 3 3 3 2 3 3 3 3 2 3 3 2 3 3 2 3 3 3 2 3 3 3 2 3 3 3 2 3 3 3 2 3 2 3 3 3 2 3 2 3 2 3 2 3 2 4 2 3 2 3 2 3 2 4 2 3 2 2 0 3 3 4 3 2 4 2 4 1 4 1 5-1 4-1 5-3 4-2 3-4 3-4 2-4 2-5 0z m393-59l-5-1-4-1-4-1-4-3-3-3-3-4-1-4-1-5-1-4 1-5 2-4 2-4 2-3 3-2 3-3 2-3 3-3 2-3 3-3 2-3 3-2 2-3 3-3 2-3 2-3 3-4 2-3 2-3 2-3 2-3 2-3 2-4 2-3 2-3 2-3 2-4 2-3 1-3 2-4 2-3 1-3 2-4 2-3 1-4 1-3 2-4 1-3 2-4 1-3 1-4 1-4 2-3 1-4 1-3 0-3 2-4 2-4 4-3 3-3 4-2 5-1 4 0 5 0 4 1 4 3 4 2 3 4 2 4 2 4 0 5 0 4-1 4 0 2 0 0 0 0-2 4 0 0 0 1-1 3 0 1 0 0-1 4 0 0 0 0-2 4 0 0 0 0-1 4 0 0 0 0-2 4 0 0 0 0-1 4 0 0 0 0-2 4 0 0 0 0-1 4 0 0 0 1-2 3 0 0 0 1-2 3 0 0 0 1-2 3 0 0 0 1-1 3 0 0-1 1-1 3 0 0 0 0-2 4 0 0 0 0-2 4 0 0 0 0-2 4 0 0 0 0-2 4 0 0-1 0-1 4-1 0 0 0-2 3 0 1 0 0-2 3 0 0 0 0-2 4 0 0 0 0-2 4-1 0 0 0-2 3 0 0 0 1-2 3 0 0 0 0-3 4 0 0 0 0-2 3 0 0 0 1-3 3 0 0 0 0-2 3 0 1-1 0-2 3 0 0 0 0-3 3 0 1 0 0-2 3-1 0 0 0-2 3 0 1 0 0-3 3 0 0 0 0-3 3 0 0 0 0-3 4 0 0 0 0-3 3 0 0 0 0-3 3 0 0 0 0-3 3 0 0 0 1-3 3 0 0 0 0-3 2-3 3-4 3-5 1-4 1z m-564-171l-5 0-4-1-4-2-4-2-3-4-3-3-2-4-1-4-1-4 0 0 0 0 0-4 0 0-1 0 0-4 0-1 0 0-1-4 0 0 0 0-1-4 0 0 0 0 0-5 0 0 0 0-1-4 0 0 0 0 0-4 0 0 0-1 0-4 0 0-1 0 0-4 0 0 0 0 0-5 0 0 0 0 0-4 0 0 0 0-1-4 0-1 0 0 0-4 0 0 0 0 0-4 0 0 0-1 0-4 0 0 0 0 0-4 0 0 0-1 0-4 0 0 0 0 0-4 0 0 0 0 1-5 0 0 0 0 0-4 0 0 0 0 0-4 0-1 0 0 0-4 1 0 0 0 0-4 0 0 0-1 0-4 0 0 0 0 1-4 0 0 0 0 0-4 0-1 0 0 1-4 0 0 0 0 1-4 0 0 0 0 0-4 1-1 0 0 0-4 0 0 0 0 1-4 0 0 0 0 1-4 0-1 0 0 1-4 0 0 0 0 1-4 0 0 0 0 1-4 0 0 0-1 1-4 0 0 0 0 1-4 0 0 0 0 1-4 0 0 0 0 2-4 0 0 0 0 1-4 0-1 0 0 1-1 1-4 3-4 3-3 4-3 4-2 4-1 5 0 4 1 5 1 4 2 3 3 3 4 2 4 2 4 0 5 0 4-1 4 0 1-2 4-1 4-1 3-1 4-1 3-1 4 0 4-1 4-1 3-1 4 0 4-1 4-1 3 0 4-1 4 0 4 0 3-1 4 0 4 0 4-1 4 0 4 0 3 0 4 0 4 0 4 0 4 0 4 0 3 1 4 0 4 0 4 1 4 0 3 0 4 1 4 0 4 1 4 1 3 0 4 1 4 0 4 0 5-1 4-2 4-3 4-3 3-4 2-5 2-4 1z m754-46l-5 0-4-1-4-2-4-2-3-4-3-4-2-4 0-4-1-4 1-4 0-5 0-5 0-5 0-5 0-5 0-5-1-5 0-5 0-5-1-5 0-5-1-5 0-5-1-5-1-4 0-5-1-5-1-5-1-5-1-5-1-5-1-4-1-5-1-5-2-5-1-4-2-5-1-5-1-4-2-5-2-5-1-4-2-5-2-4-2-5-2-5-2-4-2-5-2-4-2-4-2-5-2-4-2-5-1-4 0-5 1-4 2-4 2-4 3-4 4-2 4-2 4-2 5 0 4 1 5 1 4 2 3 3 3 3 2 3 3 5 0 0 0 0 2 5 0 0 0 0 2 5 0 0 0 0 3 5 0 0 0 0 2 5 0 0 0 0 2 5 0 0 0 0 2 5 0 0 0 0 2 5 0 0 0 0 2 5 0 0 0 1 2 4 0 1 0 0 2 5 0 0 0 0 2 5 0 0 0 0 2 5 0 0 0 0 2 5 0 0 0 1 1 5 0 0 0 0 2 5 0 0 0 0 1 5 0 0 0 0 2 5 0 1 0 0 1 5 0 0 0 0 1 5 0 0 0 0 2 6 0 0 0 0 1 5 0 0 0 0 1 5 0 1 0 0 1 5 0 0 0 0 1 5 0 0 0 1 1 5 0 0 0 0 1 5 0 0 0 1 1 5 0 0 0 0 0 5 0 0 0 1 1 5 0 0 0 0 0 5 1 0 0 1 0 5 0 0 0 0 0 5 0 1 0 0 1 5 0 0 0 0 0 6 0 0 0 0 0 5 0 0 0 0 1 6 0 0 0 0 0 5 0 0 0 1 0 5 0 0 0 0 0 6 0 0 0 0 0 5 0 0 0 0-1 6 0 0 0 0 0 4 0 5-2 4-2 4-3 3-4 3-4 2-4 2-4 0z m-853-16l-5 0-4-1-4-1-4-3-4-3-2-4-2-4-1-4-1-4 0-4 0 0 0 0 0-5 0-1 0 0 1-5 0 0 0 0 0-6 0 0 0 0 0-5 0 0 0 0 0-6 0 0 0 0 1-5 0 0 0-1 0-5 0 0 0 0 1-5 0-1 0 0 0-5 0 0 0 0 1-5 0-1 0 0 1-5 0 0 0 0 0-5 0-1 0 0 1-5 0 0 0 0 1-5 0-1 0 0 1-5 0 0 0 0 1-5 0 0 0-1 1-5 0 0 0 0 1-5 0 0 0 0 2-6 0 0 0 0 1-5 0 0 0 0 1-5 0 0 0-1 2-5 0 0 0 0 1-5 0 0 0 0 2-5 0 0 0 0 2-5 0-1 0 0 1-5 0 0 0 0 2-5 0 0 0 0 2-5 0 0 0 0 2-5 0 0 0-1 2-4 0-1 0 0 2-5 0 0 0 0 2-5 0 0 0 0 2-5 0 0 0 0 2-5 0 0 0 0 2-5 0 0 0 0 3-5 0 0 0 0 2-5 0 0 0 0 2-5 1 0 0 0 0-1 3-4 3-3 3-3 4-2 5-1 4 0 5 0 4 1 4 3 4 2 3 4 2 4 2 4 0 5 0 4-1 5-1 3-1 1-2 5-2 4-2 4-2 5-2 4-2 5-2 5-2 4-2 5-1 4-2 5-1 5-2 4-1 5-2 5-1 4-1 5-2 5-1 5-1 4-1 5-1 5-1 5-1 5-1 5 0 5-1 4-1 5 0 5-1 5 0 5-1 5 0 5 0 5-1 5 0 5 0 5 0 5 0 4 0 4-1 5-2 4-3 3-4 4-3 2-5 2-4 0z m756-57l-4 0-5-1-4-2-4-3-3-3-2-4-2-4-1-3 0 0 0 0 0 0 0 0-1-4 0-4-1-4-1-3 0-4-1-4-1-4-1-3-1-4-1-3-1-4-1-4-2-3-1-4-1-3-1-4-2-4-1-3-2-4-1-3-1-4-2-3-2-3-1-4-2-3-2-4-1-3-2-3-2-4-2-3-2-3-2-3-2-4-2-3-2-3-2-3-2-3-2-3-3-3-2-3-2-4-2-1-2-4-2-4-1-5 0-4 1-5 2-4 2-4 3-3 4-3 4-2 4-1 5-1 4 1 4 1 5 2 3 3 3 3 1 1 0 1 0 0 3 3 0 0 0 0 2 3 1 1 0 0 2 3 0 0 0 0 3 4 0 0 0 0 2 3 0 0 0 0 3 4 0 0 0 0 2 3 0 1 0 0 2 3 0 0 1 0 2 4 0 0 0 0 2 4 0 0 0 0 2 3 0 1 0 0 2 3 0 0 1 1 2 3 0 0 0 0 2 4 0 0 0 0 2 4 0 0 0 0 2 4 0 0 0 0 2 4 0 0 0 0 1 4 1 0 0 0 1 4 0 0 0 0 2 4 0 0 0 0 2 4 0 0 0 0 2 4 0 0 0 0 1 4 0 0 0 0 2 4 0 0 0 0 1 4 0 0 0 0 2 4 0 0 0 0 1 4 0 0 0 0 2 4 0 0 0 0 1 4 0 0 0 1 1 4 0 0 0 0 2 4 0 0 0 0 1 4 0 0 0 0 1 4 0 0 0 0 1 4 0 1 0 0 1 4 0 0 0 0 1 4 0 0 0 0 1 4 0 0 0 1 1 4 0 0 0 0 1 4 0 0 0 0 1 4 0 0 0 1 0 4 0 0 0 0 0 0 1 5-1 4-1 4-2 4-3 4-4 3-4 2-4 2-5 0z m-590-160l-4-1-4-2-4-2-4-3-3-3-2-4-1-5-1-4 1-5 1-4 2-4 2-3 1-2 0 0 0 0 3-3 0 0 0 0 3-3 0-1 0 0 3-3 0 0 0 0 3-3 0 0 0 0 3-3 0 0 0 0 3-3 0-1 0 0 3-3 0 0 0 0 3-3 0 0 1 0 3-3 0 0 0 0 3-3 0 0 0 0 3-3 0 0 0 0 3-3 0 0 1 0 3-3 0 0 0 0 3-3 0 0 0 0 3-2 1-1 0 0 3-2 0 0 0 0 3-3 1 0 0 0 3-3 0 0 0 0 3-2 1 0 0-1 3-2 0 0 0 0 4-2 0-1 0 0 3-2 0 0 0 0 4-2 0-1 0 0 3-2 1 0 0 0 3-2 0 0 0 0 4-3 0 0 0 0 4-2 0 0 0 0 3-2 1 0 0 0 3-2 0 0 1 0 3-2 0 0 0-1 4-1 0-1 0 0 4-2 0 0 0 0 4-2 0 0 0 0 4-1 0-1 0 0 4-1 0 0 0 0 4-2 0 0 0 0 4-2 0 0 0 0 4-2 0 0 0 0 4-1 0-1 0 0 4-1 0 0 0 0 4-2 4-1 4 0 5 0 4 1 4 2 4 3 3 4 2 3 2 5 1 4 0 5-1 4-2 4-2 4-4 3-3 3-4 2-3 1-4 2-3 1-4 2-3 1-3 2-4 1-3 2-4 2-3 2-3 1-4 2-3 2-3 2-3 2-4 2-3 2-3 2-3 2-3 2-3 3-3 2-4 2-3 2-2 3-3 2-3 3-3 2-3 3-3 2-3 3-3 2-2 3-3 3-3 3-3 2-2 3-3 3-2 3-3 3-2 3-1 1-4 3-3 3-5 1-4 1-5 1z m426-77l-5 0-4-1-4-2-1-1-4-2-3-1-3-2-4-2-3-2-3-1-4-2-3-1-4-2-3-1-4-2-3-1-4-2-3-1-4-1-4-1-3-1-4-2-3-1-4-1-4-1-3-1-4-1-4 0-3-1-4-1-4-1-4 0-3-1-4-1-4 0-4-1-3 0-4 0-4-1-4 0-4 0-4-1-3 0-4 0-4 0-5 0-4-2-4-2-4-3-3-3-2-4-1-4-1-5 0-5 1-4 2-4 2-4 4-3 3-3 4-2 5-1 4 0 4 0 0 0 0 0 4 0 0 0 1 0 4 1 0 0 0 0 4 0 0 0 0 0 5 0 0 0 0 0 4 0 0 0 0 0 4 1 1 0 0 0 4 0 0 0 0 0 4 1 0 0 0 0 5 0 0 0 0 0 4 1 0 0 0 0 4 1 0 0 1 0 4 0 0 0 0 0 4 1 0 0 0 0 4 1 0 0 1 0 4 1 0 0 0 0 4 1 0 0 0 0 4 1 0 0 0 0 4 1 1 0 0 0 4 1 0 0 0 0 4 1 0 0 0 0 4 1 0 0 0 0 4 2 0 0 1 0 3 1 1 0 0 0 4 1 0 0 0 0 4 2 0 0 0 0 4 1 0 0 0 0 4 2 0 0 0 0 4 1 0 0 0 0 4 2 0 0 0 0 4 1 0 0 1 1 3 1 0 0 1 0 3 2 0 0 1 0 3 2 0 0 1 0 3 2 0 0 1 0 3 1 0 0 0 1 4 1 0 0 0 0 4 2 0 0 0 0 4 2 0 0 0 1 4 1 0 1 0 0 4 2 0 0 0 0 2 1 3 2 4 4 2 3 2 5 1 4 0 5-1 4-1 4-3 4-3 4-3 3-4 2-5 1-4 0z m-440-39l-4-1-5-1-4-3-3-3-3-3-2-4-1-5-1-4 0-5 1-4 2-4 3-4 3-2 1-1 0 0 0 0 4-4 0 0 0 0 4-3 0 0 1 0 4-4 0 0 0 0 4-3 0 0 0 0 5-3 0 0 0 0 4-3 0-1 0 0 5-3 0 0 0 0 4-3 0 0 1 0 4-3 0 0 0 0 5-3 0 0 0 0 4-3 0 0 1 0 4-3 0 0 0 0 5-2 0 0 0-1 5-2 0 0 0 0 4-3 1 0 0 0 4-2 0 0 0-1 5-2 0 0 0 0 5-3 0 0 0 0 5-2 0 0 0 0 5-2 0 0 0 0 5-3 0 0 0 0 5-2 0 0 0 0 5-2 0 0 0 0 5-2 0 0 0 0 5-2 0 0 0 0 5-2 0 0 1 0 4-2 1 0 0 0 5-2 0 0 0 0 5-2 0 0 0 0 5-2 0 0 0 0 5-2 0 0 1 0 5-1 0 0 0 0 5-2 0 0 0 0 5-1 0 0 0 0 5-2 1 0 0 0 5-1 0 0 0 0 5-1 0 0 0 0 6-2 0 0 0 0 4-1 5 0 4 0 5 1 4 2 4 3 3 3 2 4 2 4 1 5 0 4-1 5-1 4-3 4-3 3-4 3-4 2-3 1-5 1-4 1-5 1-5 1-5 2-4 1-5 2-5 1-4 2-5 1-5 2-4 1-5 2-5 2-4 2-5 2-4 2-5 2-4 2-5 2-4 2-4 2-5 3-4 2-4 2-5 3-4 2-4 3-4 3-4 2-4 3-5 3-4 2-4 3-4 3-4 3-3 3-4 3-4 3-1 1-4 3-4 1-4 1-5 1z m543-3l-5 0-4-1-5-2-3-2-1-2-4-3-4-3-4-3-4-3-4-3-4-2-4-3-5-3-4-2-4-3-4-3-4-2-5-3-4-2-4-2-5-3-4-2-4-2-5-2-4-2-5-2-4-2-5-2-4-2-5-2-4-2-5-1-5-2-4-1-5-2-5-1-5-2-4-1-5-2-5-1-5-1-4-1-5-1-3-1-5-1-4-2-3-3-3-3-2-4-2-5-1-4 0-5 1-4 2-4 3-4 3-3 4-3 4-2 4-1 5 0 4 0 3 1 0 0 0 0 5 1 0 0 1 0 5 2 0 0 0 0 5 1 0 0 0 0 5 1 0 0 1 0 5 2 0 0 0 0 5 1 0 0 0 0 5 2 0 0 1 0 5 1 0 0 0 0 5 2 0 0 0 0 5 2 0 0 0 0 5 2 0 0 0 0 5 2 1 0 0 0 5 2 0 0 0 0 5 2 0 0 0 0 5 2 0 0 0 0 5 2 0 0 0 0 5 2 0 0 0 0 5 2 0 0 0 0 5 3 0 0 0 0 5 2 0 0 0 0 5 2 0 0 0 0 5 3 0 0 0 0 5 2 0 1 0 0 4 2 1 0 0 0 4 3 0 0 1 0 4 2 0 1 0 0 5 2 0 0 0 0 5 3 0 0 0 0 4 3 0 0 0 0 5 3 0 0 0 0 5 3 0 0 0 0 4 3 0 0 0 0 5 3 0 0 0 1 4 3 0 0 0 0 5 3 0 0 0 0 4 3 0 0 0 0 4 4 1 0 0 0 4 3 0 0 0 0 2 2 3 3 3 4 2 4 1 4 0 5-1 4-1 5-2 4-3 3-4 3-4 2-4 2-4 0z" horiz-adv-x="1000" />
<glyph glyph-name="participant" unicode="&#xe85c;" d="M47 654l0-625 906 0 0 625z m857-48l0-533-670 0 0 533 670 0z m-810 0l94 0 0-533-94 0z" horiz-adv-x="1000" />
<glyph glyph-name="event-subprocess-expanded" unicode="&#xe85d;" d="M261 669c16 0 33 0 49 0 0 16 0 32 0 49-16 0-33 0-49 0 0-17 0-33 0-49z m98 0c16 0 32 0 49 0 0 16 0 32 0 49-17 0-33 0-49 0 0-17 0-33 0-49z m97 0c17 0 33 0 49 0 0 16 0 32 0 49-16 0-32 0-49 0 0-17 0-33 0-49z m98 0c16 0 33 0 49 0 0 16 0 32 0 49-16 0-33 0-49 0 0-17 0-33 0-49z m98 0c16 0 32 0 49 0 0 16 0 32 0 49-17 0-33 0-49 0 0-17 0-33 0-49z m97 0c15 0 31 1 46-1 2 16 4 32 6 48-17 3-34 1-52 2 0-17 0-33 0-49z m-531 49c-8 0-17-1-25-3 3-16 6-32 9-48 10 3 26-3 20 13-2 11 5 34-4 38z m614-63c12-6 23-15 31-25 12 11 28 21 37 32-13 15-27 27-44 36-8-14-16-29-24-43z m-693 40c-16-10-31-23-43-37 13-9 27-24 39-30 9 10 18 19 30 25-9 14-16 29-26 42z m759-94c-15-1-15-9-10-22 4-6-3-23 7-23 14 1 31-1 44 1 0 19-3 38-10 56-10-4-20-8-31-12z m-830 4c-5-17-7-35-7-53 16 0 32 0 49 0-1 13 1 27 5 40-15 5-31 10-46 15l-1-2 0 0z m822-147c17 0 33 0 49 0 0 17 0 33 0 49-16 0-32 0-49 0 0-16 0-32 0-49z m-829-4c16 0 32 0 49 0 0 16 0 33 0 49-17 0-33 0-49 0 0-16 0-33 0-49z m829-93c17 0 33 0 49 0 0 16 0 32 0 49-16 0-32 0-49 0 0-17 0-33 0-49z m-829-5c16 0 32 0 49 0 0 17 0 33 0 49-17 0-33 0-49 0 0-16 0-32 0-49z m829-93c17 0 33 0 49 0 0 16 0 33 0 49-16 0-32 0-49 0 0-16 0-33 0-49z m-829-4c16 0 32 0 49 0 0 16 0 32 0 49-17 0-33 0-49 0 0-17 0-33 0-49z m829-94c17 0 33 0 49 0 0 17 0 33 0 49-16 0-32 0-49 0 0-16 0-32 0-49z m-829-4c16 0 32 0 49 0 0 16 0 33 0 49-17 0-33 0-49 0 0-16 0-33 0-49z m827-40c-3-13-7-25-14-37 14-7 28-19 42-24 10 16 17 34 20 52-16 3-33 7-48 9z m-823-14c4-19 12-37 23-53 13 9 27 18 40 27-7 12-12 24-15 37-16-4-32-7-48-11z m780-54c-10-7-21-13-34-17 6-15 11-31 16-46 18 5 35 14 50 26-10 13-20 26-30 39l-2-2 0 0z m-718-40c16-11 33-20 52-25 4 16 9 32 12 47-12 4-24 10-35 18-10-14-19-27-29-40z m107-31c16 0 32 0 49 0 0 17 0 33 0 49-17 0-33 0-49 0 0-16 0-32 0-49z m97 0c17 0 33 0 49 0 0 17 0 33 0 49-16 0-32 0-49 0 0-16 0-32 0-49z m98 0c16 0 33 0 49 0 0 17 0 33 0 49-16 0-33 0-49 0 0-16 0-32 0-49z m98 0c16 0 32 0 48 0 0 17 0 33 0 49-16 0-32 0-48 0 0-16 0-32 0-49z m94 0c17 0 33 0 49 0 0 17 0 33 0 49-16 0-32 0-49 0 0-16 0-32 0-49z m101 0c16 0 33 0 49 0 0 17 0 33 0 49-16 0-33 0-49 0 0-16 0-32 0-49z m-53 15c0 114 0 229 0 343-113 0-225 0-338 0 0-114 0-229 0-343 113 0 225 0 338 0z m-307 312c92 0 184 0 276 0 0-92 0-184 0-277-92 0-184 0-276 0 0 93 0 185 0 277z m37-110c0-16 0-31 0-47 67 0 135 0 203 0 0 16 0 31 0 47-68 0-136 0-203 0z" horiz-adv-x="1000" />
<glyph glyph-name="lane-insert-below" unicode="&#xe85e;" d="M46-50l0 89 49 0 0-40 16 0 0-49-65 0z m114 0l0 49 97 0 0-49-97 0z m146 0l0 49 98 0 0-49-98 0z m147 0l0 49 97 0 0-49-97 0z m146 0l0 49 98 0 0-49-98 0z m147 0l0 49 97 0 0-49-97 0z m145 0l0 49 13 0 0 40 49 0 0-64 0-25-25 0-37 0z m-845 138l0 92 49 0 0-92-49 0z m858 0l0 92 49 0 0-92-49 0z m-857 139l0 527 906 0 0-527-906 0z m857 48l0 435-810 0 0-435 810 0z" horiz-adv-x="1000" />
<glyph glyph-name="space-tool" unicode="&#xe85f;" d="M366 800l0-900 38 0 0 900-38 0z m233 0l0-900 38 0 0 900-38 0z m-394-287l-164-163 164-163 0 111 93 0 0 105-93 0 0 110z m595 0l0-108-94-1 0-106 94 0 0-111 163 163-163 163z" horiz-adv-x="1000" />
<glyph glyph-name="connection-multi" unicode="&#xe860;" d="M916 798l-410-109 64-95-486-327 25-38 486 328 62-92 259 333 0 0z m0-328l-411-109 151-224 260 333 0 0z m-409-245l-63-43 25-37 63 42-25 38z m-126-85l-62-42 25-38 62 43-25 37z m-133-90l-63-43 25-37 63 43-25 37z m-126-85l-38-26 25-37 38 26-25 37z" horiz-adv-x="1000" />
<glyph glyph-name="lane" unicode="&#xe861;" d="M47 614l0-528 906 0 0 528z m47-483l0 435 810 0 0 0 0-435z" horiz-adv-x="1000" />
<glyph glyph-name="lasso-tool" unicode="&#xe862;" d="M303 798l0-218 103 0 0 218-103 0z m-248-246l0-103 218 0 0 103-218 0z m379 0l0-103 219 0 0 103-219 0z m349-30l0-40 123 0 0-117 40 0 0 157-163 0z m-480-104l0-218 103 0 0 218-103 0z m603-159l0-77 40 0 0 77-40 0z m0-190l0-116-119 0 0-40 159 0 0 156-40 0z m-570-1l0-157 159 0 0 40-119 0 0 117-40 0z m264-117l0-40 82 0 0 40-82 0z" horiz-adv-x="1000" />
<glyph glyph-name="lane-insert-above" unicode="&#xe863;" d="M46 754l0-89 49 0 0 41 16 0 0 48-65 0z m114 0l0-48 97 0 0 48-97 0z m146 0l0-48 98 0 0 48-98 0z m147 0l0-48 97 0 0 48-97 0z m146 0l0-48 98 0 0 48-98 0z m147 0l0-48 97 0 0 48-97 0z m145 0l0-48 13 0 0-41 49 0 0 65 0 24-25 0-37 0z m-845-137l0-92 49 0 0 92-49 0z m858 0l0-92 49 0 0 92-49 0z m-857-139l0-528 906 0 0 528-906 0z m857-48l0-435-810 0 0 435 810 0z" horiz-adv-x="1000" />
<glyph glyph-name="lane-divide-three" unicode="&#xe864;" d="M47 706l0-216 0-49 0-182 0-49 0-216 906 0 0 216 0 24 0 25 0 182 0 25 0 24 0 216-906 0z m47-44l810 0 0-172-12 0 0-49 12 0 0-182-12 0 0-49 12 0 0-169-810 0 0 169 17 0 0 49-17 0 0 182 17 0 0 49-17 0 0 172z m66-172l0-49 98 0 0 49-98 0z m147 0l0-49 97 0 0 49-97 0z m146 0l0-49 98 0 0 49-98 0z m147 0l0-49 97 0 0 49-97 0z m146 0l0-49 98 0 0 49-98 0z m-586-231l0-49 98 0 0 49-98 0z m147 0l0-49 97 0 0 49-97 0z m146 0l0-49 98 0 0 49-98 0z m147 0l0-49 97 0 0 49-97 0z m146 0l0-49 98 0 0 49-98 0z" horiz-adv-x="1000" />
<glyph glyph-name="lane-divide-two" unicode="&#xe865;" d="M47 706l0-332 0-48 0-332 906 0 0 332 0 24 0 24 0 332-906 0z m47-44l810 0 0-288-12 0 0-48 12 0 0-285-810 0 0 285 17 0 0 48-17 0 0 288z m66-288l0-48 98 0 0 48-98 0z m147 0l0-48 97 0 0 48-97 0z m146 0l0-48 98 0 0 48-98 0z m147 0l0-48 97 0 0 48-97 0z m146 0l0-48 98 0 0 48-98 0z" horiz-adv-x="1000" />
<glyph glyph-name="data-input" unicode="&#xe866;" d="M626 746c-143 0-286 0-429 0l0-792 606 0 0 610c-59 61-118 121-177 182z m-52-45l0-186 184 0 0-516-516 0 0 702c110 0 221 0 332 0z m45-12l125-129-125 0 0 129z m-227-21l0-24 0-69-106 0 0-80 106 0 0-92 141 132-141 133z m20-47l92-86-92-86 0 66-106 0 0 40 106 0 0 66z" horiz-adv-x="1000" />
<glyph glyph-name="data-output" unicode="&#xe867;" d="M626 746c-143 0-286 0-429 0l0-792 606 0 0 610c-59 61-118 121-177 182z m-52-45l0-186 184 0 0-516-516 0 0 702c110 0 221 0 332 0z m45-12l125-129-125 0z m-227-21l0-93-106 0 0-80 106 0 0-92 141 132z" horiz-adv-x="1000" />
<glyph glyph-name="hand-tool" unicode="&#xe868;" d="M498 750c-19 0-36-11-45-26-8-15-12-33-14-53-5-40-1-88-1-131 0-22 0-45 0-67-6 14-11 28-15 39l0 0 0 0c-16 40-30 81-50 111-10 15-21 27-36 34-16 8-34 7-52 0l0-1 0 0c-18-8-28-24-32-41-3-17 0-35 4-54 9-39 26-84 38-128 10-35 19-70 27-100-12 11-24 23-38 35-23 20-49 38-75 48-27 10-57 11-80-9l0 0 0 0c-18-17-27-37-24-57 2-20 13-38 27-56 29-36 74-75 118-128 49-58 102-152 140-201l5-7 332 0 3 12c7 21 14 62 26 114 11 51 27 112 47 165 28 71 56 138 68 191 6 26 9 49 4 70-5 20-22 37-45 41-20 4-39-5-52-19-14-13-24-31-33-52-8-15-14-33-21-50 0 29 0 36 0 75-1 43 2 92-1 131-2 19-5 37-12 51-7 14-22 26-40 25-17 1-32-7-41-19-10-13-16-28-20-44-9-34-13-74-19-107-3-16-6-32-9-47-2 16-4 33-6 51-4 40-6 88-15 128-4 19-9 37-19 51-9 15-25 26-43 25l1 0c0 0-1 0-2 0z m0-33c0 0 1 0 1 0l1 0 0 0c6 0 9-2 14-10 5-8 10-23 14-40 8-36 11-83 15-125 9-90 22-156 22-156l33 1c0 0 13 75 26 149 6 35 11 75 18 104 4 14 9 26 14 32 5 6 7 7 14 7l1 0 1 0c6 0 5 0 9-7 4-7 7-21 8-39 3-35 1-83 1-128 0-84 1-160 1-160l32-7c19 41 35 91 52 128 9 19 18 34 27 43 8 8 14 10 22 9l0 0 0 0c13-2 16-6 19-17 2-10 1-30-5-54-11-47-39-114-66-186-22-56-37-118-49-170-10-42-17-79-22-99l-289 0c-35 47-86 136-136 196-46 55-92 95-117 127-13 16-20 29-21 38-1 10 1 17 14 29 11 10 25 10 45 3 20-8 44-24 65-43 44-37 80-82 80-82l29 15c0 0-21 87-43 167-13 47-30 92-38 126-4 17-5 32-3 41 1 9 4 13 12 17 11 5 17 4 23 1 7-3 15-11 23-23 16-24 31-64 46-104l0 0c16-42 47-117 47-117l32 6c0 0 3 83 2 151-1 44-4 92 0 128 2 17 6 31 10 39 5 8 8 10 16 10z" horiz-adv-x="1000" />
<glyph glyph-name="group" unicode="&#xe869;" d="M258 735c-56 0-113-42-128-100-10-40-4-83-6-124v-70h50c0 56-2 112 1 168 6 46 47 80 90 77h216v49c-74 0-149 1-223 0z m315-49h47v49h-47z m139 0c30 2 64-1 87-25 25-24 29-61 27-94v-152h50c-1 64 1 129-1 193-4 66-63 123-126 126-12 2-25 1-37 1 0-16 0-32 0-49z m-588-392h50v49h-50z m702-26h50v49h-50z m-702-163c0-53 34-105 80-127 42-20 89-11 133-13 11 3 31-6 35 4v45c-43 1-87-2-129 2-41 9-71 49-69 93v87h-50v-91z m702 2c1-47-37-91-82-92-47-2-94-1-141-1v-49c51 1 102-2 153 1 61 7 116 64 119 129 2 25 0 50 1 75h-50l0-63z m-362-142h46v49h-46z" horiz-adv-x="1000" />
<glyph glyph-name="transaction" unicode="&#xe8c4;" d="M210 716c-83 0-149-66-149-149l0-434c0-82 66-149 149-149l581 0c82 0 149 67 149 149l0 434c0 83-67 149-149 149l-581 0z m0-34l581 0c63 0 114-51 114-115l0-434c0-64-51-115-114-115l-581 0c-64 0-115 51-115 115l0 434c0 64 51 115 115 115z m29-49c-51 0-93-41-93-92l0-382c0-51 42-92 93-92l523 0c51 0 92 41 92 92l0 382c0 51-41 92-92 92l-523 0z m0-34l523 0c32 0 58-26 58-58l0-382c0-32-26-58-58-58l-523 0c-33 0-59 26-59 58l0 382c0 32 26 58 59 58z" horiz-adv-x="1000" />
</font>
</defs>
</svg>
public/bpmnjs/vendor/bpmn-font/font/bpmn.ttf
Binary files differ
public/bpmnjs/vendor/bpmn-font/font/bpmn.woff
Binary files differ
public/bpmnjs/vendor/bpmn-font/font/bpmn.woff2
Binary files differ
public/bpmnjs/vendor/diagram-js.css
New file
@@ -0,0 +1,820 @@
/**
 * color definitions
 */
.djs-container {
  --blue-base-65: #4d90ff;
  --blue-base-65-opacity-30: rgba(77, 144, 255, 0.3);
  --blue-darken-48: #005df7;
  --blue-darken-55: #1a70ff;
  --blue-lighten-82: #a2c5ff;
  --orange-base-60: #ffa533;
  --orange-base-60-opacity-30: rgba(255, 165, 51, 0.3);
  --orange-base-60-opacity-50: rgba(255, 165, 51, 0.5);
  --orange-lighten-85: #ffddb3;
  --red-base-62: #ff3d3d;
  --red-base-62-opacity-10: rgba(255, 61, 61, 0.1);
  --silver-darken-94: #efefef;
  --color-000000: #000000;
  --color-000000-opacity-05: rgba(0, 0, 0, 0.05);
  --color-000000-opacity-10: rgba(0, 0, 0, 0.1);
  --color-333333: #333333;
  --color-666666: #666666;
  --color-aaaaaa: #aaaaaa;
  --color-cccccc: #cccccc;
  --color-cdcdcd: #cdcdcd;
  --color-dddddd: #dddddd;
  --color-f6f6f6: #f6f6f6;
  --color-fafafa: #fafafa;
  --color-fefefe: #fefefe;
  --color-ffffff: #ffffff;
  --bendpoint-fill-color: var(--blue-base-65-opacity-30);
  --bendpoint-stroke-color: var(--blue-base-65);
  --context-pad-entry-background-color: var(--color-fefefe);
  --context-pad-entry-hover-background-color: var(--silver-darken-94);
  --element-dragger-color: var(--blue-base-65);
  --element-hover-outline-fill-color: var(--blue-darken-48);
  --element-selected-outline-stroke-color: var(--blue-base-65);
  --lasso-fill-color: var(--color-000000-opacity-05);
  --lasso-stroke-color: var(--color-000000);
  --palette-entry-color: var(--color-333333);
  --palette-entry-hover-color: var(--blue-darken-48);
  --palette-entry-selected-color: var(--blue-base-65);
  --palette-separator-color: var(--color-aaaaaa);
  --palette-toggle-hover-background-color: var(--color-666666);
  --palette-background-color: var(--color-fafafa);
  --palette-border-color: var(--color-cccccc);
  --popup-body-background-color: var(--color-fefefe);
  --popup-header-entry-selected-color: var(--blue-base-65);
  --popup-header-entry-selected-background-color: var(--color-000000-opacity-10);
  --popup-header-separator-color: var(--color-dddddd);
  --popup-background-color: var(--color-fafafa);
  --popup-border-color: var(--color-cccccc);
  --resizer-fill-color: var(--blue-base-65-opacity-30);
  --resizer-stroke-color: var(--blue-base-65);
  --search-container-background-color: var(--color-fafafa);
  --search-container-border-color: var(--blue-darken-55);
  --search-container-box-shadow-color: var(--blue-lighten-82);
  --search-container-box-shadow-inset-color: var(--color-cdcdcd);
  --search-input-border-color: var(--color-cccccc);
  --search-result-border-color: var(--color-aaaaaa);
  --search-result-highlight-color: var(--color-000000);
  --search-result-selected-color: var(--blue-base-65-opacity-30);
  --shape-attach-allowed-stroke-color: var(--blue-base-65);
  --shape-connect-allowed-fill-color: var(--color-000000-opacity-05);
  --shape-drop-allowed-fill-color: var(--color-000000-opacity-05);
  --shape-drop-not-allowed-fill-color: var(--red-base-62-opacity-10);
  --shape-resize-preview-stroke-color: var(--blue-base-65);
  --snap-line-stroke-color: var(--blue-base-65-opacity-30);
  --space-tool-crosshair-stroke-color: var(--color-000000);
  --tooltip-error-background-color: var(--red-base-62-opacity-10);
  --tooltip-error-border-color: var(--red-base-62);
  --tooltip-error-color: var(--red-base-62);
}
/**
 * outline styles
 */
.djs-outline {
  fill: none;
  visibility: hidden;
}
.djs-element.hover .djs-outline,
.djs-element.selected .djs-outline {
  visibility: visible;
  shape-rendering: geometricPrecision;
  stroke-dasharray: 3,3;
}
.djs-element.selected .djs-outline {
  stroke: var(--element-selected-outline-stroke-color);
  stroke-width: 1px;
}
.djs-element.hover .djs-outline {
  stroke: var(--element-hover-outline-fill-color);
  stroke-width: 1px;
}
.djs-shape.connect-ok .djs-visual > :nth-child(1) {
  fill: var(--shape-connect-allowed-fill-color) !important;
}
.djs-shape.connect-not-ok .djs-visual > :nth-child(1),
.djs-shape.drop-not-ok .djs-visual > :nth-child(1) {
  fill: var(--shape-drop-not-allowed-fill-color) !important;
}
.djs-shape.new-parent .djs-visual > :nth-child(1) {
  fill: var(--shape-drop-allowed-fill-color) !important;
}
svg.drop-not-ok {
  background: var(--shape-drop-not-allowed-fill-color) !important;
}
svg.new-parent {
  background: var(--shape-drop-allowed-fill-color) !important;
}
.djs-connection.connect-ok .djs-visual > :nth-child(1),
.djs-connection.drop-ok .djs-visual > :nth-child(1) {
  stroke: var(--shape-drop-allowed-fill-color) !important;
}
.djs-connection.connect-not-ok .djs-visual > :nth-child(1),
.djs-connection.drop-not-ok .djs-visual > :nth-child(1) {
  stroke: var(--shape-drop-not-allowed-fill-color) !important;
}
.drop-not-ok,
.connect-not-ok {
  stroke: var(--shape-attach-allowed-stroke-color) !important;
  cursor: not-allowed;
}
.djs-element.attach-ok .djs-visual > :nth-child(1) {
  stroke-width: 5px !important;
}
.djs-frame.connect-not-ok .djs-visual > :nth-child(1),
.djs-frame.drop-not-ok .djs-visual > :nth-child(1) {
  stroke-width: 3px !important;
  stroke: var(--shape-drop-not-allowed-fill-color) !important;
  fill: none !important;
}
/**
* Selection box style
*
*/
.djs-lasso-overlay {
  fill: var(--lasso-fill-color);
  stroke-dasharray: 5 1 3 1;
  stroke: var(--lasso-stroke-color);
  shape-rendering: geometricPrecision;
  pointer-events: none;
}
/**
 * Resize styles
 */
.djs-resize-overlay {
  fill: none;
  stroke-dasharray: 5 1 3 1;
  stroke: var(--shape-resize-preview-stroke-color);
  pointer-events: none;
}
.djs-resizer-hit {
  fill: none;
  pointer-events: all;
}
.djs-resizer-visual {
  fill: var(--resizer-fill-color);;
  stroke-width: 1px;
  stroke-opacity: 0.5;
  stroke: var(--resizer-stroke-color);
  shape-rendering: geometricprecision;
}
.djs-resizer:hover .djs-resizer-visual {
  stroke: var(--resizer-stroke-color);
  stroke-opacity: 1;
}
.djs-cursor-resize-ns,
.djs-resizer-n,
.djs-resizer-s {
  cursor: ns-resize;
}
.djs-cursor-resize-ew,
.djs-resizer-e,
.djs-resizer-w {
  cursor: ew-resize;
}
.djs-cursor-resize-nwse,
.djs-resizer-nw,
.djs-resizer-se {
  cursor: nwse-resize;
}
.djs-cursor-resize-nesw,
.djs-resizer-ne,
.djs-resizer-sw {
  cursor: nesw-resize;
}
.djs-shape.djs-resizing > .djs-outline {
  visibility: hidden !important;
}
.djs-shape.djs-resizing > .djs-resizer {
  visibility: hidden;
}
.djs-dragger > .djs-resizer {
  visibility: hidden;
}
/**
 * drag styles
 */
.djs-dragger * {
  fill: none !important;
  stroke: var(--element-dragger-color) !important;
}
.djs-dragger tspan,
.djs-dragger text {
  fill: var(--element-dragger-color) !important;
  stroke: none !important;
}
marker.djs-dragger circle,
marker.djs-dragger path,
marker.djs-dragger polygon,
marker.djs-dragger polyline,
marker.djs-dragger rect {
  fill: var(--element-dragger-color) !important;
  stroke: none !important;
}
marker.djs-dragger text,
marker.djs-dragger tspan {
  fill: none !important;
  stroke: var(--element-dragger-color) !important;
}
.djs-dragging {
  opacity: 0.3;
}
.djs-dragging,
.djs-dragging > * {
  pointer-events: none !important;
}
.djs-dragging .djs-context-pad,
.djs-dragging .djs-outline {
  display: none !important;
}
/**
 * no pointer events for visual
 */
.djs-visual,
.djs-outline {
  pointer-events: none;
}
.djs-element.attach-ok .djs-hit {
  stroke-width: 60px !important;
}
/**
 * all pointer events for hit shape
 */
.djs-element > .djs-hit-all {
  pointer-events: all;
}
.djs-element > .djs-hit-stroke,
.djs-element > .djs-hit-click-stroke {
  pointer-events: stroke;
}
/**
 * all pointer events for hit shape
 */
.djs-drag-active .djs-element > .djs-hit-click-stroke {
  pointer-events: all;
}
/**
 * shape / connection basic styles
 */
.djs-connection .djs-visual {
  stroke-width: 2px;
  fill: none;
}
.djs-cursor-grab {
  cursor: -webkit-grab;
  cursor: -moz-grab;
  cursor: grab;
}
.djs-cursor-grabbing {
  cursor: -webkit-grabbing;
  cursor: -moz-grabbing;
  cursor: grabbing;
}
.djs-cursor-crosshair {
  cursor: crosshair;
}
.djs-cursor-move {
  cursor: move;
}
.djs-cursor-resize-ns {
  cursor: ns-resize;
}
.djs-cursor-resize-ew {
  cursor: ew-resize;
}
/**
 * snapping
 */
.djs-snap-line {
  stroke: var(--snap-line-stroke-color);
  stroke-linecap: round;
  stroke-width: 2px;
  pointer-events: none;
}
/**
 * snapping
 */
.djs-crosshair {
  stroke: var(--space-tool-crosshair-stroke-color);
  stroke-linecap: round;
  stroke-width: 1px;
  pointer-events: none;
  shape-rendering: crispEdges;
  stroke-dasharray: 5, 5;
}
/**
 * palette
 */
.djs-palette {
  position: absolute;
  left: 20px;
  top: 20px;
  box-sizing: border-box;
  width: 48px;
}
.djs-palette .separator {
  margin: 0 5px;
  padding-top: 5px;
  border: none;
  border-bottom: solid 1px var(--palette-separator-color);
  clear: both;
}
.djs-palette .entry:before {
  vertical-align: text-bottom;
}
.djs-palette .djs-palette-toggle {
  cursor: pointer;
}
.djs-palette .entry,
.djs-palette .djs-palette-toggle {
  color: var(--palette-entry-color);
  font-size: 30px;
  text-align: center;
}
.djs-palette .entry {
  float: left;
}
.djs-palette .entry img {
  max-width: 100%;
}
.djs-palette .djs-palette-entries:after {
  content: '';
  display: table;
  clear: both;
}
.djs-palette .djs-palette-toggle:hover {
  background: var(--palette-toggle-hover-background-color);
}
.djs-palette .entry:hover {
  color: var(--palette-entry-hover-color);
}
.djs-palette .highlighted-entry {
  color: var(--palette-entry-selected-color) !important;
}
.djs-palette .entry,
.djs-palette .djs-palette-toggle {
  width: 46px;
  height: 46px;
  line-height: 46px;
  cursor: default;
}
/**
 * Palette open / two-column layout is controlled via
 * classes on the palette. Events to hook into palette
 * changed life-cycle are available in addition.
 */
.djs-palette.two-column.open {
  width: 94px;
}
.djs-palette:not(.open) .djs-palette-entries {
  display: none;
}
.djs-palette:not(.open) {
  overflow: hidden;
}
.djs-palette.open .djs-palette-toggle {
  display: none;
}
/**
 * context-pad
 */
.djs-overlay-context-pad {
  width: 72px;
}
.djs-context-pad {
  position: absolute;
  display: none;
  pointer-events: none;
}
.djs-context-pad .entry {
  width: 22px;
  height: 22px;
  text-align: center;
  display: inline-block;
  font-size: 22px;
  margin: 0 2px 2px 0;
  border-radius: 3px;
  cursor: default;
  background-color: var(--context-pad-entry-background-color);
  box-shadow: 0 0 2px 1px var(--context-pad-entry-background-color);
  pointer-events: all;
}
.djs-context-pad .entry:before {
  vertical-align: top;
}
.djs-context-pad .entry:hover {
  background: var(--context-pad-entry-hover-background-color);
}
.djs-context-pad.open {
  display: block;
}
/**
 * popup styles
 */
.djs-popup .entry {
  line-height: 20px;
  white-space: nowrap;
  cursor: default;
}
/* larger font for prefixed icons */
.djs-popup .entry:before {
  vertical-align: middle;
  font-size: 20px;
}
.djs-popup .entry > span {
  vertical-align: middle;
  font-size: 14px;
}
.djs-popup .entry:hover,
.djs-popup .entry.active:hover {
  background: var(--popup-header-entry-selected-background-color);
}
.djs-popup .entry.disabled {
  background: inherit;
}
.djs-popup .djs-popup-header .entry {
  display: inline-block;
  padding: 2px 3px 2px 3px;
  border: solid 1px transparent;
  border-radius: 3px;
}
.djs-popup .djs-popup-header .entry.active {
  color: var(--popup-header-entry-selected-color);
  border: solid 1px var(--popup-header-entry-selected-color);
  background-color: var(--popup-header-entry-selected-background-color);
}
.djs-popup-body .entry {
  padding: 4px 10px 4px 5px;
}
.djs-popup-body .entry > span {
  margin-left: 5px;
}
.djs-popup-body {
  background-color: var(--popup-body-background-color);
}
.djs-popup-header {
  border-bottom: 1px solid var(--popup-header-separator-color);
}
.djs-popup-header .entry {
  margin: 1px;
  margin-left: 3px;
}
.djs-popup-header .entry:last-child {
  margin-right: 3px;
}
/**
 * popup / palette styles
 */
.djs-palette {
  background: var(--palette-background-color);
  border: solid 1px var(--palette-border-color);
  border-radius: 2px;
}
.djs-popup {
  background: var(--popup-background-color);
  border: solid 1px var(--popup-border-color);
  border-radius: 2px;
}
/**
 * touch
 */
.djs-shape,
.djs-connection {
  touch-action: none;
}
.djs-segment-dragger,
.djs-bendpoint {
  display: none;
}
/**
 * bendpoints
 */
.djs-segment-dragger .djs-visual {
  display: none;
  fill: var(--bendpoint-fill-color);
  stroke: var(--bendpoint-stroke-color);
  stroke-width: 1px;
  stroke-opacity: 1;
}
.djs-segment-dragger:hover .djs-visual {
  display: block;
}
.djs-bendpoint .djs-visual {
  fill: var(--bendpoint-fill-color);
  stroke: var(--bendpoint-stroke-color);
  stroke-width: 1px;
  stroke-opacity: 0.5;
}
.djs-segment-dragger:hover,
.djs-bendpoints.hover .djs-segment-dragger,
.djs-bendpoints.selected .djs-segment-dragger,
.djs-bendpoint:hover,
.djs-bendpoints.hover .djs-bendpoint,
.djs-bendpoints.selected .djs-bendpoint {
  display: block;
}
.djs-drag-active .djs-bendpoints * {
  display: none;
}
.djs-bendpoints:not(.hover) .floating {
  display: none;
}
.djs-segment-dragger:hover .djs-visual,
.djs-segment-dragger.djs-dragging .djs-visual,
.djs-bendpoint:hover .djs-visual,
.djs-bendpoint.floating .djs-visual {
  fill: var(--bendpoint-fill-color);
  stroke: var(--bendpoint-stroke-color);
  stroke-opacity: 1;
}
.djs-bendpoint.floating .djs-hit {
  pointer-events: none;
}
.djs-segment-dragger .djs-hit,
.djs-bendpoint .djs-hit {
  fill: none;
  pointer-events: all;
}
.djs-segment-dragger.horizontal .djs-hit {
  cursor: ns-resize;
}
.djs-segment-dragger.vertical .djs-hit {
  cursor: ew-resize;
}
.djs-segment-dragger.djs-dragging .djs-hit {
  pointer-events: none;
}
.djs-updating,
.djs-updating > * {
  pointer-events: none !important;
}
.djs-updating .djs-context-pad,
.djs-updating .djs-outline,
.djs-updating .djs-bendpoint,
.connect-ok .djs-bendpoint,
.connect-not-ok .djs-bendpoint,
.drop-ok .djs-bendpoint,
.drop-not-ok .djs-bendpoint {
  display: none !important;
}
.djs-segment-dragger.djs-dragging,
.djs-bendpoint.djs-dragging {
  display: block;
  opacity: 1.0;
}
/**
 * tooltips
 */
.djs-tooltip-error {
  width: 160px;
  padding: 6px;
  background: var(--tooltip-error-background-color);
  border: solid 1px var(--tooltip-error-border-color);
  border-radius: 2px;
  color: var(--tooltip-error-color);
  font-size: 12px;
  line-height: 16px;
  opacity: 0.75;
}
.djs-tooltip-error:hover {
  opacity: 1;
}
/**
 * search pad
 */
.djs-search-container {
  position: absolute;
  top: 20px;
  left: 0;
  right: 0;
  margin-left: auto;
  margin-right: auto;
  width: 25%;
  min-width: 300px;
  max-width: 400px;
  z-index: 10;
  font-size: 1.05em;
  opacity: 0.9;
  background: var(--search-container-background-color);
  border: solid 1px var(--search-container-border-color);
  border-radius: 2px;
  box-shadow: 0 0 0 2px var(--search-container-box-shadow-color), 0 0 0 1px var(--search-container-box-shadow-inset-color) inset;
}
.djs-search-container:not(.open) {
  display: none;
}
.djs-search-input input {
  font-size: 1.05em;
  width: 100%;
  padding: 6px 10px;
  border: 1px solid var(--search-input-border-color);
}
.djs-search-input input:focus {
  outline: none;
  border-color: var(--search-input-border-color);
}
.djs-search-results {
  position: relative;
  overflow-y: auto;
  max-height: 200px;
}
.djs-search-results:hover {
  cursor: pointer;
}
.djs-search-result {
  width: 100%;
  padding: 6px 10px;
  background: white;
  border-bottom: solid 1px var(--search-result-border-color);
  border-radius: 1px;
}
.djs-search-highlight {
  color: var(--search-result-highlight-color);
}
.djs-search-result-primary {
  margin: 0 0 10px;
}
.djs-search-result-secondary {
  font-family: monospace;
  margin: 0;
}
.djs-search-result:hover {
  background: var(--search-result-selected-color);
}
.djs-search-result-selected {
  background: var(--search-result-selected-color);
}
.djs-search-result-selected:hover {
  background: var(--search-result-selected-color);
}
.djs-search-overlay {
  background: var(--search-result-selected-color);
}
/**
 * hidden styles
 */
.djs-element-hidden,
.djs-element-hidden .djs-hit,
.djs-element-hidden .djs-outline,
.djs-label-hidden .djs-label {
  display: none !important;
}
ruoyi-bpmnjs/.gitignore
New file
@@ -0,0 +1,3 @@
node_modules/
tmp/
dist/
ruoyi-bpmnjs/.npmrc
New file
@@ -0,0 +1 @@
package-lock=false
ruoyi-bpmnjs/Gruntfile.js
New file
@@ -0,0 +1,140 @@
  var path = require('path');
module.exports = function(grunt) {
  require('load-grunt-tasks')(grunt);
  /**
   * Resolve external project resource as file path
   */
  function resolvePath(project, file) {
    return path.join(path.dirname(require.resolve(project)), file);
  }
  grunt.initConfig({
    browserify: {
      options: {
        browserifyOptions: {
          debug: true
        },
        transform: [
          [ 'stringify', {
            extensions: [ '.bpmn' ]
          } ]
        ],
        plugin: [
          'esmify'
        ]
      },
      watch: {
        options: {
          watch: true
        },
        files: {
          'dist/index.js': [ 'app/**/*.js' ]
        }
      },
      app: {
        files: {
          'dist/index.js': [ 'app/**/*.js' ]
        }
      }
    },
    copy: {
      diagram_js: {
        files: [
          {
            src: resolvePath('diagram-js', 'assets/diagram-js.css'),
            dest: 'dist/css/diagram-js.css'
          }
        ]
      },
      bpmn_js: {
        files: [
          {
            expand: true,
            cwd: resolvePath('bpmn-js', 'dist/assets'),
            src: ['**/*.*', '!**/*.js'],
            dest: 'dist/vendor'
          }
        ]
      },
      app: {
        files: [
          {
            expand: true,
            cwd: 'app/',
            src: ['**/*.*', '!**/*.js'],
            dest: 'dist'
          }
        ]
      }
    },
    less: {
      options: {
        dumpLineNumbers: 'comments',
        paths: [
          'node_modules'
        ]
      },
      styles: {
        files: {
          'dist/css/app.css': 'styles/app.less'
        }
      }
    },
    watch: {
      options: {
        livereload: true
      },
      samples: {
        files: [ 'app/**/*.*' ],
        tasks: [ 'copy:app' ]
      },
      less: {
        files: [
          'styles/**/*.less',
          'node_modules/bpmn-js-properties-panel/styles/**/*.less'
        ],
        tasks: [
          'less'
        ]
      },
    },
    connect: {
      livereload: {
        options: {
          port: 9013,
          livereload: true,
          hostname: 'localhost',
          open: true,
          base: [
            'dist'
          ]
        }
      }
    }
  });
  // tasks
  grunt.registerTask('build', [ 'copy', 'less', 'browserify:app' ]);
  grunt.registerTask('auto-build', [
    'copy',
    'less',
    'browserify:watch',
    'connect:livereload',
    'watch'
  ]);
  grunt.registerTask('default', [ 'build' ]);
};
ruoyi-bpmnjs/README.md
New file
@@ -0,0 +1,76 @@
# bpmn-js Modeler + Properties Panel Example
This example uses [bpmn-js](https://github.com/bpmn-io/bpmn-js) and [bpmn-js-properties-panel](https://github.com/bpmn-io/bpmn-js-properties-panel). It implements a BPMN 2.0 modeler that allows you to edit execution related properties via a properties panel.
## About
This example is a node-style web application that builds a user interface around the bpmn-js BPMN 2.0 modeler.
![demo application screenshot](https://raw.githubusercontent.com/bpmn-io/bpmn-js-examples/master/properties-panel/docs/screenshot.png "Screenshot of the modeler + properties panel example")
## Usage
Add the [properties panel](https://github.com/bpmn-io/bpmn-js-properties-panel) to your project:
```
npm install --save bpmn-js-properties-panel
```
Additionally, if you'd like to use [Camunda BPM](https://camunda.org) execution related properties, include the [camunda-bpmn-moddle](https://github.com/camunda/camunda-bpmn-moddle) dependency which tells the modeler about `camunda:XXX` extension properties:
```
npm install --save camunda-bpmn-moddle
```
Now extend the [bpmn-js](https://github.com/bpmn-io/bpmn-js) modeler with two properties panel related modules, the panel itself and a provider module that controls which properties are visible for each element. Additionally you must pass an element via `propertiesPanel.parent` into which the properties panel will be rendered (cf. [`app/index.js`](https://github.com/bpmn-io/bpmn-js-examples/blob/master/properties-panel/app/index.js#L16) for details).
```javascript
var propertiesPanelModule = require('bpmn-js-properties-panel'),
    // providing camunda executable properties, too
    propertiesProviderModule = require('bpmn-js-properties-panel/lib/provider/camunda'),
    camundaModdleDescriptor = require('camunda-bpmn-moddle/resources/camunda');
var bpmnModeler = new BpmnModeler({
  container: '#js-canvas',
  propertiesPanel: {
    parent: '#js-properties-panel'
  },
  additionalModules: [
    propertiesPanelModule,
    propertiesProviderModule
  ],
  // needed if you'd like to maintain camunda:XXX properties in the properties panel
  moddleExtensions: {
    camunda: camundaModdleDescriptor
  }
});
```
## Building the Example
You need a [NodeJS](http://nodejs.org) development stack with [npm](https://npmjs.org) and installed to build the project.
To install all project dependencies execute
```
npm install
```
Build the example using [browserify](http://browserify.org) via
```
npm run all
```
You may also spawn a development setup by executing
```
npm run dev
```
Both tasks generate the distribution ready client-side modeler application into the `dist` folder.
Serve the application locally or via a web server (nginx, apache, embedded).
ruoyi-bpmnjs/app/favicon.ico
ruoyi-bpmnjs/app/index.html
New file
@@ -0,0 +1,110 @@
<!DOCTYPE html>
<html >
<head>
  <meta charset="utf-8" />
  <title>在线绘制流程</title>
  <link rel="icon" href="favicon.ico">
  <link rel="stylesheet" href="css/diagram-js.css" />
  <link rel="stylesheet" href="vendor/bpmn-font/css/bpmn-embedded.css" />
  <link rel="stylesheet" href="css/app.css" />
  <style>
    .item{
      display: none;
      cursor: pointer;
    }
    .bjs-powered-by {
      display: none;
    }
    .buttons > li {
      /* display: inline-block; */
      margin-right: 10px;
      height: 26px;
      line-height: 26px;
      float: left;
    }
    .buttons > li > a.btn  {
      background: #00BCD4;
      border: none;
      outline: none;
      padding: 0px 10px;
      color: #fff;
      display: inline-block;
      opacity: 1;
      height: 26px;
      font-size: 14px;
      line-height: 26px;
    }
    .label  {
      background: #00BCD4;
      border: none;
      outline: none;
      padding: 0px 10px;
      color: #fff;
      display: inline-block;
      cursor: pointer;
      opacity: 1;
      height: 26px;
      font-size: 14px;
      line-height: 26px;
    }
    .sy-mask{width:100%;
      height:100%;
      position:fixed;
      background:rgba(0,0,0,0.8);
      left:0;top:0;z-index:1000;
      display: none;
    }
    .sy-alert{
      position:fixed;display:none;background:#fff;border-radius:5px;overflow:hidden;width:300px;max-width:90%;max-height:80%;left:0;right:0;margin:0 auto;z-index:9999}.sy-alert.animated{-webkit-animation-duration:.3s;animation-duration:.3s}.sy-alert .sy-title{height:45px;color:#333;line-height:45px;font-size:15px;border-bottom:1px solid #eee;padding:0 12px}.sy-alert .sy-content{padding:20px;text-align:center;font-size:14px;line-height:24px;color:#666;overflow-y:auto}.sy-alert .sy-btn{height:50%;border-top:1px solid #eee;overflow:hidden}.sy-alert .sy-btn button{float:left;border:0;color:#333;cursor:pointer;background:#fff;width:50%;line-height:45px;font-size:15px;text-align:center}.sy-alert .sy-btn button:nth-child(1){color:#888;border-right:1px solid #eee}.sy-alert.sy-alert-alert .sy-btn button{float:none;width:100%}.sy-alert.sy-alert-tips{text-align:center;width:150px;background:rgba(0,0,0,0.7)}.sy-alert.sy-alert-tips .sy-content{padding:8px;color:#fff;font-size:14px}.sy-alert.sy-alert-model .sy-content{text-align:left}.sy-alert.sy-alert-model .sy-content .form .input-item{margin-bottom:12px;position:relative}.sy-alert.sy-alert-model .sy-content .form .input-item input{display:block;position:relative;width:100%;border:1px solid #eee;padding:10px}.sy-alert.sy-alert-model .sy-content .form .input-item .getcode{border:0;top:0;right:0;position:absolute;background:0;line-height:37px;color:#f60;width:100px;text-align:center}
  </style>
</head>
<body>
<div class="content with-diagram" id="js-drop-zone">
  <div class="message error">
    <div class="note">
      <p>无法显示bpms2.0</p>
      <div class="details">
        <span>错误详细信息</span>
        <pre></pre>
      </div>
    </div>
  </div>
  <div class="canvas" id="js-canvas"></div>
  <div class="properties-panel-parent" id="js-properties-panel"></div>
</div>
<ul class="buttons">
  <li class="item upload">
    <form id="form1" name="myForm" onsubmit="return false" method="post" enctype="multipart/form-data" title="上传文件">
      <input type="file" name="uploadFile" id="uploadFile" accept=".bpmn" style="display: none">
      <label class="label" for="uploadFile" >导入</label>
    </form>
  </li>
  <li class="item download">
    <a class="btn" href id="downloadBpmn">导出</a>
  </li>
  <li class="item submit">
    <a class="btn" id="js-download-diagram">
      部署
    </a>
  </li>
</ul>
<div class="sy-alert sy-alert-model animated" sy-enter="zoomIn" sy-leave="zoomOut" sy-type="confirm" sy-mask="true" id="alert" >
  <div class="sy-title">部署流程</div>
  <div class="sy-content">
        确认是否部署该流程
<!--    <div class="form">-->
<!--      <p class="input-item"><input id="deploymentName" type="text" placeholder="请输入流程名称"></p>-->
<!--    </div>-->
  </div>
  <div class="sy-btn">
    <button id="sure">确定</button>
    <button class="cancel" >取消</button>
  </div>
</div>
<div class="sy-mask cancel"></div>
<script src="index.js"></script>
</body>
</html>
ruoyi-bpmnjs/app/index.js
New file
@@ -0,0 +1,146 @@
import $ from 'jquery';
import BpmnModeler from 'bpmn-js/lib/Modeler';
//import propertiesPanelModule from '../resources/properties-panel';
import propertiesPanelModule from 'bpmn-js-properties-panel';
import propertiesProviderModule from '../resources/properties-panel/provider/activiti';
import activitiModdleDescriptor from '../resources/activiti.json';
import customTranslate from '../resources/customTranslate/customTranslate';
import customControlsModule from '../resources/customControls';
import tools from '../resources/tools'
import diagramXML from '../resources/newDiagram.bpmn';
const proHost = window.location.protocol + "//" + window.location.host;
const href = window.location.href.split("bpmnjs")[0];
const key = href.split(window.location.host)[1];
const publicurl = proHost + key;
// 添加翻译组件
var customTranslateModule = {
    translate: ['value', customTranslate]
};
var container = $('#js-drop-zone');
var canvas = $('#js-canvas');
var bpmnModeler = new BpmnModeler({
    container: canvas,
    propertiesPanel: {
        parent: '#js-properties-panel'
    },
    additionalModules: [
        propertiesPanelModule,
        propertiesProviderModule,
        customControlsModule,
        customTranslateModule
    ],
    moddleExtensions: {
        activiti:activitiModdleDescriptor
    }
});
container.removeClass('with-diagram');
// 判断浏览器支持程度
if (!window.FileList || !window.FileReader) {
    window.alert('请使用谷歌、火狐、IE10+浏览器');
} else {
    tools.registerFileDrop(container, tools.createDiagram(diagramXML, bpmnModeler, container));
}
$(function () {
    // 创建bpmn
    var param = tools.getUrlParam(window.location.href)
        $('.item').show()
    if (param.type === 'addBpmn') {
        tools.createDiagram(diagramXML, bpmnModeler, container);
    } else if (param.type === 'lookBpmn') { //编辑bpmn
        $('.item').hide()
        $('.download').show()
        const Id = param.deploymentFileUUID || '6d4af2dc-bab0-11ea-b584-3cf011eaafca'
        const Name=param.deploymentName || 'String.bpmn'
        const instanceId=param.instanceId
        var param={
            "deploymentId":Id,
            "resourceName":decodeURI(Name)
        }
        if(instanceId){
            var param1={
                instanceId
            }
            $.ajax({
                url: localStorage.getItem("VUE_APP_BASE_API")+'/activitiHistory/gethighLine',
                // url: 'http://localhost:8080/activitiHistory/gethighLine',
                type: 'GET',
                data: param1,
                dataType:'json',
                success: function (result) {
                  console.log(result)
                  var ColorJson=tools.getByColor(result.data)
                    $.ajax({
                        url: localStorage.getItem("VUE_APP_BASE_API")+'/processDefinition/getDefinitionXML',
                        // url: 'http://localhost:8080/processDefinition/getDefinitionXML',
                        type: 'GET',
                        data: param,
                        dataType:'text',
                        success: function (result) {
                            var newXmlData = result
                            tools.createDiagram(newXmlData, bpmnModeler, container);
                            setTimeout(function () {
                                for (var i in ColorJson) {
                                    tools.setColor(ColorJson[i],bpmnModeler)
                                }
                            }, 200)
                        },
                        error: function (err) {
                            console.log(err)
                        }
                    });
                },
                error: function (err) {
                    console.log(err)
                }
            });
        }else{
            //加载后台方法获取xml
            $.ajax({
                url: localStorage.getItem("VUE_APP_BASE_API")+'/processDefinition/getDefinitionXML',
              // url: 'http://localhost:8080/processDefinition/getDefinitionXML',
                type: 'GET',
                data: param,
                dataType:'text',
                success: function (result) {
                    var newXmlData = result
                    tools.createDiagram(newXmlData, bpmnModeler, container);
                },
                error: function (err) {
                    console.log(err)
                }
            });
        }
    } else if(param.type === "historyBpmn") { // bpmn历史
        $('.item').hide()
        $('.download').show()
    }
    // 点击新增
    $('#js-download-diagram').on("click", function () {
       tools.syopen('alert')
    })
    // 点击取消
    $('.cancel').on("click",function () {
        tools.syhide('alert')
    })
    // 点击确定
    $('#sure').on('click',function(){
       // const text=$("#deploymentName").val()
        tools.saveBpmn(bpmnModeler)
    })
    // 点击下载
    $("#downloadBpmn").on("click", function () {
        tools.downLoad(bpmnModeler)
    })
    // 点击上传
    $("#uploadFile").on("change", function () {
        tools.upload(bpmnModeler,container)
    })
});
ruoyi-bpmnjs/package.json
New file
@@ -0,0 +1,48 @@
{
  "name": "bpmn-js-example-properties-panel",
  "version": "0.0.0",
  "description": "A bpmn-js modeler + properties panel example",
  "main": "app/index.js",
  "scripts": {
    "all": "grunt",
    "dev": "grunt auto-build"
  },
  "repository": {
    "type": "git",
    "url": "https://github.com/bpmn-io/bpmn-js-examples"
  },
  "keywords": [
    "bpmnjs-example"
  ],
  "author": {
    "name": "Nico Rehwaldt",
    "url": "https://github.com/nikku"
  },
  "contributors": [
    {
      "name": "bpmn.io contributors",
      "url": "https://github.com/bpmn-io"
    }
  ],
  "license": "MIT",
  "devDependencies": {
    "esmify": "^2.1.1",
    "grunt": "^1.0.4",
    "grunt-browserify": "^5.3.0",
    "grunt-contrib-connect": "^2.0.0",
    "grunt-contrib-copy": "^1.0.0",
    "grunt-contrib-less": "^2.0.0",
    "grunt-contrib-watch": "^1.1.0",
    "load-grunt-tasks": "^5.0.0",
    "stringify": "^5.2.0"
  },
  "dependencies": {
    "bpmn-js": "^7.0.0",
    "bpmn-js-properties-panel": "^0.32.0",
    "camunda-bpmn-moddle": "^4.0.1",
    "diagram-js": "^5.0.0",
    "jquery": "^3.4.1",
    "min-dash": "^3.5.0",
    "x2js": "^3.4.0"
  }
}
ruoyi-bpmnjs/resources/activiti.json
New file
@@ -0,0 +1,1087 @@
{
  "name": "Activiti",
  "uri": "http://activiti.org/bpmn",
  "prefix": "activiti",
  "xml": {
    "tagAlias": "lowerCase"
  },
  "associations": [],
  "types": [
    {
      "name": "Definitions",
      "isAbstract": true,
      "extends": [
        "bpmn:Definitions"
      ],
      "properties": [
        {
          "name": "diagramRelationId",
          "isAttr": true,
          "type": "String"
        }
      ]
    },
    {
      "name": "InOutBinding",
      "superClass": [
        "Element"
      ],
      "isAbstract": true,
      "properties": [
        {
          "name": "source",
          "isAttr": true,
          "type": "String"
        },
        {
          "name": "sourceExpression",
          "isAttr": true,
          "type": "String"
        },
        {
          "name": "target",
          "isAttr": true,
          "type": "String"
        },
        {
          "name": "businessKey",
          "isAttr": true,
          "type": "String"
        },
        {
          "name": "local",
          "isAttr": true,
          "type": "Boolean",
          "default": false
        },
        {
          "name": "variables",
          "isAttr": true,
          "type": "String"
        }
      ]
    },
    {
      "name": "In",
      "superClass": [
        "InOutBinding"
      ],
      "meta": {
        "allowedIn": [
          "bpmn:CallActivity"
        ]
      }
    },
    {
      "name": "Out",
      "superClass": [
        "InOutBinding"
      ],
      "meta": {
        "allowedIn": [
          "bpmn:CallActivity"
        ]
      }
    },
    {
      "name": "AsyncCapable",
      "isAbstract": true,
      "extends": [
        "bpmn:Activity",
        "bpmn:Gateway",
        "bpmn:Event"
      ],
      "properties": [
        {
          "name": "async",
          "isAttr": true,
          "type": "Boolean",
          "default": false
        },
        {
          "name": "asyncBefore",
          "isAttr": true,
          "type": "Boolean",
          "default": false
        },
        {
          "name": "asyncAfter",
          "isAttr": true,
          "type": "Boolean",
          "default": false
        },
        {
          "name": "exclusive",
          "isAttr": true,
          "type": "Boolean",
          "default": true
        }
      ]
    },
    {
      "name": "JobPriorized",
      "isAbstract": true,
      "extends": [
        "bpmn:Process",
        "activiti:AsyncCapable"
      ],
      "properties": [
        {
          "name": "jobPriority",
          "isAttr": true,
          "type": "String"
        }
      ]
    },
    {
      "name": "SignalEventDefinition",
      "isAbstract": true,
      "extends": [
        "bpmn:SignalEventDefinition"
      ],
      "properties": [
        {
          "name": "async",
          "isAttr": true,
          "type": "Boolean",
          "default": false
        }
      ]
    },
    {
      "name": "ErrorEventDefinition",
      "isAbstract": true,
      "extends": [
        "bpmn:ErrorEventDefinition"
      ],
      "properties": [
        {
          "name": "errorCodeVariable",
          "isAttr": true,
          "type": "String"
        },
        {
          "name": "errorMessageVariable",
          "isAttr": true,
          "type": "String"
        }
      ]
    },
    {
      "name": "Error",
      "isAbstract": true,
      "extends": [
        "bpmn:Error"
      ],
      "properties": [
        {
          "name": "activiti:errorMessage",
          "isAttr": true,
          "type": "String"
        }
      ]
    },
    {
      "name": "PotentialStarter",
      "superClass": [
        "Element"
      ],
      "properties": [
        {
          "name": "resourceAssignmentExpression",
          "type": "bpmn:ResourceAssignmentExpression"
        }
      ]
    },
    {
      "name": "FormSupported",
      "isAbstract": true,
      "extends": [
        "bpmn:StartEvent",
        "bpmn:UserTask"
      ],
      "properties": [
        {
          "name": "formHandlerClass",
          "isAttr": true,
          "type": "String"
        },
        {
          "name": "formKey",
          "isAttr": true,
          "type": "String"
        }
      ]
    },
    {
      "name": "TemplateSupported",
      "isAbstract": true,
      "extends": [
        "bpmn:Process",
        "bpmn:FlowElement"
      ],
      "properties": [
        {
          "name": "modelerTemplate",
          "isAttr": true,
          "type": "String"
        }
      ]
    },
    {
      "name": "Initiator",
      "isAbstract": true,
      "extends": [ "bpmn:StartEvent" ],
      "properties": [
        {
          "name": "initiator",
          "isAttr": true,
          "type": "String"
        }
      ]
    },
    {
      "name": "ScriptTask",
      "isAbstract": true,
      "extends": [
        "bpmn:ScriptTask"
      ],
      "properties": [
        {
          "name": "resultVariable",
          "isAttr": true,
          "type": "String"
        },
        {
          "name": "resource",
          "isAttr": true,
          "type": "String"
        }
      ]
    },
    {
      "name": "Process",
      "isAbstract": true,
      "extends": [
        "bpmn:Process"
      ],
      "properties": [
        {
          "name": "candidateStarterConfiguration",
          "isAttr": true,
          "type": "String"
        },
        {
          "name": "candidateStarterUsers",
          "isAttr": true,
          "type": "String"
        },
        {
          "name": "versionTag",
          "isAttr": true,
          "type": "String"
        },
        {
          "name": "historyTimeToLive",
          "isAttr": true,
          "type": "String"
        },
        {
          "name": "isStartableInTasklist",
          "isAttr": true,
          "type": "Boolean",
          "default": true
        },
        {
          "name": "process-is-executable",
          "isAttr": true,
          "type": "Boolean",
          "default": true
        }
      ]
    },
    {
      "name": "EscalationEventDefinition",
      "isAbstract": true,
      "extends": [
        "bpmn:EscalationEventDefinition"
      ],
      "properties": [
        {
          "name": "escalationCodeVariable",
          "isAttr": true,
          "type": "String"
        }
      ]
    },
    {
      "name": "FormalExpression",
      "isAbstract": true,
      "extends": [
        "bpmn:FormalExpression"
      ],
      "properties": [
        {
          "name": "resource",
          "isAttr": true,
          "type": "String"
        }
      ]
    },
    {
      "name": "Assignable",
      "extends": [ "bpmn:UserTask" ],
      "properties": [
        {
          "name": "assignee",
          "isAttr": true,
          "type": "String"
        },
        {
          "name": "candidateUsers",
          "isAttr": true,
          "type": "String"
        },
        {
          "name": "candidateGroups",
          "isAttr": true,
          "type": "String"
        },
        {
          "name": "dueDate",
          "isAttr": true,
          "type": "String"
        },
        {
          "name": "followUpDate",
          "isAttr": true,
          "type": "String"
        },
        {
          "name": "priority",
          "isAttr": true,
          "type": "String"
        }
      ]
    },
    {
      "name": "CallActivity",
      "extends": [ "bpmn:CallActivity" ],
      "properties": [
        {
          "name": "calledElementBinding",
          "isAttr": true,
          "type": "String",
          "default": "latest"
        },
        {
          "name": "calledElementVersion",
          "isAttr": true,
          "type": "String"
        },
        {
          "name": "calledElementVersionTag",
          "isAttr": true,
          "type": "String"
        },
        {
          "name": "calledElementTenantId",
          "isAttr": true,
          "type": "String"
        },
        {
          "name": "caseRef",
          "isAttr": true,
          "type": "String"
        },
        {
          "name": "caseBinding",
          "isAttr": true,
          "type": "String",
          "default": "latest"
        },
        {
          "name": "caseVersion",
          "isAttr": true,
          "type": "String"
        },
        {
          "name": "caseTenantId",
          "isAttr": true,
          "type": "String"
        },
        {
          "name": "variableMappingClass",
          "isAttr": true,
          "type": "String"
        },
        {
          "name": "variableMappingDelegateExpression",
          "isAttr": true,
          "type": "String"
        }
      ]
    },
    {
      "name": "ServiceTaskLike",
      "extends": [
        "bpmn:ServiceTask",
        "bpmn:BusinessRuleTask",
        "bpmn:SendTask",
        "bpmn:MessageEventDefinition"
      ],
      "properties": [
        {
          "name": "expression",
          "isAttr": true,
          "type": "String"
        },
        {
          "name": "class",
          "isAttr": true,
          "type": "String"
        },
        {
          "name": "delegateExpression",
          "isAttr": true,
          "type": "String"
        },
        {
          "name": "resultVariable",
          "isAttr": true,
          "type": "String"
        }
      ]
    },
    {
      "name": "DmnCapable",
      "extends": [
        "bpmn:BusinessRuleTask"
      ],
      "properties": [
        {
          "name": "decisionRef",
          "isAttr": true,
          "type": "String"
        },
        {
          "name": "decisionRefBinding",
          "isAttr": true,
          "type": "String",
          "default": "latest"
        },
        {
          "name": "decisionRefVersion",
          "isAttr": true,
          "type": "String"
        },
        {
          "name": "mapDecisionResult",
          "isAttr": true,
          "type": "String",
          "default": "resultList"
        },
        {
          "name": "decisionRefTenantId",
          "isAttr": true,
          "type": "String"
        }
      ]
    },
    {
      "name": "ExternalCapable",
      "extends": [
        "activiti:ServiceTaskLike"
      ],
      "properties": [
        {
          "name": "type",
          "isAttr": true,
          "type": "String"
        },
        {
          "name": "topic",
          "isAttr": true,
          "type": "String"
        }
      ]
    },
    {
      "name": "TaskPriorized",
      "extends": [
        "bpmn:Process",
        "activiti:ExternalCapable"
      ],
      "properties": [
        {
          "name": "taskPriority",
          "isAttr": true,
          "type": "String"
        }
      ]
    },
    {
      "name": "Properties",
      "superClass": [
        "Element"
      ],
      "meta": {
        "allowedIn": [ "*" ]
      },
      "properties": [
        {
          "name": "values",
          "type": "Property",
          "isMany": true
        }
      ]
    },
    {
      "name": "Property",
      "superClass": [
        "Element"
      ],
      "properties": [
        {
          "name": "id",
          "type": "String",
          "isAttr": true
        },
        {
          "name": "name",
          "type": "String",
          "isAttr": true
        },
        {
          "name": "value",
          "type": "String",
          "isAttr": true
        }
      ]
    },
    {
      "name": "Connector",
      "superClass": [
        "Element"
      ],
      "meta": {
        "allowedIn": [
          "activiti:ServiceTaskLike"
        ]
      },
      "properties": [
        {
          "name": "inputOutput",
          "type": "InputOutput"
        },
        {
          "name": "connectorId",
          "type": "String"
        }
      ]
    },
    {
      "name": "InputOutput",
      "superClass": [
        "Element"
      ],
      "meta": {
        "allowedIn": [
          "bpmn:FlowNode",
          "activiti:Connector"
        ]
      },
      "properties": [
        {
          "name": "inputOutput",
          "type": "InputOutput"
        },
        {
          "name": "connectorId",
          "type": "String"
        },
        {
          "name": "inputParameters",
          "isMany": true,
          "type": "InputParameter"
        },
        {
          "name": "outputParameters",
          "isMany": true,
          "type": "OutputParameter"
        }
      ]
    },
    {
      "name": "InputOutputParameter",
      "properties": [
        {
          "name": "name",
          "isAttr": true,
          "type": "String"
        },
        {
          "name": "value",
          "isBody": true,
          "type": "String"
        },
        {
          "name": "definition",
          "type": "InputOutputParameterDefinition"
        }
      ]
    },
    {
      "name": "InputOutputParameterDefinition",
      "isAbstract": true
    },
    {
      "name": "List",
      "superClass": [ "InputOutputParameterDefinition" ],
      "properties": [
        {
          "name": "items",
          "isMany": true,
          "type": "InputOutputParameterDefinition"
        }
      ]
    },
    {
      "name": "Map",
      "superClass": [ "InputOutputParameterDefinition" ],
      "properties": [
        {
          "name": "entries",
          "isMany": true,
          "type": "Entry"
        }
      ]
    },
    {
      "name": "Entry",
      "properties": [
        {
          "name": "key",
          "isAttr": true,
          "type": "String"
        },
        {
          "name": "value",
          "isBody": true,
          "type": "String"
        },
        {
          "name": "definition",
          "type": "InputOutputParameterDefinition"
        }
      ]
    },
    {
      "name": "Value",
      "superClass": [
        "InputOutputParameterDefinition"
      ],
      "properties": [
        {
          "name": "id",
          "isAttr": true,
          "type": "String"
        },
        {
          "name": "name",
          "isAttr": true,
          "type": "String"
        },
        {
          "name": "value",
          "isBody": true,
          "type": "String"
        }
      ]
    },
    {
      "name": "Script",
      "superClass": [ "InputOutputParameterDefinition" ],
      "properties": [
        {
          "name": "scriptFormat",
          "isAttr": true,
          "type": "String"
        },
        {
          "name": "resource",
          "isAttr": true,
          "type": "String"
        },
        {
          "name": "value",
          "isBody": true,
          "type": "String"
        }
      ]
    },
    {
      "name": "Field",
      "superClass": [ "Element" ],
      "meta": {
        "allowedIn": [
          "activiti:ServiceTaskLike",
          "activiti:ExecutionListener",
          "activiti:TaskListener"
        ]
      },
      "properties": [
        {
          "name": "name",
          "isAttr": true,
          "type": "String"
        },
        {
          "name": "expression",
          "type": "String"
        },
        {
          "name": "stringValue",
          "isAttr": true,
          "type": "String"
        },
        {
          "name": "string",
          "type": "String"
        }
      ]
    },
    {
      "name": "InputParameter",
      "superClass": [ "InputOutputParameter" ]
    },
    {
      "name": "OutputParameter",
      "superClass": [ "InputOutputParameter" ]
    },
    {
      "name": "Collectable",
      "isAbstract": true,
      "extends": [ "bpmn:MultiInstanceLoopCharacteristics" ],
      "superClass": [ "activiti:AsyncCapable" ],
      "properties": [
        {
          "name": "collection",
          "isAttr": true,
          "type": "String"
        },
        {
          "name": "elementVariable",
          "isAttr": true,
          "type": "String"
        }
      ]
    },
    {
      "name": "FailedJobRetryTimeCycle",
      "superClass": [ "Element" ],
      "meta": {
        "allowedIn": [
          "activiti:AsyncCapable",
          "bpmn:MultiInstanceLoopCharacteristics"
        ]
      },
      "properties": [
        {
          "name": "body",
          "isBody": true,
          "type": "String"
        }
      ]
    },
    {
      "name": "ExecutionListener",
      "superClass": [ "Element" ],
      "meta": {
        "allowedIn": [
          "bpmn:Task",
          "bpmn:ServiceTask",
          "bpmn:UserTask",
          "bpmn:BusinessRuleTask",
          "bpmn:ScriptTask",
          "bpmn:ReceiveTask",
          "bpmn:ManualTask",
          "bpmn:ExclusiveGateway",
          "bpmn:SequenceFlow",
          "bpmn:ParallelGateway",
          "bpmn:InclusiveGateway",
          "bpmn:EventBasedGateway",
          "bpmn:StartEvent",
          "bpmn:IntermediateCatchEvent",
          "bpmn:IntermediateThrowEvent",
          "bpmn:EndEvent",
          "bpmn:BoundaryEvent",
          "bpmn:CallActivity",
          "bpmn:SubProcess",
          "bpmn:Process"
        ]
      },
      "properties": [
        {
          "name": "expression",
          "isAttr": true,
          "type": "String"
        },
        {
          "name": "class",
          "isAttr": true,
          "type": "String"
        },
        {
          "name": "delegateExpression",
          "isAttr": true,
          "type": "String"
        },
        {
          "name": "event",
          "isAttr": true,
          "type": "String"
        },
        {
          "name": "script",
          "type": "Script"
        },
        {
          "name": "fields",
          "type": "Field",
          "isMany": true
        }
      ]
    },
    {
      "name": "TaskListener",
      "superClass": [ "Element" ],
      "meta": {
        "allowedIn": [
          "bpmn:UserTask"
        ]
      },
      "properties": [
        {
          "name": "expression",
          "isAttr": true,
          "type": "String"
        },
        {
          "name": "class",
          "isAttr": true,
          "type": "String"
        },
        {
          "name": "delegateExpression",
          "isAttr": true,
          "type": "String"
        },
        {
          "name": "event",
          "isAttr": true,
          "type": "String"
        },
        {
          "name": "script",
          "type": "Script"
        },
        {
          "name": "fields",
          "type": "Field",
          "isMany": true
        },
        {
          "name": "id",
          "type": "String",
          "isAttr": true
        },
        {
          "name": "eventDefinitions",
          "type": "bpmn:TimerEventDefinition",
          "isMany": true
        }
      ]
    },
    {
      "name": "FormProperty",
      "superClass": [ "Element" ],
      "meta": {
        "allowedIn": [
          "bpmn:StartEvent",
          "bpmn:UserTask"
        ]
      },
      "properties": [
        {
          "name": "id",
          "type": "String",
          "isAttr": true
        },
        {
          "name": "name",
          "type": "String",
          "isAttr": true
        },
        {
          "name": "type",
          "type": "String",
          "isAttr": true
        },
        {
          "name": "required",
          "type": "String",
          "isAttr": true
        },
        {
          "name": "readable",
          "type": "String",
          "isAttr": true
        },
        {
          "name": "writable",
          "type": "String",
          "isAttr": true
        },
        {
          "name": "variable",
          "type": "String",
          "isAttr": true
        },
        {
          "name": "expression",
          "type": "String",
          "isAttr": true
        },
        {
          "name": "datePattern",
          "type": "String",
          "isAttr": true
        },
        {
          "name": "default",
          "type": "String",
          "isAttr": true
        },
        {
          "name": "values",
          "type": "Value",
          "isMany": true
        }
      ]
    },
    {
      "name": "FormData",
      "superClass": [ "Element" ],
      "meta": {
        "allowedIn": [
          "bpmn:StartEvent",
          "bpmn:UserTask"
        ]
      },
      "properties": [
        {
          "name": "fields",
          "type": "FormField",
          "isMany": true
        },
        {
          "name": "businessKey",
          "type": "String",
          "isAttr": true
        }
      ]
    },
    {
      "name": "FormField",
      "superClass": [ "Element" ],
      "properties": [
        {
          "name": "id",
          "type": "String",
          "isAttr": true
        },
        {
          "name": "label",
          "type": "String",
          "isAttr": true
        },
        {
          "name": "type",
          "type": "String",
          "isAttr": true
        },
        {
          "name": "datePattern",
          "type": "String",
          "isAttr": true
        },
        {
          "name": "defaultValue",
          "type": "String",
          "isAttr": true
        },
        {
          "name": "properties",
          "type": "Properties"
        },
        {
          "name": "validation",
          "type": "Validation"
        },
        {
          "name": "values",
          "type": "Value",
          "isMany": true
        }
      ]
    },
    {
      "name": "Validation",
      "superClass": [ "Element" ],
      "properties": [
        {
          "name": "constraints",
          "type": "Constraint",
          "isMany": true
        }
      ]
    },
    {
      "name": "Constraint",
      "superClass": [ "Element" ],
      "properties": [
        {
          "name": "name",
          "type": "String",
          "isAttr": true
        },
        {
          "name": "config",
          "type": "String",
          "isAttr": true
        }
      ]
    },
    {
      "name": "ConditionalEventDefinition",
      "isAbstract": true,
      "extends": [
        "bpmn:ConditionalEventDefinition"
      ],
      "properties": [
        {
          "name": "variableName",
          "isAttr": true,
          "type": "String"
        },
        {
          "name": "variableEvent",
          "isAttr": true,
          "type": "String"
        }
      ]
    }
  ],
  "emumerations": [ ]
}
ruoyi-bpmnjs/resources/customControls/CustomContextPad.js
New file
@@ -0,0 +1,76 @@
export default class CustomContextPad {
  constructor(config, contextPad, create, elementFactory, injector, translate) {
    this.create = create;
    this.elementFactory = elementFactory;
    this.translate = translate;
    //自动摆放位置
    if (config.autoPlace !== false) {
      this.autoPlace = injector.get('autoPlace', false);
    }
    //注册工具
    contextPad.registerProvider(this);
  }
  getContextPadEntries(element) {
    const {
      autoPlace,
      create,
      elementFactory,
      translate
    } = this;
    function appendUserTask(event, element) {
      if (autoPlace) {
        const shape = elementFactory.createShape({ type: 'bpmn:UserTask' });
        autoPlace.append(element, shape);
      } else {
        appendUserTaskStart(event, element);
      }
    }
    function appendUserTaskStart(event) {
          const shape = elementFactory.createShape({ type: 'bpmn:UserTask' });
          create.start(event, shape, element);
    }
    function appendCallActivityStart(event) {
      const shape = elementFactory.createShape({ type: 'bpmn:CallActivity' });
      create.start(event, shape, element);
    }
    function appendCallActivity(event, element) {
        if (autoPlace) {
            const shape = elementFactory.createShape({ type: 'bpmn:CallActivity' });
            autoPlace.append(element, shape);
        } else {
            appendCallActivityStart(event, element);
        }
    }
    return {
      'append.user-task': {
        group: 'model',
        className: 'bpmn-icon-user-task',
        title: translate('Append ServiceTask'),
        action: {
          click: appendUserTask,
          dragstart: appendUserTaskStart
        }
      },
      'append.call-activity':{
          group: 'model',
          className: 'bpmn-icon-call-activity',
          title: translate('Append CallActivity'),
          action: {
              click: appendCallActivity,
              dragstart: appendCallActivityStart
          }
      }
    };
  }
}
CustomContextPad.$inject = [
  'config',
  'contextPad',
  'create',
  'elementFactory',
  'injector',
  'translate'
];
ruoyi-bpmnjs/resources/customControls/CustomPalette.js
New file
@@ -0,0 +1,54 @@
export default class CustomPalette {
  constructor(create, elementFactory, palette, translate) {
    this.create = create;
    this.elementFactory = elementFactory;
    this.translate = translate;
    palette.registerProvider(this);
  }
  getPaletteEntries(element) {
    const {
      create,
      elementFactory,
      translate
    } = this;
    function createServiceTask(event) {
      const shape = elementFactory.createShape({ type: 'bpmn:UserTask' });
      create.start(event, shape);
    }
      function createCallActivity(event) {
          const shape = elementFactory.createShape({ type: 'bpmn:CallActivity' });
          create.start(event, shape);
      }
    return {
      'create.user-task': {
        group: 'activity',
        className: 'bpmn-icon-user-task',
        title: translate('Create UserTask'),
        action: {
          dragstart: createServiceTask,
          click: createServiceTask
        }
      },
        'create.call-activity': {
            group: 'activity',
            className: 'bpmn-icon-call-activity',
            title: translate('Create CallActivity'),
            action: {
                dragstart: createCallActivity,
                click: createCallActivity
            }
        }
    }
  }
}
CustomPalette.$inject = [
  'create',
  'elementFactory',
  'palette',
  'translate'
];
ruoyi-bpmnjs/resources/customControls/index.js
New file
@@ -0,0 +1,8 @@
import CustomContextPad from './CustomContextPad';
import CustomPalette from './CustomPalette';
export default {
  __init__: [ 'customContextPad', 'customPalette' ],
  customContextPad: [ 'type', CustomContextPad ],
  customPalette: [ 'type', CustomPalette ]
};
ruoyi-bpmnjs/resources/customTranslate/customTranslate.js
New file
@@ -0,0 +1,12 @@
import translations from './translationsGerman';
export default function customTranslate(template, replacements) {
  replacements = replacements || {};
  template = translations[template] || template;
  return template.replace(/{([^}]+)}/g, function(_, key) {
     var str = replacements[key];
      if(translations[replacements[key]] != null && translations [replacements[key]] != 'undefined'){
          str = translations[replacements[key]];
      }
    return  str || '{' + key + '}';
  });
}
ruoyi-bpmnjs/resources/customTranslate/translationsGerman.js
New file
@@ -0,0 +1,239 @@
export default {
    // Labels
    'Activate the global connect tool' : '激活全局连接工具',
    'Append {type}': '追加 {type}',
    'Append EndEvent': '追加 结束事件 ',
    'Append Task':'追加 任务',
    'Append Gateway':'追加 网关',
    'Append Intermediate/Boundary Event':'追加 中间/边界 事件',
    'Add Lane above': '在上面添加道',
    'Divide into two Lanes': '分割成两个道',
    'Divide into three Lanes': '分割成三个道',
    'Add Lane below': '在下面添加道',
    'Append compensation activity': '追加补偿活动',
    'Change type': '修改类型',
    'Connect using Association': '使用关联连接',
    'Connect using Sequence/MessageFlow or Association': '使用顺序/消息流或者关联连接',
    'Connect using DataInputAssociation': '使用数据输入关联连接',
    'Remove': '移除',
    'Activate the hand tool': '激活抓手工具',
    'Activate the lasso tool': '激活套索工具',
    'Activate the create/remove space tool': '激活创建/删除空间工具',
    'Create expanded SubProcess': '创建扩展子过程',
    'Create IntermediateThrowEvent/BoundaryEvent' : '创建中间抛出事件/边界事件',
    'Create Pool/Participant': '创建池/参与者',
    'Parallel Multi Instance': '并行多重事件',
    'Sequential Multi Instance': '时序多重事件',
    'DataObjectReference':'数据对象参考',
    'DataStoreReference':'数据存储参考',
    'Loop': '循环',
    'Ad-hoc': '即席',
    'Create {type}': '创建 {type}',
    'Create Task':'创建任务',
    'Create StartEvent':'创建开始事件',
    'Create EndEvent':'创建结束事件',
    'Create Group':'创建组',
    'Task': '任务',
    'Send Task': '发送任务',
    'Receive Task': '接收任务',
    'User Task': '用户任务',
    'Manual Task': '手工任务',
    'Business Rule Task': '业务规则任务',
    'Service Task': '服务任务',
    'Script Task': '脚本任务',
    'Call Activity': '调用活动',
    'Sub Process (collapsed)': '子流程(折叠的)',
    'Sub Process (expanded)': '子流程(展开的)',
    'Start Event': '开始事件',
    'StartEvent': '开始事件',
    'Intermediate Throw Event': '中间事件',
    'End Event': '结束事件',
    'EndEvent': '结束事件',
    'Create Gateway': '创建网关',
    'GateWay':'网关',
    'Create Intermediate/Boundary Event': '创建中间/边界事件',
    'Message Start Event': '消息开始事件',
    'Timer Start Event': '定时开始事件',
    'Conditional Start Event': '条件开始事件',
    'Signal Start Event': '信号开始事件',
    'Error Start Event': '错误开始事件',
    'Escalation Start Event': '升级开始事件',
    'Compensation Start Event': '补偿开始事件',
    'Message Start Event (non-interrupting)': '消息开始事件(非中断)',
    'Timer Start Event (non-interrupting)': '定时开始事件(非中断)',
    'Conditional Start Event (non-interrupting)': '条件开始事件(非中断)',
    'Signal Start Event (non-interrupting)': '信号开始事件(非中断)',
    'Escalation Start Event (non-interrupting)': '升级开始事件(非中断)',
    'Message Intermediate Catch Event': '消息中间捕获事件',
    'Message Intermediate Throw Event': '消息中间抛出事件',
    'Timer Intermediate Catch Event': '定时中间捕获事件',
    'Escalation Intermediate Throw Event': '升级中间抛出事件',
    'Conditional Intermediate Catch Event': '条件中间捕获事件',
    'Link Intermediate Catch Event': '链接中间捕获事件',
    'Link Intermediate Throw Event': '链接中间抛出事件',
    'Compensation Intermediate Throw Event': '补偿中间抛出事件',
    'Signal Intermediate Catch Event': '信号中间捕获事件',
    'Signal Intermediate Throw Event': '信号中间抛出事件',
    'Message End Event': '消息结束事件',
    'Escalation End Event': '定时结束事件',
    'Error End Event': '错误结束事件',
    'Cancel End Event': '取消结束事件',
    'Compensation End Event': '补偿结束事件',
    'Signal End Event': '信号结束事件',
    'Terminate End Event': '终止结束事件',
    'Message Boundary Event': '消息边界事件',
    'Message Boundary Event (non-interrupting)': '消息边界事件(非中断)',
    'Timer Boundary Event': '定时边界事件',
    'Timer Boundary Event (non-interrupting)': '定时边界事件(非中断)',
    'Escalation Boundary Event': '升级边界事件',
    'Escalation Boundary Event (non-interrupting)': '升级边界事件(非中断)',
    'Conditional Boundary Event': '条件边界事件',
    'Conditional Boundary Event (non-interrupting)': '条件边界事件(非中断)',
    'Error Boundary Event': '错误边界事件',
    'Cancel Boundary Event': '取消边界事件',
    'Signal Boundary Event': '信号边界事件',
    'Signal Boundary Event (non-interrupting)': '信号边界事件(非中断)',
    'Compensation Boundary Event': '补偿边界事件',
    'Exclusive Gateway': '互斥网关',
    'Parallel Gateway': '并行网关',
    'Inclusive Gateway': '相容网关',
    'Complex Gateway': '复杂网关',
    'Event based Gateway': '事件网关',
    'Transaction': '转运',
    'Sub Process': '子流程',
    'Event Sub Process': '事件子流程',
    'Collapsed Pool': '折叠池',
    'Expanded Pool': '展开池',
    // Errors
    'no parent for {element} in {parent}': '在{parent}里,{element}没有父类',
    'no shape type specified': '没有指定的形状类型',
    'flow elements must be children of pools/participants': '流元素必须是池/参与者的子类',
    'out of bounds release': 'out of bounds release',
    'more than {count} child lanes': '子道大于{count} ',
    'element required': '元素不能为空',
    'diagram not part of bpmn:Definitions': '流程图不符合bpmn规范',
    'no diagram to display': '没有可展示的流程图',
    'no process or collaboration to display': '没有可展示的流程/协作',
    'element {element} referenced by {referenced}#{property} not yet drawn': '由{referenced}#{property}引用的{element}元素仍未绘制',
    'already rendered {element}': '{element} 已被渲染',
    'failed to import {element}': '导入{element}失败',
    //属性面板的参数
    'Id':'编号',
    'Name':'名称',
    'General':'常规',
    'Details':'详情',
    'Message Name':'消息名称',
    'Message':'消息',
    'Initiator':'创建者',
    'Asynchronous Continuations':'持续异步',
    'Asynchronous Before':'异步前',
    'Asynchronous After':'异步后',
    'Job Configuration':'工作配置',
    'Exclusive':'排除',
    'Job Priority':'工作优先级',
    'Retry Time Cycle':'重试时间周期',
    'Documentation':'文档',
    'Element Documentation':'元素文档',
    'History Configuration':'历史配置',
    'History Time To Live':'历史的生存时间',
    'Forms':'表单',
    'Form Key':'表单key',
    'Form Fields':'表单字段',
    'Business Key':'业务key',
    'Form Field':'表单字段',
    'ID':'编号',
    'Type':'类型',
    'Label':'名称',
    'Default Value':'默认值',
    'Validation':'校验',
    'Add Constraint':'添加约束',
    'Config':'配置',
    'Properties':'属性',
    'Add Property':'添加属性',
    'Value':'值',
    'Add':'添加',
    'Values':'值',
    'Add Value':'添加值',
    'Listeners':'监听器',
    'Execution Listener':'执行监听',
    'Event Type':'事件类型',
    'Listener Type':'监听器类型',
    'Java Class':'Java类',
    'Expression':'表达式',
    'Must provide a value':'必须提供一个值',
    'Delegate Expression':'代理表达式',
    'Script':'脚本',
    'Script Format':'脚本格式',
    'Script Type':'脚本类型',
    'Inline Script':'内联脚本',
    'External Script':'外部脚本',
    'Resource':'资源',
    'Field Injection':'字段注入',
    'Extensions':'扩展',
    'Input/Output':'输入/输出',
    'Input Parameters':'输入参数',
    'Output Parameters':'输出参数',
    'Parameters':'参数',
    'Output Parameter':'输出参数',
    'Timer Definition Type':'定时器定义类型',
    'Timer Definition':'定时器定义',
    'Date':'日期',
    'Duration':'持续',
    'Cycle':'循环',
    'Signal':'信号',
    'Signal Name':'信号名称',
    'Escalation':'升级',
    'Error':'错误',
    'Link Name':'链接名称',
    'Condition':'条件名称',
    'Variable Name':'变量名称',
    'Variable Event':'变量事件',
    'Specify more than one variable change event as a comma separated list.':'多个变量事件以逗号隔开',
    'Wait for Completion':'等待完成',
    'Activity Ref':'活动参考',
    'Version Tag':'版本标签',
    'Executable':'可执行文件',
    'External Task Configuration':'扩展任务配置',
    'Task Priority':'任务优先级',
    'External':'外部',
    'Connector':'连接器',
    'Must configure Connector':'必须配置连接器',
    'Connector Id':'连接器编号',
    'Implementation':'实现方式',
    'Field Injections':'字段注入',
    'Fields':'字段',
    'Result Variable':'结果变量',
    'Topic':'主题',
    'Configure Connector':'配置连接器',
    'Input Parameter':'输入参数',
    'Assignee':'代理人',
    'Candidate Users':'候选用户',
    'Candidate Groups':'候选组',
    'Due Date':'到期时间',
    'Follow Up Date':'跟踪日期',
    'Priority':'优先级',
    'The follow up date as an EL expression (e.g. ${someDate} or an ISO date (e.g. 2015-06-26T09:54:00)':'跟踪日期必须符合EL表达式,如: ${someDate} ,或者一个ISO标准日期,如:2015-06-26T09:54:00',
    'The due date as an EL expression (e.g. ${someDate} or an ISO date (e.g. 2015-06-26T09:54:00)':'跟踪日期必须符合EL表达式,如: ${someDate} ,或者一个ISO标准日期,如:2015-06-26T09:54:00',
    'Variables':'变量',
    'Candidate Starter Configuration':'候选开始配置',
    'Task Listener':'任务监听器',
    'Candidate Starter Groups':'候选开始组',
    'Candidate Starter Users':'候选开始用户',
    'Tasklist Configuration':'任务列表配置',
    'Startable':'启动',
    'Specify more than one group as a comma separated list.':'指定多个组,用逗号分隔',
    'Specify more than one user as a comma separated list.':'指定多个用户,用逗号分隔',
    'This maps to the process definition key.':'这会映射为流程定义的键',
    'CallActivity Type':'调用活动类型',
    'Condition Type':'条件类型',
    'Create UserTask':'创建用户任务',
    'Create CallActivity':'创建调用活动',
    'Called Element':'调用元素',
    'Create DataObjectReference':'创建数据对象引用',
    'Create DataStoreReference':'创建数据存储引用',
    'Multi Instance':'多实例',
    'Loop Cardinality':'实例数量',
    'Collection':'任务参与人列表',
    'Element Variable':'元素变量',
    'Completion Condition':'完成条件'
};
ruoyi-bpmnjs/resources/newDiagram.bpmn
New file
@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>
<bpmn2:definitions xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:bpmn2="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" xsi:schemaLocation="http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd" id="sample-diagram" targetNamespace="http://activiti.org/bpmn">
  <bpmn2:process id="Process_1" isExecutable="true">
    <bpmn2:startEvent id="StartEvent_1"/>
  </bpmn2:process>
  <bpmndi:BPMNDiagram id="BPMNDiagram_1">
    <bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="Process_1">
      <bpmndi:BPMNShape id="_BPMNShape_StartEvent_2" bpmnElement="StartEvent_1">
        <dc:Bounds height="36.0" width="36.0" x="412.0" y="240.0"/>
      </bpmndi:BPMNShape>
    </bpmndi:BPMNPlane>
  </bpmndi:BPMNDiagram>
</bpmn2:definitions>
ruoyi-bpmnjs/resources/properties-panel/PropertiesActivator.js
New file
@@ -0,0 +1,67 @@
'use strict';
var DEFAULT_PRIORITY = 1000;
/**
 * A component that decides upon the visibility / editable
 * state of properties in the properties panel.
 *
 * Implementors must subclass this component and override
 * {@link PropertiesActivator#isEntryVisible} and
 * {@link PropertiesActivator#isPropertyEditable} to provide
 * custom behavior.
 *
 * @class
 * @constructor
 *
 * @param {EventBus} eventBus
 * @param {Number} [priority] at which priority to hook into the activation
 */
function PropertiesActivator(eventBus, priority) {
  var self = this;
  priority = priority || DEFAULT_PRIORITY;
  eventBus.on('propertiesPanel.isEntryVisible', priority, function(e) {
    return self.isEntryVisible(e.entry, e.element);
  });
  eventBus.on('propertiesPanel.isPropertyEditable', priority, function(e) {
    return self.isPropertyEditable(e.entry, e.propertyName, e.element);
  });
}
PropertiesActivator.$inject = [ 'eventBus' ];
module.exports = PropertiesActivator;
/**
 * Should the given entry be visible for the specified element.
 *
 * @method  PropertiesActivator#isEntryVisible
 *
 * @param {EntryDescriptor} entry
 * @param {ModdleElement} element
 *
 * @returns {Boolean}
 */
PropertiesActivator.prototype.isEntryVisible = function(entry, element) {
  return true;
};
/**
 * Should the given property be editable for the specified element
 *
 * @method  PropertiesActivator#isPropertyEditable
 *
 * @param {EntryDescriptor} entry
 * @param {String} propertyName
 * @param {ModdleElement} element
 *
 * @returns {Boolean}
 */
PropertiesActivator.prototype.isPropertyEditable = function(entry, propertyName, element) {
  return true;
};
ruoyi-bpmnjs/resources/properties-panel/PropertiesPanel.js
New file
@@ -0,0 +1,1269 @@
'use strict';
var escapeHTML = require('./Utils').escapeHTML;
var domify = require('min-dom').domify,
    domQuery = require('min-dom').query,
    domQueryAll = require('min-dom').queryAll,
    domRemove = require('min-dom').remove,
    domClasses = require('min-dom').classes,
    domClosest = require('min-dom').closest,
    domAttr = require('min-dom').attr,
    domDelegate = require('min-dom').delegate,
    domMatches = require('min-dom').matches;
var forEach = require('lodash/forEach'),
    filter = require('lodash/filter'),
    get = require('lodash/get'),
    keys = require('lodash/keys'),
    isEmpty = require('lodash/isEmpty'),
    isArray = require('lodash/isArray'),
    xor = require('lodash/xor'),
    debounce = require('lodash/debounce');
var updateSelection = require('selection-update');
var scrollTabs = require('scroll-tabs').default;
var getBusinessObject = require('bpmn-js/lib/util/ModelUtil').getBusinessObject;
var HIDE_CLASS = 'bpp-hidden';
var DEBOUNCE_DELAY = 300;
function isToggle(node) {
  return node.type === 'checkbox' || node.type === 'radio';
}
function isSelect(node) {
  return node.type === 'select-one';
}
function isContentEditable(node) {
  return domAttr(node, 'contenteditable');
}
function getPropertyPlaceholders(node) {
  var selector = 'input[name], textarea[name], [data-value], [contenteditable]';
  var placeholders = domQueryAll(selector, node);
  if ((!placeholders || !placeholders.length) && domMatches(node, selector)) {
    placeholders = [ node ];
  }
  return placeholders;
}
/**
 * Return all active form controls.
 * This excludes the invisible controls unless all is true
 *
 * @param {Element} node
 * @param {Boolean} [all=false]
 */
function getFormControls(node, all) {
  var controls = domQueryAll('input[name], textarea[name], select[name], [contenteditable]', node);
  if (!controls || !controls.length) {
    controls = domMatches(node, 'option') ? [ node ] : controls;
  }
  if (!all) {
    controls = filter(controls, function(node) {
      return !domClosest(node, '.' + HIDE_CLASS);
    });
  }
  return controls;
}
function getFormControlValuesInScope(entryNode) {
  var values = {};
  var controlNodes = getFormControls(entryNode);
  forEach(controlNodes, function(controlNode) {
    var value = controlNode.value;
    var name = domAttr(controlNode, 'name') || domAttr(controlNode, 'data-name');
    // take toggle state into account for radio / checkboxes
    if (isToggle(controlNode)) {
      if (controlNode.checked) {
        if (!domAttr(controlNode, 'value')) {
          value = true;
        } else {
          value = controlNode.value;
        }
      } else {
        value = null;
      }
    } else
    if (isContentEditable(controlNode)) {
      value = controlNode.innerText;
    }
    if (value !== null) {
      // return the actual value
      // handle serialization in entry provider
      // (ie. if empty string should be serialized or not)
      values[name] = value;
    }
  });
  return values;
}
/**
 * Extract input values from entry node
 *
 * @param  {DOMElement} entryNode
 * @returns {Object}
 */
function getFormControlValues(entryNode) {
  var values;
  var listContainer = domQuery('[data-list-entry-container]', entryNode);
  if (listContainer) {
    values = [];
    var listNodes = listContainer.children || [];
    forEach(listNodes, function(listNode) {
      values.push(getFormControlValuesInScope(listNode));
    });
  } else {
    values = getFormControlValuesInScope(entryNode);
  }
  return values;
}
/**
 * Return true if the given form extracted value equals
 * to an old cached version.
 *
 * @param {Object} value
 * @param {Object} oldValue
 * @return {Boolean}
 */
function valueEqual(value, oldValue) {
  if (value && !oldValue) {
    return false;
  }
  var allKeys = keys(value).concat(keys(oldValue));
  return allKeys.every(function(key) {
    return value[key] === oldValue[key];
  });
}
/**
 * Return true if the given form extracted value(s)
 * equal an old cached version.
 *
 * @param {Array<Object>|Object} values
 * @param {Array<Object>|Object} oldValues
 * @return {Boolean}
 */
function valuesEqual(values, oldValues) {
  if (isArray(values)) {
    if (values.length !== oldValues.length) {
      return false;
    }
    return values.every(function(v, idx) {
      return valueEqual(v, oldValues[idx]);
    });
  }
  return valueEqual(values, oldValues);
}
/**
 * Return a mapping of { id: entry } for all entries in the given groups in the given tabs.
 *
 * @param {Object} tabs
 * @return {Object}
 */
function extractEntries(tabs) {
  return keyBy(flattenDeep(map(flattenDeep(map(tabs, 'groups')), 'entries')), 'id');
}
/**
 * Return a mapping of { id: group } for all groups in the given tabs.
 *
 * @param {Object} tabs
 * @return {Object}
 */
function extractGroups(tabs) {
  return keyBy(flattenDeep(map(tabs, 'groups')), 'id');
}
/**
 * A properties panel implementation.
 *
 * To use it provide a `propertiesProvider` component that knows
 * about which properties to display.
 *
 * Properties edit state / visibility can be intercepted
 * via a custom {@link PropertiesActivator}.
 *
 * @class
 * @constructor
 *
 * @param {Object} config
 * @param {EventBus} eventBus
 * @param {Modeling} modeling
 * @param {PropertiesProvider} propertiesProvider
 * @param {Canvas} canvas
 * @param {CommandStack} commandStack
 */
function PropertiesPanel(config, eventBus, modeling, propertiesProvider, commandStack, canvas) {
  this._eventBus = eventBus;
  this._modeling = modeling;
  this._commandStack = commandStack;
  this._canvas = canvas;
  this._propertiesProvider = propertiesProvider;
  this._init(config);
}
PropertiesPanel.$inject = [
  'config.propertiesPanel',
  'eventBus',
  'modeling',
  'propertiesProvider',
  'commandStack',
  'canvas'
];
module.exports = PropertiesPanel;
PropertiesPanel.prototype._init = function(config) {
  var canvas = this._canvas,
      eventBus = this._eventBus;
  var self = this;
  /**
   * Select the root element once it is added to the canvas
   */
  eventBus.on('root.added', function(e) {
    var element = e.element;
    if (isImplicitRoot(element)) {
      return;
    }
    self.update(element);
  });
  eventBus.on('selection.changed', function(e) {
    var newElement = e.newSelection[0];
    var rootElement = canvas.getRootElement();
    if (isImplicitRoot(rootElement)) {
      return;
    }
    self.update(newElement);
  });
  // add / update tab-bar scrolling
  eventBus.on([
    'propertiesPanel.changed',
    'propertiesPanel.resized'
  ], function(event) {
    var tabBarNode = domQuery('.bpp-properties-tab-bar', self._container);
    if (!tabBarNode) {
      return;
    }
    var scroller = scrollTabs.get(tabBarNode);
    if (!scroller) {
      // we did not initialize yet, do that
      // now and make sure we select the active
      // tab on scroll update
      scroller = scrollTabs(tabBarNode, {
        selectors: {
          tabsContainer: '.bpp-properties-tabs-links',
          tab: '.bpp-properties-tabs-links li',
          ignore: '.bpp-hidden',
          active: '.bpp-active'
        }
      });
      scroller.on('scroll', function(newActiveNode, oldActiveNode, direction) {
        var linkNode = domQuery('[data-tab-target]', newActiveNode);
        var tabId = domAttr(linkNode, 'data-tab-target');
        self.activateTab(tabId);
      });
    }
    // react on tab changes and or tabContainer resize
    // and make sure the active tab is shown completely
    scroller.update();
  });
  eventBus.on('elements.changed', function(e) {
    var current = self._current;
    var element = current && current.element;
    if (element) {
      if (e.elements.indexOf(element) !== -1) {
        self.update(element);
      }
    }
  });
  eventBus.on('elementTemplates.changed', function() {
    var current = self._current;
    var element = current && current.element;
    if (element) {
      self.update(element);
    }
  });
  eventBus.on('diagram.destroy', function() {
    self.detach();
  });
  this._container = domify('<div class="bpp-properties-panel"></div>');
  this._bindListeners(this._container);
  if (config && config.parent) {
    this.attachTo(config.parent);
  }
};
PropertiesPanel.prototype.attachTo = function(parentNode) {
  if (!parentNode) {
    throw new Error('parentNode required');
  }
  // ensure we detach from the
  // previous, old parent
  this.detach();
  // unwrap jQuery if provided
  if (parentNode.get && parentNode.constructor.prototype.jquery) {
    parentNode = parentNode.get(0);
  }
  if (typeof parentNode === 'string') {
    parentNode = domQuery(parentNode);
  }
  var container = this._container;
  parentNode.appendChild(container);
  this._emit('attach');
};
PropertiesPanel.prototype.detach = function() {
  var container = this._container,
      parentNode = container.parentNode;
  if (!parentNode) {
    return;
  }
  this._emit('detach');
  parentNode.removeChild(container);
};
/**
 * Select the given tab within the properties panel.
 *
 * @param {Object|String} tab
 */
PropertiesPanel.prototype.activateTab = function(tab) {
  var tabId = typeof tab === 'string' ? tab : tab.id;
  var current = this._current;
  var panelNode = current.panel;
  var allTabNodes = domQueryAll('.bpp-properties-tab', panelNode),
      allTabLinkNodes = domQueryAll('.bpp-properties-tab-link', panelNode);
  forEach(allTabNodes, function(tabNode) {
    var currentTabId = domAttr(tabNode, 'data-tab');
    domClasses(tabNode).toggle('bpp-active', tabId === currentTabId);
  });
  forEach(allTabLinkNodes, function(tabLinkNode) {
    var tabLink = domQuery('[data-tab-target]', tabLinkNode),
        currentTabId = domAttr(tabLink, 'data-tab-target');
    domClasses(tabLinkNode).toggle('bpp-active', tabId === currentTabId);
  });
};
/**
 * Update the DOM representation of the properties panel
 */
PropertiesPanel.prototype.update = function(element) {
  var current = this._current;
  // no actual selection change
  var needsCreate = true;
  if (typeof element === 'undefined') {
    // use RootElement of BPMN diagram to generate properties panel if no element is selected
    element = this._canvas.getRootElement();
  }
  var newTabs = this._propertiesProvider.getTabs(element);
  if (current && current.element === element) {
    // see if we can reuse the existing panel
    needsCreate = this._entriesChanged(current, newTabs);
  }
  if (needsCreate) {
    if (current) {
      // get active tab from the existing panel before remove it
      var activeTabNode = domQuery('.bpp-properties-tab.bpp-active', current.panel);
      var activeTabId;
      if (activeTabNode) {
        activeTabId = domAttr(activeTabNode, 'data-tab');
      }
      // remove old panel
      domRemove(current.panel);
    }
    this._current = this._create(element, newTabs);
    // activate the saved active tab from the remove panel or the first tab
    (activeTabId) ? this.activateTab(activeTabId) : this.activateTab(this._current.tabs[0]);
  }
  if (this._current) {
    // make sure correct tab contents are visible
    this._updateActivation(this._current);
  }
  this._emit('changed');
};
/**
 * Returns true if one of two groups has different entries than the other.
 *
 * @param  {Object} current
 * @param  {Object} newTabs
 * @return {Boolean}
 */
PropertiesPanel.prototype._entriesChanged = function(current, newTabs) {
  var oldEntryIds = keys(current.entries),
      newEntryIds = keys(extractEntries(newTabs));
  return !isEmpty(xor(oldEntryIds, newEntryIds));
};
PropertiesPanel.prototype._emit = function(event) {
  this._eventBus.fire('propertiesPanel.' + event, { panel: this, current: this._current });
};
PropertiesPanel.prototype._bindListeners = function(container) {
  var self = this;
  // handles a change for a given event
  var handleChange = function handleChange(event) {
    // see if we handle a change inside a [data-entry] element.
    // if not, drop out
    var inputNode = event.delegateTarget,
        entryNode = domClosest(inputNode, '[data-entry]'),
        entryId, entry;
    // change from outside a [data-entry] element, simply ignore
    if (!entryNode) {
      return;
    }
    entryId = domAttr(entryNode, 'data-entry');
    entry = self.getEntry(entryId);
    var values = getFormControlValues(entryNode);
    if (event.type === 'change') {
      // - if the "data-on-change" attribute is present and a value is changed,
      //   then the associated action is performed.
      // - if the associated action returns "true" then an update to the business
      //   object is done
      // - if it does not return "true", then only the DOM content is updated
      var onChangeAction = domAttr(inputNode, 'data-on-change');
      if (onChangeAction) {
        var isEntryDirty = self.executeAction(entry, entryNode, onChangeAction, event);
        if (!isEntryDirty) {
          return self.update(self._current.element);
        }
      }
    }
    self.applyChanges(entry, values, entryNode);
    self.updateState(entry, entryNode);
  };
  // debounce update only elements that are target of key events,
  // i.e. INPUT and TEXTAREA. SELECTs will trigger an immediate update anyway.
  domDelegate.bind(container, 'input, textarea, [contenteditable]', 'input', debounce(handleChange, DEBOUNCE_DELAY));
  domDelegate.bind(container, 'input, textarea, select, [contenteditable]', 'change', handleChange);
  // handle key events
  domDelegate.bind(container, 'select', 'keydown', function(e) {
    // DEL
    if (e.keyCode === 46) {
      e.stopPropagation();
      e.preventDefault();
    }
  });
  domDelegate.bind(container, '[data-action]', 'click', function onClick(event) {
    // triggers on all inputs
    var inputNode = event.delegateTarget,
        entryNode = domClosest(inputNode, '[data-entry]');
    var actionId = domAttr(inputNode, 'data-action'),
        entryId = domAttr(entryNode, 'data-entry');
    var entry = self.getEntry(entryId);
    var isEntryDirty = self.executeAction(entry, entryNode, actionId, event);
    if (isEntryDirty) {
      var values = getFormControlValues(entryNode);
      self.applyChanges(entry, values, entryNode);
    }
    self.updateState(entry, entryNode);
  });
  function handleInput(event, element) {
    // triggers on all inputs
    var inputNode = event.delegateTarget;
    var entryNode = domClosest(inputNode, '[data-entry]');
    // only work on data entries
    if (!entryNode) {
      return;
    }
    var eventHandlerId = domAttr(inputNode, 'data-blur'),
        entryId = domAttr(entryNode, 'data-entry');
    var entry = self.getEntry(entryId);
    var isEntryDirty = self.executeAction(entry, entryNode, eventHandlerId, event);
    if (isEntryDirty) {
      var values = getFormControlValues(entryNode);
      self.applyChanges(entry, values, entryNode);
    }
    self.updateState(entry, entryNode);
  }
  domDelegate.bind(container, '[data-blur]', 'blur', handleInput, true);
  // make tab links interactive
  domDelegate.bind(container, '.bpp-properties-tabs-links [data-tab-target]', 'click', function(event) {
    event.preventDefault();
    var delegateTarget = event.delegateTarget;
    var tabId = domAttr(delegateTarget, 'data-tab-target');
    // activate tab on link click
    self.activateTab(tabId);
  });
};
PropertiesPanel.prototype.updateState = function(entry, entryNode) {
  this.updateShow(entry, entryNode);
  this.updateDisable(entry, entryNode);
};
/**
 * Update the visibility of the entry node in the DOM
 */
PropertiesPanel.prototype.updateShow = function(entry, node) {
  var current = this._current;
  if (!current) {
    return;
  }
  var showNodes = domQueryAll('[data-show]', node) || [];
  forEach(showNodes, function(showNode) {
    var expr = domAttr(showNode, 'data-show');
    var fn = get(entry, expr);
    if (fn) {
      var scope = domClosest(showNode, '[data-scope]') || node;
      var shouldShow = fn(current.element, node, showNode, scope) || false;
      if (shouldShow) {
        domClasses(showNode).remove(HIDE_CLASS);
      } else {
        domClasses(showNode).add(HIDE_CLASS);
      }
    }
  });
};
/**
 * Evaluates a given function. If it returns true, then the
 * node is marked as "disabled".
 */
PropertiesPanel.prototype.updateDisable = function(entry, node) {
  var current = this._current;
  if (!current) {
    return;
  }
  var nodes = domQueryAll('[data-disable]', node) || [];
  forEach(nodes, function(currentNode) {
    var expr = domAttr(currentNode, 'data-disable');
    var fn = get(entry, expr);
    if (fn) {
      var scope = domClosest(currentNode, '[data-scope]') || node;
      var shouldDisable = fn(current.element, node, currentNode, scope) || false;
      domAttr(currentNode, 'disabled', shouldDisable ? '' : null);
    }
  });
};
PropertiesPanel.prototype.executeAction = function(entry, entryNode, actionId, event) {
  var current = this._current;
  if (!current) {
    return;
  }
  var fn = get(entry, actionId);
  if (fn) {
    var scopeNode = domClosest(event.target, '[data-scope]') || entryNode;
    return fn.apply(entry, [ current.element, entryNode, event, scopeNode ]);
  }
};
/**
 * Apply changes to the business object by executing a command
 */
PropertiesPanel.prototype.applyChanges = function(entry, values, containerElement) {
  var element = this._current.element;
  // ensure we only update the model if we got dirty changes
  if (valuesEqual(values, entry.oldValues)) {
    return;
  }
  var command = entry.set(element, values, containerElement);
  var commandToExecute;
  if (isArray(command)) {
    if (command.length) {
      commandToExecute = {
        cmd: 'properties-panel.multi-command-executor',
        context: flattenDeep(command)
      };
    }
  } else {
    commandToExecute = command;
  }
  if (commandToExecute) {
    this._commandStack.execute(commandToExecute.cmd, commandToExecute.context || { element : element });
  } else {
    this.update(element);
  }
};
/**
 * apply validation errors in the DOM and show or remove an error message near the entry node.
 */
PropertiesPanel.prototype.applyValidationErrors = function(validationErrors, entryNode) {
  var valid = true;
  var controlNodes = getFormControls(entryNode, true);
  forEach(controlNodes, function(controlNode) {
    var name = domAttr(controlNode, 'name') || domAttr(controlNode, 'data-name');
    var error = validationErrors && validationErrors[name];
    var errorMessageNode = domQuery('.bpp-error-message', controlNode.parentNode);
    if (error) {
      valid = false;
      if (!errorMessageNode) {
        errorMessageNode = domify('<div></div>');
        domClasses(errorMessageNode).add('bpp-error-message');
        // insert errorMessageNode after controlNode
        controlNode.parentNode.insertBefore(errorMessageNode, controlNode.nextSibling);
      }
      errorMessageNode.textContent = error;
      domClasses(controlNode).add('invalid');
    } else {
      domClasses(controlNode).remove('invalid');
      if (errorMessageNode) {
        controlNode.parentNode.removeChild(errorMessageNode);
      }
    }
  });
  return valid;
};
/**
 * Check if the entry contains valid input
 */
PropertiesPanel.prototype.validate = function(entry, values, entryNode) {
  var self = this;
  var current = this._current;
  var valid = true;
  entryNode = entryNode || domQuery('[data-entry="' + entry.id + '"]', current.panel);
  if (values instanceof Array) {
    var listContainer = domQuery('[data-list-entry-container]', entryNode),
        listEntryNodes = listContainer.children || [];
    // create new elements
    for (var i = 0; i < values.length; i++) {
      var listValue = values[i];
      if (entry.validateListItem) {
        var validationErrors = entry.validateListItem(current.element, listValue, entryNode, i),
            listEntryNode = listEntryNodes[i];
        valid = self.applyValidationErrors(validationErrors, listEntryNode) && valid;
      }
    }
  } else {
    if (entry.validate) {
      this.validationErrors = entry.validate(current.element, values, entryNode);
      valid = self.applyValidationErrors(this.validationErrors, entryNode) && valid;
    }
  }
  return valid;
};
PropertiesPanel.prototype.getEntry = function(id) {
  return this._current && this._current.entries[id];
};
var flattenDeep = require('lodash/flattenDeep'),
    keyBy = require('lodash/keyBy'),
    map = require('lodash/map');
PropertiesPanel.prototype._create = function(element, tabs) {
  if (!element) {
    return null;
  }
  var containerNode = this._container;
  var panelNode = this._createPanel(element, tabs);
  containerNode.appendChild(panelNode);
  var entries = extractEntries(tabs);
  var groups = extractGroups(tabs);
  return {
    tabs: tabs,
    groups: groups,
    entries: entries,
    element: element,
    panel: panelNode
  };
};
/**
 * Update variable parts of the entry node on element changes.
 *
 * @param {djs.model.Base} element
 * @param {EntryDescriptor} entry
 * @param {Object} values
 * @param {HTMLElement} entryNode
 * @param {Number} idx
 */
PropertiesPanel.prototype._bindTemplate = function(element, entry, values, entryNode, idx) {
  var eventBus = this._eventBus;
  function isPropertyEditable(entry, propertyName) {
    return eventBus.fire('propertiesPanel.isPropertyEditable', {
      entry: entry,
      propertyName: propertyName,
      element: element
    });
  }
  var inputNodes = getPropertyPlaceholders(entryNode);
  forEach(inputNodes, function(node) {
    var name,
        newValue,
        editable;
    // we deal with an input element
    if ('value' in node || isContentEditable(node) === 'true') {
      name = domAttr(node, 'name') || domAttr(node, 'data-name');
      newValue = values[name];
      editable = isPropertyEditable(entry, name);
      if (editable && entry.editable) {
        editable = entry.editable(element, entryNode, node, name, newValue, idx);
      }
      domAttr(node, 'readonly', editable ? null : '');
      domAttr(node, 'disabled', editable ? null : '');
      // take full control over setting the value
      // and possibly updating the input in entry#setControlValue
      if (entry.setControlValue) {
        entry.setControlValue(element, entryNode, node, name, newValue, idx);
      } else if (isToggle(node)) {
        setToggleValue(node, newValue);
      } else if (isSelect(node)) {
        setSelectValue(node, newValue);
      } else {
        setInputValue(node, newValue);
      }
    }
    // we deal with some non-editable html element
    else {
      name = domAttr(node, 'data-value');
      newValue = values[name];
      if (entry.setControlValue) {
        entry.setControlValue(element, entryNode, node, name, newValue, idx);
      } else {
        setTextValue(node, newValue);
      }
    }
  });
};
// TODO(nikku): WTF freaking name? Change / clarify.
PropertiesPanel.prototype._updateActivation = function(current) {
  var self = this;
  var eventBus = this._eventBus;
  var element = current.element;
  function isEntryVisible(entry) {
    return eventBus.fire('propertiesPanel.isEntryVisible', {
      entry: entry,
      element: element
    });
  }
  function isGroupVisible(group, element, groupNode) {
    if (typeof group.enabled === 'function') {
      return group.enabled(element, groupNode);
    } else {
      return true;
    }
  }
  function isTabVisible(tab, element) {
    if (typeof tab.enabled === 'function') {
      return tab.enabled(element);
    } else {
      return true;
    }
  }
  function toggleVisible(node, visible) {
    domClasses(node).toggle(HIDE_CLASS, !visible);
  }
  // check whether the active tab is visible
  // if not: set the first tab as active tab
  function checkActiveTabVisibility(node, visible) {
    var isActive = domClasses(node).has('bpp-active');
    if (!visible && isActive) {
      self.activateTab(current.tabs[0]);
    }
  }
  function updateLabel(element, selector, text) {
    var labelNode = domQuery(selector, element);
    if (!labelNode) {
      return;
    }
    labelNode.textContent = text;
  }
  var panelNode = current.panel;
  forEach(current.tabs, function(tab) {
    var tabNode = domQuery('[data-tab=' + tab.id + ']', panelNode);
    var tabLinkNode = domQuery('[data-tab-target=' + tab.id + ']', panelNode).parentNode;
    var tabVisible = false;
    forEach(tab.groups, function(group) {
      var groupVisible = false;
      var groupNode = domQuery('[data-group=' + group.id + ']', tabNode);
      forEach(group.entries, function(entry) {
        var entryNode = domQuery('[data-entry="' + entry.id + '"]', groupNode);
        var entryVisible = isEntryVisible(entry);
        groupVisible = groupVisible || entryVisible;
        toggleVisible(entryNode, entryVisible);
        var values = 'get' in entry ? entry.get(element, entryNode) : {};
        if (values instanceof Array) {
          var listEntryContainer = domQuery('[data-list-entry-container]', entryNode);
          var existingElements = listEntryContainer.children || [];
          for (var i = 0; i < values.length; i++) {
            var listValue = values[i];
            var listItemNode = existingElements[i];
            if (!listItemNode) {
              listItemNode = domify(entry.createListEntryTemplate(listValue, i, listEntryContainer));
              listEntryContainer.appendChild(listItemNode);
            }
            domAttr(listItemNode, 'data-index', i);
            self._bindTemplate(element, entry, listValue, listItemNode, i);
          }
          var entriesToRemove = existingElements.length - values.length;
          for (var j = 0; j < entriesToRemove; j++) {
            // remove orphaned element
            listEntryContainer.removeChild(listEntryContainer.lastChild);
          }
        } else {
          self._bindTemplate(element, entry, values, entryNode);
        }
        // update conditionally visible elements
        self.updateState(entry, entryNode);
        self.validate(entry, values, entryNode);
        // remember initial state for later dirty checking
        entry.oldValues = getFormControlValues(entryNode);
      });
      if (typeof group.label === 'function') {
        updateLabel(groupNode, '.group-label', group.label(element, groupNode));
      }
      groupVisible = groupVisible && isGroupVisible(group, element, groupNode);
      tabVisible = tabVisible || groupVisible;
      toggleVisible(groupNode, groupVisible);
    });
    tabVisible = tabVisible && isTabVisible(tab, element);
    toggleVisible(tabNode, tabVisible);
    toggleVisible(tabLinkNode, tabVisible);
    checkActiveTabVisibility(tabNode, tabVisible);
  });
  // inject elements id into header
  updateLabel(panelNode, '[data-label-id]', getBusinessObject(element).id || '');
};
PropertiesPanel.prototype._createPanel = function(element, tabs) {
  var self = this;
  var panelNode = domify('<div class="bpp-properties"></div>'),
      headerNode = domify('<div class="bpp-properties-header">' +
        '<div class="label" data-label-id></div>' +
        '<div class="search">' +
          '<input type="search" placeholder="Search for property" />' +
          '<button><span>Search</span></button>' +
        '</div>' +
      '</div>'),
      tabBarNode = domify('<div class="bpp-properties-tab-bar"></div>'),
      tabLinksNode = domify('<ul class="bpp-properties-tabs-links"></ul>'),
      tabContainerNode = domify('<div class="bpp-properties-tabs-container"></div>');
  panelNode.appendChild(headerNode);
  forEach(tabs, function(tab, tabIndex) {
    if (!tab.id) {
      throw new Error('tab must have an id');
    }
    var tabNode = domify('<div class="bpp-properties-tab" data-tab="' + escapeHTML(tab.id) + '"></div>'),
        tabLinkNode = domify('<li class="bpp-properties-tab-link">' +
          '<a href data-tab-target="' + escapeHTML(tab.id) + '">' + escapeHTML(tab.label) + '</a>' +
        '</li>');
    var groups = tab.groups;
    forEach(groups, function(group) {
      if (!group.id) {
        throw new Error('group must have an id');
      }
      var groupNode = domify('<div class="bpp-properties-group" data-group="' + escapeHTML(group.id) + '">' +
          '<span class="group-toggle"></span>' +
          '<span class="group-label">' + escapeHTML(group.label) + '</span>' +
        '</div>');
      // TODO(nre): use event delegation to handle that...
      groupNode.querySelector('.group-toggle').addEventListener('click', function(evt) {
        domClasses(groupNode).toggle('group-closed');
        evt.preventDefault();
        evt.stopPropagation();
      });
      groupNode.addEventListener('click', function(evt) {
        if (!evt.defaultPrevented && domClasses(groupNode).has('group-closed')) {
          domClasses(groupNode).remove('group-closed');
        }
      });
      forEach(group.entries, function(entry) {
        if (!entry.id) {
          throw new Error('entry must have an id');
        }
        var html = entry.html;
        if (typeof html === 'string') {
          html = domify(html);
        }
        // unwrap jquery
        if (html.get && html.constructor.prototype.jquery) {
          html = html.get(0);
        }
        var entryNode = domify('<div class="bpp-properties-entry" data-entry="' + escapeHTML(entry.id) + '"></div>');
        forEach(entry.cssClasses || [], function(cssClass) {
          domClasses(entryNode).add(cssClass);
        });
        entryNode.appendChild(html);
        groupNode.appendChild(entryNode);
        // update conditionally visible elements
        self.updateState(entry, entryNode);
      });
      tabNode.appendChild(groupNode);
    });
    tabLinksNode.appendChild(tabLinkNode);
    tabContainerNode.appendChild(tabNode);
  });
  tabBarNode.appendChild(tabLinksNode);
  panelNode.appendChild(tabBarNode);
  panelNode.appendChild(tabContainerNode);
  return panelNode;
};
function setInputValue(node, value) {
  var contentEditable = isContentEditable(node);
  var oldValue = contentEditable ? node.innerText : node.value;
  var selection;
  // prevents input fields from having the value 'undefined'
  if (value === undefined) {
    value = '';
  }
  if (oldValue === value) {
    return;
  }
  // update selection on undo/redo
  if (document.activeElement === node) {
    selection = updateSelection(getSelection(node), oldValue, value);
  }
  if (contentEditable) {
    node.innerText = value;
  } else {
    node.value = value;
  }
  if (selection) {
    setSelection(node, selection);
  }
}
function setSelectValue(node, value) {
  if (value !== undefined) {
    node.value = value;
  }
}
function setToggleValue(node, value) {
  var nodeValue = node.value;
  node.checked = (value === nodeValue) || (!domAttr(node, 'value') && value);
}
function setTextValue(node, value) {
  node.textContent = value;
}
function getSelection(node) {
  return isContentEditable(node) ? getContentEditableSelection(node) : {
    start: node.selectionStart,
    end: node.selectionEnd
  };
}
function getContentEditableSelection(node) {
  var selection = window.getSelection();
  var focusNode = selection.focusNode,
      focusOffset = selection.focusOffset,
      anchorOffset = selection.anchorOffset;
  if (!focusNode) {
    throw new Error('not selected');
  }
  // verify we have selection on the current element
  if (!node.contains(focusNode)) {
    throw new Error('not selected');
  }
  return {
    start: Math.min(focusOffset, anchorOffset),
    end: Math.max(focusOffset, anchorOffset)
  };
}
function setSelection(node, selection) {
  if (isContentEditable(node)) {
    setContentEditableSelection(node, selection);
  } else {
    node.selectionStart = selection.start;
    node.selectionEnd = selection.end;
  }
}
function setContentEditableSelection(node, selection) {
  var focusNode,
      domRange,
      domSelection;
  focusNode = node.firstChild || node,
  domRange = document.createRange();
  domRange.setStart(focusNode, selection.start);
  domRange.setEnd(focusNode, selection.end);
  domSelection = window.getSelection();
  domSelection.removeAllRanges();
  domSelection.addRange(domRange);
}
function isImplicitRoot(element) {
  return element.id === '__implicitroot';
}
ruoyi-bpmnjs/resources/properties-panel/Utils.js
New file
@@ -0,0 +1,252 @@
'use strict';
var domQuery = require('min-dom').query,
    domClear = require('min-dom').clear,
    is = require('bpmn-js/lib/util/ModelUtil').is,
    forEach = require('lodash/forEach'),
    domify = require('min-dom').domify,
    Ids = require('ids').default;
var SPACE_REGEX = /\s/;
// for QName validation as per http://www.w3.org/TR/REC-xml/#NT-NameChar
var QNAME_REGEX = /^([a-z][\w-.]*:)?[a-z_][\w-.]*$/i;
// for ID validation as per BPMN Schema (QName - Namespace)
var ID_REGEX = /^[a-z_][\w-.]*$/i;
var PLACEHOLDER_REGEX = /\$\{([^}]*)\}/g;
var HTML_ESCAPE_MAP = {
  '&': '&amp;',
  '<': '&lt;',
  '>': '&gt;',
  '"': '&quot;',
  '\'': '&#39;'
};
function selectedOption(selectBox) {
  if (selectBox.selectedIndex >= 0) {
    return selectBox.options[selectBox.selectedIndex].value;
  }
}
module.exports.selectedOption = selectedOption;
function selectedType(elementSyntax, inputNode) {
  var typeSelect = domQuery(elementSyntax, inputNode);
  return selectedOption(typeSelect);
}
module.exports.selectedType = selectedType;
/**
 * Retrieve the root element the document this
 * business object is contained in.
 *
 * @return {ModdleElement}
 */
function getRoot(businessObject) {
  var parent = businessObject;
  while (parent.$parent) {
    parent = parent.$parent;
  }
  return parent;
}
module.exports.getRoot = getRoot;
/**
 * filters all elements in the list which have a given type.
 * removes a new list
 */
function filterElementsByType(objectList, type) {
  var list = objectList || [];
  var result = [];
  forEach(list, function(obj) {
    if (is(obj, type)) {
      result.push(obj);
    }
  });
  return result;
}
module.exports.filterElementsByType = filterElementsByType;
function findRootElementsByType(businessObject, referencedType) {
  var root = getRoot(businessObject);
  return filterElementsByType(root.rootElements, referencedType);
}
module.exports.findRootElementsByType = findRootElementsByType;
function removeAllChildren(domElement) {
  while (domElement.firstChild) {
    domElement.removeChild(domElement.firstChild);
  }
}
module.exports.removeAllChildren = removeAllChildren;
/**
 * adds an empty option to the list
 */
function addEmptyParameter(list) {
  return list.push({ 'label': '', 'value': '', 'name': '' });
}
module.exports.addEmptyParameter = addEmptyParameter;
/**
 * returns a list with all root elements for the given parameter 'referencedType'
 */
function refreshOptionsModel(businessObject, referencedType) {
  var model = [];
  var referableObjects = findRootElementsByType(businessObject, referencedType);
  forEach(referableObjects, function(obj) {
    model.push({
      label: (obj.name || '') + ' (id='+obj.id+')',
      value: obj.id,
      name: obj.name
    });
  });
  return model;
}
module.exports.refreshOptionsModel = refreshOptionsModel;
/**
 * fills the drop down with options
 */
function updateOptionsDropDown(domSelector, businessObject, referencedType, entryNode) {
  var options = refreshOptionsModel(businessObject, referencedType);
  addEmptyParameter(options);
  var selectBox = domQuery(domSelector, entryNode);
  domClear(selectBox);
  forEach(options, function(option) {
    var optionEntry = domify('<option value="' + escapeHTML(option.value) + '">' + escapeHTML(option.label) + '</option>');
    selectBox.appendChild(optionEntry);
  });
  return options;
}
module.exports.updateOptionsDropDown = updateOptionsDropDown;
/**
 * checks whether the id value is valid
 *
 * @param {ModdleElement} bo
 * @param {String} idValue
 * @param {Function} translate
 *
 * @return {String} error message
 */
function isIdValid(bo, idValue, translate) {
  var assigned = bo.$model.ids.assigned(idValue);
  var idExists = assigned && assigned !== bo;
  if (!idValue || idExists) {
    return translate('Element must have an unique id.');
  }
  return validateId(idValue, translate);
}
module.exports.isIdValid = isIdValid;
function validateId(idValue, translate) {
  idValue = stripPlaceholders(idValue);
  if (containsSpace(idValue)) {
    return translate('Id must not contain spaces.');
  }
  if (!ID_REGEX.test(idValue)) {
    if (QNAME_REGEX.test(idValue)) {
      return translate('Id must not contain prefix.');
    }
    return translate('Id must be a valid QName.');
  }
}
module.exports.validateId = validateId;
function containsSpace(value) {
  return SPACE_REGEX.test(value);
}
module.exports.containsSpace = containsSpace;
function stripPlaceholders(idValue) {
  // replace expression e.g. ${VERSION_TAG}
  // use only the content between ${}
  // for the REGEX check
  return idValue.replace(PLACEHOLDER_REGEX, '$1');
}
/**
 * generate a semantic id with given prefix
 */
function nextId(prefix) {
  var ids = new Ids([32,32,1]);
  return ids.nextPrefixed(prefix);
}
module.exports.nextId = nextId;
function triggerClickEvent(element) {
  var evt;
  var eventType = 'click';
  if (document.createEvent) {
    try {
      // Chrome, Safari, Firefox
      evt = new MouseEvent((eventType), { view: window, bubbles: true, cancelable: true });
    } catch (e) {
      // IE 11, PhantomJS (wat!)
      evt = document.createEvent('MouseEvent');
      evt.initEvent((eventType), true, true);
    }
    return element.dispatchEvent(evt);
  } else {
    // Welcome IE
    evt = document.createEventObject();
    return element.fireEvent('on' + eventType, evt);
  }
}
module.exports.triggerClickEvent = triggerClickEvent;
function escapeHTML(str) {
  str = '' + str;
  return str && str.replace(/[&<>"']/g, function(match) {
    return HTML_ESCAPE_MAP[match];
  });
}
module.exports.escapeHTML = escapeHTML;
ruoyi-bpmnjs/resources/properties-panel/cmd/CreateAndReferenceHandler.js
New file
@@ -0,0 +1,101 @@
'use strict';
var elementHelper = require('../helper/ElementHelper');
/**
 * A handler capable of creating a new element under a provided parent
 * and updating / creating a reference to it in one atomic action.
 *
 * @class
 * @constructor
 */
function CreateAndReferenceElementHandler(elementRegistry, bpmnFactory) {
  this._elementRegistry = elementRegistry;
  this._bpmnFactory = bpmnFactory;
}
CreateAndReferenceElementHandler.$inject = [ 'elementRegistry', 'bpmnFactory' ];
module.exports = CreateAndReferenceElementHandler;
// api ////////////////////
/**
 * Creates a new element under a provided parent and updates / creates a reference to it in
 * one atomic action.
 *
 * @method  CreateAndReferenceElementHandler#execute
 *
 * @param {Object} context
 * @param {djs.model.Base} context.element which is the context for the reference
 * @param {moddle.referencingObject} context.referencingObject the object which creates the reference
 * @param {String} context.referenceProperty the property of the referencingObject which makes the reference
 * @param {moddle.newObject} context.newObject the new object to add
 * @param {moddle.newObjectContainer} context.newObjectContainer the container for the new object
 *
 * @returns {Array<djs.mode.Base>} the updated element
 */
CreateAndReferenceElementHandler.prototype.execute = function(context) {
  var referencingObject = ensureNotNull(context.referencingObject, 'referencingObject'),
      referenceProperty = ensureNotNull(context.referenceProperty, 'referenceProperty'),
      newObject = ensureNotNull(context.newObject, 'newObject'),
      newObjectContainer = ensureNotNull(context.newObjectContainer, 'newObjectContainer'),
      newObjectParent = ensureNotNull(context.newObjectParent, 'newObjectParent'),
      changed = [ context.element ]; // this will not change any diagram-js elements
  // create new object
  var referencedObject = elementHelper
    .createElement(newObject.type, newObject.properties, newObjectParent, this._bpmnFactory);
  context.referencedObject = referencedObject;
  // add to containing list
  newObjectContainer.push(referencedObject);
  // adjust reference attribute
  context.previousReference = referencingObject[referenceProperty];
  referencingObject[referenceProperty] = referencedObject;
  context.changed = changed;
  // indicate changed on objects affected by the update
  return changed;
};
/**
 * Reverts the update
 *
 * @method  CreateAndReferenceElementHandler#revert
 *
 * @param {Object} context
 *
 * @returns {djs.mode.Base} the updated element
 */
CreateAndReferenceElementHandler.prototype.revert = function(context) {
  var referencingObject = context.referencingObject,
      referenceProperty = context.referenceProperty,
      previousReference = context.previousReference,
      referencedObject = context.referencedObject,
      newObjectContainer = context.newObjectContainer;
  // reset reference
  referencingObject.set(referenceProperty, previousReference);
  // remove new element
  newObjectContainer.splice(newObjectContainer.indexOf(referencedObject), 1);
  return context.changed;
};
// helpers //////////////
function ensureNotNull(prop, name) {
  if (!prop) {
    throw new Error(name + ' required');
  }
  return prop;
}
ruoyi-bpmnjs/resources/properties-panel/cmd/CreateBusinessObjectListHandler.js
New file
@@ -0,0 +1,110 @@
'use strict';
var forEach = require('lodash/forEach');
var elementHelper = require('../helper/ElementHelper');
/**
 * A handler that implements a BPMN 2.0 property update
 * for business objects which are not represented in the
 * diagram.
 *
 * This is useful in the context of the properties panel in
 * order to update child elements of elements visible in
 * the diagram.
 *
 * Example: perform an update of a specific event definition
 * of an intermediate event.
 *
 * @class
 * @constructor
 */
function CreateBusinessObjectListHandler(elementRegistry, bpmnFactory) {
  this._elementRegistry = elementRegistry;
  this._bpmnFactory = bpmnFactory;
}
CreateBusinessObjectListHandler.$inject = [ 'elementRegistry', 'bpmnFactory' ];
module.exports = CreateBusinessObjectListHandler;
function ensureNotNull(prop, name) {
  if (!prop) {
    throw new Error(name + ' required');
  }
  return prop;
}
function ensureList(prop, name) {
  if (!prop || Object.prototype.toString.call(prop) !== '[object Array]') {
    throw new Error(name + ' needs to be a list');
  }
  return prop;
}
// api /////////////////////////////////////////////
/**
 * Creates a new element under a provided parent and updates / creates a reference to it in
 * one atomic action.
 *
 * @method  CreateBusinessObjectListHandler#execute
 *
 * @param {Object} context
 * @param {djs.model.Base} context.element which is the context for the reference
 * @param {moddle.referencingObject} context.referencingObject the object which creates the reference
 * @param {String} context.referenceProperty the property of the referencingObject which makes the reference
 * @param {moddle.newObject} context.newObject the new object to add
 * @param {moddle.newObjectContainer} context.newObjectContainer the container for the new object
 *
 * @return {Array<djs.mode.Base>} the updated element
 */
CreateBusinessObjectListHandler.prototype.execute = function(context) {
  var currentObject = ensureNotNull(context.currentObject, 'currentObject'),
      propertyName = ensureNotNull(context.propertyName, 'propertyName'),
      newObjects = ensureList(context.newObjects, 'newObjects'),
      changed = [ context.element ]; // this will not change any diagram-js elements
  var childObjects = [];
  var self = this;
  // create new array of business objects
  forEach(newObjects, function(obj) {
    var element = elementHelper.createElement(obj.type, obj.properties, currentObject, self._bpmnFactory);
    childObjects.push(element);
  });
  context.childObject = childObjects;
  // adjust array reference in the parent business object
  context.previousChilds = currentObject[propertyName];
  currentObject[propertyName] = childObjects;
  context.changed = changed;
  // indicate changed on objects affected by the update
  return changed;
};
/**
 * Reverts the update
 *
 * @method  CreateBusinessObjectListHandler#revert
 *
 * @param {Object} context
 *
 * @return {djs.mode.Base} the updated element
 */
CreateBusinessObjectListHandler.prototype.revert = function(context) {
  var currentObject = context.currentObject,
      propertyName = context.propertyName,
      previousChilds = context.previousChilds;
  // remove new element
  currentObject.set(propertyName, previousChilds);
  return context.changed;
};
ruoyi-bpmnjs/resources/properties-panel/cmd/MultiCommandHandler.js
New file
@@ -0,0 +1,32 @@
'use strict';
var forEach = require('lodash/forEach');
/**
 * A handler that combines and executes multiple commands.
 *
 * All updates are bundled on the command stack and executed in one step.
 * This also makes it possible to revert the changes in one step.
 *
 * Example use case: remove the camunda:formKey attribute and in addition
 * add all form fields needed for the camunda:formData property.
 *
 * @class
 * @constructor
 */
function MultiCommandHandler(commandStack) {
  this._commandStack = commandStack;
}
MultiCommandHandler.$inject = [ 'commandStack' ];
module.exports = MultiCommandHandler;
MultiCommandHandler.prototype.preExecute = function(context) {
  var commandStack = this._commandStack;
  forEach(context, function(command) {
    commandStack.execute(command.cmd, command.context);
  });
};
ruoyi-bpmnjs/resources/properties-panel/cmd/UpdateBusinessObjectHandler.js
New file
@@ -0,0 +1,131 @@
'use strict';
var reduce = require('lodash/transform'),
    is = require('bpmn-js/lib/util/ModelUtil').is,
    keys = require('lodash/keys'),
    forEach = require('lodash/forEach');
/**
 * A handler that implements a BPMN 2.0 property update
 * for business objects which are not represented in the
 * diagram.
 *
 * This is useful in the context of the properties panel in
 * order to update child elements of elements visible in
 * the diagram.
 *
 * Example: perform an update of a specific event definition
 * of an intermediate event.
 *
 * @class
 * @constructor
 */
function UpdateBusinessObjectHandler(elementRegistry) {
  this._elementRegistry = elementRegistry;
}
UpdateBusinessObjectHandler.$inject = [ 'elementRegistry' ];
module.exports = UpdateBusinessObjectHandler;
/**
 * returns the root element
 */
function getRoot(businessObject) {
  var parent = businessObject;
  while (parent.$parent) {
    parent = parent.$parent;
  }
  return parent;
}
function getProperties(businessObject, propertyNames) {
  return reduce(propertyNames, function(result, key) {
    result[key] = businessObject.get(key);
    return result;
  }, {});
}
function setProperties(businessObject, properties) {
  forEach(properties, function(value, key) {
    businessObject.set(key, value);
  });
}
// api /////////////////////////////////////////////
/**
 * Updates a business object with a list of new properties
 *
 * @method  UpdateBusinessObjectHandler#execute
 *
 * @param {Object} context
 * @param {djs.model.Base} context.element the element which has a child business object updated
 * @param {moddle.businessObject} context.businessObject the businessObject to update
 * @param {Object} context.properties a list of properties to set on the businessObject
 *
 * @return {Array<djs.mode.Base>} the updated element
 */
UpdateBusinessObjectHandler.prototype.execute = function(context) {
  var element = context.element,
      businessObject = context.businessObject,
      rootElements = getRoot(businessObject).rootElements,
      referenceType = context.referenceType,
      referenceProperty = context.referenceProperty,
      changed = [ element ]; // this will not change any diagram-js elements
  if (!element) {
    throw new Error('element required');
  }
  if (!businessObject) {
    throw new Error('businessObject required');
  }
  var properties = context.properties,
      oldProperties = context.oldProperties || getProperties(businessObject, keys(properties));
  // check if there the update needs an external element for reference
  if (typeof referenceType !== 'undefined' && typeof referenceProperty !== 'undefined') {
    forEach(rootElements, function(rootElement) {
      if (is(rootElement, referenceType)) {
        if (rootElement.id === properties[referenceProperty]) {
          properties[referenceProperty] = rootElement;
        }
      }
    });
  }
  // update properties
  setProperties(businessObject, properties);
  // store old values
  context.oldProperties = oldProperties;
  context.changed = changed;
  // indicate changed on objects affected by the update
  return changed;
};
/**
 * Reverts the update
 *
 * @method  UpdateBusinessObjectHandler#revert
 *
 * @param {Object} context
 *
 * @return {djs.mode.Base} the updated element
 */
UpdateBusinessObjectHandler.prototype.revert = function(context) {
  var oldProperties = context.oldProperties,
      businessObject = context.businessObject;
  // update properties
  setProperties(businessObject, oldProperties);
  return context.changed;
};
ruoyi-bpmnjs/resources/properties-panel/cmd/UpdateBusinessObjectListHandler.js
New file
@@ -0,0 +1,115 @@
'use strict';
var forEach = require('lodash/forEach');
/**
 * A handler that implements a BPMN 2.0 property update
 * for business object lists which are not represented in the
 * diagram.
 *
 * This is useful in the context of the properties panel in
 * order to update child elements of elements visible in
 * the diagram.
 *
 * Example: perform an update of a specific event definition
 * of an intermediate event.
 *
 * @class
 * @constructor
 */
function UpdateBusinessObjectListHandler(elementRegistry, bpmnFactory) {
  this._elementRegistry = elementRegistry;
  this._bpmnFactory = bpmnFactory;
}
UpdateBusinessObjectListHandler.$inject = [ 'elementRegistry', 'bpmnFactory' ];
module.exports = UpdateBusinessObjectListHandler;
function ensureNotNull(prop, name) {
  if (!prop) {
    throw new Error(name + 'required');
  }
  return prop;
}
// api /////////////////////////////////////////////
/**
 * Updates a element under a provided parent.
 */
UpdateBusinessObjectListHandler.prototype.execute = function(context) {
  var currentObject = ensureNotNull(context.currentObject, 'currentObject'),
      propertyName = ensureNotNull(context.propertyName, 'propertyName'),
      updatedObjectList = context.updatedObjectList,
      objectsToRemove = context.objectsToRemove || [],
      objectsToAdd = context.objectsToAdd || [],
      changed = [ context.element], // this will not change any diagram-js elements
      referencePropertyName;
  if (context.referencePropertyName) {
    referencePropertyName = context.referencePropertyName;
  }
  var objectList = currentObject[propertyName];
  // adjust array reference in the parent business object
  context.previousList = currentObject[propertyName];
  if (updatedObjectList) {
    currentObject[propertyName] = updatedObjectList;
  } else {
    var listCopy = [];
    // remove all objects which should be removed
    forEach(objectList, function(object) {
      if (objectsToRemove.indexOf(object) == -1) {
        listCopy.push(object);
      }
    });
    // add all objects which should be added
    listCopy = listCopy.concat(objectsToAdd);
    // set property to new list
    if (listCopy.length > 0 || !referencePropertyName) {
      // as long as there are elements in the list update the list
      currentObject[propertyName] = listCopy;
    } else if (referencePropertyName) {
      // remove the list when it is empty
      var parentObject = currentObject.$parent;
      parentObject.set(referencePropertyName, undefined);
    }
  }
  context.changed = changed;
  // indicate changed on objects affected by the update
  return changed;
};
/**
 * Reverts the update
 *
 * @method  CreateBusinessObjectListHandler#revert
 *
 * @param {Object} context
 *
 * @return {djs.mode.Base} the updated element
 */
UpdateBusinessObjectListHandler.prototype.revert = function(context) {
  var currentObject = context.currentObject,
      propertyName = context.propertyName,
      previousList = context.previousList,
      parentObject = currentObject.$parent;
  if (context.referencePropertyName) {
    parentObject.set(context.referencePropertyName, currentObject);
  }
  // remove new element
  currentObject.set(propertyName, previousList);
  return context.changed;
};
ruoyi-bpmnjs/resources/properties-panel/cmd/index.js
New file
@@ -0,0 +1,27 @@
'use strict';
var forEach = require('lodash/forEach');
var HANDLERS = {
  'properties-panel.update-businessobject': require('./UpdateBusinessObjectHandler'),
  'properties-panel.create-and-reference': require('./CreateAndReferenceHandler'),
  'properties-panel.create-businessobject-list': require('./CreateBusinessObjectListHandler'),
  'properties-panel.update-businessobject-list': require('./UpdateBusinessObjectListHandler'),
  'properties-panel.multi-command-executor': require('./MultiCommandHandler')
};
function CommandInitializer(eventBus, commandStack) {
  eventBus.on('diagram.init', function() {
    forEach(HANDLERS, function(handler, id) {
      commandStack.registerHandler(id, handler);
    });
  });
}
CommandInitializer.$inject = [ 'eventBus', 'commandStack' ];
module.exports = {
  __init__: [ CommandInitializer ]
};
ruoyi-bpmnjs/resources/properties-panel/factory/CheckboxEntryFactory.js
New file
@@ -0,0 +1,77 @@
'use strict';
var getBusinessObject = require('bpmn-js/lib/util/ModelUtil').getBusinessObject,
    cmdHelper = require('../helper/CmdHelper'),
    escapeHTML = require('../Utils').escapeHTML;
var entryFieldDescription = require('./EntryFieldDescription');
var checkbox = function(options, defaultParameters) {
  var resource = defaultParameters,
      id = resource.id,
      label = options.label || id,
      canBeDisabled = !!options.disabled && typeof options.disabled === 'function',
      canBeHidden = !!options.hidden && typeof options.hidden === 'function',
      description = options.description;
  resource.html =
    '<input id="activiti-' + escapeHTML(id) + '" ' +
         'type="checkbox" ' +
         'name="' + escapeHTML(options.modelProperty) + '" ' +
         (canBeDisabled ? 'data-disable="isDisabled"' : '') +
         (canBeHidden ? 'data-show="isHidden"' : '') +
         ' />' +
    '<label for="activiti-' + escapeHTML(id) + '" ' +
         (canBeDisabled ? 'data-disable="isDisabled"' : '') +
         (canBeHidden ? 'data-show="isHidden"' : '') +
         '>' + escapeHTML(label) + '</label>';
  // add description below checkbox entry field
  if (description) {
    resource.html += entryFieldDescription(description);
  }
  resource.get = function(element) {
    var bo = getBusinessObject(element),
        res = {};
    res[options.modelProperty] = bo.get(options.modelProperty);
    return res;
  };
  resource.set = function(element, values) {
    var res = {};
    res[options.modelProperty] = !!values[options.modelProperty];
    return cmdHelper.updateProperties(element, res);
  };
  if (typeof options.set === 'function') {
    resource.set = options.set;
  }
  if (typeof options.get === 'function') {
    resource.get = options.get;
  }
  if (canBeDisabled) {
    resource.isDisabled = function() {
      return options.disabled.apply(resource, arguments);
    };
  }
  if (canBeHidden) {
    resource.isHidden = function() {
      return !options.hidden.apply(resource, arguments);
    };
  }
  resource.cssClasses = ['bpp-checkbox'];
  return resource;
};
module.exports = checkbox;
ruoyi-bpmnjs/resources/properties-panel/factory/ComboEntryFactory.js
New file
@@ -0,0 +1,118 @@
'use strict';
var assign = require('lodash/assign'),
    find = require('lodash/find');
var domQuery = require('min-dom').query;
var escapeHTML = require('../Utils').escapeHTML;
var selectEntryFactory = require('./SelectEntryFactory'),
    entryFieldDescription = require('./EntryFieldDescription');
/**
 * The combo box is a special implementation of the select entry and adds the option 'custom' to the
 * select box. If 'custom' is selected, an additional text input field is shown which allows to define
 * a custom value.
 *
 * @param  {Object} options
 * @param  {string} options.id
 * @param  {string} options.label
 * @param  {Array<Object>} options.selectOptions list of name/value pairs
 * @param  {string} options.modelProperty
 * @param  {function} options.get
 * @param  {function} options.set
 * @param  {string} [options.customValue] custom select option value (default: 'custom')
 * @param  {string} [options.customName] custom select option name visible in the select box (default: 'custom')
 *
 * @return {Object}
 */
var comboBox = function(options) {
  var selectOptions = options.selectOptions,
      modelProperty = options.modelProperty,
      customValue = options.customValue || 'custom',
      customName = options.customName || 'custom ' + modelProperty,
      description = options.description;
  // check if a value is not a built in value
  var isCustomValue = function(value) {
    if (typeof value[modelProperty] === 'undefined') {
      return false;
    }
    var isCustom = !find(selectOptions, function(option) {
      return value[modelProperty] === option.value;
    });
    return isCustom;
  };
  var comboOptions = assign({}, options);
  // true if the selected value in the select box is customValue
  comboOptions.showCustomInput = function(element, node) {
    var selectBox = domQuery('[data-entry="'+ options.id +'"] select', node.parentNode);
    if (selectBox) {
      return selectBox.value === customValue;
    }
    return false;
  };
  comboOptions.get = function(element, node) {
    var value = options.get(element, node);
    var modifiedValues = {};
    if (!isCustomValue(value)) {
      modifiedValues[modelProperty] = value[modelProperty] || '';
      return modifiedValues;
    }
    modifiedValues[modelProperty] = customValue;
    modifiedValues['custom-'+modelProperty] = value[modelProperty];
    return modifiedValues;
  };
  comboOptions.set = function(element, values, node) {
    var modifiedValues = {};
    // if the custom select option has been selected
    // take the value from the text input field
    if (values[modelProperty] === customValue) {
      modifiedValues[modelProperty] = values['custom-' + modelProperty] || '';
    }
    else if (options.emptyParameter && values[modelProperty] === '') {
      modifiedValues[modelProperty] = undefined;
    } else {
      modifiedValues[modelProperty] = values[modelProperty];
    }
    return options.set(element, modifiedValues, node);
  };
  comboOptions.selectOptions.push({ name: customName, value: customValue });
  var comboBoxEntry = assign({}, selectEntryFactory(comboOptions, comboOptions));
  comboBoxEntry.html += '<div class="bpp-field-wrapper bpp-combo-input" ' +
    'data-show="showCustomInput"' +
    '>' +
    '<input id="activiti-' + escapeHTML(options.id) + '-input" type="text" name="custom-' +
      escapeHTML(modelProperty) + '" ' +
    ' />' +
  '</div>';
  // add description below combo box entry field
  if (description) {
    comboBoxEntry.html += entryFieldDescription(description);
  }
  return comboBoxEntry;
};
module.exports = comboBox;
ruoyi-bpmnjs/resources/properties-panel/factory/EntryFactory.js
New file
@@ -0,0 +1,163 @@
'use strict';
var getBusinessObject = require('bpmn-js/lib/util/ModelUtil').getBusinessObject;
// input entities
var textInputField = require('./TextInputEntryFactory'),
    checkboxField = require('./CheckboxEntryFactory'),
    selectBoxField = require('./SelectEntryFactory'),
    comboBoxField = require('./ComboEntryFactory'),
    textBoxField = require('./TextBoxEntryFactory'),
    validationAwareTextInputField = require('./ValidationAwareTextInput'),
    tableField = require('./TableEntryFactory'),
    labelEntry = require('./LabelFactory'),
    link = require('./LinkEntryFactory');
var cmdHelper = require('../helper/CmdHelper');
// helpers ////////////////////////////////////////
function ensureNotNull(prop) {
  if (!prop) {
    throw new Error(prop + ' must be set.');
  }
  return prop;
}
/**
 * sets the default parameters which are needed to create an entry
 *
 * @param options
 * @returns {{id: *, description: (*|string), get: (*|Function), set: (*|Function),
 *            validate: (*|Function), html: string}}
 */
var setDefaultParameters = function(options) {
  // default method to fetch the current value of the input field
  var defaultGet = function(element) {
    var bo = getBusinessObject(element),
        res = {},
        prop = ensureNotNull(options.modelProperty);
    res[prop] = bo.get(prop);
    return res;
  };
  // default method to set a new value to the input field
  var defaultSet = function(element, values) {
    var res = {},
        prop = ensureNotNull(options.modelProperty);
    if (values[prop] !== '') {
      res[prop] = values[prop];
    } else {
      res[prop] = undefined;
    }
    return cmdHelper.updateProperties(element, res);
  };
  // default validation method
  var defaultValidate = function() {
    return {};
  };
  return {
    id : options.id,
    description : (options.description || ''),
    get : (options.get || defaultGet),
    set : (options.set || defaultSet),
    validate : (options.validate || defaultValidate),
    html: ''
  };
};
function EntryFactory() {
}
/**
 * Generates an text input entry object for a property panel.
 * options are:
 * - id: id of the entry - String
 *
 * - description: description of the property - String
 *
 * - label: label for the input field - String
 *
 * - set: setter method - Function
 *
 * - get: getter method - Function
 *
 * - validate: validation mehtod - Function
 *
 * - modelProperty: name of the model property - String
 *
 * - buttonAction: Object which contains the following properties: - Object
 * ---- name: name of the [data-action] callback - String
 * ---- method: callback function for [data-action] - Function
 *
 * - buttonShow: Object which contains the following properties: - Object
 * ---- name: name of the [data-show] callback - String
 * ---- method: callback function for [data-show] - Function
 *
 * @param options
 * @returns the propertyPanel entry resource object
 */
EntryFactory.textField = function(options) {
  return textInputField(options, setDefaultParameters(options));
};
EntryFactory.validationAwareTextField = function(options) {
  return validationAwareTextInputField(options, setDefaultParameters(options));
};
/**
 * Generates a checkbox input entry object for a property panel.
 * options are:
 * - id: id of the entry - String
 *
 * - description: description of the property - String
 *
 * - label: label for the input field - String
 *
 * - set: setter method - Function
 *
 * - get: getter method - Function
 *
 * - validate: validation method - Function
 *
 * - modelProperty: name of the model property - String
 *
 * @param options
 * @returns the propertyPanel entry resource object
 */
EntryFactory.checkbox = function(options) {
  return checkboxField(options, setDefaultParameters(options));
};
EntryFactory.textBox = function(options) {
  return textBoxField(options, setDefaultParameters(options));
};
EntryFactory.selectBox = function(options) {
  return selectBoxField(options, setDefaultParameters(options));
};
EntryFactory.comboBox = function(options) {
  return comboBoxField(options);
};
EntryFactory.table = function(options) {
  return tableField(options);
};
EntryFactory.label = function(options) {
  return labelEntry(options);
};
EntryFactory.link = function(options) {
  return link(options);
};
module.exports = EntryFactory;
ruoyi-bpmnjs/resources/properties-panel/factory/EntryFieldDescription.js
New file
@@ -0,0 +1,49 @@
'use strict';
var escapeHTML = require('../Utils').escapeHTML;
/**
 * Create a linkified and HTML escaped entry field description.
 *
 * As a special feature, this description may contain both markdown
 * and plain <a href> links.
 *
 * @param {String} description
 */
module.exports = function entryFieldDescription(description) {
  // we tokenize the description to extract text, HTML and markdown links
  // text and links are handled seperately
  var escaped = [];
  // match markdown [{TEXT}]({URL}) and HTML links <a href="{URL}">{TEXT}</a>
  var pattern = /(?:\[([^\]]+)\]\((https?:\/\/[^"<>\]]+)\))|(?:<a href="(https?:\/\/[^"<>]+)">([^<]*)<\/a>)/gi;
  var index = 0;
  var match;
  var link, text;
  while ((match = pattern.exec(description))) {
    // escape + insert text before match
    if (match.index > index) {
      escaped.push(escapeHTML(description.substring(index, match.index)));
    }
    link = match[2] || match[3];
    text = match[1] || match[4];
    // insert safe link
    escaped.push('<a href="' + link + '" target="_blank">' + escapeHTML(text) + '</a>');
    index = match.index + match[0].length;
  }
  // escape and insert text after last match
  if (index < description.length) {
    escaped.push(escapeHTML(description.substring(index)));
  }
  return '<div class="bpp-field-description">' + escaped.join('') + '</div>';
};
ruoyi-bpmnjs/resources/properties-panel/factory/LabelFactory.js
New file
@@ -0,0 +1,38 @@
'use strict';
/**
 * The label factory provides a label entry. For the label text
 * it expects either a string provided by the options.labelText
 * parameter or it could be generated programmatically using a
 * function passed as the options.get parameter.
 *
 * @param  {Object} options
 * @param  {string} options.id
 * @param  {string} [options.labelText]
 * @param  {Function} [options.get]
 * @param  {Function} [options.showLabel]
 * @param  {Boolean} [options.divider] adds a divider at the top of the label if true; default: false
 */
var label = function(options) {
  return {
    id: options.id,
    html: '<label data-value="label" ' +
            'data-show="showLabel" ' +
            'class="entry-label' + (options.divider ? ' divider' : '') + '">' +
          '</label>',
    get: function(element, node) {
      if (typeof options.get === 'function') {
        return options.get(element, node);
      }
      return { label: options.labelText };
    },
    showLabel: function(element, node) {
      if (typeof options.showLabel === 'function') {
        return options.showLabel(element, node);
      }
      return true;
    }
  };
};
module.exports = label;
ruoyi-bpmnjs/resources/properties-panel/factory/LinkEntryFactory.js
New file
@@ -0,0 +1,78 @@
'use strict';
var escapeHTML = require('../Utils').escapeHTML;
var entryFieldDescription = require('./EntryFieldDescription');
var bind = require('lodash/bind');
/**
 * An entry that renders a clickable link.
 *
 * A passed {@link options#handleClick} handler is responsible
 * to process the click.
 *
 * The link may be conditionally shown or hidden. This can be
 * controlled via the {@link options.showLink}.
 *
 * @param {Object} options
 * @param {String} options.id
 * @param {String} [options.label]
 * @param {Function} options.handleClick
 * @param {Function} [options.showLink] returning false to hide link
 * @param {String} [options.description]
 *
 * @example
 *
 * var linkEntry = link({
 *   id: 'foo',
 *   description: 'Some Description',
 *   handleClick: function(element, node, event) { ... },
 *   showLink: function(element, node) { ... }
 * });
 *
 * @return {Entry} the newly created entry
 */
function link(options) {
  var id = options.id,
      label = options.label || id,
      showLink = options.showLink,
      handleClick = options.handleClick,
      description = options.description;
  if (showLink && typeof showLink !== 'function') {
    throw new Error('options.showLink must be a function');
  }
  if (typeof handleClick !== 'function') {
    throw new Error('options.handleClick must be a function');
  }
  var resource = {
    id: id
  };
  resource.html =
    '<a data-action="handleClick" ' +
    (showLink ? 'data-show="showLink" ' : '') +
    'class="bpp-entry-link' + (options.cssClasses ? ' ' + escapeHTML(options.cssClasses) : '') +
    '">' + escapeHTML(label) + '</a>';
  // add description below link entry field
  if (description) {
    resource.html += entryFieldDescription(description);
  }
  resource.handleClick = bind(handleClick, resource);
  if (typeof showLink === 'function') {
    resource.showLink = function() {
      return showLink.apply(resource, arguments);
    };
  }
  return resource;
}
module.exports = link;
ruoyi-bpmnjs/resources/properties-panel/factory/SelectEntryFactory.js
New file
@@ -0,0 +1,137 @@
'use strict';
var escapeHTML = require('../Utils').escapeHTML;
var domify = require('min-dom').domify;
var forEach = require('lodash/forEach');
var entryFieldDescription = require('./EntryFieldDescription');
var isList = function(list) {
  return !(!list || Object.prototype.toString.call(list) !== '[object Array]');
};
var addEmptyParameter = function(list) {
  return list.concat([ { name: '', value: '' } ]);
};
var createOption = function(option) {
  return '<option value="' + option.value + '">' + option.name + '</option>';
};
/**
 * @param  {Object} options
 * @param  {string} options.id
 * @param  {string} [options.label]
 * @param  {Array<Object>} options.selectOptions
 * @param  {string} options.modelProperty
 * @param  {boolean} options.emptyParameter
 * @param  {function} options.disabled
 * @param  {function} options.hidden
 * @param  {Object} defaultParameters
 *
 * @return {Object}
 */
var selectbox = function(options, defaultParameters) {
  var resource = defaultParameters,
      label = options.label || resource.id,
      selectOptions = options.selectOptions || [ { name: '', value: '' } ],
      modelProperty = options.modelProperty,
      emptyParameter = options.emptyParameter,
      canBeDisabled = !!options.disabled && typeof options.disabled === 'function',
      canBeHidden = !!options.hidden && typeof options.hidden === 'function',
      description = options.description;
  if (emptyParameter) {
    selectOptions = addEmptyParameter(selectOptions);
  }
  resource.html =
    '<label for="activiti-' + escapeHTML(resource.id) + '"' +
    (canBeDisabled ? 'data-disable="isDisabled" ' : '') +
    (canBeHidden ? 'data-show="isHidden" ' : '') +
    '>' + escapeHTML(label) + '</label>' +
    '<select id="activiti-' + escapeHTML(resource.id) + '-select" name="' +
    escapeHTML(modelProperty) + '"' +
    (canBeDisabled ? 'data-disable="isDisabled" ' : '') +
    (canBeHidden ? 'data-show="isHidden" ' : '') +
    ' data-value>';
  if (isList(selectOptions)) {
    forEach(selectOptions, function(option) {
      resource.html += '<option value="' + escapeHTML(option.value) + '">' +
      (option.name ? escapeHTML(option.name) : '') + '</option>';
    });
  }
  resource.html += '</select>';
  // add description below select box entry field
  if (description && typeof options.showCustomInput !== 'function') {
    resource.html += entryFieldDescription(description);
  }
  /**
   * Fill the select box options dynamically.
   *
   * Calls the defined function #selectOptions in the entry to get the
   * values for the options and set the value to the inputNode.
   *
   * @param {djs.model.Base} element
   * @param {HTMLElement} entryNode
   * @param {EntryDescriptor} inputNode
   * @param {Object} inputName
   * @param {Object} newValue
   */
  resource.setControlValue = function(element, entryNode, inputNode, inputName, newValue) {
    if (typeof selectOptions === 'function') {
      var options = selectOptions(element, inputNode);
      if (options) {
        // remove existing options
        while (inputNode.firstChild) {
          inputNode.removeChild(inputNode.firstChild);
        }
        // add options
        forEach(options, function(option) {
          var template = domify(createOption(option));
          inputNode.appendChild(template);
        });
      }
    }
    // set select value
    if (newValue !== undefined) {
      inputNode.value = newValue;
    }
  };
  if (canBeDisabled) {
    resource.isDisabled = function() {
      return options.disabled.apply(resource, arguments);
    };
  }
  if (canBeHidden) {
    resource.isHidden = function() {
      return !options.hidden.apply(resource, arguments);
    };
  }
  resource.cssClasses = ['bpp-dropdown'];
  return resource;
};
module.exports = selectbox;
ruoyi-bpmnjs/resources/properties-panel/factory/TableEntryFactory.js
New file
@@ -0,0 +1,338 @@
'use strict';
var escapeHTML = require('../Utils').escapeHTML;
var cmdHelper = require('../helper/CmdHelper');
var domQuery = require('min-dom').query,
    domAttr = require('min-dom').attr,
    domClosest = require('min-dom').closest;
var filter = require('lodash/filter'),
    forEach = require('lodash/forEach'),
    keys = require('lodash/keys');
var domify = require('min-dom').domify;
var entryFieldDescription = require('./EntryFieldDescription');
var updateSelection = require('selection-update');
var TABLE_ROW_DIV_SNIPPET = '<div class="bpp-field-wrapper bpp-table-row">';
var DELETE_ROW_BUTTON_SNIPPET = '<button class="clear" data-action="deleteElement">' +
                                  '<span>X</span>' +
                                '</button>';
function createInputRowTemplate(properties, canRemove) {
  var template = TABLE_ROW_DIV_SNIPPET;
  template += createInputTemplate(properties, canRemove);
  template += canRemove ? DELETE_ROW_BUTTON_SNIPPET : '';
  template += '</div>';
  return template;
}
function createInputTemplate(properties, canRemove) {
  var columns = properties.length;
  var template = '';
  forEach(properties, function(prop) {
    template += '<input class="bpp-table-row-columns-' + columns + ' ' +
                               (canRemove ? 'bpp-table-row-removable' : '') + '" ' +
                       'id="activiti-table-row-cell-input-value" ' +
                       'type="text" ' +
                       'name="' + escapeHTML(prop) + '" />';
  });
  return template;
}
function createLabelRowTemplate(labels) {
  var template = TABLE_ROW_DIV_SNIPPET;
  template += createLabelTemplate(labels);
  template += '</div>';
  return template;
}
function createLabelTemplate(labels) {
  var columns = labels.length;
  var template = '';
  forEach(labels, function(label) {
    template += '<label class="bpp-table-row-columns-' + columns + '">' + escapeHTML(label) + '</label>';
  });
  return template;
}
function pick(elements, properties) {
  return (elements || []).map(function(elem) {
    var newElement = {};
    forEach(properties, function(prop) {
      newElement[prop] = elem[prop] || '';
    });
    return newElement;
  });
}
function diff(element, node, values, oldValues, editable) {
  return filter(values, function(value, idx) {
    return !valueEqual(element, node, value, oldValues[idx], editable, idx);
  });
}
function valueEqual(element, node, value, oldValue, editable, idx) {
  if (value && !oldValue) {
    return false;
  }
  var allKeys = keys(value).concat(keys(oldValue));
  return allKeys.every(function(key) {
    var n = value[key] || undefined;
    var o = oldValue[key] || undefined;
    return !editable(element, node, key, idx) || n === o;
  });
}
function getEntryNode(node) {
  return domClosest(node, '[data-entry]', true);
}
function getContainer(node) {
  return domQuery('div[data-list-entry-container]', node);
}
function getSelection(node) {
  return {
    start: node.selectionStart,
    end: node.selectionEnd
  };
}
function setSelection(node, selection) {
  node.selectionStart = selection.start;
  node.selectionEnd = selection.end;
}
/**
 * @param  {Object} options
 * @param  {string} options.id
 * @param  {string} options.description
 * @param  {Array<string>} options.modelProperties
 * @param  {Array<string>} options.labels
 * @param  {Function} options.getElements - this callback function must return a list of business object items
 * @param  {Function} options.removeElement
 * @param  {Function} options.addElement
 * @param  {Function} options.updateElement
 * @param  {Function} options.editable
 * @param  {Function} options.setControlValue
 * @param  {Function} options.show
 *
 * @return {Object}
 */
module.exports = function(options) {
  var id = options.id,
      modelProperties = options.modelProperties,
      labels = options.labels,
      description = options.description;
  var labelRow = createLabelRowTemplate(labels);
  var getElements = options.getElements;
  var removeElement = options.removeElement,
      canRemove = typeof removeElement === 'function';
  var addElement = options.addElement,
      canAdd = typeof addElement === 'function',
      addLabel = options.addLabel || 'Add Value';
  var updateElement = options.updateElement,
      canUpdate = typeof updateElement === 'function';
  var editable = options.editable || function() { return true; },
      setControlValue = options.setControlValue;
  var show = options.show,
      canBeShown = typeof show === 'function';
  var elements = function(element, node) {
    return pick(getElements(element, node), modelProperties);
  };
  var factory = {
    id: id,
    html: (canAdd ?
      '<div class="bpp-table-add-row" ' + (canBeShown ? 'data-show="show"' : '') + '>' +
            '<label>' + escapeHTML(addLabel) + '</label>' +
            '<button class="add" data-action="addElement"><span>+</span></button>' +
          '</div>' : '') +
          '<div class="bpp-table" data-show="showTable">' +
            '<div class="bpp-field-wrapper bpp-table-row">' +
               labelRow +
            '</div>' +
            '<div data-list-entry-container>' +
            '</div>' +
          '</div>' +
          // add description below table entry field
          (description ? entryFieldDescription(description) : ''),
    get: function(element, node) {
      var boElements = elements(element, node, this.__invalidValues);
      var invalidValues = this.__invalidValues;
      delete this.__invalidValues;
      forEach(invalidValues, function(value, idx) {
        var element = boElements[idx];
        forEach(modelProperties, function(prop) {
          element[prop] = value[prop];
        });
      });
      return boElements;
    },
    set: function(element, values, node) {
      var action = this.__action || {};
      delete this.__action;
      if (action.id === 'delete-element') {
        return removeElement(element, node, action.idx);
      }
      else if (action.id === 'add-element') {
        return addElement(element, node);
      }
      else if (canUpdate) {
        var commands = [],
            valuesToValidate = values;
        if (typeof options.validate !== 'function') {
          valuesToValidate = diff(element, node, values, elements(element, node), editable);
        }
        var self = this;
        forEach(valuesToValidate, function(value) {
          var validationError,
              idx = values.indexOf(value);
          if (typeof options.validate === 'function') {
            validationError = options.validate(element, value, node, idx);
          }
          if (!validationError) {
            var cmd = updateElement(element, value, node, idx);
            if (cmd) {
              commands.push(cmd);
            }
          } else {
            // cache invalid value in an object by index as key
            self.__invalidValues = self.__invalidValues || {};
            self.__invalidValues[idx] = value;
            // execute a command, which does not do anything
            commands.push(cmdHelper.updateProperties(element, {}));
          }
        });
        return commands;
      }
    },
    createListEntryTemplate: function(value, index, selectBox) {
      return createInputRowTemplate(modelProperties, canRemove);
    },
    addElement: function(element, node, event, scopeNode) {
      var template = domify(createInputRowTemplate(modelProperties, canRemove));
      var container = getContainer(node);
      container.appendChild(template);
      this.__action = {
        id: 'add-element'
      };
      return true;
    },
    deleteElement: function(element, node, event, scopeNode) {
      var container = getContainer(node);
      var rowToDelete = event.delegateTarget.parentNode;
      var idx = parseInt(domAttr(rowToDelete, 'data-index'), 10);
      container.removeChild(rowToDelete);
      this.__action = {
        id: 'delete-element',
        idx: idx
      };
      return true;
    },
    editable: function(element, rowNode, input, prop, value, idx) {
      var entryNode = domClosest(rowNode, '[data-entry]');
      return editable(element, entryNode, prop, idx);
    },
    show: function(element, entryNode, node, scopeNode) {
      entryNode = getEntryNode(entryNode);
      return show(element, entryNode, node, scopeNode);
    },
    showTable: function(element, entryNode, node, scopeNode) {
      entryNode = getEntryNode(entryNode);
      var elems = elements(element, entryNode);
      return elems && elems.length && (!canBeShown || show(element, entryNode, node, scopeNode));
    },
    validateListItem: function(element, value, node, idx) {
      if (typeof options.validate === 'function') {
        return options.validate(element, value, node, idx);
      }
    }
  };
  // Update/set the selection on the correct position.
  // It's the same code like for an input value in the PropertiesPanel.js.
  if (setControlValue) {
    factory.setControlValue = function(element, rowNode, input, prop, value, idx) {
      var entryNode = getEntryNode(rowNode);
      var isReadOnly = domAttr(input, 'readonly');
      var oldValue = input.value;
      var selection;
      // prevents input fields from having the value 'undefined'
      if (value === undefined) {
        value = '';
      }
      // when the attribute 'readonly' exists, ignore the comparison
      // with 'oldValue' and 'value'
      if (!!isReadOnly && oldValue === value) {
        return;
      }
      // update selection on undo/redo
      if (document.activeElement === input) {
        selection = updateSelection(getSelection(input), oldValue, value);
      }
      setControlValue(element, entryNode, input, prop, value, idx);
      if (selection) {
        setSelection(input, selection);
      }
    };
  }
  return factory;
};
ruoyi-bpmnjs/resources/properties-panel/factory/TextBoxEntryFactory.js
New file
@@ -0,0 +1,42 @@
'use strict';
var escapeHTML = require('../Utils').escapeHTML;
var entryFieldDescription = require('./EntryFieldDescription');
var textBox = function(options, defaultParameters) {
  var resource = defaultParameters,
      label = options.label || resource.id,
      canBeShown = !!options.show && typeof options.show === 'function',
      description = options.description;
  resource.html =
    '<label for="activiti-' + escapeHTML(resource.id) + '" ' +
    (canBeShown ? 'data-show="isShown"' : '') +
    '>' + label + '</label>' +
    '<div class="bpp-field-wrapper" ' +
    (canBeShown ? 'data-show="isShown"' : '') +
    '>' +
      '<div contenteditable="true" id="activiti-' + escapeHTML(resource.id) + '" ' +
            'name="' + escapeHTML(options.modelProperty) + '" />' +
    '</div>';
  // add description below text box entry field
  if (description) {
    resource.html += entryFieldDescription(description);
  }
  if (canBeShown) {
    resource.isShown = function() {
      return options.show.apply(resource, arguments);
    };
  }
  resource.cssClasses = ['bpp-textbox'];
  return resource;
};
module.exports = textBox;
ruoyi-bpmnjs/resources/properties-panel/factory/TextInputEntryFactory.js
New file
@@ -0,0 +1,85 @@
'use strict';
var escapeHTML = require('../Utils').escapeHTML;
var domQuery = require('min-dom').query;
var entryFieldDescription = require('./EntryFieldDescription');
var textField = function(options, defaultParameters) {
  // Default action for the button next to the input-field
  var defaultButtonAction = function(element, inputNode) {
    var input = domQuery('input[name="' + options.modelProperty + '"]', inputNode);
    input.value = '';
    return true;
  };
  // default method to determine if the button should be visible
  var defaultButtonShow = function(element, inputNode) {
    var input = domQuery('input[name="' + options.modelProperty + '"]', inputNode);
    return input.value !== '';
  };
  var resource = defaultParameters,
      label = options.label || resource.id,
      dataValueLabel = options.dataValueLabel,
      buttonLabel = (options.buttonLabel || 'X'),
      actionName = (typeof options.buttonAction != 'undefined') ? options.buttonAction.name : 'clear',
      actionMethod = (typeof options.buttonAction != 'undefined') ? options.buttonAction.method : defaultButtonAction,
      showName = (typeof options.buttonShow != 'undefined') ? options.buttonShow.name : 'canClear',
      showMethod = (typeof options.buttonShow != 'undefined') ? options.buttonShow.method : defaultButtonShow,
      canBeDisabled = !!options.disabled && typeof options.disabled === 'function',
      canBeHidden = !!options.hidden && typeof options.hidden === 'function',
      description = options.description;
  resource.html =
    '<label for="activiti-' + escapeHTML(resource.id) + '" ' +
      (canBeDisabled ? 'data-disable="isDisabled" ' : '') +
      (canBeHidden ? 'data-show="isHidden" ' : '') +
      (dataValueLabel ? 'data-value="' + escapeHTML(dataValueLabel) + '"' : '') + '>'+ escapeHTML(label) +'</label>' +
    '<div class="bpp-field-wrapper" ' +
      (canBeDisabled ? 'data-disable="isDisabled"' : '') +
      (canBeHidden ? 'data-show="isHidden"' : '') +
      '>' +
      '<input id="activiti-' + escapeHTML(resource.id) + '" type="text" name="' + escapeHTML(options.modelProperty) + '" ' +
        (canBeDisabled ? 'data-disable="isDisabled"' : '') +
        (canBeHidden ? 'data-show="isHidden"' : '') +
        ' />' +
      '<button class="' + escapeHTML(actionName) + '" data-action="' + escapeHTML(actionName) + '" data-show="' + escapeHTML(showName) + '" ' +
        (canBeDisabled ? 'data-disable="isDisabled"' : '') +
        (canBeHidden ? ' data-show="isHidden"' : '') + '>' +
        '<span>' + escapeHTML(buttonLabel) + '</span>' +
      '</button>' +
    '</div>';
  // add description below text input entry field
  if (description) {
    resource.html += entryFieldDescription(description);
  }
  resource[actionName] = actionMethod;
  resource[showName] = showMethod;
  if (canBeDisabled) {
    resource.isDisabled = function() {
      return options.disabled.apply(resource, arguments);
    };
  }
  if (canBeHidden) {
    resource.isHidden = function() {
      return !options.hidden.apply(resource, arguments);
    };
  }
  resource.cssClasses = ['bpp-textfield'];
  return resource;
};
module.exports = textField;
ruoyi-bpmnjs/resources/properties-panel/factory/ValidationAwareTextInput.js
New file
@@ -0,0 +1,56 @@
'use strict';
var textField = require('./TextInputEntryFactory');
/**
 * This function is a wrapper around TextInputEntryFactory.
 * It adds functionality to cache an invalid value entered in the
 * text input, instead of setting it on the business object.
 */
var validationAwareTextField = function(options, defaultParameters) {
  var modelProperty = options.modelProperty;
  defaultParameters.get = function(element, node) {
    var value = this.__lastInvalidValue;
    delete this.__lastInvalidValue;
    var properties = {};
    properties[modelProperty] = value !== undefined ? value : options.getProperty(element, node);
    return properties;
  };
  defaultParameters.set = function(element, values, node) {
    var validationErrors = validate.apply(this, [ element, values, node ]),
        propertyValue = values[modelProperty];
    // make sure we do not update the id
    if (validationErrors && validationErrors[modelProperty]) {
      this.__lastInvalidValue = propertyValue;
      return options.setProperty(element, {}, node);
    } else {
      var properties = {};
      properties[modelProperty] = propertyValue;
      return options.setProperty(element, properties, node);
    }
  };
  var validate = defaultParameters.validate = function(element, values, node) {
    var value = values[modelProperty] || this.__lastInvalidValue;
    var property = {};
    property[modelProperty] = value;
    return options.validate(element, property, node);
  };
  return textField(options, defaultParameters);
};
module.exports = validationAwareTextField;
ruoyi-bpmnjs/resources/properties-panel/helper/AsyncCapableHelper.js
New file
@@ -0,0 +1,76 @@
'use strict';
var map = require('lodash/map');
var extensionElementsHelper = require('./ExtensionElementsHelper');
/**
 * Returns true if the attribute 'activiti:asyncBefore' is set
 * to true.
 *
 * @param  {ModdleElement} bo
 *
 * @return {boolean} a boolean value
 */
function isAsyncBefore(bo) {
  return !!(bo.get('activiti:asyncBefore') || bo.get('activiti:async'));
}
module.exports.isAsyncBefore = isAsyncBefore;
/**
 * Returns true if the attribute 'activiti:asyncAfter' is set
 * to true.
 *
 * @param  {ModdleElement} bo
 *
 * @return {boolean} a boolean value
 */
function isAsyncAfter(bo) {
  return !!bo.get('activiti:asyncAfter');
}
module.exports.isAsyncAfter = isAsyncAfter;
/**
 * Returns true if the attribute 'activiti:exclusive' is set
 * to true.
 *
 * @param  {ModdleElement} bo
 *
 * @return {boolean} a boolean value
 */
function isExclusive(bo) {
  return !!bo.get('activiti:exclusive');
}
module.exports.isExclusive = isExclusive;
/**
 * Get first 'activiti:FailedJobRetryTimeCycle' from the business object.
 *
 * @param  {ModdleElement} bo
 *
 * @return {Array<ModdleElement>} a list of 'activiti:FailedJobRetryTimeCycle'
 */
function getFailedJobRetryTimeCycle(bo) {
  return (extensionElementsHelper.getExtensionElements(bo, 'activiti:FailedJobRetryTimeCycle') || [])[0];
}
module.exports.getFailedJobRetryTimeCycle = getFailedJobRetryTimeCycle;
/**
 * Removes all existing 'activiti:FailedJobRetryTimeCycle' from the business object
 *
 * @param  {ModdleElement} bo
 *
 * @return {Array<ModdleElement>} a list of 'activiti:FailedJobRetryTimeCycle'
 */
function removeFailedJobRetryTimeCycle(bo, element) {
  var retryTimeCycles = extensionElementsHelper.getExtensionElements(bo, 'activiti:FailedJobRetryTimeCycle');
  return map(retryTimeCycles, function(cycle) {
    return extensionElementsHelper.removeEntry(bo, element, cycle);
  });
}
module.exports.removeFailedJobRetryTimeCycle = removeFailedJobRetryTimeCycle;
ruoyi-bpmnjs/resources/properties-panel/helper/CategoryHelper.js
New file
@@ -0,0 +1,31 @@
'use strict';
var collectionAdd = require('diagram-js/lib/util/Collections').add,
    getBusinessObject = require('bpmn-js/lib/util/ModelUtil').getBusinessObject;
var CategoryHelper = {};
module.exports = CategoryHelper;
/**
 * Creates a new bpmn:CategoryValue inside a new bpmn:Category
 *
 * @param {ModdleElement} definitions
 * @param {BpmnFactory} bpmnFactory
 *
 * @return {ModdleElement} categoryValue.
 */
CategoryHelper.createCategoryValue = function(definitions, bpmnFactory) {
  var categoryValue = bpmnFactory.create('bpmn:CategoryValue'),
      category = bpmnFactory.create('bpmn:Category', {
        categoryValue: [ categoryValue ]
      });
  // add to correct place
  collectionAdd(definitions.get('rootElements'), category);
  getBusinessObject(category).$parent = definitions;
  getBusinessObject(categoryValue).$parent = category;
  return categoryValue;
};
ruoyi-bpmnjs/resources/properties-panel/helper/CmdHelper.js
New file
@@ -0,0 +1,77 @@
'use strict';
var CmdHelper = {};
module.exports = CmdHelper;
CmdHelper.updateProperties = function(element, properties) {
  return {
    cmd: 'element.updateProperties',
    context: { element: element, properties: properties }
  };
};
CmdHelper.updateBusinessObject = function(element, businessObject, newProperties) {
  return {
    cmd: 'properties-panel.update-businessobject',
    context: {
      element: element,
      businessObject: businessObject,
      properties: newProperties
    }
  };
};
CmdHelper.addElementsTolist = function(element, businessObject, listPropertyName, objectsToAdd) {
  return {
    cmd: 'properties-panel.update-businessobject-list',
    context: {
      element: element,
      currentObject: businessObject,
      propertyName: listPropertyName,
      objectsToAdd: objectsToAdd
    }
  };
};
CmdHelper.removeElementsFromList = function(element, businessObject, listPropertyName, referencePropertyName, objectsToRemove) {
  return {
    cmd: 'properties-panel.update-businessobject-list',
    context: {
      element: element,
      currentObject: businessObject,
      propertyName: listPropertyName,
      referencePropertyName: referencePropertyName,
      objectsToRemove: objectsToRemove
    }
  };
};
CmdHelper.addAndRemoveElementsFromList = function(element, businessObject, listPropertyName, referencePropertyName, objectsToAdd, objectsToRemove) {
  return {
    cmd: 'properties-panel.update-businessobject-list',
    context: {
      element: element,
      currentObject: businessObject,
      propertyName: listPropertyName,
      referencePropertyName: referencePropertyName,
      objectsToAdd: objectsToAdd,
      objectsToRemove: objectsToRemove
    }
  };
};
CmdHelper.setList = function(element, businessObject, listPropertyName, updatedObjectList) {
  return {
    cmd: 'properties-panel.update-businessobject-list',
    context: {
      element: element,
      currentObject: businessObject,
      propertyName: listPropertyName,
      updatedObjectList: updatedObjectList
    }
  };
};
ruoyi-bpmnjs/resources/properties-panel/helper/ElementHelper.js
New file
@@ -0,0 +1,23 @@
'use strict';
var ElementHelper = {};
module.exports = ElementHelper;
/**
 * Creates a new element and set the parent to it
 *
 * @method ElementHelper#createElement
 *
 * @param {String} elementType of the new element
 * @param {Object} properties of the new element in key-value pairs
 * @param {moddle.object} parent of the new element
 * @param {BpmnFactory} factory which creates the new element
 *
 * @returns {djs.model.Base} element which is created
 */
ElementHelper.createElement = function(elementType, properties, parent, factory) {
  var element = factory.create(elementType, properties);
  element.$parent = parent;
  return element;
};
ruoyi-bpmnjs/resources/properties-panel/helper/EventDefinitionHelper.js
New file
@@ -0,0 +1,57 @@
'use strict';
var getBusinessObject = require('bpmn-js/lib/util/ModelUtil').getBusinessObject,
    is = require('bpmn-js/lib/util/ModelUtil').is,
    forEach = require('lodash/forEach');
var EventDefinitionHelper = {};
module.exports = EventDefinitionHelper;
EventDefinitionHelper.getEventDefinition = function(element, eventType) {
  var bo = getBusinessObject(element),
      eventDefinition = null;
  if (bo.eventDefinitions) {
    forEach(bo.eventDefinitions, function(event) {
      if (is(event, eventType)) {
        eventDefinition = event;
      }
    });
  }
  return eventDefinition;
};
EventDefinitionHelper.getTimerEventDefinition = function(element) {
  return this.getEventDefinition(element, 'bpmn:TimerEventDefinition');
};
EventDefinitionHelper.getMessageEventDefinition = function(element) {
  return this.getEventDefinition(element, 'bpmn:MessageEventDefinition');
};
EventDefinitionHelper.getSignalEventDefinition = function(element) {
  return this.getEventDefinition(element, 'bpmn:SignalEventDefinition');
};
EventDefinitionHelper.getErrorEventDefinition = function(element) {
  return this.getEventDefinition(element, 'bpmn:ErrorEventDefinition');
};
EventDefinitionHelper.getEscalationEventDefinition = function(element) {
  return this.getEventDefinition(element, 'bpmn:EscalationEventDefinition');
};
EventDefinitionHelper.getCompensateEventDefinition = function(element) {
  return this.getEventDefinition(element, 'bpmn:CompensateEventDefinition');
};
EventDefinitionHelper.getLinkEventDefinition = function(element) {
  return this.getEventDefinition(element, 'bpmn:LinkEventDefinition');
};
EventDefinitionHelper.getConditionalEventDefinition = function(element) {
  return this.getEventDefinition(element, 'bpmn:ConditionalEventDefinition');
};
ruoyi-bpmnjs/resources/properties-panel/helper/ExtensionElementsHelper.js
New file
@@ -0,0 +1,55 @@
'use strict';
var cmdHelper = require('./CmdHelper'),
    elementHelper = require('./ElementHelper');
var is = require('bpmn-js/lib/util/ModelUtil').is;
var ExtensionElementsHelper = {};
var getExtensionElements = function(bo) {
  return bo.get('extensionElements');
};
ExtensionElementsHelper.getExtensionElements = function(bo, type) {
  var extensionElements = getExtensionElements(bo);
  if (typeof extensionElements !== 'undefined') {
    var extensionValues = extensionElements.get('values');
    if (typeof extensionValues !== 'undefined') {
      var elements = extensionValues.filter(function(value) {
        return is(value, type);
      });
      if (elements.length) {
        return elements;
      }
    }
  }
};
ExtensionElementsHelper.addEntry = function(bo, element, entry, bpmnFactory) {
  var extensionElements = bo.get('extensionElements');
  // if there is no extensionElements list, create one
  if (!extensionElements) {
    // TODO: Ask Daniel which operation costs more
    extensionElements = elementHelper.createElement('bpmn:ExtensionElements', { values: [entry] }, bo, bpmnFactory);
    return { extensionElements : extensionElements };
  } else {
    // add new failedJobRetryExtensionElement to existing extensionElements list
    return cmdHelper.addElementsTolist(element, extensionElements, 'values', [entry]);
  }
};
ExtensionElementsHelper.removeEntry = function(bo, element, entry) {
  var extensionElements = bo.get('extensionElements');
  if (!extensionElements) {
    // return an empty command when there is no extensionElements list
    return {};
  }
  return cmdHelper.removeElementsFromList(element, extensionElements, 'values', 'extensionElements', [entry]);
};
module.exports = ExtensionElementsHelper;
ruoyi-bpmnjs/resources/properties-panel/helper/FormHelper.js
New file
@@ -0,0 +1,97 @@
'use strict';
var getBusinessObject = require('bpmn-js/lib/util/ModelUtil').getBusinessObject,
    getExtensionElements = require('./ExtensionElementsHelper').getExtensionElements;
var FormHelper = {};
module.exports = FormHelper;
/**
 * Return form data from business object or undefined if none exist
 *
 * @param  {djs.model.Base} element
 *
 * @return {ModdleElement|undefined} formData
 *
 * 此方法废弃
 *
 */
FormHelper.getFormData = function(element) {
 /* var bo = getBusinessObject(element);
  var formFields = getExtensionElements(bo, 'activiti:FormProperty');
  var formData = {}
  if (typeof formData !== 'undefined') {
    return formData[0];
  }*/
 return {};
};
/**
 * Return all form fields existing in the business object, and
 * an empty array if none exist.
 *
 * @param  {djs.model.Base} element
 *
 * @return {Array} a list of form field objects
 */
FormHelper.getFormFields = function(element) {
  /**直接获取 ExtensionElements的 activiti:FormProperty元素*/
  var bo = getBusinessObject(element);
  var formFields = getExtensionElements(bo, 'activiti:FormProperty');
  return formFields || [];
};
/**
 * Get a form field from the business object at given index
 *
 * @param {djs.model.Base} element
 * @param {number} idx
 *
 * @return {ModdleElement} the form field
 */
FormHelper.getFormField = function(element, idx) {
  var formFields = this.getFormFields(element);
  return formFields[idx];
};
/**
 * Get all constraints for a specific form field from the business object
 *
 * @param  {ModdleElement} formField
 *
 * @return {Array<ModdleElement>} a list of constraint objects
 */
FormHelper.getConstraints = function(formField) {
  if (formField && formField.validation && formField.validation.constraints) {
    return formField.validation.constraints;
  }
  return [];
};
/**
 * Get all activiti:value objects for a specific form field from the business object
 *
 * @param  {ModdleElement} formField
 *
 * @return {Array<ModdleElement>} a list of activiti:value objects
 */
FormHelper.getEnumValues = function(formField) {
  if (formField && formField.values) {
    return formField.values;
  }
  return [];
};
ruoyi-bpmnjs/resources/properties-panel/helper/ImplementationTypeHelper.js
New file
@@ -0,0 +1,192 @@
'use strict';
var ModelUtil = require('bpmn-js/lib/util/ModelUtil'),
    is = ModelUtil.is,
    getBusinessObject = ModelUtil.getBusinessObject;
var eventDefinitionHelper = require('./EventDefinitionHelper');
var extensionsElementHelper = require('./ExtensionElementsHelper');
var ImplementationTypeHelper = {};
module.exports = ImplementationTypeHelper;
/**
 * Returns 'true' if the given element is 'activiti:ServiceTaskLike'
 *
 * @param {djs.model.Base} element
 *
 * @return {boolean} a boolean value
 */
ImplementationTypeHelper.isServiceTaskLike = function(element) {
  return is(element, 'activiti:ServiceTaskLike');
};
/**
 * Returns 'true' if the given element is 'activiti:DmnCapable'
 *
 * @param {djs.model.Base} element
 *
 * @return {boolean} a boolean value
 */
ImplementationTypeHelper.isDmnCapable = function(element) {
  return is(element, 'activiti:DmnCapable');
};
/**
 * Returns 'true' if the given element is 'activiti:ExternalCapable'
 *
 * @param {djs.model.Base} element
 *
 * @return {boolean} a boolean value
 */
ImplementationTypeHelper.isExternalCapable = function(element) {
  return is(element, 'activiti:ExternalCapable');
};
/**
 * Returns 'true' if the given element is 'activiti:TaskListener'
 *
 * @param {djs.model.Base} element
 *
 * @return {boolean} a boolean value
 */
ImplementationTypeHelper.isTaskListener = function(element) {
  return is(element, 'activiti:TaskListener');
};
/**
 * Returns 'true' if the given element is 'activiti:ExecutionListener'
 *
 * @param {djs.model.Base} element
 *
 * @return {boolean} a boolean value
 */
ImplementationTypeHelper.isExecutionListener = function(element) {
  return is(element, 'activiti:ExecutionListener');
};
/**
 * Returns 'true' if the given element is 'activiti:ExecutionListener' or
 * 'activiti:TaskListener'
 *
 * @param {djs.model.Base} element
 *
 * @return {boolean} a boolean value
 */
ImplementationTypeHelper.isListener = function(element) {
  return this.isTaskListener(element) || this.isExecutionListener(element);
};
/**
 * Returns 'true' if the given element is 'bpmn:SequenceFlow'
 *
 * @param {djs.model.Base} element
 *
 * @return {boolean} a boolean value
 */
ImplementationTypeHelper.isSequenceFlow = function(element) {
  return is(element, 'bpmn:SequenceFlow');
};
/**
 * Get a 'activiti:ServiceTaskLike' business object.
 *
 * If the given element is not a 'activiti:ServiceTaskLike', then 'false'
 * is returned.
 *
 * @param {djs.model.Base} element
 *
 * @return {ModdleElement} the 'activiti:ServiceTaskLike' business object
 */
ImplementationTypeHelper.getServiceTaskLikeBusinessObject = function(element) {
  if (is(element, 'bpmn:IntermediateThrowEvent') || is(element, 'bpmn:EndEvent')) {
    // change business object to 'messageEventDefinition' when
    // the element is a message intermediate throw event or message end event
    // because the activiti extensions (e.g. activiti:class) are in the message
    // event definition tag and not in the intermediate throw event or end event tag
    var messageEventDefinition = eventDefinitionHelper.getMessageEventDefinition(element);
    if (messageEventDefinition) {
      element = messageEventDefinition;
    }
  }
  return this.isServiceTaskLike(element) && getBusinessObject(element);
};
/**
 * Returns the implementation type of the given element.
 *
 * Possible implementation types are:
 * - dmn
 * - connector
 * - external
 * - class
 * - expression
 * - delegateExpression
 * - script
 * - or undefined, when no matching implementation type is found
 *
 * @param  {djs.model.Base} element
 *
 * @return {String} the implementation type
 */
ImplementationTypeHelper.getImplementationType = function(element) {
  var bo = this.getServiceTaskLikeBusinessObject(element);
  if (!bo) {
    if (this.isListener(element)) {
      bo = element;
    } else {
      return;
    }
  }
  if (this.isDmnCapable(bo)) {
    var decisionRef = bo.get('activiti:decisionRef');
    if (typeof decisionRef !== 'undefined') {
      return 'dmn';
    }
  }
  if (this.isServiceTaskLike(bo)) {
    var connectors = extensionsElementHelper.getExtensionElements(bo, 'activiti:Connector');
    if (typeof connectors !== 'undefined') {
      return 'connector';
    }
  }
  if (this.isExternalCapable(bo)) {
    var type = bo.get('activiti:type');
    if (type === 'external') {
      return 'external';
    }
  }
  var cls = bo.get('activiti:class');
  if (typeof cls !== 'undefined') {
    return 'class';
  }
  var expression = bo.get('activiti:expression');
  if (typeof expression !== 'undefined') {
    return 'expression';
  }
  var delegateExpression = bo.get('activiti:delegateExpression');
  if (typeof delegateExpression !== 'undefined') {
    return 'delegateExpression';
  }
  if (this.isListener(bo)) {
    var script = bo.get('script');
    if (typeof script !== 'undefined') {
      return 'script';
    }
  }
};
ruoyi-bpmnjs/resources/properties-panel/helper/InputOutputHelper.js
New file
@@ -0,0 +1,144 @@
'use strict';
var ModelUtil = require('bpmn-js/lib/util/ModelUtil'),
    is = ModelUtil.is,
    getBusinessObject = ModelUtil.getBusinessObject;
var extensionElementsHelper = require('./ExtensionElementsHelper'),
    implementationTypeHelper = require('./ImplementationTypeHelper');
var InputOutputHelper = {};
module.exports = InputOutputHelper;
function getElements(bo, type, prop) {
  var elems = extensionElementsHelper.getExtensionElements(bo, type) || [];
  return !prop ? elems : (elems[0] || {})[prop] || [];
}
function getParameters(element, prop, insideConnector) {
  var inputOutput = InputOutputHelper.getInputOutput(element, insideConnector);
  return (inputOutput && inputOutput.get(prop)) || [];
}
/**
 * Get a inputOutput from the business object
 *
 * @param {djs.model.Base} element
 * @param  {boolean} insideConnector
 *
 * @return {ModdleElement} the inputOutput object
 */
InputOutputHelper.getInputOutput = function(element, insideConnector) {
  if (!insideConnector) {
    var bo = getBusinessObject(element);
    return (getElements(bo, 'activiti:InputOutput') || [])[0];
  }
  var connector = this.getConnector(element);
  return connector && connector.get('inputOutput');
};
/**
 * Get a connector from the business object
 *
 * @param {djs.model.Base} element
 *
 * @return {ModdleElement} the connector object
 */
InputOutputHelper.getConnector = function(element) {
  var bo = implementationTypeHelper.getServiceTaskLikeBusinessObject(element);
  return bo && (getElements(bo, 'activiti:Connector') || [])[0];
};
/**
 * Return all input parameters existing in the business object, and
 * an empty array if none exist.
 *
 * @param  {djs.model.Base} element
 * @param  {boolean} insideConnector
 *
 * @return {Array} a list of input parameter objects
 */
InputOutputHelper.getInputParameters = function(element, insideConnector) {
  return getParameters.apply(this, [ element, 'inputParameters', insideConnector ]);
};
/**
 * Return all output parameters existing in the business object, and
 * an empty array if none exist.
 *
 * @param  {djs.model.Base} element
 * @param  {boolean} insideConnector
 *
 * @return {Array} a list of output parameter objects
 */
InputOutputHelper.getOutputParameters = function(element, insideConnector) {
  return getParameters.apply(this, [ element, 'outputParameters', insideConnector ]);
};
/**
 * Get a input parameter from the business object at given index
 *
 * @param {djs.model.Base} element
 * @param  {boolean} insideConnector
 * @param {number} idx
 *
 * @return {ModdleElement} input parameter
 */
InputOutputHelper.getInputParameter = function(element, insideConnector, idx) {
  return this.getInputParameters(element, insideConnector)[idx];
};
/**
 * Get a output parameter from the business object at given index
 *
 * @param {djs.model.Base} element
 * @param  {boolean} insideConnector
 * @param {number} idx
 *
 * @return {ModdleElement} output parameter
 */
InputOutputHelper.getOutputParameter = function(element, insideConnector, idx) {
  return this.getOutputParameters(element, insideConnector)[idx];
};
/**
 * Returns 'true' if the given element supports inputOutput
 *
 * @param {djs.model.Base} element
 * @param  {boolean} insideConnector
 *
 * @return {boolean} a boolean value
 */
InputOutputHelper.isInputOutputSupported = function(element, insideConnector) {
  if (insideConnector) {
    return true;
  }
  var bo = getBusinessObject(element);
  return (
    is(bo, 'bpmn:FlowNode') && !(
      is(bo, 'bpmn:StartEvent') ||
      is(bo, 'bpmn:Gateway') ||
      is(bo, 'bpmn:BoundaryEvent') ||
      (
        is(bo, 'bpmn:SubProcess') && bo.get('triggeredByEvent')
      )
    )
  );
};
/**
 * Returns 'true' if the given element supports output parameters
 *
 * @param {djs.model.Base} element
 * @param  {boolean} insideConnector
 *
 * @return {boolean} a boolean value
 */
InputOutputHelper.areOutputParametersSupported = function(element, insideConnector) {
  var bo = getBusinessObject(element);
  return insideConnector || (!is(bo, 'bpmn:EndEvent') && !bo.loopCharacteristics);
};
ruoyi-bpmnjs/resources/properties-panel/helper/ParticipantHelper.js
New file
@@ -0,0 +1,36 @@
'use strict';
var is = require('bpmn-js/lib/util/ModelUtil').is,
    getBusinessObject = require('bpmn-js/lib/util/ModelUtil').getBusinessObject,
    cmdHelper = require('./CmdHelper');
var ParticipantHelper = {};
module.exports = ParticipantHelper;
ParticipantHelper.modifyProcessBusinessObject = function(element, property, values) {
  if (!is(element, 'bpmn:Participant')) {
    return {};
  }
  var bo = getBusinessObject(element).get('processRef'),
      properties = {};
  properties[property] = values[property];
  return cmdHelper.updateBusinessObject(element, bo, properties);
};
ParticipantHelper.getProcessBusinessObject = function(element, propertyName) {
  if (!is(element, 'bpmn:Participant')) {
    return {};
  }
  var bo = getBusinessObject(element).get('processRef'),
      properties = {};
  properties[propertyName] = bo.get(propertyName);
  return properties;
};
ruoyi-bpmnjs/resources/properties-panel/index.js
New file
@@ -0,0 +1,8 @@
module.exports = {
  __depends__: [
    require('./index'),
    require('diagram-js/lib/i18n/translate').default
  ],
  __init__: [ 'propertiesPanel' ],
  propertiesPanel: [ 'type', require('./PropertiesPanel') ]
};
ruoyi-bpmnjs/resources/properties-panel/popup.js
New file
@@ -0,0 +1,103 @@
'use strict';
var domQuery = require('min-dom').query,
    domClasses = require('min-dom').classes,
    domify = require('min-dom').domify,
    bind = require('lodash/bind');
/**
 * @class
 * @constructor
 */
function Popup(options) {
  options = options || {};
  this.template = options.template || this.template;
  var el = this.el = domify(this.template);
  this.header = domQuery('.popup-header', el);
  this.body = domQuery('.popup-body', el);
  this.footer = domQuery('.popup-footer', el);
  document.body.appendChild(el);
  this._attachEvents();
}
Popup.prototype.template = '<div class="bpp-properties-panel-popup">' +
                              '<div class="underlay"></div>' +
                              '<div class="popup">' +
                                '<button class="popup-close"><span>Close</span></button>' +
                                '<div class="popup-header"></div>' +
                                '<div class="popup-body"></div>' +
                                '<div class="popup-footer"></div>' +
                              '</div>' +
                            '</div>';
Popup.prototype._attachEvents = function() {
  var self = this;
  var events = this.events;
  var el = this.el;
  Object.keys(events).forEach(function(instruction) {
    var cb = bind(self[events[instruction]], self);
    var parts = instruction.split(' ');
    var evtName = parts.shift();
    var target = parts.length ? parts.shift() : false;
    target = target ? domQuery(target, el) : el;
    if (!target) { return; }
    target.addEventListener(evtName, cb);
  });
};
Popup.prototype._detachEvents = function() {
  var self = this;
  var events = this.events;
  var el = this.el;
  Object.keys(events).forEach(function(instruction) {
    var cb = bind(self[events[instruction]], self);
    var parts = instruction.split(' ');
    var evtName = parts.shift();
    var target = parts.length ? parts.shift() : false;
    target = target ? domQuery(target, el) : el;
    if (!target) { return; }
    target.removeEventListener(evtName, cb);
  });
};
Popup.prototype.events = {
  // 'keydown:esc':        '_handleClose',
  'click .underlay': '_handleClose',
  'click .popup-close': '_handleClose'
};
Popup.prototype._handleClose = function(evt) {
  this.close();
};
Popup.prototype.open = function(content) {
  domClasses(this.el).add('open');
};
Popup.prototype.close = function() {
  domClasses(this.el).remove('open');
};
Popup.prototype.remove = function() {
  this._detachEvents();
  if (document.body.contains(this.el)) {
    document.body.removeChild(this.el);
  }
};
var popup;
module.exports = function() {
  if (!popup) {
    popup = new Popup();
  }
  return popup;
};
ruoyi-bpmnjs/resources/properties-panel/provider/activiti/ActivitiPropertiesProvider.js
New file
@@ -0,0 +1,542 @@
'use strict';
var inherits = require('inherits');
var PropertiesActivator = require('../../PropertiesActivator');
var asyncCapableHelper = require('../../helper/AsyncCapableHelper'),
    ImplementationTypeHelper = require('../../helper/ImplementationTypeHelper');
var is = require('bpmn-js/lib/util/ModelUtil').is;
// bpmn properties
var processProps = require('../../provider/bpmn/parts/ProcessProps'),
    eventProps = require('../../provider/bpmn/parts/EventProps'),
    linkProps = require('../../provider/bpmn/parts/LinkProps'),
    documentationProps = require('../../provider/bpmn/parts/DocumentationProps'),
    idProps = require('../../provider/bpmn/parts/IdProps'),
    nameProps = require('../../provider/bpmn/parts/NameProps'),
    executableProps = require('../../provider/bpmn/parts/ExecutableProps');
// activiti properties
var serviceTaskDelegateProps = require('./parts/ServiceTaskDelegateProps'),
    userTaskProps = require('./parts/UserTaskProps'),
    asynchronousContinuationProps = require('./parts/AsynchronousContinuationProps'),
    callActivityProps = require('./parts/CallActivityProps'),
    multiInstanceProps = require('./parts/MultiInstanceLoopProps'),
    conditionalProps = require('./parts/ConditionalProps'),
    scriptProps = require('./parts/ScriptTaskProps'),
    errorProps = require('./parts/ErrorEventProps'),
    formProps = require('./parts/FormProps'),
    startEventInitiator = require('./parts/StartEventInitiator'),
    variableMapping = require('./parts/VariableMappingProps'),
    versionTag = require('./parts/VersionTagProps');
var listenerProps = require('./parts/ListenerProps'),
    listenerDetails = require('./parts/ListenerDetailProps'),
    listenerFields = require('./parts/ListenerFieldInjectionProps');
var elementTemplateChooserProps = require('./element-templates/parts/ChooserProps'),
    elementTemplateCustomProps = require('./element-templates/parts/CustomProps');
// Input/Output
var inputOutput = require('./parts/InputOutputProps'),
    inputOutputParameter = require('./parts/InputOutputParameterProps');
// Connector
var connectorDetails = require('./parts/ConnectorDetailProps'),
    connectorInputOutput = require('./parts/ConnectorInputOutputProps'),
    connectorInputOutputParameter = require('./parts/ConnectorInputOutputParameterProps');
// properties
var properties = require('./parts/PropertiesProps');
// job configuration
var jobConfiguration = require('./parts/JobConfigurationProps');
// history time to live
var historyTimeToLive = require('./parts/HistoryTimeToLiveProps');
// candidate starter groups/users
var candidateStarter = require('./parts/CandidateStarterProps');
// tasklist
var tasklist = require('./parts/TasklistProps');
// external task configuration
var externalTaskConfiguration = require('./parts/ExternalTaskConfigurationProps');
// field injection
var fieldInjections = require('./parts/FieldInjectionProps');
var getBusinessObject = require('bpmn-js/lib/util/ModelUtil').getBusinessObject,
    eventDefinitionHelper = require('../../helper/EventDefinitionHelper'),
    implementationTypeHelper = require('../../helper/ImplementationTypeHelper');
// helpers ////////////////////////////////////////
var isExternalTaskPriorityEnabled = function(element) {
  var businessObject = getBusinessObject(element);
  // show only if element is a process, a participant ...
  if (is(element, 'bpmn:Process') || is(element, 'bpmn:Participant') && businessObject.get('processRef')) {
    return true;
  }
  var externalBo = ImplementationTypeHelper.getServiceTaskLikeBusinessObject(element),
      isExternalTask = ImplementationTypeHelper.getImplementationType(externalBo) === 'external';
  // ... or an external task with selected external implementation type
  return !!ImplementationTypeHelper.isExternalCapable(externalBo) && isExternalTask;
};
var isJobConfigEnabled = function(element) {
  var businessObject = getBusinessObject(element);
  if (is(element, 'bpmn:Process') || is(element, 'bpmn:Participant') && businessObject.get('processRef')) {
    return true;
  }
  // async behavior
  var bo = getBusinessObject(element);
  if (asyncCapableHelper.isAsyncBefore(bo) || asyncCapableHelper.isAsyncAfter(bo)) {
    return true;
  }
  // timer definition
  if (is(element, 'bpmn:Event')) {
    return !!eventDefinitionHelper.getTimerEventDefinition(element);
  }
  return false;
};
var getInputOutputParameterLabel = function(param, translate) {
  if (is(param, 'activiti:InputParameter')) {
    return translate('Input Parameter');
  }
  if (is(param, 'activiti:OutputParameter')) {
    return translate('Output Parameter');
  }
  return '';
};
var getListenerLabel = function(param, translate) {
  if (is(param, 'activiti:ExecutionListener')) {
    return translate('Execution Listener');
  }
  if (is(param, 'activiti:TaskListener')) {
    return translate('Task Listener');
  }
  return '';
};
var PROCESS_KEY_HINT = 'This maps to the process definition key.';
var TASK_KEY_HINT = 'This maps to the task definition key.';
function createGeneralTabGroups(
    element, canvas, bpmnFactory,
    elementRegistry, elementTemplates, translate) {
  // refer to target element for external labels
  element = element.labelTarget || element;
  var generalGroup = {
    id: 'general',
    label: translate('General'),
    entries: []
  };
  var idOptions;
  var processOptions;
  if (is(element, 'bpmn:Process')) {
    idOptions = { description: PROCESS_KEY_HINT };
  }
  if (is(element, 'bpmn:UserTask')) {
    idOptions = { description: TASK_KEY_HINT };
  }
  if (is(element, 'bpmn:Participant')) {
    processOptions = { processIdDescription: PROCESS_KEY_HINT };
  }
  idProps(generalGroup, element, translate, idOptions);
  nameProps(generalGroup, element, bpmnFactory, canvas, translate);
  processProps(generalGroup, element, translate, processOptions);
  versionTag(generalGroup, element, translate);
  executableProps(generalGroup, element, translate);
  elementTemplateChooserProps(generalGroup, element, elementTemplates, translate);
  var customFieldsGroups = elementTemplateCustomProps(element, elementTemplates, bpmnFactory, translate);
  var detailsGroup = {
    id: 'details',
    label: translate('Details'),
    entries: []
  };
  serviceTaskDelegateProps(detailsGroup, element, bpmnFactory, translate);
  userTaskProps(detailsGroup, element, translate);
  scriptProps(detailsGroup, element, bpmnFactory, translate);
  linkProps(detailsGroup, element, translate);
  callActivityProps(detailsGroup, element, bpmnFactory, translate);
  eventProps(detailsGroup, element, bpmnFactory, elementRegistry, translate);
  errorProps(detailsGroup, element, bpmnFactory, translate);
  conditionalProps(detailsGroup, element, bpmnFactory, translate);
  startEventInitiator(detailsGroup, element, translate); // this must be the last element of the details group!
  var multiInstanceGroup = {
    id: 'multiInstance',
    label: translate('Multi Instance'),
    entries: []
  };
  multiInstanceProps(multiInstanceGroup, element, bpmnFactory, translate);
  var asyncGroup = {
    id : 'async',
    label: translate('Asynchronous Continuations'),
    entries : []
  };
  asynchronousContinuationProps(asyncGroup, element, bpmnFactory, translate);
  var jobConfigurationGroup = {
    id : 'jobConfiguration',
    label : translate('Job Configuration'),
    entries : [],
    enabled: isJobConfigEnabled
  };
  jobConfiguration(jobConfigurationGroup, element, bpmnFactory, translate);
  var externalTaskGroup = {
    id : 'externalTaskConfiguration',
    label : translate('External Task Configuration'),
    entries : [],
    enabled: isExternalTaskPriorityEnabled
  };
  externalTaskConfiguration(externalTaskGroup, element, bpmnFactory, translate);
  var candidateStarterGroup = {
    id: 'candidateStarterConfiguration',
    label: translate('Candidate Starter Configuration'),
    entries: []
  };
  candidateStarter(candidateStarterGroup, element, bpmnFactory, translate);
  var historyTimeToLiveGroup = {
    id: 'historyConfiguration',
    label: translate('History Configuration'),
    entries: []
  };
  historyTimeToLive(historyTimeToLiveGroup, element, bpmnFactory, translate);
  var tasklistGroup = {
    id: 'tasklist',
    label: translate('Tasklist Configuration'),
    entries: []
  };
  tasklist(tasklistGroup, element, bpmnFactory, translate);
  var documentationGroup = {
    id: 'documentation',
    label: translate('Documentation'),
    entries: []
  };
  documentationProps(documentationGroup, element, bpmnFactory, translate);
  var groups = [];
  groups.push(generalGroup);
  customFieldsGroups.forEach(function(group) {
    groups.push(group);
  });
  groups.push(detailsGroup);
  groups.push(externalTaskGroup);
  groups.push(multiInstanceGroup);
  groups.push(asyncGroup);
  groups.push(jobConfigurationGroup);
  groups.push(candidateStarterGroup);
  groups.push(historyTimeToLiveGroup);
  groups.push(tasklistGroup);
  groups.push(documentationGroup);
  return groups;
}
function createVariablesTabGroups(element, bpmnFactory, elementRegistry, translate) {
  var variablesGroup = {
    id : 'variables',
    label : translate('Variables'),
    entries: []
  };
  variableMapping(variablesGroup, element, bpmnFactory, translate);
  return [
    variablesGroup
  ];
}
function createFormsTabGroups(element, bpmnFactory, elementRegistry, translate) {
  var formGroup = {
    id : 'forms',
    label : translate('Forms'),
    entries: []
  };
  formProps(formGroup, element, bpmnFactory, translate);
  return [
    formGroup
  ];
}
function createListenersTabGroups(element, bpmnFactory, elementRegistry, translate) {
  var listenersGroup = {
    id : 'listeners',
    label: translate('Listeners'),
    entries: []
  };
  var options = listenerProps(listenersGroup, element, bpmnFactory, translate);
  var listenerDetailsGroup = {
    id: 'listener-details',
    entries: [],
    enabled: function(element, node) {
      return options.getSelectedListener(element, node);
    },
    label: function(element, node) {
      var param = options.getSelectedListener(element, node);
      return getListenerLabel(param, translate);
    }
  };
  listenerDetails(listenerDetailsGroup, element, bpmnFactory, options, translate);
  var listenerFieldsGroup = {
    id: 'listener-fields',
    label: translate('Field Injection'),
    entries: [],
    enabled: function(element, node) {
      return options.getSelectedListener(element, node);
    }
  };
  listenerFields(listenerFieldsGroup, element, bpmnFactory, options, translate);
  return [
    listenersGroup,
    listenerDetailsGroup,
    listenerFieldsGroup
  ];
}
function createInputOutputTabGroups(element, bpmnFactory, elementRegistry, translate) {
  var inputOutputGroup = {
    id: 'input-output',
    label: translate('Parameters'),
    entries: []
  };
  var options = inputOutput(inputOutputGroup, element, bpmnFactory, translate);
  var inputOutputParameterGroup = {
    id: 'input-output-parameter',
    entries: [],
    enabled: function(element, node) {
      return options.getSelectedParameter(element, node);
    },
    label: function(element, node) {
      var param = options.getSelectedParameter(element, node);
      return getInputOutputParameterLabel(param, translate);
    }
  };
  inputOutputParameter(inputOutputParameterGroup, element, bpmnFactory, options, translate);
  return [
    inputOutputGroup,
    inputOutputParameterGroup
  ];
}
function createConnectorTabGroups(element, bpmnFactory, elementRegistry, translate) {
  var connectorDetailsGroup = {
    id: 'connector-details',
    label: translate('Details'),
    entries: []
  };
  connectorDetails(connectorDetailsGroup, element, bpmnFactory, translate);
  var connectorInputOutputGroup = {
    id: 'connector-input-output',
    label: translate('Input/Output'),
    entries: []
  };
  var options = connectorInputOutput(connectorInputOutputGroup, element, bpmnFactory, translate);
  var connectorInputOutputParameterGroup = {
    id: 'connector-input-output-parameter',
    entries: [],
    enabled: function(element, node) {
      return options.getSelectedParameter(element, node);
    },
    label: function(element, node) {
      var param = options.getSelectedParameter(element, node);
      return getInputOutputParameterLabel(param, translate);
    }
  };
  connectorInputOutputParameter(connectorInputOutputParameterGroup, element, bpmnFactory, options, translate);
  return [
    connectorDetailsGroup,
    connectorInputOutputGroup,
    connectorInputOutputParameterGroup
  ];
}
function createFieldInjectionsTabGroups(element, bpmnFactory, elementRegistry, translate) {
  var fieldGroup = {
    id: 'field-injections-properties',
    label: translate('Field Injections'),
    entries: []
  };
  fieldInjections(fieldGroup, element, bpmnFactory, translate);
  return [
    fieldGroup
  ];
}
function createExtensionElementsGroups(element, bpmnFactory, elementRegistry, translate) {
  var propertiesGroup = {
    id : 'extensionElements-properties',
    label: translate('Properties'),
    entries: []
  };
  properties(propertiesGroup, element, bpmnFactory, translate);
  return [
    propertiesGroup
  ];
}
// activiti Properties Provider /////////////////////////////////////
/**
 * A properties provider for activiti related properties.
 *
 * @param {EventBus} eventBus
 * @param {Canvas} canvas
 * @param {BpmnFactory} bpmnFactory
 * @param {ElementRegistry} elementRegistry
 * @param {ElementTemplates} elementTemplates
 * @param {Translate} translate
 */
function ActivitiPropertiesProvider(
    eventBus, canvas, bpmnFactory,
    elementRegistry, elementTemplates, translate) {
  PropertiesActivator.call(this, eventBus);
  this.getTabs = function(element) {
    var generalTab = {
      id: 'general',
      label: translate('General'),
      groups: createGeneralTabGroups(
        element, canvas, bpmnFactory,
        elementRegistry, elementTemplates, translate)
    };
    var variablesTab = {
      id: 'variables',
      label: translate('Variables'),
      groups: createVariablesTabGroups(element, bpmnFactory, elementRegistry, translate)
    };
    var formsTab = {
      id: 'forms',
      label: translate('Forms'),
      groups: createFormsTabGroups(element, bpmnFactory, elementRegistry, translate)
    };
    var listenersTab = {
      id: 'listeners',
      label: translate('Listeners'),
      groups: createListenersTabGroups(element, bpmnFactory, elementRegistry, translate),
      enabled: function(element) {
        return !eventDefinitionHelper.getLinkEventDefinition(element)
          || (!is(element, 'bpmn:IntermediateThrowEvent')
          && eventDefinitionHelper.getLinkEventDefinition(element));
      }
    };
    var inputOutputTab = {
      id: 'input-output',
      label: translate('Input/Output'),
      groups: createInputOutputTabGroups(element, bpmnFactory, elementRegistry, translate)
    };
    var connectorTab = {
      id: 'connector',
      label: translate('Connector'),
      groups: createConnectorTabGroups(element, bpmnFactory, elementRegistry, translate),
      enabled: function(element) {
        var bo = implementationTypeHelper.getServiceTaskLikeBusinessObject(element);
        return bo && implementationTypeHelper.getImplementationType(bo) === 'connector';
      }
    };
    var fieldInjectionsTab = {
      id: 'field-injections',
      label: translate('Field Injections'),
      groups: createFieldInjectionsTabGroups(element, bpmnFactory, elementRegistry, translate)
    };
    var extensionsTab = {
      id: 'extensionElements',
      label: translate('Extensions'),
      groups: createExtensionElementsGroups(element, bpmnFactory, elementRegistry, translate)
    };
    return [
      generalTab,
      variablesTab,
      connectorTab,
      formsTab,
      listenersTab,
      inputOutputTab,
      fieldInjectionsTab,
      extensionsTab
    ];
  };
}
ActivitiPropertiesProvider.$inject = [
  'eventBus',
  'canvas',
  'bpmnFactory',
  'elementRegistry',
  'elementTemplates',
  'translate'
];
inherits(ActivitiPropertiesProvider, PropertiesActivator);
module.exports = ActivitiPropertiesProvider;
ruoyi-bpmnjs/resources/properties-panel/provider/activiti/element-templates/CreateHelper.js
New file
@@ -0,0 +1,251 @@
'use strict';
var assign = require('lodash/assign');
/**
 * Create an input parameter representing the given
 * binding and value.
 *
 * @param {PropertyBinding} binding
 * @param {String} value
 * @param {BpmnFactory} bpmnFactory
 *
 * @return {ModdleElement}
 */
function createInputParameter(binding, value, bpmnFactory) {
  var scriptFormat = binding.scriptFormat,
      parameterValue,
      parameterDefinition;
  if (scriptFormat) {
    parameterDefinition = bpmnFactory.create('activiti:Script', {
      scriptFormat: scriptFormat,
      value: value
    });
  } else {
    parameterValue = value;
  }
  return bpmnFactory.create('activiti:InputParameter', {
    name: binding.name,
    value: parameterValue,
    definition: parameterDefinition
  });
}
module.exports.createInputParameter = createInputParameter;
/**
 * Create an output parameter representing the given
 * binding and value.
 *
 * @param {PropertyBinding} binding
 * @param {String} value
 * @param {BpmnFactory} bpmnFactory
 *
 * @return {ModdleElement}
 */
function createOutputParameter(binding, value, bpmnFactory) {
  var scriptFormat = binding.scriptFormat,
      parameterValue,
      parameterDefinition;
  if (scriptFormat) {
    parameterDefinition = bpmnFactory.create('activiti:Script', {
      scriptFormat: scriptFormat,
      value: binding.source
    });
  } else {
    parameterValue = binding.source;
  }
  return bpmnFactory.create('activiti:OutputParameter', {
    name: value,
    value: parameterValue,
    definition: parameterDefinition
  });
}
module.exports.createOutputParameter = createOutputParameter;
/**
 * Create activiti property from the given binding.
 *
 * @param {PropertyBinding} binding
 * @param {String} value
 * @param {BpmnFactory} bpmnFactory
 *
 * @return {ModdleElement}
 */
function createActivitiProperty(binding, value, bpmnFactory) {
  return bpmnFactory.create('activiti:Property', {
    name: binding.name,
    value: value || ''
  });
}
module.exports.createActivitiProperty = createActivitiProperty;
/**
 * Create activiti:in element from given binding.
 *
 * @param {PropertyBinding} binding
 * @param {String} value
 * @param {BpmnFactory} bpmnFactory
 *
 * @return {ModdleElement}
 */
function createActivitiIn(binding, value, bpmnFactory) {
  var properties = createActivitiInOutAttrs(binding, value);
  return bpmnFactory.create('activiti:In', properties);
}
module.exports.createActivitiIn = createActivitiIn;
/**
 * Create activiti:in with businessKey element from given binding.
 *
 * @param {PropertyBinding} binding
 * @param {String} value
 * @param {BpmnFactory} bpmnFactory
 *
 * @return {ModdleElement}
 */
function createActivitiInWithBusinessKey(binding, value, bpmnFactory) {
  return bpmnFactory.create('activiti:In', {
    businessKey: value
  });
}
module.exports.createActivitiInWithBusinessKey = createActivitiInWithBusinessKey;
/**
 * Create activiti:out element from given binding.
 *
 * @param {PropertyBinding} binding
 * @param {String} value
 * @param {BpmnFactory} bpmnFactory
 *
 * @return {ModdleElement}
 */
function createActivitiOut(binding, value, bpmnFactory) {
  var properties = createActivitiInOutAttrs(binding, value);
  return bpmnFactory.create('activiti:Out', properties);
}
module.exports.createActivitiOut = createActivitiOut;
/**
 * Create activiti:executionListener element containing an inline script from given binding.
 *
 * @param {PropertyBinding} binding
 * @param {String} value
 * @param {BpmnFactory} bpmnFactory
 *
 * @return {ModdleElement}
 */
function createActivitiExecutionListenerScript(binding, value, bpmnFactory) {
  var scriptFormat = binding.scriptFormat,
      parameterValue,
      parameterDefinition;
  if (scriptFormat) {
    parameterDefinition = bpmnFactory.create('activiti:Script', {
      scriptFormat: scriptFormat,
      value: value
    });
  } else {
    parameterValue = value;
  }
  return bpmnFactory.create('activiti:ExecutionListener', {
    event: binding.event,
    value: parameterValue,
    script: parameterDefinition
  });
}
module.exports.createActivitiExecutionListenerScript = createActivitiExecutionListenerScript;
/**
 * Create activiti:field element containing string or expression from given binding.
 *
 * @param {PropertyBinding} binding
 * @param {String} value
 * @param {BpmnFactory} bpmnFactory
 *
 * @return {ModdleElement}
 */
function createActivitiFieldInjection(binding, value, bpmnFactory) {
  var DEFAULT_PROPS = {
    'string': undefined,
    'expression': undefined,
    'name': undefined
  };
  var props = assign({}, DEFAULT_PROPS);
  if (!binding.expression) {
    props.string = value;
  } else {
    props.expression = value;
  }
  props.name = binding.name;
  return bpmnFactory.create('activiti:Field', props);
}
module.exports.createActivitiFieldInjection = createActivitiFieldInjection;
// helpers ////////////////////////////
/**
 * Create properties for activiti:in and activiti:out types.
 */
function createActivitiInOutAttrs(binding, value) {
  var properties = {};
  // activiti:in source(Expression) target
  if (binding.target) {
    properties.target = binding.target;
    if (binding.expression) {
      properties.sourceExpression = value;
    } else {
      properties.source = value;
    }
  } else
  // activiti:(in|out) variables local
  if (binding.variables) {
    properties.variables = 'all';
    if (binding.variables === 'local') {
      properties.local = true;
    }
  }
  // activiti:out source(Expression) target
  else {
    properties.target = value;
    [ 'source', 'sourceExpression' ].forEach(function(k) {
      if (binding[k]) {
        properties[k] = binding[k];
      }
    });
  }
  return properties;
}
ruoyi-bpmnjs/resources/properties-panel/provider/activiti/element-templates/CustomElementsPropertiesActivator.js
New file
@@ -0,0 +1,132 @@
'use strict';
var inherits = require('inherits');
var getTemplate = require('./Helper').getTemplate;
var PropertiesActivator = require('../../../PropertiesActivator');
var HIGHER_PRIORITY = 1100;
/**
 * Applies template visibility settings.
 *
 * Controlled using `entriesVisible` on template config object:
 *
 * ```json
 *     "entriesVisible": {
 *       "_all": true|false,
 *       "entryName": true|false,
 *       ...
 *     }
 * ```
 *
 * @param {EventBus} eventBus
 * @param {ElementTemplates} elementTemplates
 */
function CustomElementsPropertiesActivator(eventBus, elementTemplates) {
  PropertiesActivator.call(this, eventBus, HIGHER_PRIORITY);
  this.isEntryVisible = function(entry, element) {
    var template = getTemplate(element, elementTemplates);
    if (template && !isEntryVisible(entry, template)) {
      return false;
    }
  };
  this.isPropertyEditable = function(entry, propertyName, element) {
    var template = getTemplate(element, elementTemplates);
    if (template && !isEntryEditable(entry, template)) {
      return false;
    }
  };
}
CustomElementsPropertiesActivator.$inject = [ 'eventBus', 'elementTemplates' ];
inherits(CustomElementsPropertiesActivator, PropertiesActivator);
module.exports = CustomElementsPropertiesActivator;
// helpers ////////////////////////////////////
var CUSTOM_PROPERTIES_PATTERN = /^custom-/;
var DEFAULT_ENTRIES_VISIBLE = {
  _all: false,
  id: true,
  name: true
};
function isCustomEntry(entry) {
  return CUSTOM_PROPERTIES_PATTERN.test(entry.id);
}
function isEntryVisible(entry, template) {
  var entryId = entry.id;
  if (entryId === 'elementTemplate-chooser' || isCustomEntry(entry)) {
    return true;
  }
  var entriesVisible = template.entriesVisible || DEFAULT_ENTRIES_VISIBLE;
  if (typeof entriesVisible === 'boolean') {
    return entriesVisible;
  }
  var defaultVisible = entriesVisible._all || false,
      entryVisible = entriesVisible[entryId];
  // d = true, e = false => false
  // d = false, e = true => true
  // d = false, e = false
  return (
    (defaultVisible === true && entryVisible !== false) ||
    (defaultVisible === false && entryVisible === true)
  );
}
function isEntryEditable(entry, template) {
  var property;
  if (isCustomEntry(entry)) {
    property = getProperty(template, entry);
    return property && property.editable !== false;
  }
  return true;
}
function getProperty(template, entry) {
  var index;
  var idx = entry.id.replace('custom-' + template.id + '-', '');
  if (idx.indexOf('-') !== -1) {
    var indexes = idx.split('-');
    if (indexes.length == 2) {
      var scopeName = indexes[0].replace(/_/g, ':');
      index = parseInt(indexes[1], 10);
      if (scopeName && !isNaN(index)) {
        return template.scopes[scopeName].properties[index];
      }
    }
  } else {
    index = parseInt(idx, 10);
    if (!isNaN(index)) {
      return template.properties[index];
    }
  }
  throw new Error('cannot extract property index for entry <' + entry.id + '>');
}
ruoyi-bpmnjs/resources/properties-panel/provider/activiti/element-templates/ElementTemplates.js
New file
@@ -0,0 +1,56 @@
'use strict';
var values = require('lodash/values');
/**
 * The guy knowing all configured element templates.
 *
 * This registry won't validate. Use the {@link Validator}
 * to verify a template is valid prior to adding it to
 * this registry.
 */
function ElementTemplates() {
  this._templates = {};
  /**
   * Sets the known element templates.
   *
   * @param {Array<TemplateDescriptor>} descriptors
   *
   * @return {ElementTemplates}
   */
  this.set = function(descriptors) {
    var templates = this._templates = {};
    descriptors.forEach(function(descriptor) {
      templates[descriptor.id] = descriptor;
    });
    return this;
  };
  /**
   * Get template descriptor with given id.
   *
   * @param {String} id
   *
   * @return {TemplateDescriptor}
   */
  this.get = function(id) {
    return this._templates[id];
  };
  /**
   * Return all known template descriptors.
   *
   * @return {Array<TemplateDescriptor>}
   */
  this.getAll = function() {
    return values(this._templates);
  };
}
module.exports = ElementTemplates;
ruoyi-bpmnjs/resources/properties-panel/provider/activiti/element-templates/ElementTemplatesLoader.js
New file
@@ -0,0 +1,96 @@
'use strict';
var Validator = require('./Validator');
/**
 * The guy responsible for template loading.
 *
 * Provide the actual templates via the `config.elementTemplates`.
 *
 * That configuration can either be an array of template
 * descriptors or a node style callback to retrieve
 * the templates asynchronously.
 *
 * @param {Array<TemplateDescriptor>|Function} loadTemplates
 * @param {EventBus} eventBus
 * @param {ElementTemplates} elementTemplates
 */
function ElementTemplatesLoader(loadTemplates, eventBus, elementTemplates) {
  this._loadTemplates = loadTemplates;
  this._eventBus = eventBus;
  this._elementTemplates = elementTemplates;
  var self = this;
  eventBus.on('diagram.init', function() {
    self.reload();
  });
}
module.exports = ElementTemplatesLoader;
ElementTemplatesLoader.$inject = [
  'config.elementTemplates',
  'eventBus',
  'elementTemplates'
];
ElementTemplatesLoader.prototype.reload = function() {
  var self = this;
  var loadTemplates = this._loadTemplates;
  // no templates specified
  if (typeof loadTemplates === 'undefined') {
    return;
  }
  // template loader function specified
  if (typeof loadTemplates === 'function') {
    return loadTemplates(function(err, templates) {
      if (err) {
        return self.templateErrors([ err ]);
      }
      self.setTemplates(templates);
    });
  }
  // templates array specified
  if (loadTemplates.length) {
    return this.setTemplates(loadTemplates);
  }
};
ElementTemplatesLoader.prototype.setTemplates = function(templates) {
  var elementTemplates = this._elementTemplates;
  var validator = new Validator().addAll(templates);
  var errors = validator.getErrors(),
      validTemplates = validator.getValidTemplates();
  elementTemplates.set(validTemplates);
  if (errors.length) {
    this.templateErrors(errors);
  }
  this.templatesChanged();
};
ElementTemplatesLoader.prototype.templatesChanged = function() {
  this._eventBus.fire('elementTemplates.changed');
};
ElementTemplatesLoader.prototype.templateErrors = function(errors) {
  this._eventBus.fire('elementTemplates.errors', {
    errors: errors
  });
};
ruoyi-bpmnjs/resources/properties-panel/provider/activiti/element-templates/Helper.js
New file
@@ -0,0 +1,239 @@
'use strict';
var getBusinessObject = require('bpmn-js/lib/util/ModelUtil').getBusinessObject;
var is = require('bpmn-js/lib/util/ModelUtil').is,
    isAny = require('bpmn-js/lib/features/modeling/util/ModelingUtil').isAny;
var find = require('lodash/find');
var TEMPLATE_ATTR = 'activiti:modelerTemplate';
/**
 * The BPMN 2.0 extension attribute name under
 * which the element template is stored.
 *
 * @type {String}
 */
module.exports.TEMPLATE_ATTR = TEMPLATE_ATTR;
/**
 * Get template id for a given diagram element.
 *
 * @param {djs.model.Base} element
 *
 * @return {String}
 */
function getTemplateId(element) {
  var bo = getBusinessObject(element);
  if (bo) {
    return bo.get(TEMPLATE_ATTR);
  }
}
module.exports.getTemplateId = getTemplateId;
/**
 * Get template of a given element.
 *
 * @param {Element} element
 * @param {ElementTemplates} elementTemplates
 *
 * @return {TemplateDefinition}
 */
function getTemplate(element, elementTemplates) {
  var id = getTemplateId(element);
  return id && elementTemplates.get(id);
}
module.exports.getTemplate = getTemplate;
/**
 * Get default template for a given element.
 *
 * @param {Element} element
 * @param {ElementTemplates} elementTemplates
 *
 * @return {TemplateDefinition}
 */
function getDefaultTemplate(element, elementTemplates) {
  // return first default template, if any exists
  return (
    elementTemplates.getAll().filter(function(t) {
      return isAny(element, t.appliesTo) && t.isDefault;
    })
  )[0];
}
module.exports.getDefaultTemplate = getDefaultTemplate;
/**
 * Find extension with given type in
 * BPMN element, diagram element or ExtensionElement.
 *
 * @param {ModdleElement|djs.model.Base} element
 * @param {String} type
 *
 * @return {ModdleElement} the extension
 */
function findExtension(element, type) {
  var bo = getBusinessObject(element);
  var extensionElements;
  if (is(bo, 'bpmn:ExtensionElements')) {
    extensionElements = bo;
  } else {
    extensionElements = bo.extensionElements;
  }
  if (!extensionElements) {
    return null;
  }
  return find(extensionElements.get('values'), function(e) {
    return is(e, type);
  });
}
module.exports.findExtension = findExtension;
function findExtensions(element, types) {
  var extensionElements = getExtensionElements(element);
  if (!extensionElements) {
    return [];
  }
  return extensionElements.get('values').filter(function(e) {
    return isAny(e, types);
  });
}
module.exports.findExtensions = findExtensions;
function findActivitiInOut(element, binding) {
  var extensionElements = getExtensionElements(element);
  if (!extensionElements) {
    return;
  }
  var matcher;
  if (binding.type === 'activiti:in') {
    matcher = function(e) {
      return is(e, 'activiti:In') && isInOut(e, binding);
    };
  } else
  if (binding.type === 'activiti:out') {
    matcher = function(e) {
      return is(e, 'activiti:Out') && isInOut(e, binding);
    };
  } else
  if (binding.type === 'activiti:in:businessKey') {
    matcher = function(e) {
      return is(e, 'activiti:In') && 'businessKey' in e;
    };
  }
  return find(extensionElements.get('values'), matcher);
}
module.exports.findActivitiInOut = findActivitiInOut;
function findActivitiProperty(activitiProperties, binding) {
  return find(activitiProperties.get('values'), function(p) {
    return p.name === binding.name;
  });
}
module.exports.findActivitiProperty = findActivitiProperty;
function findInputParameter(inputOutput, binding) {
  var parameters = inputOutput.get('inputParameters');
  return find(parameters, function(p) {
    return p.name === binding.name;
  });
}
module.exports.findInputParameter = findInputParameter;
function findOutputParameter(inputOutput, binding) {
  var parameters = inputOutput.get('outputParameters');
  return find(parameters, function(p) {
    var value = p.value;
    if (!binding.scriptFormat) {
      return value === binding.source;
    }
    var definition = p.definition;
    if (!definition || binding.scriptFormat !== definition.scriptFormat) {
      return false;
    }
    return definition.value === binding.source;
  });
}
module.exports.findOutputParameter = findOutputParameter;
// helpers /////////////////////////////////
function getExtensionElements(element) {
  var bo = getBusinessObject(element);
  if (is(bo, 'bpmn:ExtensionElements')) {
    return bo;
  } else {
    return bo.extensionElements;
  }
}
function isInOut(element, binding) {
  if (binding.type === 'activiti:in') {
    // find based on target attribute
    if (binding.target) {
      return element.target === binding.target;
    }
  }
  if (binding.type === 'activiti:out') {
    // find based on source / sourceExpression
    if (binding.source) {
      return element.source === binding.source;
    }
    if (binding.sourceExpression) {
      return element.sourceExpression === binding.sourceExpression;
    }
  }
  // find based variables / local combination
  if (binding.variables) {
    return element.variables === 'all' && (
      binding.variables !== 'local' || element.local
    );
  }
}
ruoyi-bpmnjs/resources/properties-panel/provider/activiti/element-templates/Validator.js
New file
@@ -0,0 +1,303 @@
'use strict';
var isArray = require('lodash/isArray');
var isObject = require('lodash/isObject');
var DROPDOWN_TYPE = 'Dropdown';
var VALID_TYPES = [ 'String', 'Text', 'Boolean', 'Hidden', DROPDOWN_TYPE ];
var PROPERTY_TYPE = 'property',
    ACTIVITI_PROPERTY_TYPE = 'activiti:property',
    ACTIVITI_INPUT_PARAMETER_TYPE = 'activiti:inputParameter',
    ACTIVITI_OUTPUT_PARAMETER_TYPE = 'activiti:outputParameter',
    ACTIVITI_IN_TYPE = 'activiti:in',
    ACTIVITI_OUT_TYPE = 'activiti:out',
    ACTIVITI_IN_BUSINESS_KEY_TYPE = 'activiti:in:businessKey',
    ACTIVITI_EXECUTION_LISTENER = 'activiti:executionListener',
    ACTIVITI_FIELD = 'activiti:field';
var VALID_BINDING_TYPES = [
  PROPERTY_TYPE,
  ACTIVITI_PROPERTY_TYPE,
  ACTIVITI_INPUT_PARAMETER_TYPE,
  ACTIVITI_OUTPUT_PARAMETER_TYPE,
  ACTIVITI_IN_TYPE,
  ACTIVITI_OUT_TYPE,
  ACTIVITI_IN_BUSINESS_KEY_TYPE,
  ACTIVITI_EXECUTION_LISTENER,
  ACTIVITI_FIELD
];
/**
 * A element template validator.
 */
function Validator() {
  this._templatesById = {};
  this._validTemplates = [];
  this._errors = [];
  /**
   * Adds the templates.
   *
   * @param {Array<TemplateDescriptor>} templates
   *
   * @return {Validator} self
   */
  this.addAll = function(templates) {
    if (!isArray(templates)) {
      this._logError('templates must be []');
    } else {
      templates.forEach(this.add, this);
    }
    return this;
  };
  /**
   * Add the given element template, if it is valid.
   *
   * @param {TemplateDescriptor} template
   *
   * @return {Validator} self
   */
  this.add = function(template) {
    var err = this._validateTemplate(template);
    if (!err) {
      this._templatesById[template.id] = template;
      this._validTemplates.push(template);
    }
    return this;
  };
  /**
   * Validate given template and return error (if any).
   *
   * @param {TemplateDescriptor} template
   *
   * @return {Error} validation error, if any
   */
  this._validateTemplate = function(template) {
    var err,
        id = template.id,
        appliesTo = template.appliesTo,
        properties = template.properties,
        scopes = template.scopes;
    if (!id) {
      return this._logError('missing template id');
    }
    if (id in this._templatesById) {
      return this._logError('template id <' + id + '> already used');
    }
    if (!isArray(appliesTo)) {
      err = this._logError('missing appliesTo=[]', template);
    }
    if (!isArray(properties)) {
      err = this._logError('missing properties=[]', template);
    } else {
      if (!this._validateProperties(properties)) {
        err = new Error('invalid properties');
      }
    }
    if (scopes) {
      err = this._validateScopes(template, scopes);
    }
    return err;
  };
  this._validateScopes = function(template, scopes) {
    var err,
        scope,
        scopeName;
    if (!isObject(scopes) || isArray(scopes)) {
      return this._logError('invalid scopes, should be scopes={}', template);
    }
    for (scopeName in scopes) {
      scope = scopes[scopeName];
      if (!isObject(scope) || isArray(scope)) {
        err = this._logError('invalid scope, should be scope={}', template);
      }
      if (!isArray(scope.properties)) {
        err = this._logError(
          'missing properties=[] in scope <' + scopeName + '>', template
        );
      } else {
        if (!this._validateProperties(scope.properties)) {
          err = new Error('invalid properties in scope <' + scopeName + '>');
        }
      }
    }
    return err;
  };
  /**
   * Validate properties and return false if any is invalid.
   *
   * @param {Array<PropertyDescriptor>} properties
   *
   * @return {Boolean} true if all properties are valid
   */
  this._validateProperties = function(properties) {
    var validProperties = properties.filter(this._validateProperty, this);
    return properties.length === validProperties.length;
  };
  /**
   * Validate property and return false, if there was
   * a validation error.
   *
   * @param {PropertyDescriptor} property
   *
   * @return {Boolean} true if property is valid
   */
  this._validateProperty = function(property) {
    var type = property.type,
        binding = property.binding;
    var err;
    var bindingType = binding.type;
    if (VALID_TYPES.indexOf(type) === -1) {
      err = this._logError(
        'invalid property type <' + type + '>; ' +
        'must be any of { ' + VALID_TYPES.join(', ') + ' }'
      );
    }
    if (type === DROPDOWN_TYPE && bindingType !== ACTIVITI_EXECUTION_LISTENER) {
      if (!isArray(property.choices)) {
        err = this._logError(
          'must provide choices=[] with ' + DROPDOWN_TYPE + ' type'
        );
      } else
      if (!property.choices.every(isDropdownChoiceValid)) {
        err = this._logError(
          '{ name, value } must be specified for ' +
          DROPDOWN_TYPE + ' choices'
        );
      }
    }
    if (!binding) {
      return this._logError('property missing binding');
    }
    if (VALID_BINDING_TYPES.indexOf(bindingType) === -1) {
      err = this._logError(
        'invalid property.binding type <' + bindingType + '>; ' +
        'must be any of { ' + VALID_BINDING_TYPES.join(', ') + ' }'
      );
    }
    if (bindingType === PROPERTY_TYPE ||
        bindingType === ACTIVITI_PROPERTY_TYPE ||
        bindingType === ACTIVITI_INPUT_PARAMETER_TYPE ||
        bindingType === ACTIVITI_FIELD) {
      if (!binding.name) {
        err = this._logError(
          'property.binding <' + bindingType + '> requires name'
        );
      }
    }
    if (bindingType === ACTIVITI_OUTPUT_PARAMETER_TYPE) {
      if (!binding.source) {
        err = this._logError(
          'property.binding <' + bindingType + '> requires source'
        );
      }
    }
    if (bindingType === ACTIVITI_IN_TYPE) {
      if (!binding.variables && !binding.target) {
        err = this._logError(
          'property.binding <' + bindingType + '> requires ' +
          'variables or target'
        );
      }
    }
    if (bindingType === ACTIVITI_OUT_TYPE) {
      if (!binding.variables && !binding.source && !binding.sourceExpression) {
        err = this._logError(
          'property.binding <' + bindingType + '> requires ' +
          'variables, sourceExpression or source'
        );
      }
    }
    if (bindingType === ACTIVITI_EXECUTION_LISTENER) {
      if (type !== 'Hidden') {
        err = this._logError(
          'invalid property type <' + type + '> for ' + ACTIVITI_EXECUTION_LISTENER + '; ' +
          'must be <Hidden>'
        );
      }
    }
    return !err;
  };
  this._logError = function(err, template) {
    if (typeof err === 'string') {
      if (template) {
        err = 'template(id: ' + template.id + ') ' + err;
      }
      err = new Error(err);
    }
    this._errors.push(err);
    return err;
  };
  this.getErrors = function() {
    return this._errors;
  };
  this.getValidTemplates = function() {
    return this._validTemplates;
  };
}
module.exports = Validator;
// helpers ///////////////////////////////////
function isDropdownChoiceValid(c) {
  return 'name' in c && 'value' in c;
}
ruoyi-bpmnjs/resources/properties-panel/provider/activiti/element-templates/cmd/ChangeElementTemplateHandler.js
New file
@@ -0,0 +1,471 @@
'use strict';
var findExtension = require('../Helper').findExtension,
    findExtensions = require('../Helper').findExtensions;
var createActivitiProperty = require('../CreateHelper').createActivitiProperty,
    createInputParameter = require('../CreateHelper').createInputParameter,
    createOutputParameter = require('../CreateHelper').createOutputParameter,
    createActivitiIn = require('../CreateHelper').createActivitiIn,
    createActivitiOut = require('../CreateHelper').createActivitiOut,
    createActivitiInWithBusinessKey = require('../CreateHelper').createActivitiInWithBusinessKey,
    createActivitiExecutionListenerScript = require('../CreateHelper').createActivitiExecutionListenerScript,
    createActivitiFieldInjection = require('../CreateHelper').createActivitiFieldInjection;
var forEach = require('lodash/forEach');
var ACTIVITI_SERVICE_TASK_LIKE = [
  'activiti:class',
  'activiti:delegateExpression',
  'activiti:expression'
];
/**
 * A handler that changes the modeling template of a BPMN element.
 */
function ChangeElementTemplateHandler(modeling, commandStack, bpmnFactory) {
  function getOrCreateExtensionElements(element) {
    var bo = element.businessObject;
    var extensionElements = bo.extensionElements;
    // add extension elements
    if (!extensionElements) {
      extensionElements = bpmnFactory.create('bpmn:ExtensionElements', {
        values: []
      });
      modeling.updateProperties(element, {
        extensionElements: extensionElements
      });
    }
    return extensionElements;
  }
  function updateModelerTemplate(element, newTemplate) {
    modeling.updateProperties(element, {
      'activiti:modelerTemplate': newTemplate && newTemplate.id
    });
  }
  function updateIoMappings(element, newTemplate, context) {
    var newMappings = createInputOutputMappings(newTemplate, bpmnFactory),
        oldMappings;
    if (!newMappings) {
      return;
    }
    if (context) {
      commandStack.execute('properties-panel.update-businessobject', {
        element: element,
        businessObject: context,
        properties: { inputOutput: newMappings }
      });
    } else {
      context = getOrCreateExtensionElements(element);
      oldMappings = findExtension(element, 'activiti:InputOutput');
      commandStack.execute('properties-panel.update-businessobject-list', {
        element: element,
        currentObject: context,
        propertyName: 'values',
        objectsToAdd: [ newMappings ],
        objectsToRemove: oldMappings ? [ oldMappings ] : []
      });
    }
  }
  function updateActivitiField(element, newTemplate, context) {
    var newMappings = createActivitiFieldInjections(newTemplate, bpmnFactory),
        oldMappings;
    if (!newMappings) {
      return;
    }
    if (context) {
      commandStack.execute('properties-panel.update-businessobject', {
        element: element,
        businessObject: context,
        properties: { field: newMappings }
      });
    } else {
      context = getOrCreateExtensionElements(element);
      oldMappings = findExtensions(element, ['activiti:Field']);
      commandStack.execute('properties-panel.update-businessobject-list', {
        element: element,
        currentObject: context,
        propertyName: 'values',
        objectsToAdd: newMappings,
        objectsToRemove: oldMappings ? oldMappings : []
      });
    }
  }
  function updateActivitiProperties(element, newTemplate, context) {
    var newProperties = createActivitiProperties(newTemplate, bpmnFactory),
        oldProperties;
    if (!newProperties) {
      return;
    }
    if (context) {
      commandStack.execute('properties-panel.update-businessobject', {
        element: element,
        businessObject: context,
        properties: { properties: newProperties }
      });
    } else {
      context = getOrCreateExtensionElements(element);
      oldProperties = findExtension(element, 'activiti:Properties');
      commandStack.execute('properties-panel.update-businessobject-list', {
        element: element,
        currentObject: context,
        propertyName: 'values',
        objectsToAdd: [ newProperties ],
        objectsToRemove: oldProperties ? [ oldProperties ] : []
      });
    }
  }
  function updateProperties(element, newTemplate, context) {
    var newProperties = createBpmnPropertyUpdates(newTemplate, bpmnFactory);
    var newPropertiesCount = Object.keys(newProperties).length;
    if (!newPropertiesCount) {
      return;
    }
    if (context) {
      commandStack.execute('properties-panel.update-businessobject', {
        element: element,
        businessObject: context,
        properties: newProperties
      });
    } else {
      modeling.updateProperties(element, newProperties);
    }
  }
  function updateInOut(element, newTemplate, context) {
    var newInOut = createActivitiInOut(newTemplate, bpmnFactory),
        oldInOut;
    if (!newInOut) {
      return;
    }
    if (context) {
      commandStack.execute('properties-panel.update-businessobject', {
        element: element,
        businessObject: context,
        properties: { inout: newInOut }
      });
    } else {
      context = getOrCreateExtensionElements(element);
      oldInOut = findExtensions(context, [ 'activiti:In', 'activiti:Out' ]);
      commandStack.execute('properties-panel.update-businessobject-list', {
        element: element,
        currentObject: context,
        propertyName: 'values',
        objectsToAdd: newInOut,
        objectsToRemove: oldInOut
      });
    }
  }
  function updateExecutionListener(element, newTemplate, context) {
    var newExecutionListeners = createActivitiExecutionListeners(newTemplate, bpmnFactory),
        oldExecutionsListeners;
    if (!newExecutionListeners.length) {
      return;
    }
    if (context) {
      commandStack.execute('properties-panel.update-businessobject', {
        element: element,
        businessObject: context,
        properties: { executionListener: newExecutionListeners }
      });
    } else {
      context = getOrCreateExtensionElements(element);
      oldExecutionsListeners = findExtensions(context, [ 'activiti:ExecutionListener' ]);
      commandStack.execute('properties-panel.update-businessobject-list', {
        element: element,
        currentObject: context,
        propertyName: 'values',
        objectsToAdd: newExecutionListeners,
        objectsToRemove: oldExecutionsListeners
      });
    }
  }
  /**
   * Update / recreate a scoped element.
   *
   * @param {djs.model.Base} element the diagram parent element
   * @param {String} scopeName name of the scope, i.e. activiti:Connector
   * @param {Object} scopeDefinition
   */
  function updateScopeElements(element, scopeName, scopeDefinition) {
    var scopeElement = bpmnFactory.create(scopeName);
    // update activiti:inputOutput
    updateIoMappings(element, scopeDefinition, scopeElement);
    // update activiti:field
    updateActivitiField(element, scopeDefinition, scopeElement);
    // update activiti:properties
    updateActivitiProperties(element, scopeDefinition, scopeElement);
    // update other properties (bpmn:condition, activiti:async, ...)
    updateProperties(element, scopeDefinition, scopeElement);
    // update activiti:in and activiti:out
    updateInOut(element, scopeDefinition, scopeElement);
    // update activiti:executionListener
    updateExecutionListener(element, scopeDefinition, scopeElement);
    var extensionElements = getOrCreateExtensionElements(element);
    var oldScope = findExtension(extensionElements, scopeName);
    commandStack.execute('properties-panel.update-businessobject-list', {
      element: element,
      currentObject: extensionElements,
      propertyName: 'values',
      objectsToAdd: [ scopeElement ],
      objectsToRemove: oldScope ? [ oldScope ] : []
    });
  }
  /**
   * Compose an element template change action, updating all
   * necessary underlying properties.
   *
   * @param {Object} context
   * @param {Object} context.element
   * @param {Object} context.oldTemplate
   * @param {Object} context.newTemplate
   */
  this.preExecute = function(context) {
    var element = context.element,
        newTemplate = context.newTemplate;
    // update activiti:modelerTemplate attribute
    updateModelerTemplate(element, newTemplate);
    if (newTemplate) {
      // update activiti:inputOutput
      updateIoMappings(element, newTemplate);
      // update activiti:field
      updateActivitiField(element, newTemplate);
      // update activiti:properties
      updateActivitiProperties(element, newTemplate);
      // update other properties (bpmn:condition, activiti:async, ...)
      updateProperties(element, newTemplate);
      // update activiti:in and activiti:out
      updateInOut(element, newTemplate);
      // update activiti:executionListener
      updateExecutionListener(element, newTemplate);
      // loop on scopes properties
      forEach(newTemplate.scopes, function(scopeDefinition, scopeName) {
        updateScopeElements(element, scopeName, scopeDefinition);
      });
    }
  };
}
ChangeElementTemplateHandler.$inject = [ 'modeling', 'commandStack', 'bpmnFactory' ];
module.exports = ChangeElementTemplateHandler;
// helpers /////////////////////////////
function createBpmnPropertyUpdates(template, bpmnFactory) {
  var propertyUpdates = {};
  template.properties.forEach(function(p) {
    var binding = p.binding,
        bindingTarget = binding.name,
        propertyValue;
    if (binding.type === 'property') {
      if (bindingTarget === 'conditionExpression') {
        propertyValue = bpmnFactory.create('bpmn:FormalExpression', {
          body: p.value,
          language: binding.scriptFormat
        });
      } else {
        propertyValue = p.value;
      }
      // assigning activiti:async to true|false
      // assigning bpmn:conditionExpression to { $type: 'bpmn:FormalExpression', ... }
      propertyUpdates[bindingTarget] = propertyValue;
      // make sure we unset other "implementation types"
      // when applying a activiti:class template onto a preconfigured
      // activiti:delegateExpression element
      if (ACTIVITI_SERVICE_TASK_LIKE.indexOf(bindingTarget) !== -1) {
        ACTIVITI_SERVICE_TASK_LIKE.forEach(function(prop) {
          if (prop !== bindingTarget) {
            propertyUpdates[prop] = undefined;
          }
        });
      }
    }
  });
  return propertyUpdates;
}
function createActivitiFieldInjections(template, bpmnFactory) {
  var injections = [];
  template.properties.forEach(function(p) {
    var binding = p.binding,
        bindingType = binding.type;
    if (bindingType === 'activiti:field') {
      injections.push(createActivitiFieldInjection(
        binding, p.value, bpmnFactory
      ));
    }
  });
  if (injections.length) {
    return injections;
  }
}
function createActivitiProperties(template, bpmnFactory) {
  var properties = [];
  template.properties.forEach(function(p) {
    var binding = p.binding,
        bindingType = binding.type;
    if (bindingType === 'activiti:property') {
      properties.push(createActivitiProperty(
        binding, p.value, bpmnFactory
      ));
    }
  });
  if (properties.length) {
    return bpmnFactory.create('activiti:Properties', {
      values: properties
    });
  }
}
function createInputOutputMappings(template, bpmnFactory) {
  var inputParameters = [],
      outputParameters = [];
  template.properties.forEach(function(p) {
    var binding = p.binding,
        bindingType = binding.type;
    if (bindingType === 'activiti:inputParameter') {
      inputParameters.push(createInputParameter(
        binding, p.value, bpmnFactory
      ));
    }
    if (bindingType === 'activiti:outputParameter') {
      outputParameters.push(createOutputParameter(
        binding, p.value, bpmnFactory
      ));
    }
  });
  // do we need to create new ioMappings (?)
  if (outputParameters.length || inputParameters.length) {
    return bpmnFactory.create('activiti:InputOutput', {
      inputParameters: inputParameters,
      outputParameters: outputParameters
    });
  }
}
function createActivitiInOut(template, bpmnFactory) {
  var inOuts = [];
  template.properties.forEach(function(p) {
    var binding = p.binding,
        bindingType = binding.type;
    if (bindingType === 'activiti:in') {
      inOuts.push(createActivitiIn(
        binding, p.value, bpmnFactory
      ));
    } else
    if (bindingType === 'activiti:out') {
      inOuts.push(createActivitiOut(
        binding, p.value, bpmnFactory
      ));
    } else
    if (bindingType === 'activiti:in:businessKey') {
      inOuts.push(createActivitiInWithBusinessKey(
        binding, p.value, bpmnFactory
      ));
    }
  });
  return inOuts;
}
function createActivitiExecutionListeners(template, bpmnFactory) {
  var executionListener = [];
  template.properties.forEach(function(p) {
    var binding = p.binding,
        bindingType = binding.type;
    if (bindingType === 'activiti:executionListener') {
      executionListener.push(createActivitiExecutionListenerScript(
        binding, p.value, bpmnFactory
      ));
    }
  });
  return executionListener;
}
ruoyi-bpmnjs/resources/properties-panel/provider/activiti/element-templates/cmd/index.js
New file
@@ -0,0 +1,46 @@
'use strict';
var ChangeElementTemplateHandler = require('./ChangeElementTemplateHandler');
var getTemplate = require('../Helper').getTemplate,
    getDefaultTemplate = require('../Helper').getDefaultTemplate;
function registerHandlers(commandStack, elementTemplates, eventBus, elementRegistry) {
  commandStack.registerHandler(
    'propertiesPanel.activiti.changeTemplate',
    ChangeElementTemplateHandler
  );
  // apply default element templates on shape creation
  eventBus.on([ 'commandStack.shape.create.postExecuted' ], function(context) {
    applyDefaultTemplate(context.context.shape, elementTemplates, commandStack);
  });
  // apply default element templates on connection creation
  eventBus.on([ 'commandStack.connection.create.postExecuted' ], function(context) {
    applyDefaultTemplate(context.context.connection, elementTemplates, commandStack);
  });
}
registerHandlers.$inject = [ 'commandStack', 'elementTemplates', 'eventBus', 'elementRegistry' ];
module.exports = {
  __init__: [ registerHandlers ]
};
function applyDefaultTemplate(element, elementTemplates, commandStack) {
  if (!getTemplate(element, elementTemplates)
      && getDefaultTemplate(element, elementTemplates)) {
    var command = 'propertiesPanel.activiti.changeTemplate';
    var commandContext = {
      element: element,
      newTemplate: getDefaultTemplate(element, elementTemplates)
    };
    commandStack.execute(command, commandContext);
  }
}
ruoyi-bpmnjs/resources/properties-panel/provider/activiti/element-templates/index.js
New file
@@ -0,0 +1,13 @@
module.exports = {
  __depends__: [
    require('./cmd/index'),
    require('diagram-js/lib/i18n/translate').default
  ],
  __init__: [
    'customElementsPropertiesActivator',
    'elementTemplatesLoader'
  ],
  customElementsPropertiesActivator: [ 'type', require('./CustomElementsPropertiesActivator') ],
  elementTemplates: [ 'type', require('./ElementTemplates') ],
  elementTemplatesLoader: [ 'type', require('./ElementTemplatesLoader') ]
};
ruoyi-bpmnjs/resources/properties-panel/provider/activiti/element-templates/parts/ChooserProps.js
New file
@@ -0,0 +1,151 @@
'use strict';
var entryFactory = require('../../../../factory/EntryFactory'),
    is = require('bpmn-js/lib/util/ModelUtil').is,
    getTemplate = require('../Helper').getTemplate,
    getTemplateId = require('../Helper').getTemplateId;
var find = require('lodash/find');
var TEMPLATE_ATTR = require('../Helper').TEMPLATE_ATTR;
function isAny(element, types) {
  return types.reduce(function(result, type) {
    return result || is(element, type);
  }, false);
}
module.exports = function(group, element, elementTemplates, translate) {
  var options = getTemplateOptions(element, elementTemplates, translate);
  if (options.length === 1 && !options[0].isDefault) {
    return;
  }
  // select element template (via dropdown)
  group.entries.push(entryFactory.selectBox({
    id: 'elementTemplate-chooser',
    label: translate('Element Template'),
    modelProperty: 'activiti:modelerTemplate',
    selectOptions: options,
    set: function(element, properties) {
      return applyTemplate(element, properties[TEMPLATE_ATTR], elementTemplates);
    },
    disabled: function() {
      var template = getTemplate(element, elementTemplates);
      return template && isDefaultTemplate(template);
    }
  }));
};
// helpers //////////////////////////////////////
function applyTemplate(element, newTemplateId, elementTemplates) {
  // cleanup
  // clear input output mappings
  // undo changes to properties defined in template
  // re-establish
  // set input output mappings
  // apply changes to properties as defined in new template
  var oldTemplate = getTemplate(element, elementTemplates),
      newTemplate = elementTemplates.get(newTemplateId);
  if (oldTemplate === newTemplate) {
    return;
  }
  return {
    cmd: 'propertiesPanel.activiti.changeTemplate',
    context: {
      element: element,
      oldTemplate: oldTemplate,
      newTemplate: newTemplate
    }
  };
}
function getTemplateOptions(element, elementTemplates, translate) {
  var currentTemplateId = getTemplateId(element);
  var emptyOption = {
    name: '',
    value: ''
  };
  var allOptions = elementTemplates.getAll().reduce(function(templates, t) {
    if (!isAny(element, t.appliesTo)) {
      return templates;
    }
    return templates.concat({
      name: translate(t.name),
      value: t.id,
      isDefault: t.isDefault
    });
  }, [ emptyOption ]);
  var defaultOption = find(allOptions, function(option) {
    return isDefaultTemplate(option);
  });
  var currentOption = find(allOptions, function(option) {
    return option.value === currentTemplateId;
  });
  if (currentTemplateId && !currentOption) {
    currentOption = unknownTemplate(currentTemplateId, translate);
    allOptions.push(currentOption);
  }
  if (!defaultOption) {
    // return all options, including empty
    // and optionally unknownTemplate option
    return allOptions;
  }
  // special limited handling for
  // default options
  var options = [];
  // current template not set
  if (!currentTemplateId) {
    options.push({
      name: '',
      value: ''
    });
  }
  // current template not default
  if (currentOption && currentOption !== defaultOption) {
    options.push(currentOption);
  }
  options.push(defaultOption);
  // [ (empty), (current), defaultOption ]
  return options;
}
function unknownTemplate(templateId, translate) {
  return {
    name: translate('[unknown template: {templateId}]', { templateId: templateId }),
    value: templateId
  };
}
function isDefaultTemplate(elementTemplate) {
  return elementTemplate.isDefault;
}
ruoyi-bpmnjs/resources/properties-panel/provider/activiti/element-templates/parts/CustomProps.js
New file
@@ -0,0 +1,770 @@
'use strict';
var assign = require('lodash/assign');
var entryFactory = require('../../../../factory/EntryFactory'),
    getBusinessObject = require('bpmn-js/lib/util/ModelUtil').getBusinessObject,
    getTemplate = require('../Helper').getTemplate,
    cmdHelper = require('../../../../helper/CmdHelper'),
    elementHelper = require('../../../../helper/ElementHelper');
var findExtension = require('../Helper').findExtension,
    findExtensions = require('../Helper').findExtensions,
    findInputParameter = require('../Helper').findInputParameter,
    findOutputParameter = require('../Helper').findOutputParameter,
    findActivitiProperty = require('../Helper').findActivitiProperty,
    findActivitiInOut = require('../Helper').findActivitiInOut;
var createActivitiProperty = require('../CreateHelper').createActivitiProperty,
    createInputParameter = require('../CreateHelper').createInputParameter,
    createOutputParameter = require('../CreateHelper').createOutputParameter,
    createActivitiIn = require('../CreateHelper').createActivitiIn,
    createActivitiOut = require('../CreateHelper').createActivitiOut,
    createActivitiInWithBusinessKey = require('../CreateHelper').createActivitiInWithBusinessKey,
    createActivitiFieldInjection = require('../CreateHelper').createActivitiFieldInjection;
var ACTIVITI_PROPERTY_TYPE = 'activiti:property',
    ACTIVITI_INPUT_PARAMETER_TYPE = 'activiti:inputParameter',
    ACTIVITI_OUTPUT_PARAMETER_TYPE = 'activiti:outputParameter',
    ACTIVITI_IN_TYPE = 'activiti:in',
    ACTIVITI_OUT_TYPE = 'activiti:out',
    ACTIVITI_IN_BUSINESS_KEY_TYPE = 'activiti:in:businessKey',
    ACTIVITI_EXECUTION_LISTENER_TYPE = 'activiti:executionListener',
    ACTIVITI_FIELD = 'activiti:field';
var BASIC_MODDLE_TYPES = [
  'Boolean',
  'Integer',
  'String'
];
var EXTENSION_BINDING_TYPES = [
  ACTIVITI_PROPERTY_TYPE,
  ACTIVITI_INPUT_PARAMETER_TYPE,
  ACTIVITI_OUTPUT_PARAMETER_TYPE,
  ACTIVITI_IN_TYPE,
  ACTIVITI_OUT_TYPE,
  ACTIVITI_IN_BUSINESS_KEY_TYPE,
  ACTIVITI_FIELD
];
var IO_BINDING_TYPES = [
  ACTIVITI_INPUT_PARAMETER_TYPE,
  ACTIVITI_OUTPUT_PARAMETER_TYPE
];
var IN_OUT_BINDING_TYPES = [
  ACTIVITI_IN_TYPE,
  ACTIVITI_OUT_TYPE,
  ACTIVITI_IN_BUSINESS_KEY_TYPE
];
/**
 * Injects custom properties into the given group.
 *
 * @param {djs.model.Base} element
 * @param {ElementTemplates} elementTemplates
 * @param {BpmnFactory} bpmnFactory
 * @param {Function} translate
 */
module.exports = function(element, elementTemplates, bpmnFactory, translate) {
  var template = getTemplate(element, elementTemplates);
  if (!template) {
    return [];
  }
  var renderCustomField = function(id, p, idx) {
    var propertyType = p.type;
    var entryOptions = {
      id: id,
      description: p.description,
      label: p.label ? translate(p.label) : p.label,
      modelProperty: id,
      get: propertyGetter(id, p),
      set: propertySetter(id, p, bpmnFactory),
      validate: propertyValidator(id, p, translate)
    };
    var entry;
    if (propertyType === 'Boolean') {
      entry = entryFactory.checkbox(entryOptions);
    }
    if (propertyType === 'String') {
      entry = entryFactory.textField(entryOptions);
    }
    if (propertyType === 'Text') {
      entry = entryFactory.textBox(entryOptions);
    }
    if (propertyType === 'Dropdown') {
      entryOptions.selectOptions = p.choices;
      entry = entryFactory.selectBox(entryOptions);
    }
    return entry;
  };
  var groups = [];
  var id, entry;
  var customFieldsGroup = {
    id: 'customField',
    label: translate('Custom Fields'),
    entries: []
  };
  template.properties.forEach(function(p, idx) {
    id = 'custom-' + template.id + '-' + idx;
    entry = renderCustomField(id, p, idx);
    if (entry) {
      customFieldsGroup.entries.push(entry);
    }
  });
  if (customFieldsGroup.entries.length > 0) {
    groups.push(customFieldsGroup);
  }
  if (template.scopes) {
    for (var scopeName in template.scopes) {
      var scope = template.scopes[scopeName];
      var idScopeName = scopeName.replace(/:/g, '_');
      var customScopeFieldsGroup = {
        id: 'customField-' + idScopeName,
        label: translate('Custom Fields for scope: ') + scopeName,
        entries: []
      };
      scope.properties.forEach(function(p, idx) {
        var propertyId = 'custom-' + template.id + '-' + idScopeName + '-' + idx;
        var scopedProperty = propertyWithScope(p, scopeName);
        entry = renderCustomField(propertyId, scopedProperty, idx);
        if (entry) {
          customScopeFieldsGroup.entries.push(entry);
        }
      });
      if (customScopeFieldsGroup.entries.length > 0) {
        groups.push(customScopeFieldsGroup);
      }
    }
  }
  return groups;
};
// getters, setters and validators ///////////////
/**
 * Return a getter that retrieves the given property.
 *
 * @param {String} name
 * @param {PropertyDescriptor} property
 *
 * @return {Function}
 */
function propertyGetter(name, property) {
  /* getter */
  return function get(element) {
    var value = getPropertyValue(element, property);
    return objectWithKey(name, value);
  };
}
/**
 * Return a setter that updates the given property.
 *
 * @param {String} name
 * @param {PropertyDescriptor} property
 * @param {BpmnFactory} bpmnFactory
 *
 * @return {Function}
 */
function propertySetter(name, property, bpmnFactory) {
  /* setter */
  return function set(element, values) {
    var value = values[name];
    return setPropertyValue(element, property, value, bpmnFactory);
  };
}
/**
 * Return a validator that ensures the property is ok.
 *
 * @param {String} name
 * @param {PropertyDescriptor} property
 * @param {Function} translate
 *
 * @return {Function}
 */
function propertyValidator(name, property, translate) {
  /* validator */
  return function validate(element, values) {
    var value = values[name];
    var error = validateValue(value, property, translate);
    if (error) {
      return objectWithKey(name, error);
    }
  };
}
// get, set and validate helpers ///////////////////
/**
 * Return the value of the specified property descriptor,
 * on the passed diagram element.
 *
 * @param {djs.model.Base} element
 * @param {PropertyDescriptor} property
 *
 * @return {Any}
 */
function getPropertyValue(element, property) {
  var bo = getBusinessObject(element);
  var binding = property.binding,
      scope = property.scope;
  var bindingType = binding.type,
      bindingName = binding.name;
  var propertyValue = property.value || '';
  if (scope) {
    bo = findExtension(bo, scope.name);
    if (!bo) {
      return propertyValue;
    }
  }
  // property
  if (bindingType === 'property') {
    var value = bo.get(bindingName);
    if (bindingName === 'conditionExpression') {
      if (value) {
        return value.body;
      } else {
        // return defined default
        return propertyValue;
      }
    } else {
      // return value; default to defined default
      return typeof value !== 'undefined' ? value : propertyValue;
    }
  }
  var activitiProperties,
      activitiProperty;
  if (bindingType === ACTIVITI_PROPERTY_TYPE) {
    if (scope) {
      activitiProperties = bo.get('properties');
    } else {
      activitiProperties = findExtension(bo, 'activiti:Properties');
    }
    if (activitiProperties) {
      activitiProperty = findActivitiProperty(activitiProperties, binding);
      if (activitiProperty) {
        return activitiProperty.value;
      }
    }
    return propertyValue;
  }
  var inputOutput,
      ioParameter;
  if (IO_BINDING_TYPES.indexOf(bindingType) !== -1) {
    if (scope) {
      inputOutput = bo.get('inputOutput');
    } else {
      inputOutput = findExtension(bo, 'activiti:InputOutput');
    }
    if (!inputOutput) {
      // ioParameter cannot exist yet, return property value
      return propertyValue;
    }
  }
  // activiti input parameter
  if (bindingType === ACTIVITI_INPUT_PARAMETER_TYPE) {
    ioParameter = findInputParameter(inputOutput, binding);
    if (ioParameter) {
      if (binding.scriptFormat) {
        if (ioParameter.definition) {
          return ioParameter.definition.value;
        }
      } else {
        return ioParameter.value || '';
      }
    }
    return propertyValue;
  }
  // activiti output parameter
  if (binding.type === ACTIVITI_OUTPUT_PARAMETER_TYPE) {
    ioParameter = findOutputParameter(inputOutput, binding);
    if (ioParameter) {
      return ioParameter.name;
    }
    return propertyValue;
  }
  var ioElement;
  if (IN_OUT_BINDING_TYPES.indexOf(bindingType) != -1) {
    ioElement = findActivitiInOut(bo, binding);
    if (ioElement) {
      if (bindingType === ACTIVITI_IN_BUSINESS_KEY_TYPE) {
        return ioElement.businessKey;
      } else
      if (bindingType === ACTIVITI_OUT_TYPE) {
        return ioElement.target;
      } else
      if (bindingType === ACTIVITI_IN_TYPE) {
        return ioElement[binding.expression ? 'sourceExpression' : 'source'];
      }
    }
    return propertyValue;
  }
  if (bindingType === ACTIVITI_EXECUTION_LISTENER_TYPE) {
    var executionListener;
    if (scope) {
      executionListener = bo.get('executionListener');
    } else {
      executionListener = findExtension(bo, 'activiti:ExecutionListener');
    }
    return executionListener.script.value;
  }
  var fieldInjection;
  if (ACTIVITI_FIELD === bindingType) {
    var fieldInjections = findExtensions(bo, [ 'activiti:Field' ]);
    fieldInjections.forEach(function(item) {
      if (item.name === binding.name) {
        fieldInjection = item;
      }
    });
    if (fieldInjection) {
      return fieldInjection.string || fieldInjection.expression;
    } else {
      return '';
    }
  }
  throw unknownPropertyBinding(property);
}
module.exports.getPropertyValue = getPropertyValue;
/**
 * Return an update operation that changes the diagram
 * element's custom property to the given value.
 *
 * The response of this method will be processed via
 * {@link PropertiesPanel#applyChanges}.
 *
 * @param {djs.model.Base} element
 * @param {PropertyDescriptor} property
 * @param {String} value
 * @param {BpmnFactory} bpmnFactory
 *
 * @return {Object|Array<Object>} results to be processed
 */
function setPropertyValue(element, property, value, bpmnFactory) {
  var bo = getBusinessObject(element);
  var binding = property.binding,
      scope = property.scope;
  var bindingType = binding.type,
      bindingName = binding.name;
  var propertyValue;
  var updates = [];
  var extensionElements;
  if (EXTENSION_BINDING_TYPES.indexOf(bindingType) !== -1) {
    extensionElements = bo.get('extensionElements');
    // create extension elements, if they do not exist (yet)
    if (!extensionElements) {
      extensionElements = elementHelper.createElement('bpmn:ExtensionElements', null, element, bpmnFactory);
      updates.push(cmdHelper.updateBusinessObject(
        element, bo, objectWithKey('extensionElements', extensionElements)
      ));
    }
  }
  if (scope) {
    bo = findExtension(bo, scope.name);
    if (!bo) {
      bo = elementHelper.createElement(scope.name, null, element, bpmnFactory);
      updates.push(cmdHelper.addElementsTolist(
        bo, extensionElements, 'values', [ bo ]
      ));
    }
  }
  // property
  if (bindingType === 'property') {
    if (bindingName === 'conditionExpression') {
      propertyValue = elementHelper.createElement('bpmn:FormalExpression', {
        body: value,
        language: binding.scriptFormat
      }, bo, bpmnFactory);
    } else {
      var moddlePropertyDescriptor = bo.$descriptor.propertiesByName[bindingName];
      var moddleType = moddlePropertyDescriptor.type;
      // make sure we only update String, Integer, Real and
      // Boolean properties (do not accidentally override complex objects...)
      if (BASIC_MODDLE_TYPES.indexOf(moddleType) === -1) {
        throw new Error('cannot set moddle type <' + moddleType + '>');
      }
      if (moddleType === 'Boolean') {
        propertyValue = !!value;
      } else
      if (moddleType === 'Integer') {
        propertyValue = parseInt(value, 10);
        if (isNaN(propertyValue)) {
          // do not write NaN value
          propertyValue = undefined;
        }
      } else {
        propertyValue = value;
      }
    }
    if (propertyValue !== undefined) {
      updates.push(cmdHelper.updateBusinessObject(
        element, bo, objectWithKey(bindingName, propertyValue)
      ));
    }
  }
  // activiti:property
  var activitiProperties,
      existingActivitiProperty,
      newActivitiProperty;
  if (bindingType === ACTIVITI_PROPERTY_TYPE) {
    if (scope) {
      activitiProperties = bo.get('properties');
    } else {
      activitiProperties = findExtension(extensionElements, 'activiti:Properties');
    }
    if (!activitiProperties) {
      activitiProperties = elementHelper.createElement('activiti:Properties', null, bo, bpmnFactory);
      if (scope) {
        updates.push(cmdHelper.updateBusinessObject(
          element, bo, { properties: activitiProperties }
        ));
      }
      else {
        updates.push(cmdHelper.addElementsTolist(
          element, extensionElements, 'values', [ activitiProperties ]
        ));
      }
    }
    existingActivitiProperty = findActivitiProperty(activitiProperties, binding);
    newActivitiProperty = createActivitiProperty(binding, value, bpmnFactory);
    updates.push(cmdHelper.addAndRemoveElementsFromList(
      element,
      activitiProperties,
      'values',
      null,
      [ newActivitiProperty ],
      existingActivitiProperty ? [ existingActivitiProperty ] : []
    ));
  }
  // activiti:inputParameter
  // activiti:outputParameter
  var inputOutput,
      existingIoParameter,
      newIoParameter;
  if (IO_BINDING_TYPES.indexOf(bindingType) !== -1) {
    if (scope) {
      inputOutput = bo.get('inputOutput');
    } else {
      inputOutput = findExtension(extensionElements, 'activiti:InputOutput');
    }
    // create inputOutput element, if it do not exist (yet)
    if (!inputOutput) {
      inputOutput = elementHelper.createElement('activiti:InputOutput', null, bo, bpmnFactory);
      if (scope) {
        updates.push(cmdHelper.updateBusinessObject(
          element, bo, { inputOutput: inputOutput }
        ));
      }
      else {
        updates.push(cmdHelper.addElementsTolist(
          element, extensionElements, 'values', inputOutput
        ));
      }
    }
  }
  if (bindingType === ACTIVITI_INPUT_PARAMETER_TYPE) {
    existingIoParameter = findInputParameter(inputOutput, binding);
    newIoParameter = createInputParameter(binding, value, bpmnFactory);
    updates.push(cmdHelper.addAndRemoveElementsFromList(
      element,
      inputOutput,
      'inputParameters',
      null,
      [ newIoParameter ],
      existingIoParameter ? [ existingIoParameter ] : []
    ));
  }
  if (bindingType === ACTIVITI_OUTPUT_PARAMETER_TYPE) {
    existingIoParameter = findOutputParameter(inputOutput, binding);
    newIoParameter = createOutputParameter(binding, value, bpmnFactory);
    updates.push(cmdHelper.addAndRemoveElementsFromList(
      element,
      inputOutput,
      'outputParameters',
      null,
      [ newIoParameter ],
      existingIoParameter ? [ existingIoParameter ] : []
    ));
  }
  // activiti:in
  // activiti:out
  // activiti:in:businessKey
  var existingInOut,
      newInOut;
  if (IN_OUT_BINDING_TYPES.indexOf(bindingType) !== -1) {
    existingInOut = findActivitiInOut(bo, binding);
    if (bindingType === ACTIVITI_IN_TYPE) {
      newInOut = createActivitiIn(binding, value, bpmnFactory);
    } else
    if (bindingType === ACTIVITI_OUT_TYPE) {
      newInOut = createActivitiOut(binding, value, bpmnFactory);
    } else {
      newInOut = createActivitiInWithBusinessKey(binding, value, bpmnFactory);
    }
    updates.push(cmdHelper.addAndRemoveElementsFromList(
      element,
      extensionElements,
      'values',
      null,
      [ newInOut ],
      existingInOut ? [ existingInOut ] : []
    ));
  }
  if (bindingType === ACTIVITI_FIELD) {
    var existingFieldInjections = findExtensions(bo, [ 'activiti:Field' ]);
    var newFieldInjections = [];
    if (existingFieldInjections.length > 0) {
      existingFieldInjections.forEach(function(item) {
        if (item.name === binding.name) {
          newFieldInjections.push(createActivitiFieldInjection(binding, value, bpmnFactory));
        } else {
          newFieldInjections.push(item);
        }
      });
    } else {
      newFieldInjections.push(createActivitiFieldInjection(binding, value, bpmnFactory));
    }
    updates.push(cmdHelper.addAndRemoveElementsFromList(
      element,
      extensionElements,
      'values',
      null,
      newFieldInjections,
      existingFieldInjections ? existingFieldInjections : []
    ));
  }
  if (updates.length) {
    return updates;
  }
  // quick warning for better debugging
  console.warn('no update', element, property, value);
}
module.exports.setPropertyValue = setPropertyValue;
/**
 * Validate value of a given property.
 *
 * @param {String} value
 * @param {PropertyDescriptor} property
 * @param {Function} translate
 *
 * @return {Object} with validation errors
 */
function validateValue(value, property, translate) {
  var constraints = property.constraints || {};
  if (constraints.notEmpty && isEmpty(value)) {
    return translate('Must not be empty');
  }
  if (constraints.maxLength && value.length > constraints.maxLength) {
    return translate('Must have max length {length}', { length: constraints.maxLength });
  }
  if (constraints.minLength && value.length < constraints.minLength) {
    return translate('Must have min length {length}', { length: constraints.minLength });
  }
  var pattern = constraints.pattern,
      message;
  if (pattern) {
    if (typeof pattern !== 'string') {
      message = pattern.message;
      pattern = pattern.value;
    }
    if (!matchesPattern(value, pattern)) {
      return message || translate('Must match pattern {pattern}', { pattern: pattern });
    }
  }
}
// misc helpers ///////////////////////////////
function propertyWithScope(property, scopeName) {
  if (!scopeName) {
    return property;
  }
  return assign({}, property, {
    scope: {
      name: scopeName
    }
  });
}
/**
 * Return an object with a single key -> value association.
 *
 * @param {String} key
 * @param {Any} value
 *
 * @return {Object}
 */
function objectWithKey(key, value) {
  var obj = {};
  obj[key] = value;
  return obj;
}
/**
 * Does the given string match the specified pattern?
 *
 * @param {String} str
 * @param {String} pattern
 *
 * @return {Boolean}
 */
function matchesPattern(str, pattern) {
  var regexp = new RegExp(pattern);
  return regexp.test(str);
}
function isEmpty(str) {
  return !str || /^\s*$/.test(str);
}
/**
 * Create a new {@link Error} indicating an unknown
 * property binding.
 *
 * @param {PropertyDescriptor} property
 *
 * @return {Error}
 */
function unknownPropertyBinding(property) {
  var binding = property.binding;
  return new Error('unknown binding: <' + binding.type + '>');
}
ruoyi-bpmnjs/resources/properties-panel/provider/activiti/element-templates/util/validate.js
New file
@@ -0,0 +1,16 @@
'use strict';
var Validator = require('../Validator');
/**
 * Validate the given template descriptors and
 * return a list of errors.
 *
 * @param {Array<TemplateDescriptor>} descriptors
 *
 * @return {Array<Error>}
 */
module.exports = function validate(descriptors) {
  return new Validator().addAll(descriptors).getErrors();
};
ruoyi-bpmnjs/resources/properties-panel/provider/activiti/index.js
New file
@@ -0,0 +1,9 @@
module.exports = {
  __depends__: [
    require('./element-templates/index'),
    require('diagram-js/lib/i18n/translate').default
  ],
  __init__: [ 'propertiesProvider' ],
  propertiesProvider: [ 'type', require('./ActivitiPropertiesProvider') ]
};
ruoyi-bpmnjs/resources/properties-panel/provider/activiti/parts/AsynchronousContinuationProps.js
New file
@@ -0,0 +1,16 @@
'use strict';
var getBusinessObject = require('bpmn-js/lib/util/ModelUtil').getBusinessObject,
    is = require('bpmn-js/lib/util/ModelUtil').is,
    asyncContinuation = require('./implementation/AsyncContinuation');
module.exports = function(group, element, bpmnFactory, translate) {
  if (is(element, 'activiti:AsyncCapable')) {
    group.entries = group.entries.concat(asyncContinuation(element, bpmnFactory, {
      getBusinessObject: getBusinessObject
    }, translate));
  }
};
ruoyi-bpmnjs/resources/properties-panel/provider/activiti/parts/CallActivityProps.js
New file
@@ -0,0 +1,90 @@
'use strict';
var getBusinessObject = require('bpmn-js/lib/util/ModelUtil').getBusinessObject,
    is = require('bpmn-js/lib/util/ModelUtil').is;
var entryFactory = require('../../../factory/EntryFactory');
var callable = require('./implementation/Callable');
var cmdHelper = require('../../../helper/CmdHelper');
var flattenDeep = require('lodash/flattenDeep');
var assign = require('lodash/assign');
function getCallableType(element) {
  var bo = getBusinessObject(element);
  var boCalledElement = bo.get('calledElement'),
      boCaseRef = bo.get('activiti:caseRef');
  var callActivityType = '';
  if (typeof boCalledElement !== 'undefined') {
    callActivityType = 'bpmn';
  } else
  if (typeof boCaseRef !== 'undefined') {
    callActivityType = 'cmmn';
  }
  return callActivityType;
}
var DEFAULT_PROPS = {
  calledElement: undefined,
  'activiti:calledElementBinding': 'latest',
  'activiti:calledElementVersion': undefined,
  'activiti:calledElementTenantId': undefined,
  'activiti:variableMappingClass' : undefined,
  'activiti:variableMappingDelegateExpression' : undefined,
  'activiti:caseRef': undefined,
  'activiti:caseBinding': 'latest',
  'activiti:caseVersion': undefined,
  'activiti:caseTenantId': undefined
};
module.exports = function(group, element, bpmnFactory, translate) {
  if (!is(element, 'activiti:CallActivity')) {
    return;
  }
  group.entries.push(entryFactory.selectBox({
    id : 'callActivity',
    label: translate('CallActivity Type'),
    selectOptions: [
      { name: 'BPMN', value: 'bpmn' },
      { name: 'CMMN', value: 'cmmn' }
    ],
    emptyParameter: true,
    modelProperty: 'callActivityType',
    get: function(element, node) {
      return {
        callActivityType: getCallableType(element)
      };
    },
    set: function(element, values, node) {
      var type = values.callActivityType;
      var props = assign({}, DEFAULT_PROPS);
      if (type === 'bpmn') {
        props.calledElement = '';
      }
      else if (type === 'cmmn') {
        props['activiti:caseRef'] = '';
      }
      return cmdHelper.updateProperties(element, props);
    }
  }));
  group.entries.push(callable(element, bpmnFactory, {
    getCallableType: getCallableType
  }, translate));
  group.entries = flattenDeep(group.entries);
};
ruoyi-bpmnjs/resources/properties-panel/provider/activiti/parts/CandidateStarterProps.js
New file
@@ -0,0 +1,27 @@
'use strict';
var is = require('bpmn-js/lib/util/ModelUtil').is,
    getBusinessObject = require('bpmn-js/lib/util/ModelUtil').getBusinessObject;
var candidateStarter = require('./implementation/CandidateStarter');
module.exports = function(group, element, bpmnFactory, translate) {
  var businessObject = getBusinessObject(element);
  if (is(element, 'activiti:Process') ||
      is(element, 'bpmn:Participant') && businessObject.get('processRef')) {
    group.entries = group.entries.concat(candidateStarter(element, bpmnFactory, {
      getBusinessObject: function(element) {
        var bo = getBusinessObject(element);
        if (!is(bo, 'bpmn:Participant')) {
          return bo;
        }
        return bo.get('processRef');
      }
    }, translate));
  }
};
ruoyi-bpmnjs/resources/properties-panel/provider/activiti/parts/ConditionalProps.js
New file
@@ -0,0 +1,185 @@
'use strict';
var is = require('bpmn-js/lib/util/ModelUtil').is,
    isAny = require('bpmn-js/lib/features/modeling/util/ModelingUtil').isAny,
    getBusinessObject = require('bpmn-js/lib/util/ModelUtil').getBusinessObject,
    escapeHTML = require('../../../Utils').escapeHTML,
    domQuery = require('min-dom').query,
    cmdHelper = require('../../../helper/CmdHelper'),
    elementHelper = require('../../../helper/ElementHelper'),
    eventDefinitionHelper = require('../../../helper/EventDefinitionHelper'),
    scriptImplementation = require('./implementation/Script');
module.exports = function(group, element, bpmnFactory, translate) {
  var bo = getBusinessObject(element);
  if (!bo) {
    return;
  }
  var conditionalEventDefinition = eventDefinitionHelper.getConditionalEventDefinition(element);
  if (!(is(element, 'bpmn:SequenceFlow') && isConditionalSource(element.source))
    && !conditionalEventDefinition) {
    return;
  }
  var script = scriptImplementation('language', 'body', true, translate);
  group.entries.push({
    id: 'condition',
    label: translate('Condition'),
    html: '<div class="bpp-row">' +
              '<label for="cam-condition-type">'+ escapeHTML(translate('Condition Type')) + '</label>' +
              '<div class="bpp-field-wrapper">' +
                '<select id="cam-condition-type" name="conditionType" data-value>' +
                  '<option value="expression">'+ escapeHTML(translate('Expression')) + '</option>' +
                  '<option value="script">'+ escapeHTML(translate('Script')) + '</option>' +
                  '<option value="" selected></option>' +
                '</select>' +
              '</div>' +
            '</div>' +
            // expression
            '<div class="bpp-row">' +
              '<label for="cam-condition" data-show="isExpression">' + escapeHTML(translate('Expression')) + '</label>' +
              '<div class="bpp-field-wrapper" data-show="isExpression">' +
                '<input id="cam-condition" type="text" name="condition" />' +
                '<button class="clear" data-action="clear" data-show="canClear">' +
                  '<span>X</span>' +
                '</button>' +
              '</div>' +
              '<div data-show="isScript">' +
                script.template +
              '</div>' +
            '</div>',
    get: function(element, propertyName) {
      var conditionalEventDefinition = eventDefinitionHelper.getConditionalEventDefinition(element);
      var conditionExpression = conditionalEventDefinition
        ? conditionalEventDefinition.condition
        : bo.conditionExpression;
      var values = {},
          conditionType = '';
      if (conditionExpression) {
        var conditionLanguage = conditionExpression.language;
        if (typeof conditionLanguage !== 'undefined') {
          conditionType = 'script';
          values = script.get(element, conditionExpression);
        } else {
          conditionType = 'expression';
          values.condition = conditionExpression.get('body');
        }
      }
      values.conditionType = conditionType;
      return values;
    },
    set: function(element, values, containerElement) {
      var conditionType = values.conditionType;
      var commands = [];
      var conditionProps = {
        body: undefined
      };
      if (conditionType === 'script') {
        conditionProps = script.set(element, values, containerElement);
      } else {
        var condition = values.condition;
        conditionProps.body = condition;
      }
      var conditionOrConditionExpression;
      if (conditionType) {
        conditionOrConditionExpression = elementHelper.createElement(
          'bpmn:FormalExpression',
          conditionProps,
          conditionalEventDefinition || bo,
          bpmnFactory
        );
        var source = element.source;
        // if default-flow, remove default-property from source
        if (source && source.businessObject.default === bo) {
          commands.push(cmdHelper.updateProperties(source, { 'default': undefined }));
        }
      }
      var update = conditionalEventDefinition
        ? { condition: conditionOrConditionExpression }
        : { conditionExpression: conditionOrConditionExpression };
      commands.push(cmdHelper.updateBusinessObject(element, conditionalEventDefinition || bo, update));
      return commands;
    },
    validate: function(element, values) {
      var validationResult = {};
      if (!values.condition && values.conditionType === 'expression') {
        validationResult.condition = translate('Must provide a value');
      }
      else if (values.conditionType === 'script') {
        validationResult = script.validate(element, values);
      }
      return validationResult;
    },
    isExpression: function(element, inputNode) {
      var conditionType = domQuery('select[name=conditionType]', inputNode);
      if (conditionType.selectedIndex >= 0) {
        return conditionType.options[conditionType.selectedIndex].value === 'expression';
      }
    },
    isScript: function(element, inputNode) {
      var conditionType = domQuery('select[name=conditionType]', inputNode);
      if (conditionType.selectedIndex >= 0) {
        return conditionType.options[conditionType.selectedIndex].value === 'script';
      }
    },
    clear: function(element, inputNode) {
      // clear text input
      domQuery('input[name=condition]', inputNode).value='';
      return true;
    },
    canClear: function(element, inputNode) {
      var input = domQuery('input[name=condition]', inputNode);
      return input.value !== '';
    },
    script : script,
    cssClasses: [ 'bpp-textfield' ]
  });
};
// utilities //////////////////////////
var CONDITIONAL_SOURCES = [
  'bpmn:Activity',
  'bpmn:ExclusiveGateway',
  'bpmn:InclusiveGateway',
  'bpmn:ComplexGateway'
];
function isConditionalSource(element) {
  return isAny(element, CONDITIONAL_SOURCES);
}
ruoyi-bpmnjs/resources/properties-panel/provider/activiti/parts/ConnectorDetailProps.js
New file
@@ -0,0 +1,57 @@
'use strict';
var ImplementationTypeHelper = require('../../../helper/ImplementationTypeHelper'),
    InputOutputHelper = require('../../../helper/InputOutputHelper');
var entryFactory = require('../../../factory/EntryFactory'),
    cmdHelper = require('../../../helper/CmdHelper');
function getImplementationType(element) {
  return ImplementationTypeHelper.getImplementationType(element);
}
function getBusinessObject(element) {
  return ImplementationTypeHelper.getServiceTaskLikeBusinessObject(element);
}
function getConnector(bo) {
  return InputOutputHelper.getConnector(bo);
}
function isConnector(element) {
  return getImplementationType(element) === 'connector';
}
module.exports = function(group, element, bpmnFactory, translate) {
  group.entries.push(entryFactory.textField({
    id: 'connectorId',
    label: translate('Connector Id'),
    modelProperty: 'connectorId',
    get: function(element, node) {
      var bo = getBusinessObject(element);
      var connector = bo && getConnector(bo);
      var value = connector && connector.get('connectorId');
      return { connectorId: value };
    },
    set: function(element, values, node) {
      var bo = getBusinessObject(element);
      var connector = getConnector(bo);
      return cmdHelper.updateBusinessObject(element, connector, {
        connectorId: values.connectorId || undefined
      });
    },
    validate: function(element, values, node) {
      return isConnector(element) && !values.connectorId ? { connectorId: translate('Must provide a value') } : {};
    },
    hidden: function(element, node) {
      return !isConnector(element);
    }
  }));
};
ruoyi-bpmnjs/resources/properties-panel/provider/activiti/parts/ConnectorInputOutputParameterProps.js
New file
@@ -0,0 +1,16 @@
'use strict';
var assign = require('lodash/assign');
var inputOutputParameter = require('./implementation/InputOutputParameter');
module.exports = function(group, element, bpmnFactory, options, translate) {
  options = assign({
    idPrefix: 'connector-',
    insideConnector: true
  }, options);
  group.entries = group.entries.concat(inputOutputParameter(element, bpmnFactory, options, translate));
};
ruoyi-bpmnjs/resources/properties-panel/provider/activiti/parts/ConnectorInputOutputProps.js
New file
@@ -0,0 +1,18 @@
'use strict';
var inputOutput = require('./implementation/InputOutput');
module.exports = function(group, element, bpmnFactory, translate) {
  var inputOutputEntry = inputOutput(element, bpmnFactory, {
    idPrefix: 'connector-',
    insideConnector: true
  }, translate);
  group.entries = group.entries.concat(inputOutputEntry.entries);
  return {
    getSelectedParameter: inputOutputEntry.getSelectedParameter
  };
};
ruoyi-bpmnjs/resources/properties-panel/provider/activiti/parts/ErrorEventProps.js
New file
@@ -0,0 +1,40 @@
'use strict';
var is = require('bpmn-js/lib/util/ModelUtil').is,
    eventDefinitionHelper = require('../../../helper/EventDefinitionHelper'),
    error = require('./implementation/ErrorEventDefinition');
var forEach = require('lodash/forEach');
module.exports = function(group, element, bpmnFactory, translate) {
  var errorEvents = [
    'bpmn:StartEvent',
    'bpmn:BoundaryEvent',
    'bpmn:EndEvent'
  ];
  forEach(errorEvents, function(event) {
    if (is(element, event)) {
      var errorEventDefinition = eventDefinitionHelper.getErrorEventDefinition(element);
      if (errorEventDefinition) {
        var isCatchingErrorEvent = is(element, 'bpmn:StartEvent') || is (element, 'bpmn:BoundaryEvent');
        var showErrorCodeVariable = isCatchingErrorEvent,
            showErrorMessageVariable = isCatchingErrorEvent;
        error(
          group,
          element,
          bpmnFactory,
          errorEventDefinition,
          showErrorCodeVariable,
          showErrorMessageVariable,
          translate);
      }
    }
  });
};
ruoyi-bpmnjs/resources/properties-panel/provider/activiti/parts/ExternalTaskConfigurationProps.js
New file
@@ -0,0 +1,40 @@
'use strict';
var is = require('bpmn-js/lib/util/ModelUtil').is,
    getBusinessObject = require('bpmn-js/lib/util/ModelUtil').getBusinessObject;
var ImplementationTypeHelper = require('../../../helper/ImplementationTypeHelper');
var externalTaskPriority = require('./implementation/ExternalTaskPriority');
function getServiceTaskLikeBusinessObject(element) {
  var bo = ImplementationTypeHelper.getServiceTaskLikeBusinessObject(element);
  // if the element is not a serviceTaskLike element, fetch the normal business object
  // This avoids the loss of the process / participant business object
  if (!bo) {
    bo = getBusinessObject(element);
  }
  return bo;
}
module.exports = function(group, element, bpmnFactory, translate) {
  var bo = getServiceTaskLikeBusinessObject(element);
  if (!bo) {
    return;
  }
  if (is(bo, 'activiti:TaskPriorized') || (is(bo, 'bpmn:Participant')) && bo.get('processRef')) {
    group.entries = group.entries.concat(externalTaskPriority(element, bpmnFactory, {
      getBusinessObject: function(element) {
        if (!is(bo, 'bpmn:Participant')) {
          return bo;
        }
        return bo.get('processRef');
      }
    }, translate));
  }
};
ruoyi-bpmnjs/resources/properties-panel/provider/activiti/parts/FieldInjectionProps.js
New file
@@ -0,0 +1,21 @@
'use strict';
var ImplementationTypeHelper = require('../../../helper/ImplementationTypeHelper');
var fieldInjection = require('./implementation/FieldInjection');
module.exports = function(group, element, bpmnFactory, translate) {
  var bo = ImplementationTypeHelper.getServiceTaskLikeBusinessObject(element);
  if (!bo) {
    return;
  }
  var fieldInjectionEntry = fieldInjection(element, bpmnFactory, translate, { businessObject: bo });
  if (fieldInjectionEntry && fieldInjectionEntry.length > 0) {
    group.entries = group.entries.concat(fieldInjectionEntry);
  }
};
ruoyi-bpmnjs/resources/properties-panel/provider/activiti/parts/FormProps.js
New file
@@ -0,0 +1,476 @@
'use strict';
var getBusinessObject = require('bpmn-js/lib/util/ModelUtil').getBusinessObject,
    getExtensionElements = require('../../../helper/ExtensionElementsHelper').getExtensionElements,
    removeEntry = require('../../../helper/ExtensionElementsHelper').removeEntry,
    extensionElements = require('./implementation/ExtensionElements'),
    properties = require('./implementation/Properties'),
    entryFactory = require('../../../factory/EntryFactory'),
    elementHelper = require('../../../helper/ElementHelper'),
    cmdHelper = require('../../../helper/CmdHelper'),
    formHelper = require('../../../helper/FormHelper'),
    utils = require('../../../Utils'),
    is = require('bpmn-js/lib/util/ModelUtil').is,
    find = require('lodash/find'),
    each = require('lodash/forEach');
function generateValueId() {
  return utils.nextId('Value_');
}
/**
 * Generate a form field specific textField using entryFactory.
 *
 * @param  {string} options.id
 * @param  {string} options.label
 * @param  {string} options.modelProperty
 * @param  {function} options.validate
 *
 * @return {Object} an entryFactory.textField object
 */
function formFieldTextField(options, getSelectedFormField) {
  var id = options.id,
      label = options.label,
      modelProperty = options.modelProperty,
      validate = options.validate;
  return entryFactory.textField({
    id: id,
    label: label,
    modelProperty: modelProperty,
    get: function(element, node) {
      var selectedFormField = getSelectedFormField(element, node) || {},
          values = {};
      values[modelProperty] = selectedFormField[modelProperty];
      return values;
    },
    set: function(element, values, node) {
      var commands = [];
      if (typeof options.set === 'function') {
        var cmd = options.set(element, values, node);
        if (cmd) {
          commands.push(cmd);
        }
      }
      var formField = getSelectedFormField(element, node),
          properties = {};
      properties[modelProperty] = values[modelProperty] || undefined;
      commands.push(cmdHelper.updateBusinessObject(element, formField, properties));
      return commands;
    },
    hidden: function(element, node) {
      return !getSelectedFormField(element, node);
    },
    validate: validate
  });
}
function ensureFormKeyAndDataSupported(element) {
  return (
    is(element, 'bpmn:StartEvent') && !is(element.parent, 'bpmn:SubProcess')
  ) || is(element, 'bpmn:UserTask');
}
module.exports = function(group, element, bpmnFactory, translate) {
  if (!ensureFormKeyAndDataSupported(element)) {
    return;
  }
  /**
   * Return the currently selected form field querying the form field select box
   * from the DOM.
   *
   * @param  {djs.model.Base} element
   * @param  {DOMElement} node - DOM element of any form field text input
   *
   * @return {ModdleElement} the currently selected form field
   */
  function getSelectedFormField(element, node) {
    var selected = formFieldsEntry.getSelected(element, node.parentNode);
    if (selected.idx === -1) {
      return;
    }
    return formHelper.getFormField(element, selected.idx);
  }
  // [FormKey] form key text input field
  group.entries.push(entryFactory.textField({
    id : 'form-key',
    label : translate('Form Key'),
    modelProperty: 'formKey',
    get: function(element, node) {
      var bo = getBusinessObject(element);
      return {
        formKey: bo.get('activiti:formKey')
      };
    },
    set: function(element, values, node) {
      var bo = getBusinessObject(element),
          formKey = values.formKey || undefined;
      return cmdHelper.updateBusinessObject(element, bo, { 'activiti:formKey': formKey });
    }
  }));
  // [FormData] form field select box
  var formFieldsEntry = extensionElements(element, bpmnFactory, {
    id: 'form-fields',
    label: translate('Form Fields'),
    modelProperty: 'id',
    prefix: 'FormProperty',
    createExtensionElement: function(element, extensionElements, value) {
      var bo = getBusinessObject(element), commands = [];
      if (!extensionElements) {
        extensionElements = elementHelper.createElement('bpmn:ExtensionElements', { values: [] }, bo, bpmnFactory);
        commands.push(cmdHelper.updateProperties(element, { extensionElements: extensionElements }));
      }
     /* var formData = formHelper.getFormData(element);
      if (!formData) {
        formData = elementHelper.createElement('activiti:FormData', { fields: [] }, extensionElements, bpmnFactory);
        commands.push(cmdHelper.addAndRemoveElementsFromList(
          element,
          extensionElements,
          'values',
          'extensionElements',
          [formData],
          []
        ));
      }*/
      /**activiti 是向 extensionElements 下追加元素,而不是 formData 下,*/
      var field = elementHelper.createElement('activiti:FormProperty', { id: value }, extensionElements, bpmnFactory);
      if (typeof extensionElements.values !== 'undefined') {
        commands.push(cmdHelper.addElementsTolist(element, extensionElements, 'values', [ field ]));
      } else {
        commands.push(cmdHelper.updateBusinessObject(element, extensionElements, {
            values: [ field ]
        }));
      }
      return commands;
    },
    removeExtensionElement: function(element, extensionElements, value, idx) {
      var fields = formHelper.getFormFields(element);
      var entry = fields[idx],
          commands = [];
      if (fields.length < 2) {
        commands.push(removeEntry(getBusinessObject(element), element, extensionElements));
      } else {
        commands.push(cmdHelper.removeElementsFromList(element, extensionElements, 'values', null, [entry]));
       /* if (entry.id === formData.get('businessKey')) {
          commands.push(cmdHelper.updateBusinessObject(element, extensionElements, { 'businessKey': undefined }));
        }*/
      }
      return commands;
    },
    getExtensionElements: function(element) {
      return formHelper.getFormFields(element);
    },
    hideExtensionElements: function(element, node) {
      return false;
    }
  });
  group.entries.push(formFieldsEntry);
  // [FormData] Form Field label
  group.entries.push(entryFactory.label({
    id: 'form-field-header',
    labelText: translate('Form Field'),
    showLabel: function(element, node) {
      return !!getSelectedFormField(element, node);
    }
  }));
  // [FormData] form field id text input field
  group.entries.push(entryFactory.validationAwareTextField({
    id: 'form-field-id',
    label: translate('ID'),
    modelProperty: 'id',
    getProperty: function(element, node) {
      var selectedFormField = getSelectedFormField(element, node) || {};
      return selectedFormField.id;
    },
    setProperty: function(element, properties, node) {
      var formField = getSelectedFormField(element, node);
      return cmdHelper.updateBusinessObject(element, formField, properties);
    },
    hidden: function(element, node) {
      return !getSelectedFormField(element, node);
    },
    validate: function(element, values, node) {
      var formField = getSelectedFormField(element, node);
      if (formField) {
        var idValue = values.id;
        if (!idValue || idValue.trim() === '') {
          return { id: 'Form field id must not be empty' };
        }
        var formFields = formHelper.getFormFields(element);
        var existingFormField = find(formFields, function(f) {
          return f !== formField && f.id === idValue;
        });
        if (existingFormField) {
          return { id: 'Form field id already used in form data.' };
        }
      }
    }
  }));
  // [FormData] form field type combo box
  group.entries.push(entryFactory.comboBox({
    id: 'form-field-type',
    label: translate('Type'),
    selectOptions: [
      { name: 'string', value: 'string' },
      { name: 'long', value: 'long' },
      { name: 'boolean', value: 'boolean' },
      { name: 'date', value: 'date' },
      { name: 'enum', value: 'enum' }
    ],
    modelProperty: 'type',
    emptyParameter: true,
    get: function(element, node) {
      var selectedFormField = getSelectedFormField(element, node);
      if (selectedFormField) {
        return { type: selectedFormField.type };
      } else {
        return {};
      }
    },
    set: function(element, values, node) {
      var selectedFormField = getSelectedFormField(element, node),
          commands = [];
      if (selectedFormField.type === 'enum' && values.type !== 'enum') {
        // delete activiti:value objects from formField.values when switching from type enum
        commands.push(cmdHelper.updateBusinessObject(element, selectedFormField, { values: undefined }));
      }
      commands.push(cmdHelper.updateBusinessObject(element, selectedFormField, values));
      return commands;
    },
    hidden: function(element, node) {
      return !getSelectedFormField(element, node);
    }
  }));
  // [FormData] form field label text input field
  group.entries.push(formFieldTextField({
    id: 'form-field-label',
    label: translate('Label'),
    modelProperty: 'label'
  }, getSelectedFormField));
  // [FormData] form field defaultValue text input field
  group.entries.push(formFieldTextField({
    id: 'form-field-defaultValue',
    label: translate('Default Value'),
    modelProperty: 'defaultValue'
  }, getSelectedFormField));
  // [FormData] form field enum values label
  group.entries.push(entryFactory.label({
    id: 'form-field-enum-values-header',
    labelText: translate('Values'),
    divider: true,
    showLabel: function(element, node) {
      var selectedFormField = getSelectedFormField(element, node);
      return selectedFormField && selectedFormField.type === 'enum';
    }
  }));
  // [FormData] form field enum values table
  group.entries.push(entryFactory.table({
    id: 'form-field-enum-values',
    labels: [ translate('Id'), translate('Name') ],
    modelProperties: [ 'id', 'name' ],
    addLabel:translate('Add Value'),
    show: function(element, node) {
      var selectedFormField = getSelectedFormField(element, node);
      return selectedFormField && selectedFormField.type === 'enum';
    },
    getElements: function(element, node) {
      var selectedFormField = getSelectedFormField(element, node);
      return formHelper.getEnumValues(selectedFormField);
    },
    addElement: function(element, node) {
      var selectedFormField = getSelectedFormField(element, node),
          id = generateValueId();
      var enumValue = elementHelper.createElement(
        'activiti:Value',
        { id: id, name: undefined },
        getBusinessObject(element),
        bpmnFactory
      );
      return cmdHelper.addElementsTolist(element, selectedFormField, 'values', [enumValue]);
    },
    removeElement: function(element, node, idx) {
      var selectedFormField = getSelectedFormField(element, node),
          enumValue = selectedFormField.values[idx];
      return cmdHelper.removeElementsFromList(element, selectedFormField, 'values', null, [enumValue]);
    },
    updateElement: function(element, value, node, idx) {
      var selectedFormField = getSelectedFormField(element, node),
          enumValue = selectedFormField.values[idx];
      value.name = value.name || undefined;
      return cmdHelper.updateBusinessObject(element, enumValue, value);
    },
    validate: function(element, value, node, idx) {
      var selectedFormField = getSelectedFormField(element, node),
          enumValue = selectedFormField.values[idx];
      if (enumValue) {
        // check if id is valid
        var validationError = utils.isIdValid(enumValue, value.id, translate);
        if (validationError) {
          return { id: validationError };
        }
      }
    }
  }));
  // [FormData] Validation label
  group.entries.push(entryFactory.label({
    id: 'form-field-validation-header',
    labelText: translate('Validation'),
    divider: true,
    showLabel: function(element, node) {
      return !!getSelectedFormField(element, node);
    }
  }));
  // [FormData] form field constraints table
  group.entries.push(entryFactory.table({
    id: 'constraints-list',
    modelProperties: [ 'name', 'config' ],
    labels: [ translate('Name'), translate('Config') ],
    addLabel: translate('Add Constraint'),
    getElements: function(element, node) {
      var formField = getSelectedFormField(element, node);
      return formHelper.getConstraints(formField);
    },
    addElement: function(element, node) {
      var commands = [],
          formField = getSelectedFormField(element, node),
          validation = formField.validation;
      if (!validation) {
        // create validation business object and add it to form data, if it doesn't exist
        validation = elementHelper.createElement('activiti:Validation', {}, getBusinessObject(element), bpmnFactory);
        commands.push(cmdHelper.updateBusinessObject(element, formField, { 'validation': validation }));
      }
      var newConstraint = elementHelper.createElement(
        'activiti:Constraint',
        { name: undefined, config: undefined },
        validation,
        bpmnFactory
      );
      commands.push(cmdHelper.addElementsTolist(element, validation, 'constraints', [ newConstraint ]));
      return commands;
    },
    updateElement: function(element, value, node, idx) {
      var formField = getSelectedFormField(element, node),
          constraint = formHelper.getConstraints(formField)[idx];
      value.name = value.name || undefined;
      value.config = value.config || undefined;
      return cmdHelper.updateBusinessObject(element, constraint, value);
    },
    removeElement: function(element, node, idx) {
      var commands = [],
          formField = getSelectedFormField(element, node),
          constraints = formHelper.getConstraints(formField),
          currentConstraint = constraints[idx];
      commands.push(cmdHelper.removeElementsFromList(
        element,
        formField.validation,
        'constraints',
        null,
        [ currentConstraint ]
      ));
      if (constraints.length === 1) {
        // remove activiti:validation if the last existing constraint has been removed
        commands.push(cmdHelper.updateBusinessObject(element, formField, { validation: undefined }));
      }
      return commands;
    },
    show: function(element, node) {
      return !!getSelectedFormField(element, node);
    }
  }));
  // [FormData] Properties label
  group.entries.push(entryFactory.label({
    id: 'form-field-properties-header',
    labelText: translate('Properties'),
    divider: true,
    showLabel: function(element, node) {
      return !!getSelectedFormField(element, node);
    }
  }));
  // [FormData] activiti:properties table
  group.entries.push(properties(element, bpmnFactory, {
    id: 'form-field-properties',
    modelProperties: [ 'id', 'value' ],
    labels: [ translate('Id'), translate('Value') ],
    getParent: function(element, node) {
      return getSelectedFormField(element, node);
    },
    show: function(element, node) {
      return !!getSelectedFormField(element, node);
    }
  }, translate));
};
ruoyi-bpmnjs/resources/properties-panel/provider/activiti/parts/HistoryTimeToLiveProps.js
New file
@@ -0,0 +1,27 @@
'use strict';
var is = require('bpmn-js/lib/util/ModelUtil').is,
    getBusinessObject = require('bpmn-js/lib/util/ModelUtil').getBusinessObject;
var historyTimeToLive = require('./implementation/HistoryTimeToLive');
module.exports = function(group, element, bpmnFactory, translate) {
  var businessObject = getBusinessObject(element);
  if (is(element, 'activiti:Process') ||
      is(element, 'bpmn:Participant') && businessObject.get('processRef')) {
    group.entries = group.entries.concat(historyTimeToLive(element, bpmnFactory, {
      getBusinessObject: function(element) {
        var bo = getBusinessObject(element);
        if (!is(bo, 'bpmn:Participant')) {
          return bo;
        }
        return bo.get('processRef');
      }
    }, translate));
  }
};
ruoyi-bpmnjs/resources/properties-panel/provider/activiti/parts/InputOutputParameterProps.js
New file
@@ -0,0 +1,11 @@
'use strict';
var inputOutputParameter = require('./implementation/InputOutputParameter');
var assign = require('lodash/assign');
module.exports = function(group, element, bpmnFactory, options, translate) {
  group.entries = group.entries.concat(inputOutputParameter(element, bpmnFactory, assign({}, options), translate));
};
ruoyi-bpmnjs/resources/properties-panel/provider/activiti/parts/InputOutputProps.js
New file
@@ -0,0 +1,15 @@
'use strict';
var inputOutput = require('./implementation/InputOutput');
module.exports = function(group, element, bpmnFactory, translate) {
  var inputOutputEntry = inputOutput(element, bpmnFactory, {}, translate);
  group.entries = group.entries.concat(inputOutputEntry.entries);
  return {
    getSelectedParameter: inputOutputEntry.getSelectedParameter
  };
};
ruoyi-bpmnjs/resources/properties-panel/provider/activiti/parts/JobConfigurationProps.js
New file
@@ -0,0 +1,34 @@
'use strict';
var is = require('bpmn-js/lib/util/ModelUtil').is,
    getBusinessObject = require('bpmn-js/lib/util/ModelUtil').getBusinessObject;
var jobPriority = require('./implementation/JobPriority'),
    jobRetryTimeCycle = require('./implementation/JobRetryTimeCycle');
module.exports = function(group, element, bpmnFactory, translate) {
  var businessObject = getBusinessObject(element);
  if (is(element, 'activiti:JobPriorized') ||
      is(element, 'bpmn:Participant') && businessObject.get('processRef')) {
    group.entries = group.entries.concat(jobPriority(element, bpmnFactory, {
      getBusinessObject: function(element) {
        var bo = getBusinessObject(element);
        if (!is(bo, 'bpmn:Participant')) {
          return bo;
        }
        return bo.get('processRef');
      }
    }, translate));
  }
  if (is(element, 'activiti:AsyncCapable')) {
    group.entries = group.entries.concat(jobRetryTimeCycle(element, bpmnFactory, {
      getBusinessObject: getBusinessObject
    }, translate));
  }
};
ruoyi-bpmnjs/resources/properties-panel/provider/activiti/parts/ListenerDetailProps.js
New file
@@ -0,0 +1,208 @@
'use strict';
var entryFactory = require('../../../factory/EntryFactory');
var cmdHelper = require('../../../helper/CmdHelper'),
    ImplementationTypeHelper = require('../../../helper/ImplementationTypeHelper'),
    scriptImplementation = require('./implementation/Script');
module.exports = function(group, element, bpmnFactory, options, translate) {
  var LISTENER_TYPE_LABEL = {
    class: translate('Java Class'),
    expression: translate('Expression'),
    delegateExpression: translate('Delegate Expression'),
    script: translate('Script')
  };
  options = options || {};
  var getSelectedListener = options.getSelectedListener;
  var classProp = 'class',
      expressionProp = 'expression',
      delegateExpressionProp = 'delegateExpression',
      scriptProp = 'script';
  var executionListenerEventTypeOptions = ImplementationTypeHelper.isSequenceFlow(element) ? [
    { name: translate('take'), value: 'take' }
  ] : [
    { name: translate('start'), value: 'start' },
    { name: translate('end'), value: 'end' }
  ];
  var taskListenerEventTypeOptions = [
    { name: translate('create'), value: 'create' },
    { name: translate('assignment'), value: 'assignment' },
    { name: translate('complete'), value: 'complete' },
    { name: translate('delete'), value: 'delete' }
  ];
  var isSelected = function(element, node) {
    return getSelectedListener(element, node);
  };
  group.entries.push(entryFactory.selectBox({
    id: 'listener-event-type',
    label: translate('Event Type'),
    modelProperty: 'eventType',
    emptyParameter: false,
    get: function(element, node) {
      var listener = getSelectedListener(element, node);
      var eventType = listener && listener.get('event');
      return {
        eventType: eventType
      };
    },
    set: function(element, values, node) {
      var eventType = values.eventType;
      return cmdHelper.updateBusinessObject(element, getSelectedListener(element, node), { event: eventType });
    },
    selectOptions: function(element, node) {
      var eventTypeOptions;
      var selectedListener = getSelectedListener(element, node);
      if (ImplementationTypeHelper.isTaskListener(selectedListener)) {
        eventTypeOptions = taskListenerEventTypeOptions;
      } else if (ImplementationTypeHelper.isExecutionListener(selectedListener)) {
        eventTypeOptions = executionListenerEventTypeOptions;
      }
      return eventTypeOptions;
    },
    hidden: function(element, node) {
      return !isSelected(element, node);
    }
  }));
  group.entries.push(entryFactory.selectBox({
    id: 'listener-type',
    label: translate('Listener Type'),
    selectOptions: [
      { value: classProp, name: translate('Java Class') },
      { value: expressionProp, name: translate('Expression') },
      { value: delegateExpressionProp, name: translate('Delegate Expression') },
      { value: scriptProp, name: translate('Script') }
    ],
    modelProperty: 'listenerType',
    emptyParameter: false,
    get: function(element, node) {
      var listener = getSelectedListener(element, node);
      return {
        listenerType: ImplementationTypeHelper.getImplementationType(listener)
      };
    },
    set: function(element, values, node) {
      var listener = getSelectedListener(element, node),
          listenerType = values.listenerType || undefined,
          update = {};
      update[classProp] = listenerType === classProp ? '' : undefined;
      update[expressionProp] = listenerType === expressionProp ? '' : undefined;
      update[delegateExpressionProp] = listenerType === delegateExpressionProp ? '' : undefined;
      update[scriptProp] = listenerType === scriptProp ? bpmnFactory.create('activiti:Script') : undefined;
      return cmdHelper.updateBusinessObject(element, listener, update);
    },
    hidden: function(element, node) {
      return !isSelected(element, node);
    }
  }));
  group.entries.push(entryFactory.textField({
    id: 'listener-value',
    dataValueLabel: 'listenerValueLabel',
    modelProperty: 'listenerValue',
    get: function(element, node) {
      var value = {},
          listener = getSelectedListener(element, node),
          listenerType = ImplementationTypeHelper.getImplementationType(listener);
      value.listenerValueLabel = LISTENER_TYPE_LABEL[listenerType] || '';
      value.listenerValue = (listener && listener.get(listenerType)) || undefined;
      return value;
    },
    set: function(element, values, node) {
      var update = {},
          listener = getSelectedListener(element, node),
          listenerType = ImplementationTypeHelper.getImplementationType(listener);
      update[listenerType] = values.listenerValue || '';
      return cmdHelper.updateBusinessObject(element, listener, update);
    },
    hidden: function(element, node) {
      var listener = getSelectedListener(element, node);
      return !listener || listener.script;
    },
    validate: function(element, values) {
      var value = values.listenerValue,
          validate = {};
      if (!value) {
        validate.listenerValue = translate('Must provide a value');
      }
      return validate;
    }
  }));
  var script = scriptImplementation('scriptFormat', 'value', true, translate);
  group.entries.push({
    id: 'listener-script-value',
    html: '<div data-show="isScript">' +
            script.template +
          '</div>',
    get: function(element, node) {
      var listener = getSelectedListener(element, node);
      return listener && listener.script ? script.get(element, listener.script) : {};
    },
    set: function(element, values, node) {
      var listener = getSelectedListener(element, node);
      var update = script.set(element, values, listener);
      return cmdHelper.updateBusinessObject(element, listener.script, update);
    },
    validate: function(element, values, node) {
      var listener = getSelectedListener(element, node);
      return listener && listener.script ? script.validate(element, values) : {};
    },
    isScript: function(element, node) {
      var listener = getSelectedListener(element, node);
      return listener && listener.script;
    },
    script: script
  });
};
ruoyi-bpmnjs/resources/properties-panel/provider/activiti/parts/ListenerFieldInjectionProps.js
New file
@@ -0,0 +1,20 @@
'use strict';
var assign = require('lodash/assign');
var fieldInjection = require('./implementation/FieldInjection');
module.exports = function(group, element, bpmnFactory, options, translate) {
  options = assign({
    idPrefix: 'listener-',
    insideListener: true
  }, options);
  var fieldInjectionEntry = fieldInjection(element, bpmnFactory, translate, options);
  if (fieldInjectionEntry && fieldInjectionEntry.length > 0) {
    group.entries = group.entries.concat(fieldInjectionEntry);
  }
};
ruoyi-bpmnjs/resources/properties-panel/provider/activiti/parts/ListenerProps.js
New file
@@ -0,0 +1,15 @@
'use strict';
var listener = require('./implementation/Listener');
module.exports = function(group, element, bpmnFactory, translate) {
  var listenerEntry = listener(element, bpmnFactory, {}, translate);
  group.entries = group.entries.concat(listenerEntry.entries);
  return {
    getSelectedListener: listenerEntry.getSelectedListener
  };
};
ruoyi-bpmnjs/resources/properties-panel/provider/activiti/parts/MultiInstanceLoopProps.js
New file
@@ -0,0 +1,46 @@
'use strict';
var getBusinessObject = require('bpmn-js/lib/util/ModelUtil').getBusinessObject,
    is = require('bpmn-js/lib/util/ModelUtil').is;
var multiInstanceLoopCharacteristics = require('./implementation/MultiInstanceLoopCharacteristics');
var jobRetryTimeCycle = require('./implementation/JobRetryTimeCycle'),
    asyncContinuation = require('./implementation/AsyncContinuation');
function getLoopCharacteristics(element) {
  var bo = getBusinessObject(element);
  return bo.loopCharacteristics;
}
function ensureMultiInstanceSupported(element) {
  var loopCharacteristics = getLoopCharacteristics(element);
  return !!loopCharacteristics && is(loopCharacteristics, 'activiti:Collectable');
}
module.exports = function(group, element, bpmnFactory, translate) {
  if (!ensureMultiInstanceSupported(element)) {
    return;
  }
  // multi instance properties
  group.entries = group.entries.concat(multiInstanceLoopCharacteristics(element, bpmnFactory, translate));
  // async continuation ///////////////////////////////////////////////////////
  group.entries = group.entries.concat(asyncContinuation(element, bpmnFactory, {
    getBusinessObject: getLoopCharacteristics,
    idPrefix: 'multiInstance-',
    labelPrefix: translate('Multi Instance ')
  }, translate));
  // retry time cycle //////////////////////////////////////////////////////////
  group.entries = group.entries.concat(jobRetryTimeCycle(element, bpmnFactory, {
    getBusinessObject: getLoopCharacteristics,
    idPrefix: 'multiInstance-',
    labelPrefix: translate('Multi Instance ')
  }, translate));
};
ruoyi-bpmnjs/resources/properties-panel/provider/activiti/parts/PropertiesProps.js
New file
@@ -0,0 +1,33 @@
'use strict';
var properties = require('./implementation/Properties'),
    elementHelper = require('../../../helper/ElementHelper'),
    cmdHelper = require('../../../helper/CmdHelper');
module.exports = function(group, element, bpmnFactory, translate) {
  var propertiesEntry = properties(element, bpmnFactory, {
    id: 'properties',
    modelProperties: [ 'name', 'value' ],
    labels: [ translate('Name'), translate('Value') ],
    getParent: function(element, node, bo) {
      return bo.extensionElements;
    },
    createParent: function(element, bo) {
      var parent = elementHelper.createElement('bpmn:ExtensionElements', { values: [] }, bo, bpmnFactory);
      var cmd = cmdHelper.updateBusinessObject(element, bo, { extensionElements: parent });
      return {
        cmd: cmd,
        parent: parent
      };
    }
  }, translate);
  if (propertiesEntry) {
    group.entries.push(propertiesEntry);
  }
};
ruoyi-bpmnjs/resources/properties-panel/provider/activiti/parts/ScriptTaskProps.js
New file
@@ -0,0 +1,68 @@
'use strict';
var getBusinessObject = require('bpmn-js/lib/util/ModelUtil').getBusinessObject,
    is = require('bpmn-js/lib/util/ModelUtil').is,
    entryFactory = require('../../../factory/EntryFactory'),
    cmdHelper = require('../../../helper/CmdHelper'),
    scriptImplementation = require('./implementation/Script');
module.exports = function(group, element, bpmnFactory, translate) {
  var bo;
  if (is(element, 'bpmn:ScriptTask')) {
    bo = getBusinessObject(element);
  }
  if (!bo) {
    return;
  }
  var script = scriptImplementation('scriptFormat', 'script', false, translate);
  group.entries.push({
    id: 'script-implementation',
    label: translate('Script'),
    html: script.template,
    get: function(element) {
      return script.get(element, bo);
    },
    set: function(element, values, containerElement) {
      var properties = script.set(element, values, containerElement);
      return cmdHelper.updateProperties(element, properties);
    },
    validate: function(element, values) {
      return script.validate(element, values);
    },
    script : script,
    cssClasses: ['bpp-textfield']
  });
  group.entries.push(entryFactory.textField({
    id : 'scriptResultVariable',
    label : translate('Result Variable'),
    modelProperty : 'scriptResultVariable',
    get: function(element, propertyName) {
      var boResultVariable = bo.get('activiti:resultVariable');
      return { scriptResultVariable : boResultVariable };
    },
    set: function(element, values, containerElement) {
      return cmdHelper.updateProperties(element, {
        'activiti:resultVariable': values.scriptResultVariable.length
          ? values.scriptResultVariable
          : undefined
      });
    }
  }));
};
ruoyi-bpmnjs/resources/properties-panel/provider/activiti/parts/ServiceTaskDelegateProps.js
New file
@@ -0,0 +1,151 @@
'use strict';
var ImplementationTypeHelper = require('../../../helper/ImplementationTypeHelper'),
    InputOutputHelper = require('../../../helper/InputOutputHelper');
var utils = require('../../../Utils'),
    escapeHTML = utils.escapeHTML,
    triggerClickEvent = utils.triggerClickEvent;
var implementationType = require('./implementation/ImplementationType'),
    delegate = require('./implementation/Delegate'),
    external = require('./implementation/External'),
    callable = require('./implementation/Callable'),
    resultVariable = require('./implementation/ResultVariable');
var entryFactory = require('../../../factory/EntryFactory');
var domQuery = require('min-dom').query,
    domClosest = require('min-dom').closest,
    domClasses = require('min-dom').classes;
function getImplementationType(element) {
  return ImplementationTypeHelper.getImplementationType(element);
}
function getBusinessObject(element) {
  return ImplementationTypeHelper.getServiceTaskLikeBusinessObject(element);
}
function isDmnCapable(element) {
  return ImplementationTypeHelper.isDmnCapable(element);
}
function isExternalCapable(element) {
  return ImplementationTypeHelper.isExternalCapable(element);
}
function isServiceTaskLike(element) {
  return ImplementationTypeHelper.isServiceTaskLike(element);
}
module.exports = function(group, element, bpmnFactory, translate) {
  if (!isServiceTaskLike(getBusinessObject(element))) {
    return;
  }
  var hasDmnSupport = isDmnCapable(element);
  var hasExternalSupport = isExternalCapable(getBusinessObject(element));
  // implementation type ////////////////////////////////////
  group.entries = group.entries.concat(implementationType(element, bpmnFactory, {
    getBusinessObject: getBusinessObject,
    getImplementationType: getImplementationType,
    hasDmnSupport: hasDmnSupport,
    hasExternalSupport: hasExternalSupport,
    hasServiceTaskLikeSupport: true
  }, translate));
  // delegate (class, expression, delegateExpression) //////////
  group.entries = group.entries.concat(delegate(element, bpmnFactory, {
    getBusinessObject: getBusinessObject,
    getImplementationType: getImplementationType
  }, translate));
  // result variable /////////////////////////////////////////
  group.entries = group.entries.concat(resultVariable(element, bpmnFactory, {
    getBusinessObject: getBusinessObject,
    getImplementationType: getImplementationType,
    hideResultVariable: function(element, node) {
      return getImplementationType(element) !== 'expression';
    }
  }, translate));
  // external //////////////////////////////////////////////////
  if (hasExternalSupport) {
    group.entries = group.entries.concat(external(element, bpmnFactory, {
      getBusinessObject: getBusinessObject,
      getImplementationType: getImplementationType
    }, translate));
  }
  // dmn ////////////////////////////////////////////////////////
  if (hasDmnSupport) {
    group.entries = group.entries.concat(callable(element, bpmnFactory, {
      getCallableType: getImplementationType
    }, translate));
  }
  // connector ////////////////////////////////////////////////
  var isConnector = function(element) {
    return getImplementationType(element) === 'connector';
  };
  group.entries.push(entryFactory.link({
    id: 'configureConnectorLink',
    label: translate('Configure Connector'),
    handleClick: function(element, node, event) {
      var connectorTabEl = getTabNode(node, 'connector');
      if (connectorTabEl) {
        triggerClickEvent(connectorTabEl);
      }
      // suppress actual link click
      return false;
    },
    showLink: function(element, node) {
      var link = domQuery('a', node);
      link.textContent = '';
      domClasses(link).remove('bpp-error-message');
      if (isConnector(element)) {
        var connectorId = InputOutputHelper.getConnector(element).get('connectorId');
        if (connectorId) {
          link.textContent = translate('Configure Connector');
        } else {
          link.innerHTML = '<span class="bpp-icon-warning"></span> ' + escapeHTML(translate('Must configure Connector'));
          domClasses(link).add('bpp-error-message');
        }
        return true;
      }
      return false;
    }
  }));
};
// helpers ///////////////////////////
function getTabNode(el, id) {
  var containerEl = domClosest(el, '.bpp-properties-panel');
  return domQuery('a[data-tab-target="' + id + '"]', containerEl);
}
ruoyi-bpmnjs/resources/properties-panel/provider/activiti/parts/StartEventInitiator.js
New file
@@ -0,0 +1,23 @@
'use strict';
var entryFactory = require('../../../factory/EntryFactory'),
    is = require('bpmn-js/lib/util/ModelUtil').is,
    getBusinessObject = require('bpmn-js/lib/util/ModelUtil').getBusinessObject;
module.exports = function(group, element, translate) {
  var bo = getBusinessObject(element);
  if (!bo) {
    return;
  }
  if (is(element, 'activiti:Initiator') && !is(element.parent, 'bpmn:SubProcess')) {
    group.entries.push(entryFactory.textField({
      id: 'initiator',
      label: translate('Initiator'),
      modelProperty: 'initiator'
    }));
  }
};
ruoyi-bpmnjs/resources/properties-panel/provider/activiti/parts/TasklistProps.js
New file
@@ -0,0 +1,27 @@
'use strict';
var is = require('bpmn-js/lib/util/ModelUtil').is,
    getBusinessObject = require('bpmn-js/lib/util/ModelUtil').getBusinessObject;
var tasklist = require('./implementation/Tasklist');
module.exports = function(group, element, bpmnFactory, translate) {
  var businessObject = getBusinessObject(element);
  if (is(element, 'activiti:Process') ||
      is(element, 'bpmn:Participant') && businessObject.get('processRef')) {
    group.entries = group.entries.concat(tasklist(element, bpmnFactory, {
      getBusinessObject: function(element) {
        var bo = getBusinessObject(element);
        if (!is(bo, 'bpmn:Participant')) {
          return bo;
        }
        return bo.get('processRef');
      }
    }, translate));
  }
};
ruoyi-bpmnjs/resources/properties-panel/provider/activiti/parts/UserTaskProps.js
New file
@@ -0,0 +1,55 @@
'use strict';
var is = require('bpmn-js/lib/util/ModelUtil').is,
    entryFactory = require('../../../factory/EntryFactory');
module.exports = function(group, element, translate) {
  if (is(element, 'activiti:Assignable')) {
    // Assignee
    group.entries.push(entryFactory.textField({
      id : 'assignee',
      label : translate('Assignee'),
      modelProperty : 'assignee'
    }));
    // Candidate Users
    group.entries.push(entryFactory.textField({
      id : 'candidateUsers',
      label : translate('Candidate Users'),
      modelProperty : 'candidateUsers'
    }));
    // Candidate Groups
    group.entries.push(entryFactory.textField({
      id : 'candidateGroups',
      label : translate('Candidate Groups'),
      modelProperty : 'candidateGroups'
    }));
    // Due Date
    group.entries.push(entryFactory.textField({
      id : 'dueDate',
      description : translate('The due date as an EL expression (e.g. ${someDate} or an ISO date (e.g. 2015-06-26T09:54:00)'),
      label : translate('Due Date'),
      modelProperty : 'dueDate'
    }));
    // FollowUp Date
    group.entries.push(entryFactory.textField({
      id : 'followUpDate',
      description : translate('The follow up date as an EL expression (e.g. ${someDate} or an ' +
                    'ISO date (e.g. 2015-06-26T09:54:00)'),
      label : translate('Follow Up Date'),
      modelProperty : 'followUpDate'
    }));
    // priority
    group.entries.push(entryFactory.textField({
      id : 'priority',
      label : translate('Priority'),
      modelProperty : 'priority'
    }));
  }
};
ruoyi-bpmnjs/resources/properties-panel/provider/activiti/parts/VariableMappingProps.js
New file
@@ -0,0 +1,397 @@
'use strict';
var is = require('bpmn-js/lib/util/ModelUtil').is,
    isAny = require('bpmn-js/lib/features/modeling/util/ModelingUtil').isAny,
    getBusinessObject = require('bpmn-js/lib/util/ModelUtil').getBusinessObject;
var filter = require('lodash/filter');
var extensionElementsHelper = require('../../../helper/ExtensionElementsHelper'),
    cmdHelper = require('../../../helper/CmdHelper'),
    elementHelper = require('../../../helper/ElementHelper'),
    eventDefinitionHelper = require('../../../helper/EventDefinitionHelper');
var extensionElementsEntry = require('./implementation/ExtensionElements');
var entryFactory = require('../../../factory/EntryFactory');
/**
  * return depend on parameter 'type' activiti:in or activiti:out extension elements
  */
function getActivitiInOutMappings(element, type) {
  var bo = getBusinessObject(element);
  var signalEventDefinition = eventDefinitionHelper.getSignalEventDefinition(bo);
  return extensionElementsHelper.getExtensionElements(signalEventDefinition || bo, type) || [];
}
/**
  * return depend on parameter 'type' activiti:in or activiti:out extension elements
  * with source or sourceExpression attribute
  */
function getVariableMappings(element, type) {
  var activitiMappings = getActivitiInOutMappings(element, type);
  return filter(activitiMappings, function(mapping) {
    return !mapping.businessKey;
  });
}
function getInOutType(mapping) {
  var inOutType = 'source';
  if (mapping.variables === 'all') {
    inOutType = 'variables';
  }
  else if (typeof mapping.source !== 'undefined') {
    inOutType = 'source';
  }
  else if (typeof mapping.sourceExpression !== 'undefined') {
    inOutType = 'sourceExpression';
  }
  return inOutType;
}
var ACTIVITI_IN_EXTENSION_ELEMENT = 'activiti:In',
    ACTIVITI_OUT_EXTENSION_ELEMENT = 'activiti:Out';
var WHITESPACE_REGEX = /\s/;
module.exports = function(group, element, bpmnFactory, translate) {
  var inOutTypeOptions = [
    {
      name: translate('Source'),
      value: 'source'
    },
    {
      name: translate('Source Expression'),
      value: 'sourceExpression'
    },
    {
      name: translate('All'),
      value: 'variables'
    }
  ];
  var signalEventDefinition = eventDefinitionHelper.getSignalEventDefinition(element);
  if (!is(element, 'activiti:CallActivity') && !signalEventDefinition) {
    return;
  }
  if (signalEventDefinition && !(isAny(element, [
    'bpmn:IntermediateThrowEvent',
    'bpmn:EndEvent'
  ]))) {
    return;
  }
  var isSelected = function(element, node) {
    return !!getSelected(element, node);
  };
  var getSelected = function(element, node) {
    var parentNode = node.parentNode;
    var selection = inEntry.getSelected(element, parentNode);
    var parameter = getVariableMappings(element, ACTIVITI_IN_EXTENSION_ELEMENT)[selection.idx];
    if (!parameter && outEntry) {
      selection = outEntry.getSelected(element, parentNode);
      parameter = getVariableMappings(element, ACTIVITI_OUT_EXTENSION_ELEMENT)[selection.idx];
    }
    return parameter;
  };
  var setOptionLabelValue = function(type) {
    return function(element, node, option, property, value, idx) {
      var variableMappings = getVariableMappings(element, type);
      var mappingValue = variableMappings[idx];
      var label = (mappingValue.target || '<undefined>') + ' := ';
      var mappingType = getInOutType(mappingValue);
      if (mappingType === 'variables') {
        label = 'all';
      }
      else if (mappingType === 'source') {
        label = label + (mappingValue.source || '<empty>');
      }
      else if (mappingType === 'sourceExpression') {
        label = label + (mappingValue.sourceExpression || '<empty>');
      } else {
        label = label + '<empty>';
      }
      option.text = label;
    };
  };
  var newElement = function(type) {
    return function(element, extensionElements, value) {
      var newElem = elementHelper.createElement(type, { source: '' }, extensionElements, bpmnFactory);
      return cmdHelper.addElementsTolist(element, extensionElements, 'values', [ newElem ]);
    };
  };
  var removeElement = function(type) {
    return function(element, extensionElements, value, idx) {
      var variablesMappings= getVariableMappings(element, type);
      var mapping = variablesMappings[idx];
      if (mapping) {
        return extensionElementsHelper
          .removeEntry(signalEventDefinition || getBusinessObject(element), element, mapping);
      }
    };
  };
  // in mapping for source and sourceExpression ///////////////////////////////////////////////////////////////
  var inEntry = extensionElementsEntry(element, bpmnFactory, {
    id: 'variableMapping-in',
    label: translate('In Mapping'),
    modelProperty: 'source',
    prefix: 'In',
    idGeneration: false,
    resizable: true,
    businessObject: signalEventDefinition || getBusinessObject(element),
    createExtensionElement: newElement(ACTIVITI_IN_EXTENSION_ELEMENT),
    removeExtensionElement: removeElement(ACTIVITI_IN_EXTENSION_ELEMENT),
    getExtensionElements: function(element) {
      return getVariableMappings(element, ACTIVITI_IN_EXTENSION_ELEMENT);
    },
    onSelectionChange: function(element, node, event, scope) {
      outEntry && outEntry.deselect(element, node.parentNode);
    },
    setOptionLabelValue: setOptionLabelValue(ACTIVITI_IN_EXTENSION_ELEMENT)
  });
  group.entries.push(inEntry);
  // out mapping for source and sourceExpression ///////////////////////////////////////////////////////
  if (!signalEventDefinition) {
    var outEntry = extensionElementsEntry(element, bpmnFactory, {
      id: 'variableMapping-out',
      label: translate('Out Mapping'),
      modelProperty: 'source',
      prefix: 'Out',
      idGeneration: false,
      resizable: true,
      createExtensionElement: newElement(ACTIVITI_OUT_EXTENSION_ELEMENT),
      removeExtensionElement: removeElement(ACTIVITI_OUT_EXTENSION_ELEMENT),
      getExtensionElements: function(element) {
        return getVariableMappings(element, ACTIVITI_OUT_EXTENSION_ELEMENT);
      },
      onSelectionChange: function(element, node, event, scope) {
        inEntry.deselect(element, node.parentNode);
      },
      setOptionLabelValue: setOptionLabelValue(ACTIVITI_OUT_EXTENSION_ELEMENT)
    });
    group.entries.push(outEntry);
  }
  // label for selected mapping ///////////////////////////////////////////////////////
  group.entries.push(entryFactory.label({
    id: 'variableMapping-typeLabel',
    get: function(element, node) {
      var mapping = getSelected(element, node);
      var value = '';
      if (is(mapping, ACTIVITI_IN_EXTENSION_ELEMENT)) {
        value = translate('In Mapping');
      }
      else if (is(mapping, ACTIVITI_OUT_EXTENSION_ELEMENT)) {
        value = translate('Out Mapping');
      }
      return {
        label: value
      };
    },
    showLabel: function(element, node) {
      return isSelected(element, node);
    }
  }));
  group.entries.push(entryFactory.selectBox({
    id: 'variableMapping-inOutType',
    label: translate('Type'),
    selectOptions: inOutTypeOptions,
    modelProperty: 'inOutType',
    get: function(element, node) {
      var mapping = getSelected(element, node) || {};
      return {
        inOutType: getInOutType(mapping)
      };
    },
    set: function(element, values, node) {
      var inOutType = values.inOutType;
      var props = {
        'source' : undefined,
        'sourceExpression' : undefined,
        'variables' : undefined
      };
      if (inOutType === 'source') {
        props.source = '';
      }
      else if (inOutType === 'sourceExpression') {
        props.sourceExpression = '';
      }
      else if (inOutType === 'variables') {
        props.variables = 'all';
        props.target = undefined;
      }
      var mapping = getSelected(element, node);
      return cmdHelper.updateBusinessObject(element, mapping, props);
    },
    hidden: function(element, node) {
      return !isSelected(element, node);
    }
  }));
  group.entries.push(entryFactory.textField({
    id: 'variableMapping-source',
    dataValueLabel: 'sourceLabel',
    modelProperty: 'source',
    get: function(element, node) {
      var mapping = getSelected(element, node) || {};
      var label = '';
      var inOutType = getInOutType(mapping);
      if (inOutType === 'source') {
        label = translate('Source');
      }
      else if (inOutType === 'sourceExpression') {
        label = translate('Source Expression');
      }
      return {
        source: mapping[inOutType],
        sourceLabel: label
      };
    },
    set: function(element, values, node) {
      values.source = values.source || undefined;
      var mapping = getSelected(element, node);
      var inOutType = getInOutType(mapping);
      var props = {};
      props[inOutType] = values.source || '';
      return cmdHelper.updateBusinessObject(element, mapping, props);
    },
    // one of both (source or sourceExpression) must have a value to make
    // the configuration easier and more understandable
    // it is not engine conform
    validate: function(element, values, node) {
      var mapping = getSelected(element, node);
      var validation = {};
      if (mapping) {
        if (!values.source) {
          validation.source =
          validation.source = values.sourceLabel ?
            translate('Mapping must have a {value}', { value: values.sourceLabel.toLowerCase() }) :
            translate('Mapping must have a value');
        }
        var inOutType = getInOutType(mapping);
        if (WHITESPACE_REGEX.test(values.source) && inOutType !== 'sourceExpression') {
          validation.source = translate('{label} must not contain whitespace', { label: values.sourceLabel });
        }
      }
      return validation;
    },
    hidden: function(element, node) {
      var selectedMapping = getSelected(element, node);
      return !selectedMapping || (selectedMapping && selectedMapping.variables);
    }
  }));
  group.entries.push(entryFactory.textField({
    id: 'variableMapping-target',
    label: translate('Target'),
    modelProperty: 'target',
    get: function(element, node) {
      return {
        target: (getSelected(element, node) || {}).target
      };
    },
    set: function(element, values, node) {
      values.target = values.target || undefined;
      var mapping = getSelected(element, node);
      return cmdHelper.updateBusinessObject(element, mapping, values);
    },
    validate: function(element, values, node) {
      var mapping = getSelected(element, node);
      var validation = {};
      if (mapping) {
        var mappingType = getInOutType(mapping);
        if (!values.target && mappingType !== 'variables') {
          validation.target = translate('Mapping must have a target');
        }
        if (values.target
          && WHITESPACE_REGEX.test(values.target)
          && mappingType !== 'variables') {
          validation.target = translate('Target must not contain whitespace');
        }
      }
      return validation;
    },
    hidden: function(element, node) {
      var selectedMapping = getSelected(element, node);
      return !selectedMapping || (selectedMapping && selectedMapping.variables);
    }
  }));
  group.entries.push(entryFactory.checkbox({
    id: 'variableMapping-local',
    label: translate('Local'),
    modelProperty: 'local',
    get: function(element, node) {
      return {
        local: (getSelected(element, node) || {}).local
      };
    },
    set: function(element, values, node) {
      values.local = values.local || false;
      var mapping = getSelected(element, node);
      return cmdHelper.updateBusinessObject(element, mapping, values);
    },
    hidden: function(element, node) {
      return !isSelected(element, node);
    }
  }));
};
ruoyi-bpmnjs/resources/properties-panel/provider/activiti/parts/VersionTagProps.js
New file
@@ -0,0 +1,45 @@
'use strict';
var entryFactory = require('../../../factory/EntryFactory'),
    cmdHelper = require('../../../helper/CmdHelper'),
    is = require('bpmn-js/lib/util/ModelUtil').is,
    getBusinessObject = require('bpmn-js/lib/util/ModelUtil').getBusinessObject;
module.exports = function(group, element, translate) {
  var bo = getBusinessObject(element);
  if (!bo) {
    return;
  }
  if (is(element, 'bpmn:Process') || is(element, 'bpmn:Participant') && bo.get('processRef')) {
    var versionTagEntry = entryFactory.textField({
      id: 'versionTag',
      label: translate('Version Tag'),
      modelProperty: 'versionTag'
    });
    // in participants we have to change the default behavior of set and get
    if (is(element, 'bpmn:Participant')) {
      versionTagEntry.get = function(element) {
        var processBo = bo.get('processRef');
        return {
          versionTag: processBo.get('activiti:versionTag')
        };
      };
      versionTagEntry.set = function(element, values) {
        var processBo = bo.get('processRef');
        return cmdHelper.updateBusinessObject(element, processBo, {
          'activiti:versionTag': values.versionTag || undefined
        });
      };
    }
    group.entries.push(versionTagEntry);
  }
};
ruoyi-bpmnjs/resources/properties-panel/provider/activiti/parts/implementation/AsyncContinuation.js
New file
@@ -0,0 +1,130 @@
'use strict';
var assign = require('lodash/assign');
var entryFactory = require('../../../../factory/EntryFactory');
var asyncCapableHelper = require('../../../../helper/AsyncCapableHelper'),
    eventDefinitionHelper = require('../../../../helper/EventDefinitionHelper'),
    cmdHelper = require('../../../../helper/CmdHelper');
function isAsyncBefore(bo) {
  return asyncCapableHelper.isAsyncBefore(bo);
}
function isAsyncAfter(bo) {
  return asyncCapableHelper.isAsyncAfter(bo);
}
function isExclusive(bo) {
  return asyncCapableHelper.isExclusive(bo);
}
function removeFailedJobRetryTimeCycle(bo, element) {
  return asyncCapableHelper.removeFailedJobRetryTimeCycle(bo, element);
}
function canRemoveFailedJobRetryTimeCycle(element) {
  return !eventDefinitionHelper.getTimerEventDefinition(element);
}
module.exports = function(element, bpmnFactory, options, translate) {
  var getBusinessObject = options.getBusinessObject;
  var idPrefix = options.idPrefix || '',
      labelPrefix = options.labelPrefix || '';
  var asyncBeforeEntry = entryFactory.checkbox({
    id: idPrefix + 'asyncBefore',
    label: labelPrefix + translate('Asynchronous Before'),
    modelProperty: 'asyncBefore',
    get: function(element, node) {
      var bo = getBusinessObject(element);
      return {
        asyncBefore: isAsyncBefore(bo)
      };
    },
    set: function(element, values) {
      var bo = getBusinessObject(element);
      var asyncBefore = !!values.asyncBefore;
      var props = {
        'activiti:asyncBefore': asyncBefore,
        'activiti:async': false
      };
      var commands = [];
      if (!isAsyncAfter(bo) && !asyncBefore) {
        props = assign({ 'activiti:exclusive' : true }, props);
        if (canRemoveFailedJobRetryTimeCycle(element)) {
          commands.push(removeFailedJobRetryTimeCycle(bo, element));
        }
      }
      commands.push(cmdHelper.updateBusinessObject(element, bo, props));
      return commands;
    }
  });
  var asyncAfterEntry = entryFactory.checkbox({
    id: idPrefix + 'asyncAfter',
    label: labelPrefix + translate('Asynchronous After'),
    modelProperty: 'asyncAfter',
    get: function(element, node) {
      var bo = getBusinessObject(element);
      return {
        asyncAfter: isAsyncAfter(bo)
      };
    },
    set: function(element, values) {
      var bo = getBusinessObject(element);
      var asyncAfter = !!values.asyncAfter;
      var props = {
        'activiti:asyncAfter': asyncAfter
      };
      var commands = [];
      if (!isAsyncBefore(bo) && !asyncAfter) {
        props = assign({ 'activiti:exclusive' : true }, props);
        if (canRemoveFailedJobRetryTimeCycle(element)) {
          commands.push(removeFailedJobRetryTimeCycle(bo, element));
        }
      }
      commands.push(cmdHelper.updateBusinessObject(element, bo, props));
      return commands;
    }
  });
  var exclusiveEntry = entryFactory.checkbox({
    id: idPrefix + 'exclusive',
    label: labelPrefix + translate('Exclusive'),
    modelProperty: 'exclusive',
    get: function(element, node) {
      var bo = getBusinessObject(element);
      return { exclusive: isExclusive(bo) };
    },
    set: function(element, values) {
      var bo = getBusinessObject(element);
      return cmdHelper.updateBusinessObject(element, bo, { 'activiti:exclusive': !!values.exclusive });
    },
    hidden: function(element) {
      var bo = getBusinessObject(element);
      return bo && !isAsyncAfter(bo) && !isAsyncBefore(bo);
    }
  });
  return [ asyncBeforeEntry, asyncAfterEntry, exclusiveEntry ];
};
ruoyi-bpmnjs/resources/properties-panel/provider/activiti/parts/implementation/Callable.js
New file
@@ -0,0 +1,625 @@
'use strict';
var cmdHelper = require('../../../../helper/CmdHelper'),
    entryFactory = require('../../../../factory/EntryFactory'),
    elementHelper = require('../../../../helper/ElementHelper'),
    extensionElementsHelper = require('../../../../helper/ExtensionElementsHelper');
var resultVariable = require('./ResultVariable');
var getBusinessObject = require('bpmn-js/lib/util/ModelUtil').getBusinessObject;
var is = require('bpmn-js/lib/util/ModelUtil').is;
var forEach = require('lodash/forEach');
var attributeInfo = {
  bpmn: {
    element: 'calledElement',
    binding: 'activiti:calledElementBinding',
    version: 'activiti:calledElementVersion',
    versionTag: 'activiti:calledElementVersionTag',
    tenantId: 'activiti:calledElementTenantId'
  },
  cmmn: {
    element: 'activiti:caseRef',
    binding: 'activiti:caseBinding',
    version: 'activiti:caseVersion',
    tenantId: 'activiti:caseTenantId'
  },
  dmn: {
    element: 'activiti:decisionRef',
    binding: 'activiti:decisionRefBinding',
    version: 'activiti:decisionRefVersion',
    versionTag: 'activiti:decisionRefVersionTag',
    tenantId: 'activiti:decisionRefTenantId'
  }
};
var mapDecisionResultOptions = [
  {
    name: 'singleEntry (TypedValue)',
    value: 'singleEntry'
  },
  {
    name:'singleResult (Map<String, Object>)',
    value:'singleResult'
  },
  {
    name:'collectEntries (List<Object>)',
    value:'collectEntries'
  },
  {
    name:'resultList (List<Map<String, Object>>)',
    value:'resultList'
  }
];
var delegateVariableMappingOptions = [
  {
    name: 'variableMappingClass',
    value: 'variableMappingClass'
  },
  {
    name: 'variableMappingDelegateExpression',
    value: 'variableMappingDelegateExpression'
  }
];
function getActivitiInWithBusinessKey(element) {
  var activitiIn = [],
      bo = getBusinessObject(element);
  var activitiInParams = extensionElementsHelper.getExtensionElements(bo, 'activiti:In');
  if (activitiInParams) {
    forEach(activitiInParams, function(param) {
      if (param.businessKey !== undefined) {
        activitiIn.push(param);
      }
    });
  }
  return activitiIn;
}
function setBusinessKey(element, text, bpmnFactory) {
  var commands = [];
  var activitiInWithBusinessKey = getActivitiInWithBusinessKey(element);
  if (activitiInWithBusinessKey.length) {
    commands.push(cmdHelper.updateBusinessObject(element, activitiInWithBusinessKey[0], {
      businessKey: text
    }));
  } else {
    var bo = getBusinessObject(element),
        extensionElements = bo.extensionElements;
    if (!extensionElements) {
      extensionElements = elementHelper.createElement('bpmn:ExtensionElements', { values: [] }, bo, bpmnFactory);
      commands.push(cmdHelper.updateProperties(element, { extensionElements: extensionElements }));
    }
    var activitiIn = elementHelper.createElement(
      'activiti:In',
      { 'businessKey': text },
      extensionElements,
      bpmnFactory
    );
    commands.push(cmdHelper.addAndRemoveElementsFromList(
      element,
      extensionElements,
      'values',
      'extensionElements',
      [ activitiIn ],[]
    ));
  }
  return commands;
}
function deleteBusinessKey(element) {
  var activitiInExtensions = getActivitiInWithBusinessKey(element);
  var commands = [];
  forEach(activitiInExtensions, function(elem) {
    commands.push(extensionElementsHelper.removeEntry(getBusinessObject(element), element, elem));
  });
  return commands;
}
function isSupportedCallableType(type) {
  return [ 'bpmn', 'cmmn', 'dmn' ].indexOf(type) !== -1;
}
module.exports = function(element, bpmnFactory, options, translate) {
  var bindingOptions = [
    {
      name: translate('latest'),
      value: 'latest'
    },
    {
      name: translate('deployment'),
      value: 'deployment'
    },
    {
      name: translate('version'),
      value: 'version'
    },
    {
      name: translate('versionTag'),
      value: 'versionTag'
    }
  ];
  var getCallableType = options.getCallableType;
  var entries = [];
  function getAttribute(element, prop) {
    var type = getCallableType(element);
    return (attributeInfo[type] || {})[prop];
  }
  function getCallActivityBindingValue(element) {
    var type = getCallableType(element);
    var bo = getBusinessObject(element);
    var attr = (attributeInfo[type] || {}).binding;
    return bo.get(attr);
  }
  function getDelegateVariableMappingType(element) {
    var bo = getBusinessObject(element);
    var boVariableMappingClass = bo.get('activiti:variableMappingClass'),
        boVariableMappingDelegateExpression = bo.get('activiti:variableMappingDelegateExpression');
    var delegateVariableMappingType = '';
    if (typeof boVariableMappingClass !== 'undefined') {
      delegateVariableMappingType = 'variableMappingClass';
    } else
    if (typeof boVariableMappingDelegateExpression !== 'undefined') {
      delegateVariableMappingType = 'variableMappingDelegateExpression';
    }
    return delegateVariableMappingType;
  }
  entries.push(entryFactory.textField({
    id: 'callable-element-ref',
    dataValueLabel: 'callableElementLabel',
    modelProperty: 'callableElementRef',
    get: function(element, node) {
      var callableElementRef;
      var attr = getAttribute(element, 'element');
      if (attr) {
        var bo = getBusinessObject(element);
        callableElementRef = bo.get(attr);
      }
      var label = '';
      var type = getCallableType(element);
      if (type === 'bpmn') {
        label = translate('Called Element');
      }
      else if (type === 'cmmn') {
        label = translate('Case Ref');
      }
      else if (type === 'dmn') {
        label = translate('Decision Ref');
      }
      return {
        callableElementRef: callableElementRef,
        callableElementLabel: label
      };
    },
    set: function(element, values, node) {
      var newCallableElementRef = values.callableElementRef;
      var attr = getAttribute(element, 'element');
      var props = {};
      props[attr] = newCallableElementRef || '';
      return cmdHelper.updateProperties(element, props);
    },
    validate: function(element, values, node) {
      var elementRef = values.callableElementRef;
      var type = getCallableType(element);
      return isSupportedCallableType(type) && !elementRef ? { callableElementRef: translate('Must provide a value') } : {};
    },
    hidden: function(element, node) {
      return !isSupportedCallableType(getCallableType(element));
    }
  }));
  entries.push(entryFactory.selectBox({
    id: 'callable-binding',
    label: translate('Binding'),
    selectOptions: function(element) {
      var type = getCallableType(element);
      var options;
      if (type === 'cmmn') {
        options = bindingOptions.filter(function(bindingOption) {
          return bindingOption.value !== 'versionTag';
        });
      } else {
        options = bindingOptions;
      }
      return options;
    },
    modelProperty: 'callableBinding',
    get: function(element, node) {
      var callableBinding;
      var attr = getAttribute(element, 'binding');
      if (attr) {
        var bo = getBusinessObject(element);
        callableBinding = bo.get(attr) || 'latest';
      }
      return {
        callableBinding: callableBinding
      };
    },
    set: function(element, values, node) {
      var binding = values.callableBinding;
      var attr = getAttribute(element, 'binding'),
          attrVer = getAttribute(element, 'version'),
          attrVerTag = getAttribute(element, 'versionTag');
      var props = {};
      props[attr] = binding;
      // set version and versionTag values always to undefined to delete the existing value
      props[attrVer] = undefined;
      props[attrVerTag] = undefined;
      return cmdHelper.updateProperties(element, props);
    },
    hidden: function(element, node) {
      return !isSupportedCallableType(getCallableType(element));
    }
  }));
  entries.push(entryFactory.textField({
    id: 'callable-version',
    label: translate('Version'),
    modelProperty: 'callableVersion',
    get: function(element, node) {
      var callableVersion;
      var attr = getAttribute(element, 'version');
      if (attr) {
        var bo = getBusinessObject(element);
        callableVersion = bo.get(attr);
      }
      return {
        callableVersion: callableVersion
      };
    },
    set: function(element, values, node) {
      var version = values.callableVersion;
      var attr = getAttribute(element, 'version');
      var props = {};
      props[attr] = version || undefined;
      return cmdHelper.updateProperties(element, props);
    },
    validate: function(element, values, node) {
      var version = values.callableVersion;
      var type = getCallableType(element);
      return (
        isSupportedCallableType(type) &&
        getCallActivityBindingValue(element) === 'version' && (
          !version ? { callableVersion: translate('Must provide a value') } : {}
        )
      );
    },
    hidden: function(element, node) {
      var type = getCallableType(element);
      return !isSupportedCallableType(type) || getCallActivityBindingValue(element) !== 'version';
    }
  }));
  entries.push(entryFactory.textField({
    id: 'callable-version-tag',
    label: translate('Version Tag'),
    modelProperty: 'versionTag',
    get: function(element, node) {
      var versionTag;
      var attr = getAttribute(element, 'versionTag');
      if (attr) {
        var bo = getBusinessObject(element);
        versionTag = bo.get(attr);
      }
      return {
        versionTag: versionTag
      };
    },
    set: function(element, values, node) {
      var versionTag = values.versionTag;
      var attr = getAttribute(element, 'versionTag');
      var props = {};
      props[attr] = versionTag || undefined;
      return cmdHelper.updateProperties(element, props);
    },
    validate: function(element, values, node) {
      var versionTag = values.versionTag;
      var type = getCallableType(element);
      return (
        isSupportedCallableType(type) &&
        getCallActivityBindingValue(element) === 'versionTag' && (
          !versionTag ? { versionTag: translate('Must provide a value') } : {}
        )
      );
    },
    hidden: function(element, node) {
      var type = getCallableType(element);
      return !isSupportedCallableType(type) || getCallActivityBindingValue(element) !== 'versionTag';
    }
  }));
  entries.push(entryFactory.textField({
    id: 'tenant-id',
    label: translate('Tenant Id'),
    modelProperty: 'tenantId',
    get: function(element, node) {
      var tenantId;
      var attr = getAttribute(element, 'tenantId');
      if (attr) {
        var bo = getBusinessObject(element);
        tenantId = bo.get(attr);
      }
      return {
        tenantId: tenantId
      };
    },
    set: function(element, values, node) {
      var tenantId = values.tenantId;
      var attr = getAttribute(element, 'tenantId');
      var props = {};
      props[attr] = tenantId || undefined;
      return cmdHelper.updateProperties(element, props);
    },
    hidden: function(element, node) {
      var type = getCallableType(element);
      return !isSupportedCallableType(type);
    }
  }));
  if (is(getBusinessObject(element), 'bpmn:CallActivity')) {
    entries.push(entryFactory.checkbox({
      id: 'callable-business-key',
      label: translate('Business Key'),
      modelProperty: 'callableBusinessKey',
      get: function(element, node) {
        var activitiIn = getActivitiInWithBusinessKey(element);
        return {
          callableBusinessKey: !!(activitiIn && activitiIn.length > 0)
        };
      },
      set: function(element, values, node) {
        if (values.callableBusinessKey) {
          return setBusinessKey(element, '#{execution.processBusinessKey}', bpmnFactory);
        } else {
          return deleteBusinessKey(element);
        }
      }
    }));
  }
  entries.push(entryFactory.textField({
    id: 'business-key-expression',
    label: translate('Business Key Expression'),
    modelProperty: 'businessKey',
    get: function(element, node) {
      var activitiInWithBusinessKey = getActivitiInWithBusinessKey(element);
      return {
        businessKey: (
          activitiInWithBusinessKey.length ?
            activitiInWithBusinessKey[0].get('activiti:businessKey') :
            undefined
        )
      };
    },
    set: function(element, values, node) {
      var businessKey = values.businessKey;
      return setBusinessKey(element, businessKey, bpmnFactory);
    },
    validate: function(element, values, node) {
      var businessKey = values.businessKey;
      return businessKey === '' ? { businessKey: translate('Must provide a value') } : {};
    },
    hidden: function(element, node) {
      return !getActivitiInWithBusinessKey(element).length;
    }
  }));
  entries = entries.concat(resultVariable(element, bpmnFactory, {
    id: 'dmn-resultVariable',
    getBusinessObject: getBusinessObject,
    getImplementationType: getCallableType,
    hideResultVariable: function(element, node) {
      return getCallableType(element) !== 'dmn';
    }
  }, translate));
  entries.push(entryFactory.selectBox({
    id: 'dmn-map-decision-result',
    label: translate('Map Decision Result'),
    selectOptions: mapDecisionResultOptions,
    modelProperty: 'mapDecisionResult',
    get: function(element, node) {
      var bo = getBusinessObject(element);
      return {
        mapDecisionResult: bo.get('activiti:mapDecisionResult') || 'resultList'
      };
    },
    set: function(element, values, node) {
      return cmdHelper.updateProperties(element, {
        'activiti:mapDecisionResult': values.mapDecisionResult || 'resultList'
      });
    },
    hidden: function(element, node) {
      var bo = getBusinessObject(element);
      var resultVariable = bo.get('activiti:resultVariable');
      return !(getCallableType(element) === 'dmn' && typeof resultVariable !== 'undefined');
    }
  }));
  entries.push(entryFactory.selectBox({
    id: 'delegateVariableMappingType',
    label: translate('Delegate Variable Mapping'),
    selectOptions: delegateVariableMappingOptions,
    emptyParameter: true,
    modelProperty: 'delegateVariableMappingType',
    get: function(element, node) {
      return {
        delegateVariableMappingType : getDelegateVariableMappingType(element)
      };
    },
    set: function(element, values, node) {
      var delegateVariableMappingType = values.delegateVariableMappingType;
      var props = {
        'activiti:variableMappingClass' : undefined,
        'activiti:variableMappingDelegateExpression' : undefined
      };
      if (delegateVariableMappingType === 'variableMappingClass') {
        props['activiti:variableMappingClass'] = '';
      }
      else if (delegateVariableMappingType === 'variableMappingDelegateExpression') {
        props['activiti:variableMappingDelegateExpression'] = '';
      }
      return cmdHelper.updateProperties(element, props);
    },
    hidden: function(element, node) {
      return (getCallableType(element) !== 'bpmn');
    }
  }));
  entries.push(entryFactory.textField({
    id: 'delegateVariableMapping',
    dataValueLabel: 'delegateVariableMappingLabel',
    modelProperty: 'delegateVariableMapping',
    get: function(element, node) {
      var bo = getBusinessObject(element);
      var label = '';
      var delegateVariableMapping = undefined;
      var type = getDelegateVariableMappingType(element);
      if (type === 'variableMappingClass') {
        label = translate('Class');
        delegateVariableMapping = bo.get('activiti:variableMappingClass');
      }
      else if (type === 'variableMappingDelegateExpression') {
        label = translate('Delegate Expression');
        delegateVariableMapping = bo.get('activiti:variableMappingDelegateExpression');
      }
      return {
        delegateVariableMapping: delegateVariableMapping,
        delegateVariableMappingLabel: label
      };
    },
    set: function(element, values, node) {
      var delegateVariableMapping = values.delegateVariableMapping;
      var attr = 'activiti:' + getDelegateVariableMappingType(element);
      var props = {};
      props[attr] = delegateVariableMapping || undefined;
      return cmdHelper.updateProperties(element, props);
    },
    validate: function(element, values, node) {
      var delegateVariableMapping = values.delegateVariableMapping;
      return (
        getCallableType(element) === 'bpmn' && (
          !delegateVariableMapping ? { delegateVariableMapping: translate('Must provide a value') } : {}
        )
      );
    },
    hidden: function(element, node) {
      return !(getCallableType(element) === 'bpmn' && getDelegateVariableMappingType(element) !== '');
    }
  }));
  return entries;
};
ruoyi-bpmnjs/resources/properties-panel/provider/activiti/parts/implementation/CandidateStarter.js
New file
@@ -0,0 +1,63 @@
'use strict';
var entryFactory = require('../../../../factory/EntryFactory');
var cmdHelper = require('../../../../helper/CmdHelper');
module.exports = function(element, bpmnFactory, options, translate) {
  var getBusinessObject = options.getBusinessObject;
  var candidateStarterGroupsEntry = entryFactory.textField({
    id: 'candidateStarterGroups',
    label: translate('Candidate Starter Groups'),
    modelProperty: 'candidateStarterGroups',
    description: translate('Specify more than one group as a comma separated list.'),
    get: function(element, node) {
      var bo = getBusinessObject(element);
      var candidateStarterGroups = bo.get('activiti:candidateStarterGroups');
      return {
        candidateStarterGroups: candidateStarterGroups ? candidateStarterGroups : ''
      };
    },
    set: function(element, values) {
      var bo = getBusinessObject(element);
      return cmdHelper.updateBusinessObject(element, bo, {
        'activiti:candidateStarterGroups': values.candidateStarterGroups || undefined
      });
    }
  });
  var candidateStarterUsersEntry = entryFactory.textField({
    id: 'candidateStarterUsers',
    label: translate('Candidate Starter Users'),
    modelProperty: 'candidateStarterUsers',
    description: translate('Specify more than one user as a comma separated list.'),
    get: function(element, node) {
      var bo = getBusinessObject(element);
      var candidateStarterUsers = bo.get('activiti:candidateStarterUsers');
      return {
        candidateStarterUsers: candidateStarterUsers ? candidateStarterUsers : ''
      };
    },
    set: function(element, values) {
      var bo = getBusinessObject(element);
      return cmdHelper.updateBusinessObject(element, bo, {
        'activiti:candidateStarterUsers': values.candidateStarterUsers || undefined
      });
    }
  });
  return [
    candidateStarterGroupsEntry,
    candidateStarterUsersEntry
  ];
};
ruoyi-bpmnjs/resources/properties-panel/provider/activiti/parts/implementation/Delegate.js
New file
@@ -0,0 +1,83 @@
'use strict';
var entryFactory = require('../../../../factory/EntryFactory'),
    cmdHelper = require('../../../../helper/CmdHelper');
var DELEGATE_TYPES = [
  'class',
  'expression',
  'delegateExpression'
];
var PROPERTIES = {
  class: 'activiti:class',
  expression: 'activiti:expression',
  delegateExpression: 'activiti:delegateExpression'
};
function isDelegate(type) {
  return DELEGATE_TYPES.indexOf(type) !== -1;
}
function getAttribute(type) {
  return PROPERTIES[type];
}
module.exports = function(element, bpmnFactory, options, translate) {
  var getImplementationType = options.getImplementationType,
      getBusinessObject = options.getBusinessObject;
  function getDelegationLabel(type) {
    switch (type) {
    case 'class':
      return translate('Java Class');
    case 'expression':
      return translate('Expression');
    case 'delegateExpression':
      return translate('Delegate Expression');
    default:
      return '';
    }
  }
  var delegateEntry = entryFactory.textField({
    id: 'delegate',
    label: translate('Value'),
    dataValueLabel: 'delegationLabel',
    modelProperty: 'delegate',
    get: function(element, node) {
      var bo = getBusinessObject(element);
      var type = getImplementationType(element);
      var attr = getAttribute(type);
      var label = getDelegationLabel(type);
      return {
        delegate: bo.get(attr),
        delegationLabel: label
      };
    },
    set: function(element, values, node) {
      var bo = getBusinessObject(element);
      var type = getImplementationType(element);
      var attr = getAttribute(type);
      var prop = {};
      prop[attr] = values.delegate || '';
      return cmdHelper.updateBusinessObject(element, bo, prop);
    },
    validate: function(element, values, node) {
      return isDelegate(getImplementationType(element)) && !values.delegate ? { delegate: translate('Must provide a value') } : {};
    },
    hidden: function(element, node) {
      return !isDelegate(getImplementationType(element));
    }
  });
  return [ delegateEntry ];
};
ruoyi-bpmnjs/resources/properties-panel/provider/activiti/parts/implementation/ErrorEventDefinition.js
New file
@@ -0,0 +1,65 @@
'use strict';
var entryFactory = require('../../../../factory/EntryFactory'),
    cmdHelper = require('../../../../helper/CmdHelper'),
    elementReferenceProperty = require('../../../../provider/bpmn/parts/implementation/ElementReferenceProperty');
module.exports = function(
    group, element, bpmnFactory, errorEventDefinition,
    showErrorCodeVariable, showErrorMessageVariable, translate
) {
  var getValue = function(modelProperty) {
    return function(element) {
      var modelPropertyValue = errorEventDefinition.get('activiti:' + modelProperty);
      var value = {};
      value[modelProperty] = modelPropertyValue;
      return value;
    };
  };
  var setValue = function(modelProperty) {
    return function(element, values) {
      var props = {};
      props['activiti:' + modelProperty] = values[modelProperty] || undefined;
      return cmdHelper.updateBusinessObject(element, errorEventDefinition, props);
    };
  };
  group.entries = group.entries.concat(
    elementReferenceProperty(element, errorEventDefinition, bpmnFactory, {
      id: 'error-element-message',
      label: translate('Error Message'),
      referenceProperty: 'errorRef',
      modelProperty: 'errorMessage'
    })
  );
  if (showErrorCodeVariable) {
    group.entries.push(entryFactory.textField({
      id: 'errorCodeVariable',
      label: translate('Error Code Variable'),
      modelProperty : 'errorCodeVariable',
      get: getValue('errorCodeVariable'),
      set: setValue('errorCodeVariable')
    }));
  }
  if (showErrorMessageVariable) {
    group.entries.push(entryFactory.textField({
      id: 'errorMessageVariable',
      label: translate('Error Message Variable'),
      modelProperty: 'errorMessageVariable',
      get: getValue('errorMessageVariable'),
      set: setValue('errorMessageVariable')
    }));
  }
};
ruoyi-bpmnjs/resources/properties-panel/provider/activiti/parts/implementation/ExtensionElements.js
New file
@@ -0,0 +1,235 @@
'use strict';
var getBusinessObject = require('bpmn-js/lib/util/ModelUtil').getBusinessObject;
var domQuery = require('min-dom').query,
    domClosest = require('min-dom').closest,
    domify = require('min-dom').domify,
    forEach = require('lodash/forEach');
var elementHelper = require('../../../../helper/ElementHelper'),
    cmdHelper = require('../../../../helper/CmdHelper'),
    utils = require('../../../../Utils'),
    escapeHTML = utils.escapeHTML;
function getSelectBox(node, id) {
  var currentTab = domClosest(node, 'div.bpp-properties-tab');
  var query = 'select[name=selectedExtensionElement]' + (id ? '[id=cam-extensionElements-' + id + ']' : '');
  return domQuery(query, currentTab);
}
function getSelected(node, id) {
  var selectBox = getSelectBox(node, id);
  return {
    value: (selectBox || {}).value,
    idx: (selectBox || {}).selectedIndex
  };
}
function generateElementId(prefix) {
  prefix = prefix + '_';
  return utils.nextId(prefix);
}
var CREATE_EXTENSION_ELEMENT_ACTION = 'create-extension-element',
    REMOVE_EXTENSION_ELEMENT_ACTION = 'remove-extension-element';
module.exports = function(element, bpmnFactory, options, translate) {
  var id = options.id,
      prefix = options.prefix || 'elem',
      label = options.label || id,
      idGeneration = (options.idGeneration === false) ? options.idGeneration : true,
      businessObject = options.businessObject || getBusinessObject(element);
  var modelProperty = options.modelProperty || 'id';
  var getElements = options.getExtensionElements;
  var createElement = options.createExtensionElement,
      canCreate = typeof createElement === 'function';
  var removeElement = options.removeExtensionElement,
      canRemove = typeof removeElement === 'function';
  var onSelectionChange = options.onSelectionChange;
  var hideElements = options.hideExtensionElements,
      canBeHidden = typeof hideElements === 'function';
  var setOptionLabelValue = options.setOptionLabelValue;
  var defaultSize = options.size || 5,
      resizable = options.resizable;
  var reference = options.reference || undefined;
  var selectionChanged = function(element, node, event, scope) {
    if (typeof onSelectionChange === 'function') {
      return onSelectionChange(element, node, event, scope);
    }
  };
  var createOption = function(value) {
    return '<option value="' + escapeHTML(value) + '" data-value data-name="extensionElementValue">' + escapeHTML(value) + '</option>';
  };
  var initSelectionSize = function(selectBox, optionsLength) {
    if (resizable) {
      selectBox.size = optionsLength > defaultSize ? optionsLength : defaultSize;
    }
  };
  return {
    id: id,
    html: '<div class="bpp-row bpp-element-list" ' +
            (canBeHidden ? 'data-show="hideElements"' : '') + '>' +
            '<label for="cam-extensionElements-' + escapeHTML(id) + '">' + escapeHTML(label) + '</label>' +
            '<div class="bpp-field-wrapper">' +
              '<select id="cam-extensionElements-' + escapeHTML(id) + '"' +
                      'name="selectedExtensionElement" ' +
                      'size="' + escapeHTML(defaultSize) + '" ' +
                      'data-list-entry-container ' +
                      'data-on-change="selectElement">' +
              '</select>' +
              (canCreate ? '<button class="add" ' +
                                   'id="cam-extensionElements-create-' + escapeHTML(id) + '" ' +
                                   'data-action="createElement">' +
                             '<span>+</span>' +
                           '</button>' : '') +
              (canRemove ? '<button class="clear" ' +
                                   'id="cam-extensionElements-remove-' + escapeHTML(id) + '" ' +
                                   'data-action="removeElement" ' +
                                   'data-disable="disableRemove">' +
                             '<span>-</span>' +
                           '</button>' : '') +
            '</div>' +
          '</div>',
    get: function(element, node) {
      var elements = getElements(element, node);
      var result = [];
      forEach(elements, function(elem) {
        result.push({
          extensionElementValue: elem.get(modelProperty)
        });
      });
      var selectBox = getSelectBox(node.parentNode, id);
      initSelectionSize(selectBox, result.length);
      return result;
    },
    set: function(element, values, node) {
      var action = this.__action;
      delete this.__action;
      businessObject = businessObject || getBusinessObject(element);
      var bo =
        (reference && businessObject.get(reference))
          ? businessObject.get(reference)
          : businessObject;
      var extensionElements = bo.get('extensionElements');
      if (action.id === CREATE_EXTENSION_ELEMENT_ACTION) {
        var commands = [];
        if (!extensionElements) {
          extensionElements = elementHelper.createElement('bpmn:ExtensionElements', { values: [] }, bo, bpmnFactory);
          commands.push(cmdHelper.updateBusinessObject(element, bo, { extensionElements: extensionElements }));
        }
        commands.push(createElement(element, extensionElements, action.value, node));
        return commands;
      }
      else if (action.id === REMOVE_EXTENSION_ELEMENT_ACTION) {
        return removeElement(element, extensionElements, action.value, action.idx, node);
      }
    },
    createListEntryTemplate: function(value, index, selectBox) {
      initSelectionSize(selectBox, selectBox.options.length + 1);
      return createOption(value.extensionElementValue);
    },
    deselect: function(element, node) {
      var selectBox = getSelectBox(node, id);
      selectBox.selectedIndex = -1;
    },
    getSelected: function(element, node) {
      return getSelected(node, id);
    },
    setControlValue: function(element, node, option, property, value, idx) {
      node.value = value;
      if (!setOptionLabelValue) {
        node.text = value;
      } else {
        setOptionLabelValue(element, node, option, property, value, idx);
      }
    },
    createElement: function(element, node) {
      // create option template
      var generatedId;
      if (idGeneration) {
        generatedId = generateElementId(prefix);
      }
      var selectBox = getSelectBox(node, id);
      var template = domify(createOption(generatedId));
      // add new empty option as last child element
      selectBox.appendChild(template);
      // select last child element
      selectBox.lastChild.selected = 'selected';
      selectionChanged(element, node);
      // update select box size
      initSelectionSize(selectBox, selectBox.options.length);
      this.__action = {
        id: CREATE_EXTENSION_ELEMENT_ACTION,
        value: generatedId
      };
      return true;
    },
    removeElement: function(element, node) {
      var selection = getSelected(node, id);
      var selectBox = getSelectBox(node, id);
      selectBox.removeChild(selectBox.options[selection.idx]);
      // update select box size
      initSelectionSize(selectBox, selectBox.options.length);
      this.__action = {
        id: REMOVE_EXTENSION_ELEMENT_ACTION,
        value: selection.value,
        idx: selection.idx
      };
      return true;
    },
    hideElements: function(element, entryNode, node, scopeNode) {
      return !hideElements(element, entryNode, node, scopeNode);
    },
    disableRemove: function(element, entryNode, node, scopeNode) {
      return (getSelected(entryNode, id) || {}).idx < 0;
    },
    selectElement: selectionChanged
  };
};
ruoyi-bpmnjs/resources/properties-panel/provider/activiti/parts/implementation/External.js
New file
@@ -0,0 +1,44 @@
'use strict';
var entryFactory = require('../../../../factory/EntryFactory'),
    cmdHelper = require('../../../../helper/CmdHelper');
module.exports = function(element, bpmnFactory, options, translate) {
  var getImplementationType = options.getImplementationType,
      getBusinessObject = options.getBusinessObject;
  function isExternal(element) {
    return getImplementationType(element) === 'external';
  }
  var topicEntry = entryFactory.textField({
    id: 'externalTopic',
    label: translate('Topic'),
    modelProperty: 'externalTopic',
    get: function(element, node) {
      var bo = getBusinessObject(element);
      return { externalTopic: bo.get('activiti:topic') };
    },
    set: function(element, values, node) {
      var bo = getBusinessObject(element);
      return cmdHelper.updateBusinessObject(element, bo, {
        'activiti:topic': values.externalTopic
      });
    },
    validate: function(element, values, node) {
      return isExternal(element) && !values.externalTopic ? { externalTopic: translate('Must provide a value') } : {};
    },
    hidden: function(element, node) {
      return !isExternal(element);
    }
  });
  return [ topicEntry ];
};
ruoyi-bpmnjs/resources/properties-panel/provider/activiti/parts/implementation/ExternalTaskPriority.js
New file
@@ -0,0 +1,34 @@
'use strict';
var entryFactory = require('../../../../factory/EntryFactory');
var cmdHelper = require('../../../../helper/CmdHelper');
module.exports = function(element, bpmnFactory, options, translate) {
  var getBusinessObject = options.getBusinessObject;
  var externalTaskPriorityEntry = entryFactory.textField({
    id: 'externalTaskPriority',
    label: translate('Task Priority'),
    modelProperty: 'taskPriority',
    get: function(element, node) {
      var bo = getBusinessObject(element);
      return {
        taskPriority: bo.get('activiti:taskPriority')
      };
    },
    set: function(element, values) {
      var bo = getBusinessObject(element);
      return cmdHelper.updateBusinessObject(element, bo, {
        'activiti:taskPriority': values.taskPriority || undefined
      });
    }
  });
  return [ externalTaskPriorityEntry ];
};
ruoyi-bpmnjs/resources/properties-panel/provider/activiti/parts/implementation/FieldInjection.js
New file
@@ -0,0 +1,310 @@
'use strict';
var extensionElementsHelper = require('../../../../helper/ExtensionElementsHelper'),
    elementHelper = require('../../../../helper/ElementHelper'),
    cmdHelper = require('../../../../helper/CmdHelper');
var utils = require('../../../../Utils');
var entryFactory = require('../../../../factory/EntryFactory');
var extensionElementsEntry = require('./ExtensionElements');
var ModelUtil = require('bpmn-js/lib/util/ModelUtil'),
    getBusinessObject = ModelUtil.getBusinessObject;
var assign = require('lodash/assign');
var DEFAULT_PROPS = {
  'stringValue': undefined,
  'string': undefined,
  'expression': undefined
};
var ACTIVITI_FIELD_EXTENSION_ELEMENT = 'activiti:Field';
module.exports = function(element, bpmnFactory, translate, options) {
  options = options || {};
  var insideListener = !!options.insideListener,
      idPrefix = options.idPrefix || '',
      getSelectedListener = options.getSelectedListener,
      businessObject = options.businessObject || getBusinessObject(element);
  var entries = [];
  var isSelected = function(element, node) {
    return getSelectedField(element, node);
  };
  function getSelectedField(element, node) {
    var selected = fieldEntry.getSelected(element, node.parentNode);
    if (selected.idx === -1) {
      return;
    }
    var fields = getActivitiFields(element, node);
    return fields[selected.idx];
  }
  function getActivitiFields(element, node) {
    if (!insideListener) {
      return (
        businessObject &&
        extensionElementsHelper.getExtensionElements(businessObject, ACTIVITI_FIELD_EXTENSION_ELEMENT)
      ) || [];
    }
    return getActivitiListenerFields(element, node);
  }
  function getActivitiListenerFields(element, node) {
    var selectedListener = getSelectedListener(element, node);
    return selectedListener && selectedListener.fields || [];
  }
  function getFieldType(bo) {
    var fieldType = 'string';
    var expressionValue = bo && bo.expression;
    var stringValue = bo && (bo.string || bo.stringValue);
    if (typeof stringValue !== 'undefined') {
      fieldType = 'string';
    } else if (typeof expressionValue !== 'undefined') {
      fieldType = 'expression';
    }
    return fieldType;
  }
  var setOptionLabelValue = function() {
    return function(element, node, option, property, value, idx) {
      var activitiFields = getActivitiFields(element, node);
      var field = activitiFields[idx];
      value = (field.name) ? field.name : '<empty>';
      var label = idx + ' : ' + value;
      option.text = label;
    };
  };
  var newElement = function() {
    return function(element, extensionElements, value, node) {
      var props = {
        name: '',
        string: ''
      };
      var newFieldElem;
      if (!insideListener) {
        newFieldElem = elementHelper.createElement(ACTIVITI_FIELD_EXTENSION_ELEMENT, props, extensionElements, bpmnFactory);
        return cmdHelper.addElementsTolist(element, extensionElements, 'values', [ newFieldElem ]);
      } else {
        var selectedListener = getSelectedListener(element, node);
        newFieldElem = elementHelper.createElement(ACTIVITI_FIELD_EXTENSION_ELEMENT, props, selectedListener, bpmnFactory);
        return cmdHelper.addElementsTolist(element, selectedListener, 'fields', [ newFieldElem ]);
      }
    };
  };
  var removeElement = function() {
    return function(element, extensionElements, value, idx, node) {
      var activitiFields= getActivitiFields(element, node);
      var field = activitiFields[idx];
      if (field) {
        if (!insideListener) {
          return extensionElementsHelper.removeEntry(businessObject, element, field);
        }
        var selectedListener = getSelectedListener(element, node);
        return cmdHelper.removeElementsFromList(element, selectedListener, 'fields', null, [ field ]);
      }
    };
  };
  var fieldEntry = extensionElementsEntry(element, bpmnFactory, {
    id : idPrefix + 'fields',
    label : translate('Fields'),
    modelProperty: 'fieldName',
    idGeneration: 'false',
    businessObject: businessObject,
    createExtensionElement: newElement(),
    removeExtensionElement: removeElement(),
    getExtensionElements: function(element, node) {
      return getActivitiFields(element, node);
    },
    setOptionLabelValue: setOptionLabelValue()
  });
  entries.push(fieldEntry);
  entries.push(entryFactory.validationAwareTextField({
    id: idPrefix + 'field-name',
    label: translate('Name'),
    modelProperty: 'fieldName',
    getProperty: function(element, node) {
      return (getSelectedField(element, node) || {}).name;
    },
    setProperty: function(element, values, node) {
      var selectedField = getSelectedField(element, node);
      return cmdHelper.updateBusinessObject(element, selectedField, { name : values.fieldName });
    },
    validate: function(element, values, node) {
      var bo = getSelectedField(element, node);
      var validation = {};
      if (bo) {
        var nameValue = values.fieldName;
        if (nameValue) {
          if (utils.containsSpace(nameValue)) {
            validation.fieldName = translate('Name must not contain spaces');
          }
        } else {
          validation.fieldName = translate('Parameter must have a name');
        }
      }
      return validation;
    },
    hidden: function(element, node) {
      return !isSelected(element, node);
    }
  }));
  var fieldTypeOptions = [
    {
      name: translate('String'),
      value: 'string'
    },
    {
      name: translate('Expression'),
      value: 'expression'
    }
  ];
  entries.push(entryFactory.selectBox({
    id: idPrefix + 'field-type',
    label: translate('Type'),
    selectOptions: fieldTypeOptions,
    modelProperty: 'fieldType',
    get: function(element, node) {
      var bo = getSelectedField(element, node);
      var fieldType = getFieldType(bo);
      return {
        fieldType: fieldType
      };
    },
    set: function(element, values, node) {
      var props = assign({}, DEFAULT_PROPS);
      var fieldType = values.fieldType;
      if (fieldType === 'string') {
        props.string = '';
      }
      else if (fieldType === 'expression') {
        props.expression = '';
      }
      return cmdHelper.updateBusinessObject(element, getSelectedField(element, node), props);
    },
    hidden: function(element, node) {
      return !isSelected(element, node);
    }
  }));
  entries.push(entryFactory.textBox({
    id: idPrefix + 'field-value',
    label: translate('Value'),
    modelProperty: 'fieldValue',
    get: function(element, node) {
      var bo = getSelectedField(element, node);
      var fieldType = getFieldType(bo);
      var fieldValue;
      if (fieldType === 'string') {
        fieldValue = bo && (bo.string || bo.stringValue);
      }
      else if (fieldType === 'expression') {
        fieldValue = bo && bo.expression;
      }
      return {
        fieldValue: fieldValue
      };
    },
    set: function(element, values, node) {
      var bo = getSelectedField(element, node);
      var fieldType = getFieldType(bo);
      var props = assign({}, DEFAULT_PROPS);
      var fieldValue = values.fieldValue || undefined;
      if (fieldType === 'string') {
        props.string = fieldValue;
      }
      else if (fieldType === 'expression') {
        props.expression = fieldValue;
      }
      return cmdHelper.updateBusinessObject(element, bo, props);
    },
    validate: function(element, values, node) {
      var bo = getSelectedField(element, node);
      var validation = {};
      if (bo) {
        if (!values.fieldValue) {
          validation.fieldValue = translate('Must provide a value');
        }
      }
      return validation;
    },
    show: function(element, node) {
      return isSelected(element, node);
    }
  }));
  return entries;
};
ruoyi-bpmnjs/resources/properties-panel/provider/activiti/parts/implementation/HistoryTimeToLive.js
New file
@@ -0,0 +1,35 @@
'use strict';
var entryFactory = require('../../../../factory/EntryFactory');
var cmdHelper = require('../../../../helper/CmdHelper');
module.exports = function(element, bpmnFactory, options, translate) {
  var getBusinessObject = options.getBusinessObject;
  var historyTimeToLiveEntry = entryFactory.textField({
    id: 'historyTimeToLive',
    label: translate('History Time To Live'),
    modelProperty: 'historyTimeToLive',
    get: function(element, node) {
      var bo = getBusinessObject(element);
      var historyTimeToLive = bo.get('activiti:historyTimeToLive');
      return {
        historyTimeToLive: historyTimeToLive ? historyTimeToLive : ''
      };
    },
    set: function(element, values) {
      var bo = getBusinessObject(element);
      return cmdHelper.updateBusinessObject(element, bo, {
        'activiti:historyTimeToLive': values.historyTimeToLive || undefined
      });
    }
  });
  return [ historyTimeToLiveEntry ];
};
ruoyi-bpmnjs/resources/properties-panel/provider/activiti/parts/implementation/ImplementationType.js
New file
@@ -0,0 +1,173 @@
'use strict';
var entryFactory = require('../../../../factory/EntryFactory'),
    cmdHelper = require('../../../../helper/CmdHelper'),
    extensionElementsHelper = require('../../../../helper/ExtensionElementsHelper'),
    elementHelper = require('../../../../helper/ElementHelper');
var assign = require('lodash/assign');
var map = require('lodash/map');
var DEFAULT_DELEGATE_PROPS = [ 'class', 'expression', 'delegateExpression' ];
var DELEGATE_PROPS = {
  'activiti:class': undefined,
  'activiti:expression': undefined,
  'activiti:delegateExpression': undefined,
  'activiti:resultVariable': undefined
};
var DMN_CAPABLE_PROPS = {
  'activiti:decisionRef': undefined,
  'activiti:decisionRefBinding': 'latest',
  'activiti:decisionRefVersion': undefined,
  'activiti:mapDecisionResult': 'resultList',
  'activiti:decisionRefTenantId': undefined
};
var EXTERNAL_CAPABLE_PROPS = {
  'activiti:type': undefined,
  'activiti:topic': undefined
};
module.exports = function(element, bpmnFactory, options, translate) {
  var DEFAULT_OPTIONS = [
    { value: 'class', name: translate('Java Class') },
    { value: 'expression', name: translate('Expression') },
    { value: 'delegateExpression', name: translate('Delegate Expression') }
  ];
  var DMN_OPTION = [
    { value: 'dmn', name: translate('DMN') }
  ];
  var EXTERNAL_OPTION = [
    { value: 'external', name: translate('External') }
  ];
  var CONNECTOR_OPTION = [
    { value: 'connector', name: translate('Connector') }
  ];
  var SCRIPT_OPTION = [
    { value: 'script', name: translate('Script') }
  ];
  var getType = options.getImplementationType,
      getBusinessObject = options.getBusinessObject;
  var hasDmnSupport = options.hasDmnSupport,
      hasExternalSupport = options.hasExternalSupport,
      hasServiceTaskLikeSupport = options.hasServiceTaskLikeSupport,
      hasScriptSupport = options.hasScriptSupport;
  var entries = [];
  var selectOptions = DEFAULT_OPTIONS.concat([]);
  if (hasDmnSupport) {
    selectOptions = selectOptions.concat(DMN_OPTION);
  }
  if (hasExternalSupport) {
    selectOptions = selectOptions.concat(EXTERNAL_OPTION);
  }
  if (hasServiceTaskLikeSupport) {
    selectOptions = selectOptions.concat(CONNECTOR_OPTION);
  }
  if (hasScriptSupport) {
    selectOptions = selectOptions.concat(SCRIPT_OPTION);
  }
  selectOptions.push({ value: '' });
  entries.push(entryFactory.selectBox({
    id : 'implementation',
    label: translate('Implementation'),
    selectOptions: selectOptions,
    modelProperty: 'implType',
    get: function(element, node) {
      return {
        implType: getType(element) || ''
      };
    },
    set: function(element, values, node) {
      var bo = getBusinessObject(element);
      var oldType = getType(element);
      var newType = values.implType;
      var props = assign({}, DELEGATE_PROPS);
      if (DEFAULT_DELEGATE_PROPS.indexOf(newType) !== -1) {
        var newValue = '';
        if (DEFAULT_DELEGATE_PROPS.indexOf(oldType) !== -1) {
          newValue = bo.get('activiti:' + oldType);
        }
        props['activiti:' + newType] = newValue;
      }
      if (hasDmnSupport) {
        props = assign(props, DMN_CAPABLE_PROPS);
        if (newType === 'dmn') {
          props['activiti:decisionRef'] = '';
        }
      }
      if (hasExternalSupport) {
        props = assign(props, EXTERNAL_CAPABLE_PROPS);
        if (newType === 'external') {
          props['activiti:type'] = 'external';
          props['activiti:topic'] = '';
        }
      }
      if (hasScriptSupport) {
        props['activiti:script'] = undefined;
        if (newType === 'script') {
          props['activiti:script'] = elementHelper.createElement('activiti:Script', {}, bo, bpmnFactory);
        }
      }
      var commands = [];
      commands.push(cmdHelper.updateBusinessObject(element, bo, props));
      if (hasServiceTaskLikeSupport) {
        var connectors = extensionElementsHelper.getExtensionElements(bo, 'activiti:Connector');
        commands.push(map(connectors, function(connector) {
          return extensionElementsHelper.removeEntry(bo, element, connector);
        }));
        if (newType === 'connector') {
          var extensionElements = bo.get('extensionElements');
          if (!extensionElements) {
            extensionElements = elementHelper.createElement('bpmn:ExtensionElements', { values: [] }, bo, bpmnFactory);
            commands.push(cmdHelper.updateBusinessObject(element, bo, { extensionElements: extensionElements }));
          }
          var connector = elementHelper.createElement('activiti:Connector', {}, extensionElements, bpmnFactory);
          commands.push(cmdHelper.addAndRemoveElementsFromList(
            element,
            extensionElements,
            'values',
            'extensionElements',
            [ connector ],
            []
          ));
        }
      }
      return commands;
    }
  }));
  return entries;
};
ruoyi-bpmnjs/resources/properties-panel/provider/activiti/parts/implementation/InputOutput.js
New file
@@ -0,0 +1,225 @@
'use strict';
var getBusinessObject = require('bpmn-js/lib/util/ModelUtil').getBusinessObject;
var elementHelper = require('../../../../helper/ElementHelper'),
    extensionElementsHelper = require('../../../../helper/ExtensionElementsHelper'),
    inputOutputHelper = require('../../../../helper/InputOutputHelper'),
    cmdHelper = require('../../../../helper/CmdHelper');
var extensionElementsEntry = require('./ExtensionElements');
function getInputOutput(element, insideConnector) {
  return inputOutputHelper.getInputOutput(element, insideConnector);
}
function getConnector(element) {
  return inputOutputHelper.getConnector(element);
}
function getInputParameters(element, insideConnector) {
  return inputOutputHelper.getInputParameters(element, insideConnector);
}
function getOutputParameters(element, insideConnector) {
  return inputOutputHelper.getOutputParameters(element, insideConnector);
}
function getInputParameter(element, insideConnector, idx) {
  return inputOutputHelper.getInputParameter(element, insideConnector, idx);
}
function getOutputParameter(element, insideConnector, idx) {
  return inputOutputHelper.getOutputParameter(element, insideConnector, idx);
}
function createElement(type, parent, factory, properties) {
  return elementHelper.createElement(type, properties, parent, factory);
}
function createInputOutput(parent, bpmnFactory, properties) {
  return createElement('activiti:InputOutput', parent, bpmnFactory, properties);
}
function createParameter(type, parent, bpmnFactory, properties) {
  return createElement(type, parent, bpmnFactory, properties);
}
function ensureInputOutputSupported(element, insideConnector) {
  return inputOutputHelper.isInputOutputSupported(element, insideConnector);
}
function ensureOutparameterSupported(element, insideConnector) {
  return inputOutputHelper.areOutputParametersSupported(element, insideConnector);
}
module.exports = function(element, bpmnFactory, options, translate) {
  var TYPE_LABEL = {
    'activiti:Map': translate('Map'),
    'activiti:List': translate('List'),
    'activiti:Script': translate('Script')
  };
  options = options || {};
  var insideConnector = !!options.insideConnector,
      idPrefix = options.idPrefix || '';
  var getSelected = function(element, node) {
    var selection = (inputEntry && inputEntry.getSelected(element, node)) || { idx: -1 };
    var parameter = getInputParameter(element, insideConnector, selection.idx);
    if (!parameter && outputEntry) {
      selection = outputEntry.getSelected(element, node);
      parameter = getOutputParameter(element, insideConnector, selection.idx);
    }
    return parameter;
  };
  var result = {
    getSelectedParameter: getSelected
  };
  var entries = result.entries = [];
  if (!ensureInputOutputSupported(element)) {
    return result;
  }
  var newElement = function(type, prop, factory) {
    return function(element, extensionElements, value) {
      var commands = [];
      var inputOutput = getInputOutput(element, insideConnector);
      if (!inputOutput) {
        var parent = !insideConnector ? extensionElements : getConnector(element);
        inputOutput = createInputOutput(parent, bpmnFactory, {
          inputParameters: [],
          outputParameters: []
        });
        if (!insideConnector) {
          commands.push(cmdHelper.addAndRemoveElementsFromList(
            element,
            extensionElements,
            'values',
            'extensionElements',
            [ inputOutput ],
            []
          ));
        } else {
          commands.push(cmdHelper.updateBusinessObject(element, parent, { inputOutput: inputOutput }));
        }
      }
      var newElem = createParameter(type, inputOutput, bpmnFactory, { name: value });
      commands.push(cmdHelper.addElementsTolist(element, inputOutput, prop, [ newElem ]));
      return commands;
    };
  };
  var removeElement = function(getter, prop, otherProp) {
    return function(element, extensionElements, value, idx) {
      var inputOutput = getInputOutput(element, insideConnector);
      var parameter = getter(element, insideConnector, idx);
      var commands = [];
      commands.push(cmdHelper.removeElementsFromList(element, inputOutput, prop, null, [ parameter ]));
      var firstLength = inputOutput.get(prop).length-1;
      var secondLength = (inputOutput.get(otherProp) || []).length;
      if (!firstLength && !secondLength) {
        if (!insideConnector) {
          commands.push(extensionElementsHelper.removeEntry(getBusinessObject(element), element, inputOutput));
        } else {
          var connector = getConnector(element);
          commands.push(cmdHelper.updateBusinessObject(element, connector, { inputOutput: undefined }));
        }
      }
      return commands;
    };
  };
  var setOptionLabelValue = function(getter) {
    return function(element, node, option, property, value, idx) {
      var parameter = getter(element, insideConnector, idx);
      var suffix = 'Text';
      var definition = parameter.get('definition');
      if (typeof definition !== 'undefined') {
        var type = definition.$type;
        suffix = TYPE_LABEL[type];
      }
      option.text = (value || '') + ' : ' + suffix;
    };
  };
  // input parameters ///////////////////////////////////////////////////////////////
  var inputEntry = extensionElementsEntry(element, bpmnFactory, {
    id: idPrefix + 'inputs',
    label: translate('Input Parameters'),
    modelProperty: 'name',
    prefix: 'Input',
    resizable: true,
    createExtensionElement: newElement('activiti:InputParameter', 'inputParameters'),
    removeExtensionElement: removeElement(getInputParameter, 'inputParameters', 'outputParameters'),
    getExtensionElements: function(element) {
      return getInputParameters(element, insideConnector);
    },
    onSelectionChange: function(element, node, event, scope) {
      outputEntry && outputEntry.deselect(element, node);
    },
    setOptionLabelValue: setOptionLabelValue(getInputParameter)
  });
  entries.push(inputEntry);
  // output parameters ///////////////////////////////////////////////////////
  if (ensureOutparameterSupported(element, insideConnector)) {
    var outputEntry = extensionElementsEntry(element, bpmnFactory, {
      id: idPrefix + 'outputs',
      label: translate('Output Parameters'),
      modelProperty: 'name',
      prefix: 'Output',
      resizable: true,
      createExtensionElement: newElement('activiti:OutputParameter', 'outputParameters'),
      removeExtensionElement: removeElement(getOutputParameter, 'outputParameters', 'inputParameters'),
      getExtensionElements: function(element) {
        return getOutputParameters(element, insideConnector);
      },
      onSelectionChange: function(element, node, event, scope) {
        inputEntry.deselect(element, node);
      },
      setOptionLabelValue: setOptionLabelValue(getOutputParameter)
    });
    entries.push(outputEntry);
  }
  return result;
};
ruoyi-bpmnjs/resources/properties-panel/provider/activiti/parts/implementation/InputOutputParameter.js
New file
@@ -0,0 +1,364 @@
'use strict';
var is = require('bpmn-js/lib/util/ModelUtil').is;
var elementHelper = require('../../../../helper/ElementHelper'),
    inputOutputHelper = require('../../../../helper/InputOutputHelper'),
    cmdHelper = require('../../../../helper/CmdHelper'),
    utils = require('../../../../Utils');
var entryFactory = require('../../../../factory/EntryFactory'),
    scriptImplementation = require('./Script');
function createElement(type, parent, factory, properties) {
  return elementHelper.createElement(type, properties, parent, factory);
}
function isScript(elem) {
  return is(elem, 'activiti:Script');
}
function isList(elem) {
  return is(elem, 'activiti:List');
}
function isMap(elem) {
  return is(elem, 'activiti:Map');
}
function ensureInputOutputSupported(element, insideConnector) {
  return inputOutputHelper.isInputOutputSupported(element, insideConnector);
}
module.exports = function(element, bpmnFactory, options, translate) {
  var typeInfo = {
    'activiti:Map': {
      value: 'map',
      label: translate('Map')
    },
    'activiti:List': {
      value: 'list',
      label: translate('List')
    },
    'activiti:Script': {
      value: 'script',
      label: translate('Script')
    }
  };
  options = options || {};
  var insideConnector = !!options.insideConnector,
      idPrefix = options.idPrefix || '';
  var getSelected = options.getSelectedParameter;
  if (!ensureInputOutputSupported(element, insideConnector)) {
    return [];
  }
  var entries = [];
  var isSelected = function(element, node) {
    return getSelected(element, node);
  };
  // parameter name ////////////////////////////////////////////////////////
  entries.push(entryFactory.validationAwareTextField({
    id: idPrefix + 'parameterName',
    label: translate('Name'),
    modelProperty: 'name',
    getProperty: function(element, node) {
      return (getSelected(element, node) || {}).name;
    },
    setProperty: function(element, values, node) {
      var param = getSelected(element, node);
      return cmdHelper.updateBusinessObject(element, param, values);
    },
    validate: function(element, values, node) {
      var bo = getSelected(element, node);
      var validation = {};
      if (bo) {
        var nameValue = values.name;
        if (nameValue) {
          if (utils.containsSpace(nameValue)) {
            validation.name = translate('Name must not contain spaces');
          }
        } else {
          validation.name = translate('Parameter must have a name');
        }
      }
      return validation;
    },
    hidden: function(element, node) {
      return !isSelected(element, node);
    }
  }));
  // parameter type //////////////////////////////////////////////////////
  var selectOptions = [
    { value: 'text', name: translate('Text') },
    { value: 'script', name: translate('Script') },
    { value: 'list', name: translate('List') },
    { value: 'map', name: translate('Map') }
  ];
  entries.push(entryFactory.selectBox({
    id : idPrefix + 'parameterType',
    label: translate('Type'),
    selectOptions: selectOptions,
    modelProperty: 'parameterType',
    get: function(element, node) {
      var bo = getSelected(element, node);
      var parameterType = 'text';
      if (typeof bo !== 'undefined') {
        var definition = bo.get('definition');
        if (typeof definition !== 'undefined') {
          var type = definition.$type;
          parameterType = typeInfo[type].value;
        }
      }
      return {
        parameterType: parameterType
      };
    },
    set: function(element, values, node) {
      var bo = getSelected(element, node);
      var properties = {
        value: undefined,
        definition: undefined
      };
      var createParameterTypeElem = function(type) {
        return createElement(type, bo, bpmnFactory);
      };
      var parameterType = values.parameterType;
      if (parameterType === 'script') {
        properties.definition = createParameterTypeElem('activiti:Script');
      }
      else if (parameterType === 'list') {
        properties.definition = createParameterTypeElem('activiti:List');
      }
      else if (parameterType === 'map') {
        properties.definition = createParameterTypeElem('activiti:Map');
      }
      return cmdHelper.updateBusinessObject(element, bo, properties);
    },
    show: function(element, node) {
      return isSelected(element, node);
    }
  }));
  // parameter value (type = text) ///////////////////////////////////////////////////////
  entries.push(entryFactory.textBox({
    id : idPrefix + 'parameterType-text',
    label : translate('Value'),
    modelProperty: 'value',
    get: function(element, node) {
      return {
        value: (getSelected(element, node) || {}).value
      };
    },
    set: function(element, values, node) {
      var param = getSelected(element, node);
      values.value = values.value || undefined;
      return cmdHelper.updateBusinessObject(element, param, values);
    },
    show: function(element, node) {
      var bo = getSelected(element, node);
      return bo && !bo.definition;
    }
  }));
  // parameter value (type = script) ///////////////////////////////////////////////////////
  var script = scriptImplementation('scriptFormat', 'value', true, translate);
  entries.push({
    id: idPrefix + 'parameterType-script',
    html: '<div data-show="isScript">' +
            script.template +
          '</div>',
    get: function(element, node) {
      var bo = getSelected(element, node);
      return bo && isScript(bo.definition) ? script.get(element, bo.definition) : {};
    },
    set: function(element, values, node) {
      var bo = getSelected(element, node);
      var update = script.set(element, values);
      return cmdHelper.updateBusinessObject(element, bo.definition, update);
    },
    validate: function(element, values, node) {
      var bo = getSelected(element, node);
      return bo && isScript(bo.definition) ? script.validate(element, bo.definition) : {};
    },
    isScript: function(element, node) {
      var bo = getSelected(element, node);
      return bo && isScript(bo.definition);
    },
    script: script
  });
  // parameter value (type = list) ///////////////////////////////////////////////////////
  entries.push(entryFactory.table({
    id: idPrefix + 'parameterType-list',
    modelProperties: [ 'value' ],
    labels: [ translate('Value') ],
    addLabel: translate('Add Value'),
    getElements: function(element, node) {
      var bo = getSelected(element, node);
      if (bo && isList(bo.definition)) {
        return bo.definition.items;
      }
      return [];
    },
    updateElement: function(element, values, node, idx) {
      var bo = getSelected(element, node);
      var item = bo.definition.items[idx];
      return cmdHelper.updateBusinessObject(element, item, values);
    },
    addElement: function(element, node) {
      var bo = getSelected(element, node);
      var newValue = createElement('activiti:Value', bo.definition, bpmnFactory, { value: undefined });
      return cmdHelper.addElementsTolist(element, bo.definition, 'items', [ newValue ]);
    },
    removeElement: function(element, node, idx) {
      var bo = getSelected(element, node);
      return cmdHelper.removeElementsFromList(element, bo.definition, 'items', null, [ bo.definition.items[idx] ]);
    },
    editable: function(element, node, prop, idx) {
      var bo = getSelected(element, node);
      var item = bo.definition.items[idx];
      return !isMap(item) && !isList(item) && !isScript(item);
    },
    setControlValue: function(element, node, input, prop, value, idx) {
      var bo = getSelected(element, node);
      var item = bo.definition.items[idx];
      if (!isMap(item) && !isList(item) && !isScript(item)) {
        input.value = value;
      } else {
        input.value = typeInfo[item.$type].label;
      }
    },
    show: function(element, node) {
      var bo = getSelected(element, node);
      return bo && bo.definition && isList(bo.definition);
    }
  }));
  // parameter value (type = map) ///////////////////////////////////////////////////////
  entries.push(entryFactory.table({
    id: idPrefix + 'parameterType-map',
    modelProperties: [ 'key', 'value' ],
    labels: [ translate('Key'), translate('Value') ],
    addLabel: translate('Add Entry'),
    getElements: function(element, node) {
      var bo = getSelected(element, node);
      if (bo && isMap(bo.definition)) {
        return bo.definition.entries;
      }
      return [];
    },
    updateElement: function(element, values, node, idx) {
      var bo = getSelected(element, node);
      var entry = bo.definition.entries[idx];
      if (isMap(entry.definition) || isList(entry.definition) || isScript(entry.definition)) {
        values = {
          key: values.key
        };
      }
      return cmdHelper.updateBusinessObject(element, entry, values);
    },
    addElement: function(element, node) {
      var bo = getSelected(element, node);
      var newEntry = createElement('activiti:Entry', bo.definition, bpmnFactory, { key: undefined, value: undefined });
      return cmdHelper.addElementsTolist(element, bo.definition, 'entries', [ newEntry ]);
    },
    removeElement: function(element, node, idx) {
      var bo = getSelected(element, node);
      return cmdHelper.removeElementsFromList(element, bo.definition, 'entries', null, [ bo.definition.entries[idx] ]);
    },
    editable: function(element, node, prop, idx) {
      var bo = getSelected(element, node);
      var entry = bo.definition.entries[idx];
      return prop === 'key' || (!isMap(entry.definition) && !isList(entry.definition) && !isScript(entry.definition));
    },
    setControlValue: function(element, node, input, prop, value, idx) {
      var bo = getSelected(element, node);
      var entry = bo.definition.entries[idx];
      if (prop === 'key' || (!isMap(entry.definition) && !isList(entry.definition) && !isScript(entry.definition))) {
        input.value = value;
      } else {
        input.value = typeInfo[entry.definition.$type].label;
      }
    },
    show: function(element, node) {
      var bo = getSelected(element, node);
      return bo && bo.definition && isMap(bo.definition);
    }
  }));
  return entries;
};
ruoyi-bpmnjs/resources/properties-panel/provider/activiti/parts/implementation/JobPriority.js
New file
@@ -0,0 +1,34 @@
'use strict';
var entryFactory = require('../../../../factory/EntryFactory');
var cmdHelper = require('../../../../helper/CmdHelper');
module.exports = function(element, bpmnFactory, options, translate) {
  var getBusinessObject = options.getBusinessObject;
  var jobPriorityEntry = entryFactory.textField({
    id: 'jobPriority',
    label: translate('Job Priority'),
    modelProperty: 'jobPriority',
    get: function(element, node) {
      var bo = getBusinessObject(element);
      return {
        jobPriority: bo.get('activiti:jobPriority')
      };
    },
    set: function(element, values) {
      var bo = getBusinessObject(element);
      return cmdHelper.updateBusinessObject(element, bo, {
        'activiti:jobPriority': values.jobPriority || undefined
      });
    }
  });
  return [ jobPriorityEntry ];
};
ruoyi-bpmnjs/resources/properties-panel/provider/activiti/parts/implementation/JobRetryTimeCycle.js
New file
@@ -0,0 +1,113 @@
'use strict';
var is = require('bpmn-js/lib/util/ModelUtil').is;
var entryFactory = require('../../../../factory/EntryFactory');
var asyncCapableHelper = require('../../../../helper/AsyncCapableHelper');
var elementHelper = require('../../../../helper/ElementHelper'),
    eventDefinitionHelper = require('../../../../helper/EventDefinitionHelper'),
    cmdHelper = require('../../../../helper/CmdHelper');
function isAsyncBefore(bo) {
  return asyncCapableHelper.isAsyncBefore(bo);
}
function isAsyncAfter(bo) {
  return asyncCapableHelper.isAsyncAfter(bo);
}
function getFailedJobRetryTimeCycle(bo) {
  return asyncCapableHelper.getFailedJobRetryTimeCycle(bo);
}
function removeFailedJobRetryTimeCycle(bo, element) {
  return asyncCapableHelper.removeFailedJobRetryTimeCycle(bo, element);
}
function createExtensionElements(parent, bpmnFactory) {
  return elementHelper.createElement('bpmn:ExtensionElements', { values: [] }, parent, bpmnFactory);
}
function createFailedJobRetryTimeCycle(parent, bpmnFactory, cycle) {
  return elementHelper.createElement('activiti:FailedJobRetryTimeCycle', { body: cycle }, parent, bpmnFactory);
}
module.exports = function(element, bpmnFactory, options, translate) {
  var getBusinessObject = options.getBusinessObject;
  var idPrefix = options.idPrefix || '',
      labelPrefix = options.labelPrefix || '';
  var retryTimeCycleEntry = entryFactory.textField({
    id: idPrefix + 'retryTimeCycle',
    label: labelPrefix + translate('Retry Time Cycle'),
    modelProperty: 'cycle',
    get: function(element, node) {
      var retryTimeCycle = getFailedJobRetryTimeCycle(getBusinessObject(element));
      var value = retryTimeCycle && retryTimeCycle.get('body');
      return {
        cycle: value
      };
    },
    set: function(element, values, node) {
      var newCycle = values.cycle;
      var bo = getBusinessObject(element);
      if (newCycle === '' || typeof newCycle === 'undefined') {
        // remove retry time cycle element(s)
        return removeFailedJobRetryTimeCycle(bo, element);
      }
      var retryTimeCycle = getFailedJobRetryTimeCycle(bo);
      if (!retryTimeCycle) {
        // add new retry time cycle element
        var commands = [];
        var extensionElements = bo.get('extensionElements');
        if (!extensionElements) {
          extensionElements = createExtensionElements(bo, bpmnFactory);
          commands.push(cmdHelper.updateBusinessObject(element, bo, { extensionElements: extensionElements }));
        }
        retryTimeCycle = createFailedJobRetryTimeCycle(extensionElements, bpmnFactory, newCycle);
        commands.push(cmdHelper.addAndRemoveElementsFromList(
          element,
          extensionElements,
          'values',
          'extensionElements',
          [ retryTimeCycle ],
          []
        ));
        return commands;
      }
      // update existing retry time cycle element
      return cmdHelper.updateBusinessObject(element, retryTimeCycle, { body: newCycle });
    },
    hidden: function(element) {
      var bo = getBusinessObject(element);
      if (bo && (isAsyncBefore(bo) || isAsyncAfter(bo))) {
        return false;
      }
      if (is(element, 'bpmn:Event')) {
        return !eventDefinitionHelper.getTimerEventDefinition(element);
      }
      return true;
    }
  });
  return [ retryTimeCycleEntry ];
};
ruoyi-bpmnjs/resources/properties-panel/provider/activiti/parts/implementation/Listener.js
New file
@@ -0,0 +1,156 @@
'use strict';
var is = require('bpmn-js/lib/util/ModelUtil').is,
    getBusinessObject = require('bpmn-js/lib/util/ModelUtil').getBusinessObject;
var extensionElementsEntry = require('./ExtensionElements'),
    extensionElementsHelper = require('../../../../helper/ExtensionElementsHelper'),
    cmdHelper = require('../../../../helper/CmdHelper'),
    elementHelper = require('../../../../helper/ElementHelper'),
    ImplementationTypeHelper = require('../../../../helper/ImplementationTypeHelper');
function getListeners(bo, type) {
  return bo && extensionElementsHelper.getExtensionElements(bo, type) || [];
}
var ACTIVITI_EXECUTION_LISTENER_ELEMENT = 'activiti:ExecutionListener';
var ACTIVITI_TASK_LISTENER_ELEMENT = 'activiti:TaskListener';
module.exports = function(element, bpmnFactory, options, translate) {
  var LISTENER_TYPE_LABEL = {
    class: translate('Java Class'),
    expression: translate('Expression'),
    delegateExpression: translate('Delegate Expression'),
    script: translate('Script')
  };
  var bo;
  var result = {
    getSelectedListener: getSelectedListener
  };
  var entries = result.entries = [];
  var isSequenceFlow = ImplementationTypeHelper.isSequenceFlow(element);
  function getSelectedListener(element, node) {
    var selection = (executionListenerEntry && executionListenerEntry.getSelected(element, node)) || { idx: -1 };
    var listener = getListeners(bo, ACTIVITI_EXECUTION_LISTENER_ELEMENT)[selection.idx];
    if (!listener && taskListenerEntry) {
      selection = taskListenerEntry.getSelected(element, node);
      listener = getListeners(bo, ACTIVITI_TASK_LISTENER_ELEMENT)[selection.idx];
    }
    return listener;
  }
  var setOptionLabelValue = function(type) {
    return function(element, node, option, property, value, idx) {
      var listeners = getListeners(bo, type);
      var listener = listeners[idx];
      var listenerType = ImplementationTypeHelper.getImplementationType(listener);
      var event = (listener.get('event')) ? listener.get('event') : '<empty>';
      var label = (event || '*') + ' : ' + (LISTENER_TYPE_LABEL[listenerType] || '');
      option.text = label;
    };
  };
  var newElement = function(element, type, initialEvent) {
    return function(element, extensionElements, value) {
      var props = {
        event: initialEvent,
        class: ''
      };
      var newElem = elementHelper.createElement(type, props, extensionElements, bpmnFactory);
      return cmdHelper.addElementsTolist(element, extensionElements, 'values', [ newElem ]);
    };
  };
  var removeElement = function(element, type) {
    return function(element, extensionElements, value, idx) {
      var listeners = getListeners(bo, type);
      var listener = listeners[idx];
      if (listener) {
        return extensionElementsHelper.removeEntry(bo, element, listener);
      }
    };
  };
  // Execution Listener
  if (is(element, 'bpmn:FlowElement') || is(element, 'bpmn:Process') || is(element, 'bpmn:Participant')) {
    bo = getBusinessObject(element);
    if (is(element, 'bpmn:Participant')) {
      element = element.processRef;
      bo = bo.get('processRef');
    }
    if (bo) {
      var executionListenerEntry = extensionElementsEntry(element, bpmnFactory, {
        id : 'executionListeners',
        label : translate('Execution Listener'),
        modelProperty: 'name',
        idGeneration: 'false',
        reference: 'processRef',
        createExtensionElement: newElement(element, ACTIVITI_EXECUTION_LISTENER_ELEMENT, (isSequenceFlow) ? 'take' : 'start'),
        removeExtensionElement: removeElement(element, ACTIVITI_EXECUTION_LISTENER_ELEMENT),
        getExtensionElements: function(element) {
          return getListeners(bo, ACTIVITI_EXECUTION_LISTENER_ELEMENT);
        },
        onSelectionChange: function(element, node, event, scope) {
          taskListenerEntry && taskListenerEntry.deselect(element, node);
        },
        setOptionLabelValue: setOptionLabelValue(ACTIVITI_EXECUTION_LISTENER_ELEMENT)
      });
      entries.push(executionListenerEntry);
    }
  }
  // Task Listener
  if (is(element, 'bpmn:UserTask')) {
    bo = getBusinessObject(element);
    var taskListenerEntry = extensionElementsEntry(element, bpmnFactory, {
      id : 'taskListeners',
      label : translate('Task Listener'),
      modelProperty: 'name',
      idGeneration: 'false',
      createExtensionElement: newElement(element, ACTIVITI_TASK_LISTENER_ELEMENT, 'create'),
      removeExtensionElement: removeElement(element, ACTIVITI_TASK_LISTENER_ELEMENT),
      getExtensionElements: function(element) {
        return getListeners(bo, ACTIVITI_TASK_LISTENER_ELEMENT);
      },
      onSelectionChange: function(element, node, event, scope) {
        executionListenerEntry.deselect(element, node);
      },
      setOptionLabelValue: setOptionLabelValue(ACTIVITI_TASK_LISTENER_ELEMENT)
    });
    entries.push(taskListenerEntry);
  }
  return result;
};
ruoyi-bpmnjs/resources/properties-panel/provider/activiti/parts/implementation/MultiInstanceLoopCharacteristics.js
New file
@@ -0,0 +1,290 @@
'use strict';
var getBusinessObject = require('bpmn-js/lib/util/ModelUtil').getBusinessObject,
    escapeHTML = require('../../../../Utils').escapeHTML;
var entryFactory = require('../../../../factory/EntryFactory');
var elementHelper = require('../../../../helper/ElementHelper'),
    cmdHelper = require('../../../../helper/CmdHelper');
var domClasses = require('min-dom').classes;
/**
 * Get a property value of the loop characteristics.
 *
 * @param {djs.model.Base} element
 * @param {string} propertyName
 *
 * @return {any} the property value
 */
function getProperty(element, propertyName) {
  var loopCharacteristics = getLoopCharacteristics(element);
  return loopCharacteristics && loopCharacteristics.get(propertyName);
}
/**
 * Get the body of a given expression.
 *
 * @param {ModdleElement<bpmn:FormalExpression>} expression
 *
 * @return {string} the body (value) of the expression
 */
function getBody(expression) {
  return expression && expression.get('body');
}
/**
 * Get the loop characteristics of an element.
 *
 * @param {djs.model.Base} element
 *
 * @return {ModdleElement<bpmn:MultiInstanceLoopCharacteristics>} the loop characteristics
 */
function getLoopCharacteristics(element) {
  var bo = getBusinessObject(element);
  return bo.loopCharacteristics;
}
/**
 * Get the loop cardinality of the loop characteristics.
 *
 * @param {djs.model.Base} element
 *
 * @return {ModdleElement<bpmn:FormalExpression>} an expression representing the loop cardinality
 */
function getLoopCardinality(element) {
  return getProperty(element, 'loopCardinality');
}
/**
 * Get the loop cardinality value of the loop characteristics.
 *
 * @param {djs.model.Base} element
 *
 * @return {string} the loop cardinality value
 */
function getLoopCardinalityValue(element) {
  var loopCardinality = getLoopCardinality(element);
  return getBody(loopCardinality);
}
/**
 * Get the completion condition of the loop characteristics.
 *
 * @param {djs.model.Base} element
 *
 * @return {ModdleElement<bpmn:FormalExpression>} an expression representing the completion condition
 */
function getCompletionCondition(element) {
  return getProperty(element, 'completionCondition');
}
/**
 * Get the completion condition value of the loop characteristics.
 *
 * @param {djs.model.Base} element
 *
 * @return {string} the completion condition value
 */
function getCompletionConditionValue(element) {
  var completionCondition = getCompletionCondition(element);
  return getBody(completionCondition);
}
/**
 * Get the 'activiti:collection' attribute value of the loop characteristics.
 *
 * @param {djs.model.Base} element
 *
 * @return {string} the 'activiti:collection' value
 */
function getCollection(element) {
  return getProperty(element, 'activiti:collection');
}
/**
 * Get the 'activiti:elementVariable' attribute value of the loop characteristics.
 *
 * @param {djs.model.Base} element
 *
 * @return {string} the 'activiti:elementVariable' value
 */
function getElementVariable(element) {
  return getProperty(element, 'activiti:elementVariable');
}
/**
 * Creates 'bpmn:FormalExpression' element.
 *
 * @param {ModdleElement} parent
 * @param {string} body
 * @param {BpmnFactory} bpmnFactory
 *
 * @result {ModdleElement<bpmn:FormalExpression>} a formal expression
 */
function createFormalExpression(parent, body, bpmnFactory) {
  return elementHelper.createElement('bpmn:FormalExpression', { body: body }, parent, bpmnFactory);
}
/**
 * Updates a specific formal expression of the loop characteristics.
 *
 * @param {djs.model.Base} element
 * @param {string} propertyName
 * @param {string} newValue
 * @param {BpmnFactory} bpmnFactory
 */
function updateFormalExpression(element, propertyName, newValue, bpmnFactory) {
  var loopCharacteristics = getLoopCharacteristics(element);
  var expressionProps = {};
  if (!newValue) {
    // remove formal expression
    expressionProps[propertyName] = undefined;
    return cmdHelper.updateBusinessObject(element, loopCharacteristics, expressionProps);
  }
  var existingExpression = loopCharacteristics.get(propertyName);
  if (!existingExpression) {
    // add formal expression
    expressionProps[propertyName] = createFormalExpression(loopCharacteristics, newValue, bpmnFactory);
    return cmdHelper.updateBusinessObject(element, loopCharacteristics, expressionProps);
  }
  // edit existing formal expression
  return cmdHelper.updateBusinessObject(element, existingExpression, {
    body: newValue
  });
}
module.exports = function(element, bpmnFactory, translate) {
  var entries = [];
  // error message /////////////////////////////////////////////////////////////////
  entries.push({
    id: 'multiInstance-errorMessage',
    html: '<div data-show="isValid">' +
             '<span class="bpp-icon-warning"></span> ' +
             escapeHTML(translate('Must provide either loop cardinality or collection')) +
          '</div>',
    isValid: function(element, node, notification, scope) {
      var loopCharacteristics = getLoopCharacteristics(element);
      var isValid = true;
      if (loopCharacteristics) {
        var loopCardinality = getLoopCardinalityValue(element);
        var collection = getCollection(element);
        isValid = !loopCardinality && !collection;
      }
      domClasses(node).toggle('bpp-hidden', !isValid);
      domClasses(notification).toggle('bpp-error-message', isValid);
      return isValid;
    }
  });
  // loop cardinality //////////////////////////////////////////////////////////////
  entries.push(entryFactory.textField({
    id: 'multiInstance-loopCardinality',
    label: translate('Loop Cardinality'),
    modelProperty: 'loopCardinality',
    get: function(element, node) {
      return {
        loopCardinality: getLoopCardinalityValue(element)
      };
    },
    set: function(element, values) {
      return updateFormalExpression(element, 'loopCardinality', values.loopCardinality, bpmnFactory);
    }
  }));
  // collection //////////////////////////////////////////////////////////////////
  entries.push(entryFactory.textField({
    id: 'multiInstance-collection',
    label: translate('Collection'),
    modelProperty: 'collection',
    get: function(element, node) {
      return {
        collection: getCollection(element)
      };
    },
    set: function(element, values) {
      var loopCharacteristics = getLoopCharacteristics(element);
      return cmdHelper.updateBusinessObject(element, loopCharacteristics, {
        'activiti:collection': values.collection || undefined
      });
    },
    validate: function(element, values, node) {
      var collection = getCollection(element);
      var elementVariable = getElementVariable(element);
      if (!collection && elementVariable) {
        return { collection : 'Must provide a value' };
      }
    }
  }));
  // element variable ////////////////////////////////////////////////////////////
  entries.push(entryFactory.textField({
    id: 'multiInstance-elementVariable',
    label: translate('Element Variable'),
    modelProperty: 'elementVariable',
    get: function(element, node) {
      return {
        elementVariable: getElementVariable(element)
      };
    },
    set: function(element, values) {
      var loopCharacteristics = getLoopCharacteristics(element);
      return cmdHelper.updateBusinessObject(element, loopCharacteristics, {
        'activiti:elementVariable': values.elementVariable || undefined
      });
    }
  }));
  // Completion Condition //////////////////////////////////////////////////////
  entries.push(entryFactory.textField({
    id: 'multiInstance-completionCondition',
    label: translate('Completion Condition'),
    modelProperty: 'completionCondition',
    get: function(element) {
      return {
        completionCondition: getCompletionConditionValue(element)
      };
    },
    set: function(element, values) {
      return updateFormalExpression(element, 'completionCondition', values.completionCondition, bpmnFactory);
    }
  }));
  return entries;
};
ruoyi-bpmnjs/resources/properties-panel/provider/activiti/parts/implementation/Properties.js
New file
@@ -0,0 +1,209 @@
'use strict';
var getBusinessObject = require('bpmn-js/lib/util/ModelUtil').getBusinessObject,
    is = require('bpmn-js/lib/util/ModelUtil').is;
var factory = require('../../../../factory/EntryFactory');
var elementHelper = require('../../../../helper/ElementHelper'),
    extensionElementsHelper = require('../../../../helper/ExtensionElementsHelper'),
    cmdHelper = require('../../../../helper/CmdHelper'),
    utils = require('../../../../Utils');
var assign = require('lodash/assign'),
    forEach = require('lodash/forEach'),
    find = require('lodash/find');
function generatePropertyId() {
  return utils.nextId('Property_');
}
/**
 * Get all activiti:property objects for a specific business object
 *
 * @param  {ModdleElement} parent
 *
 * @return {Array<ModdleElement>} a list of activiti:property objects
 */
function getPropertyValues(parent) {
  var properties = parent && getPropertiesElement(parent);
  if (properties && properties.values) {
    return properties.values;
  }
  return [];
}
/**
 * Get all activiti:Properties object for a specific business object
 *
 * @param  {ModdleElement} parent
 *
 * @return {ModdleElement} a activiti:Properties object
 */
function getPropertiesElement(element) {
  if (!isExtensionElements(element)) {
    return element.properties;
  } else {
    return getPropertiesElementInsideExtensionElements(element);
  }
}
/**
 * Get first activiti:Properties object for a specific bpmn:ExtensionElements
 * business object.
 *
 * @param {ModdleElement} extensionElements
 *
 * @return {ModdleElement} a activiti:Properties object
 */
function getPropertiesElementInsideExtensionElements(extensionElements) {
  return find(extensionElements.values, function(elem) {
    return is(elem, 'activiti:Properties');
  });
}
/**
 * Returns true, if the given business object is a bpmn:ExtensionElements.
 *
 * @param {ModdleElement} element
 *
 * @return {boolean} a boolean value
 */
function isExtensionElements(element) {
  return is(element, 'bpmn:ExtensionElements');
}
/**
 * Create a activiti:property entry using tableEntryFactory
 *
 * @param  {djs.model.Base} element
 * @param  {BpmnFactory} bpmnFactory
 * @param  {Object} options
 * @param  {string} options.id
 * @param  {Array<string>} options.modelProperties
 * @param  {Array<string>} options.labels
 * @param  {function} options.getParent Gets the parent business object
 * @param  {function} options.show Indicate when the entry will be shown, should return boolean
 */
module.exports = function(element, bpmnFactory, options, translate) {
  var getParent = options.getParent;
  var modelProperties = options.modelProperties,
      createParent = options.createParent;
  var bo = getBusinessObject(element);
  if (is(element, 'bpmn:Participant')) {
    bo = bo.get('processRef');
  }
  // build properties group only when the participant have a processRef
  if (!bo) {
    return;
  }
  assign(options, {
    addLabel: translate('Add Property'),
    getElements: function(element, node) {
      var parent = getParent(element, node, bo);
      return getPropertyValues(parent);
    },
    addElement: function(element, node) {
      var commands = [],
          parent = getParent(element, node, bo);
      if (!parent && typeof createParent === 'function') {
        var result = createParent(element, bo);
        parent = result.parent;
        commands.push(result.cmd);
      }
      var properties = getPropertiesElement(parent);
      if (!properties) {
        properties = elementHelper.createElement('activiti:Properties', {}, parent, bpmnFactory);
        if (!isExtensionElements(parent)) {
          commands.push(cmdHelper.updateBusinessObject(element, parent, { 'properties': properties }));
        } else {
          commands.push(cmdHelper.addAndRemoveElementsFromList(
            element,
            parent,
            'values',
            'extensionElements',
            [ properties ],
            []
          ));
        }
      }
      var propertyProps = {};
      forEach(modelProperties, function(prop) {
        propertyProps[prop] = undefined;
      });
      // create id if necessary
      if (modelProperties.indexOf('id') >= 0) {
        propertyProps.id = generatePropertyId();
      }
      var property = elementHelper.createElement('activiti:Property', propertyProps, properties, bpmnFactory);
      commands.push(cmdHelper.addElementsTolist(element, properties, 'values', [ property ]));
      return commands;
    },
    updateElement: function(element, value, node, idx) {
      var parent = getParent(element, node, bo),
          property = getPropertyValues(parent)[idx];
      forEach(modelProperties, function(prop) {
        value[prop] = value[prop] || undefined;
      });
      return cmdHelper.updateBusinessObject(element, property, value);
    },
    validate: function(element, value, node, idx) {
      // validate id if necessary
      if (modelProperties.indexOf('id') >= 0) {
        var parent = getParent(element, node, bo),
            properties = getPropertyValues(parent),
            property = properties[idx];
        if (property) {
          // check if id is valid
          var validationError = utils.isIdValid(property, value.id, translate);
          if (validationError) {
            return { id: validationError };
          }
        }
      }
    },
    removeElement: function(element, node, idx) {
      var commands = [],
          parent = getParent(element, node, bo),
          properties = getPropertiesElement(parent),
          propertyValues = getPropertyValues(parent),
          currentProperty = propertyValues[idx];
      commands.push(cmdHelper.removeElementsFromList(element, properties, 'values', null, [ currentProperty ]));
      if (propertyValues.length === 1) {
        // remove activiti:properties if the last existing property has been removed
        if (!isExtensionElements(parent)) {
          commands.push(cmdHelper.updateBusinessObject(element, parent, { properties: undefined }));
        } else {
          forEach(parent.values, function(value) {
            if (is(value, 'activiti:Properties')) {
              commands.push(extensionElementsHelper.removeEntry(bo, element, value));
            }
          });
        }
      }
      return commands;
    }
  });
  return factory.table(options);
};
ruoyi-bpmnjs/resources/properties-panel/provider/activiti/parts/implementation/ResultVariable.js
New file
@@ -0,0 +1,53 @@
'use strict';
var is = require('bpmn-js/lib/util/ModelUtil').is;
var assign = require('lodash/assign');
var entryFactory = require('../../../../factory/EntryFactory'),
    cmdHelper = require('../../../../helper/CmdHelper');
module.exports = function(element, bpmnFactory, options, translate) {
  var getBusinessObject = options.getBusinessObject,
      hideResultVariable = options.hideResultVariable,
      id = options.id || 'resultVariable';
  var resultVariableEntry = entryFactory.textField({
    id: id,
    label: translate('Result Variable'),
    modelProperty: 'resultVariable',
    get: function(element, node) {
      var bo = getBusinessObject(element);
      return { resultVariable: bo.get('activiti:resultVariable') };
    },
    set: function(element, values, node) {
      var bo = getBusinessObject(element);
      var resultVariable = values.resultVariable || undefined;
      var props = {
        'activiti:resultVariable': resultVariable
      };
      if (is(bo, 'activiti:DmnCapable') && !resultVariable) {
        props = assign({ 'activiti:mapDecisionResult': 'resultList' }, props);
      }
      return cmdHelper.updateBusinessObject(element, bo, props);
    },
    hidden: function(element, node) {
      if (typeof hideResultVariable === 'function') {
        return hideResultVariable.apply(resultVariableEntry, arguments);
      }
    }
  });
  return [ resultVariableEntry ];
};
ruoyi-bpmnjs/resources/properties-panel/provider/activiti/parts/implementation/Script.js
New file
@@ -0,0 +1,173 @@
'use strict';
var domQuery = require('min-dom').query,
    escapeHTML = require('../../../../Utils').escapeHTML,
    utils = require('../../../../Utils');
function getScriptType(node) {
  return utils.selectedType('select[name=scriptType]', node.parentElement);
}
module.exports = function(scriptLanguagePropName, scriptValuePropName, isFormatRequired, translate) {
  return {
    template:
    '<div class="bpp-row bpp-textfield">' +
      '<label for="cam-script-format">' + escapeHTML(translate('Script Format')) + '</label>' +
      '<div class="bpp-field-wrapper">' +
        '<input id="cam-script-format" type="text" name="scriptFormat" />' +
        '<button class="clear" data-action="script.clearScriptFormat" data-show="script.canClearScriptFormat">' +
          '<span>X</span>' +
        '</button>' +
      '</div>' +
    '</div>' +
    '<div class="bpp-row">' +
      '<label for="cam-script-type">' + escapeHTML(translate('Script Type')) + '</label>' +
      '<div class="bpp-field-wrapper">' +
        '<select id="cam-script-type" name="scriptType" data-value>' +
          '<option value="script" selected>' + escapeHTML(translate('Inline Script')) + '</option>' +
          '<option value="scriptResource">' + escapeHTML(translate('External Resource')) + '</option>' +
        '</select>' +
      '</div>' +
    '</div>' +
    '<div class="bpp-row bpp-textfield">' +
      '<label for="cam-script-resource-val" data-show="script.isScriptResource">' + escapeHTML(translate('Resource')) + '</label>' +
      '<div class="bpp-field-wrapper" data-show="script.isScriptResource">' +
        '<input id="cam-script-resource-val" type="text" name="scriptResourceValue" />' +
        '<button class="clear" data-action="script.clearScriptResource" data-show="script.canClearScriptResource">' +
          '<span>X</span>' +
        '</button>' +
      '</div>' +
    '</div>' +
    '<div class="bpp-row">' +
      '<label for="cam-script-val" data-show="script.isScript">' + escapeHTML(translate('Script')) + '</label>' +
      '<div class="bpp-field-wrapper" data-show="script.isScript">' +
        '<textarea id="cam-script-val" type="text" name="scriptValue"></textarea>' +
      '</div>'+
    '</div>',
    get: function(element, bo) {
      var values = {};
      // read values from xml:
      var boScriptResource = bo.get('activiti:resource'),
          boScript = bo.get(scriptValuePropName),
          boScriptFormat = bo.get(scriptLanguagePropName);
      if (typeof boScriptResource !== 'undefined') {
        values.scriptResourceValue = boScriptResource;
        values.scriptType = 'scriptResource';
      } else {
        values.scriptValue = boScript;
        values.scriptType = 'script';
      }
      values.scriptFormat = boScriptFormat;
      return values;
    },
    set: function(element, values, containerElement) {
      var scriptFormat = values.scriptFormat,
          scriptType = values.scriptType,
          scriptResourceValue = values.scriptResourceValue,
          scriptValue = values.scriptValue;
      // init update
      var update = {
        'activiti:resource': undefined
      };
      update[scriptValuePropName] = undefined;
      update[scriptLanguagePropName] = undefined;
      if (isFormatRequired) {
        // always set language
        update[scriptLanguagePropName] = scriptFormat || '';
      } else
      // set language only when scriptFormat has a value
      if (scriptFormat !== '') {
        update[scriptLanguagePropName] = scriptFormat;
      }
      // set either inline script or resource
      if ('scriptResource' === scriptType) {
        update['activiti:resource'] = scriptResourceValue || '';
      } else {
        update[scriptValuePropName] = scriptValue || '';
      }
      return update;
    },
    validate: function(element, values) {
      var validationResult = {};
      if (values.scriptType === 'script' && !values.scriptValue) {
        validationResult.scriptValue = translate('Must provide a value');
      }
      if (values.scriptType === 'scriptResource' && !values.scriptResourceValue) {
        validationResult.scriptResourceValue = translate('Must provide a value');
      }
      if (isFormatRequired && (!values.scriptFormat || values.scriptFormat.length === 0)) {
        validationResult.scriptFormat = translate('Must provide a value');
      }
      return validationResult;
    },
    clearScriptFormat: function(element, inputNode, btnNode, scopeNode) {
      domQuery('input[name=scriptFormat]', scopeNode).value='';
      return true;
    },
    canClearScriptFormat: function(element, inputNode, btnNode, scopeNode) {
      var input = domQuery('input[name=scriptFormat]', scopeNode);
      return input.value !== '';
    },
    clearScriptResource: function(element, inputNode, btnNode, scopeNode) {
      domQuery('input[name=scriptResourceValue]', scopeNode).value='';
      return true;
    },
    canClearScriptResource: function(element, inputNode, btnNode, scopeNode) {
      var input = domQuery('input[name=scriptResourceValue]', scopeNode);
      return input.value !== '';
    },
    clearScript: function(element, inputNode, btnNode, scopeNode) {
      domQuery('textarea[name=scriptValue]', scopeNode).value='';
      return true;
    },
    canClearScript: function(element, inputNode, btnNode, scopeNode) {
      var input = domQuery('textarea[name=scriptValue]', scopeNode);
      return input.value !== '';
    },
    isScriptResource: function(element, inputNode, btnNode, scopeNode) {
      var scriptType = getScriptType(scopeNode);
      return scriptType === 'scriptResource';
    },
    isScript: function(element, inputNode, btnNode, scopeNode) {
      var scriptType = getScriptType(scopeNode);
      return scriptType === 'script';
    }
  };
};
ruoyi-bpmnjs/resources/properties-panel/provider/activiti/parts/implementation/Tasklist.js
New file
@@ -0,0 +1,37 @@
'use strict';
var entryFactory = require('../../../../factory/EntryFactory');
var cmdHelper = require('../../../../helper/CmdHelper');
module.exports = function(element, bpmnFactory, options, translate) {
  var getBusinessObject = options.getBusinessObject;
  var isStartableInTasklistEntry = entryFactory.checkbox({
    id: 'isStartableInTasklist',
    label: translate('Startable'),
    modelProperty: 'isStartableInTasklist',
    get: function(element, node) {
      var bo = getBusinessObject(element);
      var isStartableInTasklist = bo.get('activiti:isStartableInTasklist');
      return {
        isStartableInTasklist: isStartableInTasklist ? isStartableInTasklist : ''
      };
    },
    set: function(element, values) {
      var bo = getBusinessObject(element);
      return cmdHelper.updateBusinessObject(element, bo, {
        'activiti:isStartableInTasklist': !!values.isStartableInTasklist
      });
    }
  });
  return [
    isStartableInTasklistEntry
  ];
};
ruoyi-bpmnjs/resources/properties-panel/provider/bpmn/BpmnPropertiesProvider.js
New file
@@ -0,0 +1,84 @@
'use strict';
var inherits = require('inherits');
var PropertiesActivator = require('../../PropertiesActivator');
var processProps = require('./parts/ProcessProps'),
    eventProps = require('./parts/EventProps'),
    linkProps = require('./parts/LinkProps'),
    documentationProps = require('./parts/DocumentationProps'),
    idProps = require('./parts/IdProps'),
    nameProps = require('./parts/NameProps'),
    executableProps = require('./parts/ExecutableProps');
function createGeneralTabGroups(
    element, canvas, bpmnFactory,
    elementRegistry, translate) {
  var generalGroup = {
    id: 'general',
    label: translate('General'),
    entries: []
  };
  idProps(generalGroup, element, translate);
  nameProps(generalGroup, element, bpmnFactory, canvas, translate);
  processProps(generalGroup, element, translate);
  executableProps(generalGroup, element, translate);
  var detailsGroup = {
    id: 'details',
    label: translate('Details'),
    entries: []
  };
  linkProps(detailsGroup, element, translate);
  eventProps(detailsGroup, element, bpmnFactory, elementRegistry, translate);
  var documentationGroup = {
    id: 'documentation',
    label: translate('Documentation'),
    entries: []
  };
  documentationProps(documentationGroup, element, bpmnFactory, translate);
  return [
    generalGroup,
    detailsGroup,
    documentationGroup
  ];
}
function BpmnPropertiesProvider(
    eventBus, canvas, bpmnFactory, elementRegistry, translate) {
  PropertiesActivator.call(this, eventBus);
  this.getTabs = function(element) {
    var generalTab = {
      id: 'general',
      label: translate('General'),
      groups: createGeneralTabGroups(
        element, canvas, bpmnFactory, elementRegistry, translate)
    };
    return [
      generalTab
    ];
  };
}
BpmnPropertiesProvider.$inject = [
  'eventBus',
  'canvas',
  'bpmnFactory',
  'elementRegistry',
  'translate'
];
inherits(BpmnPropertiesProvider, PropertiesActivator);
module.exports = BpmnPropertiesProvider;
ruoyi-bpmnjs/resources/properties-panel/provider/bpmn/index.js
New file
@@ -0,0 +1,4 @@
module.exports = {
  __init__: [ 'propertiesProvider' ],
  propertiesProvider: [ 'type', require('./BpmnPropertiesProvider') ]
};
ruoyi-bpmnjs/resources/properties-panel/provider/bpmn/parts/DocumentationProps.js
New file
@@ -0,0 +1,73 @@
'use strict';
var entryFactory = require('../../../factory/EntryFactory'),
    cmdHelper = require('../../../helper/CmdHelper');
var ModelUtil = require('bpmn-js/lib/util/ModelUtil'),
    is = ModelUtil.is,
    getBusinessObject = ModelUtil.getBusinessObject;
module.exports = function(group, element, bpmnFactory, translate) {
  var getValue = function(businessObject) {
    return function(element) {
      var documentations = businessObject && businessObject.get('documentation'),
          text = (documentations && documentations.length > 0) ? documentations[0].text : '';
      return { documentation: text };
    };
  };
  var setValue = function(businessObject) {
    return function(element, values) {
      var newObjectList = [];
      if (typeof values.documentation !== 'undefined' && values.documentation !== '') {
        newObjectList.push(bpmnFactory.create('bpmn:Documentation', {
          text: values.documentation
        }));
      }
      return cmdHelper.setList(element, businessObject, 'documentation', newObjectList);
    };
  };
  // Element Documentation
  var elementDocuEntry = entryFactory.textBox({
    id: 'documentation',
    label: translate('Element Documentation'),
    modelProperty: 'documentation'
  });
  elementDocuEntry.set = setValue(getBusinessObject(element));
  elementDocuEntry.get = getValue(getBusinessObject(element));
  group.entries.push(elementDocuEntry);
  var processRef;
  // Process Documentation when having a Collaboration Diagram
  if (is(element, 'bpmn:Participant')) {
    processRef = getBusinessObject(element).processRef;
    // do not show for collapsed Pools/Participants
    if (processRef) {
      var processDocuEntry = entryFactory.textBox({
        id: 'process-documentation',
        label: translate('Process Documentation'),
        modelProperty: 'documentation'
      });
      processDocuEntry.set = setValue(processRef);
      processDocuEntry.get = getValue(processRef);
      group.entries.push(processDocuEntry);
    }
  }
};
ruoyi-bpmnjs/resources/properties-panel/provider/bpmn/parts/EventProps.js
New file
@@ -0,0 +1,150 @@
'use strict';
var is = require('bpmn-js/lib/util/ModelUtil').is,
    isAny = require('bpmn-js/lib/features/modeling/util/ModelingUtil').isAny,
    getBusinessObject = require('bpmn-js/lib/util/ModelUtil').getBusinessObject,
    eventDefinitionHelper = require('../../../helper/EventDefinitionHelper');
var forEach = require('lodash/forEach');
var message = require('./implementation/MessageEventDefinition'),
    signal = require('./implementation/SignalEventDefinition'),
    error = require('./implementation/ErrorEventDefinition'),
    escalation = require('./implementation/EscalationEventDefinition'),
    timer = require('./implementation/TimerEventDefinition'),
    compensation = require('./implementation/CompensateEventDefinition'),
    condition = require('./implementation/ConditionalEventDefinition');
module.exports = function(group, element, bpmnFactory, elementRegistry, translate) {
  var events = [
    'bpmn:StartEvent',
    'bpmn:EndEvent',
    'bpmn:IntermediateThrowEvent',
    'bpmn:BoundaryEvent',
    'bpmn:IntermediateCatchEvent'
  ];
  // Message and Signal Event Definition
  forEach(events, function(event) {
    if (is(element, event)) {
      var messageEventDefinition = eventDefinitionHelper.getMessageEventDefinition(element),
          signalEventDefinition = eventDefinitionHelper.getSignalEventDefinition(element);
      if (messageEventDefinition) {
        message(group, element, bpmnFactory, messageEventDefinition, translate);
      }
      if (signalEventDefinition) {
        signal(group, element, bpmnFactory, signalEventDefinition, translate);
      }
    }
  });
  // Special Case: Receive Task
  if (is(element, 'bpmn:ReceiveTask')) {
    message(group, element, bpmnFactory, getBusinessObject(element), translate);
  }
  // Error Event Definition
  var errorEvents = [
    'bpmn:StartEvent',
    'bpmn:BoundaryEvent',
    'bpmn:EndEvent'
  ];
  forEach(errorEvents, function(event) {
    if (is(element, event)) {
      var errorEventDefinition = eventDefinitionHelper.getErrorEventDefinition(element);
      if (errorEventDefinition) {
        error(group, element, bpmnFactory, errorEventDefinition, translate);
      }
    }
  });
  // Escalation Event Definition
  var escalationEvents = [
    'bpmn:StartEvent',
    'bpmn:BoundaryEvent',
    'bpmn:IntermediateThrowEvent',
    'bpmn:EndEvent'
  ];
  forEach(escalationEvents, function(event) {
    if (is(element, event)) {
      var showEscalationCodeVariable = is(element, 'bpmn:StartEvent') || is(element, 'bpmn:BoundaryEvent');
      // get business object
      var escalationEventDefinition = eventDefinitionHelper.getEscalationEventDefinition(element);
      if (escalationEventDefinition) {
        escalation(group, element, bpmnFactory, escalationEventDefinition, showEscalationCodeVariable,
          translate);
      }
    }
  });
  // Timer Event Definition
  var timerEvents = [
    'bpmn:StartEvent',
    'bpmn:BoundaryEvent',
    'bpmn:IntermediateCatchEvent'
  ];
  forEach(timerEvents, function(event) {
    if (is(element, event)) {
      // get business object
      var timerEventDefinition = eventDefinitionHelper.getTimerEventDefinition(element);
      if (timerEventDefinition) {
        timer(group, element, bpmnFactory, timerEventDefinition, translate);
      }
    }
  });
  // Compensate Event Definition
  var compensationEvents = [
    'bpmn:EndEvent',
    'bpmn:IntermediateThrowEvent'
  ];
  forEach(compensationEvents, function(event) {
    if (is(element, event)) {
      // get business object
      var compensateEventDefinition = eventDefinitionHelper.getCompensateEventDefinition(element);
      if (compensateEventDefinition) {
        compensation(group, element, bpmnFactory, compensateEventDefinition, elementRegistry, translate);
      }
    }
  });
  // Conditional Event Definition
  var conditionalEvents = [
    'bpmn:StartEvent',
    'bpmn:BoundaryEvent',
    'bpmn:IntermediateThrowEvent',
    'bpmn:IntermediateCatchEvent'
  ];
  if (isAny(element, conditionalEvents)) {
    // get business object
    var conditionalEventDefinition = eventDefinitionHelper.getConditionalEventDefinition(element);
    if (conditionalEventDefinition) {
      condition(group, element, bpmnFactory, conditionalEventDefinition, elementRegistry, translate);
    }
  }
};
ruoyi-bpmnjs/resources/properties-panel/provider/bpmn/parts/ExecutableProps.js
New file
@@ -0,0 +1,40 @@
'use strict';
var is = require('bpmn-js/lib/util/ModelUtil').is,
    getBusinessObject = require('bpmn-js/lib/util/ModelUtil').getBusinessObject;
var entryFactory = require('../../../factory/EntryFactory');
var participantHelper = require('../../../helper/ParticipantHelper');
module.exports = function(group, element, translate) {
  var bo = getBusinessObject(element);
  if (!bo) {
    return;
  }
  if (is(element, 'bpmn:Process') || (is(element, 'bpmn:Participant') && bo.get('processRef'))) {
    var executableEntry = entryFactory.checkbox({
      id: 'process-is-executable',
      label: translate('Executable'),
      modelProperty: 'isExecutable'
    });
    // in participants we have to change the default behavior of set and get
    if (is(element, 'bpmn:Participant')) {
      executableEntry.get = function(element) {
        return participantHelper.getProcessBusinessObject(element, 'isExecutable');
      };
      executableEntry.set = function(element, values) {
        return participantHelper.modifyProcessBusinessObject(element, 'isExecutable', values);
      };
    }
    group.entries.push(executableEntry);
  }
};
ruoyi-bpmnjs/resources/properties-panel/provider/bpmn/parts/IdProps.js
New file
@@ -0,0 +1,38 @@
'use strict';
var entryFactory = require('../../../factory/EntryFactory'),
    getBusinessObject = require('bpmn-js/lib/util/ModelUtil').getBusinessObject,
    utils = require('../../../Utils'),
    cmdHelper = require('../../../helper/CmdHelper');
module.exports = function(group, element, translate, options) {
  var description = options && options.description;
  // Id
  group.entries.push(entryFactory.validationAwareTextField({
    id: 'id',
    label: translate('Id'),
    description: description && translate(description),
    modelProperty: 'id',
    getProperty: function(element) {
      return getBusinessObject(element).id;
    },
    setProperty: function(element, properties) {
      element = element.labelTarget || element;
      return cmdHelper.updateProperties(element, properties);
    },
    validate: function(element, values) {
      var idValue = values.id;
      var bo = getBusinessObject(element);
      var idError = utils.isIdValid(bo, idValue, translate);
      return idError ? { id: idError } : {};
    }
  }));
};
ruoyi-bpmnjs/resources/properties-panel/provider/bpmn/parts/LinkProps.js
New file
@@ -0,0 +1,57 @@
'use strict';
var is = require('bpmn-js/lib/util/ModelUtil').is,
    getBusinessObject = require('bpmn-js/lib/util/ModelUtil').getBusinessObject,
    entryFactory = require('../../../factory/EntryFactory'),
    cmdHelper = require('../../../helper/CmdHelper');
var forEach = require('lodash/forEach');
function getLinkEventDefinition(element) {
  var bo = getBusinessObject(element);
  var linkEventDefinition = null;
  if (bo.eventDefinitions) {
    forEach(bo.eventDefinitions, function(eventDefinition) {
      if (is(eventDefinition, 'bpmn:LinkEventDefinition')) {
        linkEventDefinition = eventDefinition;
      }
    });
  }
  return linkEventDefinition;
}
module.exports = function(group, element, translate) {
  var linkEvents = [ 'bpmn:IntermediateThrowEvent', 'bpmn:IntermediateCatchEvent' ];
  forEach(linkEvents, function(event) {
    if (is(element, event)) {
      var linkEventDefinition = getLinkEventDefinition(element);
      if (linkEventDefinition) {
        var entry = entryFactory.textField({
          id: 'link-event',
          label: translate('Link Name'),
          modelProperty: 'link-name'
        });
        entry.get = function() {
          return { 'link-name': linkEventDefinition.get('name') };
        };
        entry.set = function(element, values) {
          var newProperties = {
            name: values['link-name']
          };
          return cmdHelper.updateBusinessObject(element, linkEventDefinition, newProperties);
        };
        group.entries.push(entry);
      }
    }
  });
};
ruoyi-bpmnjs/resources/properties-panel/provider/bpmn/parts/NameProps.js
New file
@@ -0,0 +1,63 @@
'use strict';
var nameEntryFactory = require('./implementation/Name'),
    createCategoryValue = require('../../../helper/CategoryHelper').createCategoryValue,
    is = require('bpmn-js/lib/util/ModelUtil').is,
    getBusinessObject = require('bpmn-js/lib/util/ModelUtil').getBusinessObject;
module.exports = function(group, element, bpmnFactory, canvas, translate) {
  function initializeCategory(semantic) {
    var rootElement = canvas.getRootElement(),
        definitions = getBusinessObject(rootElement).$parent,
        categoryValue = createCategoryValue(definitions, bpmnFactory);
    semantic.categoryValueRef = categoryValue;
  }
  function setGroupName(element, values) {
    var bo = getBusinessObject(element),
        categoryValueRef = bo.categoryValueRef;
    if (!categoryValueRef) {
      initializeCategory(bo);
    }
    // needs direct call to update categoryValue properly
    return {
      cmd: 'element.updateLabel',
      context: {
        element: element,
        newLabel: values.categoryValue
      }
    };
  }
  function getGroupName(element) {
    var bo = getBusinessObject(element),
        value = (bo.categoryValueRef || {}).value;
    return { categoryValue: value };
  }
  if (!is(element, 'bpmn:Collaboration')) {
    var options;
    if (is(element, 'bpmn:TextAnnotation')) {
      options = { modelProperty: 'text', label: translate('Text') };
    } else if (is(element, 'bpmn:Group')) {
      options = {
        modelProperty: 'categoryValue',
        label: translate('Category Value'),
        get: getGroupName,
        set: setGroupName
      };
    }
    // name
    group.entries = group.entries.concat(nameEntryFactory(element, options, translate));
  }
};
ruoyi-bpmnjs/resources/properties-panel/provider/bpmn/parts/ProcessProps.js
New file
@@ -0,0 +1,71 @@
'use strict';
var is = require('bpmn-js/lib/util/ModelUtil').is,
    entryFactory = require('../../../factory/EntryFactory'),
    participantHelper = require('../../../helper/ParticipantHelper'),
    getBusinessObject = require('bpmn-js/lib/util/ModelUtil').getBusinessObject,
    nameEntryFactory = require('./implementation/Name'),
    utils = require('../../../Utils');
module.exports = function(group, element, translate, options) {
  var businessObject = getBusinessObject(element);
  var processIdDescription = options && options.processIdDescription;
  if (is(element, 'bpmn:Process') || (is(element, 'bpmn:Participant') && businessObject.get('processRef'))) {
    /**
     * processId
     */
    if (is(element, 'bpmn:Participant')) {
      var idEntry = entryFactory.validationAwareTextField({
        id: 'process-id',
        label: translate('Process Id'),
        description: processIdDescription && translate(processIdDescription),
        modelProperty: 'processId'
      });
      // in participants we have to change the default behavior of set and get
      idEntry.get = function(element) {
        var properties = participantHelper.getProcessBusinessObject(element, 'id');
        return { processId: properties.id };
      };
      idEntry.set = function(element, values) {
        return participantHelper.modifyProcessBusinessObject(element, 'id', { id: values.processId });
      };
      idEntry.validate = function(element, values) {
        var idValue = values.processId;
        var bo = getBusinessObject(element);
        var processIdError = utils.isIdValid(bo.processRef, idValue, translate);
        return processIdError ? { processId: processIdError } : {};
      };
      group.entries.push(idEntry);
      /**
       * process name
       */
      var processNameEntry = nameEntryFactory(element, {
        id: 'process-name',
        label: translate('Process Name')
      })[0];
      // in participants we have to change the default behavior of set and get
      processNameEntry.get = function(element) {
        return participantHelper.getProcessBusinessObject(element, 'name');
      };
      processNameEntry.set = function(element, values) {
        return participantHelper.modifyProcessBusinessObject(element, 'name', values);
      };
      group.entries.push(processNameEntry);
    }
  }
};
ruoyi-bpmnjs/resources/properties-panel/provider/bpmn/parts/implementation/CompensateEventDefinition.js
New file
@@ -0,0 +1,130 @@
'use strict';
var entryFactory = require('../../../../factory/EntryFactory');
var cmdHelper = require('../../../../helper/CmdHelper'),
    eventDefinitionHelper = require('../../../../helper/EventDefinitionHelper'),
    utils = require('../../../../Utils');
var getBusinessObject = require('bpmn-js/lib/util/ModelUtil').getBusinessObject,
    is = require('bpmn-js/lib/util/ModelUtil').is;
var forEach = require('lodash/forEach'),
    find = require('lodash/find'),
    filter = require('lodash/filter');
function getContainedActivities(element) {
  return getFlowElements(element, 'bpmn:Activity');
}
function getContainedBoundaryEvents(element) {
  return getFlowElements(element, 'bpmn:BoundaryEvent');
}
function getFlowElements(element, type) {
  return utils.filterElementsByType(element.flowElements, type);
}
function isCompensationEventAttachedToActivity(activity, boundaryEvents) {
  var activityId = activity.id;
  var boundaryEvent = find(boundaryEvents, function(boundaryEvent) {
    var compensateEventDefinition = eventDefinitionHelper.getCompensateEventDefinition(boundaryEvent);
    var attachedToRef = boundaryEvent.attachedToRef;
    return compensateEventDefinition && attachedToRef && attachedToRef.id === activityId;
  });
  return !!boundaryEvent;
}
// subprocess: only when it is not triggeredByEvent
// activity: only when it attach a compensation boundary event
// callActivity: no limitation
function canActivityBeCompensated(activity, boundaryEvents) {
  return (is(activity, 'bpmn:SubProcess') && !activity.triggeredByEvent) ||
          is(activity, 'bpmn:CallActivity') ||
          isCompensationEventAttachedToActivity(activity, boundaryEvents);
}
function getActivitiesForCompensation(element) {
  var boundaryEvents = getContainedBoundaryEvents(element);
  return filter(getContainedActivities(element), function(activity) {
    return canActivityBeCompensated(activity, boundaryEvents);
  });
}
function getActivitiesForActivityRef(element) {
  var bo = getBusinessObject(element);
  var parent = bo.$parent;
  var activitiesForActivityRef = getActivitiesForCompensation(parent);
  // if throwing compensation event is in an event sub process:
  // get also all activities outside of the event sub process
  if (is(parent, 'bpmn:SubProcess') && parent.triggeredByEvent) {
    parent = parent.$parent;
    if (parent) {
      activitiesForActivityRef = activitiesForActivityRef.concat(getActivitiesForCompensation(parent));
    }
  }
  return activitiesForActivityRef;
}
function createActivityRefOptions(element) {
  var options = [ { value: '' } ];
  var activities = getActivitiesForActivityRef(element);
  forEach(activities, function(activity) {
    var activityId = activity.id;
    var name = (activity.name ? (activity.name + ' ') : '') + '(id=' + activityId + ')';
    options.push({ value: activityId, name: name });
  });
  return options;
}
module.exports = function(group, element, bpmnFactory, compensateEventDefinition, elementRegistry, translate) {
  group.entries.push(entryFactory.checkbox({
    id: 'wait-for-completion',
    label: translate('Wait for Completion'),
    modelProperty: 'waitForCompletion',
    get: function(element, node) {
      return {
        waitForCompletion: compensateEventDefinition.waitForCompletion
      };
    },
    set: function(element, values) {
      values.waitForCompletion = values.waitForCompletion || false;
      return cmdHelper.updateBusinessObject(element, compensateEventDefinition, values);
    }
  }));
  group.entries.push(entryFactory.selectBox({
    id: 'activity-ref',
    label: translate('Activity Ref'),
    selectOptions: createActivityRefOptions(element),
    modelProperty: 'activityRef',
    get: function(element, node) {
      var activityRef = compensateEventDefinition.activityRef;
      activityRef = activityRef && activityRef.id;
      return {
        activityRef: activityRef || ''
      };
    },
    set: function(element, values) {
      var activityRef = values.activityRef || undefined;
      activityRef = activityRef && getBusinessObject(elementRegistry.get(activityRef));
      return cmdHelper.updateBusinessObject(element, compensateEventDefinition, {
        activityRef: activityRef
      });
    }
  }));
};
ruoyi-bpmnjs/resources/properties-panel/provider/bpmn/parts/implementation/ConditionalEventDefinition.js
New file
@@ -0,0 +1,54 @@
'use strict';
var entryFactory = require('../../../../factory/EntryFactory'),
    cmdHelper = require('../../../../helper/CmdHelper');
var is = require('bpmn-js/lib/util/ModelUtil').is,
    isEventSubProcess = require('bpmn-js/lib/util/DiUtil').isEventSubProcess;
module.exports = function(group, element, bpmnFactory, conditionalEventDefinition, elementRegistry, translate) {
  var getValue = function(modelProperty) {
    return function(element) {
      var modelPropertyValue = conditionalEventDefinition.get('camunda:' + modelProperty);
      var value = {};
      value[modelProperty] = modelPropertyValue;
      return value;
    };
  };
  var setValue = function(modelProperty) {
    return function(element, values) {
      var props = {};
      props['camunda:' + modelProperty] = values[modelProperty] || undefined;
      return cmdHelper.updateBusinessObject(element, conditionalEventDefinition, props);
    };
  };
  group.entries.push(entryFactory.textField({
    id: 'variableName',
    label: translate('Variable Name'),
    modelProperty : 'variableName',
    get: getValue('variableName'),
    set: setValue('variableName')
  }));
  var isConditionalStartEvent =
    is(element, 'bpmn:StartEvent') && !isEventSubProcess(element.parent);
  if (!isConditionalStartEvent) {
    group.entries.push(entryFactory.textField({
      id: 'variableEvent',
      label: translate('Variable Event'),
      description: translate('Specify more than one variable change event as a comma separated list.'),
      modelProperty : 'variableEvent',
      get: getValue('variableEvent'),
      set: setValue('variableEvent')
    }));
  }
};
ruoyi-bpmnjs/resources/properties-panel/provider/bpmn/parts/implementation/ElementReferenceProperty.js
New file
@@ -0,0 +1,67 @@
'use strict';
var entryFactory = require('../../../../factory/EntryFactory');
var cmdHelper = require('../../../../helper/CmdHelper');
/**
 * Create an entry to modify a property of an element which
 * is referenced by a event definition.
 *
 * @param  {djs.model.Base} element
 * @param  {ModdleElement} definition
 * @param  {BpmnFactory} bpmnFactory
 * @param  {Object} options
 * @param  {string} options.id the id of the entry
 * @param  {string} options.label the label of the entry
 * @param  {string} options.referenceProperty the name of referencing property
 * @param  {string} options.modelProperty the name of property to modify
 * @param  {string} options.shouldValidate a flag indicate whether to validate or not
 *
 * @return {Array<Object>} return an array containing the entries
 */
module.exports = function(element, definition, bpmnFactory, options) {
  var id = options.id || 'element-property';
  var label = options.label;
  var referenceProperty = options.referenceProperty;
  var modelProperty = options.modelProperty || 'name';
  var shouldValidate = options.shouldValidate || false;
  var entry = entryFactory.textField({
    id: id,
    label: label,
    modelProperty: modelProperty,
    get: function(element, node) {
      var reference = definition.get(referenceProperty);
      var props = {};
      props[modelProperty] = reference && reference.get(modelProperty);
      return props;
    },
    set: function(element, values, node) {
      var reference = definition.get(referenceProperty);
      var props = {};
      props[modelProperty] = values[modelProperty] || undefined;
      return cmdHelper.updateBusinessObject(element, reference, props);
    },
    hidden: function(element, node) {
      return !definition.get(referenceProperty);
    }
  });
  if (shouldValidate) {
    entry.validate = function(element, values, node) {
      var reference = definition.get(referenceProperty);
      if (reference && !values[modelProperty]) {
        var validationErrors = {};
        validationErrors[modelProperty] = 'Must provide a value';
        return validationErrors;
      }
    };
  }
  return [ entry ];
};
ruoyi-bpmnjs/resources/properties-panel/provider/bpmn/parts/implementation/ErrorEventDefinition.js
New file
@@ -0,0 +1,35 @@
'use strict';
var eventDefinitionReference = require('./EventDefinitionReference'),
    elementReferenceProperty = require('./ElementReferenceProperty');
module.exports = function(group, element, bpmnFactory, errorEventDefinition, translate) {
  group.entries = group.entries.concat(eventDefinitionReference(element, errorEventDefinition, bpmnFactory, {
    label: translate('Error'),
    elementName: 'error',
    elementType: 'bpmn:Error',
    referenceProperty: 'errorRef',
    newElementIdPrefix: 'Error_'
  }));
  group.entries = group.entries.concat(elementReferenceProperty(element, errorEventDefinition, bpmnFactory, {
    id: 'error-element-name',
    label: translate('Error Name'),
    referenceProperty: 'errorRef',
    modelProperty: 'name',
    shouldValidate: true
  }));
  group.entries = group.entries.concat(elementReferenceProperty(element, errorEventDefinition, bpmnFactory, {
    id: 'error-element-code',
    label: translate('Error Code'),
    referenceProperty: 'errorRef',
    modelProperty: 'errorCode'
  }));
};
ruoyi-bpmnjs/resources/properties-panel/provider/bpmn/parts/implementation/EscalationEventDefinition.js
New file
@@ -0,0 +1,58 @@
'use strict';
var entryFactory = require('../../../../factory/EntryFactory'),
    cmdHelper = require('../../../../helper/CmdHelper');
var eventDefinitionReference = require('./EventDefinitionReference'),
    elementReferenceProperty = require('./ElementReferenceProperty');
module.exports = function(group, element, bpmnFactory, escalationEventDefinition, showEscalationCodeVariable, translate) {
  group.entries = group.entries.concat(eventDefinitionReference(element, escalationEventDefinition, bpmnFactory, {
    label: translate('Escalation'),
    elementName: 'escalation',
    elementType: 'bpmn:Escalation',
    referenceProperty: 'escalationRef',
    newElementIdPrefix: 'Escalation_'
  }));
  group.entries = group.entries.concat(elementReferenceProperty(element, escalationEventDefinition, bpmnFactory, {
    id: 'escalation-element-name',
    label: translate('Escalation Name'),
    referenceProperty: 'escalationRef',
    modelProperty: 'name',
    shouldValidate: true
  }));
  group.entries = group.entries.concat(elementReferenceProperty(element, escalationEventDefinition, bpmnFactory, {
    id: 'escalation-element-code',
    label: translate('Escalation Code'),
    referenceProperty: 'escalationRef',
    modelProperty: 'escalationCode'
  }));
  if (showEscalationCodeVariable) {
    group.entries.push(entryFactory.textField({
      id : 'escalationCodeVariable',
      label : translate('Escalation Code Variable'),
      modelProperty : 'escalationCodeVariable',
      get: function(element) {
        var codeVariable = escalationEventDefinition.get('camunda:escalationCodeVariable');
        return {
          escalationCodeVariable: codeVariable
        };
      },
      set: function(element, values) {
        return cmdHelper.updateBusinessObject(element, escalationEventDefinition, {
          'camunda:escalationCodeVariable': values.escalationCodeVariable || undefined
        });
      }
    }));
  }
};
ruoyi-bpmnjs/resources/properties-panel/provider/bpmn/parts/implementation/EventDefinitionReference.js
New file
@@ -0,0 +1,150 @@
'use strict';
var cmdHelper = require('../../../../helper/CmdHelper');
var domQuery = require('min-dom').query,
    domify = require('min-dom').domify,
    domAttr = require('min-dom').attr;
var forEach = require('lodash/forEach'),
    find = require('lodash/find');
var elementHelper = require('../../../../helper/ElementHelper');
var utils = require('../../../../Utils'),
    escapeHTML = utils.escapeHTML;
var selector = 'select[name=selectedElement]';
/**
 * Get select box containing all elements.
 *
 * @param {DOMElement} node
 *
 * @return {DOMElement} the select box
 */
function getSelectBox(node) {
  return domQuery(selector, node.parentElement);
}
/**
 * Find element by given id.
 *
 * @param {ModdleElement} eventDefinition
 *
 * @return {ModdleElement} an element
 */
function findElementById(eventDefinition, type, id) {
  var elements = utils.findRootElementsByType(eventDefinition, type);
  return find(elements, function(element) {
    return element.id === id;
  });
}
/**
 * Create an entry to modify the reference to an element from an
 * event definition.
 *
 * @param  {djs.model.Base} element
 * @param  {ModdleElement} definition
 * @param  {BpmnFactory} bpmnFactory
 * @param  {Object} options
 * @param  {string} options.label the label of the entry
 * @param  {string} options.description the description of the entry
 * @param  {string} options.elementName the name of the element
 * @param  {string} options.elementType the type of the element
 * @param  {string} options.referenceProperty the name of referencing property
 * @param  {string} options.newElementIdPrefix the prefix of a new created element
 *
 * @return {Array<Object>} return an array containing the entries
 */
module.exports = function(element, definition, bpmnFactory, options) {
  var elementName = options.elementName || '',
      elementType = options.elementType,
      referenceProperty = options.referenceProperty;
  var newElementIdPrefix = options.newElementIdPrefix || 'elem_';
  var label = options.label || '',
      description = options.description || '';
  var entries = [];
  entries.push({
    id: 'event-definitions-' + elementName,
    description: description,
    html: '<div class="bpp-row bpp-select">' +
             '<label for="camunda-' + escapeHTML(elementName) + '">' + escapeHTML(label) + '</label>' +
             '<div class="bpp-field-wrapper">' +
               '<select id="camunda-' + escapeHTML(elementName) + '" name="selectedElement" data-value>' +
               '</select>' +
               '<button class="add" id="addElement" data-action="addElement"><span>+</span></button>' +
             '</div>' +
          '</div>',
    get: function(element, entryNode) {
      utils.updateOptionsDropDown(selector, definition, elementType, entryNode);
      var reference = definition.get(referenceProperty);
      return {
        selectedElement: (reference && reference.id) || ''
      };
    },
    set: function(element, values) {
      var selection = values.selectedElement;
      var props = {};
      if (!selection || typeof selection === 'undefined') {
        // remove reference to element
        props[referenceProperty] = undefined;
        return cmdHelper.updateBusinessObject(element, definition, props);
      }
      var commands = [];
      var selectedElement = findElementById(definition, elementType, selection);
      if (!selectedElement) {
        var root = utils.getRoot(definition);
        // create a new element
        selectedElement = elementHelper.createElement(elementType, { name: selection }, root, bpmnFactory);
        commands.push(cmdHelper.addAndRemoveElementsFromList(element, root, 'rootElements', null, [ selectedElement ]));
      }
      // update reference to element
      props[referenceProperty] = selectedElement;
      commands.push(cmdHelper.updateBusinessObject(element, definition, props));
      return commands;
    },
    addElement: function(element, inputNode) {
      // note: this generated id will be used as name
      // of the element and not as id
      var id = utils.nextId(newElementIdPrefix);
      var optionTemplate = domify('<option value="' + escapeHTML(id) + '"> (id='+escapeHTML(id)+')' + '</option>');
      // add new option
      var selectBox = getSelectBox(inputNode);
      selectBox.insertBefore(optionTemplate, selectBox.firstChild);
      // select new element in the select box
      forEach(selectBox, function(option) {
        if (option.value === id) {
          domAttr(option, 'selected', 'selected');
        } else {
          domAttr(option, 'selected', null);
        }
      });
      return true;
    }
  });
  return entries;
};
ruoyi-bpmnjs/resources/properties-panel/provider/bpmn/parts/implementation/MessageEventDefinition.js
New file
@@ -0,0 +1,26 @@
'use strict';
var eventDefinitionReference = require('./EventDefinitionReference'),
    elementReferenceProperty = require('./ElementReferenceProperty');
module.exports = function(group, element, bpmnFactory, messageEventDefinition, translate) {
  group.entries = group.entries.concat(eventDefinitionReference(element, messageEventDefinition, bpmnFactory, {
    label: translate('Message'),
    elementName: 'message',
    elementType: 'bpmn:Message',
    referenceProperty: 'messageRef',
    newElementIdPrefix: 'Message_'
  }));
  group.entries = group.entries.concat(elementReferenceProperty(element, messageEventDefinition, bpmnFactory, {
    id: 'message-element-name',
    label: translate('Message Name'),
    referenceProperty: 'messageRef',
    modelProperty: 'name',
    shouldValidate: true
  }));
};
ruoyi-bpmnjs/resources/properties-panel/provider/bpmn/parts/implementation/Name.js
New file
@@ -0,0 +1,33 @@
'use strict';
var entryFactory = require('../../../../factory/EntryFactory');
/**
 * Create an entry to modify the name of an an element.
 *
 * @param  {djs.model.Base} element
 * @param  {Object} options
 * @param  {string} options.id the id of the entry
 * @param  {string} options.label the label of the entry
 *
 * @return {Array<Object>} return an array containing
 *                         the entry to modify the name
 */
module.exports = function(element, options, translate) {
  options = options || {};
  var id = options.id || 'name',
      label = options.label || translate('Name'),
      modelProperty = options.modelProperty || 'name';
  var nameEntry = entryFactory.textBox({
    id: id,
    label: label,
    modelProperty: modelProperty,
    get: options.get,
    set: options.set
  });
  return [ nameEntry ];
};
ruoyi-bpmnjs/resources/properties-panel/provider/bpmn/parts/implementation/SignalEventDefinition.js
New file
@@ -0,0 +1,26 @@
'use strict';
var eventDefinitionReference = require('./EventDefinitionReference'),
    elementReferenceProperty = require('./ElementReferenceProperty');
module.exports = function(group, element, bpmnFactory, signalEventDefinition, translate) {
  group.entries = group.entries.concat(eventDefinitionReference(element, signalEventDefinition, bpmnFactory, {
    label: translate('Signal'),
    elementName: 'signal',
    elementType: 'bpmn:Signal',
    referenceProperty: 'signalRef',
    newElementIdPrefix: 'Signal_'
  }));
  group.entries = group.entries.concat(elementReferenceProperty(element, signalEventDefinition, bpmnFactory, {
    id: 'signal-element-name',
    label: translate('Signal Name'),
    referenceProperty: 'signalRef',
    modelProperty: 'name',
    shouldValidate: true
  }));
};
ruoyi-bpmnjs/resources/properties-panel/provider/bpmn/parts/implementation/TimerEventDefinition.js
New file
@@ -0,0 +1,139 @@
'use strict';
var elementHelper = require('../../../../helper/ElementHelper'),
    cmdHelper = require('../../../../helper/CmdHelper');
var entryFactory = require('../../../../factory/EntryFactory');
/**
 * Get the timer definition type for a given timer event definition.
 *
 * @param {ModdleElement<bpmn:TimerEventDefinition>} timer
 *
 * @return {string|undefined} the timer definition type
 */
function getTimerDefinitionType(timer) {
  var timeDate = timer.get('timeDate');
  if (typeof timeDate !== 'undefined') {
    return 'timeDate';
  }
  var timeCycle = timer.get('timeCycle');
  if (typeof timeCycle !== 'undefined') {
    return 'timeCycle';
  }
  var timeDuration = timer.get('timeDuration');
  if (typeof timeDuration !== 'undefined') {
    return 'timeDuration';
  }
}
/**
 * Creates 'bpmn:FormalExpression' element.
 *
 * @param {ModdleElement} parent
 * @param {string} body
 * @param {BpmnFactory} bpmnFactory
 *
 * @return {ModdleElement<bpmn:FormalExpression>} a formal expression
 */
function createFormalExpression(parent, body, bpmnFactory) {
  body = body || undefined;
  return elementHelper.createElement('bpmn:FormalExpression', { body: body }, parent, bpmnFactory);
}
function TimerEventDefinition(group, element, bpmnFactory, timerEventDefinition, translate) {
  var selectOptions = [
    { value: 'timeDate', name: translate('Date') },
    { value: 'timeDuration', name: translate('Duration') },
    { value: 'timeCycle', name: translate('Cycle') }
  ];
  group.entries.push(entryFactory.selectBox({
    id: 'timer-event-definition-type',
    label: translate('Timer Definition Type'),
    selectOptions: selectOptions,
    emptyParameter: true,
    modelProperty: 'timerDefinitionType',
    get: function(element, node) {
      return {
        timerDefinitionType: getTimerDefinitionType(timerEventDefinition) || ''
      };
    },
    set: function(element, values) {
      var props = {
        timeDuration: undefined,
        timeDate: undefined,
        timeCycle: undefined
      };
      var newType = values.timerDefinitionType;
      if (values.timerDefinitionType) {
        var oldType = getTimerDefinitionType(timerEventDefinition);
        var value;
        if (oldType) {
          var definition = timerEventDefinition.get(oldType);
          value = definition.get('body');
        }
        props[newType] = createFormalExpression(timerEventDefinition, value, bpmnFactory);
      }
      return cmdHelper.updateBusinessObject(element, timerEventDefinition, props);
    }
  }));
  group.entries.push(entryFactory.textField({
    id: 'timer-event-definition',
    label: translate('Timer Definition'),
    modelProperty: 'timerDefinition',
    get: function(element, node) {
      var type = getTimerDefinitionType(timerEventDefinition);
      var definition = type && timerEventDefinition.get(type);
      var value = definition && definition.get('body');
      return {
        timerDefinition: value
      };
    },
    set: function(element, values) {
      var type = getTimerDefinitionType(timerEventDefinition);
      var definition = type && timerEventDefinition.get(type);
      if (definition) {
        return cmdHelper.updateBusinessObject(element, definition, {
          body: values.timerDefinition || undefined
        });
      }
    },
    validate: function(element) {
      var type = getTimerDefinitionType(timerEventDefinition);
      var definition = type && timerEventDefinition.get(type);
      if (definition) {
        var value = definition.get('body');
        if (!value) {
          return {
            timerDefinition: translate('Must provide a value')
          };
        }
      }
    },
    hidden: function(element) {
      return !getTimerDefinitionType(timerEventDefinition);
    }
  }));
}
module.exports = TimerEventDefinition;
ruoyi-bpmnjs/resources/tools.js
New file
@@ -0,0 +1,273 @@
/**
 * @description 全局功能封装
 * @author zr
 * @type {{registerFileDrop(*, *): void, saveBpmn(Object): void, handleDragOver(*): void, setColor(Object): void, downLoad(Object): void, upload(Object, Object, Object): void, handleFileSelect(*): void, setEncoded(Object, string, string): void, openFromUrl(Object, Object, Object, string): void, createDiagram(string, Object, Object): Promise<void>, getUrlParam: tools.getUrlParam}}
 */
import $ from 'jquery';
const proHost = window.location.protocol + "//" + window.location.host;
const href = window.location.href.split("bpmnjs")[0];
const key = href.split(window.location.host)[1];
const publicurl = proHost + key;
const tools = {
    registerFileDrop(container, callback) {
        container.get(0).addEventListener('dragover', tools.handleDragOver, false);
        container.get(0).addEventListener('drop', tools.handleFileSelect, false);
    },
    /**
     * 获取地址栏参数
     * @param {string} value
     */
    getUrlParam: function (url) {
        var object = {};
        if (url.indexOf("?") != -1) {
            var str = url.split("?")[1];
            var strs = str.split("&");
            for (var i = 0; i < strs.length; i++) {
                object[strs[i].split("=")[0]] = strs[i].split("=")[1]
            }
            return object
        }
        return object[url];
    },
    /**
     * 通过xml创建bpmn
     * @param {string} xml 创建bpms xml
     * @param {object} bpmnModeler bpmn对象
     * @param {object} container 容器对象
     */
    async createDiagram(xml, bpmnModeler, container) {
        try {
            await bpmnModeler.importXML(xml);
            container.removeClass('with-error').addClass('with-diagram');
        } catch (err) {
            container.removeClass('with-diagram').addClass('with-error');
            container.find('.error pre').text(err.message);
            console.error(err);
        }
    },
    /**
     * 通过Json设置颜色
     * @param {object} json json 字符串
     */
    setColor(json,bpmnModeler) {
        var modeling = bpmnModeler.get('modeling');
        var elementRegistry = bpmnModeler.get('elementRegistry')
        var elementToColor = elementRegistry.get(json.name);
        if(elementToColor){
            modeling.setColor([elementToColor], {
                stroke: json.stroke,
                fill: json.fill
            });
        }
    },
    /**
     * 保存bpmn对象
     * @param {object} bpmnModeler bpmn对象
     */
    saveBpmn(bpmnModeler) {
        bpmnModeler.saveXML({ format: true }, function (err, xml) {
            if (err) {
                return console.error('保存失败,请重试', err);
            }
            console.log(xml)
            var param={
                    "stringBPMN":xml
                }
            $.ajax({
                url: localStorage.getItem("VUE_APP_BASE_API")+'/processDefinition/addDeploymentByString',
                type: 'POST',
                dataType:"json",
                data: param,
                //headers:{'Content-Type':'application/json;charset=utf8'},
                success: function (result) {
                    if(result.code===200){
                        tools.syhide('alert')
                    }else{
                        alert(result.msg)
                    }
                },
                error: function (err) {
                    console.log(err)
                }
            });
        });
    },
    /**
     * 下载bpmn
     * @param {object} bpmnModeler bpmn对象
     */
    downLoad(bpmnModeler) {
        var downloadLink = $("#downloadBpmn")
        bpmnModeler.saveXML({ format: true }, function (err, xml) {
            if (err) {
                return console.error('could not save BPMN 2.0 diagram', err);
            }
            tools.setEncoded(downloadLink, 'diagram.bpmn', err ? null : xml);
        });
    },
    /**
     * 转码xml并下载
     * @param {object} link 按钮
     * @param {string} name 下载名称
     * @param {string} data base64XML
     */
    setEncoded(link, name, data) {
        var encodedData = encodeURIComponent(data);
        if (data) {
            link.addClass('active').attr({
                'href': 'data:application/bpmn20-xml;charset=UTF-8,' + encodedData,
                'download': name
            });
        } else {
            link.removeClass('active');
        }
    },
    /**
     * 上传bpmn
     * @param {object} bpmnModeler bpmn对象
     * @param {object} container 容器对象
     */
    upload(bpmnModeler, container) {
        var FileUpload = document.myForm.uploadFile.files[0];
        var fm = new FormData();
        fm.append('processFile', FileUpload);
        $.ajax({
            url: localStorage.getItem("VUE_APP_BASE_API")+'/processDefinition/upload',
            // url: 'http://localhost:8080/processDefinition/upload',
            type: 'POST',
            data: fm,
            async: false,
            contentType: false, //禁止设置请求类型
            processData: false, //禁止jquery对DAta数据的处理,默认会处理
            success: function (result) {
                var url = result.data.substr(0,4)=="http"?result.data:localStorage.getItem("VUE_APP_BASE_API")+ result.data
                tools.openFromUrl(bpmnModeler, container, url)
            },
            error: function (err) {
                console.log(err)
            }
        });
    },
    /**
     * 打开xml  Url 地址
     * @param {object} bpmnModeler bpmn对象
     * @param {object} container 容器对象
     * @param {string} url url地址
     */
    openFromUrl(bpmnModeler, container, url) {
        $.ajax(url, { dataType: 'text' }).done(async function (xml) {
            try {
                await bpmnModeler.importXML(xml);
                container.removeClass('with-error').addClass('with-diagram');
            } catch (err) {
                console.error(err);
            }
        });
    },
    /**
     * 打开弹出框
     * @param id
     */
    syopen(id) {
        var dom = $("#" + id);
        this.sycenter(dom);
        dom.addClass(name);
        dom.show();
        var that = this;
        $(".sy-mask").fadeIn(300)
        setTimeout(function() {
            dom.removeClass(name)
        }, 300);
    },
    /**
     * 隐藏弹出框
     * @param id
     */
    syhide(id) {
        if (typeof id == "undefined") {
            var dom = $(".sy-alert")
        } else {
            var dom = $("#" + id)
        }
        var name = dom.attr("sy-leave");
        dom.addClass(name);
        $(".sy-mask").fadeOut(300);
        setTimeout(function() {
            dom.hide();
            dom.removeClass(name);
        }, 300)
    },
    /**
     * 弹出框居中
     * @param dom
     */
    sycenter(dom) {
        var mgtop = parseFloat(dom.height() / 2);
        dom.css({
            "top": "50%",
            "margin-top": "-" + mgtop + "px"
        })
    },
    /**
     * 判断是否是数组
     * @param value
     * @returns {arg is Array<any>|boolean}
     */
    isArrayFn(value){
        if (typeof Array.isArray === "function") {
            return Array.isArray(value);
        }else{
            return Object.prototype.toString.call(value) === "[object Array]";
        }
    },
    /**
     * 根据数据设置颜色
     * @param data
     * @returns {Array}
     */
    getByColor(data){
        var ColorJson=[]
        for(var k in data['highLine']){
            var par={
                "name": data['highLine'][k],
                "stroke":"green",
                "fill":"green"
            }
            ColorJson.push(par)
        }
        for(var k in data['highPoint']){
            var par={
                "name": data['highPoint'][k],
                "stroke":"gray",
                "fill":"#eae9e9"
            }
            ColorJson.push(par)
        }
        for(var k in data['iDo']){
            var par={
                "name": data['iDo'][k],
                "stroke":"green",
                "fill":"#a3d68e"
            }
            ColorJson.push(par)
        }
        for(var k in data['waitingToDo']){
            var par={
                "name": data['waitingToDo'][k],
                "stroke":"green",
                "fill":"yellow"
            }
            ColorJson.push(par)
        }
        return ColorJson
    }
}
export default tools
ruoyi-bpmnjs/styles/app.less
New file
@@ -0,0 +1,135 @@
@import "bpmn-js-properties-panel/styles/properties";
* {
  box-sizing: border-box;
}
body,
html {
  font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
  font-size: 12px;
  height: 100%;
  max-height: 100%;
  padding: 0;
  margin: 0;
}
a:link {
  text-decoration: none;
}
.content {
  position: relative;
  width: 100%;
  height: 100%;
  > .message {
    width: 100%;
    height: 100%;
    text-align: center;
    display: table;
    font-size: 16px;
    color: #111;
    .note {
      vertical-align: middle;
      text-align: center;
      display: table-cell;
    }
    &.error {
      .details {
        max-width: 500px;
        font-size: 12px;
        margin: 20px auto;
        text-align: left;
        color: #BD2828;
      }
      pre {
        border: solid 1px #BD2828;
        background: #fefafa;
        padding: 10px;
        color: #BD2828;
      }
    }
  }
  &:not(.with-error) .error,
  &.with-error .intro,
  &.with-diagram .intro {
    display: none;
  }
  .canvas {
    position: absolute;
    top: 0;
    left: 0;
    right: 0;
    bottom: 0;
  }
  .canvas,
  .properties-panel-parent {
    display: none;
  }
  &.with-diagram {
    .canvas,
    .properties-panel-parent  {
      display: block;
    }
  }
}
.buttons {
  position: fixed;
  bottom: 20px;
  left: 20px;
  padding: 0;
  margin: 0;
  list-style: none;
  > li {
    display: inline-block;
    margin-right: 10px;
    > a {
      background: #DDD;
      border: solid 1px #666;
      display: inline-block;
      padding: 5px;
    }
  }
  a {
    opacity: 0.3;
  }
  a.active {
    opacity: 1.0;
  }
}
.properties-panel-parent {
  position: absolute;
  top: 0;
  bottom: 0;
  right: 0;
  width: 260px;
  z-index: 10;
  border-left: 1px solid #ccc;
  overflow: auto;
  &:empty {
    display: none;
  }
  > .djs-properties-panel {
    padding-bottom: 70px;
    min-height:100%;
  }
}
src/api/activiti/definition.js
New file
@@ -0,0 +1,38 @@
import request from '@/utils/request'
// 查询modeler列表
export function listDefinition(query) {
  return request({
    url: '/wf/definition/list',
    method: 'get',
    params: query
  })
}
// 查询请假详细
export function getDefinitionsByInstanceId(instanceId) {
  return request({
    url: '/wf/definition/info/' + instanceId,
    method: 'get'
  })
}
// 挂起激活转换
export function suspendOrActiveApply(data) {
  return request({
    url: '/wf/definition/suspendOrActiveApply',
    method: 'post',
    data:data
  })
}
// 删除Modeler
export function delDefinition(id) {
  return request({
    url: '/wf/definition/remove/' + id,
    method: 'get'
  })
}
src/api/activiti/historyFormdata.js
New file
@@ -0,0 +1,8 @@
import request from '@/utils/request'
// 查询请假详细
export function historyFromData(instanceId) {
  return request({
    url: '/historyFromData/ByInstanceId/' + instanceId,
    method: 'get'
  })
}
src/api/activiti/task.js
New file
@@ -0,0 +1,31 @@
import request from '@/utils/request'
// 查询task列表
export function listTask(query) {
  return request({
    url: '/task/list',
    method: 'get',
    params: query
  })
}
// 查询表单
export function formDataShow(taskID) {
  return request({
    url: '/task/formDataShow/'+taskID,
    method: 'get',
  })
}
// 查询表单
export function formDataSave(taskID,data) {
  return request({
    url: '/task/formDataSave/'+taskID,
    method: 'post',
    data:data
  })
}
src/api/workflow/leave.js
New file
@@ -0,0 +1,62 @@
import request from '@/utils/request'
// 查询请假列表
export function listLeave(query) {
  return request({
    url: '/workflow/leave/list',
    method: 'get',
    params: query
  })
}
// 查询请假列表
export function listLeaveAll(query) {
  return request({
    url: '/workflow/leave/listAll',
    method: 'get',
    params: query
  })
}
// 查询请假详细
export function getLeave(id) {
  return request({
    url: '/workflow/leave/' + id,
    method: 'get'
  })
}
// 新增请假
export function addLeave(data) {
  return request({
    url: '/workflow/leave',
    method: 'post',
    data: data
  })
}
// 修改请假
export function updateLeave(data) {
  return request({
    url: '/workflow/leave',
    method: 'put',
    data: data
  })
}
// 删除请假
export function delLeave(id) {
  return request({
    url: '/workflow/leave/' + id,
    method: 'delete'
  })
}
// 导出请假
export function exportLeave(query) {
  return request({
    url: '/workflow/leave/export',
    method: 'get',
    params: query
  })
}
src/views/activiti/definition/index.vue
New file
@@ -0,0 +1,292 @@
<template>
  <div class="app-container">
    <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="88px">
      <el-form-item label="流程KEY" prop="key">
        <el-input
          v-model="queryParams.key"
          placeholder="请输入流程KEY"
          clearable
          size="small"
          @keyup.enter.native="handleQuery"
        />
      </el-form-item>
      <el-form-item label="名称" prop="name">
        <el-input
          v-model="queryParams.name"
          placeholder="请输入名称"
          clearable
          size="small"
          @keyup.enter.native="handleQuery"
        />
      </el-form-item>
      <el-form-item>
        <el-button type="cyan" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
      </el-form-item>
    </el-form>
    <el-row :gutter="10" class="mb8">
      <el-col :span="1.5">
        <el-button
          type="primary"
          icon="el-icon-plus"
          size="mini"
          @click="OnlineDrawingProcess"
          v-hasPermi="['activiti:modeler']"
        >在线绘制流程
        </el-button>
      </el-col>
      <el-col :span="1.5">
        <el-button
          type="primary"
          icon="el-icon-plus"
          size="mini"
          @click="handleImport"
          v-hasPermi="['activiti:modeler']"
        >部署流程
        </el-button>
      </el-col>
      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
    </el-row>
    <el-table v-loading="loading" :data="Modeler">
      <el-table-column label="流程ID" align="center" prop="id"/>
      <el-table-column label="流程KEY" align="center" prop="key"/>
      <el-table-column label="流程名称" align="center" prop="name"/>
      <el-table-column label="版本" align="center" prop="version"/>
      <el-table-column label="部署时间" align="center" prop="deploymentTime"/>
      <el-table-column label="部署ID" align="center" prop="deploymentId"/>
      <el-table-column label="状态" align="center" prop="suspendState">
        <template slot-scope="scope">
          <span>{{ scope.row.suspendState!=1?'挂起':'激活'}}</span>
        </template>
      </el-table-column>
      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
        <template slot-scope="scope">
          <el-button
            size="mini"
            type="text"
            icon="el-icon-edit"
            @click="OnlineModificationProcess(scope.row)"
            v-hasPermi="['activiti:modeler']"
          >查看
          </el-button>
          <el-button
            size="mini"
            type="text"
            icon="el-icon-edit"
            @click="suspendOrActiveApply(scope.row)"
            v-hasPermi="['activiti:modeler']"
          >{{scope.row.suspendState==1?'挂起':'激活'}}
          </el-button>
          <el-button
            size="mini"
            type="text"
            icon="el-icon-delete"
            @click="handleDelete(scope.row)"
            v-hasPermi="['activiti:modeler']"
          >删除
          </el-button>
        </template>
      </el-table-column>
    </el-table>
    <pagination
      v-show="total>0"
      :total="total"
      :page.sync="queryParams.pageNum"
      :limit.sync="queryParams.pageSize"
      @pagination="getList"
    />
    <!--bpmnjs在线流程设计器-->
    <el-dialog
      :visible.sync="modelVisible"
      title="流程图"
      width="1680px"
      @close="modelCancel"
      append-to-body
    >
      <div style="position:relative;height: 100%;">
        <iframe
          id="iframe"
          :src="modelerUrl"
          frameborder="0"
          width="100%"
          height="720px"
          scrolling="auto"
        ></iframe>
      </div>
    </el-dialog>
    <!-- 用户导入对话框 -->
    <el-dialog :title="upload.title" :visible.sync="upload.open" width="400px" append-to-body>
      <el-upload ref="upload" :limit="1" accept=".bpmn, .bar, .zip" :headers="upload.headers" :action="upload.url"
                 :disabled="upload.isUploading" :on-progress="handleFileUploadProgress" :on-success="handleFileSuccess"
                 :auto-upload="false" drag>
        <i class="el-icon-upload"></i>
        <div class="el-upload__text">
          将文件拖到此处,或
          <em>点击上传</em>
        </div>
        <div class="el-upload__tip" style="color:red" slot="tip">提示:仅允许导入“bpmn”、“bar”或“zip”格式文件!</div>
      </el-upload>
      <div slot="footer" class="dialog-footer">
        <el-button type="primary" @click="submitFileForm">确 定</el-button>
        <el-button @click="upload.open = false">取 消</el-button>
      </div>
    </el-dialog>
  </div>
</template>
<script>
  import {listDefinition, delDefinition, suspendOrActiveApply} from "@/api/activiti/definition";
  import {getToken} from "@/utils/auth";
  export default {
    name: "ActIdGroup",
    data() {
      return {
        modelerUrl: "",
        modelVisible: false,
        // 遮罩层
        loading: true,
        // 非单个禁用
        single: true,
        // 非多个禁用
        multiple: true,
        // 显示搜索条件
        showSearch: true,
        // 总条数
        total: 0,
        // VIEW表格数据
        Modeler: [],
        // 弹出层标题
        title: "",
        // 是否显示弹出层
        open: false,
        src: "",
        // 查询参数
        queryParams: {
          pageNum: 1,
          pageSize: 10,
          id: null,
          rev: null,
          name: null,
          type: null
        },
        upload: {
          // 是否显示弹出层(用户导入)
          open: false,
          // 弹出层标题(用户导入)
          title: "",
          // 是否禁用上传
          isUploading: false,
          // 设置上传的请求头部
          headers: {Authorization: "Bearer " + getToken()},
          // 上传的地址
          url: globalConf.baseUrl + "/wf/definition/uploadStreamAndDeployment",
        },
      };
    },
    created() {
      this.getList();
    },
    methods: {
      /** 查询Definition列表 */
      getList() {
        this.loading = true;
        listDefinition(this.queryParams).then(response => {
          this.Modeler = response.data;
          this.total = response.total;
          this.loading = false;
        });
      },
      /** 搜索按钮操作 */
      handleQuery() {
        this.queryParams.pageNum = 1;
        this.getList();
      },
      /** 重置按钮操作 */
      resetQuery() {
        this.resetForm("queryForm");
        this.handleQuery();
      },
      suspendOrActiveApply(row) {
        var suspendOrActive = row.suspendState === '2' ? '激活' : '挂起';
        this.$confirm('确认要' + suspendOrActive + '流程定义吗?', "警告", {
          confirmButtonText: "确定",
          cancelButtonText: "取消",
          type: "warning"
        }).then(function () {
          var data = {"id": row.id, "suspendState": row.suspendState};
          return suspendOrActiveApply(data);
        }).then(() => {
          this.getList();
          this.msgSuccess("转换成功");
        }).catch(function () {
        });
      },
      handleImport() {
        this.upload.title = "上传模型图";
        this.upload.open = true;
      },
      OnlineDrawingProcess() {
        this.modelVisible = true;
        // localStorage.setItem("VUE_APP_BASE_API", process.env.VUE_APP_BASE_API)
        localStorage.setItem("VUE_APP_BASE_API", globalConf.baseUrl);
        localStorage.setItem("Authorization", getToken());
        this.modelerUrl = "/bpmnjs/index.html?type=addBpmn";
      },
      OnlineModificationProcess(data) {
        this.modelVisible = true;
        localStorage.setItem("VUE_APP_BASE_API", globalConf.baseUrl);
        localStorage.setItem("Authorization", getToken());
        this.modelerUrl = '/bpmnjs/index.html?type=lookBpmn&deploymentFileUUID=' + data.deploymentId + '&deploymentName=' + encodeURI(data.resourceName);
      },
      // 提交上传文件
      submitFileForm() {
        this.$refs.upload.submit();
      },
      // 文件上传中处理
      handleFileUploadProgress(event, file, fileList) {
        this.upload.isUploading = true;
      },
      // 文件上传成功处理
      handleFileSuccess(response, file, fileList) {
        this.upload.open = false;
        this.upload.isUploading = false;
        this.$refs.upload.clearFiles();
        this.$alert(response.msg, "导入结果", {dangerouslyUseHTMLString: true});
        this.getList();
      },
      /** 删除按钮操作 */
      handleDelete(row) {
        this.$confirm('是否确认删除编号为"' + row.key + '"的数据项?', "警告", {
          confirmButtonText: "确定",
          cancelButtonText: "取消",
          type: "warning"
        }).then(function () {
          return delDefinition(row.deploymentId);
        }).then(() => {
          this.getList();
          this.msgSuccess("删除成功");
        }).catch(function () {
        });
      },
      modelCancel() {
        this.getList();
      }
    }
  };
</script>
Diff truncated after the above file
src/views/activiti/task/index.vue src/views/system/user/index.vue src/views/workflow/leave/index.vue src/views/workflow/leave/leaveAll.vue src/views/workflow/leave/leaveHistoryForm.vue