9.3.4 release

This commit is contained in:
David Benson 2018-11-07 16:49:01 +00:00
parent 94642c30f9
commit 6fbf5bc048
87 changed files with 5045 additions and 3475 deletions

View file

@ -1,3 +1,12 @@
06-NOV-2018: 9.3.4
- Improves sanity check for Google Drive files
- Uses mxGraph 3.9.11 beta 4
02-NOV-2018: 9.3.2
- Adds sanity check for Google Drive files
26-OCT-2018: 9.3.1
- Adds current page index to JSON protocol

View file

@ -1 +1 @@
9.3.1
9.3.4

View file

@ -556,7 +556,7 @@ mxSwimlane.prototype.paintDivider=function(a,b,c,d,e,f,g){g||a.setShadow(!1);a.b
mxSwimlane.prototype.getImageBounds=function(a,b,c,d){return this.isHorizontal()?new mxRectangle(a+c-this.imageSize,b,this.imageSize,this.imageSize):new mxRectangle(a,b,this.imageSize,this.imageSize)};function mxGraphLayout(a){this.graph=a}mxGraphLayout.prototype.graph=null;mxGraphLayout.prototype.useBoundingBox=!0;mxGraphLayout.prototype.parent=null;mxGraphLayout.prototype.moveCell=function(a,b,c){};mxGraphLayout.prototype.execute=function(a){};mxGraphLayout.prototype.getGraph=function(){return this.graph};
mxGraphLayout.prototype.getConstraint=function(a,b,c,d){c=this.graph.view.getState(b);b=null!=c?c.style:this.graph.getCellStyle(b);return null!=b?b[a]:null};
mxGraphLayout.traverse=function(a,b,c,d,e){if(null!=c&&null!=a&&(b=null!=b?b:!0,e=e||new mxDictionary,!e.get(a)&&(e.put(a,!0),d=c(a,d),null==d||d))&&(d=this.graph.model.getEdgeCount(a),0<d))for(var f=0;f<d;f++){var g=this.graph.model.getEdgeAt(a,f),k=this.graph.model.getTerminal(g,!0)==a;if(!b||k)k=this.graph.view.getVisibleTerminal(g,!k),this.traverse(k,b,c,g,e)}};
mxGraphLayout.prototype.isAncestor=function(a,b,c){if(!c)return this.graph.model.getParent(cell)==a;if(b==a)return!1;for(;null!=b&&b!=a;)b=this.graph.model.getParent(b);return b==a};mxGraphLayout.prototype.isVertexMovable=function(a){return this.graph.isCellMovable(a)};mxGraphLayout.prototype.isVertexIgnored=function(a){return!this.graph.getModel().isVertex(a)||!this.graph.isCellVisible(a)};
mxGraphLayout.prototype.isAncestor=function(a,b,c){if(!c)return this.graph.model.getParent(b)==a;if(b==a)return!1;for(;null!=b&&b!=a;)b=this.graph.model.getParent(b);return b==a};mxGraphLayout.prototype.isVertexMovable=function(a){return this.graph.isCellMovable(a)};mxGraphLayout.prototype.isVertexIgnored=function(a){return!this.graph.getModel().isVertex(a)||!this.graph.isCellVisible(a)};
mxGraphLayout.prototype.isEdgeIgnored=function(a){var b=this.graph.getModel();return!b.isEdge(a)||!this.graph.isCellVisible(a)||null==b.getTerminal(a,!0)||null==b.getTerminal(a,!1)};mxGraphLayout.prototype.setEdgeStyleEnabled=function(a,b){this.graph.setCellStyles(mxConstants.STYLE_NOEDGESTYLE,b?"0":"1",[a])};mxGraphLayout.prototype.setOrthogonalEdge=function(a,b){this.graph.setCellStyles(mxConstants.STYLE_ORTHOGONAL,b?"1":"0",[a])};
mxGraphLayout.prototype.getParentOffset=function(a){var b=new mxPoint;if(null!=a&&a!=this.parent){var c=this.graph.getModel();if(c.isAncestor(this.parent,a))for(var d=c.getGeometry(a);a!=this.parent;)b.x+=d.x,b.y+=d.y,a=c.getParent(a),d=c.getGeometry(a)}return b};
mxGraphLayout.prototype.setEdgePoints=function(a,b){if(null!=a){var c=this.graph.model,d=c.getGeometry(a);null==d?(d=new mxGeometry,d.setRelative(!0)):d=d.clone();if(null!=this.parent&&null!=b)for(var e=c.getParent(a),e=this.getParentOffset(e),f=0;f<b.length;f++)b[f].x-=e.x,b[f].y-=e.y;d.points=b;c.setGeometry(a,d)}};

View file

@ -36,7 +36,7 @@ Running the conversion site without Hyper-V:
========================================
Running the conversion site with Hyper-V:
1- Run VsdConverterApp TCP sever
1- Run VsdConverterApp TCP sever (Also disable QuickEdit Mode: Property > Options > Edit Options > QuickEdit Mode)
2- Deploy VsdConverter to IIS (manually or using Web Deployment Tool).
In details (Ignore Hyper-V steps if it is running directly on the server):

View file

@ -811,7 +811,8 @@ public class GliffyDiagramConverter
cell.setVertex(true);
style.append("shape=image;imageAspect=0;");
Resource res = gliffyDiagram.embeddedResources.get(svg.embeddedResourceId);
SVGImporterUtils svgUtils = new SVGImporterUtils();
res.data = svgUtils.setViewBox(res.data);
style.append("image=data:image/svg+xml,").append(res.getBase64EncodedData()).append(";");
}
}

View file

@ -0,0 +1,131 @@
package com.mxgraph.io.gliffy.importer;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.lang.reflect.Method;
import java.nio.charset.StandardCharsets;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* Class is used to stripe large unused white areas on SVG files and return only important parts.
* For example, if you have centered square of 50x50 size on 200x200 canvas this class will remove
* unused portions of the canvas and return larger square from the center.
*
*/
public class SVGImporterUtils
{
private static final Pattern SVG_PATTERN = Pattern.compile("viewBox=\"(.*?)\"");
private final static Logger LOGGER = Logger.getLogger(SVGImporterUtils.class.getName());
public SVGImporterUtils()
{
}
/**
* This is main method that will return new viewBox value. Then we use this value to update existing SVG string in Gliffy object.
*
* @param svgString original SVG string from Gliffy Object.
* @return recalculated viewBox parameters as a String
*/
public String setViewBox(String svgString)
{
try
{
Matcher m = SVG_PATTERN.matcher(svgString);
while (m.find())
{
String oldViewBox = m.group();
String newViewBox = getNewViewBox(svgString);
if (newViewBox != null)
{
return svgString.replace(oldViewBox, newViewBox);
}
}
}
catch (Throwable exc)
{
//perfectly fine to blow-up, just ignore - original string will be returned if something goes wrong
LOGGER.log(Level.WARNING, "Cannot set viewBox for: " + svgString + " with error " + exc);
}
return svgString;
}
private String getNewViewBox(String svgString) throws Exception
{
String result = null;
Object svg = createSVGDocument(svgString);
buildDocument(svg);
result = getViewBoxString(svg);
return result;
}
private Object createSVGDocument(String svgString) throws Exception
{
InputStream stream = new ByteArrayInputStream(svgString.getBytes(StandardCharsets.UTF_8));
Class<?> myClass = Class.forName("org.apache.batik.dom.svg.SAXSVGDocumentFactory");
Method myMethod = myClass.getDeclaredMethod("createSVGDocument", String.class, InputStream.class);
String param = null;
Object newInstance = myClass.getConstructor(String.class).newInstance(param);
Object o = myMethod.invoke(newInstance, "http://www.w3.org/2000/svg", stream);
return o;
}
private void buildDocument(Object svg) throws Exception
{
Class<?> bridgeContextClass = Class.forName("org.apache.batik.bridge.BridgeContext");
Class<?> userAgentAdapterClass = Class.forName("org.apache.batik.bridge.UserAgentAdapter");
Class<?> userAgentClass = Class.forName("org.apache.batik.bridge.UserAgent");
Class<?> gvtBuilderClass = Class.forName("org.apache.batik.bridge.GVTBuilder");
Class<?> documentClass = Class.forName("org.w3c.dom.Document");
Method myBuildMethod = gvtBuilderClass.getDeclaredMethod("build", bridgeContextClass, documentClass);
Object newBuilderInstance = gvtBuilderClass.getConstructor().newInstance();
Object newUserAgentAdapterInstance = userAgentAdapterClass.getConstructor().newInstance();
Object newBridgeContextClass = bridgeContextClass.getConstructor(userAgentClass).newInstance(newUserAgentAdapterInstance);
myBuildMethod.invoke(newBuilderInstance, newBridgeContextClass, svg);
}
private String getViewBoxString(Object svg) throws Exception
{
Class<?> svgDocumentClass = Class.forName("org.apache.batik.dom.svg.SVGOMDocument");
Class<?> svgSVGElement = Class.forName("org.apache.batik.dom.svg.SVGOMSVGElement");
Class<?> svgRect = Class.forName("org.w3c.dom.svg.SVGRect");
Method getRootElement = svgDocumentClass.getDeclaredMethod("getRootElement");
Method getBBox = svgSVGElement.getDeclaredMethod("getBBox");
Method getX = svgRect.getDeclaredMethod("getX");
Method getY = svgRect.getDeclaredMethod("getY");
Method getHeight = svgRect.getDeclaredMethod("getHeight");
Method getWidth = svgRect.getDeclaredMethod("getWidth");
Object root = getRootElement.invoke(svg);
Object bbox = getBBox.invoke(root);
Object x = getX.invoke(bbox);
Object y = getY.invoke(bbox);
Object height = getHeight.invoke(bbox);
Object width = getWidth.invoke(bbox);
String result = String.format("viewBox=\"%s %s %s %s\"", getIntValue(x.toString()), getIntValue(y.toString()),
getIntValue(width.toString()), getIntValue(height.toString()));
return result;
}
private String getIntValue(String value)
{
int dot = value.indexOf(".");
if (dot > 0)
{
return value.substring(0, dot);
}
return value;
}
}

View file

@ -284,7 +284,10 @@ public class GliffyObject implements PostDeserializable
public String getText()
{
return graphic.getText().getHtml();
GliffyText text = graphic.getText();
//TODO These values are hurestics based on analyzing many files. 6 is a range from 2 to 6 so used the maximum
int widthDiff = "none".equals(text.overflow)? -3 : 6;
return "<div style='width: "+ (width + widthDiff) +"px;height: "+ height +"px;word-break: break-word;'>" + text.getHtml() + "</div>";
}
/**

View file

@ -1,7 +1,7 @@
CACHE MANIFEST
# THIS FILE WAS GENERATED. DO NOT MODIFY!
# 10/26/2018 05:46 PM
# 11/06/2018 04:33 PM
app.html
index.html?offline=1

View file

@ -410,7 +410,119 @@
/**
* Main
*/
App.main();
App.main(function (ui)
{
// **************************************************
// TESTING JSON TO XML CONVERTER FOR EOL OF GOOGLE RT
// **************************************************
// ui.JSON_CHECK = 'JSON-CHECK7';
// DriveFile.prototype.runCheck = function(json, fileNode, fileData)
// {
// try
// {
// this.debug('JSON Check', this.desc, json);
// if (this.ui.getCurrentFile() == this && !this.isModified())
// {
// // Gets comparable XML structures
// var convert = (json != null) ? this.getComparableFile(this.ui.drive.convertJsonToXml(json, true)) : null;
// var remote = (fileNode != null) ? this.getComparableFile(fileNode) : null;
// var local = this.getComparableFile(this.ui.getXmlFileData());
// // Uses the newer of the two
// var age = this.ui.drive.getRealtimeAge(this.desc, json);
// var relevant = (age < 0 && convert != null) ? convert : remote;
// if (local == null || relevant == null || !local.isEqualNode(relevant))
// {
// this.log('FAIL-REPORT');
// var summary = ((relevant == convert) ? 'Source: Convert' : 'Source: Remote') +
// '\nFile modified: ' + new Date(this.desc.modifiedDate).toUTCString();
// if (json != null)
// {
// var mod = (json.value != null && json.value.modifiedDate != null) ? json.value.modifiedDate.json : null;
// if (mod != null)
// {
// summary += '\nJson modified: ' + new Date(mod).toUTCString();
// }
// var bak = (json.value != null && json.value.backupDate != null) ? json.value.backupDate.json : null;
// if (bak != null)
// {
// summary += '\nJson backedup: ' + new Date(bak).toUTCString();
// }
// }
// if (local != null)
// {
// if (convert != null)
// {
// summary += '\nConvert-Equals-Local: ' + convert.isEqualNode(local);
// }
// if (remote != null)
// {
// summary += '\nRemote-Equals-Local: ' + remote.isEqualNode(local);
// }
// }
// this.report('Realtime Error Report ' + new Date() +
// '\n\nDescription: ' + JSON.stringify({version: this.ui.JSON_CHECK,
// realtimeAge: age, title: this.desc.title, editable: this.desc.editable,
// copyable: this.desc.copyable, labels: this.desc.labels, id: this.desc.id,
// userPermission: this.desc.userPermission, fileSize: this.desc.fileSize,
// fileExtension: this.desc.fileExtension, modifiedDate: this.desc.modifiedDate,
// mimeType: this.desc.mimeType}) +
// '\n\nSummary:\n' + summary +
// '\n\nLocal:\n' + this.getAnonymizedXml(local) +
// '\n\nRemote:\n' + this.getAnonymizedXml(remote) +
// ((remote == null) ? ('\n\nData:\n' + fileData) : '') +
// '\n\nConvert:\n' + this.getAnonymizedXml(convert) +
// '\n\nJSON:\n' + this.getAnonymizedJson(json));
// }
// else
// {
// this.log('OK-age.' + age + '.');
// }
// }
// }
// catch (e)
// {
// this.log('CATCH-RUNCHECK-' + e.stack, true);
// this.debug(e);
// }
// };
// ui.editor.addListener('fileLoaded', mxUtils.bind(this, function()
// {
// try
// {
// var file = ui.getCurrentFile();
// if (file != null && file.constructor == DriveFile && file.realtime != null)
// {
// // With a 30% probability
// if (urlParams['json-check'] != '0' && (urlParams['json-check'] == '1' ||
// (Math.random() > 0.3 && urlParams['dev'] != '1')))
// {
// file.checkConvert();
// }
// }
// }
// catch (e)
// {
// // ignore
// }
// }));
// ***********
// END OF TEST
// ***********
});
</script>
</body>
</html>

File diff suppressed because it is too large Load diff

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -186,6 +186,16 @@ App.TRELLO_JQUERY_URL = 'https://code.jquery.com/jquery-1.7.1.min.js';
*/
App.FOOTER_PLUGIN_URL = 'https://www.jgraph.com/drawio-footer.js';
/**
* Switch to disable Google realtime. If true this will convert existing realtime files.
*/
App.GOOGLE_REALTIME = urlParams['google-realtime'] != '0';
/**
* Switch to disable Google realtime. If true this will convert existing realtime files.
*/
App.GOOGLE_APIS = 'client,drive-share' + ((App.GOOGLE_REALTIME) ? ',drive-realtime' : '');
/**
* Defines plugin IDs for loading via p URL parameter. Update the table at
* https://desk.draw.io/solution/articles/16000042546
@ -400,6 +410,7 @@ App.getStoredMode = function()
*/
App.main = function(callback, createUi)
{
var sessionId = Editor.guid();
var lastErrorMessage = null;
// Changes top level error handling
@ -420,16 +431,19 @@ App.main = function(callback, createUi)
else if (message != null && message.indexOf('DocumentClosedError') < 0)
{
lastErrorMessage = message;
var img = new Image();
var severity = (message.indexOf('NetworkError') >= 0 || message.indexOf('SecurityError') >= 0 ||
message.indexOf('NS_ERROR_FAILURE') >= 0 || message.indexOf('out of memory') >= 0) ?
'CONFIG' : 'SEVERE';
var logDomain = window.DRAWIO_LOG_URL != null ? window.DRAWIO_LOG_URL : '';
img.src = logDomain + '/log?severity=' + severity + '&v=' + encodeURIComponent(EditorUi.VERSION) +
'&msg=clientError:' + encodeURIComponent(message) + ':url:' + encodeURIComponent(window.location.href) +
':lnum:' + encodeURIComponent(linenumber) +
((colno != null) ? ':colno:' + encodeURIComponent(colno) : '') +
((err != null && err.stack != null) ? '&stack=' + encodeURIComponent(err.stack) : '');
var img = new Image();
img.src = logDomain + '/log?severity=' + severity + '&v=' + encodeURIComponent(EditorUi.VERSION) +
'&msg=clientError:' + encodeURIComponent(message) +
':url:' + encodeURIComponent(window.location.href) +
':lnum:' + encodeURIComponent(linenumber) +
((colno != null) ? ':colno:' + encodeURIComponent(colno) : '') +
((err != null && err.stack != null) ? '&stack=' + encodeURIComponent(err.stack) : '') +
'&sid=' + sessionId;
}
}
catch (err)
@ -438,7 +452,7 @@ App.main = function(callback, createUi)
}
};
}
if (window.mxscript != null)
{
/**
@ -960,10 +974,10 @@ App.prototype.init = function()
if (window.DrawGapiClientCallback != null)
{
gapi.load(((urlParams['picker'] != '0') ? 'picker,': '') + 'auth:client,drive-realtime,drive-share', mxUtils.bind(this, function(resp)
gapi.load(((urlParams['picker'] != '0') ? 'picker,': '') + 'auth:' + App.GOOGLE_APIS, mxUtils.bind(this, function(resp)
{
// Starts the app without the Google Option if the API fails to load
if (gapi.drive != null && gapi.drive.realtime != null)
if (gapi.client != null)
{
gapi.client.load('drive', 'v2', mxUtils.bind(this, function()
{
@ -1751,7 +1765,7 @@ App.prototype.appIconClicked = function(evt)
if (mode == App.MODE_GOOGLE)
{
if (file.desc != null && file.desc.parents.length > 0)
if (file.desc != null && file.desc.parents != null && file.desc.parents.length > 0)
{
// Opens containing folder
this.openLink('https://drive.google.com/drive/folders/' + file.desc.parents[0].id);
@ -1901,13 +1915,13 @@ App.prototype.loadGapi = function(then)
{
if (typeof gapi !== 'undefined')
{
gapi.load(((urlParams['picker'] != '0') ? 'picker,': '') + 'auth:client,drive-realtime,drive-share', mxUtils.bind(this, function(resp)
gapi.load(((urlParams['picker'] != '0') ? 'picker,': '') + 'auth:' + App.GOOGLE_APIS, mxUtils.bind(this, function(resp)
{
// Starts the app without the Google Option if the API fails to load
if (gapi.drive == null || gapi.drive.realtime == null)
if (gapi.client == null)
{
this.mode = null;
this.drive = null;
this.mode = null;
then();
}
else
@ -1919,8 +1933,8 @@ App.prototype.loadGapi = function(then)
{
if (gapi.client.drive == null)
{
this.mode = null;
this.drive = null;
this.mode = null;
}
then();
@ -2001,6 +2015,26 @@ App.prototype.load = function()
}
};
/**
* Adds the listener for automatically saving the diagram for local changes.
*/
App.prototype.showRefreshDialog = function(title, message)
{
if (!this.showingRefreshDialog)
{
this.showingRefreshDialog = true;
this.showError(title || mxResources.get('error'),
message || mxResources.get('redirectToNewApp'),
mxResources.get('refresh'), mxUtils.bind(this, function()
{
this.spinner.spin(document.body, mxResources.get('connecting'));
this.editor.graph.setEnabled(false);
window.location.reload();
}));
}
};
/**
* Called in start after the spinner stops.
*/
@ -4104,6 +4138,11 @@ App.prototype.save = function(name, done)
var error = mxUtils.bind(this, function(resp)
{
if (this.getCurrentFile() == file && file.isModified())
{
file.addUnsavedStatus();
}
// Spinner is paused and resumed in handleError
this.handleError(resp, (resp != null) ? mxResources.get('errorSavingFile') : null);
});

View file

@ -26,6 +26,8 @@
{
var yShift = delta.y;
var xShift = delta.x;
var hasHorGuides = false;
var hasVerGuides = false;
if (this.states != null && bounds != null && delta != null)
{
@ -68,11 +70,13 @@
}
var eqCy = 0;
var dy = 0;
var fixedDy = 0;
var midDy = 0;
var eqCx = 0;
var dy = 0.0;
var fixedDy = 0.0;
var dx = 0.0;
var fixedDx = 0.0;
var dx = 0;
var fixedDx = 0;
var midDx = 0;
var shift = 5 * scale;
if (verticalCells.length > 1)
@ -84,29 +88,75 @@
return s1.y - s2.y;
});
var newStatePassed = false;
var firstMoving = newState == verticalCells[0];
var lastMoving = newState == verticalCells[verticalCells.length - 1];
//find the mid space and use it as dy and fixedDy
if (!firstMoving && !lastMoving)
{
for (var i = 1; i < verticalCells.length - 1; i++)
{
if (newState == verticalCells[i])
{
var s1 = verticalCells[i - 1];
var s3 = verticalCells[i + 1];
midDy = (s3.y - s1.y - s1.height - newState.height) / 2;
dy = midDy;
fixedDy = dy;
break;
}
}
}
for (var i = 0; i < verticalCells.length - 1; i++)
{
var s1 = verticalCells[i];
var s2 = verticalCells[i + 1];
var isMovingOne = newState == s1 || newState == s2;
var curDy = s2.y - s1.y - s1.height;
if (!isMovingOne)
{
fixedDy = curDy;
}
if (eqCy == 0)
newStatePassed |= newState == s1;
if (dy == 0 && eqCy == 0)
{
dy = curDy;
eqCy = 1;
}
else if (Math.abs(dy - curDy) <= (isMovingOne? tolerance : tolerance))
else if (Math.abs(dy - curDy) <= (isMovingOne || (i == 1 && newStatePassed)? tolerance : 0)) //non-moving cells must have exact same dy, must handle the case of having the first cell moving so we allow tolerance for second cell (until fixedDy is non-zero)
{
eqCy += 1;
}
}
else if (eqCy > 1 && newStatePassed) //stop and ignore the following cells
{
verticalCells = verticalCells.slice(0, i + 1);
break;
}
else if (verticalCells.length - i >= 3 && !newStatePassed) //reset and start counting again
{
eqCy = 0;
dy = midDy != 0? midDy : 0;
fixedDy = dy;
verticalCells.splice(0, i == 0? 1 : i);
i = -1;
}
else
{
break;
}
if (fixedDy == 0 && !isMovingOne)
{
fixedDy = curDy;
//Update dy such that following cells shows equal distance guides without tolerance
dy = fixedDy;
}
}
if (verticalCells.length == 3 && verticalCells[1] == newState)
{
fixedDy = 0;
}
}
if (horizontalCells.length > 1)
@ -118,36 +168,81 @@
return s1.x - s2.x;
});
var newStatePassed = false;
var firstMoving = newState == horizontalCells[0];
var lastMoving = newState == horizontalCells[horizontalCells.length - 1];
//find the mid space and use it as dx and fixedDx
if (!firstMoving && !lastMoving)
{
for (var i = 1; i < horizontalCells.length - 1; i++)
{
if (newState == horizontalCells[i])
{
var s1 = horizontalCells[i - 1];
var s3 = horizontalCells[i + 1];
midDx = (s3.x - s1.x - s1.width - newState.width) / 2;
dx = midDx;
fixedDx = dx;
break;
}
}
}
for (var i = 0; i < horizontalCells.length - 1; i++)
{
var s1 = horizontalCells[i];
var s2 = horizontalCells[i + 1];
var isMovingOne = newState == s1 || newState == s2;
var curDx = s2.x - s1.x - s1.width;
if (!isMovingOne)
{
fixedDx = curDx;
}
newStatePassed |= newState == s1;
if (eqCx == 0)
if (dx == 0 && eqCx == 0)
{
dx = curDx;
eqCx = 1;
}
else if (Math.abs(dx - curDx) <= (isMovingOne? tolerance : tolerance))
else if (Math.abs(dx - curDx) <= (isMovingOne || (i == 1 && newStatePassed)? tolerance : 0))
{
eqCx += 1;
}
}
else if (eqCx > 1 && newStatePassed) //stop and ignore the following cells
{
horizontalCells = horizontalCells.slice(0, i + 1);
break;
}
else if (horizontalCells.length - i >= 3 && !newStatePassed) //reset and start counting again
{
eqCx = 0;
dx = midDx != 0? midDx : 0;
fixedDx = dx;
horizontalCells.splice(0, i == 0? 1 : i);
i = -1;
}
else
{
break;
}
if (fixedDx == 0 && !isMovingOne)
{
fixedDx = curDx;
//Update dx such that following cells shows equal distance guides without tolerance
dx = fixedDx;
}
}
if (horizontalCells.length == 3 && horizontalCells[1] == newState)
{
fixedDx = 0;
}
}
var createEqGuide = function(p1, p2, curGuide, isVer)
{
var points = [];
var dx = 0.0;
var dy = 0.0;
var dx = 0
var dy = 0;
if (isVer)
{
@ -181,7 +276,26 @@
return guideEq;
}
};
var hideEqGuides = function(horizontal, vertical)
{
if (horizontal && guide.guidesArrHor != null)
{
for (var i = 0; i < guide.guidesArrHor.length; i++)
{
guide.guidesArrHor[i].node.style.visibility = "hidden";
}
}
if (vertical && guide.guidesArrVer != null)
{
for (var i = 0; i < guide.guidesArrVer.length; i++)
{
guide.guidesArrVer[i].node.style.visibility = "hidden";
}
}
};
if (eqCx > 1 && eqCx == horizontalCells.length - 1)
{
var guidesArr = [];
@ -239,16 +353,21 @@
guideEq.redraw();
guidesArr.push(guideEq);
}
//destroy old non-recycled guides
for (var i = hPoints.length / 2; curArr != null && i < curArr.length; i ++)
{
curArr[i].destroy();
}
guide.guidesArrHor = guidesArr;
xShift = newX - bounds.x;
hasHorGuides = true;
}
else if (guide.guidesArrHor != null)
else
{
for (var i = 0; i < guide.guidesArrHor.length; i++)
{
guide.guidesArrHor[i].node.style.visibility = "hidden";
}
hideEqGuides(true);
}
if (eqCy > 1 && eqCy == verticalCells.length - 1)
@ -299,7 +418,7 @@
vPoints.push(new mxPoint(firstX, s3.y - shift));
}
for (i = 0; i < vPoints.length; i += 2)
for (var i = 0; i < vPoints.length; i += 2)
{
var p1 = vPoints[i];
var p2 = vPoints[i+1];
@ -308,21 +427,44 @@
guideEq.redraw();
guidesArr.push(guideEq);
}
//destroy old non-recycled guides
for (var i = vPoints.length / 2; curArr != null && i < curArr.length; i ++)
{
curArr[i].destroy();
}
guide.guidesArrVer = guidesArr;
yShift = newY - bounds.y;
hasVerGuides = true;
}
else if (guide.guidesArrVer != null)
else
{
for (var i = 0; i < guide.guidesArrVer.length; i++)
{
guide.guidesArrVer[i].node.style.visibility = "hidden";
}
hideEqGuides(false, true);
}
}
return guideMove.call(this, bounds, new mxPoint(xShift, yShift), gridEnabled);
//TODO force other guides not to change the point!
if (hasHorGuides || hasVerGuides)
{
var eqPoint = new mxPoint(xShift, yShift);
guideMove.call(this, bounds, eqPoint, gridEnabled, clone);
//if other guides changed the calculated point, hide the guides
// if ((hasHorGuides && newPoint.x != xShift) || (hasVerGuides && newPoint.y != yShift))
// {
// hideEqGuides(true, true);
// }
// return newPoint;
//Discard other guides modifications and return our point! Not the best (correct?) solution
return eqPoint;
}
else
{
hideEqGuides(true, true);
return guideMove.apply(this, arguments);
}
};
var guideSetVisible = mxGuide.prototype.setVisible;

View file

@ -25,27 +25,28 @@ DrawioFile = function(ui, data)
mxUtils.extend(DrawioFile, mxEventSource);
/**
* Sets the delay for autosave in milliseconds. Default is 1500.
* Specifies the delay between the last change and the autosave.
*/
DrawioFile.prototype.autosaveDelay = 1500;
/**
* Sets the delay for autosave in milliseconds. Default is 30000.
* Specifies the maximum delay before an autosave is forced even if the graph
* is being changed.
*/
DrawioFile.prototype.maxAutosaveDelay = 30000;
/**
* Sets the delay for autosave in milliseconds. Default is 2000.
* Contains the thread for the next autosave.
*/
DrawioFile.prototype.autosaveThread = null;
/**
* Sets the delay for autosave in milliseconds. Default is 500.
* Stores the timestamp for hte last autosave.
*/
DrawioFile.prototype.lastAutosave = null;
/**
* Sets the delay for autosave in milliseconds. Default is 1500.
* Stores the modified state.
*/
DrawioFile.prototype.modified = false;
@ -297,40 +298,20 @@ DrawioFile.prototype.getData = function()
*/
DrawioFile.prototype.open = function()
{
this.ui.setFileData(this.getData());
var data = this.getData();
if (data != null)
{
this.ui.setFileData(data);
}
this.changeListener = mxUtils.bind(this, function(sender, eventObject)
{
var edit = (eventObject != null) ? eventObject.getProperty('edit') : null;
if (this.changeListenerEnabled && this.isEditable() &&
(edit == null || !edit.ignoreEdit))
if (this.changeListenerEnabled && this.isEditable() && (edit == null || !edit.ignoreEdit))
{
this.setModified(true);
if (this.isAutosave())
{
this.ui.editor.setStatus(mxUtils.htmlEntities(mxResources.get('saving')) + '...');
this.autosave(this.autosaveDelay, this.maxAutosaveDelay, mxUtils.bind(this, function(resp)
{
// Does not update status if another autosave was scheduled
if (this.autosaveThread == null && this.ui.getCurrentFile() == this && !this.isModified())
{
this.addAllSavedStatus();
}
}), mxUtils.bind(this, function(resp)
{
if (this.ui.getCurrentFile() == this)
{
this.addUnsavedStatus(resp);
}
}));
}
else
{
this.addUnsavedStatus();
}
this.fileChanged();
}
});
@ -360,22 +341,17 @@ DrawioFile.prototype.addAllSavedStatus = function()
if (file != null && (file.constructor == DriveFile || file.constructor == DropboxFile))
{
this.ui.editor.setStatus('<span title="'+ mxUtils.htmlEntities(mxResources.get('revisionHistory')) +
this.ui.editor.setStatus('<div title="'+ mxUtils.htmlEntities(mxResources.get('revisionHistory')) +
'" style="text-decoration:underline;cursor:pointer;">' +
mxUtils.htmlEntities(mxResources.get('allChangesSaved')) + '</span>');
mxUtils.htmlEntities(mxResources.get('allChangesSaved')) + '</div>');
var links = (this.ui.statusContainer != null) ? this.ui.statusContainer.getElementsByTagName('div') : null;
if (this.ui.statusContainer != null)
if (links.length > 0)
{
var links = this.ui.statusContainer.getElementsByTagName('span');
if (links.length > 0)
mxEvent.addListener(links[0], 'click', mxUtils.bind(this, function()
{
mxEvent.addListener(links[0], 'click', mxUtils.bind(this, function()
{
this.ui.actions.get('revisionHistory').funct();
}));
}
this.ui.actions.get('revisionHistory').funct();
}));
}
}
else
@ -384,6 +360,38 @@ DrawioFile.prototype.addAllSavedStatus = function()
}
};
/**
* Adds the listener for automatically saving the diagram for local changes.
*/
DrawioFile.prototype.fileChanged = function()
{
this.setModified(true);
if (this.isAutosave())
{
this.ui.editor.setStatus(mxUtils.htmlEntities(mxResources.get('saving')) + '...');
this.autosave(this.autosaveDelay, this.maxAutosaveDelay, mxUtils.bind(this, function(resp)
{
// Does not update status if another autosave was scheduled
if (this.autosaveThread == null && this.ui.getCurrentFile() == this && !this.isModified())
{
this.addAllSavedStatus();
}
}), mxUtils.bind(this, function(resp)
{
if (this.ui.getCurrentFile() == this)
{
this.addUnsavedStatus(resp);
}
}));
}
else
{
this.addUnsavedStatus();
}
};
/**
* Adds the listener for automatically saving the diagram for local changes.
*/
@ -392,8 +400,8 @@ DrawioFile.prototype.addUnsavedStatus = function(err)
if (err instanceof Error && err.message != null)
{
this.ui.editor.setStatus('<div class="geStatusAlert" style="overflow:hidden;">' +
mxUtils.htmlEntities(mxResources.get('unsavedChanges')) +
' (' + mxUtils.htmlEntities(err.message) + ')</div>');
mxUtils.htmlEntities(mxResources.get('unsavedChanges')) +
' (' + mxUtils.htmlEntities(err.message) + ')</div>');
}
else
{
@ -415,17 +423,19 @@ DrawioFile.prototype.addUnsavedStatus = function(err)
mxUtils.htmlEntities(mxResources.get('unsavedChangesClickHereToSave')) + '</div>');
// Installs click handler for saving
if (this.ui.statusContainer != null)
var links = (this.ui.statusContainer != null) ? this.ui.statusContainer.getElementsByTagName('div') : null;
if (links != null && links.length > 0)
{
var links = this.ui.statusContainer.getElementsByTagName('div');
if (links.length > 0)
mxEvent.addListener(links[0], 'click', mxUtils.bind(this, function()
{
mxEvent.addListener(links[0], 'click', mxUtils.bind(this, function()
{
this.ui.actions.get((this.ui.mode == null) ? 'saveAs' : 'save').funct();
}));
}
this.ui.actions.get((this.ui.mode == null) ? 'saveAs' : 'save').funct();
}));
}
else
{
this.ui.editor.setStatus('<div class="geStatusAlert" style="overflow:hidden;">' +
mxUtils.htmlEntities(mxResources.get('unsavedChanges')) + '</div>');
}
}
};
@ -442,13 +452,17 @@ DrawioFile.prototype.autosave = function(delay, maxDelay, success, error)
var tmp = (new Date().getTime() - this.lastAutosave < maxDelay) ? delay : 0;
this.clearAutosave();
// Starts new timer or executes immediately if not unsaved for maxDelay
this.autosaveThread = window.setTimeout(mxUtils.bind(this, function()
var thread = window.setTimeout(mxUtils.bind(this, function()
{
this.autosaveThread = null;
this.lastAutosave = null;
if (this.autosaveThead == thread)
{
this.autosaveThread = null;
}
// Workaround for duplicate save if UI is blocking
// after save while pending autosave triggers
if (this.isModified() && this.isAutosaveNow())
@ -478,12 +492,19 @@ DrawioFile.prototype.autosave = function(delay, maxDelay, success, error)
}
else
{
if (!this.isModified())
{
this.ui.editor.setStatus('');
}
if (success != null)
{
success(null);
}
}
}), tmp);
this.autosaveThread = thread;
};
/**

View file

@ -10,6 +10,9 @@ DriveClient = function(editorUi)
* Holds a reference to the UI. Needed for the sharing client.
*/
this.ui = editorUi;
// New mime type for XML files
this.xmlMimeType = 'application/vnd.jgraph.mxfile';
if (this.ui.editor.isChromelessView() && urlParams['rt'] != '1')
{
@ -37,9 +40,8 @@ DriveClient = function(editorUi)
this.mimeType = 'application/vnd.jgraph.mxfile.rtlegacy';
}
this.mimeTypes = 'application/mxe,application/vnd.jgraph.mxfile,' +
'application/mxr,application/vnd.jgraph.mxfile.realtime,' +
'application/vnd.jgraph.mxfile.rtlegacy';
this.mimeTypes = this.xmlMimeType + 'application/mxe,application/mxr,' +
'application/vnd.jgraph.mxfile.realtime,application/vnd.jgraph.mxfile.rtlegacy';
};
// Extends mxEventSource
@ -58,6 +60,12 @@ DriveClient.prototype.scopes = (urlParams['photos'] == '1') ?
'https://www.googleapis.com/auth/drive.install',
'https://www.googleapis.com/auth/userinfo.profile'];
/**
* Contains the hostname of the old app.
*/
DriveClient.prototype.allFields = 'kind,id,parents,headRevisionId,etag,title,mimeType,modifiedDate,' +
'editable,copyable,labels,properties,downloadUrl,webContentLink,userPermission';
/**
* Specifies if thumbnails should be enabled. Default is true.
* LATER: If thumbnails are disabled, make sure to replace the
@ -377,7 +385,8 @@ DriveClient.prototype.executeRequest = function(req, success, error)
// Schedules a retry if no new request was executed
// TODO: Check for 'rateLimitExceeded', 'userRateLimitExceeded' in errors
// see https://developers.google.com/drive/handle-errors
else if (resp != null && resp.error != null && resp.error.code != 404 && this.currentRequest == req && retryCount < this.maxRetries)
else if (resp != null && resp.error != null && resp.error.code != 412 && resp.error.code != 404 &&
this.currentRequest == req && retryCount < this.maxRetries)
{
retryCount++;
var jitter = 1 + 0.1 * (Math.random() - 0.5);
@ -561,8 +570,9 @@ DriveClient.prototype.copyFile = function(id, title, success, error)
{
if (id != null && title != null)
{
this.executeRequest(gapi.client.drive.files.copy({'fileId': id, 'resource':
{'title' : title}, 'supportsTeamDrives': true}), success, error);
this.executeRequest(gapi.client.drive.files.copy({'fileId': id,
'fields': this.allFields, 'supportsTeamDrives': true,
'resource': {'title' : title}}), success, error);
}
};
@ -576,7 +586,8 @@ DriveClient.prototype.renameFile = function(id, title, success, error)
{
if (id != null && title != null)
{
this.executeRequest(this.createDriveRequest(id, {'title' : title}), success, error);
this.executeRequest(this.createDriveRequest(
id, {'title' : title}), success, error);
}
};
@ -620,6 +631,40 @@ DriveClient.prototype.getLibrary = function(id, success, error)
return this.getFile(id, success, error, true, true);
};
/**
* Loads the descriptorf for the given file ID.
*/
DriveClient.prototype.loadDescriptor = function(id, success, error)
{
this.executeRequest(gapi.client.drive.files.get({'fileId': id,
'fields': this.allFields, 'supportsTeamDrives': true}),
success, error);
};
/**
* Gets the channel ID from the given descriptor.
*/
DriveClient.prototype.getChannelId = function(desc)
{
var props = desc.properties;
var result = null;
if (props != null)
{
for (var i = 0; i < props.length; i++)
{
if (props[i].key == 'channel')
{
result = props[i].value;
break;
}
}
}
return result;
};
/**
* Checks if the client is authorized and calls the next step. The optional
* readXml argument is used for import. Default is false. The optional
@ -632,14 +677,16 @@ DriveClient.prototype.getFile = function(id, success, error, readXml, readLibrar
if (urlParams['rev'] != null)
{
this.executeRequest(gapi.client.drive.revisions.get({'fileId': id, 'revisionId': urlParams['rev']}), mxUtils.bind(this, function(resp)
{
this.getXmlFile(resp, null, success, error);
}), error);
this.executeRequest(gapi.client.drive.revisions.get({'fileId': id,
'revisionId': urlParams['rev'], 'supportsTeamDrives': true}),
mxUtils.bind(this, function(resp)
{
this.getXmlFile(resp, null, success, error);
}), error);
}
else
{
this.executeRequest(gapi.client.drive.files.get({'fileId': id, 'supportsTeamDrives': true}), mxUtils.bind(this, function(resp)
this.loadDescriptor(id, mxUtils.bind(this, function(resp)
{
if (this.user != null)
{
@ -654,20 +701,39 @@ DriveClient.prototype.getFile = function(id, success, error, readXml, readLibrar
}
else
{
if (readXml || readLibrary || resp.mimeType == this.libraryMimeType)
// Handles converted realtime files as XML files
if (readXml || readLibrary || resp.mimeType == this.libraryMimeType ||
resp.mimeType == this.xmlMimeType)
{
this.getXmlFile(resp, null, success, error, true, readLibrary);
}
else
{
this.loadRealtime(resp, mxUtils.bind(this, function(doc)
{
try
if (!App.GOOGLE_REALTIME)
{
if (this.isGoogleRealtimeMimeType(resp.mimeType))
{
// Converts XML files to realtime including old realtime model
if (doc == null || doc.getModel() == null || doc.getModel().getRoot() == null ||
doc.getModel().getRoot().isEmpty() || (doc.getModel().getRoot().has('cells') &&
!doc.getModel().getRoot().has(DriveRealtime.prototype.diagramsKey)))
this.convertRealtimeFile(resp, mxUtils.bind(this, function(file)
{
this.notifyRealtimeConverted(file);
success(file);
}), error);
}
else
{
this.getXmlFile(resp, null, success, error);
}
}
else
{
this.loadRealtime(resp, mxUtils.bind(this, function(doc)
{
try
{
// Converts XML files to realtime including old realtime model
if (doc == null || doc.getModel() == null || doc.getModel().getRoot() == null ||
doc.getModel().getRoot().isEmpty() || (doc.getModel().getRoot().has('cells') &&
!doc.getModel().getRoot().has(DriveRealtime.prototype.diagramsKey)))
{
this.getXmlFile(resp, doc, success, error);
}
@ -676,12 +742,13 @@ DriveClient.prototype.getFile = function(id, success, error, readXml, readLibrar
// XML not required here since the realtime model is not empty
success(new DriveFile(this.ui, null, resp, doc));
}
}
catch (e)
{
error(e);
}
}), error);
}
catch (e)
{
error(e);
}
}), error);
}
}
}
}
@ -693,6 +760,50 @@ DriveClient.prototype.getFile = function(id, success, error, readXml, readLibrar
}
};
/**
* Returns true if the given mime type is for Google Realtime files.
*/
DriveClient.prototype.isGoogleRealtimeMimeType = function(mimeType)
{
return mimeType != null && mimeType.substring(0, 30) == 'application/vnd.jgraph.mxfile.';
};
/**
* Checks if the client is authorized and calls the next step.
*/
DriveClient.prototype.getRealtimeData = function(id, success, error, retryCount)
{
this.executeRequest(gapi.client.drive.realtime.get({'fileId': id,
'supportsTeamDrives': true}), mxUtils.bind(this, function(resp)
{
var json = (resp.result != null) ? resp.result.data : null;
if (json != null && json.value != null && json.value.diagrams != null)
{
success(json);
}
else if (error != null)
{
error();
}
}), mxUtils.bind(this, function(resp)
{
if (retryCount == null)
{
retryCount = 0;
}
if (retryCount < 3)
{
this.getRealtimeData(id, success, error, retryCount + 1);
}
else if (error != null)
{
error();
}
}));
};
/**
* Checks if the client is authorized and calls the next step.
*/
@ -707,7 +818,7 @@ DriveClient.prototype.loadRealtime = function(resp, success, error)
}
// Checks if we're in viewer app or if the file is writeable if it needs to be converted
else if (this.appId != '850530949725' && (resp.editable || (resp.mimeType != 'application/mxe' &&
resp.mimeType != 'application/vnd.jgraph.mxfile')))
resp.mimeType != 'application/vnd.jgraph.mxfile')) && gapi.drive.realtime != null)
{
var fn = mxUtils.bind(this, function()
{
@ -792,7 +903,8 @@ DriveClient.prototype.getXmlFile = function(resp, doc, success, error, ignoreMim
var file = new DriveFile(this.ui, data, resp, doc);
// Checks if mime-type needs to be updated if the file is editable and no viewer app
if (!ignoreMime && this.appId != '850530949725' && file.isEditable() && resp.mimeType != this.mimeType)
if (App.GOOGLE_REALTIME && !ignoreMime && this.appId != '850530949725' && file.isEditable() &&
resp.mimeType != this.mimeType)
{
// Overwrites mime-type (only mutable on update when uploading new content)
this.saveFile(file, true, mxUtils.bind(this, function(resp)
@ -816,7 +928,7 @@ DriveClient.prototype.getXmlFile = function(resp, doc, success, error, ignoreMim
* @param {number} dx X-coordinate of the translation.
* @param {number} dy Y-coordinate of the translation.
*/
DriveClient.prototype.saveFile = function(file, revision, success, error, noCheck, unloading)
DriveClient.prototype.saveFile = function(file, revision, success, error, noCheck, unloading, overwrite, properties)
{
if (file.isEditable())
{
@ -839,10 +951,29 @@ DriveClient.prototype.saveFile = function(file, revision, success, error, noChec
{
var meta =
{
'mimeType': (file.constructor == DriveLibrary) ? this.libraryMimeType : this.mimeType,
'mimeType': file.desc.mimeType,
'title': file.getTitle()
};
// Overrides old mime type and creates a revision
if (!App.GOOGLE_REALTIME && file.realtime == null &&
this.isGoogleRealtimeMimeType(file.desc.mimeType))
{
meta.mimeType = this.xmlMimeType;
revision = true;
}
// Inserts a channel ID
if (file.constructor == DriveFile && this.getChannelId(file.desc) == null)
{
if (properties == null)
{
properties = [];
}
properties.push({'key': 'channel', 'value': Editor.guid()});
}
// Specifies that no thumbnail should be uploaded in which case the existing thumbnail is used
if (!keepExisting)
{
@ -869,15 +1000,24 @@ DriveClient.prototype.saveFile = function(file, revision, success, error, noChec
// Updates saveDelay on drive file
var wrapper = function()
{
file.saveDelay = new Date().getTime() - t0;
success.apply(this, arguments);
file.saveDelay = new Date().getTime() - t0;
success.apply(this, arguments);
};
var fn = mxUtils.bind(this, function(data, binary)
{
if (properties != null)
{
meta.properties = properties;
}
// Used to check if file was changed externally
var etag = (!overwrite && file.constructor == DriveFile &&
file.realtime == null) ? file.desc.etag : null;
this.executeRequest(this.createUploadRequest(file.getId(), meta,
data, revision || (file.desc.mimeType != this.mimeType &&
file.desc.mimeType != this.libraryMimeType), binary),
file.desc.mimeType != this.libraryMimeType), binary, etag),
wrapper, error);
});
@ -900,37 +1040,38 @@ DriveClient.prototype.saveFile = function(file, revision, success, error, noChec
{
// NOTE: getThumbnail is asynchronous and returns false if no thumbnails can be created
if (unloading || file.constructor == DriveLibrary || !this.enableThumbnails || urlParams['thumb'] == '0' ||
(file.realtime != null && !file.realtime.connected) || !this.ui.getThumbnail(this.thumbnailWidth, mxUtils.bind(this, function(canvas)
{
// Callback for getThumbnail
var thumb = null;
if (canvas != null)
(file.realtime != null && !file.realtime.connected) || !this.ui.getThumbnail(this.thumbnailWidth,
mxUtils.bind(this, function(canvas)
{
try
// Callback for getThumbnail
var thumb = null;
if (canvas != null)
{
// Security errors are possible
thumb = canvas.toDataURL('image/png');
try
{
// Security errors are possible
thumb = canvas.toDataURL('image/png');
}
catch (e)
{
// ignore and continue with placeholder
}
}
catch (e)
// Maximum thumbnail size is 2MB
if (thumb == null || thumb.length > this.maxThumbnailSize)
{
// ignore and continue with placeholder
thumb = null;
}
}
// Maximum thumbnail size is 2MB
if (thumb == null || thumb.length > this.maxThumbnailSize)
{
thumb = null;
}
else
{
// Converts base64 data into required format for Drive (base64url with no prefix)
thumb = thumb.substring(thumb.indexOf(',') + 1).replace(/\+/g, '-').replace(/\//g, '_');
}
doSave(thumb, 'image/png');
})))
else
{
// Converts base64 data into required format for Drive (base64url with no prefix)
thumb = thumb.substring(thumb.indexOf(',') + 1).replace(/\+/g, '-').replace(/\//g, '_');
}
doSave(thumb, 'image/png');
})))
{
// If-branch
doSave(null, null, file.constructor != DriveLibrary && (file.realtime == null || file.realtime.connected));
@ -963,6 +1104,39 @@ DriveClient.prototype.saveFile = function(file, revision, success, error, noChec
}
};
/**
* Sends a message to all collaborators and stores the head revision ID.
*/
DriveClient.prototype.notifyRealtimeConverted = function(file)
{
try
{
if (gapi.drive.realtime != null)
{
gapi.drive.realtime.load(file.getId(), mxUtils.bind(this, function(doc)
{
try
{
if (doc != null && doc.getModel() != null &&
doc.getModel().getRoot() != null)
{
doc.getModel().getRoot().set('realtimeConverted',
file.desc.headRevisionId);
}
}
catch (e)
{
// ignore
}
}));
}
}
catch (e)
{
// ignore
}
};
/**
* Verifies the mime type of the given file ID.
*/
@ -1049,7 +1223,7 @@ DriveClient.prototype.redirectToNewApp = function(error, fileId)
*/
DriveClient.prototype.insertFile = function(title, data, folderId, success, error, mimeType, binary, allowRealtime)
{
mimeType = (mimeType != null) ? mimeType : this.mimeType;
mimeType = (mimeType != null) ? mimeType : ((App.GOOGLE_REALTIME) ? this.mimeType : this.xmlMimeType);
allowRealtime = (allowRealtime != null) ? allowRealtime : true;
var metadata =
@ -1062,7 +1236,7 @@ DriveClient.prototype.insertFile = function(title, data, folderId, success, erro
{
metadata.parents = [{'kind': 'drive#fileLink', 'id': folderId}];
}
// NOTE: Cannot create thumbnail on insert since no ui has no current file
this.executeRequest(this.createUploadRequest(null, metadata, data, false, binary), mxUtils.bind(this, function(resp)
{
@ -1077,10 +1251,11 @@ DriveClient.prototype.insertFile = function(title, data, folderId, success, erro
error({message: mxResources.get('errorSavingFile')});
}
}
else if (allowRealtime)
else if (App.GOOGLE_REALTIME && allowRealtime &&
this.isGoogleRealtimeMimeType(resp.mimeType))
{
this.loadRealtime(resp, mxUtils.bind(this, function(doc)
{
{
if (this.user != null)
{
var file = new DriveFile(this.ui, data, resp, doc);
@ -1094,11 +1269,11 @@ DriveClient.prototype.insertFile = function(title, data, folderId, success, erro
{
error({message: mxResources.get('loggedOut')});
}
}), error);
}), error, false);
}
else
{
success(resp);
success(new DriveFile(this.ui, data, resp));
}
}), error);
};
@ -1109,20 +1284,27 @@ DriveClient.prototype.insertFile = function(title, data, folderId, success, erro
* @param {number} dx X-coordinate of the translation.
* @param {number} dy Y-coordinate of the translation.
*/
DriveClient.prototype.createUploadRequest = function(id, metadata, data, revision, binary)
DriveClient.prototype.createUploadRequest = function(id, metadata, data, revision, binary, etag)
{
binary = (binary != null) ? binary : false;
var bd = '-------314159265358979323846';
var delim = '\r\n--' + bd + '\r\n';
var close = '\r\n--' + bd + '--';
var ctype = 'application/octect-stream';
var headers = {'Content-Type' : 'multipart/mixed; boundary="' + bd + '"'};
if (etag != null)
{
headers['If-Match'] = etag;
}
var reqObj =
{
'path': '/upload/drive/v2/files' + (id != null ? '/' + id : ''),
'method': (id != null) ? 'PUT' : 'POST',
'params': {'uploadType': 'multipart'},
'headers': {'Content-Type' : 'multipart/mixed; boundary="' + bd + '"'},
'headers': headers,
'body' : delim + 'Content-Type: application/json\r\n\r\n' + JSON.stringify(metadata) + delim +
'Content-Type: ' + ctype + '\r\n' + 'Content-Transfer-Encoding: base64\r\n' + '\r\n' +
((data != null) ? (binary) ? data : Base64.encode(data) : '') + close
@ -1134,6 +1316,7 @@ DriveClient.prototype.createUploadRequest = function(id, metadata, data, revisio
}
reqObj.params['supportsTeamDrives'] = true;
reqObj.params['fields'] = this.allFields;
return gapi.client.request(reqObj);
};
@ -1397,7 +1580,7 @@ DriveClient.prototype.pickLibrary = function(fn)
}
});
// Reuses picker as long as token doesn't change.
// Reuses picker as long as token doesn't change
var token = gapi.auth.getToken().access_token;
if (this.libraryPicker == null || this.libraryPickerToken != token)
@ -1477,3 +1660,255 @@ DriveClient.prototype.showPermissions = function(id)
shareClient.showSettingsDialog();
}));
};
/**
* Converts the given file from realtime to XML.
*/
DriveClient.prototype.getRealtimeAge = function(desc, json)
{
var mod = (json != null && json.value != null && json.value.modifiedDate != null) ?
json.value.modifiedDate.json : null;
var result = 0;
if (mod != null && mod > 0)
{
var ts = new Date(desc.modifiedDate);
var rt = new Date(mod);
result = ts.getTime() - rt.getTime();
}
return result;
};
/**
* Converts the given file from realtime to XML.
*/
DriveClient.prototype.convertRealtimeFile = function(desc, success, error)
{
this.getRealtimeData(desc.id, mxUtils.bind(this, function(json)
{
var age = this.getRealtimeAge(desc, json);
// Uses the newer of the two
if (age < 0)
{
var node = this.convertJsonToXml(json);
console.log('converted realtime model', age, json, node);
success(new DriveFile(this.ui, mxUtils.getXml(node), desc));
}
else
{
console.log('using newer XML file', age, json);
this.getXmlFile(desc, null, success, error);
}
}), mxUtils.bind(this, function()
{
console.log('no realtime data, using XML file');
this.getXmlFile(desc, null, success, error);
}));
};
/**
* Returns the location as a new object.
*/
DriveClient.prototype.convertJsonToXml = function(json, uncompressed)
{
if (json.value == null || json.value.diagrams == null)
{
throw Error('Invalid JSON: no diagrams in root map');
}
else
{
var node = mxUtils.createXmlDocument().createElement('mxfile');
var diagrams = json.value.diagrams.value;
for (var i = 0; i < diagrams.length; i++)
{
try
{
var diagramNode = this.decodeJsonPage(diagrams[i].value,
node.ownerDocument.createElement('diagram'),
uncompressed);
//if (diagramNode.getAttribute('name') == null)
//{
// TODO: Should only use when converting but not when comparing
//diagramNode.setAttribute('name', mxResources.get('pageWithNumber', [i + 1]));
//}
node.appendChild(diagramNode);
}
catch (e)
{
throw Error('Error on page ' + i + ': ' + e.stack);
}
}
//console.log('leaving convertJson', mxUtils.getPrettyXml(node));
return node;
}
};
/**
* Returns true if copy, export and print are not allowed for this file.
*/
DriveClient.prototype.decodeJsonPage = function(json, node, uncompressed)
{
if (json == null)
{
throw Error('Invalid JSON: json for page is null');
}
else
{
var codec = new mxCodec();
var root = this.createJsonCell(json.root, codec);
if (root == null)
{
throw Error('Invalid JSON: no root cell for page');
}
else
{
// Dummy model for encoding
var modelNode = codec.encode(new mxGraphModel(root));
this.decodeJsonViewState(json, modelNode);
if (uncompressed)
{
node.appendChild(modelNode);
}
else
{
mxUtils.setTextContent(node, this.ui.editor.graph.compressNode(modelNode));
}
// Adds attributes to diagram node
if (json.id != null)
{
node.setAttribute('id', json.id.json);
}
else
{
// Workaround for missing page ID in JSON
this.node.setAttribute('id', Editor.guid());
}
if (json.name != null)
{
node.setAttribute('name', json.name.json);
}
}
}
//console.log('decoded json page', json, node);
return node;
};
/**
* Writes the view state to the given node.
*/
DriveClient.prototype.decodeJsonViewState = function(json, node)
{
// Page format is stored as "width,height"
var pf = (json.pageFormat != null) ? json.pageFormat.json : null;
if (pf != null && pf.length > 0)
{
var values = pf.split(',');
if (values.length > 1)
{
node.setAttribute('pageWidth', values[0]);
node.setAttribute('pageHeight', values[1]);
}
}
var bg = (json.backgroundColor != null) ? json.backgroundColor.json : null;
if (bg != null && bg.length > 0)
{
node.setAttribute('background', bg);
}
var img = (json.backgroundImage != null) ? json.backgroundImage.json : null;
if (img != null && img.length > 0)
{
node.setAttribute('backgroundImage', img);
}
node.setAttribute('fold', (json.foldingEnabled != null) ? json.foldingEnabled.json : '0');
node.setAttribute('pageScale', (json.pageScale != null) ? json.pageScale.json : mxGraph.prototype.pageScale);
node.setAttribute('math', (json.mathEnabled != null) ? json.mathEnabled.json : '0');
node.setAttribute('shadow', (json.shadowVisible != null) ? json.shadowVisible.json : '0');
return node;
};
/**
* Syncs initial state from collab model to graph model.
*/
DriveClient.prototype.createJsonCell = function(json, codec)
{
if (json != null && json.id != null)
{
var val = json.value;
var cell = this.jsonToCell(val, codec);
codec.putObject(json.id, cell);
cell.source = (val.source != null) ? this.createJsonCell(val.source, codec) : null;
cell.target = (val.target != null) ? this.createJsonCell(val.target, codec) : null;
// Cells can be serialized as parents of terminals
this.createJsonCell(val.parent, codec)
for (var i = 0; i < val.children.value.length; i++)
{
var child = this.createJsonCell(val.children.value[i], codec);
if (child != null)
{
cell.insert(child);
}
else
{
throw Error('Invalid JSON: no child ' + i + ' for cell ' + json.id);
}
}
return cell;
}
else if (json != null && json.ref != null)
{
return codec.objects[json.ref];
}
else
{
return null;
}
};
/**
* Adds the listener for automatically saving the diagram for local changes.
*/
DriveClient.prototype.jsonToCell = function(val, codec)
{
var cell = new mxCell();
cell.id = val.cellId.json;
cell.vertex = val.type.json == 'vertex';
cell.edge = val.type.json == 'edge';
cell.connectable = val.connectable.json != '0';
cell.collapsed = val.collapsed.json == '1';
cell.visible = val.visible.json != '0';
cell.style = (val.style != null) ? val.style.json : null;
cell.value = (val.xmlValue != null) ?
mxUtils.parseXml(val.xmlValue.json).documentElement :
((val.value != null) ? val.value.json : null);
cell.geometry = (val.geometry != null) ?
codec.decode(mxUtils.parseXml(val.geometry.json).documentElement) : null;
return cell;
};

View file

@ -17,6 +17,11 @@ DriveFile = function(ui, data, desc, doc)
//Extends mxEventSource
mxUtils.extend(DriveFile, DrawioFile);
/**
* Delay for last save in ms.
*/
DriveFile.prototype.saveDelay = 0;
/**
* Returns true if copy, export and print are not allowed for this file.
*/
@ -27,9 +32,12 @@ DriveFile.prototype.isRestricted = function()
};
/**
* Delay for last save in ms.
* Adds the listener for automatically saving the diagram for local changes.
*/
DriveFile.prototype.saveDelay = 0;
DriveFile.prototype.isConflict = function(err)
{
return err != null && err.error != null && err.error.code == 412;
};
/**
* Translates this point by the given vector.
@ -87,7 +95,7 @@ DriveFile.prototype.isAutosaveOptional = function()
*/
DriveFile.prototype.isAutosave = function()
{
return this.ui.editor.autosave || this.isAutosaveRevision();
return this.ui.editor.autosave || (this.realtime != null && this.isAutosaveRevision());
};
/**
@ -103,8 +111,10 @@ DriveFile.prototype.isAutosaveNow = function()
return isNaN(backup) || isNaN(modified) || backup < modified;
}
return true;
else
{
return true;
}
};
/**
@ -146,11 +156,11 @@ DriveFile.prototype.isMovable = function()
* @param {number} dx X-coordinate of the translation.
* @param {number} dy Y-coordinate of the translation.
*/
DriveFile.prototype.save = function(revision, success, error, unloading)
DriveFile.prototype.save = function(revision, success, error, unloading, overwrite)
{
DrawioFile.prototype.save.apply(this, arguments);
this.saveFile(null, revision, success, error, unloading);
this.saveFile(null, revision, success, error, unloading, overwrite);
};
/**
@ -159,7 +169,7 @@ DriveFile.prototype.save = function(revision, success, error, unloading)
* @param {number} dx X-coordinate of the translation.
* @param {number} dy Y-coordinate of the translation.
*/
DriveFile.prototype.saveFile = function(title, revision, success, error, unloading)
DriveFile.prototype.saveFile = function(title, revision, success, error, unloading, overwrite)
{
if (!this.isEditable())
{
@ -170,58 +180,118 @@ DriveFile.prototype.saveFile = function(title, revision, success, error, unloadi
}
else if (!this.savingFile)
{
this.savingFile = true;
// Makes sure no changes get lost while the file is saved
var prevModified = this.isModified;
var modified = this.isModified();
this.setModified(false);
this.ui.drive.saveFile(this, revision, mxUtils.bind(this, function(resp)
// Makes sure no changes get lost while the file is saved
this.setModified(false);
// Waits for success for modified state to be visible
this.isModified = function()
{
this.savingFile = false;
this.isModified = prevModified;
// Handles special case where resp is false eg
// if the old file was converted to realtime
if (resp != false)
{
if (revision)
{
this.lastAutosaveRevision = new Date().getTime();
}
this.desc = resp;
this.contentChanged();
if (success != null)
{
success(resp);
}
}
else
{
this.setModified(modified || this.isModified());
if (error != null)
{
error();
}
}
}), mxUtils.bind(this, function(resp)
return true;
};
var doSave = mxUtils.bind(this, function(realOverwrite, realRevision)
{
this.savingFile = false;
this.isModified = prevModified;
this.setModified(modified || this.isModified());
this.savingFile = true;
if (error != null)
this.ui.drive.saveFile(this, realRevision, mxUtils.bind(this, function(resp)
{
error(resp);
}
}), unloading, unloading);
this.isModified = prevModified;
this.savingFile = false;
// Handles special case where resp is false eg
// if the old file was converted to realtime
if (resp != false)
{
if (revision)
{
this.lastAutosaveRevision = new Date().getTime();
}
this.desc = resp;
this.contentChanged();
if (success != null)
{
success(resp);
}
}
else
{
this.setModified(modified || this.isModified());
if (error != null)
{
error(resp);
}
}
}), mxUtils.bind(this, function(err)
{
var doError = mxUtils.bind(this, function()
{
this.setModified(modified || this.isModified());
this.isModified = prevModified;
this.savingFile = false;
if (error != null)
{
error(err);
}
});
if (this.isConflict(err))
{
this.showConflictDialog(function()
{
// Overwrites and creates revision
doSave(true, true);
}, function()
{
err = null;
doError();
});
}
else
{
doError();
}
}), unloading, unloading, realOverwrite);
});
doSave(overwrite, revision);
}
};
/**
* Shows a conflict dialog to the user.
*/
DriveFile.prototype.makeCopy = function(success, error, timestamp)
{
if (this.ui.spinner.spin(document.body, mxResources.get('saving')))
{
// Uses copyFile internally which is a remote REST call with the advantage of keeping
// the parents of the file in-place, but copies the remote file contents so needs to
// be updated as soon as we have the ID.
this.saveAs(this.ui.getCopyFilename(this, timestamp), mxUtils.bind(this, function(resp)
{
// Replaces the descriptor to and writes the file
this.ui.spinner.stop();
this.desc = resp;
success();
this.setModified(false);
}), mxUtils.bind(this, function()
{
this.ui.spinner.stop();
if (error != null)
{
error();
}
}));
}
};
/**
* Translates this point by the given vector.
@ -364,3 +434,324 @@ DriveFile.prototype.close = function(unloading)
this.realtime = null;
}
};
/**
* Shows a conflict dialog to the user.
*/
DriveFile.prototype.showConflictDialog = function(retry, error)
{
if (!this.showingConflictDialog)
{
var resume = (this.ui.spinner != null && this.ui.spinner.pause != null) ?
this.ui.spinner.pause() : function() {};
var prev = this.changeListenerEnabled;
this.changeListenerEnabled = false;
this.showingConflictDialog = true;
this.ui.showError(mxResources.get('externalChanges'), mxResources.get('fileChangedOverwrite'),
mxResources.get('makeCopy'), mxUtils.bind(this, function()
{
this.showingConflictDialog = false;
this.changeListenerEnabled = prev;
this.makeCopy(retry, error, true);
}), null, mxResources.get('overwrite'), mxUtils.bind(this, function()
{
this.showingConflictDialog = false;
this.changeListenerEnabled = prev;
resume();
retry();
}), mxResources.get('cancel'), mxUtils.bind(this, function()
{
this.showingConflictDialog = false;
this.changeListenerEnabled = prev;
this.ui.hideDialog();
resume();
error();
}), 360, 180);
// Adds important notice to dialog
if (this.ui.dialog != null && this.ui.dialog.container != null)
{
var alert = document.createElement('a');
alert.className = 'geStatusAlert';
alert.style.display = 'block';
alert.style.position = 'absolute';
alert.style.cursor = 'pointer';
alert.style.bottom = '0';
alert.style.padding = '8px 0 8px 0';
alert.style.marginBottom = '26px';
alert.style.left = '0';
alert.style.right = '0';
alert.style.textAlign = 'center';
alert.style.borderRadius = '0';
alert.style.borderLeftStyle = 'none';
alert.style.borderRightStyle = 'none';
alert.style.textDecoration = 'none';
alert.style.fontWeight = 'bold';
alert.setAttribute('href', 'https://desk.draw.io/support/solutions/articles/16000087215');
alert.setAttribute('target', '_blank');
mxUtils.write(alert, mxResources.get('collaborativeEditingNotice'));
this.ui.dialog.container.appendChild(alert);
}
}
};
/**
* Checks the conversion of the realtime model for this file.
*/
DriveFile.prototype.checkConvert = function()
{
var doCheck = mxUtils.bind(this, function(json)
{
try
{
if (this.ui.getCurrentFile() == this && !this.isModified())
{
this.ui.drive.getXmlFile(this.desc, null, mxUtils.bind(this, function(file)
{
try
{
var data = file.getData();
var node = (data != null) ? mxUtils.parseXml(data).documentElement : null;
if (node != null)
{
var tmp = this.ui.editor.extractGraphModel(node, true);
if (tmp != null)
{
node = tmp;
}
}
if (this.runCheck != null)
{
this.runCheck(json, node, data);
}
}
catch (e)
{
this.log('CATCH-PARSEFILE-' + e.stack);
this.runCheck(json, null, 'CATCH-PARSEFILE-' + e.stack);
}
}), mxUtils.bind(this, function(err)
{
this.log('ERROR-GETFILE');
this.runCheck(json, null, 'ERROR-GETFILE');
}), true);
}
}
catch (e)
{
this.log('CATCH-GETFILE-' + e.stack);
this.runCheck(json, null, 'CATCH-GETFILE-' + e.stack);
}
});
try
{
this.ui.drive.getRealtimeData(this.desc.id, doCheck, doCheck);
}
catch (e)
{
this.log('CATCH-GETJSON-' + e.stack, true);
}
};
/**
* Removes all attributes that are irrelevant for structural diff.
*/
DriveFile.prototype.getComparableFile = function(node)
{
// Removes all attributes from the mxfile
while (node.attributes.length > 0)
{
node.removeAttribute(node.attributes[0].name);
}
// Removes all diagram IDs since those can be missing in
// realtime but will be added on the fly
var diagrams = node.getElementsByTagName('diagram');
for (var i = 0; i < diagrams.length; i++)
{
diagrams[i].removeAttribute('name');
diagrams[i].removeAttribute('id');
// Uncompress diagram data for structural comparison
var tmp = this.ui.editor.graph.decompress(mxUtils.getTextContent(diagrams[i]));
if (tmp != null && tmp.length > 0)
{
while (diagrams[i].firstChild != null)
{
diagrams[i].removeChild(diagrams[i].firstChild);
}
diagrams[i].appendChild(mxUtils.parseXml(tmp).documentElement);
}
}
// Some attributes have been initialized using different defaults
// in the UI compared to realtime so they must be ignored
var models = node.getElementsByTagName('mxGraphModel');
for (var i = 0; i < models.length; i++)
{
while (models[i].attributes.length > 0)
{
models[i].removeAttribute(models[i].attributes[0].name);
}
}
return node;
};
/**
* Removes all labels, user objects and styles from the given node.
*/
DriveFile.prototype.getAnonymizedXml = function(node)
{
if (node != null)
{
var nodes = node.getElementsByTagName('mxCell');
for (var i = 0; i < nodes.length; i++)
{
nodes[i].removeAttribute('style');
nodes[i].removeAttribute('value');
if (nodes[i].parentNode != null && nodes[i].parentNode.nodeName == 'UserObject' &&
nodes[i].parentNode.parentNode != null)
{
nodes[i].parentNode.parentNode.replaceChild(nodes[i], nodes[i].parentNode);
}
}
return mxUtils.getPrettyXml(node);;
}
else
{
return 'null';
}
};
/**
* Removes all labels, user objects and styles from the given JSON.
*/
DriveFile.prototype.getAnonymizedJson = function(json)
{
if (json != null)
{
var diagrams = json.value.diagrams.value;
for (var i = 0; i < diagrams.length; i++)
{
if (diagrams[i].value != null && diagrams[i].value.root != null)
{
this.anonymizeJsonCell(diagrams[i].value.root.value);
}
}
return JSON.stringify(json);
}
else
{
return 'null';
}
};
/**
* Returns the location as a new object.
*/
DriveFile.prototype.anonymizeJsonCell = function(json)
{
if (json != null)
{
delete json.xmlValue;
delete json.value;
delete json.style;
if (json.children != null && json.children.value != null)
{
for (var i = 0; i < json.children.value.length; i++)
{
this.anonymizeJsonCell(json.children.value[i].value);
}
}
}
};
/**
* Debug output.
*/
DriveFile.prototype.debug = function()
{
if (window.console != null && urlParams['test'] == '1')
{
console.log.apply(console, arguments);
}
};
/**
* Debug output.
*/
DriveFile.prototype.log = function(msg, sendReport)
{
this.debug(msg);
try
{
this.ui.logEvent({category: this.ui.JSON_CHECK, action: msg, label: this.desc.id});
if (sendReport)
{
this.report('Realtime Log Report ' + new Date() +
'\n\nDescription: ' + JSON.stringify({version: this.ui.JSON_CHECK,
title: this.desc.title, editable: this.desc.editable,
copyable: this.desc.copyable, labels: this.desc.labels, id: this.desc.id,
userPermission: this.desc.userPermission, fileSize: this.desc.fileSize,
fileExtension: this.desc.fileExtension, modifiedDate: this.desc.modifiedDate,
mimeType: this.desc.mimeType}) +
'\n\nMessage:\n' + msg);
}
}
catch (e)
{
// ignore
}
};
/**
* Debug output.
*/
DriveFile.prototype.report = function(data)
{
try
{
if (data.length > 3000000)
{
data = data.substring(0, 3000000) + '\n...[REPORT SHORTENED]'
}
this.debug(data);
mxUtils.post('/email', 'version=' + encodeURIComponent(EditorUi.VERSION) +
'&url=' + encodeURIComponent(window.location.href) +
'&data=' + encodeURIComponent(data),
mxUtils.bind(this, function(req)
{
this.debug('report sent');
}),
mxUtils.bind(this, function()
{
this.debug('report failed');
}));
}
catch (e)
{
// ignore
}
};

View file

@ -25,7 +25,7 @@ function DriveRealtime(file, doc)
this.ui.allowAnimation = false;
this.codec = new mxCodec();
this.disconnectListener = mxUtils.bind(this, function()
{
// LATER: How to reload realtime document without refreshing the page
@ -181,6 +181,20 @@ DriveRealtime.prototype.start = function()
this.log('reset realtime');
}
// Forces a refresh if realtime was disabled on the file
this.root.addEventListener(gapi.drive.realtime.EventType.VALUE_CHANGED, mxUtils.bind(this, function(evt)
{
if (evt.property == 'realtimeConverted')
{
this.ui.showRefreshDialog();
}
}));
if (this.root.has('realtimeConverted'))
{
this.ui.showRefreshDialog();
}
var prefix = this.createPrefix();
this.model.prefix = prefix + '-';
this.ui.editor.resetGraph();
@ -265,9 +279,14 @@ DriveRealtime.prototype.start = function()
// Dummy node, should be XML node if used
this.page = new DiagramPage(document.createElement('diagram'));
this.page.mapping = new RealtimeMapping(this, this.diagramMap, this.page);
this.diagramMap.set('name', mxResources.get('pageWithNumber', [1]));
this.diagramMap.set('id', this.page.getId());
this.page.setName(this.diagramMap.get('name'));
if (this.file.isEditable())
{
this.diagramMap.set('name', mxResources.get('pageWithNumber', [1]));
this.diagramMap.set('id', this.page.getId());
}
this.page.setName(this.diagramMap.get('name') || mxResources.get('pageWithNumber', [1]));
this.page.mapping.init();
}
else
@ -282,10 +301,17 @@ DriveRealtime.prototype.start = function()
page.mapping = new RealtimeMapping(this, diagramMap, page);
this.ui.currentPage = page;
if (this.file.isEditable() && !page.mapping.diagramMap.has('name'))
if (this.file.isEditable())
{
page.mapping.diagramMap.set('name', mxResources.get('pageWithNumber', [1]));
page.mapping.diagramMap.set('id', page.getId());
if (!page.mapping.diagramMap.has('name'))
{
page.mapping.diagramMap.set('name', mxResources.get('pageWithNumber', [1]));
}
if (!page.mapping.diagramMap.has('id'))
{
page.mapping.diagramMap.set('id', page.getId());
}
}
page.setName(page.mapping.diagramMap.get('name') || mxResources.get('pageWithNumber', [1]));
@ -872,6 +898,7 @@ DriveRealtime.prototype.installPageSelectListener = function()
if (this.file.isEditable())
{
page.mapping.diagramMap.set('name', page.getName());
page.mapping.diagramMap.set('id', page.getId());
}
}
});
@ -922,6 +949,12 @@ DriveRealtime.prototype.installPageSelectListener = function()
page.mapping = new RealtimeMapping(this, evt.values[i], page);
page.setName(page.mapping.diagramMap.get('name') || mxResources.get('pageWithNumber',
[this.ui.pages.length + 1]));
if (page.mapping.diagramMap.has('id'))
{
page.node.setAttribute('id', page.mapping.diagramMap.get('id'));
}
this.ui.pages.splice(evt.index + i, 0, page);
page.mapping.init();
}

View file

@ -120,6 +120,15 @@
},
{name: 'portConstraintRotation', dispName: 'Port Const. Rot.', type: 'bool', defVal: false},
{name: 'snapToPoint', dispName: 'Snap to Point', type: 'bool', defVal: false},
{name: 'perimeter', dispName: 'Perimeter', defVal: 'none', type: 'enum',
enumList: [{val: 'none', dispName: 'None'},
{val: 'rectanglePerimeter', dispName: 'Rectangle'}, {val: 'ellipsePerimeter', dispName: 'Ellipse'},
{val: 'rhombusPerimeter', dispName: 'Rhombus'}, {val: 'trianglePerimeter', dispName: 'Triangle'},
{val: 'hexagonPerimeter2', dispName: 'Hexagon'}, {val: 'lifelinePerimeter', dispName: 'Lifeline'},
{val: 'orthogonalPerimeter', dispName: 'Orthogonal'}, {val: 'backbonePerimeter', dispName: 'Backbone'},
{val: 'calloutPerimeter', dispName: 'Callout'}, {val: 'parallelogramPerimeter', dispName: 'Parallelogram'},
{val: 'trapezoidPerimeter', dispName: 'Trapezoid'}, {val: 'stepPerimeter', dispName: 'Step'}]
},
{name: 'fixDash', dispName: 'Fixed Dash', type: 'bool', defVal: false},
{name: 'autosize', dispName: 'Autosize', type: 'bool', defVal: false},
{name: 'collapsible', dispName: 'Collapsible', type: 'bool', defVal: false},
@ -2020,7 +2029,7 @@
input.value = pValue;
input.className = "gePropEditor";
if (pType == "int" || pType == "float")
if ((pType == "int" || pType == "float") && !prop.allowAuto)
{
input.type = "number";
input.step = pType == "int"? "1" : "any";
@ -2041,6 +2050,21 @@
function setInputVal()
{
var inputVal = input.value;
inputVal = inputVal.length == 0 && pType != "string"? 0 : inputVal;
if (prop.allowAuto)
{
if (inputVal.trim().toLowerCase() == "auto")
{
inputVal = "auto";
pType = "string";
}
else
{
inputVal = parseFloat(inputVal);
inputVal = isNaN(inputVal)? 0 : inputVal;
}
}
if (prop.min != null && inputVal < prop.min)
{

View file

@ -684,6 +684,7 @@
else
{
var diagramNode = node.ownerDocument.createElement('diagram');
diagramNode.setAttribute('id', Editor.guid());
mxUtils.setTextContent(diagramNode, data);
fileNode = node.ownerDocument.createElement('mxfile');
@ -773,9 +774,7 @@
// Uses the graph state from the realtime model
mapping.writeRealtimeToNode(temp);
var data = this.editor.graph.compress(this.editor.graph.zapGremlins(mxUtils.getXml(temp)));
mxUtils.setTextContent(this.pages[i].node, data);
mxUtils.setTextContent(this.pages[i].node, this.editor.graph.compressNode(temp));
// Marks the page as up-to-date
mapping.needsUpdate = false;
@ -1630,6 +1629,49 @@
return doc;
};
/**
* Constructs a filename for a copy of the given file.
*/
EditorUi.prototype.getCopyFilename = function(file, timestamp)
{
var title = (file != null && file.getTitle() != null) ?
file.getTitle() : this.defaultFilename;
// Handles extension
var extension = '';
var dot = title.lastIndexOf('.');
if (dot >= 0)
{
extension = title.substring(dot);
title = title.substring(0, dot);
}
if (timestamp)
{
function getFormattedTime()
{
var today = new Date();
var y = today.getFullYear();
// JavaScript months are 0-based.
var m = today.getMonth() + 1;
var d = today.getDate();
var h = today.getHours();
var mi = today.getMinutes();
var s = today.getSeconds();
return y + "-" + m + "-" + d + "-" + h + "-" + mi + "-" + s;
}
var ts = new Date();
title += '-' + getFormattedTime();
}
title = mxResources.get('copyOf', [title]) + extension;
return title;
};
/**
* Translates this point by the given vector.
*
@ -5820,6 +5862,7 @@
if (page.getName() == null)
{
page.setName(mxResources.get('pageWithNumber', [index + 1]));
page.needsUpdate = true;
}
graph.model.execute(new ChangePage(this, page, page, index));

View file

@ -629,7 +629,7 @@ GitHubClient.prototype.saveFile = function(file, success, error)
{
resume = this.ui.spinner.pause();
var dlg = new ErrorDialog(this.ui, mxResources.get('errorSavingFile'),
var dlg = new ErrorDialog(this.ui, mxResources.get('externalChanges'),
mxResources.get('fileChangedOverwrite'), mxResources.get('cancel'), mxUtils.bind(this, function()
{
error();

View file

@ -386,6 +386,27 @@
{
editorUi.actions.get('save').funct();
}, null, null, Editor.ctrlKey + '+S');
editorUi.actions.addAction('refresh', function()
{
var currentFile = editorUi.getCurrentFile();
function fn()
{
currentFile.setModified(false);
editorUi.loadFile(currentFile.getHash(), true);
};
if (currentFile != null && currentFile.isModified())
{
editorUi.confirm(mxResources.get('allChangesLost'), null, fn,
mxResources.get('cancel'), mxResources.get('discardChanges'));
}
else
{
fn();
}
}, null, null, 'Alt+Shift+R');
editorUi.actions.addAction('upload...', function()
{
@ -945,7 +966,9 @@
var b = graph.getGraphBounds();
var tr = graph.view.translate;
var s = graph.view.scale;
graph.insertVertex(parent, null, '', b.x / s - tr.x, b.y / s - tr.y, b.width / s, b.height / s, 'fillColor=none;strokeColor=red;');
graph.insertVertex(graph.getDefaultParent(), null, '',
b.x / s - tr.x, b.y / s - tr.y, b.width / s, b.height / s,
'fillColor=none;strokeColor=red;');
}));
mxResources.parse('createSidebarEntry=Create sidebar entry');
@ -1830,20 +1853,8 @@
if (file != null)
{
var title = (file.getTitle() != null) ? file.getTitle() : editorUi.defaultFilename;
// Handles extension
var extension = '';
var dot = title.lastIndexOf('.');
if (dot >= 0)
{
extension = title.substring(dot);
title = title.substring(0, dot);
}
title = mxResources.get('copyOf', [title]) + extension;
var title = editorUi.getCopyFilename(file);
if (file.constructor == DriveFile)
{
var dlg = new CreateDialog(editorUi, title, mxUtils.bind(this, function(newTitle, mode)
@ -1860,18 +1871,18 @@
{
if (editorUi.spinner.spin(document.body, mxResources.get('saving')))
{
// Makes sure the latest XML is in the file
file.save(false, mxUtils.bind(this, function()
// Saveas does not update the file descriptor in Google Drive
file.saveAs(newTitle, mxUtils.bind(this, function(resp)
{
// Saveas does not update the file descriptor in Google Drive
file.saveAs(newTitle, mxUtils.bind(this, function(resp)
// Replaces file descriptor in-place and saves
file.desc = resp;
// Makes sure the latest XML is in the file
file.save(false, mxUtils.bind(this, function()
{
editorUi.spinner.stop();
var url = editorUi.getUrl();
window.openWindow(url + '#G' + resp.id, null, mxUtils.bind(this, function()
{
window.location.hash = 'G' + resp.id;
}));
file.setModified(false);
file.addAllSavedStatus();
}), mxUtils.bind(this, function(resp)
{
editorUi.handleError(resp);
@ -1884,7 +1895,7 @@
}
else
{
this.editorUi.createFile(newTitle, this.editorUi.getFileData(true), null, mode);
editorUi.createFile(newTitle, editorUi.getFileData(true), null, mode);
}
}
}), mxUtils.bind(this, function()
@ -2648,7 +2659,7 @@
if (file.realtime == null)
{
this.addMenuItems(menu, ['save', 'share', '-'], parent);
this.addMenuItems(menu, ['save', 'share', '-', 'refresh', '-'], parent);
}
else
{

View file

@ -694,9 +694,10 @@ EditorUi.initMinimalTheme = function()
this.put('diagram', new Menu(mxUtils.bind(this, function(menu, parent)
{
var file = ui.getCurrentFile();
ui.menus.addSubmenu('extras', menu, parent, mxResources.get('preferences'));
menu.addSeparator(parent);
if (mxClient.IS_CHROMEAPP || EditorUi.isElectronApp)
{
ui.menus.addMenuItems(menu, ['new', 'open', '-', 'save', 'saveAs', '-'], parent);
@ -721,17 +722,19 @@ EditorUi.initMinimalTheme = function()
}
ui.menus.addSubmenu('exportAs', menu, parent);
var file = ui.getCurrentFile();
if (file != null && file.constructor == DriveFile)
{
ui.menus.addMenuItems(menu, ['-', 'share'], parent);
if (file.realtime != null)
{
ui.menus.addMenuItems(menu, ['chatWindowTitle'], parent);
}
else
{
ui.menus.addMenuItems(menu, ['-', 'refresh'], parent);
}
menu.addSeparator(parent);
}

View file

@ -460,7 +460,7 @@ Graph.prototype.createViewState = function(node)
background: (bg != null && bg.length > 0) ? bg : this.defaultGraphBackground,
backgroundImage: (bgImg != null) ? new mxImage(bgImg.src, bgImg.width, bgImg.height) : null,
pageScale: (!isNaN(ps)) ? ps : mxGraph.prototype.pageScale,
pageFormat: (!isNaN(pw) && !isNaN(ph)) ? new mxRectangle(0, 0, pw, pw) : this.pageFormat,
pageFormat: (!isNaN(pw) && !isNaN(ph)) ? new mxRectangle(0, 0, pw, ph) : mxSettings.getPageFormat(),
tooltips: node.getAttribute('tooltips') != '0',
connect: node.getAttribute('connect') != '0',
arrows: node.getAttribute('arrows') != '0',
@ -496,8 +496,10 @@ Graph.prototype.saveViewState = function(vs, node)
node.setAttribute('pageHeight', pf.height);
}
node.setAttribute('background', (vs != null && vs.background != null) ?
vs.background : this.defaultGraphBackground);
if (vs != null && vs.background != null)
{
node.setAttribute('background', vs.background);
}
if (vs != null && vs.backgroundImage != null)
{

View file

@ -1287,14 +1287,14 @@ var com;
if (dScale != null)
{
dScaleV = parseFloat(dScale.getAttribute("V"));
dScaleV = parseFloat(dScale.getAttribute("V")) || 1;
}
var pScale = master.pageSheet["PageScale"];
if (pScale != null)
{
pScaleV = parseFloat(pScale.getAttribute("V"));
pScaleV = parseFloat(pScale.getAttribute("V")) || 1;
}
scale = pScaleV / dScaleV;
@ -1533,7 +1533,7 @@ var com;
}
/*private*/ RowFactory.getIndex = function (elem) {
try {
return parseInt(elem.getAttribute("IX"));
return parseInt(elem.getAttribute("IX")) || 1;
}
catch (e) {
return 1;
@ -2142,7 +2142,7 @@ var com;
}
mxVsdxGeometry.prototype.getIndex$org_w3c_dom_Element = function (elem) {
try {
return parseInt(elem.getAttribute("IX"));
return parseInt(elem.getAttribute("IX")) || 0;
}
catch (e) {
return 0;
@ -8609,7 +8609,7 @@ var com;
var cell = cells[index158];
{
n = cell.getAttribute("N");
var v = cell.getAttribute("V");
var v = cell.getAttribute("V") || cell.textContent || "";
switch ((n)) {
case "Value":
value = v;
@ -10688,9 +10688,9 @@ var com;
var yS = "-0.4";
if (control != null) {
xEl = control.getElementsByTagName(com.mxgraph.io.vsdx.mxVsdxConstants.X).item(0);
xS = xEl.getAttribute("F");
xS = xEl.getAttribute("F") || "";
yEl = control.getElementsByTagName(com.mxgraph.io.vsdx.mxVsdxConstants.Y).item(0);
yS = yEl.getAttribute("F");
yS = yEl.getAttribute("F") || "";
}
var geometry_4 = vertex.getGeometry();
xS = xS.split("Width/2+").join("");
@ -11080,7 +11080,7 @@ var com;
var firstNURBS = firstGeom.getElementsByTagName(com.mxgraph.io.vsdx.mxVsdxConstants.NURBS_TO).item(0);
var firstE = firstNURBS.getElementsByTagName("E").item(0);
if (firstE != null) {
var f = firstE.getAttribute("F");
var f = firstE.getAttribute("F") || "";
f = f.replace(new RegExp("NURBS\\(", 'g'), "");
f = f.replace(new RegExp("\\)", 'g'), "");
f = f.replace(new RegExp(",", 'g'), " ");

View file

@ -22,8 +22,8 @@ position:{cssPropBits:0,cssLitGroup:[a[23]],cssFns:[]},quotes:{cssPropBits:8,css
cssLitGroup:[a[14],a[69]],cssFns:[]},stress:"border-bottom-left-radius","table-layout":{cssPropBits:0,cssLitGroup:[a[52],a[61]],cssFns:[]},"text-align":{cssPropBits:0,cssLitGroup:[a[42],a[56],a[66]],cssFns:[]},"text-decoration":{cssPropBits:0,cssLitGroup:[a[19],a[71]],cssFns:[]},"text-indent":"border-bottom-left-radius","text-overflow":{cssPropBits:8,cssLitGroup:[a[33]],cssFns:[]},"text-shadow":"box-shadow","text-transform":{cssPropBits:0,cssLitGroup:[a[26],a[71]],cssFns:[]},"text-wrap":{cssPropBits:0,
cssLitGroup:[a[46],a[71],a[72]],cssFns:[]},top:"bottom",transform:{cssPropBits:0,cssLitGroup:[a[71]],cssFns:"matrix() perspective() rotate() rotate3d() rotatex() rotatey() rotatez() scale() scale3d() scalex() scaley() scalez() skew() skewx() skewy() translate() translate3d() translatex() translatey() translatez()".split(" ")},"transform-origin":"perspective-origin","transform-style":{cssPropBits:0,cssLitGroup:[a[37]],cssFns:[]},transition:{cssPropBits:1029,cssLitGroup:[a[10],a[48],a[50],a[71]],cssFns:["cubic-bezier()",
"steps()"]},"transition-delay":"animation-delay","transition-duration":"animation-delay","transition-property":{cssPropBits:1024,cssLitGroup:[a[48],a[50]],cssFns:[]},"transition-timing-function":"animation-timing-function","unicode-bidi":{cssPropBits:0,cssLitGroup:[a[30],a[72]],cssFns:[]},"vertical-align":{cssPropBits:5,cssLitGroup:[a[12],a[31]],cssFns:[]},visibility:"backface-visibility","voice-family":{cssPropBits:8,cssLitGroup:[a[27],a[48]],cssFns:[]},volume:{cssPropBits:1,cssLitGroup:[a[17],a[69]],
cssFns:[]},"white-space":{cssPropBits:0,cssLitGroup:[a[22],a[72]],cssFns:[]},width:"min-height","word-break":{cssPropBits:0,cssLitGroup:[a[32],a[72]],cssFns:[]},"word-spacing":"letter-spacing","word-wrap":"overflow-wrap","z-index":"bottom",zoom:"line-height","cubic-bezier()":"animation-delay","steps()":{cssPropBits:5,cssLitGroup:[a[36],a[48]],cssFns:[]},"image()":{cssPropBits:18,cssLitGroup:[a[0],a[48]],cssFns:["rgb()","rgba()"]},"linear-gradient()":{cssPropBits:7,cssLitGroup:[a[0],a[31],a[42],a[48],
a[79]],cssFns:["rgb()","rgba()"]},"radial-gradient()":{cssPropBits:7,cssLitGroup:[a[0],a[11],a[31],a[42],a[48],a[56],a[57]],cssFns:["rgb()","rgba()"]},"repeating-linear-gradient()":"linear-gradient()","repeating-radial-gradient()":"radial-gradient()","rgb()":{cssPropBits:1,cssLitGroup:[a[48]],cssFns:[]},"rgba()":"rgb()","rect()":{cssPropBits:5,cssLitGroup:[a[48],a[52]],cssFns:[]},"alpha()":{cssPropBits:1,cssLitGroup:[a[28]],cssFns:[]},"matrix()":"animation-delay","perspective()":"border-bottom-left-radius",
cssFns:[]},"white-space":{cssPropBits:0,cssLitGroup:[a[22],a[72]],cssFns:[]},width:"min-height","word-break":{cssPropBits:0,cssLitGroup:[a[32],a[72],a[55]],cssFns:[]},"word-spacing":"letter-spacing","word-wrap":"overflow-wrap","z-index":"bottom",zoom:"line-height","cubic-bezier()":"animation-delay","steps()":{cssPropBits:5,cssLitGroup:[a[36],a[48]],cssFns:[]},"image()":{cssPropBits:18,cssLitGroup:[a[0],a[48]],cssFns:["rgb()","rgba()"]},"linear-gradient()":{cssPropBits:7,cssLitGroup:[a[0],a[31],a[42],
a[48],a[79]],cssFns:["rgb()","rgba()"]},"radial-gradient()":{cssPropBits:7,cssLitGroup:[a[0],a[11],a[31],a[42],a[48],a[56],a[57]],cssFns:["rgb()","rgba()"]},"repeating-linear-gradient()":"linear-gradient()","repeating-radial-gradient()":"radial-gradient()","rgb()":{cssPropBits:1,cssLitGroup:[a[48]],cssFns:[]},"rgba()":"rgb()","rect()":{cssPropBits:5,cssLitGroup:[a[48],a[52]],cssFns:[]},"alpha()":{cssPropBits:1,cssLitGroup:[a[28]],cssFns:[]},"matrix()":"animation-delay","perspective()":"border-bottom-left-radius",
"rotate()":"border-bottom-left-radius","rotate3d()":"animation-delay","rotatex()":"border-bottom-left-radius","rotatey()":"border-bottom-left-radius","rotatez()":"border-bottom-left-radius","scale()":"animation-delay","scale3d()":"animation-delay","scalex()":"border-bottom-left-radius","scaley()":"border-bottom-left-radius","scalez()":"border-bottom-left-radius","skew()":"animation-delay","skewx()":"border-bottom-left-radius","skewy()":"border-bottom-left-radius","translate()":"animation-delay","translate3d()":"animation-delay",
"translatex()":"border-bottom-left-radius","translatey()":"border-bottom-left-radius","translatez()":"border-bottom-left-radius"},c;for(c in b)"string"===typeof b[c]&&Object.hasOwnProperty.call(b,c)&&(b[c]=b[b[c]]);"undefined"!==typeof window&&(window.cssSchema=b);var d,e;(function(){function a(a){var b=parseInt(a.substring(1),16);return 65535<b?(b-=65536,String.fromCharCode(55296+(b>>10),56320+(b&1023))):b==b?String.fromCharCode(b):" ">a[1]?"":a[1]}function b(a,b){return'"'+a.replace(/[\u0000-\u001f\\\"<>]/g,
b)+'"'}function c(a){return g[a]||(g[a]="\\"+a.charCodeAt(0).toString(16)+" ")}function f(a){return h[a]||(h[a]=("">a?"%0":"%")+a.charCodeAt(0).toString(16))}var g={"\\":"\\\\"},h={"\\":"%5c"},k=RegExp("\\uFEFF|U[+][0-9A-F?]{1,6}(?:-[0-9A-F]{1,6})?|url[(][\\t\\n\\f ]*(?:\"(?:'|[^'\"\\n\\f\\\\]|\\\\[\\s\\S])*\"|'(?:\"|[^'\"\\n\\f\\\\]|\\\\[\\s\\S])*'|(?:[\\t\\x21\\x23-\\x26\\x28-\\x5b\\x5d-\\x7e]|[\\u0080-\\ud7ff\\ue000-\\ufffd]|[\\ud800-\\udbff][\\udc00-\\udfff]|\\\\(?:[0-9a-fA-F]{1,6}[\\t\\n\\f ]?|[\\u0020-\\u007e\\u0080-\\ud7ff\\ue000\\ufffd]|[\\ud800-\\udbff][\\udc00-\\udfff]))*)[\\t\\n\\f ]*[)]|(?!url[(])-?(?:[a-zA-Z_]|[\\u0080-\\ud7ff\\ue000-\\ufffd]|[\\ud800-\\udbff][\\udc00-\\udfff]|\\\\(?:[0-9a-fA-F]{1,6}[\\t\\n\\f ]?|[\\u0020-\\u007e\\u0080-\\ud7ff\\ue000\\ufffd]|[\\ud800-\\udbff][\\udc00-\\udfff]))(?:[a-zA-Z0-9_-]|[\\u0080-\\ud7ff\\ue000-\\ufffd]|[\\ud800-\\udbff][\\udc00-\\udfff]|\\\\(?:[0-9a-fA-F]{1,6}[\\t\\n\\f ]?|[\\u0020-\\u007e\\u0080-\\ud7ff\\ue000\\ufffd]|[\\ud800-\\udbff][\\udc00-\\udfff]))*[(]|(?:@?-?(?:[a-zA-Z_]|[\\u0080-\\ud7ff\\ue000-\\ufffd]|[\\ud800-\\udbff][\\udc00-\\udfff]|\\\\(?:[0-9a-fA-F]{1,6}[\\t\\n\\f ]?|[\\u0020-\\u007e\\u0080-\\ud7ff\\ue000\\ufffd]|[\\ud800-\\udbff][\\udc00-\\udfff]))|#)(?:[a-zA-Z0-9_-]|[\\u0080-\\ud7ff\\ue000-\\ufffd]|[\\ud800-\\udbff][\\udc00-\\udfff]|\\\\(?:[0-9a-fA-F]{1,6}[\\t\\n\\f ]?|[\\u0020-\\u007e\\u0080-\\ud7ff\\ue000\\ufffd]|[\\ud800-\\udbff][\\udc00-\\udfff]))*|\"(?:'|[^'\"\\n\\f\\\\]|\\\\[\\s\\S])*\"|'(?:\"|[^'\"\\n\\f\\\\]|\\\\[\\s\\S])*'|[-+]?(?:[0-9]+(?:[.][0-9]+)?|[.][0-9]+)(?:%|-?(?:[a-zA-Z_]|[\\u0080-\\ud7ff\\ue000-\\ufffd]|[\\ud800-\\udbff][\\udc00-\\udfff]|\\\\(?:[0-9a-fA-F]{1,6}[\\t\\n\\f ]?|[\\u0020-\\u007e\\u0080-\\ud7ff\\ue000\\ufffd]|[\\ud800-\\udbff][\\udc00-\\udfff]))(?:[a-zA-Z0-9_-]|[\\u0080-\\ud7ff\\ue000-\\ufffd]|[\\ud800-\\udbff][\\udc00-\\udfff]|\\\\(?:[0-9a-fA-F]{1,6}[\\t\\n\\f ]?|[\\u0020-\\u007e\\u0080-\\ud7ff\\ue000\\ufffd]|[\\ud800-\\udbff][\\udc00-\\udfff]))*)?|\x3c!--|--\x3e|[\\t\\n\\f ]+|/(?:[*][^*]*[*]+(?:[^/][^*]*[*]+)*/|/[^\\n\\f]*)|[~|^$*]=|[^\"'\\\\/]|/(?![/*])",
@ -184,7 +184,7 @@ f)+"\n"+t+"}":"{"+z.join(",")+"}";f=t;return l}}"function"!==typeof Date.prototy
e=/[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,f,g,h={"\b":"\\b","\t":"\\t","\n":"\\n","\f":"\\f","\r":"\\r",'"':'\\"',"\\":"\\\\"},k;"function"!==typeof JSON.stringify&&(JSON.stringify=function(a,b,d){var e;g=f="";if("number"===typeof d)for(e=0;e<d;e+=1)g+=" ";else"string"===typeof d&&(g=d);if((k=b)&&"function"!==typeof b&&("object"!==typeof b||"number"!==typeof b.length))throw Error("JSON.stringify");return c("",{"":a})});
"function"!==typeof JSON.parse&&(JSON.parse=function(a,b){function c(a,d){var e,f,g=a[d];if(g&&"object"===typeof g)for(e in g)Object.prototype.hasOwnProperty.call(g,e)&&(f=c(g,e),void 0!==f?g[e]=f:delete g[e]);return b.call(a,d,g)}var e;a=""+a;d.lastIndex=0;d.test(a)&&(a=a.replace(d,function(a){return"\\u"+("0000"+a.charCodeAt(0).toString(16)).slice(-4)}));if(/^[\],:{}\s]*$/.test(a.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,"@").replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,
"]").replace(/(?:^|:|,)(?:\s*\[)+/g,"")))return e=eval("("+a+")"),"function"===typeof b?c({"":e},""):e;throw new SyntaxError("JSON.parse");})})();"undefined"===typeof window.mxBasePath&&(window.mxBasePath="https://www.draw.io/mxgraph/");window.mxLoadStylesheets=window.mxLoadStylesheets||!1;window.mxLoadResources=window.mxLoadResources||!1;window.mxLanguage=window.mxLanguage||"en";window.urlParams=window.urlParams||{};window.MAX_REQUEST_SIZE=window.MAX_REQUEST_SIZE||10485760;window.MAX_AREA=window.MAX_AREA||225E6;window.EXPORT_URL=window.EXPORT_URL||"/export";window.SAVE_URL=window.SAVE_URL||"/save";window.OPEN_URL=window.OPEN_URL||"/open";window.RESOURCES_PATH=window.RESOURCES_PATH||"resources";window.RESOURCE_BASE=window.RESOURCE_BASE||window.RESOURCES_PATH+"/grapheditor";window.STENCIL_PATH=window.STENCIL_PATH||"stencils";window.IMAGE_PATH=window.IMAGE_PATH||"images";
window.STYLE_PATH=window.STYLE_PATH||"styles";window.CSS_PATH=window.CSS_PATH||"styles";window.OPEN_FORM=window.OPEN_FORM||"open.html";window.mxBasePath=window.mxBasePath||"../../../src";window.mxLanguage=window.mxLanguage||urlParams.lang;window.mxLanguages=window.mxLanguages||["de"];var mxClient={VERSION:"9.3.1",IS_IE:0<=navigator.userAgent.indexOf("MSIE"),IS_IE6:0<=navigator.userAgent.indexOf("MSIE 6"),IS_IE11:!!navigator.userAgent.match(/Trident\/7\./),IS_EDGE:!!navigator.userAgent.match(/Edge\//),IS_QUIRKS:0<=navigator.userAgent.indexOf("MSIE")&&(null==document.documentMode||5==document.documentMode),IS_EM:"spellcheck"in document.createElement("textarea")&&8==document.documentMode,VML_PREFIX:"v",OFFICE_PREFIX:"o",IS_NS:0<=navigator.userAgent.indexOf("Mozilla/")&&0>navigator.userAgent.indexOf("MSIE")&&
window.STYLE_PATH=window.STYLE_PATH||"styles";window.CSS_PATH=window.CSS_PATH||"styles";window.OPEN_FORM=window.OPEN_FORM||"open.html";window.mxBasePath=window.mxBasePath||"../../../src";window.mxLanguage=window.mxLanguage||urlParams.lang;window.mxLanguages=window.mxLanguages||["de"];var mxClient={VERSION:"9.3.4",IS_IE:0<=navigator.userAgent.indexOf("MSIE"),IS_IE6:0<=navigator.userAgent.indexOf("MSIE 6"),IS_IE11:!!navigator.userAgent.match(/Trident\/7\./),IS_EDGE:!!navigator.userAgent.match(/Edge\//),IS_QUIRKS:0<=navigator.userAgent.indexOf("MSIE")&&(null==document.documentMode||5==document.documentMode),IS_EM:"spellcheck"in document.createElement("textarea")&&8==document.documentMode,VML_PREFIX:"v",OFFICE_PREFIX:"o",IS_NS:0<=navigator.userAgent.indexOf("Mozilla/")&&0>navigator.userAgent.indexOf("MSIE")&&
0>navigator.userAgent.indexOf("Edge/"),IS_OP:0<=navigator.userAgent.indexOf("Opera/")||0<=navigator.userAgent.indexOf("OPR/"),IS_OT:0<=navigator.userAgent.indexOf("Presto/")&&0>navigator.userAgent.indexOf("Presto/2.4.")&&0>navigator.userAgent.indexOf("Presto/2.3.")&&0>navigator.userAgent.indexOf("Presto/2.2.")&&0>navigator.userAgent.indexOf("Presto/2.1.")&&0>navigator.userAgent.indexOf("Presto/2.0.")&&0>navigator.userAgent.indexOf("Presto/1."),IS_SF:0<=navigator.userAgent.indexOf("AppleWebKit/")&&
0>navigator.userAgent.indexOf("Chrome/")&&0>navigator.userAgent.indexOf("Edge/"),IS_IOS:navigator.userAgent.match(/(iPad|iPhone|iPod)/g)?!0:!1,IS_GC:0<=navigator.userAgent.indexOf("Chrome/")&&0>navigator.userAgent.indexOf("Edge/"),IS_CHROMEAPP:null!=window.chrome&&null!=chrome.app&&null!=chrome.app.runtime,IS_FF:0<=navigator.userAgent.indexOf("Firefox/"),IS_MT:0<=navigator.userAgent.indexOf("Firefox/")&&0>navigator.userAgent.indexOf("Firefox/1.")&&0>navigator.userAgent.indexOf("Firefox/2.")||0<=navigator.userAgent.indexOf("Iceweasel/")&&
0>navigator.userAgent.indexOf("Iceweasel/1.")&&0>navigator.userAgent.indexOf("Iceweasel/2.")||0<=navigator.userAgent.indexOf("SeaMonkey/")&&0>navigator.userAgent.indexOf("SeaMonkey/1.")||0<=navigator.userAgent.indexOf("Iceape/")&&0>navigator.userAgent.indexOf("Iceape/1."),IS_SVG:0<=navigator.userAgent.indexOf("Firefox/")||0<=navigator.userAgent.indexOf("Iceweasel/")||0<=navigator.userAgent.indexOf("Seamonkey/")||0<=navigator.userAgent.indexOf("Iceape/")||0<=navigator.userAgent.indexOf("Galeon/")||
@ -615,7 +615,7 @@ mxSwimlane.prototype.paintDivider=function(a,b,c,d,e,f,g){g||a.setShadow(!1);a.b
mxSwimlane.prototype.getImageBounds=function(a,b,c,d){return this.isHorizontal()?new mxRectangle(a+c-this.imageSize,b,this.imageSize,this.imageSize):new mxRectangle(a,b,this.imageSize,this.imageSize)};function mxGraphLayout(a){this.graph=a}mxGraphLayout.prototype.graph=null;mxGraphLayout.prototype.useBoundingBox=!0;mxGraphLayout.prototype.parent=null;mxGraphLayout.prototype.moveCell=function(a,b,c){};mxGraphLayout.prototype.execute=function(a){};mxGraphLayout.prototype.getGraph=function(){return this.graph};
mxGraphLayout.prototype.getConstraint=function(a,b,c,d){c=this.graph.view.getState(b);b=null!=c?c.style:this.graph.getCellStyle(b);return null!=b?b[a]:null};
mxGraphLayout.traverse=function(a,b,c,d,e){if(null!=c&&null!=a&&(b=null!=b?b:!0,e=e||new mxDictionary,!e.get(a)&&(e.put(a,!0),d=c(a,d),null==d||d))&&(d=this.graph.model.getEdgeCount(a),0<d))for(var f=0;f<d;f++){var g=this.graph.model.getEdgeAt(a,f),h=this.graph.model.getTerminal(g,!0)==a;if(!b||h)h=this.graph.view.getVisibleTerminal(g,!h),this.traverse(h,b,c,g,e)}};
mxGraphLayout.prototype.isAncestor=function(a,b,c){if(!c)return this.graph.model.getParent(cell)==a;if(b==a)return!1;for(;null!=b&&b!=a;)b=this.graph.model.getParent(b);return b==a};mxGraphLayout.prototype.isVertexMovable=function(a){return this.graph.isCellMovable(a)};mxGraphLayout.prototype.isVertexIgnored=function(a){return!this.graph.getModel().isVertex(a)||!this.graph.isCellVisible(a)};
mxGraphLayout.prototype.isAncestor=function(a,b,c){if(!c)return this.graph.model.getParent(b)==a;if(b==a)return!1;for(;null!=b&&b!=a;)b=this.graph.model.getParent(b);return b==a};mxGraphLayout.prototype.isVertexMovable=function(a){return this.graph.isCellMovable(a)};mxGraphLayout.prototype.isVertexIgnored=function(a){return!this.graph.getModel().isVertex(a)||!this.graph.isCellVisible(a)};
mxGraphLayout.prototype.isEdgeIgnored=function(a){var b=this.graph.getModel();return!b.isEdge(a)||!this.graph.isCellVisible(a)||null==b.getTerminal(a,!0)||null==b.getTerminal(a,!1)};mxGraphLayout.prototype.setEdgeStyleEnabled=function(a,b){this.graph.setCellStyles(mxConstants.STYLE_NOEDGESTYLE,b?"0":"1",[a])};mxGraphLayout.prototype.setOrthogonalEdge=function(a,b){this.graph.setCellStyles(mxConstants.STYLE_ORTHOGONAL,b?"1":"0",[a])};
mxGraphLayout.prototype.getParentOffset=function(a){var b=new mxPoint;if(null!=a&&a!=this.parent){var c=this.graph.getModel();if(c.isAncestor(this.parent,a))for(var d=c.getGeometry(a);a!=this.parent;)b.x+=d.x,b.y+=d.y,a=c.getParent(a),d=c.getGeometry(a)}return b};
mxGraphLayout.prototype.setEdgePoints=function(a,b){if(null!=a){var c=this.graph.model,d=c.getGeometry(a);null==d?(d=new mxGeometry,d.setRelative(!0)):d=d.clone();if(null!=this.parent&&null!=b)for(var e=c.getParent(a),e=this.getParentOffset(e),f=0;f<b.length;f++)b[f].x-=e.x,b[f].y-=e.y;d.points=b;c.setGeometry(a,d)}};
@ -1607,13 +1607,14 @@ Graph.prototype.isCellFoldable=function(a){var b=this.view.getState(a),b=null!=b
Graph.prototype.zoom=function(a,b){a=Math.max(.01,Math.min(this.view.scale*a,160))/this.view.scale;mxGraph.prototype.zoom.apply(this,arguments)};Graph.prototype.zoomIn=function(){.15>this.view.scale?this.zoom((this.view.scale+.01)/this.view.scale):this.zoom(Math.round(this.view.scale*this.zoomFactor*20)/20/this.view.scale)};Graph.prototype.zoomOut=function(){.15>=this.view.scale?this.zoom((this.view.scale-.01)/this.view.scale):this.zoom(Math.round(1/this.zoomFactor*this.view.scale*20)/20/this.view.scale)};
Graph.prototype.getTooltipForCell=function(a){var b="";if(mxUtils.isNode(a.value)){var c=a.value.getAttribute("tooltip");if(null!=c)null!=c&&this.isReplacePlaceholders(a)&&(c=this.replacePlaceholders(a,c)),b=this.sanitizeHtml(c);else{c=this.builtInProperties;a=a.value.attributes;var d=[];this.isEnabled()&&c.push("link");for(var e=0;e<a.length;e++)0>mxUtils.indexOf(c,a[e].nodeName)&&0<a[e].nodeValue.length&&d.push({name:a[e].nodeName,value:a[e].nodeValue});d.sort(function(a,b){return a.name<b.name?
-1:a.name>b.name?1:0});for(e=0;e<d.length;e++)"link"==d[e].name&&this.isCustomLink(d[e].value)||(b+=("link"!=d[e].name?"<b>"+d[e].name+":</b> ":"")+mxUtils.htmlEntities(d[e].value)+"\n");0<b.length&&(b=b.substring(0,b.length-1),mxClient.IS_SVG&&(b='<div style="max-width:360px;">'+b+"</div>"))}}return b};Graph.prototype.stringToBytes=function(a){for(var b=Array(a.length),c=0;c<a.length;c++)b[c]=a.charCodeAt(c);return b};
Graph.prototype.bytesToString=function(a){for(var b=Array(a.length),c=0;c<a.length;c++)b[c]=String.fromCharCode(a[c]);return b.join("")};Graph.prototype.compress=function(a){if(null==a||0==a.length||"undefined"===typeof pako)return a;a=this.bytesToString(pako.deflateRaw(encodeURIComponent(a)));return window.btoa?btoa(a):Base64.encode(a,!0)};Graph.prototype.decompress=function(a){if(null==a||0==a.length||"undefined"===typeof pako)return a;a=window.atob?atob(a):Base64.decode(a,!0);return this.zapGremlins(decodeURIComponent(this.bytesToString(pako.inflateRaw(a))))};
Graph.prototype.zapGremlins=function(a){for(var b=[],c=0;c<a.length;c++){var d=a.charCodeAt(c);(32<=d||9==d||10==d||13==d)&&b.push(a.charAt(c))}return b.join("")};HoverIcons=function(a){this.graph=a;this.init()};HoverIcons.prototype.arrowSpacing=2;HoverIcons.prototype.updateDelay=500;HoverIcons.prototype.activationDelay=140;HoverIcons.prototype.currentState=null;HoverIcons.prototype.activeArrow=null;HoverIcons.prototype.inactiveOpacity=15;HoverIcons.prototype.cssCursor="copy";
HoverIcons.prototype.checkCollisions=!0;HoverIcons.prototype.arrowFill="#29b6f2";HoverIcons.prototype.triangleUp=mxClient.IS_SVG?Graph.createSvgImage(18,28,'<path d="m 6 26 L 12 26 L 12 12 L 18 12 L 9 1 L 1 12 L 6 12 z" stroke="#fff" fill="'+HoverIcons.prototype.arrowFill+'"/>'):new mxImage(IMAGE_PATH+"/triangle-up.png",26,14);
HoverIcons.prototype.triangleRight=mxClient.IS_SVG?Graph.createSvgImage(26,18,'<path d="m 1 6 L 14 6 L 14 1 L 26 9 L 14 18 L 14 12 L 1 12 z" stroke="#fff" fill="'+HoverIcons.prototype.arrowFill+'"/>'):new mxImage(IMAGE_PATH+"/triangle-right.png",14,26);HoverIcons.prototype.triangleDown=mxClient.IS_SVG?Graph.createSvgImage(18,26,'<path d="m 6 1 L 6 14 L 1 14 L 9 26 L 18 14 L 12 14 L 12 1 z" stroke="#fff" fill="'+HoverIcons.prototype.arrowFill+'"/>'):new mxImage(IMAGE_PATH+"/triangle-down.png",26,14);
HoverIcons.prototype.triangleLeft=mxClient.IS_SVG?Graph.createSvgImage(28,18,'<path d="m 1 9 L 12 1 L 12 6 L 26 6 L 26 12 L 12 12 L 12 18 z" stroke="#fff" fill="'+HoverIcons.prototype.arrowFill+'"/>'):new mxImage(IMAGE_PATH+"/triangle-left.png",14,26);HoverIcons.prototype.roundDrop=mxClient.IS_SVG?Graph.createSvgImage(26,26,'<circle cx="13" cy="13" r="12" stroke="#fff" fill="'+HoverIcons.prototype.arrowFill+'"/>'):new mxImage(IMAGE_PATH+"/round-drop.png",26,26);
HoverIcons.prototype.refreshTarget=new mxImage(mxClient.IS_SVG?"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACYAAAAmCAYAAACoPemuAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBNYWNpbnRvc2giIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NDQxNERDRTU1QjY1MTFFNDkzNTRFQTVEMTdGMTdBQjciIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NDQxNERDRTY1QjY1MTFFNDkzNTRFQTVEMTdGMTdBQjciPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo0NDE0RENFMzVCNjUxMUU0OTM1NEVBNUQxN0YxN0FCNyIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo0NDE0RENFNDVCNjUxMUU0OTM1NEVBNUQxN0YxN0FCNyIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PsvuX50AAANaSURBVHja7FjRZ1tRGD9ZJ1NCyIQSwrivI4Q8hCpjlFDyFEoYfSp9Ko1QWnmo0If+BSXkIfo0QirTMUpeGo2EPfWllFYjZMLKLDJn53d3biU337m5J223bPbxk5t7v+/c3/2+73znO8fDOWezKM/YjMpz68Lj8ejY+QTeCCwLxOS9qPxtyN+6wAeBTwJ31CCO0cJDjXBGBN4LfIepSwykTUT1bgpuib0SONIgo8KRHOtRiCFcvUcgZeGrHPNBxLIyFPyRgTGz0xLbegJCdmzpElue5KlAIMDX19d5uVzm5+fnfDAYmMA17uEZdOx2Yvb/sHlu2S0xwymn5ufneTab5b1ej08S6EAXNrDd2dnhiUTim21MvMtwQ6yiIrWwsMDPzs64rsBmf3/fvM7n89TYlUnEllSkQqEQv7q64g+Vk5MTVXosORErU0Zer5f0FEIlw2N6MxwO82QyaXql2+2SxDqdjopYWUUsqEp45IldqtWq6UWVh/1+P7+8vCTJ4QMUJSRIEXuneoH96w8PDyeWAnhSJfCqwm6NIlaklFdXV0cGhRcQ2mlJQXK5nMq2YPEZbnteU1U2lUqN/D84OGD9fl+5fgnSrFarsUwmw0qlEru4uBjTicViTk3Cr27HSnxR+Doyz0ZE1CAWiUTusbu7y9rttlZv5fP5WDQavYfIMba4uEipfhF8XtqJoZXx/uH+sC/4vPg7OljZZQbsCmLtYzc3N6zRaJhotVrmfx0xDINtbm6athYUeXpHdbBNaqZUKpWxWXV7e2vex+xaWVnhc3NzjrPUXgexyCt0m67LBV7uJMITjqRE4o8tZeg8FPpFitgapYxiOC0poFgsji1jKNo6BZZckrAGUtJsNk1vqAihCBcKhTE7hNWhqw2qFnGy5UFOUYJVIJ1OjzSE+BCEilon0URavRmBqnbbQ00AXbm+vnZc9O1tj72OnQoc2+cwygRkb2+P1et17ZoEm3g87lRmjgWZ00kbXkNuse6/Bu2wlegIxfb2tuvWGroO4bO2c4bbzUh60mxDXm1sbJhhxkQYnhS4h2fUZoRAWnf7lv8N27f8P7Xhnekjgpk+VKGOoQbsiY+hhhtF3YO7twIJ+ULvUGv+GQ2fQEvWxI/THNx5/p/BaspPAQYAqStgiSQwCDoAAAAASUVORK5CYII=":
IMAGE_PATH+"/refresh.png",38,38);HoverIcons.prototype.tolerance=mxClient.IS_TOUCH?6:0;
Graph.prototype.bytesToString=function(a){for(var b=Array(a.length),c=0;c<a.length;c++)b[c]=String.fromCharCode(a[c]);return b.join("")};Graph.prototype.compressNode=function(a){return this.compress(this.zapGremlins(mxUtils.getXml(a)))};Graph.prototype.compress=function(a){if(null==a||0==a.length||"undefined"===typeof pako)return a;a=this.bytesToString(pako.deflateRaw(encodeURIComponent(a)));return window.btoa?btoa(a):Base64.encode(a,!0)};
Graph.prototype.decompress=function(a){if(null==a||0==a.length||"undefined"===typeof pako)return a;a=window.atob?atob(a):Base64.decode(a,!0);return this.zapGremlins(decodeURIComponent(this.bytesToString(pako.inflateRaw(a))))};Graph.prototype.zapGremlins=function(a){for(var b=[],c=0;c<a.length;c++){var d=a.charCodeAt(c);(32<=d||9==d||10==d||13==d)&&b.push(a.charAt(c))}return b.join("")};HoverIcons=function(a){this.graph=a;this.init()};HoverIcons.prototype.arrowSpacing=2;
HoverIcons.prototype.updateDelay=500;HoverIcons.prototype.activationDelay=140;HoverIcons.prototype.currentState=null;HoverIcons.prototype.activeArrow=null;HoverIcons.prototype.inactiveOpacity=15;HoverIcons.prototype.cssCursor="copy";HoverIcons.prototype.checkCollisions=!0;HoverIcons.prototype.arrowFill="#29b6f2";
HoverIcons.prototype.triangleUp=mxClient.IS_SVG?Graph.createSvgImage(18,28,'<path d="m 6 26 L 12 26 L 12 12 L 18 12 L 9 1 L 1 12 L 6 12 z" stroke="#fff" fill="'+HoverIcons.prototype.arrowFill+'"/>'):new mxImage(IMAGE_PATH+"/triangle-up.png",26,14);HoverIcons.prototype.triangleRight=mxClient.IS_SVG?Graph.createSvgImage(26,18,'<path d="m 1 6 L 14 6 L 14 1 L 26 9 L 14 18 L 14 12 L 1 12 z" stroke="#fff" fill="'+HoverIcons.prototype.arrowFill+'"/>'):new mxImage(IMAGE_PATH+"/triangle-right.png",14,26);
HoverIcons.prototype.triangleDown=mxClient.IS_SVG?Graph.createSvgImage(18,26,'<path d="m 6 1 L 6 14 L 1 14 L 9 26 L 18 14 L 12 14 L 12 1 z" stroke="#fff" fill="'+HoverIcons.prototype.arrowFill+'"/>'):new mxImage(IMAGE_PATH+"/triangle-down.png",26,14);HoverIcons.prototype.triangleLeft=mxClient.IS_SVG?Graph.createSvgImage(28,18,'<path d="m 1 9 L 12 1 L 12 6 L 26 6 L 26 12 L 12 12 L 12 18 z" stroke="#fff" fill="'+HoverIcons.prototype.arrowFill+'"/>'):new mxImage(IMAGE_PATH+"/triangle-left.png",14,26);
HoverIcons.prototype.roundDrop=mxClient.IS_SVG?Graph.createSvgImage(26,26,'<circle cx="13" cy="13" r="12" stroke="#fff" fill="'+HoverIcons.prototype.arrowFill+'"/>'):new mxImage(IMAGE_PATH+"/round-drop.png",26,26);
HoverIcons.prototype.refreshTarget=new mxImage(mxClient.IS_SVG?"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACYAAAAmCAYAAACoPemuAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBNYWNpbnRvc2giIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NDQxNERDRTU1QjY1MTFFNDkzNTRFQTVEMTdGMTdBQjciIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NDQxNERDRTY1QjY1MTFFNDkzNTRFQTVEMTdGMTdBQjciPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo0NDE0RENFMzVCNjUxMUU0OTM1NEVBNUQxN0YxN0FCNyIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo0NDE0RENFNDVCNjUxMUU0OTM1NEVBNUQxN0YxN0FCNyIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PsvuX50AAANaSURBVHja7FjRZ1tRGD9ZJ1NCyIQSwrivI4Q8hCpjlFDyFEoYfSp9Ko1QWnmo0If+BSXkIfo0QirTMUpeGo2EPfWllFYjZMLKLDJn53d3biU337m5J223bPbxk5t7v+/c3/2+73znO8fDOWezKM/YjMpz68Lj8ejY+QTeCCwLxOS9qPxtyN+6wAeBTwJ31CCO0cJDjXBGBN4LfIepSwykTUT1bgpuib0SONIgo8KRHOtRiCFcvUcgZeGrHPNBxLIyFPyRgTGz0xLbegJCdmzpElue5KlAIMDX19d5uVzm5+fnfDAYmMA17uEZdOx2Yvb/sHlu2S0xwymn5ufneTab5b1ej08S6EAXNrDd2dnhiUTim21MvMtwQ6yiIrWwsMDPzs64rsBmf3/fvM7n89TYlUnEllSkQqEQv7q64g+Vk5MTVXosORErU0Zer5f0FEIlw2N6MxwO82QyaXql2+2SxDqdjopYWUUsqEp45IldqtWq6UWVh/1+P7+8vCTJ4QMUJSRIEXuneoH96w8PDyeWAnhSJfCqwm6NIlaklFdXV0cGhRcQ2mlJQXK5nMq2YPEZbnteU1U2lUqN/D84OGD9fl+5fgnSrFarsUwmw0qlEru4uBjTicViTk3Cr27HSnxR+Doyz0ZE1CAWiUTusbu7y9rttlZv5fP5WDQavYfIMba4uEipfhF8XtqJoZXx/uH+sC/4vPg7OljZZQbsCmLtYzc3N6zRaJhotVrmfx0xDINtbm6athYUeXpHdbBNaqZUKpWxWXV7e2vex+xaWVnhc3NzjrPUXgexyCt0m67LBV7uJMITjqRE4o8tZeg8FPpFitgapYxiOC0poFgsji1jKNo6BZZckrAGUtJsNk1vqAihCBcKhTE7hNWhqw2qFnGy5UFOUYJVIJ1OjzSE+BCEilon0URavRmBqnbbQ00AXbm+vnZc9O1tj72OnQoc2+cwygRkb2+P1et17ZoEm3g87lRmjgWZ00kbXkNuse6/Bu2wlegIxfb2tuvWGroO4bO2c4bbzUh60mxDXm1sbJhhxkQYnhS4h2fUZoRAWnf7lv8N27f8P7Xhnekjgpk+VKGOoQbsiY+hhhtF3YO7twIJ+ULvUGv+GQ2fQEvWxI/THNx5/p/BaspPAQYAqStgiSQwCDoAAAAASUVORK5CYII=":IMAGE_PATH+
"/refresh.png",38,38);HoverIcons.prototype.tolerance=mxClient.IS_TOUCH?6:0;
HoverIcons.prototype.init=function(){this.arrowUp=this.createArrow(this.triangleUp,mxResources.get("plusTooltip"));this.arrowRight=this.createArrow(this.triangleRight,mxResources.get("plusTooltip"));this.arrowDown=this.createArrow(this.triangleDown,mxResources.get("plusTooltip"));this.arrowLeft=this.createArrow(this.triangleLeft,mxResources.get("plusTooltip"));this.elts=[this.arrowUp,this.arrowRight,this.arrowDown,this.arrowLeft];this.repaintHandler=mxUtils.bind(this,function(){this.repaint()});this.graph.selectionModel.addListener(mxEvent.CHANGE,
this.repaintHandler);this.graph.model.addListener(mxEvent.CHANGE,this.repaintHandler);this.graph.view.addListener(mxEvent.SCALE_AND_TRANSLATE,this.repaintHandler);this.graph.view.addListener(mxEvent.TRANSLATE,this.repaintHandler);this.graph.view.addListener(mxEvent.SCALE,this.repaintHandler);this.graph.view.addListener(mxEvent.DOWN,this.repaintHandler);this.graph.view.addListener(mxEvent.UP,this.repaintHandler);this.graph.addListener(mxEvent.ROOT,this.repaintHandler);this.graph.addListener(mxEvent.ESCAPE,
mxUtils.bind(this,function(){this.mouseDownPoint=null}));mxEvent.addListener(this.graph.container,"mouseleave",mxUtils.bind(this,function(a){null!=a.relatedTarget&&mxEvent.getSource(a)==this.graph.container&&this.setDisplay("none")}));this.graph.addListener(mxEvent.START_EDITING,mxUtils.bind(this,function(a){this.reset()}));var a=this.graph.click;this.graph.click=mxUtils.bind(this,function(b){a.apply(this.graph,arguments);null==this.currentState||this.graph.isCellSelected(this.currentState.cell)||

View file

@ -592,7 +592,7 @@ c,b,p)}};h.prototype.sanitiseGraph=function(c){var b=c.getModel().getRoot();this
-1==p.indexOf(mxConstants.STYLE_STROKECOLOR+"=none")||-1!=p.indexOf("image=")?!1:!0};return h}();w.mxVsdxCodec=l;l.__class="com.mxgraph.io.mxVsdxCodec"})(m.io||(m.io={}))})(c.mxgraph||(c.mxgraph={}))})(com||(com={}));
(function(c){(function(m){(function(w){var l=function(h){function f(){var b=h.call(this)||this;b.RESPONSE_END="";b.RESPONSE_DIAGRAM_START="";b.RESPONSE_DIAGRAM_END="";b.RESPONSE_HEADER="";return b}__extends(f,h);f.prototype.decodeVssx=function(b,a,d){var g=this,p="<mxlibrary>[";this.decodeVsdx(b,function(b){p=p.concat(b);var d=g.vsdxModel.getMasterShapes(),f=function(a){var b=0;return{next:function(){return b<a.length?a[b++]:null},hasNext:function(){return b<a.length}}}(function(a){var b=[];null==
a.entries&&(a.entries=[]);for(var d=0;d<a.entries.length;d++)b.push(a.entries[d].value);return b}(g.vsdxModel.getPages())).next();if(null!=d){var D={str:"",toString:function(){return this.str}},l=0===b.length?"":",",w=function(a){return Object.keys(a).map(function(b){return a[b]})}(d);b=function(a){a=w[a];var b=m.createMxGraph(),g=a.getMasterShape().getShape(),g=new c.mxgraph.io.vsdx.VsdxShape(f,g,!f.isEdge(g),d,null,m.vsdxModel),p=1;if(null!=a.pageSheet){var x=p=1,E=a.pageSheet.DrawingScale;null!=
E&&(p=parseFloat(E.getAttribute("V")));E=a.pageSheet.PageScale;null!=E&&(x=parseFloat(E.getAttribute("V")));p=x/p}x=null;if(g.isVertex())for(m.edgeShapeMap.entries=[],m.parentsMap.entries=[],x=m.addShape(b,g,b.getDefaultParent(),0,1169),g=function(a){null==a.entries&&(a.entries=[]);return a.entries}(m.edgeShapeMap),E=0;E<g.length;E++){var t=g[E],z=function(a,b){null==a.entries&&(a.entries=[]);for(var d=0;d<a.entries.length;d++)if(null!=a.entries[d].key.equals&&a.entries[d].key.equals(b)||a.entries[d].key===
E&&(p=parseFloat(E.getAttribute("V"))||1);E=a.pageSheet.PageScale;null!=E&&(x=parseFloat(E.getAttribute("V"))||1);p=x/p}x=null;if(g.isVertex())for(m.edgeShapeMap.entries=[],m.parentsMap.entries=[],x=m.addShape(b,g,b.getDefaultParent(),0,1169),g=function(a){null==a.entries&&(a.entries=[]);return a.entries}(m.edgeShapeMap),E=0;E<g.length;E++){var t=g[E],z=function(a,b){null==a.entries&&(a.entries=[]);for(var d=0;d<a.entries.length;d++)if(null!=a.entries[d].key.equals&&a.entries[d].key.equals(b)||a.entries[d].key===
b)return a.entries[d].value;return null}(m.parentsMap,t.getKey());m.addUnconnectedEdge(b,z,t.getValue(),1169)}else x=m.addUnconnectedEdge(b,null,g,1169);if(null!=x){m.scaleGraph(b,p);g=m.normalizeGeo(x);m.sanitiseGraph(b);if(0===b.getModel().getChildCount(b.getDefaultParent()))return"continue";D.str=D.str.concat(l);D.str=D.str.concat('{"xml":"');b=h.prototype.processPage.call(m,b,null);D.str=D.str.concat(b);D.str=D.str.concat('","w":');D.str=D.str.concat(g.width);D.str=D.str.concat(',"h":');D.str=
D.str.concat(g.height);D.str=D.str.concat(',"title":');a=a.getName();null==a&&(a="");a=JSON.stringify(mxUtils.htmlEntities(a));D.str=D.str.concat(a);D.str=D.str.concat("}");l=","}};for(var m=g,C=0;C<w.length;C++)b(C);p=p.concat(D)}p=p.concat("]</mxlibrary>");a&&a(p)},d)};f.prototype.normalizeGeo=function(b){var a=b.getGeometry();a.x=0;a.y=0;var d=a.sourcePoint;if(b.isEdge()&&null!=d){this.transPoint(a.targetPoint,d);this.transPoint(a.offset,d);b=a.points;if(null!=b)for(var g=0;g<b.length;g++)this.transPoint(b[g],
d);this.transPoint(d,d)}return a};f.prototype.transPoint=function(b,a){null!=b&&(b.x-=a.x,b.y-=a.y)};f.prototype.processPage=function(b,a){var d=b.getModel(),g="",p="",f;for(f in d.cells){var E=d.cells[f];if(b.getDefaultParent()===d.getParent(E)){var g=g.concat(p),g=g.concat('{"xml":"'),x=this.createMxGraph();x.addCell(E);this.sanitiseGraph(x);if(0===x.getModel().getChildCount(x.getDefaultParent()))return"continue";p=this.normalizeGeo(E);x=h.prototype.processPage.call(this,x,null);g=g.concat(x);g=
@ -600,8 +600,8 @@ g.concat('","w":');g=g.concat(p.width);g=g.concat(',"h":');g=g.concat(p.height);
p.entries[t].key===x){p=p.entries[t].value;break a}p=null}null!=p&&(E=p.getName())}g=g.concat(E);g=g.concat('"}');p=","}}this.RESPONSE_DIAGRAM_START=0<g.length?",":"";return g};return f}(c.mxgraph.io.mxVsdxCodec);w.mxVssxCodec=l;l.__class="com.mxgraph.io.mxVssxCodec"})(m.io||(m.io={}))})(c.mxgraph||(c.mxgraph={}))})(com||(com={}));
(function(c){(function(c){(function(c){(function(c){(function(c){var f=function(){function b(a,b,g){this.formulaE=this.formulaA=this.d=this.c=this.b=this.a=this.y=this.x=null;this.index=0;this.index=a;this.x=b;this.y=g}b.prototype.getX=function(){return this.x};b.prototype.getY=function(){return this.y};b.prototype.getA=function(){return this.a};b.prototype.getB=function(){return this.b};b.prototype.getC=function(){return this.c};b.prototype.getD=function(){return this.d};b.prototype.getFormulaA=
function(){return this.formulaA};b.prototype.getFormulaE=function(){return this.formulaE};b.prototype.getIndex=function(){return this.index};return b}();c.Row=f;f.__class="com.mxgraph.io.vsdx.geometry.Row"})(c.geometry||(c.geometry={}))})(c.vsdx||(c.vsdx={}))})(c.io||(c.io={}))})(c.mxgraph||(c.mxgraph={}))})(com||(com={}));
(function(c){(function(m){(function(m){(function(l){(function(h){var f=function(){function b(){}b.getIndex=function(a){try{return parseInt(a.getAttribute("IX"))}catch(d){return 1}};b.getDoubleVal=function(a){try{if(null!=a&&0!==a.length){var b=parseFloat(a);if(isFinite(b))return b}}catch(g){}return null};b.getRowObj=function(a,d){var g=a.getAttribute("T"),p=b.getIndex(a),f;f=(f=a.getAttribute("Del"))&&f.equals?f.equals("1"):"1"===f;if(!f){var E=null;p<=d.length&&(E=d[p-1]);var x=f=null,t=null,h=null,
l=null,m=null,w=null,A=null;null!=E&&(f=E.x,x=E.y,t=E.getA(),h=E.getB(),l=E.getC(),m=E.getD(),A=E.getFormulaA(),w=E.getFormulaE());for(var E=c.mxgraph.io.vsdx.mxVsdxUtils.getDirectChildElements(a),F=0;F<E.length;F++){var B=E[F],Y=B.getAttribute("N"),J=B.getAttribute("V");switch(Y){case "X":f=b.getDoubleVal(J);break;case "Y":x=b.getDoubleVal(J);break;case "A":t=b.getDoubleVal(J);A=B.getAttribute("V");break;case "B":h=b.getDoubleVal(J);break;case "C":l=b.getDoubleVal(J);break;case "D":m=b.getDoubleVal(J);
(function(c){(function(m){(function(m){(function(l){(function(h){var f=function(){function b(){}b.getIndex=function(a){try{return parseInt(a.getAttribute("IX"))||1}catch(d){return 1}};b.getDoubleVal=function(a){try{if(null!=a&&0!==a.length){var b=parseFloat(a);if(isFinite(b))return b}}catch(g){}return null};b.getRowObj=function(a,d){var g=a.getAttribute("T"),p=b.getIndex(a),f;f=(f=a.getAttribute("Del"))&&f.equals?f.equals("1"):"1"===f;if(!f){var E=null;p<=d.length&&(E=d[p-1]);var x=f=null,t=null,
h=null,l=null,m=null,w=null,A=null;null!=E&&(f=E.x,x=E.y,t=E.getA(),h=E.getB(),l=E.getC(),m=E.getD(),A=E.getFormulaA(),w=E.getFormulaE());for(var E=c.mxgraph.io.vsdx.mxVsdxUtils.getDirectChildElements(a),F=0;F<E.length;F++){var B=E[F],Y=B.getAttribute("N"),J=B.getAttribute("V");switch(Y){case "X":f=b.getDoubleVal(J);break;case "Y":x=b.getDoubleVal(J);break;case "A":t=b.getDoubleVal(J);A=B.getAttribute("V");break;case "B":h=b.getDoubleVal(J);break;case "C":l=b.getDoubleVal(J);break;case "D":m=b.getDoubleVal(J);
break;case "E":w=J}}switch(g){case "MoveTo":return new c.mxgraph.io.vsdx.geometry.MoveTo(p,f,x);case "LineTo":return new c.mxgraph.io.vsdx.geometry.LineTo(p,f,x);case "ArcTo":return new c.mxgraph.io.vsdx.geometry.ArcTo(p,f,x,t);case "Ellipse":return new c.mxgraph.io.vsdx.geometry.Ellipse(p,f,x,t,h,l,m);case "EllipticalArcTo":return new c.mxgraph.io.vsdx.geometry.EllipticalArcTo(p,f,x,t,h,l,m);case "InfiniteLine":return new c.mxgraph.io.vsdx.geometry.InfiniteLine(p,f,x,t,h);case "NURBSTo":return new c.mxgraph.io.vsdx.geometry.NURBSTo(p,
f,x,t,h,l,m,w);case "PolylineTo":return new c.mxgraph.io.vsdx.geometry.PolylineTo(p,f,x,A);case "RelCubBezTo":return new c.mxgraph.io.vsdx.geometry.RelCubBezTo(p,f,x,t,h,l,m);case "RelEllipticalArcTo":return new c.mxgraph.io.vsdx.geometry.RelEllipticalArcTo(p,f,x,t,h,l,m);case "RelLineTo":return new c.mxgraph.io.vsdx.geometry.RelLineTo(p,f,x);case "RelMoveTo":return new c.mxgraph.io.vsdx.geometry.RelMoveTo(p,f,x);case "RelQuadBezTo":return new c.mxgraph.io.vsdx.geometry.RelQuadBezTo(p,f,x,t,h);case "SplineKnot":return new c.mxgraph.io.vsdx.geometry.SplineKnot(p,
f,x,t);case "SplineStart":return new c.mxgraph.io.vsdx.geometry.SplineStart(p,f,x,t,h,l,m)}}return new c.mxgraph.io.vsdx.geometry.DelRow(p)};return b}();h.RowFactory=f;f.__class="com.mxgraph.io.vsdx.geometry.RowFactory"})(l.geometry||(l.geometry={}))})(m.vsdx||(m.vsdx={}))})(m.io||(m.io={}))})(c.mxgraph||(c.mxgraph={}))})(com||(com={}));
@ -622,7 +622,7 @@ h.BULLET="Bullet";h.CASE="Case";h.CHARACTER="Character";h.COLOR="Color";h.COLOR_
"TextBlock";h.TEXT_STYLE="TextStyle";h.TO_PART="ToPart";h.TO_SHEET="ToSheet";h.TOP_MARGIN="TopMargin";h.TRUE="1";h.TXT_ANGLE="TxtAngle";h.TXT_HEIGHT="TxtHeight";h.TXT_LOC_PIN_X="TxtLocPinX";h.TXT_LOC_PIN_Y="TxtLocPinY";h.TXT_PIN_X="TxtPinX";h.TXT_PIN_Y="TxtPinY";h.TXT_WIDTH="TxtWidth";h.TYPE="Type";h.TYPE_GROUP="Group";h.TYPE_SHAPE="Shape";h.UNIQUE_ID="UniqueID";h.VERTICAL_ALIGN="VerticalAlign";h.WIDTH="Width";h.X_CON="XCon";h.X_DYN="XDyn";h.X="X";h.Y_CON="YCon";h.Y_DYN="YDyn";h.Y="Y";h.HIDE_TEXT=
"HideText";h.VSDX_ID="vsdxID";h.CONNECT_TO_PART_WHOLE_SHAPE=3;c.mxVsdxConstants=h;h.__class="com.mxgraph.io.vsdx.mxVsdxConstants"})(c.vsdx||(c.vsdx={}))})(c.io||(c.io={}))})(c.mxgraph||(c.mxgraph={}))})(com||(com={}));
(function(c){(function(m){(function(m){(function(l){var h=function(){function f(b,a){this.noQuickDrag=this.noSnap=this.noShow=this.noLine=this.noFill=!1;this.rows=null;if((null!=b&&1==b.nodeType||null===b)&&(null!=a&&a instanceof Array||null===a))Array.prototype.slice.call(arguments),this.index=0,this.noQuickDrag=this.noSnap=this.noShow=this.noLine=this.noFill=!1,this.rows=null,this.index=0,this.index=this.getIndex$org_w3c_dom_Element(b),null!=a&&this.index<a.length&&this.inheritGeo(a[this.index]),
this.processGeoElem(b);else if((null!=b&&1==b.nodeType||null===b)&&void 0===a)Array.prototype.slice.call(arguments),this.index=0,this.noQuickDrag=this.noSnap=this.noShow=this.noLine=this.noFill=!1,this.rows=null,this.index=0,this.index=this.getIndex$org_w3c_dom_Element(b),this.processGeoElem(b);else throw Error("invalid overload");}f.prototype.getIndex$org_w3c_dom_Element=function(b){try{return parseInt(b.getAttribute("IX"))}catch(a){return 0}};f.prototype.getIndex=function(b){if(null!=b&&1==b.nodeType||
this.processGeoElem(b);else if((null!=b&&1==b.nodeType||null===b)&&void 0===a)Array.prototype.slice.call(arguments),this.index=0,this.noQuickDrag=this.noSnap=this.noShow=this.noLine=this.noFill=!1,this.rows=null,this.index=0,this.index=this.getIndex$org_w3c_dom_Element(b),this.processGeoElem(b);else throw Error("invalid overload");}f.prototype.getIndex$org_w3c_dom_Element=function(b){try{return parseInt(b.getAttribute("IX"))||0}catch(a){return 0}};f.prototype.getIndex=function(b){if(null!=b&&1==b.nodeType||
null===b)return this.getIndex$org_w3c_dom_Element(b);if(void 0===b)return this.getIndex$();throw Error("invalid overload");};f.prototype.processGeoElem=function(b){var a=c.mxgraph.io.vsdx.mxVsdxUtils.getDirectChildNamedElements(b,"Cell");b=c.mxgraph.io.vsdx.mxVsdxUtils.getDirectChildNamedElements(b,"Row");if(null==this.rows){this.rows=[];for(var d=0;d<b.length;d++)0<this.rows.push(null)}for(d=0;d<a.length;d++){var g=a[d],p=g.getAttribute("N"),g=g.getAttribute("V");switch(p){case "NoFill":this.noFill=
function(a,b){return a&&a.equals?a.equals(b):a===b}("1",g);break;case "NoLine":this.noLine=function(a,b){return a&&a.equals?a.equals(b):a===b}("1",g);break;case "NoShow":this.noShow=function(a,b){return a&&a.equals?a.equals(b):a===b}("1",g);break;case "NoSnap":this.noSnap=function(a,b){return a&&a.equals?a.equals(b):a===b}("1",g);break;case "NoQuickDrag":this.noQuickDrag=function(a,b){return a&&a.equals?a.equals(b):a===b}("1",g)}}a=this.rows.length;d=!1;for(p=0;p<b.length;p++)g=c.mxgraph.io.vsdx.geometry.RowFactory.getRowObj(b[p],
this.rows),g.getIndex()>a?(0<this.rows.push(g),d=!0):this.rows[g.getIndex()-1]=g;d&&function(a,b){b.compare?a.sort(function(a,d){return b.compare(a,d)}):a.sort(b)}(this.rows,new f.mxVsdxGeometry$0(this))};f.prototype.inheritGeo=function(b){this.noFill=b.noFill;this.noLine=b.noLine;this.noShow=b.noShow;this.noSnap=b.noSnap;this.noQuickDrag=b.noQuickDrag;var a=this.rows=[];a.push.apply(a,b.rows)};f.prototype.getIndex$=function(){return this.index};f.prototype.isNoFill=function(){return this.noFill};
@ -877,7 +877,7 @@ this.geomListProcessed=!0}};b.prototype.parseShapeElem=function(a,d){f.prototype
a.equals?a.equals(b):a===b}(h,"Enhanced Metafile")||function(a,b){return a&&a.equals?a.equals(b):a===b}(h,"EnhMetaFile"))g="png";else return;h=a.firstChild;if(null!=h){if(null!=h&&1==h.nodeType){var l=h;if(function(a,b){return a&&a.equals?a.equals(b):a===b}(l.nodeName.toLowerCase(),"rel")&&(l=l.getAttribute("r:id"),null!=l&&0!==l.length)){var h=p.lastIndexOf("/"),m="",t="";try{m=p.substring(0,h),t=p.substring(h,p.length)}catch(z){return}h=d.getRelationship(l,m+"/_rels"+t+".rels");if(null!=h){p=h.getAttribute("Target")||
"";l=h.getAttribute("Type");h=p.lastIndexOf("/");try{p=p.substring(h+1,p.length)}catch(z){return}null!=l&&function(a,b){var d=a.length-b.length,g=a.indexOf(b,d);return-1!==g&&g===d}(l,"image")&&(this.imageData={},(h=d.getMedia(c.mxgraph.io.mxVsdxCodec.vsdxPlaceholder+"/media/"+p))?(this.imageData.iData=h,function(a,b){var d=a.length-b.length,g=a.indexOf(b,d);return-1!==g&&g===d}(p.toLowerCase(),".bmp")&&(g="jpg"),this.imageData.iType=g):(this.imageData.iData=b.ERROR_IMAGE,this.imageData.iType="svg+xml"))}return}}h=
h.nextSibling}}else(function(a,b){return a&&a.equals?a.equals(b):a===b})(g,c.mxgraph.io.vsdx.mxVsdxConstants.TEXT)&&(this.text=a)};b.prototype.parseSection=function(a){var d=a.getAttribute("N");if(function(a,b){return a&&a.equals?a.equals(b):a===b}(d,"Geometry"))null==this.geom&&(this.geom=[]),0<this.geom.push(a);else if(function(a,b){return a&&a.equals?a.equals(b):a===b}(d,"Field")){a=c.mxgraph.io.vsdx.mxVsdxUtils.getDirectChildNamedElements(a,"Row");for(var g=0;g<a.length;g++){var d=a[g],p=d.getAttribute("IX")||
"";if(0!==p.length)if(null==this.fields&&(this.fields={}),function(a,b){return a&&a.equals?a.equals(b):a===b}("1",d.getAttribute("Del")))this.fields[p]="";else{for(var h=c.mxgraph.io.vsdx.mxVsdxUtils.getDirectChildNamedElements(d,"Cell"),l="",m="",t=0;t<h.length;t++){var z=h[t],d=z.getAttribute("N"),z=z.getAttribute("V");switch(d){case "Value":l=z;break;case "Format":m=z}}if(0!==l.length){try{(function(a,b,d){void 0===d&&(d=0);return a.substr(d,b.length)===b})(m,"{{")&&(l=(new Date(b.VSDX_START_TIME+
"";if(0!==p.length)if(null==this.fields&&(this.fields={}),function(a,b){return a&&a.equals?a.equals(b):a===b}("1",d.getAttribute("Del")))this.fields[p]="";else{for(var h=c.mxgraph.io.vsdx.mxVsdxUtils.getDirectChildNamedElements(d,"Cell"),l="",m="",t=0;t<h.length;t++){var z=h[t],d=z.getAttribute("N"),z=z.getAttribute("V")||z.textContent||"";switch(d){case "Value":l=z;break;case "Format":m=z}}if(0!==l.length){try{(function(a,b,d){void 0===d&&(d=0);return a.substr(d,b.length)===b})(m,"{{")&&(l=(new Date(b.VSDX_START_TIME+
Math.floor(864E5*parseFloat(l)))).toString())}catch(aa){}this.fields[p]=l}}}}else f.prototype.parseSection.call(this,a)};b.prototype.parseGeom=function(){return this.hasGeomList()?this.geomList.getShapeXML(this):""};b.prototype.getText=function(){return null!=this.text?this.text.textContent:null};b.prototype.getTextChildren=function(){return null!=this.text?this.text.childNodes:null};b.prototype.getWidth=function(){return 0===this.width&&0<this.height?1:this.width};b.prototype.getHeight=function(){return 0===
this.height&&0<this.width?1:this.height};b.prototype.getRotation=function(){return this.rotation};b.prototype.getStyleMap=function(){return this.styleMap};b.prototype.hasGeom=function(){return!(null==this.geom||0==this.geom.length)};b.prototype.hasGeomList=function(){return null!=this.geomList&&this.geomList.hasGeom()};b.prototype.textToList=function(a,b){if(!function(a,b){return a&&a.equals?a.equals(b):a===b}(b,"")){var d=this.getBullet(b);if(!function(a,b){return a&&a.equals?a.equals(b):a===b}(d,
"0")){var f=a.split("\n");f[f.length-1]||f.pop();for(var h="",l=0;l<f.length;l++)h+=c.mxgraph.io.vsdx.mxVsdxUtils.surroundByTags(f[l],"li");h=c.mxgraph.io.vsdx.mxVsdxUtils.surroundByTags(h,"ul");f={};(function(a,b){return a&&a.equals?a.equals(b):a===b})(d,"4")?f["list-style-type"]="square":f["list-style-type"]="disc";return h=this.insertAttributes(h,f)}}return a};b.prototype.getTextParagraphFormated=function(a){var b="",g={};g.align=this.getHorizontalAlign(this.pp,!0);g["margin-left"]=this.getIndentLeft(this.pp);
@ -967,7 +967,7 @@ b.prototype.getMasterName=function(){return this.shapeName};b.prototype.setLabel
if(function(a,b,d){void 0===d&&(d=0);return a.substr(d,b.length)===b}(d,"Organizational unit")||function(a,b,d){void 0===d&&(d=0);return a.substr(d,b.length)===b}(f,"Organizational unit")){var h=this.shape.getElementsByTagName(c.mxgraph.io.vsdx.mxVsdxConstants.CONTROL).item(0),d=null,d="0.0",f=null,f="-0.4";null!=h&&(d=h.getElementsByTagName(c.mxgraph.io.vsdx.mxVsdxConstants.X).item(0),d=d.hasAttribute("F")?d.getAttribute("F"):d.textContent,f=h.getElementsByTagName(c.mxgraph.io.vsdx.mxVsdxConstants.Y).item(0),
f=f.hasAttribute("F")?f.getAttribute("F"):f.textContent);h=a.getGeometry();d=d.split("Width/2+").join("");d=d.split("DL").join("");f=f.split("Height*").join("");(function(a,b){return a&&a.equals?a.equals(b):a===b})(d,"Inh")&&(d="0.0");(function(a,b){return a&&a.equals?a.equals(b):a===b})(f,"Inh")&&(f="-0.4");-1!=f.indexOf("txtHeight")&&(f="-0.4");for(var l=b.split(";"),m="",t=0;t<l.length;t++){var z=l[t],z=z.trim();(function(a,b,d){void 0===d&&(d=0);return a.substr(d,b.length)===b})(z,"tabHeight=")&&
(m=z.split("tabHeight=").join(""))}(function(a,b){return a&&a.equals?a.equals(b):a===b})(m,"")&&(m="20");l=parseFloat(m);d=parseFloat(d);f=parseFloat(f);m=h.height;d=.1*h.width+100*d;d=new mxPoint(d,m-m*f-l/2);a.getGeometry().offset=d}else if(function(a,b,d){void 0===d&&(d=0);return a.substr(d,b.length)===b}(d,"Domain 3D")||function(a,b,d){void 0===d&&(d=0);return a.substr(d,b.length)===b}(f,"Domain 3D")){h=this.shape.getElementsByTagName(c.mxgraph.io.vsdx.mxVsdxConstants.CONTROL).item(0);d=null;
d="0.0";f=null;f="-0.4";null!=h&&(d=h.getElementsByTagName(c.mxgraph.io.vsdx.mxVsdxConstants.X).item(0),d=d.getAttribute("F"),f=h.getElementsByTagName(c.mxgraph.io.vsdx.mxVsdxConstants.Y).item(0),f=f.getAttribute("F"));h=a.getGeometry();d=d.split("Width/2+").join("");d=d.split("DL").join("");f=f.split("Height*").join("");if(function(a,b){return a&&a.equals?a.equals(b):a===b}(d,"Inh")||function(a,b){return a&&a.equals?a.equals(b):a===b}(d,""))d="0.0";if(function(a,b){return a&&a.equals?a.equals(b):
d="0.0";f=null;f="-0.4";null!=h&&(d=h.getElementsByTagName(c.mxgraph.io.vsdx.mxVsdxConstants.X).item(0),d=d.getAttribute("F")||"",f=h.getElementsByTagName(c.mxgraph.io.vsdx.mxVsdxConstants.Y).item(0),f=f.getAttribute("F")||"");h=a.getGeometry();d=d.split("Width/2+").join("");d=d.split("DL").join("");f=f.split("Height*").join("");if(function(a,b){return a&&a.equals?a.equals(b):a===b}(d,"Inh")||function(a,b){return a&&a.equals?a.equals(b):a===b}(d,""))d="0.0";if(function(a,b){return a&&a.equals?a.equals(b):
a===b}(f,"Inh")||function(a,b){return a&&a.equals?a.equals(b):a===b}(f,""))f="-0.4";-1!=f.indexOf("txtHeight")&&(f="-0.4");d=parseFloat(d);f=parseFloat(f);m=h.height;d=.1*h.width+100*d;d=new mxPoint(d,m-m*f);a.getGeometry().offset=d}};b.prototype.getForm=function(){var a={};if(this.isVertex())try{var d=b.getType(this.getShape());this.styleDebug("shape type = "+d);if(null!=this.imageData||function(a,b){return a&&a.equals?a.equals(b):a===b}(c.mxgraph.io.vsdx.mxVsdxConstants.FOREIGN,d)&&null!=this.masterShape&&
null!=this.masterShape.imageData){var f=null!=this.imageData?this.imageData:this.masterShape.imageData;a.shape="image";a.aspect="fixed";var h=function(a,b){return a[b]?a[b]:null}(f,"iType"),l=function(a,b){return a[b]?a[b]:null}(f,"iData");a.image="data:image/"+h+","+l;return a}var m=this.parseGeom();if(function(a,b){return a&&a.equals?a.equals(b):a===b}(m,""))return this.styleDebug("No geom found"),a;var x=Graph.prototype.compress(m);a[mxConstants.STYLE_SHAPE]="stencil("+x+")"}catch(t){console.error(t.message,
t)}else return this.getEdgeStyle();return a};b.prototype.isOff_page_reference=function(){var a=this.getNameU();return function(a,b){return a&&a.equals?a.equals(b):a===b}(a,"Off-page reference")||function(a,b){return a&&a.equals?a.equals(b):a===b}(a,"Lined/Shaded process")?!0:!1};b.prototype.isExternal_process=function(){var a;a=(a=this.shapeName)&&a.equals?a.equals("External process"):"External process"===a;return a};b.prototype.getDirection=function(a){a=mxResources.get("mxOffset"+this.shapeName);
@ -979,8 +979,8 @@ a===b}(f.toLowerCase(),"width*1")&&function(a,b){return a&&a.equals?a.equals(b):
b,d){void 0===d&&(d=0);return a.substr(d,b.length)===b}(a.toLowerCase(),"controls.row_")||function(a,b,d){void 0===d&&(d=0);return a.substr(d,b.length)===b}(b.toLowerCase(),"controls.row_"))?!1:!0};b.prototype.isRotatedLabel=function(){var a=this.getAttribute(c.mxgraph.io.vsdx.mxVsdxConstants.TXT_ANGLE,"V","");null!=this.masterShape&&function(a,b){return a&&a.equals?a.equals(b):a===b}(a,"")&&(a=this.masterShape.getAttribute(c.mxgraph.io.vsdx.mxVsdxConstants.TXT_ANGLE,"V",""));return function(a,b){return a&&
a.equals?a.equals(b):a===b}(a,"0")||function(a,b){return a&&a.equals?a.equals(b):a===b}(a,"0.0")||function(a,b){return a&&a.equals?a.equals(b):a===b}(a,"")?!1:!0};b.prototype.setRootShape=function(a){this.rootShape=a};b.prototype.getRootShape=function(){return this.rootShape};b.prototype.getStartXY=function(a){var b=Math.floor(Math.round(100*this.getScreenNumericalValue$org_w3c_dom_Element$double(this.getCellElement$java_lang_String(c.mxgraph.io.vsdx.mxVsdxConstants.BEGIN_X),0))/100);a=Math.floor(Math.round(100*
(a-this.getScreenNumericalValue$org_w3c_dom_Element$double(this.getCellElement$java_lang_String(c.mxgraph.io.vsdx.mxVsdxConstants.BEGIN_Y),0)))/100);return new mxPoint(b,a)};b.prototype.getEndXY=function(a){var b=Math.floor(Math.round(100*this.getScreenNumericalValue$org_w3c_dom_Element$double(this.getCellElement$java_lang_String(c.mxgraph.io.vsdx.mxVsdxConstants.END_X),0))/100);a=Math.floor(Math.round(100*(a-this.getScreenNumericalValue$org_w3c_dom_Element$double(this.getCellElement$java_lang_String(c.mxgraph.io.vsdx.mxVsdxConstants.END_Y),
0)))/100);return new mxPoint(b,a)};b.prototype.getRoutingPoints=function(a,b,c){return null!=this.geomList?this.geomList.getRoutingPoints(a,b,c):null};b.prototype.getControlPoints=function(a){var b=this.getStartXY(a);a=this.getEndXY(a);var f=[];if(null!=this.shape){var h=this.shape.getElementsByTagName(c.mxgraph.io.vsdx.mxVsdxConstants.GEOM);if(0<h.length&&(h=h.item(0).getElementsByTagName(c.mxgraph.io.vsdx.mxVsdxConstants.NURBS_TO).item(0).getElementsByTagName("E").item(0),null!=h)){for(var h=h.getAttribute("F"),
h=h.replace(RegExp("NURBS\\(","g"),""),h=h.replace(RegExp("\\)","g"),""),h=h.replace(RegExp(",","g")," "),h=h.replace(RegExp("\\s\\s","g")," "),h=h.split(" "),l=h.length,m=[];0<l--;)m.push(0);for(l=0;l<h.length;l++)m[l]=parseFloat(h[l]);for(l=2;l+4<h.length;l+=4){var x=new mxPoint,t=m[l+3];x.x=Math.floor(Math.round(100*(b.x+Math.min(100,Math.abs(a.x-b.x))*m[l+2]))/100);x.y=Math.floor(Math.round(100*(b.y-100*t))/100);0<f.push(x)}return f}}return null};b.prototype.getStyleFromEdgeShape=function(a){this.styleMap[c.mxgraph.io.vsdx.mxVsdxConstants.VSDX_ID]=
0)))/100);return new mxPoint(b,a)};b.prototype.getRoutingPoints=function(a,b,c){return null!=this.geomList?this.geomList.getRoutingPoints(a,b,c):null};b.prototype.getControlPoints=function(a){var b=this.getStartXY(a);a=this.getEndXY(a);var f=[];if(null!=this.shape){var h=this.shape.getElementsByTagName(c.mxgraph.io.vsdx.mxVsdxConstants.GEOM);if(0<h.length&&(h=h.item(0).getElementsByTagName(c.mxgraph.io.vsdx.mxVsdxConstants.NURBS_TO).item(0).getElementsByTagName("E").item(0),null!=h)){for(var h=h.getAttribute("F")||
"",h=h.replace(RegExp("NURBS\\(","g"),""),h=h.replace(RegExp("\\)","g"),""),h=h.replace(RegExp(",","g")," "),h=h.replace(RegExp("\\s\\s","g")," "),h=h.split(" "),l=h.length,m=[];0<l--;)m.push(0);for(l=0;l<h.length;l++)m[l]=parseFloat(h[l]);for(l=2;l+4<h.length;l+=4){var x=new mxPoint,t=m[l+3];x.x=Math.floor(Math.round(100*(b.x+Math.min(100,Math.abs(a.x-b.x))*m[l+2]))/100);x.y=Math.floor(Math.round(100*(b.y-100*t))/100);0<f.push(x)}return f}}return null};b.prototype.getStyleFromEdgeShape=function(a){this.styleMap[c.mxgraph.io.vsdx.mxVsdxConstants.VSDX_ID]=
this.getId().toString();a=this.getForm();if(null!=a&&!function(a,b){return a&&a.equals?a.equals(b):a===b}(a,""))for(var d in a)this.styleMap[d]=a[d];this.isDashed()&&(this.styleMap[mxConstants.STYLE_DASHED]="1",d=this.getDashPattern(),null!=d&&(this.styleMap[mxConstants.STYLE_DASH_PATTERN]=d));d=this.getEdgeMarker(!0);null!=d&&(function(a,b,d){void 0===d&&(d=0);return a.substr(d,b.length)===b}(d,b.ARROW_NO_FILL_MARKER)&&(d=d.substring(b.ARROW_NO_FILL_MARKER.length),this.styleMap[mxConstants.STYLE_STARTFILL]=
"0"),this.styleMap[mxConstants.STYLE_STARTARROW]=d);d=this.getEdgeMarker(!1);null!=d&&(function(a,b,d){void 0===d&&(d=0);return a.substr(d,b.length)===b}(d,b.ARROW_NO_FILL_MARKER)&&(d=d.substring(b.ARROW_NO_FILL_MARKER.length),this.styleMap[mxConstants.STYLE_ENDFILL]="0"),this.styleMap[mxConstants.STYLE_ENDARROW]=d);d=Math.round(this.getStartArrowSize())|0;6!==d&&(this.styleMap[mxConstants.STYLE_STARTSIZE]=""+d);d=Math.round(this.getFinalArrowSize())|0;6!==d&&(this.styleMap[mxConstants.STYLE_ENDSIZE]=
""+d);d=Math.round(this.getLineWidth())|0;1!==d&&(this.styleMap[mxConstants.STYLE_STROKEWIDTH]=""+d);d=this.getStrokeColor();(function(a,b){return a&&a.equals?a.equals(b):a===b})(d,"")||(this.styleMap[mxConstants.STYLE_STROKECOLOR]=d);this.isShadow()&&(this.styleMap[mxConstants.STYLE_SHADOW]=c.mxgraph.io.vsdx.mxVsdxConstants.TRUE);this.isConnectorBigNameU(this.getNameU())&&(this.styleMap[mxConstants.STYLE_SHAPE]=mxConstants.SHAPE_ARROW,d=this.getFillColor(),function(a,b){return a&&a.equals?a.equals(b):

View file

@ -773,14 +773,8 @@ var EditDiagramDialog = function(editorUi)
if (select.value == 'new')
{
window.openFile = new OpenFile(function()
{
editorUi.hideDialog();
window.openFile = null;
});
window.openFile.setData(data, null);
editorUi.editor.graph.openLink(editorUi.getUrl());
editorUi.hideDialog();
editorUi.editor.editAsNew(data);
}
else if (select.value == 'replace')
{

View file

@ -2924,6 +2924,14 @@ Graph.prototype.bytesToString = function(arr)
return result.join('');
};
/**
* Returns a base64 encoded version of the compressed outer XML of the given node.
*/
Graph.prototype.compressNode = function(node)
{
return this.compress(this.zapGremlins(mxUtils.getXml(node)));
};
/**
* Returns a base64 encoded version of the compressed string.
*/
@ -4797,6 +4805,10 @@ if (typeof mxVertexHandler != 'undefined')
// Mapping for multiple calls to cloneCells with the same set of cells
var mapping = new Object();
// Populates the mapping to fix lookups for forward refs from edges
// to cells in parents that are cloned later in the loop below
// this.cloneCells([model.root], this.isCloneInvalidEdges(), mapping);
for (var i = 0; i < childCount; i++)
{
var parent = model.getChildAt(model.getRoot(), i);

View file

@ -22,8 +22,8 @@ position:{cssPropBits:0,cssLitGroup:[a[23]],cssFns:[]},quotes:{cssPropBits:8,css
cssLitGroup:[a[14],a[69]],cssFns:[]},stress:"border-bottom-left-radius","table-layout":{cssPropBits:0,cssLitGroup:[a[52],a[61]],cssFns:[]},"text-align":{cssPropBits:0,cssLitGroup:[a[42],a[56],a[66]],cssFns:[]},"text-decoration":{cssPropBits:0,cssLitGroup:[a[19],a[71]],cssFns:[]},"text-indent":"border-bottom-left-radius","text-overflow":{cssPropBits:8,cssLitGroup:[a[33]],cssFns:[]},"text-shadow":"box-shadow","text-transform":{cssPropBits:0,cssLitGroup:[a[26],a[71]],cssFns:[]},"text-wrap":{cssPropBits:0,
cssLitGroup:[a[46],a[71],a[72]],cssFns:[]},top:"bottom",transform:{cssPropBits:0,cssLitGroup:[a[71]],cssFns:"matrix() perspective() rotate() rotate3d() rotatex() rotatey() rotatez() scale() scale3d() scalex() scaley() scalez() skew() skewx() skewy() translate() translate3d() translatex() translatey() translatez()".split(" ")},"transform-origin":"perspective-origin","transform-style":{cssPropBits:0,cssLitGroup:[a[37]],cssFns:[]},transition:{cssPropBits:1029,cssLitGroup:[a[10],a[48],a[50],a[71]],cssFns:["cubic-bezier()",
"steps()"]},"transition-delay":"animation-delay","transition-duration":"animation-delay","transition-property":{cssPropBits:1024,cssLitGroup:[a[48],a[50]],cssFns:[]},"transition-timing-function":"animation-timing-function","unicode-bidi":{cssPropBits:0,cssLitGroup:[a[30],a[72]],cssFns:[]},"vertical-align":{cssPropBits:5,cssLitGroup:[a[12],a[31]],cssFns:[]},visibility:"backface-visibility","voice-family":{cssPropBits:8,cssLitGroup:[a[27],a[48]],cssFns:[]},volume:{cssPropBits:1,cssLitGroup:[a[17],a[69]],
cssFns:[]},"white-space":{cssPropBits:0,cssLitGroup:[a[22],a[72]],cssFns:[]},width:"min-height","word-break":{cssPropBits:0,cssLitGroup:[a[32],a[72]],cssFns:[]},"word-spacing":"letter-spacing","word-wrap":"overflow-wrap","z-index":"bottom",zoom:"line-height","cubic-bezier()":"animation-delay","steps()":{cssPropBits:5,cssLitGroup:[a[36],a[48]],cssFns:[]},"image()":{cssPropBits:18,cssLitGroup:[a[0],a[48]],cssFns:["rgb()","rgba()"]},"linear-gradient()":{cssPropBits:7,cssLitGroup:[a[0],a[31],a[42],a[48],
a[79]],cssFns:["rgb()","rgba()"]},"radial-gradient()":{cssPropBits:7,cssLitGroup:[a[0],a[11],a[31],a[42],a[48],a[56],a[57]],cssFns:["rgb()","rgba()"]},"repeating-linear-gradient()":"linear-gradient()","repeating-radial-gradient()":"radial-gradient()","rgb()":{cssPropBits:1,cssLitGroup:[a[48]],cssFns:[]},"rgba()":"rgb()","rect()":{cssPropBits:5,cssLitGroup:[a[48],a[52]],cssFns:[]},"alpha()":{cssPropBits:1,cssLitGroup:[a[28]],cssFns:[]},"matrix()":"animation-delay","perspective()":"border-bottom-left-radius",
cssFns:[]},"white-space":{cssPropBits:0,cssLitGroup:[a[22],a[72]],cssFns:[]},width:"min-height","word-break":{cssPropBits:0,cssLitGroup:[a[32],a[72],a[55]],cssFns:[]},"word-spacing":"letter-spacing","word-wrap":"overflow-wrap","z-index":"bottom",zoom:"line-height","cubic-bezier()":"animation-delay","steps()":{cssPropBits:5,cssLitGroup:[a[36],a[48]],cssFns:[]},"image()":{cssPropBits:18,cssLitGroup:[a[0],a[48]],cssFns:["rgb()","rgba()"]},"linear-gradient()":{cssPropBits:7,cssLitGroup:[a[0],a[31],a[42],
a[48],a[79]],cssFns:["rgb()","rgba()"]},"radial-gradient()":{cssPropBits:7,cssLitGroup:[a[0],a[11],a[31],a[42],a[48],a[56],a[57]],cssFns:["rgb()","rgba()"]},"repeating-linear-gradient()":"linear-gradient()","repeating-radial-gradient()":"radial-gradient()","rgb()":{cssPropBits:1,cssLitGroup:[a[48]],cssFns:[]},"rgba()":"rgb()","rect()":{cssPropBits:5,cssLitGroup:[a[48],a[52]],cssFns:[]},"alpha()":{cssPropBits:1,cssLitGroup:[a[28]],cssFns:[]},"matrix()":"animation-delay","perspective()":"border-bottom-left-radius",
"rotate()":"border-bottom-left-radius","rotate3d()":"animation-delay","rotatex()":"border-bottom-left-radius","rotatey()":"border-bottom-left-radius","rotatez()":"border-bottom-left-radius","scale()":"animation-delay","scale3d()":"animation-delay","scalex()":"border-bottom-left-radius","scaley()":"border-bottom-left-radius","scalez()":"border-bottom-left-radius","skew()":"animation-delay","skewx()":"border-bottom-left-radius","skewy()":"border-bottom-left-radius","translate()":"animation-delay","translate3d()":"animation-delay",
"translatex()":"border-bottom-left-radius","translatey()":"border-bottom-left-radius","translatez()":"border-bottom-left-radius"},c;for(c in b)"string"===typeof b[c]&&Object.hasOwnProperty.call(b,c)&&(b[c]=b[b[c]]);"undefined"!==typeof window&&(window.cssSchema=b);var d,e;(function(){function a(a){var b=parseInt(a.substring(1),16);return 65535<b?(b-=65536,String.fromCharCode(55296+(b>>10),56320+(b&1023))):b==b?String.fromCharCode(b):" ">a[1]?"":a[1]}function b(a,b){return'"'+a.replace(/[\u0000-\u001f\\\"<>]/g,
b)+'"'}function c(a){return g[a]||(g[a]="\\"+a.charCodeAt(0).toString(16)+" ")}function f(a){return h[a]||(h[a]=("">a?"%0":"%")+a.charCodeAt(0).toString(16))}var g={"\\":"\\\\"},h={"\\":"%5c"},k=RegExp("\\uFEFF|U[+][0-9A-F?]{1,6}(?:-[0-9A-F]{1,6})?|url[(][\\t\\n\\f ]*(?:\"(?:'|[^'\"\\n\\f\\\\]|\\\\[\\s\\S])*\"|'(?:\"|[^'\"\\n\\f\\\\]|\\\\[\\s\\S])*'|(?:[\\t\\x21\\x23-\\x26\\x28-\\x5b\\x5d-\\x7e]|[\\u0080-\\ud7ff\\ue000-\\ufffd]|[\\ud800-\\udbff][\\udc00-\\udfff]|\\\\(?:[0-9a-fA-F]{1,6}[\\t\\n\\f ]?|[\\u0020-\\u007e\\u0080-\\ud7ff\\ue000\\ufffd]|[\\ud800-\\udbff][\\udc00-\\udfff]))*)[\\t\\n\\f ]*[)]|(?!url[(])-?(?:[a-zA-Z_]|[\\u0080-\\ud7ff\\ue000-\\ufffd]|[\\ud800-\\udbff][\\udc00-\\udfff]|\\\\(?:[0-9a-fA-F]{1,6}[\\t\\n\\f ]?|[\\u0020-\\u007e\\u0080-\\ud7ff\\ue000\\ufffd]|[\\ud800-\\udbff][\\udc00-\\udfff]))(?:[a-zA-Z0-9_-]|[\\u0080-\\ud7ff\\ue000-\\ufffd]|[\\ud800-\\udbff][\\udc00-\\udfff]|\\\\(?:[0-9a-fA-F]{1,6}[\\t\\n\\f ]?|[\\u0020-\\u007e\\u0080-\\ud7ff\\ue000\\ufffd]|[\\ud800-\\udbff][\\udc00-\\udfff]))*[(]|(?:@?-?(?:[a-zA-Z_]|[\\u0080-\\ud7ff\\ue000-\\ufffd]|[\\ud800-\\udbff][\\udc00-\\udfff]|\\\\(?:[0-9a-fA-F]{1,6}[\\t\\n\\f ]?|[\\u0020-\\u007e\\u0080-\\ud7ff\\ue000\\ufffd]|[\\ud800-\\udbff][\\udc00-\\udfff]))|#)(?:[a-zA-Z0-9_-]|[\\u0080-\\ud7ff\\ue000-\\ufffd]|[\\ud800-\\udbff][\\udc00-\\udfff]|\\\\(?:[0-9a-fA-F]{1,6}[\\t\\n\\f ]?|[\\u0020-\\u007e\\u0080-\\ud7ff\\ue000\\ufffd]|[\\ud800-\\udbff][\\udc00-\\udfff]))*|\"(?:'|[^'\"\\n\\f\\\\]|\\\\[\\s\\S])*\"|'(?:\"|[^'\"\\n\\f\\\\]|\\\\[\\s\\S])*'|[-+]?(?:[0-9]+(?:[.][0-9]+)?|[.][0-9]+)(?:%|-?(?:[a-zA-Z_]|[\\u0080-\\ud7ff\\ue000-\\ufffd]|[\\ud800-\\udbff][\\udc00-\\udfff]|\\\\(?:[0-9a-fA-F]{1,6}[\\t\\n\\f ]?|[\\u0020-\\u007e\\u0080-\\ud7ff\\ue000\\ufffd]|[\\ud800-\\udbff][\\udc00-\\udfff]))(?:[a-zA-Z0-9_-]|[\\u0080-\\ud7ff\\ue000-\\ufffd]|[\\ud800-\\udbff][\\udc00-\\udfff]|\\\\(?:[0-9a-fA-F]{1,6}[\\t\\n\\f ]?|[\\u0020-\\u007e\\u0080-\\ud7ff\\ue000\\ufffd]|[\\ud800-\\udbff][\\udc00-\\udfff]))*)?|\x3c!--|--\x3e|[\\t\\n\\f ]+|/(?:[*][^*]*[*]+(?:[^/][^*]*[*]+)*/|/[^\\n\\f]*)|[~|^$*]=|[^\"'\\\\/]|/(?![/*])",
@ -184,7 +184,7 @@ f)+"\n"+t+"}":"{"+z.join(",")+"}";f=t;return l}}"function"!==typeof Date.prototy
e=/[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,f,g,h={"\b":"\\b","\t":"\\t","\n":"\\n","\f":"\\f","\r":"\\r",'"':'\\"',"\\":"\\\\"},k;"function"!==typeof JSON.stringify&&(JSON.stringify=function(a,b,d){var e;g=f="";if("number"===typeof d)for(e=0;e<d;e+=1)g+=" ";else"string"===typeof d&&(g=d);if((k=b)&&"function"!==typeof b&&("object"!==typeof b||"number"!==typeof b.length))throw Error("JSON.stringify");return c("",{"":a})});
"function"!==typeof JSON.parse&&(JSON.parse=function(a,b){function c(a,d){var e,f,g=a[d];if(g&&"object"===typeof g)for(e in g)Object.prototype.hasOwnProperty.call(g,e)&&(f=c(g,e),void 0!==f?g[e]=f:delete g[e]);return b.call(a,d,g)}var e;a=""+a;d.lastIndex=0;d.test(a)&&(a=a.replace(d,function(a){return"\\u"+("0000"+a.charCodeAt(0).toString(16)).slice(-4)}));if(/^[\],:{}\s]*$/.test(a.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,"@").replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,
"]").replace(/(?:^|:|,)(?:\s*\[)+/g,"")))return e=eval("("+a+")"),"function"===typeof b?c({"":e},""):e;throw new SyntaxError("JSON.parse");})})();"undefined"===typeof window.mxBasePath&&(window.mxBasePath="https://www.draw.io/mxgraph/");window.mxLoadStylesheets=window.mxLoadStylesheets||!1;window.mxLoadResources=window.mxLoadResources||!1;window.mxLanguage=window.mxLanguage||"en";window.urlParams=window.urlParams||{};window.MAX_REQUEST_SIZE=window.MAX_REQUEST_SIZE||10485760;window.MAX_AREA=window.MAX_AREA||225E6;window.EXPORT_URL=window.EXPORT_URL||"/export";window.SAVE_URL=window.SAVE_URL||"/save";window.OPEN_URL=window.OPEN_URL||"/open";window.RESOURCES_PATH=window.RESOURCES_PATH||"resources";window.RESOURCE_BASE=window.RESOURCE_BASE||window.RESOURCES_PATH+"/grapheditor";window.STENCIL_PATH=window.STENCIL_PATH||"stencils";window.IMAGE_PATH=window.IMAGE_PATH||"images";
window.STYLE_PATH=window.STYLE_PATH||"styles";window.CSS_PATH=window.CSS_PATH||"styles";window.OPEN_FORM=window.OPEN_FORM||"open.html";window.mxBasePath=window.mxBasePath||"../../../src";window.mxLanguage=window.mxLanguage||urlParams.lang;window.mxLanguages=window.mxLanguages||["de"];var mxClient={VERSION:"9.3.1",IS_IE:0<=navigator.userAgent.indexOf("MSIE"),IS_IE6:0<=navigator.userAgent.indexOf("MSIE 6"),IS_IE11:!!navigator.userAgent.match(/Trident\/7\./),IS_EDGE:!!navigator.userAgent.match(/Edge\//),IS_QUIRKS:0<=navigator.userAgent.indexOf("MSIE")&&(null==document.documentMode||5==document.documentMode),IS_EM:"spellcheck"in document.createElement("textarea")&&8==document.documentMode,VML_PREFIX:"v",OFFICE_PREFIX:"o",IS_NS:0<=navigator.userAgent.indexOf("Mozilla/")&&0>navigator.userAgent.indexOf("MSIE")&&
window.STYLE_PATH=window.STYLE_PATH||"styles";window.CSS_PATH=window.CSS_PATH||"styles";window.OPEN_FORM=window.OPEN_FORM||"open.html";window.mxBasePath=window.mxBasePath||"../../../src";window.mxLanguage=window.mxLanguage||urlParams.lang;window.mxLanguages=window.mxLanguages||["de"];var mxClient={VERSION:"9.3.4",IS_IE:0<=navigator.userAgent.indexOf("MSIE"),IS_IE6:0<=navigator.userAgent.indexOf("MSIE 6"),IS_IE11:!!navigator.userAgent.match(/Trident\/7\./),IS_EDGE:!!navigator.userAgent.match(/Edge\//),IS_QUIRKS:0<=navigator.userAgent.indexOf("MSIE")&&(null==document.documentMode||5==document.documentMode),IS_EM:"spellcheck"in document.createElement("textarea")&&8==document.documentMode,VML_PREFIX:"v",OFFICE_PREFIX:"o",IS_NS:0<=navigator.userAgent.indexOf("Mozilla/")&&0>navigator.userAgent.indexOf("MSIE")&&
0>navigator.userAgent.indexOf("Edge/"),IS_OP:0<=navigator.userAgent.indexOf("Opera/")||0<=navigator.userAgent.indexOf("OPR/"),IS_OT:0<=navigator.userAgent.indexOf("Presto/")&&0>navigator.userAgent.indexOf("Presto/2.4.")&&0>navigator.userAgent.indexOf("Presto/2.3.")&&0>navigator.userAgent.indexOf("Presto/2.2.")&&0>navigator.userAgent.indexOf("Presto/2.1.")&&0>navigator.userAgent.indexOf("Presto/2.0.")&&0>navigator.userAgent.indexOf("Presto/1."),IS_SF:0<=navigator.userAgent.indexOf("AppleWebKit/")&&
0>navigator.userAgent.indexOf("Chrome/")&&0>navigator.userAgent.indexOf("Edge/"),IS_IOS:navigator.userAgent.match(/(iPad|iPhone|iPod)/g)?!0:!1,IS_GC:0<=navigator.userAgent.indexOf("Chrome/")&&0>navigator.userAgent.indexOf("Edge/"),IS_CHROMEAPP:null!=window.chrome&&null!=chrome.app&&null!=chrome.app.runtime,IS_FF:0<=navigator.userAgent.indexOf("Firefox/"),IS_MT:0<=navigator.userAgent.indexOf("Firefox/")&&0>navigator.userAgent.indexOf("Firefox/1.")&&0>navigator.userAgent.indexOf("Firefox/2.")||0<=navigator.userAgent.indexOf("Iceweasel/")&&
0>navigator.userAgent.indexOf("Iceweasel/1.")&&0>navigator.userAgent.indexOf("Iceweasel/2.")||0<=navigator.userAgent.indexOf("SeaMonkey/")&&0>navigator.userAgent.indexOf("SeaMonkey/1.")||0<=navigator.userAgent.indexOf("Iceape/")&&0>navigator.userAgent.indexOf("Iceape/1."),IS_SVG:0<=navigator.userAgent.indexOf("Firefox/")||0<=navigator.userAgent.indexOf("Iceweasel/")||0<=navigator.userAgent.indexOf("Seamonkey/")||0<=navigator.userAgent.indexOf("Iceape/")||0<=navigator.userAgent.indexOf("Galeon/")||
@ -615,7 +615,7 @@ mxSwimlane.prototype.paintDivider=function(a,b,c,d,e,f,g){g||a.setShadow(!1);a.b
mxSwimlane.prototype.getImageBounds=function(a,b,c,d){return this.isHorizontal()?new mxRectangle(a+c-this.imageSize,b,this.imageSize,this.imageSize):new mxRectangle(a,b,this.imageSize,this.imageSize)};function mxGraphLayout(a){this.graph=a}mxGraphLayout.prototype.graph=null;mxGraphLayout.prototype.useBoundingBox=!0;mxGraphLayout.prototype.parent=null;mxGraphLayout.prototype.moveCell=function(a,b,c){};mxGraphLayout.prototype.execute=function(a){};mxGraphLayout.prototype.getGraph=function(){return this.graph};
mxGraphLayout.prototype.getConstraint=function(a,b,c,d){c=this.graph.view.getState(b);b=null!=c?c.style:this.graph.getCellStyle(b);return null!=b?b[a]:null};
mxGraphLayout.traverse=function(a,b,c,d,e){if(null!=c&&null!=a&&(b=null!=b?b:!0,e=e||new mxDictionary,!e.get(a)&&(e.put(a,!0),d=c(a,d),null==d||d))&&(d=this.graph.model.getEdgeCount(a),0<d))for(var f=0;f<d;f++){var g=this.graph.model.getEdgeAt(a,f),h=this.graph.model.getTerminal(g,!0)==a;if(!b||h)h=this.graph.view.getVisibleTerminal(g,!h),this.traverse(h,b,c,g,e)}};
mxGraphLayout.prototype.isAncestor=function(a,b,c){if(!c)return this.graph.model.getParent(cell)==a;if(b==a)return!1;for(;null!=b&&b!=a;)b=this.graph.model.getParent(b);return b==a};mxGraphLayout.prototype.isVertexMovable=function(a){return this.graph.isCellMovable(a)};mxGraphLayout.prototype.isVertexIgnored=function(a){return!this.graph.getModel().isVertex(a)||!this.graph.isCellVisible(a)};
mxGraphLayout.prototype.isAncestor=function(a,b,c){if(!c)return this.graph.model.getParent(b)==a;if(b==a)return!1;for(;null!=b&&b!=a;)b=this.graph.model.getParent(b);return b==a};mxGraphLayout.prototype.isVertexMovable=function(a){return this.graph.isCellMovable(a)};mxGraphLayout.prototype.isVertexIgnored=function(a){return!this.graph.getModel().isVertex(a)||!this.graph.isCellVisible(a)};
mxGraphLayout.prototype.isEdgeIgnored=function(a){var b=this.graph.getModel();return!b.isEdge(a)||!this.graph.isCellVisible(a)||null==b.getTerminal(a,!0)||null==b.getTerminal(a,!1)};mxGraphLayout.prototype.setEdgeStyleEnabled=function(a,b){this.graph.setCellStyles(mxConstants.STYLE_NOEDGESTYLE,b?"0":"1",[a])};mxGraphLayout.prototype.setOrthogonalEdge=function(a,b){this.graph.setCellStyles(mxConstants.STYLE_ORTHOGONAL,b?"1":"0",[a])};
mxGraphLayout.prototype.getParentOffset=function(a){var b=new mxPoint;if(null!=a&&a!=this.parent){var c=this.graph.getModel();if(c.isAncestor(this.parent,a))for(var d=c.getGeometry(a);a!=this.parent;)b.x+=d.x,b.y+=d.y,a=c.getParent(a),d=c.getGeometry(a)}return b};
mxGraphLayout.prototype.setEdgePoints=function(a,b){if(null!=a){var c=this.graph.model,d=c.getGeometry(a);null==d?(d=new mxGeometry,d.setRelative(!0)):d=d.clone();if(null!=this.parent&&null!=b)for(var e=c.getParent(a),e=this.getParentOffset(e),f=0;f<b.length;f++)b[f].x-=e.x,b[f].y-=e.y;d.points=b;c.setGeometry(a,d)}};
@ -1607,13 +1607,14 @@ Graph.prototype.isCellFoldable=function(a){var b=this.view.getState(a),b=null!=b
Graph.prototype.zoom=function(a,b){a=Math.max(.01,Math.min(this.view.scale*a,160))/this.view.scale;mxGraph.prototype.zoom.apply(this,arguments)};Graph.prototype.zoomIn=function(){.15>this.view.scale?this.zoom((this.view.scale+.01)/this.view.scale):this.zoom(Math.round(this.view.scale*this.zoomFactor*20)/20/this.view.scale)};Graph.prototype.zoomOut=function(){.15>=this.view.scale?this.zoom((this.view.scale-.01)/this.view.scale):this.zoom(Math.round(1/this.zoomFactor*this.view.scale*20)/20/this.view.scale)};
Graph.prototype.getTooltipForCell=function(a){var b="";if(mxUtils.isNode(a.value)){var c=a.value.getAttribute("tooltip");if(null!=c)null!=c&&this.isReplacePlaceholders(a)&&(c=this.replacePlaceholders(a,c)),b=this.sanitizeHtml(c);else{c=this.builtInProperties;a=a.value.attributes;var d=[];this.isEnabled()&&c.push("link");for(var e=0;e<a.length;e++)0>mxUtils.indexOf(c,a[e].nodeName)&&0<a[e].nodeValue.length&&d.push({name:a[e].nodeName,value:a[e].nodeValue});d.sort(function(a,b){return a.name<b.name?
-1:a.name>b.name?1:0});for(e=0;e<d.length;e++)"link"==d[e].name&&this.isCustomLink(d[e].value)||(b+=("link"!=d[e].name?"<b>"+d[e].name+":</b> ":"")+mxUtils.htmlEntities(d[e].value)+"\n");0<b.length&&(b=b.substring(0,b.length-1),mxClient.IS_SVG&&(b='<div style="max-width:360px;">'+b+"</div>"))}}return b};Graph.prototype.stringToBytes=function(a){for(var b=Array(a.length),c=0;c<a.length;c++)b[c]=a.charCodeAt(c);return b};
Graph.prototype.bytesToString=function(a){for(var b=Array(a.length),c=0;c<a.length;c++)b[c]=String.fromCharCode(a[c]);return b.join("")};Graph.prototype.compress=function(a){if(null==a||0==a.length||"undefined"===typeof pako)return a;a=this.bytesToString(pako.deflateRaw(encodeURIComponent(a)));return window.btoa?btoa(a):Base64.encode(a,!0)};Graph.prototype.decompress=function(a){if(null==a||0==a.length||"undefined"===typeof pako)return a;a=window.atob?atob(a):Base64.decode(a,!0);return this.zapGremlins(decodeURIComponent(this.bytesToString(pako.inflateRaw(a))))};
Graph.prototype.zapGremlins=function(a){for(var b=[],c=0;c<a.length;c++){var d=a.charCodeAt(c);(32<=d||9==d||10==d||13==d)&&b.push(a.charAt(c))}return b.join("")};HoverIcons=function(a){this.graph=a;this.init()};HoverIcons.prototype.arrowSpacing=2;HoverIcons.prototype.updateDelay=500;HoverIcons.prototype.activationDelay=140;HoverIcons.prototype.currentState=null;HoverIcons.prototype.activeArrow=null;HoverIcons.prototype.inactiveOpacity=15;HoverIcons.prototype.cssCursor="copy";
HoverIcons.prototype.checkCollisions=!0;HoverIcons.prototype.arrowFill="#29b6f2";HoverIcons.prototype.triangleUp=mxClient.IS_SVG?Graph.createSvgImage(18,28,'<path d="m 6 26 L 12 26 L 12 12 L 18 12 L 9 1 L 1 12 L 6 12 z" stroke="#fff" fill="'+HoverIcons.prototype.arrowFill+'"/>'):new mxImage(IMAGE_PATH+"/triangle-up.png",26,14);
HoverIcons.prototype.triangleRight=mxClient.IS_SVG?Graph.createSvgImage(26,18,'<path d="m 1 6 L 14 6 L 14 1 L 26 9 L 14 18 L 14 12 L 1 12 z" stroke="#fff" fill="'+HoverIcons.prototype.arrowFill+'"/>'):new mxImage(IMAGE_PATH+"/triangle-right.png",14,26);HoverIcons.prototype.triangleDown=mxClient.IS_SVG?Graph.createSvgImage(18,26,'<path d="m 6 1 L 6 14 L 1 14 L 9 26 L 18 14 L 12 14 L 12 1 z" stroke="#fff" fill="'+HoverIcons.prototype.arrowFill+'"/>'):new mxImage(IMAGE_PATH+"/triangle-down.png",26,14);
HoverIcons.prototype.triangleLeft=mxClient.IS_SVG?Graph.createSvgImage(28,18,'<path d="m 1 9 L 12 1 L 12 6 L 26 6 L 26 12 L 12 12 L 12 18 z" stroke="#fff" fill="'+HoverIcons.prototype.arrowFill+'"/>'):new mxImage(IMAGE_PATH+"/triangle-left.png",14,26);HoverIcons.prototype.roundDrop=mxClient.IS_SVG?Graph.createSvgImage(26,26,'<circle cx="13" cy="13" r="12" stroke="#fff" fill="'+HoverIcons.prototype.arrowFill+'"/>'):new mxImage(IMAGE_PATH+"/round-drop.png",26,26);
HoverIcons.prototype.refreshTarget=new mxImage(mxClient.IS_SVG?"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACYAAAAmCAYAAACoPemuAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBNYWNpbnRvc2giIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NDQxNERDRTU1QjY1MTFFNDkzNTRFQTVEMTdGMTdBQjciIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NDQxNERDRTY1QjY1MTFFNDkzNTRFQTVEMTdGMTdBQjciPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo0NDE0RENFMzVCNjUxMUU0OTM1NEVBNUQxN0YxN0FCNyIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo0NDE0RENFNDVCNjUxMUU0OTM1NEVBNUQxN0YxN0FCNyIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PsvuX50AAANaSURBVHja7FjRZ1tRGD9ZJ1NCyIQSwrivI4Q8hCpjlFDyFEoYfSp9Ko1QWnmo0If+BSXkIfo0QirTMUpeGo2EPfWllFYjZMLKLDJn53d3biU337m5J223bPbxk5t7v+/c3/2+73znO8fDOWezKM/YjMpz68Lj8ejY+QTeCCwLxOS9qPxtyN+6wAeBTwJ31CCO0cJDjXBGBN4LfIepSwykTUT1bgpuib0SONIgo8KRHOtRiCFcvUcgZeGrHPNBxLIyFPyRgTGz0xLbegJCdmzpElue5KlAIMDX19d5uVzm5+fnfDAYmMA17uEZdOx2Yvb/sHlu2S0xwymn5ufneTab5b1ej08S6EAXNrDd2dnhiUTim21MvMtwQ6yiIrWwsMDPzs64rsBmf3/fvM7n89TYlUnEllSkQqEQv7q64g+Vk5MTVXosORErU0Zer5f0FEIlw2N6MxwO82QyaXql2+2SxDqdjopYWUUsqEp45IldqtWq6UWVh/1+P7+8vCTJ4QMUJSRIEXuneoH96w8PDyeWAnhSJfCqwm6NIlaklFdXV0cGhRcQ2mlJQXK5nMq2YPEZbnteU1U2lUqN/D84OGD9fl+5fgnSrFarsUwmw0qlEru4uBjTicViTk3Cr27HSnxR+Doyz0ZE1CAWiUTusbu7y9rttlZv5fP5WDQavYfIMba4uEipfhF8XtqJoZXx/uH+sC/4vPg7OljZZQbsCmLtYzc3N6zRaJhotVrmfx0xDINtbm6athYUeXpHdbBNaqZUKpWxWXV7e2vex+xaWVnhc3NzjrPUXgexyCt0m67LBV7uJMITjqRE4o8tZeg8FPpFitgapYxiOC0poFgsji1jKNo6BZZckrAGUtJsNk1vqAihCBcKhTE7hNWhqw2qFnGy5UFOUYJVIJ1OjzSE+BCEilon0URavRmBqnbbQ00AXbm+vnZc9O1tj72OnQoc2+cwygRkb2+P1et17ZoEm3g87lRmjgWZ00kbXkNuse6/Bu2wlegIxfb2tuvWGroO4bO2c4bbzUh60mxDXm1sbJhhxkQYnhS4h2fUZoRAWnf7lv8N27f8P7Xhnekjgpk+VKGOoQbsiY+hhhtF3YO7twIJ+ULvUGv+GQ2fQEvWxI/THNx5/p/BaspPAQYAqStgiSQwCDoAAAAASUVORK5CYII=":
IMAGE_PATH+"/refresh.png",38,38);HoverIcons.prototype.tolerance=mxClient.IS_TOUCH?6:0;
Graph.prototype.bytesToString=function(a){for(var b=Array(a.length),c=0;c<a.length;c++)b[c]=String.fromCharCode(a[c]);return b.join("")};Graph.prototype.compressNode=function(a){return this.compress(this.zapGremlins(mxUtils.getXml(a)))};Graph.prototype.compress=function(a){if(null==a||0==a.length||"undefined"===typeof pako)return a;a=this.bytesToString(pako.deflateRaw(encodeURIComponent(a)));return window.btoa?btoa(a):Base64.encode(a,!0)};
Graph.prototype.decompress=function(a){if(null==a||0==a.length||"undefined"===typeof pako)return a;a=window.atob?atob(a):Base64.decode(a,!0);return this.zapGremlins(decodeURIComponent(this.bytesToString(pako.inflateRaw(a))))};Graph.prototype.zapGremlins=function(a){for(var b=[],c=0;c<a.length;c++){var d=a.charCodeAt(c);(32<=d||9==d||10==d||13==d)&&b.push(a.charAt(c))}return b.join("")};HoverIcons=function(a){this.graph=a;this.init()};HoverIcons.prototype.arrowSpacing=2;
HoverIcons.prototype.updateDelay=500;HoverIcons.prototype.activationDelay=140;HoverIcons.prototype.currentState=null;HoverIcons.prototype.activeArrow=null;HoverIcons.prototype.inactiveOpacity=15;HoverIcons.prototype.cssCursor="copy";HoverIcons.prototype.checkCollisions=!0;HoverIcons.prototype.arrowFill="#29b6f2";
HoverIcons.prototype.triangleUp=mxClient.IS_SVG?Graph.createSvgImage(18,28,'<path d="m 6 26 L 12 26 L 12 12 L 18 12 L 9 1 L 1 12 L 6 12 z" stroke="#fff" fill="'+HoverIcons.prototype.arrowFill+'"/>'):new mxImage(IMAGE_PATH+"/triangle-up.png",26,14);HoverIcons.prototype.triangleRight=mxClient.IS_SVG?Graph.createSvgImage(26,18,'<path d="m 1 6 L 14 6 L 14 1 L 26 9 L 14 18 L 14 12 L 1 12 z" stroke="#fff" fill="'+HoverIcons.prototype.arrowFill+'"/>'):new mxImage(IMAGE_PATH+"/triangle-right.png",14,26);
HoverIcons.prototype.triangleDown=mxClient.IS_SVG?Graph.createSvgImage(18,26,'<path d="m 6 1 L 6 14 L 1 14 L 9 26 L 18 14 L 12 14 L 12 1 z" stroke="#fff" fill="'+HoverIcons.prototype.arrowFill+'"/>'):new mxImage(IMAGE_PATH+"/triangle-down.png",26,14);HoverIcons.prototype.triangleLeft=mxClient.IS_SVG?Graph.createSvgImage(28,18,'<path d="m 1 9 L 12 1 L 12 6 L 26 6 L 26 12 L 12 12 L 12 18 z" stroke="#fff" fill="'+HoverIcons.prototype.arrowFill+'"/>'):new mxImage(IMAGE_PATH+"/triangle-left.png",14,26);
HoverIcons.prototype.roundDrop=mxClient.IS_SVG?Graph.createSvgImage(26,26,'<circle cx="13" cy="13" r="12" stroke="#fff" fill="'+HoverIcons.prototype.arrowFill+'"/>'):new mxImage(IMAGE_PATH+"/round-drop.png",26,26);
HoverIcons.prototype.refreshTarget=new mxImage(mxClient.IS_SVG?"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACYAAAAmCAYAAACoPemuAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBNYWNpbnRvc2giIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NDQxNERDRTU1QjY1MTFFNDkzNTRFQTVEMTdGMTdBQjciIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NDQxNERDRTY1QjY1MTFFNDkzNTRFQTVEMTdGMTdBQjciPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo0NDE0RENFMzVCNjUxMUU0OTM1NEVBNUQxN0YxN0FCNyIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo0NDE0RENFNDVCNjUxMUU0OTM1NEVBNUQxN0YxN0FCNyIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PsvuX50AAANaSURBVHja7FjRZ1tRGD9ZJ1NCyIQSwrivI4Q8hCpjlFDyFEoYfSp9Ko1QWnmo0If+BSXkIfo0QirTMUpeGo2EPfWllFYjZMLKLDJn53d3biU337m5J223bPbxk5t7v+/c3/2+73znO8fDOWezKM/YjMpz68Lj8ejY+QTeCCwLxOS9qPxtyN+6wAeBTwJ31CCO0cJDjXBGBN4LfIepSwykTUT1bgpuib0SONIgo8KRHOtRiCFcvUcgZeGrHPNBxLIyFPyRgTGz0xLbegJCdmzpElue5KlAIMDX19d5uVzm5+fnfDAYmMA17uEZdOx2Yvb/sHlu2S0xwymn5ufneTab5b1ej08S6EAXNrDd2dnhiUTim21MvMtwQ6yiIrWwsMDPzs64rsBmf3/fvM7n89TYlUnEllSkQqEQv7q64g+Vk5MTVXosORErU0Zer5f0FEIlw2N6MxwO82QyaXql2+2SxDqdjopYWUUsqEp45IldqtWq6UWVh/1+P7+8vCTJ4QMUJSRIEXuneoH96w8PDyeWAnhSJfCqwm6NIlaklFdXV0cGhRcQ2mlJQXK5nMq2YPEZbnteU1U2lUqN/D84OGD9fl+5fgnSrFarsUwmw0qlEru4uBjTicViTk3Cr27HSnxR+Doyz0ZE1CAWiUTusbu7y9rttlZv5fP5WDQavYfIMba4uEipfhF8XtqJoZXx/uH+sC/4vPg7OljZZQbsCmLtYzc3N6zRaJhotVrmfx0xDINtbm6athYUeXpHdbBNaqZUKpWxWXV7e2vex+xaWVnhc3NzjrPUXgexyCt0m67LBV7uJMITjqRE4o8tZeg8FPpFitgapYxiOC0poFgsji1jKNo6BZZckrAGUtJsNk1vqAihCBcKhTE7hNWhqw2qFnGy5UFOUYJVIJ1OjzSE+BCEilon0URavRmBqnbbQ00AXbm+vnZc9O1tj72OnQoc2+cwygRkb2+P1et17ZoEm3g87lRmjgWZ00kbXkNuse6/Bu2wlegIxfb2tuvWGroO4bO2c4bbzUh60mxDXm1sbJhhxkQYnhS4h2fUZoRAWnf7lv8N27f8P7Xhnekjgpk+VKGOoQbsiY+hhhtF3YO7twIJ+ULvUGv+GQ2fQEvWxI/THNx5/p/BaspPAQYAqStgiSQwCDoAAAAASUVORK5CYII=":IMAGE_PATH+
"/refresh.png",38,38);HoverIcons.prototype.tolerance=mxClient.IS_TOUCH?6:0;
HoverIcons.prototype.init=function(){this.arrowUp=this.createArrow(this.triangleUp,mxResources.get("plusTooltip"));this.arrowRight=this.createArrow(this.triangleRight,mxResources.get("plusTooltip"));this.arrowDown=this.createArrow(this.triangleDown,mxResources.get("plusTooltip"));this.arrowLeft=this.createArrow(this.triangleLeft,mxResources.get("plusTooltip"));this.elts=[this.arrowUp,this.arrowRight,this.arrowDown,this.arrowLeft];this.repaintHandler=mxUtils.bind(this,function(){this.repaint()});this.graph.selectionModel.addListener(mxEvent.CHANGE,
this.repaintHandler);this.graph.model.addListener(mxEvent.CHANGE,this.repaintHandler);this.graph.view.addListener(mxEvent.SCALE_AND_TRANSLATE,this.repaintHandler);this.graph.view.addListener(mxEvent.TRANSLATE,this.repaintHandler);this.graph.view.addListener(mxEvent.SCALE,this.repaintHandler);this.graph.view.addListener(mxEvent.DOWN,this.repaintHandler);this.graph.view.addListener(mxEvent.UP,this.repaintHandler);this.graph.addListener(mxEvent.ROOT,this.repaintHandler);this.graph.addListener(mxEvent.ESCAPE,
mxUtils.bind(this,function(){this.mouseDownPoint=null}));mxEvent.addListener(this.graph.container,"mouseleave",mxUtils.bind(this,function(a){null!=a.relatedTarget&&mxEvent.getSource(a)==this.graph.container&&this.setDisplay("none")}));this.graph.addListener(mxEvent.START_EDITING,mxUtils.bind(this,function(a){this.reset()}));var a=this.graph.click;this.graph.click=mxUtils.bind(this,function(b){a.apply(this.graph,arguments);null==this.currentState||this.graph.isCellSelected(this.currentState.cell)||

View file

@ -1,4 +1,5 @@
// NOTE: Modified to support data URIs for images, ie. data:image/*
// Modified to allow "word-break: break-word" in styles. It is done by adding "break-word" which is at index 55 of J array J[55] to "cssLitGroup" of "word-break"
(function(){var c=void 0,n=!0,s=null,C=!1,J=["aliceblue,antiquewhite,aqua,aquamarine,azure,beige,bisque,black,blanchedalmond,blue,blueviolet,brown,burlywood,cadetblue,chartreuse,chocolate,coral,cornflowerblue,cornsilk,crimson,cyan,darkblue,darkcyan,darkgoldenrod,darkgray,darkgreen,darkkhaki,darkmagenta,darkolivegreen,darkorange,darkorchid,darkred,darksalmon,darkseagreen,darkslateblue,darkslategray,darkturquoise,darkviolet,deeppink,deepskyblue,dimgray,dodgerblue,firebrick,floralwhite,forestgreen,fuchsia,gainsboro,ghostwhite,gold,goldenrod,gray,green,greenyellow,honeydew,hotpink,indianred,indigo,ivory,khaki,lavender,lavenderblush,lawngreen,lemonchiffon,lightblue,lightcoral,lightcyan,lightgoldenrodyellow,lightgreen,lightgrey,lightpink,lightsalmon,lightseagreen,lightskyblue,lightslategray,lightsteelblue,lightyellow,lime,limegreen,linen,magenta,maroon,mediumaquamarine,mediumblue,mediumorchid,mediumpurple,mediumseagreen,mediumslateblue,mediumspringgreen,mediumturquoise,mediumvioletred,midnightblue,mintcream,mistyrose,moccasin,navajowhite,navy,oldlace,olive,olivedrab,orange,orangered,orchid,palegoldenrod,palegreen,paleturquoise,palevioletred,papayawhip,peachpuff,peru,pink,plum,powderblue,purple,red,rosybrown,royalblue,saddlebrown,salmon,sandybrown,seagreen,seashell,sienna,silver,skyblue,slateblue,slategray,snow,springgreen,steelblue,tan,teal,thistle,tomato,transparent,turquoise,violet,wheat,white,whitesmoke,yellow,yellowgreen".split(","),
"all-scroll,col-resize,crosshair,default,e-resize,hand,help,move,n-resize,ne-resize,no-drop,not-allowed,nw-resize,pointer,progress,row-resize,s-resize,se-resize,sw-resize,text,vertical-text,w-resize,wait".split(","),"armenian,decimal,decimal-leading-zero,disc,georgian,lower-alpha,lower-greek,lower-latin,lower-roman,square,upper-alpha,upper-latin,upper-roman".split(","),"100,200,300,400,500,600,700,800,900,bold,bolder,lighter".split(","),"block-level,inline-level,table-caption,table-cell,table-column,table-column-group,table-footer-group,table-header-group,table-row,table-row-group".split(","),
"condensed,expanded,extra-condensed,extra-expanded,narrower,semi-condensed,semi-expanded,ultra-condensed,ultra-expanded,wider".split(","),"inherit,inline,inline-block,inline-box,inline-flex,inline-grid,inline-list-item,inline-stack,inline-table,run-in".split(","),"behind,center-left,center-right,far-left,far-right,left-side,leftwards,right-side,rightwards".split(","),"large,larger,small,smaller,x-large,x-small,xx-large,xx-small".split(","),"dashed,dotted,double,groove,outset,ridge,solid".split(","),
@ -23,7 +24,7 @@ position:{cssPropBits:0,cssLitGroup:[J[23]],cssFns:[]},quotes:{cssPropBits:8,css
cssLitGroup:[J[14],J[69]],cssFns:[]},stress:"border-bottom-left-radius","table-layout":{cssPropBits:0,cssLitGroup:[J[52],J[61]],cssFns:[]},"text-align":{cssPropBits:0,cssLitGroup:[J[42],J[56],J[66]],cssFns:[]},"text-decoration":{cssPropBits:0,cssLitGroup:[J[19],J[71]],cssFns:[]},"text-indent":"border-bottom-left-radius","text-overflow":{cssPropBits:8,cssLitGroup:[J[33]],cssFns:[]},"text-shadow":"box-shadow","text-transform":{cssPropBits:0,cssLitGroup:[J[26],J[71]],cssFns:[]},"text-wrap":{cssPropBits:0,
cssLitGroup:[J[46],J[71],J[72]],cssFns:[]},top:"bottom",transform:{cssPropBits:0,cssLitGroup:[J[71]],cssFns:"matrix(),perspective(),rotate(),rotate3d(),rotatex(),rotatey(),rotatez(),scale(),scale3d(),scalex(),scaley(),scalez(),skew(),skewx(),skewy(),translate(),translate3d(),translatex(),translatey(),translatez()".split(",")},"transform-origin":"perspective-origin","transform-style":{cssPropBits:0,cssLitGroup:[J[37]],cssFns:[]},transition:{cssPropBits:1029,cssLitGroup:[J[10],J[48],J[50],J[71]],cssFns:["cubic-bezier()",
"steps()"]},"transition-delay":"animation-delay","transition-duration":"animation-delay","transition-property":{cssPropBits:1024,cssLitGroup:[J[48],J[50]],cssFns:[]},"transition-timing-function":"animation-timing-function","unicode-bidi":{cssPropBits:0,cssLitGroup:[J[30],J[72]],cssFns:[]},"vertical-align":{cssPropBits:5,cssLitGroup:[J[12],J[31]],cssFns:[]},visibility:"backface-visibility","voice-family":{cssPropBits:8,cssLitGroup:[J[27],J[48]],cssFns:[]},volume:{cssPropBits:1,cssLitGroup:[J[17],J[69]],
cssFns:[]},"white-space":{cssPropBits:0,cssLitGroup:[J[22],J[72]],cssFns:[]},width:"min-height","word-break":{cssPropBits:0,cssLitGroup:[J[32],J[72]],cssFns:[]},"word-spacing":"letter-spacing","word-wrap":"overflow-wrap","z-index":"bottom",zoom:"line-height","cubic-bezier()":"animation-delay","steps()":{cssPropBits:5,cssLitGroup:[J[36],J[48]],cssFns:[]},"image()":{cssPropBits:18,cssLitGroup:[J[0],J[48]],cssFns:["rgb()","rgba()"]},"linear-gradient()":{cssPropBits:7,cssLitGroup:[J[0],J[31],J[42],J[48],
cssFns:[]},"white-space":{cssPropBits:0,cssLitGroup:[J[22],J[72]],cssFns:[]},width:"min-height","word-break":{cssPropBits:0,cssLitGroup:[J[32],J[72],J[55]],cssFns:[]},"word-spacing":"letter-spacing","word-wrap":"overflow-wrap","z-index":"bottom",zoom:"line-height","cubic-bezier()":"animation-delay","steps()":{cssPropBits:5,cssLitGroup:[J[36],J[48]],cssFns:[]},"image()":{cssPropBits:18,cssLitGroup:[J[0],J[48]],cssFns:["rgb()","rgba()"]},"linear-gradient()":{cssPropBits:7,cssLitGroup:[J[0],J[31],J[42],J[48],
J[79]],cssFns:["rgb()","rgba()"]},"radial-gradient()":{cssPropBits:7,cssLitGroup:[J[0],J[11],J[31],J[42],J[48],J[56],J[57]],cssFns:["rgb()","rgba()"]},"repeating-linear-gradient()":"linear-gradient()","repeating-radial-gradient()":"radial-gradient()","rgb()":{cssPropBits:1,cssLitGroup:[J[48]],cssFns:[]},"rgba()":"rgb()","rect()":{cssPropBits:5,cssLitGroup:[J[48],J[52]],cssFns:[]},"alpha()":{cssPropBits:1,cssLitGroup:[J[28]],cssFns:[]},"matrix()":"animation-delay","perspective()":"border-bottom-left-radius",
"rotate()":"border-bottom-left-radius","rotate3d()":"animation-delay","rotatex()":"border-bottom-left-radius","rotatey()":"border-bottom-left-radius","rotatez()":"border-bottom-left-radius","scale()":"animation-delay","scale3d()":"animation-delay","scalex()":"border-bottom-left-radius","scaley()":"border-bottom-left-radius","scalez()":"border-bottom-left-radius","skew()":"animation-delay","skewx()":"border-bottom-left-radius","skewy()":"border-bottom-left-radius","translate()":"animation-delay","translate3d()":"animation-delay",
"translatex()":"border-bottom-left-radius","translatey()":"border-bottom-left-radius","translatez()":"border-bottom-left-radius"},O;for(O in L)"string"===typeof L[O]&&Object.hasOwnProperty.call(L,O)&&(L[O]=L[L[O]]);"undefined"!==typeof window&&(window.cssSchema=L);var U,X;

File diff suppressed because one or more lines are too long

View file

@ -90,6 +90,7 @@ chatLeft={1} has left
chatWindowTitle=Chat
chooseAnOption=Choose an option
chromeApp=Chrome App
collaborativeEditingNotice=Important Notice for Collaborative Editing
compressed=Compressed
commitMessage=Commit Message
csv=CSV
@ -244,6 +245,7 @@ exporting=Exporting
exportAs=Export as
exportOptionsDisabled=Export options disabled
exportOptionsDisabledDetails=The owner has disabled options to download, print or copy for commenters and viewers on this file.
externalChanges=External Changes
extras=Extras
facebook=Facebook
failedToSaveTryReconnect=Failed to save, trying to reconnect
@ -252,7 +254,7 @@ feedback=Feedback
feedbackSent=Feedback successfully sent.
floorplans=Floorplans
file=File
fileChangedOverwrite=File was changed. Overwrite changes?
fileChangedOverwrite=The file has been modified. Do you want to save the file and overwrite those changes?
overwrite=Overwrite
filename=Filename
fileExists=File already exists

View file

@ -90,6 +90,7 @@ chatLeft={1} has left
chatWindowTitle=Chat
chooseAnOption=Choose an option
chromeApp=Chrome App
collaborativeEditingNotice=Important Notice for Collaborative Editing
compressed=Compressed
commitMessage=Commit Message
csv=CSV
@ -244,6 +245,7 @@ exporting=Exporting
exportAs=Export as
exportOptionsDisabled=Export options disabled
exportOptionsDisabledDetails=The owner has disabled options to download, print or copy for commenters and viewers on this file.
externalChanges=External Changes
extras=Extras
facebook=Facebook
failedToSaveTryReconnect=Failed to save, trying to reconnect
@ -252,7 +254,7 @@ feedback=Feedback
feedbackSent=Feedback successfully sent.
floorplans=Floorplans
file=File
fileChangedOverwrite=File was changed. Overwrite changes?
fileChangedOverwrite=The file has been modified. Do you want to save the file and overwrite those changes?
overwrite=Overwrite
filename=Filename
fileExists=File already exists

View file

@ -90,6 +90,7 @@ chatLeft=‫غادر {1}
chatWindowTitle=‫دردشة‬
chooseAnOption=‫اختر خيارا‬
chromeApp=‫تطبيق Chrome
collaborativeEditingNotice=Important Notice for Collaborative Editing
compressed=Compressed
commitMessage=Commit Message
csv=CSV
@ -244,6 +245,7 @@ exporting=Exporting
exportAs=‫تصدير ك‬
exportOptionsDisabled=Export options disabled
exportOptionsDisabledDetails=The owner has disabled options to download, print or copy for commenters and viewers on this file.
externalChanges=External Changes
extras=‫إضافات‬
facebook=Facebook
failedToSaveTryReconnect=‫لم يتم الحفظ، محاولة إعادة الاتصال.
@ -252,7 +254,7 @@ feedback=‫تعليق‬
feedbackSent=‫تم إرسال التعليق بنجاح.
floorplans=Floorplans
file=‫ملف‬
fileChangedOverwrite=File was changed. Overwrite changes?
fileChangedOverwrite=The file has been modified. Do you want to save the file and overwrite those changes?
overwrite=Overwrite
filename=‫اسم الملف‬
fileExists=‫الملف موجود مسبقا‬

View file

@ -90,6 +90,7 @@ chatLeft={1} напусна
chatWindowTitle=Чат
chooseAnOption=Изберете опция
chromeApp=Chrome приложение
collaborativeEditingNotice=Important Notice for Collaborative Editing
compressed=Компресиран
commitMessage=Съобщение при подаване
csv=CSV
@ -244,6 +245,7 @@ exporting=Експортиране
exportAs=Експортиране като
exportOptionsDisabled=Опцията за експортиране е деактивирана
exportOptionsDisabledDetails=Собственикът е деактивирал опциите за изтегляне, принтиране и копиране за хората, които коментират и разглеждат този файл.
externalChanges=External Changes
extras=Екстри
facebook=Facebook
failedToSaveTryReconnect=Неуспешно запазване, опит за повторно свързване

View file

@ -90,6 +90,7 @@ chatLeft={1} has left
chatWindowTitle=Chat
chooseAnOption=Choose an option
chromeApp=Chrome App
collaborativeEditingNotice=Important Notice for Collaborative Editing
compressed=Compressed
commitMessage=Commit Message
csv=CSV
@ -244,6 +245,7 @@ exporting=Exporting
exportAs=Export as
exportOptionsDisabled=Export options disabled
exportOptionsDisabledDetails=The owner has disabled options to download, print or copy for commenters and viewers on this file.
externalChanges=External Changes
extras=Extras
facebook=Facebook
failedToSaveTryReconnect=Failed to save, trying to reconnect
@ -252,7 +254,7 @@ feedback=Feedback
feedbackSent=Feedback successfully sent.
floorplans=Floorplans
file=File
fileChangedOverwrite=File was changed. Overwrite changes?
fileChangedOverwrite=The file has been modified. Do you want to save the file and overwrite those changes?
overwrite=Overwrite
filename=Filename
fileExists=File already exists

View file

@ -90,6 +90,7 @@ chatLeft={1} je otišao
chatWindowTitle=Razgovor
chooseAnOption=Izaberite opciju
chromeApp=Chrome Aplikacija
collaborativeEditingNotice=Important Notice for Collaborative Editing
compressed=Kompresovano
commitMessage=Posveti poruku
csv=CSV
@ -244,6 +245,7 @@ exporting=Izvozi
exportAs=Izvezi kao
exportOptionsDisabled=Opcije izvoza onemogućene
exportOptionsDisabledDetails=Vlasnik je za ovaj fajl komentatorima i posjetiocima onemogućio preuzimanje, printanje i kopiranje.
externalChanges=External Changes
extras=Dodaci
facebook=Facebook
failedToSaveTryReconnect=Spašavanje nije uspjelo, pokušaj ponovnog povezivanja

View file

@ -90,6 +90,7 @@ chatLeft={1} ha sortit
chatWindowTitle=Xat
chooseAnOption=Escolliu una opció
chromeApp=Aplicació Chrome
collaborativeEditingNotice=Important Notice for Collaborative Editing
compressed=Comprimit
commitMessage=Missatge de Commit
csv=CSV
@ -244,6 +245,7 @@ exporting=Exportant
exportAs=Exporta com a
exportOptionsDisabled=Opcions d'exportació inactives
exportOptionsDisabledDetails=El propietari ha desactivat les opcions per a descarregar, imprimir o copiar aquest fitxer per las que només tenen permís per visualitzar i comentar.
externalChanges=External Changes
extras=Extres
facebook=Facebook
failedToSaveTryReconnect=Error en desar, intentant reconnectar

View file

@ -90,6 +90,7 @@ chatLeft={1} se odhlásil
chatWindowTitle=Chat
chooseAnOption=Vyberte možnost
chromeApp=Aplikace Chrome
collaborativeEditingNotice=Important Notice for Collaborative Editing
compressed=Komprimováno
commitMessage=Zpráva ke commitu
csv=CSV
@ -244,6 +245,7 @@ exporting=Exportuji
exportAs=Exportovat jako
exportOptionsDisabled=Možnost exportu je vypnutá
exportOptionsDisabledDetails=Vlastník pro komentující a diváky vypnul možnost stažení, tisku nebo kopírování.
externalChanges=External Changes
extras=Extra
facebook=Facebook
failedToSaveTryReconnect=Uložení se nezdařilo, zkouším se znovu připojit

View file

@ -90,6 +90,7 @@ chatLeft={1} har forladt chatten
chatWindowTitle=Chat
chooseAnOption=Vælg en mulighed
chromeApp=Chrome app
collaborativeEditingNotice=Important Notice for Collaborative Editing
compressed=Komprimeret
commitMessage=Commit Besked
csv=CSV
@ -244,6 +245,7 @@ exporting=Eksporterer
exportAs=Eksporterer som
exportOptionsDisabled=Eksportmuligheder deaktiveret
exportOptionsDisabledDetails=Ejeren har deaktiveret muligheder for at downloade, printe eller kopiere for kommentører og seere på denne fil.
externalChanges=External Changes
extras=Ekstra
facebook=Facebook
failedToSaveTryReconnect=Kunne ikke gemme, forsøger at genoprette forbindelsen

View file

@ -90,6 +90,7 @@ chatLeft={1} hat den Chat verlassen
chatWindowTitle=Chat
chooseAnOption=Wählen Sie eine Option
chromeApp=Chrome app
collaborativeEditingNotice=Wichtige Mitteilung für gemeinesames Bearbeiten
compressed=Komprimiert
commitMessage=Commit-Nachricht
csv=CSV
@ -244,6 +245,7 @@ exporting=Wird exportiert
exportAs=Exportieren als
exportOptionsDisabled=Exportoptionen deaktiviert
exportOptionsDisabledDetails=Der Nutzer hat die Optionen zum Herunterladen, Drucken und Kopieren dieser Datei für Nutzer mit Kommentier- und Lesezugriff deaktiviert.
externalChanges=Externe Änderungen
extras=Extras
facebook=Facebook
failedToSaveTryReconnect=Speichern fehlgeschlagen. Verbindungswiederherstellung
@ -252,7 +254,7 @@ feedback=Feedback
feedbackSent=Feedback erfolgreich versendet.
floorplans=Grundriss
file=Datei
fileChangedOverwrite=Datei wurde geändert. Änderungen überschreiben?
fileChangedOverwrite=Die Datei wurde geändert. Möchten Sie die Datei speichern und die Änderungen überschreiben?
overwrite=Überschreiben
filename=Dateiname
fileExists=Datei existiert bereits

View file

@ -90,6 +90,7 @@ chatLeft={1} έχει εξέρθει
chatWindowTitle=Chat
chooseAnOption=Διαλέξτε μια επιλογή
chromeApp=Εφαρμογή Chrome
collaborativeEditingNotice=Important Notice for Collaborative Editing
compressed=Συμπιεσμένο
commitMessage=Υποβολή μυνήματος
csv=CSV
@ -244,6 +245,7 @@ exporting=Γίνετε εξαγωγή
exportAs=Εξαγωγή ως
exportOptionsDisabled=Οι επιλογές εξαγωγής έχουν απενεργοποιηθεί
exportOptionsDisabledDetails=Ο ιδιοκτήτης έχει απενεργοποιήσει τις επιλογές λήψης, εκτύπωσης ή αντιγραφής του αρχείου για τους σχολιαστές και τους θεατές.
externalChanges=External Changes
extras=Extras
facebook=Facebook
failedToSaveTryReconnect=Αποτυχία αποθήκευσης, γίνεται προσπάθεια επανασύνδεσης

View file

@ -1,14 +1,14 @@
# *DO NOT DIRECTLY EDIT THIS FILE, IT IS AUTOMATICALLY GENERATED AND IT IS BASED ON:*
# https://docs.google.com/spreadsheet/ccc?key=0AmQEO36liL4FdDJLWVNMaVV2UmRKSnpXU09MYkdGbEE
aboutDrawio=Pri draw.io
accessDenied=Access Denied
action=Action
actualSize=Actual Size
accessDenied=Aliro rifuzita
action=Ago
actualSize=Vera grandeco
add=Aldoni
addedFile=Added {1}
addedFile={1} aldonita
addImages=Aldoni bildojn
addImageUrl=Add Image URL
addLayer=Add Layer
addLayer=Aldoni tavolon
addProperty=Aldoni econ
address=Adreso
addToExistingDrawing=Add to Existing Drawing
@ -24,7 +24,7 @@ allSpaces=All Spaces
allTags=All Tags
anchor=Anchor
android=Android
angle=Angle
angle=Angulo
arc=Arc
areYouSure=Ĉu vi certas?
ensureDataSaved=Please ensure your data is saved before closing.
@ -81,15 +81,16 @@ center=Center
cannotLoad=Load attempts failed. Please try again later.
cannotLogin=Log in attempts failed. Please try again later.
cannotOpenFile=Cannot open file
change=Change
change=Ŝanĝi
changeOrientation=Change Orientation
changeUser=Change user
changeUser=Ŝanĝi uzanton
changesNotSaved=Changes have not been saved
chatJoined={1} has joined
chatLeft={1} has left
chatWindowTitle=Chat
chooseAnOption=Choose an option
chromeApp=Chrome App
collaborativeEditingNotice=Important Notice for Collaborative Editing
compressed=Compressed
commitMessage=Commit Message
csv=CSV
@ -244,6 +245,7 @@ exporting=Exporting
exportAs=Export as
exportOptionsDisabled=Export options disabled
exportOptionsDisabledDetails=The owner has disabled options to download, print or copy for commenters and viewers on this file.
externalChanges=External Changes
extras=Extras
facebook=Facebook
failedToSaveTryReconnect=Failed to save, trying to reconnect
@ -252,7 +254,7 @@ feedback=Feedback
feedbackSent=Feedback successfully sent.
floorplans=Floorplans
file=Dosiero
fileChangedOverwrite=File was changed. Overwrite changes?
fileChangedOverwrite=The file has been modified. Do you want to save the file and overwrite those changes?
overwrite=Overwrite
filename=Dosiernomo
fileExists=File already exists

View file

@ -90,6 +90,7 @@ chatLeft={1} se ha ido
chatWindowTitle=Chat
chooseAnOption=Elegir una opción
chromeApp=Aplicación Chrome
collaborativeEditingNotice=Important Notice for Collaborative Editing
compressed=Comprimido
commitMessage=Confirmar mensaje
csv=CSV
@ -244,6 +245,7 @@ exporting=Exportando
exportAs=Exportar como
exportOptionsDisabled=Las opciones para exportar están deshabilitadas
exportOptionsDisabledDetails=El propietario ha deshabilitado las opciones de descargar, imprimir o copiar para los comentadores u observadores de este archivo.
externalChanges=External Changes
extras=Extras
facebook=Facebook
failedToSaveTryReconnect=Falló al guardar, intentando reconectar

View file

@ -90,6 +90,7 @@ chatLeft={1} lahkus
chatWindowTitle=Chat
chooseAnOption=Tee valik
chromeApp=Chrome App
collaborativeEditingNotice=Important Notice for Collaborative Editing
compressed=Pakitud
commitMessage=Kinnita sõnum
csv=CSV
@ -244,6 +245,7 @@ exporting=Eksport
exportAs=Ekspordi nimega
exportOptionsDisabled=Ekspordi valikud keelatud
exportOptionsDisabledDetails=Faili omanik on keelanud võimaluse kommenteerijatel ja vaatajatel sisu alla laadida, printida või kopeerida.
externalChanges=External Changes
extras=Lisad
facebook=Facebook
failedToSaveTryReconnect=Salvestamine ebaõnnestunud, proov ühendust luua

View file

@ -90,6 +90,7 @@ chatLeft={1} خارج شده است.
chatWindowTitle=‫چت‬
chooseAnOption=‫یک گزینه را انتخاب نمایید‬
chromeApp=‫اپلیکیشن کروم‬
collaborativeEditingNotice=Important Notice for Collaborative Editing
compressed=‫فشرده‬
commitMessage=‫تایید پیام‬
csv=CSV
@ -244,6 +245,7 @@ exporting=‫در حال فرستادن‬
exportAs=‫فرستادن به عنوان‬
exportOptionsDisabled=‫گزینه های فرستادن غیرفعال گشته اند‬
exportOptionsDisabledDetails=‫دارنده امکان دانلود، چاپ و کپی برای نظردهندگان و بینندگان این فایل را غیرفعال کرده است.
externalChanges=External Changes
extras=‫موارد اضافی‬
facebook=‫فیسبوک‬
failedToSaveTryReconnect=‫عدم ذخیره سازی، سعی در اتصال مجدد‬

View file

@ -90,6 +90,7 @@ chatLeft={1} lähti pois keskustelusta
chatWindowTitle=Chat
chooseAnOption=Valitse vaihtoehto
chromeApp=Chrome-sovellus
collaborativeEditingNotice=Important Notice for Collaborative Editing
compressed=Pakattu
commitMessage=Lähetä viesti
csv=CSV
@ -244,6 +245,7 @@ exporting=Viedään
exportAs=Vie nimellä
exportOptionsDisabled=Vientivalinnat pois käytöstä
exportOptionsDisabledDetails=Omistaja on poistanut valinnat lataamiseen, tulostamiseen tai kopioimiseen kommentoijille ja katsojille tässä tiedostossa.
externalChanges=External Changes
extras=Extrat
facebook=Facebook
failedToSaveTryReconnect=Tallentaminen epäonnistui, yritetään yhdistää uudelleen

View file

@ -90,6 +90,7 @@ chatLeft={1} ay umalis
chatWindowTitle=Pag-uusap
chooseAnOption=Magtakda ng Pagpipilian
chromeApp=Chrome App
collaborativeEditingNotice=Important Notice for Collaborative Editing
compressed=Siniksik
commitMessage=Maglagak ng mensahe
csv=CSV
@ -244,6 +245,7 @@ exporting=Iniluluwas
exportAs=Iluwas bilang
exportOptionsDisabled=Ang mga pagpipilian sa pagluwas ay di pinagana
exportOptionsDisabledDetails=Di pinagana ng may-ari ang mga pagpipilian para mag download, iprinta, o kumopya para sa mga nagkukumento o tumitingin ng file na ito.
externalChanges=External Changes
extras=Mga dagdag
facebook=Facebook
failedToSaveTryReconnect=Bigong mag-save, sinusubukang kumonektang muli.

View file

@ -90,6 +90,7 @@ chatLeft={1} a quitté le chat
chatWindowTitle=Chat
chooseAnOption=Choisir une option
chromeApp=Application Chrome
collaborativeEditingNotice=Important Notice for Collaborative Editing
compressed=Compressé
commitMessage=Message commit
csv=CSV
@ -244,6 +245,7 @@ exporting=Exportation
exportAs=Exporter en tant que
exportOptionsDisabled=Possibilités d'export désactivées
exportOptionsDisabledDetails=Le propriétaire a désactivé les possibilités de téléchargement, d'impression ou de copie pour les commentateurs et observateurs sur ce fichier.
externalChanges=External Changes
extras=Suppléments
facebook=Facebook
failedToSaveTryReconnect=La sauvegarde a échoué, tentative de reconnexion

View file

@ -90,6 +90,7 @@ chatLeft={1} has left
chatWindowTitle=Chat
chooseAnOption=Choose an option
chromeApp=Chrome App
collaborativeEditingNotice=Important Notice for Collaborative Editing
compressed=Compressed
commitMessage=Commit Message
csv=CSV
@ -244,6 +245,7 @@ exporting=Exporting
exportAs=Export as
exportOptionsDisabled=Export options disabled
exportOptionsDisabledDetails=The owner has disabled options to download, print or copy for commenters and viewers on this file.
externalChanges=External Changes
extras=Extras
facebook=Facebook
failedToSaveTryReconnect=Failed to save, trying to reconnect
@ -252,7 +254,7 @@ feedback=Feedback
feedbackSent=Feedback successfully sent.
floorplans=Floorplans
file=File
fileChangedOverwrite=File was changed. Overwrite changes?
fileChangedOverwrite=The file has been modified. Do you want to save the file and overwrite those changes?
overwrite=Overwrite
filename=Filename
fileExists=File already exists

View file

@ -90,6 +90,7 @@ chatLeft={1} עזב‬
chatWindowTitle=‫צ'אט‬
chooseAnOption=‫בחר אפשרות‬
chromeApp=‫אפליקציית כרום‬
collaborativeEditingNotice=Important Notice for Collaborative Editing
compressed=‫דחוס‬
commitMessage=‫הודעת commit
csv=CSV
@ -244,6 +245,7 @@ exporting=‫ייצוא‬
exportAs=‫ייצא בתור‬
exportOptionsDisabled=‫האפשרות לייצא הושבתה‬
exportOptionsDisabledDetails=‫האחראי הגביל את האפשרות להוריד, להדפיס או להעתיק עבור מגיבים וצופים בקובץ זה.
externalChanges=External Changes
extras=‫תוספות‬
facebook=‫פייסבוק‬
failedToSaveTryReconnect=‫השמירה נכשלה, מנסה להתחבר מחדש‬

View file

@ -90,6 +90,7 @@ chatLeft={1} has left
chatWindowTitle=Chat
chooseAnOption=Choose an option
chromeApp=Chrome App
collaborativeEditingNotice=Important Notice for Collaborative Editing
compressed=Compressed
commitMessage=Commit Message
csv=CSV
@ -244,6 +245,7 @@ exporting=Exporting
exportAs=Export as
exportOptionsDisabled=Export options disabled
exportOptionsDisabledDetails=The owner has disabled options to download, print or copy for commenters and viewers on this file.
externalChanges=External Changes
extras=Extras
facebook=Facebook
failedToSaveTryReconnect=Failed to save, trying to reconnect
@ -252,7 +254,7 @@ feedback=Feedback
feedbackSent=Feedback successfully sent.
floorplans=Floorplans
file=File
fileChangedOverwrite=File was changed. Overwrite changes?
fileChangedOverwrite=The file has been modified. Do you want to save the file and overwrite those changes?
overwrite=Overwrite
filename=Filename
fileExists=File already exists

View file

@ -90,6 +90,7 @@ chatLeft={1} has left
chatWindowTitle=Chat
chooseAnOption=Choose an option
chromeApp=Chrome App
collaborativeEditingNotice=Important Notice for Collaborative Editing
compressed=Compressed
commitMessage=Commit Message
csv=CSV
@ -244,6 +245,7 @@ exporting=Exporting
exportAs=Export as
exportOptionsDisabled=Export options disabled
exportOptionsDisabledDetails=The owner has disabled options to download, print or copy for commenters and viewers on this file.
externalChanges=External Changes
extras=Extras
facebook=Facebook
failedToSaveTryReconnect=Failed to save, trying to reconnect
@ -252,7 +254,7 @@ feedback=Feedback
feedbackSent=Feedback successfully sent.
floorplans=Floorplans
file=File
fileChangedOverwrite=File was changed. Overwrite changes?
fileChangedOverwrite=The file has been modified. Do you want to save the file and overwrite those changes?
overwrite=Overwrite
filename=Filename
fileExists=File already exists

View file

@ -90,6 +90,7 @@ chatLeft={1} távozott
chatWindowTitle=Cseveg
chooseAnOption=Válasszon opciót
chromeApp=Chrome App
collaborativeEditingNotice=Important Notice for Collaborative Editing
compressed=Tömörített
commitMessage=Üzenetet küld
csv=CSV
@ -244,6 +245,7 @@ exporting=Exportálás folyamatban
exportAs=Exportálás másként
exportOptionsDisabled=Exportálási opciók letiltva
exportOptionsDisabledDetails=A tulajdonos letiltotta a letöltési, nyomtatási vagy másolási opciókat a kommentelőknek és nézőknek ezen a fájlon.
externalChanges=External Changes
extras=Extrák
facebook=Facebook
failedToSaveTryReconnect=Sikertelen mentés, próbáljon újrakapcsolódni

View file

@ -90,6 +90,7 @@ chatLeft=chatLeft
chatWindowTitle=chatWindowTitle
chooseAnOption=chooseAnOption
chromeApp=chromeApp
collaborativeEditingNotice=collaborativeEditingNotice
compressed=compressed
commitMessage=commitMessage
csv=csv
@ -244,6 +245,7 @@ exporting=exporting
exportAs=exportAs
exportOptionsDisabled=exportOptionsDisabled
exportOptionsDisabledDetails=exportOptionsDisabledDetails
externalChanges=externalChanges
extras=extras
facebook=facebook
failedToSaveTryReconnect=failedToSaveTryReconnect

View file

@ -90,6 +90,7 @@ chatLeft={1} keluar
chatWindowTitle=Obrolan
chooseAnOption=Pilih salah satu opsi
chromeApp=Aplikasi Chrome
collaborativeEditingNotice=Important Notice for Collaborative Editing
compressed=Mampat
commitMessage=Kirim Pesan
csv=CSV
@ -244,6 +245,7 @@ exporting=Mengekspor
exportAs=Ekspor sebagai
exportOptionsDisabled=Pilihan ekspor nonaktif
exportOptionsDisabledDetails=Pemilik telah menonaktifkan opsi unduh, cetak, atau salin untuk pengomentar dan pembaca berkas ini.
externalChanges=External Changes
extras=Ekstra
facebook=Facebook
failedToSaveTryReconnect=Gagal menyimpan, mencoba menghubungkan kembali

View file

@ -90,6 +90,7 @@ chatLeft={1} è uscito
chatWindowTitle=Chat
chooseAnOption=Scegli un'opzione
chromeApp=App Chrome
collaborativeEditingNotice=Important Notice for Collaborative Editing
compressed=Compresso
commitMessage=Invia il messaggio
csv=CSV
@ -244,6 +245,7 @@ exporting=Esportando
exportAs=Esporta come
exportOptionsDisabled=Opzioni di esporto disabilitate
exportOptionsDisabledDetails=Il proprietario ha disabilitato le opzioni di download, stampa e copia per i commentatori ed i lettori del file.
externalChanges=External Changes
extras=Altro
facebook=Facebook
failedToSaveTryReconnect=Impossibile salvare, riconnessione in corso

View file

@ -90,6 +90,7 @@ chatLeft={1} がチャットを去りました。
chatWindowTitle=チャット
chooseAnOption=オプションを選んでください
chromeApp=Chrome アプリ
collaborativeEditingNotice=Important Notice for Collaborative Editing
compressed=圧縮
commitMessage=メッセージを省略する
csv=CSV
@ -244,6 +245,7 @@ exporting=エクスポート中
exportAs=形式を指定してエクスポート
exportOptionsDisabled=エクスポートは使えません
exportOptionsDisabledDetails=所有者は、視聴者や編集者がダウンロード、印刷、コピーをすることを認めていません。
externalChanges=External Changes
extras=拡張
facebook=フェイスブック
failedToSaveTryReconnect=保存に失敗しました。再接続中です。

View file

@ -90,6 +90,7 @@ chatLeft={1} has left
chatWindowTitle=Chat
chooseAnOption=Choose an option
chromeApp=Chrome App
collaborativeEditingNotice=Important Notice for Collaborative Editing
compressed=Compressed
commitMessage=Commit Message
csv=CSV
@ -244,6 +245,7 @@ exporting=Exporting
exportAs=Export as
exportOptionsDisabled=Export options disabled
exportOptionsDisabledDetails=The owner has disabled options to download, print or copy for commenters and viewers on this file.
externalChanges=External Changes
extras=Extras
facebook=Facebook
failedToSaveTryReconnect=Failed to save, trying to reconnect
@ -252,7 +254,7 @@ feedback=Feedback
feedbackSent=Feedback successfully sent.
floorplans=Floorplans
file=File
fileChangedOverwrite=File was changed. Overwrite changes?
fileChangedOverwrite=The file has been modified. Do you want to save the file and overwrite those changes?
overwrite=Overwrite
filename=Filename
fileExists=File already exists

View file

@ -90,6 +90,7 @@ chatLeft={1}님이 대화에서 나갔습니다
chatWindowTitle=대화창
chooseAnOption=옵션 선택
chromeApp=크롬 앱
collaborativeEditingNotice=Important Notice for Collaborative Editing
compressed=압축
commitMessage=메세지 전송
csv=CSV
@ -244,6 +245,7 @@ exporting=내보내는 중
exportAs=다른 파일 형식으로 내보내기
exportOptionsDisabled=내보내기 옵션 사용불가
exportOptionsDisabledDetails=소유자가 확인자 및 주석자들의 다운로드, 인쇄, 복사를 허용하지 않습니다.
externalChanges=External Changes
extras=추가 도구
facebook=페이스북
failedToSaveTryReconnect=저장 실패, 재연결중

View file

@ -90,6 +90,7 @@ chatLeft={1} has left
chatWindowTitle=Chat
chooseAnOption=Choose an option
chromeApp=Chrome App
collaborativeEditingNotice=Important Notice for Collaborative Editing
compressed=Compressed
commitMessage=Commit Message
csv=CSV
@ -244,6 +245,7 @@ exporting=Exporting
exportAs=Export as
exportOptionsDisabled=Export options disabled
exportOptionsDisabledDetails=The owner has disabled options to download, print or copy for commenters and viewers on this file.
externalChanges=External Changes
extras=Extras
facebook=Facebook
failedToSaveTryReconnect=Failed to save, trying to reconnect
@ -252,7 +254,7 @@ feedback=Feedback
feedbackSent=Feedback successfully sent.
floorplans=Floorplans
file=File
fileChangedOverwrite=File was changed. Overwrite changes?
fileChangedOverwrite=The file has been modified. Do you want to save the file and overwrite those changes?
overwrite=Overwrite
filename=Filename
fileExists=File already exists

View file

@ -90,6 +90,7 @@ chatLeft={1} has left
chatWindowTitle=Chat
chooseAnOption=Choose an option
chromeApp=Chrome App
collaborativeEditingNotice=Important Notice for Collaborative Editing
compressed=Compressed
commitMessage=Commit Message
csv=CSV
@ -244,6 +245,7 @@ exporting=Exporting
exportAs=Export as
exportOptionsDisabled=Export options disabled
exportOptionsDisabledDetails=The owner has disabled options to download, print or copy for commenters and viewers on this file.
externalChanges=External Changes
extras=Extras
facebook=Facebook
failedToSaveTryReconnect=Failed to save, trying to reconnect
@ -252,7 +254,7 @@ feedback=Feedback
feedbackSent=Feedback successfully sent.
floorplans=Floorplans
file=File
fileChangedOverwrite=File was changed. Overwrite changes?
fileChangedOverwrite=The file has been modified. Do you want to save the file and overwrite those changes?
overwrite=Overwrite
filename=Filename
fileExists=File already exists

View file

@ -90,6 +90,7 @@ chatLeft={1} has left
chatWindowTitle=Chat
chooseAnOption=Choose an option
chromeApp=Chrome App
collaborativeEditingNotice=Important Notice for Collaborative Editing
compressed=Compressed
commitMessage=Commit Message
csv=CSV
@ -244,6 +245,7 @@ exporting=Exporting
exportAs=Export as
exportOptionsDisabled=Export options disabled
exportOptionsDisabledDetails=The owner has disabled options to download, print or copy for commenters and viewers on this file.
externalChanges=External Changes
extras=Extras
facebook=Facebook
failedToSaveTryReconnect=Failed to save, trying to reconnect
@ -252,7 +254,7 @@ feedback=Feedback
feedbackSent=Feedback successfully sent.
floorplans=Floorplans
file=File
fileChangedOverwrite=File was changed. Overwrite changes?
fileChangedOverwrite=The file has been modified. Do you want to save the file and overwrite those changes?
overwrite=Overwrite
filename=Filename
fileExists=File already exists

View file

@ -90,6 +90,7 @@ chatLeft={1} has left
chatWindowTitle=Chat
chooseAnOption=Choose an option
chromeApp=Chrome App
collaborativeEditingNotice=Important Notice for Collaborative Editing
compressed=Compressed
commitMessage=Commit Message
csv=CSV
@ -244,6 +245,7 @@ exporting=Exporting
exportAs=Export as
exportOptionsDisabled=Export options disabled
exportOptionsDisabledDetails=The owner has disabled options to download, print or copy for commenters and viewers on this file.
externalChanges=External Changes
extras=Extras
facebook=Facebook
failedToSaveTryReconnect=Failed to save, trying to reconnect
@ -252,7 +254,7 @@ feedback=Feedback
feedbackSent=Feedback successfully sent.
floorplans=Floorplans
file=File
fileChangedOverwrite=File was changed. Overwrite changes?
fileChangedOverwrite=The file has been modified. Do you want to save the file and overwrite those changes?
overwrite=Overwrite
filename=Filename
fileExists=File already exists

View file

@ -90,6 +90,7 @@ chatLeft={1} telah beredar
chatWindowTitle=Sembang
chooseAnOption=Pilih satu opsyen
chromeApp=Aplikasi Chrome
collaborativeEditingNotice=Important Notice for Collaborative Editing
compressed=Mampat
commitMessage=Hantar Mesej
csv=CSV
@ -244,6 +245,7 @@ exporting=Mengeksport
exportAs=Eksport sebagai
exportOptionsDisabled=Pilihan eksport dilumpuhkan
exportOptionsDisabledDetails=Pemilik telah melumpuhkan pilihan untuk memuat turun, mencetak atau menyalin untuk pengulas dan penonton pada fail ini.
externalChanges=External Changes
extras=Tambahan
facebook=Facebook
failedToSaveTryReconnect=Gagal untuk menyimpan, cuba untuk menyambung semula

View file

@ -2,7 +2,7 @@
# https://docs.google.com/spreadsheet/ccc?key=0AmQEO36liL4FdDJLWVNMaVV2UmRKSnpXU09MYkdGbEE
aboutDrawio=Over draw.io
accessDenied=Toegang geweigerd
action=Action
action=Actie
actualSize=Ware grootte
add=Toevoegen
addedFile={1} toegevoegd
@ -90,6 +90,7 @@ chatLeft={1} is vertrokken
chatWindowTitle=Chat
chooseAnOption=Kies een optie
chromeApp=Chrome App
collaborativeEditingNotice=Important Notice for Collaborative Editing
compressed=Gecomprimeerd
commitMessage=Bericht vastleggen
csv=CSV
@ -128,7 +129,7 @@ copy=Kopiëren
copyConnect=Kopiëren bij verbinding
copyOf=Kopie van {1}
copyOfDrawing=Kopie van tekening
copySize=Copy Size
copySize=Afmetingen kopiëren
copyStyle=Stijl kopiëren
create=Aanmaken
createNewDiagram=Nieuw diagram aanmaken
@ -174,7 +175,7 @@ doubleClickOrientation=Dubbelklik om oriëntatie te wijzigen
doubleClickTooltip=Dubbelklik om tekst in te voegen
doubleClickChangeProperty=Dubbelklik om eigenschapsnaam te wijzigen
download=Downloaden
downloadDesktop=Download draw.io Desktop
downloadDesktop=draw.io Bureaublad-app downloaden
downloadAs=Downloaden als
clickHereToSave=Klik hier om op te slaan.
draftDiscarded=Concept genegeerd
@ -244,6 +245,7 @@ exporting=Exporteren
exportAs=Exporteren als
exportOptionsDisabled=Exportopties uitgeschakeld
exportOptionsDisabledDetails=De eigenaar heeft opties voor het downloaden, afdrukken of kopiëren uitgeschakeld voor commentatoren en bekijkers van dit bestand.
externalChanges=External Changes
extras=Extra's
facebook=Facebook
failedToSaveTryReconnect=Opslaan mislukt, opnieuw verbinden maken
@ -513,7 +515,7 @@ paperSize=Papiergrootte
pattern=Patroon
paste=Plakken
pasteHere=Hier plakken
pasteSize=Paste Size
pasteSize=Afmetingen plakken
pasteStyle=Stijl plakken
perimeter=Begrenzing
permissionAnyone=Iedereen kan bewerken
@ -553,7 +555,7 @@ realtimeTimeout=Het lijkt alsof u enkele wijzigingen hebt aangebracht terwijl u
redo=Opnieuw
refresh=Herladen
regularExpression=Reguliere expressie
relative=Relative
relative=Relatief
relativeUrlNotAllowed=Relatieve URL niet toegestaan
rememberMe=Onthoud mij
rememberThisSetting=Deze instelling onthouden
@ -697,7 +699,7 @@ updatingPreview=Voorbeeld wordt bijgewerkt. Even wachten...
updatingSelection=Selectie wordt bijgewerkt. Even wachten...
upload=Uploaden
url=URL
useOffline=Use Offline
useOffline=Offline gebruiken
useRootFolder=Hoofdmap gebruiken?
userManual=Gebruikershandleiding
vertical=Verticaal

View file

@ -90,6 +90,7 @@ chatLeft={1} har dratt
chatWindowTitle=Chat
chooseAnOption=Velg et alternativ
chromeApp=Chrome-app
collaborativeEditingNotice=Important Notice for Collaborative Editing
compressed=Komprimert
commitMessage=Forpliktende Melding
csv=CSV
@ -244,6 +245,7 @@ exporting=Eksporterer
exportAs=Eksporter som
exportOptionsDisabled=Eksport alternativer deaktivert
exportOptionsDisabledDetails=Eieren har deaktivert nedlastning, print og kopieringsalternativer for kommentatorer og seere for denne filen.
externalChanges=External Changes
extras=Ekstra
facebook=Facebook
failedToSaveTryReconnect=Feil under lagring, prøver å koble til på nytt

View file

@ -90,6 +90,7 @@ chatLeft={1} opuścił
chatWindowTitle=Chat
chooseAnOption=Wybierz opcję
chromeApp=Aplikacja Chrome
collaborativeEditingNotice=Important Notice for Collaborative Editing
compressed=Skompresowany
commitMessage=commit Wiadomość
csv=CSV
@ -244,6 +245,7 @@ exporting=Eksportowanie
exportAs=Eksportuj jako
exportOptionsDisabled=Opcja eksporu została zablokowana
exportOptionsDisabledDetails=Właściciel zablokował możliwość pobierania, drukowania i kopiowania dla przeglądających i komentujących.
externalChanges=External Changes
extras=Dodatki
facebook=Facebook
failedToSaveTryReconnect=Błąd zapisu, próbuję połączyć ponownie

View file

@ -90,6 +90,7 @@ chatLeft={1} saiu
chatWindowTitle=Bate-papo
chooseAnOption=Escolha uma opção
chromeApp=Aplicativo Chrome
collaborativeEditingNotice=Important Notice for Collaborative Editing
compressed=Comprimido
commitMessage=Cometer mensagem
csv=CSV
@ -244,6 +245,7 @@ exporting=Exportando
exportAs=Exportar como
exportOptionsDisabled=Exportar opções desabilitadas
exportOptionsDisabledDetails=O proprietário desabilitou as opções de download, impressão ou cópia para comentadores e visualizadores neste arquivo.
externalChanges=External Changes
extras=Extras
facebook=Facebook
failedToSaveTryReconnect=Falha ao salvar, tentando reconetar

View file

@ -90,6 +90,7 @@ chatLeft={1} saiu
chatWindowTitle=Conversa
chooseAnOption=Escolha uma opção
chromeApp=Chrome App
collaborativeEditingNotice=Important Notice for Collaborative Editing
compressed=Compactado
commitMessage=Mensagem da alteração
csv=CSV
@ -244,6 +245,7 @@ exporting=Exportando
exportAs=Exportar como
exportOptionsDisabled=Exportar opções desactivadas
exportOptionsDisabledDetails=O proprietário desactivou as opções de descarga, impressão ou cópia para comentadores e visuaizados neste ficheiro.
externalChanges=External Changes
extras=Extras
facebook=Facebook
failedToSaveTryReconnect=Falha ao salvar, tentando reconetar

View file

@ -90,6 +90,7 @@ chatLeft={1} a plecat
chatWindowTitle=Chat
chooseAnOption=Alege o opţiune
chromeApp=Aplicaţie Chrome
collaborativeEditingNotice=Important Notice for Collaborative Editing
compressed=Comprimat
commitMessage=Comite un mesaj
csv=CSV
@ -244,6 +245,7 @@ exporting=Se exportează
exportAs=Exportează ca
exportOptionsDisabled=Opțiunile de export au fost dezactivate
exportOptionsDisabledDetails=Deținătorul a dezactivat posibilitațile de download, imprimare sau copiere pentru comentatorii și vizualizatorii acestei pagini.
externalChanges=External Changes
extras=Extra
facebook=Facebook
failedToSaveTryReconnect=Salvare eșuată, se încearcă reconectarea

View file

@ -90,6 +90,7 @@ chatLeft={1} вышел
chatWindowTitle=Чат
chooseAnOption=Выберите вариант
chromeApp=Приложение Chrome
collaborativeEditingNotice=Important Notice for Collaborative Editing
compressed=Сжато
commitMessage=Сообщение при коммите
csv=CSV
@ -244,6 +245,7 @@ exporting=Экспорт
exportAs=Экспортировать как
exportOptionsDisabled=Возможности экспорта отключены
exportOptionsDisabledDetails=Владелец файла отключил возможности сохранения, печати или копирования данных при просмотре и комментировании этого файла.
externalChanges=External Changes
extras=Дополнительно
facebook=Facebook
failedToSaveTryReconnect=Ошибка при сохранении, выполняется повторное подключение

View file

@ -90,6 +90,7 @@ chatLeft={1} has left
chatWindowTitle=Chat
chooseAnOption=Choose an option
chromeApp=Chrome App
collaborativeEditingNotice=Important Notice for Collaborative Editing
compressed=Compressed
commitMessage=Commit Message
csv=CSV
@ -244,6 +245,7 @@ exporting=Exporting
exportAs=Export as
exportOptionsDisabled=Export options disabled
exportOptionsDisabledDetails=The owner has disabled options to download, print or copy for commenters and viewers on this file.
externalChanges=External Changes
extras=Extras
facebook=Facebook
failedToSaveTryReconnect=Failed to save, trying to reconnect
@ -252,7 +254,7 @@ feedback=Feedback
feedbackSent=Feedback successfully sent.
floorplans=Floorplans
file=File
fileChangedOverwrite=File was changed. Overwrite changes?
fileChangedOverwrite=The file has been modified. Do you want to save the file and overwrite those changes?
overwrite=Overwrite
filename=Filename
fileExists=File already exists

View file

@ -90,6 +90,7 @@ chatLeft={1} has left
chatWindowTitle=Chat
chooseAnOption=Choose an option
chromeApp=Chrome App
collaborativeEditingNotice=Important Notice for Collaborative Editing
compressed=Compressed
commitMessage=Commit Message
csv=CSV
@ -244,6 +245,7 @@ exporting=Exporting
exportAs=Export as
exportOptionsDisabled=Export options disabled
exportOptionsDisabledDetails=The owner has disabled options to download, print or copy for commenters and viewers on this file.
externalChanges=External Changes
extras=Extras
facebook=Facebook
failedToSaveTryReconnect=Failed to save, trying to reconnect
@ -252,7 +254,7 @@ feedback=Feedback
feedbackSent=Feedback successfully sent.
floorplans=Floorplans
file=File
fileChangedOverwrite=File was changed. Overwrite changes?
fileChangedOverwrite=The file has been modified. Do you want to save the file and overwrite those changes?
overwrite=Overwrite
filename=Filename
fileExists=File already exists

View file

@ -90,6 +90,7 @@ chatLeft={1} je otišao
chatWindowTitle=Razgovor
chooseAnOption=Izaberite opciju
chromeApp=Chrome Aplikacija
collaborativeEditingNotice=Important Notice for Collaborative Editing
compressed=Komprimovan
commitMessage=Commit Message
csv=CSV
@ -244,6 +245,7 @@ exporting=Izvoz
exportAs=Izvezi kao
exportOptionsDisabled=Mogućnost izvoza je onemogućena
exportOptionsDisabledDetails=Vlasnik je onesposobio mogućnost preuzimanja, štampanja i kopiranja za komentatore i posmatrače ovog dokumenta.
externalChanges=External Changes
extras=Dodaci
facebook=Facebook
failedToSaveTryReconnect=Neuspelo snimanje, pokušaj rekonekcije

View file

@ -90,6 +90,7 @@ chatLeft={1} har lämnat
chatWindowTitle=Chatt
chooseAnOption=Välj ett alternativ
chromeApp=Chrome app
collaborativeEditingNotice=Important Notice for Collaborative Editing
compressed=Komprimerad
commitMessage=Skicka meddelande
csv=CSV
@ -244,6 +245,7 @@ exporting=Exportering
exportAs=Exportera som
exportOptionsDisabled=Exporteringsval inaktiverade
exportOptionsDisabledDetails=Ägaren har inaktiverat nerladdning, skriv ut eller kopiera för kommenterare och åskådare för denna fil.
externalChanges=External Changes
extras=Extrafunktioner
facebook=Facebook
failedToSaveTryReconnect=Kunde inte spara, försöker återansluta

View file

@ -90,6 +90,7 @@ chatLeft={1} has left
chatWindowTitle=Chat
chooseAnOption=Choose an option
chromeApp=Chrome App
collaborativeEditingNotice=Important Notice for Collaborative Editing
compressed=Compressed
commitMessage=Commit Message
csv=CSV
@ -244,6 +245,7 @@ exporting=Exporting
exportAs=Export as
exportOptionsDisabled=Export options disabled
exportOptionsDisabledDetails=The owner has disabled options to download, print or copy for commenters and viewers on this file.
externalChanges=External Changes
extras=Extras
facebook=Facebook
failedToSaveTryReconnect=Failed to save, trying to reconnect
@ -252,7 +254,7 @@ feedback=Feedback
feedbackSent=Feedback successfully sent.
floorplans=Floorplans
file=File
fileChangedOverwrite=File was changed. Overwrite changes?
fileChangedOverwrite=The file has been modified. Do you want to save the file and overwrite those changes?
overwrite=Overwrite
filename=Filename
fileExists=File already exists

View file

@ -90,6 +90,7 @@ chatLeft={1} has left
chatWindowTitle=Chat
chooseAnOption=Choose an option
chromeApp=Chrome App
collaborativeEditingNotice=Important Notice for Collaborative Editing
compressed=Compressed
commitMessage=Commit Message
csv=CSV
@ -244,6 +245,7 @@ exporting=Exporting
exportAs=Export as
exportOptionsDisabled=Export options disabled
exportOptionsDisabledDetails=The owner has disabled options to download, print or copy for commenters and viewers on this file.
externalChanges=External Changes
extras=Extras
facebook=Facebook
failedToSaveTryReconnect=Failed to save, trying to reconnect
@ -252,7 +254,7 @@ feedback=Feedback
feedbackSent=Feedback successfully sent.
floorplans=Floorplans
file=File
fileChangedOverwrite=File was changed. Overwrite changes?
fileChangedOverwrite=The file has been modified. Do you want to save the file and overwrite those changes?
overwrite=Overwrite
filename=Filename
fileExists=File already exists

View file

@ -90,6 +90,7 @@ chatLeft={1} has left
chatWindowTitle=Chat
chooseAnOption=Choose an option
chromeApp=Chrome App
collaborativeEditingNotice=Important Notice for Collaborative Editing
compressed=Compressed
commitMessage=Commit Message
csv=CSV
@ -244,6 +245,7 @@ exporting=Exporting
exportAs=Export as
exportOptionsDisabled=Export options disabled
exportOptionsDisabledDetails=The owner has disabled options to download, print or copy for commenters and viewers on this file.
externalChanges=External Changes
extras=Extras
facebook=Facebook
failedToSaveTryReconnect=Failed to save, trying to reconnect
@ -252,7 +254,7 @@ feedback=Feedback
feedbackSent=Feedback successfully sent.
floorplans=Floorplans
file=File
fileChangedOverwrite=File was changed. Overwrite changes?
fileChangedOverwrite=The file has been modified. Do you want to save the file and overwrite those changes?
overwrite=Overwrite
filename=Filename
fileExists=File already exists

View file

@ -90,6 +90,7 @@ chatLeft={1} ได้ออกจากระบบ
chatWindowTitle=แชท
chooseAnOption=เลือกหนึ่งตัวเลือก
chromeApp=โครมแอพลิเคชั่น
collaborativeEditingNotice=Important Notice for Collaborative Editing
compressed=บีบอัดแล้ว
commitMessage=ข้อความสัญญา
csv=CSV
@ -244,6 +245,7 @@ exporting=การส่่งออก
exportAs=ส่งออกเป็น
exportOptionsDisabled=ตัวเลือกการส่งออกถูกปิดใช้งาน
exportOptionsDisabledDetails=เจ้าของได้ปิดการใช้งานดาวน์โหลด พิมพ์หรือสำเนาสำหรับผู้แสดงความเห็นและผู้ชมไฟล์นี้
externalChanges=External Changes
extras=เอ็กซ์ตร้า
facebook=Facebook
failedToSaveTryReconnect=การบันทึกล้มเหลว กำลังพยายามเชื่อมต่อใหม่

View file

@ -90,6 +90,7 @@ chatLeft={1} sohbeti terk etti
chatWindowTitle=Sohbet
chooseAnOption=Bir seçenek seçin
chromeApp=Chrome Uygulaması
collaborativeEditingNotice=Important Notice for Collaborative Editing
compressed=Sıkıştırılmış
commitMessage=Mesaj oluştur
csv=CSV
@ -244,6 +245,7 @@ exporting=Dışa aktarma
exportAs=Farklı dışa aktar
exportOptionsDisabled=Dışa aktarma seçenekleri devre dışı
exportOptionsDisabledDetails=Yetkili, indirme, basım veya yorumlayıcılar için kopyalama seçeneklerini devre dışı bıraktı.
externalChanges=External Changes
extras=Ekstralar
facebook=Facebook
failedToSaveTryReconnect=Kaydetme başarısız, tekrar bağlanmayı deniyor

View file

@ -90,6 +90,7 @@ chatLeft={1} вийшов
chatWindowTitle=Чат
chooseAnOption=Оберіть варіант
chromeApp=Додаток Chrome
collaborativeEditingNotice=Important Notice for Collaborative Editing
compressed=Стисло
commitMessage=Повідомлення при коміті
csv=CSV
@ -244,6 +245,7 @@ exporting=Експортуємо
exportAs=Експортувати як
exportOptionsDisabled=Можливості експорту відключено
exportOptionsDisabledDetails=Власник відключив можливості скачування, друку та копіювання цього файлу для коментаторів та глядачів.
externalChanges=External Changes
extras=Додатково
facebook=Facebook
failedToSaveTryReconnect=Не вдалося зберегти, спроба повторного підключення

View file

@ -90,6 +90,7 @@ chatLeft={1} đã thoát
chatWindowTitle=Chat
chooseAnOption=Chọn một tùy chọn
chromeApp=Ứng dụng Chrome
collaborativeEditingNotice=Important Notice for Collaborative Editing
compressed=Đã nén
commitMessage=Nội dung thay đổi
csv=CSV
@ -244,6 +245,7 @@ exporting=Đang xuất tập tin
exportAs=Xuất tập tin dưới dạng
exportOptionsDisabled=Lựa chọn xuất tập tin bị vô hiệu hóa
exportOptionsDisabledDetails=Người sở hữu đã vô hiệu hóa quyền tải xuống, in hoặc sao chép đối với người bình luận hoặc người xem tập tin này.
externalChanges=External Changes
extras=Bổ sung
facebook=Facebook
failedToSaveTryReconnect=Lưu thất bại, đang thử kết nối lại

View file

@ -90,6 +90,7 @@ chatLeft={1}已離開
chatWindowTitle=交談
chooseAnOption=請選擇一項
chromeApp=Chrome應用
collaborativeEditingNotice=Important Notice for Collaborative Editing
compressed=已壓縮
commitMessage=提交訊息
csv=CSV
@ -244,6 +245,7 @@ exporting=匯出中
exportAs=匯出為
exportOptionsDisabled=已禁用匯出
exportOptionsDisabledDetails=所有者已禁止評論者和瀏覽者下載,列印或複制此檔案。
externalChanges=External Changes
extras=其他
facebook=Facebook
failedToSaveTryReconnect=存檔失敗,正嘗試重新連線

View file

@ -90,6 +90,7 @@ chatLeft={1}已离开
chatWindowTitle=聊天
chooseAnOption=请选择一项
chromeApp=Chrome应用软件
collaborativeEditingNotice=Important Notice for Collaborative Editing
compressed=已压缩
commitMessage=提交信息
csv=CSV
@ -244,6 +245,7 @@ exporting=导出中
exportAs=导出为
exportOptionsDisabled=已禁止导出
exportOptionsDisabledDetails=所有者已禁止评论者及浏览者下载、打印或复制该文件。
externalChanges=External Changes
extras=其它
facebook=Facebook
failedToSaveTryReconnect=保存失败,正在尝试重新连接