From 6f4f2a66ee1c852f2c7da6c0689fcaecad77a327 Mon Sep 17 00:00:00 2001 From: Mark 'kaosat-dev' Moissette Date: Sat, 7 Jan 2017 09:11:31 +0100 Subject: [PATCH] chore(build): updated build --- dist/cli.js | 2169 +++++++++++++++++++++++++++++++++++++++++- dist/cli.js.map | 2 +- dist/index.js | 2269 ++++++++++++++++++++++++++++++++++++++++++-- dist/module.js | 2169 +++++++++++++++++++++++++++++++++++++++++- dist/module.js.map | 2 +- 5 files changed, 6540 insertions(+), 71 deletions(-) diff --git a/dist/cli.js b/dist/cli.js index fdb9f5572..ab3af0c51 100644 --- a/dist/cli.js +++ b/dist/cli.js @@ -6950,9 +6950,2172 @@ CSG.Vertex.prototype.toAMFString = function () { return '' + this.pos.toAMFString() + '\n' }*/ +function createCommonjsModule(fn, module) { + return module = { exports: {} }, fn(module, module.exports), module.exports; +} + +//[4] NameStartChar ::= ":" | [A-Z] | "_" | [a-z] | [#xC0-#xD6] | [#xD8-#xF6] | [#xF8-#x2FF] | [#x370-#x37D] | [#x37F-#x1FFF] | [#x200C-#x200D] | [#x2070-#x218F] | [#x2C00-#x2FEF] | [#x3001-#xD7FF] | [#xF900-#xFDCF] | [#xFDF0-#xFFFD] | [#x10000-#xEFFFF] +//[4a] NameChar ::= NameStartChar | "-" | "." | [0-9] | #xB7 | [#x0300-#x036F] | [#x203F-#x2040] +//[5] Name ::= NameStartChar (NameChar)* +var nameStartChar = /[A-Z_a-z\xC0-\xD6\xD8-\xF6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]/;//\u10000-\uEFFFF +var nameChar = new RegExp("[\\-\\.0-9"+nameStartChar.source.slice(1,-1)+"\\u00B7\\u0300-\\u036F\\u203F-\\u2040]"); +var tagNamePattern = new RegExp('^'+nameStartChar.source+nameChar.source+'*(?:\:'+nameStartChar.source+nameChar.source+'*)?$'); +//var tagNamePattern = /^[a-zA-Z_][\w\-\.]*(?:\:[a-zA-Z_][\w\-\.]*)?$/ +//var handlers = 'resolveEntity,getExternalSubset,characters,endDocument,endElement,endPrefixMapping,ignorableWhitespace,processingInstruction,setDocumentLocator,skippedEntity,startDocument,startElement,startPrefixMapping,notationDecl,unparsedEntityDecl,error,fatalError,warning,attributeDecl,elementDecl,externalEntityDecl,internalEntityDecl,comment,endCDATA,endDTD,endEntity,startCDATA,startDTD,startEntity'.split(',') + +//S_TAG, S_ATTR, S_EQ, S_ATTR_NOQUOT_VALUE +//S_ATTR_SPACE, S_ATTR_END, S_TAG_SPACE, S_TAG_CLOSE +var S_TAG = 0;//tag name offerring +var S_ATTR = 1;//attr name offerring +var S_ATTR_SPACE=2;//attr name end and space offer +var S_EQ = 3;//=space? +var S_ATTR_NOQUOT_VALUE = 4;//attr value(no quot value only) +var S_ATTR_END = 5;//attr value end and no space(quot end) +var S_TAG_SPACE = 6;//(attr value end || tag end ) && (space offer) +var S_TAG_CLOSE = 7;//closed el + +function XMLReader(){ + +} + +XMLReader.prototype = { + parse:function(source,defaultNSMap,entityMap){ + var domBuilder = this.domBuilder; + domBuilder.startDocument(); + _copy(defaultNSMap ,defaultNSMap = {}); + parse(source,defaultNSMap,entityMap, + domBuilder,this.errorHandler); + domBuilder.endDocument(); + } +}; +function parse(source,defaultNSMapCopy,entityMap,domBuilder,errorHandler){ + function fixedFromCharCode(code) { + // String.prototype.fromCharCode does not supports + // > 2 bytes unicode chars directly + if (code > 0xffff) { + code -= 0x10000; + var surrogate1 = 0xd800 + (code >> 10) + , surrogate2 = 0xdc00 + (code & 0x3ff); + + return String.fromCharCode(surrogate1, surrogate2); + } else { + return String.fromCharCode(code); + } + } + function entityReplacer(a){ + var k = a.slice(1,-1); + if(k in entityMap){ + return entityMap[k]; + }else if(k.charAt(0) === '#'){ + return fixedFromCharCode(parseInt(k.substr(1).replace('x','0x'))) + }else{ + errorHandler.error('entity not found:'+a); + return a; + } + } + function appendText(end){//has some bugs + if(end>start){ + var xt = source.substring(start,end).replace(/&#?\w+;/g,entityReplacer); + locator&&position(start); + domBuilder.characters(xt,0,end-start); + start = end; + } + } + function position(p,m){ + while(p>=lineEnd && (m = linePattern.exec(source))){ + lineStart = m.index; + lineEnd = lineStart + m[0].length; + locator.lineNumber++; + //console.log('line++:',locator,startPos,endPos) + } + locator.columnNumber = p-lineStart+1; + } + var lineStart = 0; + var lineEnd = 0; + var linePattern = /.*(?:\r\n?|\n)|.*$/g; + var locator = domBuilder.locator; + + var parseStack = [{currentNSMap:defaultNSMapCopy}]; + var closeMap = {}; + var start = 0; + while(true){ + try{ + var tagStart = source.indexOf('<',start); + if(tagStart<0){ + if(!source.substr(start).match(/^\s*$/)){ + var doc = domBuilder.doc; + var text = doc.createTextNode(source.substr(start)); + doc.appendChild(text); + domBuilder.currentElement = text; + } + return; + } + if(tagStart>start){ + appendText(tagStart); + } + switch(source.charAt(tagStart+1)){ + case '/': + var end = source.indexOf('>',tagStart+3); + var tagName = source.substring(tagStart+2,end); + var config = parseStack.pop(); + if(end<0){ + + tagName = source.substring(tagStart+2).replace(/[\s<].*/,''); + //console.error('#@@@@@@'+tagName) + errorHandler.error("end tag name: "+tagName+' is not complete:'+config.tagName); + end = tagStart+1+tagName.length; + }else if(tagName.match(/\s + locator&&position(tagStart); + end = parseInstruction(source,tagStart,domBuilder); + break; + case '!':// start){ + start = end; + }else{ + //TODO: 这里有可能sax回退,有位置错误风险 + appendText(Math.max(tagStart,start)+1); + } + } +} +function copyLocator(f,t){ + t.lineNumber = f.lineNumber; + t.columnNumber = f.columnNumber; + return t; +} + +/** + * @see #appendElement(source,elStartEnd,el,selfClosed,entityReplacer,domBuilder,parseStack); + * @return end of the elementStartPart(end of elementEndPart for selfClosed el) + */ +function parseElementStartPart(source,start,el,currentNSMap,entityReplacer,errorHandler){ + var attrName; + var value; + var p = ++start; + var s = S_TAG;//status + while(true){ + var c = source.charAt(p); + switch(c){ + case '=': + if(s === S_ATTR){//attrName + attrName = source.slice(start,p); + s = S_EQ; + }else if(s === S_ATTR_SPACE){ + s = S_EQ; + }else{ + //fatalError: equal must after attrName or space after attrName + throw new Error('attribute equal must after attrName'); + } + break; + case '\'': + case '"': + if(s === S_EQ || s === S_ATTR //|| s == S_ATTR_SPACE + ){//equal + if(s === S_ATTR){ + errorHandler.warning('attribute value must after "="'); + attrName = source.slice(start,p); + } + start = p+1; + p = source.indexOf(c,start); + if(p>0){ + value = source.slice(start,p).replace(/&#?\w+;/g,entityReplacer); + el.add(attrName,value,start-1); + s = S_ATTR_END; + }else{ + //fatalError: no end quot match + throw new Error('attribute value no end \''+c+'\' match'); + } + }else if(s == S_ATTR_NOQUOT_VALUE){ + value = source.slice(start,p).replace(/&#?\w+;/g,entityReplacer); + //console.log(attrName,value,start,p) + el.add(attrName,value,start); + //console.dir(el) + errorHandler.warning('attribute "'+attrName+'" missed start quot('+c+')!!'); + start = p+1; + s = S_ATTR_END; + }else{ + //fatalError: no equal before + throw new Error('attribute value must after "="'); + } + break; + case '/': + switch(s){ + case S_TAG: + el.setTagName(source.slice(start,p)); + case S_ATTR_END: + case S_TAG_SPACE: + case S_TAG_CLOSE: + s =S_TAG_CLOSE; + el.closed = true; + case S_ATTR_NOQUOT_VALUE: + case S_ATTR: + case S_ATTR_SPACE: + break; + //case S_EQ: + default: + throw new Error("attribute invalid close char('/')") + } + break; + case ''://end document + //throw new Error('unexpected end of input') + errorHandler.error('unexpected end of input'); + if(s == S_TAG){ + el.setTagName(source.slice(start,p)); + } + return p; + case '>': + switch(s){ + case S_TAG: + el.setTagName(source.slice(start,p)); + case S_ATTR_END: + case S_TAG_SPACE: + case S_TAG_CLOSE: + break;//normal + case S_ATTR_NOQUOT_VALUE://Compatible state + case S_ATTR: + value = source.slice(start,p); + if(value.slice(-1) === '/'){ + el.closed = true; + value = value.slice(0,-1); + } + case S_ATTR_SPACE: + if(s === S_ATTR_SPACE){ + value = attrName; + } + if(s == S_ATTR_NOQUOT_VALUE){ + errorHandler.warning('attribute "'+value+'" missed quot(")!!'); + el.add(attrName,value.replace(/&#?\w+;/g,entityReplacer),start); + }else{ + if(currentNSMap[''] !== 'http://www.w3.org/1999/xhtml' || !value.match(/^(?:disabled|checked|selected)$/i)){ + errorHandler.warning('attribute "'+value+'" missed value!! "'+value+'" instead!!'); + } + el.add(value,value,start); + } + break; + case S_EQ: + throw new Error('attribute value missed!!'); + } +// console.log(tagName,tagNamePattern,tagNamePattern.test(tagName)) + return p; + /*xml space '\x20' | #x9 | #xD | #xA; */ + case '\u0080': + c = ' '; + default: + if(c<= ' '){//space + switch(s){ + case S_TAG: + el.setTagName(source.slice(start,p));//tagName + s = S_TAG_SPACE; + break; + case S_ATTR: + attrName = source.slice(start,p); + s = S_ATTR_SPACE; + break; + case S_ATTR_NOQUOT_VALUE: + var value = source.slice(start,p).replace(/&#?\w+;/g,entityReplacer); + errorHandler.warning('attribute "'+value+'" missed quot(")!!'); + el.add(attrName,value,start); + case S_ATTR_END: + s = S_TAG_SPACE; + break; + //case S_TAG_SPACE: + //case S_EQ: + //case S_ATTR_SPACE: + // void();break; + //case S_TAG_CLOSE: + //ignore warning + } + }else{//not space +//S_TAG, S_ATTR, S_EQ, S_ATTR_NOQUOT_VALUE +//S_ATTR_SPACE, S_ATTR_END, S_TAG_SPACE, S_TAG_CLOSE + switch(s){ + //case S_TAG:void();break; + //case S_ATTR:void();break; + //case S_ATTR_NOQUOT_VALUE:void();break; + case S_ATTR_SPACE: + var tagName = el.tagName; + if(currentNSMap[''] !== 'http://www.w3.org/1999/xhtml' || !attrName.match(/^(?:disabled|checked|selected)$/i)){ + errorHandler.warning('attribute "'+attrName+'" missed value!! "'+attrName+'" instead2!!'); + } + el.add(attrName,attrName,start); + start = p; + s = S_ATTR; + break; + case S_ATTR_END: + errorHandler.warning('attribute space is required"'+attrName+'"!!'); + case S_TAG_SPACE: + s = S_ATTR; + start = p; + break; + case S_EQ: + s = S_ATTR_NOQUOT_VALUE; + start = p; + break; + case S_TAG_CLOSE: + throw new Error("elements closed character '/' and '>' must be connected to"); + } + } + }//end outer switch + //console.log('p++',p) + p++; + } +} +/** + * @return true if has new namespace define + */ +function appendElement(el,domBuilder,currentNSMap){ + var tagName = el.tagName; + var localNSMap = null; + //var currentNSMap = parseStack[parseStack.length-1].currentNSMap; + var i = el.length; + while(i--){ + var a = el[i]; + var qName = a.qName; + var value = a.value; + var nsp = qName.indexOf(':'); + if(nsp>0){ + var prefix = a.prefix = qName.slice(0,nsp); + var localName = qName.slice(nsp+1); + var nsPrefix = prefix === 'xmlns' && localName; + }else{ + localName = qName; + prefix = null; + nsPrefix = qName === 'xmlns' && ''; + } + //can not set prefix,because prefix !== '' + a.localName = localName ; + //prefix == null for no ns prefix attribute + if(nsPrefix !== false){//hack!! + if(localNSMap == null){ + localNSMap = {}; + //console.log(currentNSMap,0) + _copy(currentNSMap,currentNSMap={}); + //console.log(currentNSMap,1) + } + currentNSMap[nsPrefix] = localNSMap[nsPrefix] = value; + a.uri = 'http://www.w3.org/2000/xmlns/'; + domBuilder.startPrefixMapping(nsPrefix, value); + } + } + var i = el.length; + while(i--){ + a = el[i]; + var prefix = a.prefix; + if(prefix){//no prefix attribute has no namespace + if(prefix === 'xml'){ + a.uri = 'http://www.w3.org/XML/1998/namespace'; + }if(prefix !== 'xmlns'){ + a.uri = currentNSMap[prefix || '']; + + //{console.log('###'+a.qName,domBuilder.locator.systemId+'',currentNSMap,a.uri)} + } + } + } + var nsp = tagName.indexOf(':'); + if(nsp>0){ + prefix = el.prefix = tagName.slice(0,nsp); + localName = el.localName = tagName.slice(nsp+1); + }else{ + prefix = null;//important!! + localName = el.localName = tagName; + } + //no prefix element has default namespace + var ns = el.uri = currentNSMap[prefix || '']; + domBuilder.startElement(ns,localName,tagName,el); + //endPrefixMapping and startPrefixMapping have not any help for dom builder + //localNSMap = null + if(el.closed){ + domBuilder.endElement(ns,localName,tagName); + if(localNSMap){ + for(prefix in localNSMap){ + domBuilder.endPrefixMapping(prefix); + } + } + }else{ + el.currentNSMap = currentNSMap; + el.localNSMap = localNSMap; + //parseStack.push(el); + return true; + } +} +function parseHtmlSpecialContent(source,elStartEnd,tagName,entityReplacer,domBuilder){ + if(/^(?:script|textarea)$/i.test(tagName)){ + var elEndStart = source.indexOf('',elStartEnd); + var text = source.substring(elStartEnd+1,elEndStart); + if(/[&<]/.test(text)){ + if(/^script$/i.test(tagName)){ + //if(!/\]\]>/.test(text)){ + //lexHandler.startCDATA(); + domBuilder.characters(text,0,text.length); + //lexHandler.endCDATA(); + return elEndStart; + //} + }//}else{//text area + text = text.replace(/&#?\w+;/g,entityReplacer); + domBuilder.characters(text,0,text.length); + return elEndStart; + //} + + } + } + return elStartEnd+1; +} +function fixSelfClosed(source,elStartEnd,tagName,closeMap){ + //if(tagName in closeMap){ + var pos = closeMap[tagName]; + if(pos == null){ + //console.log(tagName) + pos = source.lastIndexOf(''); + if(pos',start+4); + //append comment source.substring(4,end)//"); + case DOCUMENT_TYPE_NODE: + var pubid = node.publicId; + var sysid = node.systemId; + buf.push(''); + }else if(sysid && sysid!='.'){ + buf.push(' SYSTEM "',sysid,'">'); + }else{ + var sub = node.internalSubset; + if(sub){ + buf.push(" [",sub,"]"); + } + buf.push(">"); + } + return; + case PROCESSING_INSTRUCTION_NODE: + return buf.push( ""); + case ENTITY_REFERENCE_NODE: + return buf.push( '&',node.nodeName,';'); + //case ENTITY_NODE: + //case NOTATION_NODE: + default: + buf.push('??',node.nodeName); + } +} +function importNode(doc,node,deep){ + var node2; + switch (node.nodeType) { + case ELEMENT_NODE: + node2 = node.cloneNode(false); + node2.ownerDocument = doc; + //var attrs = node2.attributes; + //var len = attrs.length; + //for(var i=0;i','amp':'&','quot':'"','apos':"'"}; + if(locator){ + domBuilder.setDocumentLocator(locator); + } + + sax$$1.errorHandler = buildErrorHandler(errorHandler,domBuilder,locator); + sax$$1.domBuilder = options.domBuilder || domBuilder; + if(/\/x?html?$/.test(mimeType)){ + entityMap.nbsp = '\xa0'; + entityMap.copy = '\xa9'; + defaultNSMap['']= 'http://www.w3.org/1999/xhtml'; + } + defaultNSMap.xml = defaultNSMap.xml || 'http://www.w3.org/XML/1998/namespace'; + if(source){ + sax$$1.parse(source,defaultNSMap,entityMap); + }else{ + sax$$1.errorHandler.error("invalid doc source"); + } + return domBuilder.doc; +}; +function buildErrorHandler(errorImpl,domBuilder,locator){ + if(!errorImpl){ + if(domBuilder instanceof DOMHandler){ + return domBuilder; + } + errorImpl = domBuilder ; + } + var errorHandler = {}; + var isCallback = errorImpl instanceof Function; + locator = locator||{}; + function build(key){ + var fn = errorImpl[key]; + if(!fn && isCallback){ + fn = errorImpl.length == 2?function(msg){errorImpl(key,msg);}:errorImpl; + } + errorHandler[key] = fn && function(msg){ + fn('[xmldom '+key+']\t'+msg+_locator(locator)); + }||function(){}; + } + build('warning'); + build('error'); + build('fatalError'); + return errorHandler; +} + +//console.log('#\n\n\n\n\n\n\n####') +/** + * +ContentHandler+ErrorHandler + * +LexicalHandler+EntityResolver2 + * -DeclHandler-DTDHandler + * + * DefaultHandler:EntityResolver, DTDHandler, ContentHandler, ErrorHandler + * DefaultHandler2:DefaultHandler,LexicalHandler, DeclHandler, EntityResolver2 + * @link http://www.saxproject.org/apidoc/org/xml/sax/helpers/DefaultHandler.html + */ +function DOMHandler() { + this.cdata = false; +} +function position(locator,node){ + node.lineNumber = locator.lineNumber; + node.columnNumber = locator.columnNumber; +} +/** + * @see org.xml.sax.ContentHandler#startDocument + * @link http://www.saxproject.org/apidoc/org/xml/sax/ContentHandler.html + */ +DOMHandler.prototype = { + startDocument : function() { + this.doc = new DOMImplementation().createDocument(null, null, null); + if (this.locator) { + this.doc.documentURI = this.locator.systemId; + } + }, + startElement:function(namespaceURI, localName, qName, attrs) { + var this$1 = this; + + var doc = this.doc; + var el = doc.createElementNS(namespaceURI, qName||localName); + var len = attrs.length; + appendElement(this, el); + this.currentElement = el; + + this.locator && position(this.locator,el); + for (var i = 0 ; i < len; i++) { + var namespaceURI = attrs.getURI(i); + var value = attrs.getValue(i); + var qName = attrs.getQName(i); + var attr = doc.createAttributeNS(namespaceURI, qName); + this$1.locator &&position(attrs.getLocator(i),attr); + attr.value = attr.nodeValue = value; + el.setAttributeNode(attr); + } + }, + endElement:function(namespaceURI, localName, qName) { + var current = this.currentElement; + var tagName = current.tagName; + this.currentElement = current.parentNode; + }, + startPrefixMapping:function(prefix, uri) { + }, + endPrefixMapping:function(prefix) { + }, + processingInstruction:function(target, data) { + var ins = this.doc.createProcessingInstruction(target, data); + this.locator && position(this.locator,ins); + appendElement(this, ins); + }, + ignorableWhitespace:function(ch, start, length) { + }, + characters:function(chars, start, length) { + chars = _toString.apply(this,arguments); + //console.log(chars) + if(chars){ + if (this.cdata) { + var charNode = this.doc.createCDATASection(chars); + } else { + var charNode = this.doc.createTextNode(chars); + } + if(this.currentElement){ + this.currentElement.appendChild(charNode); + }else if(/^\s*$/.test(chars)){ + this.doc.appendChild(charNode); + //process xml + } + this.locator && position(this.locator,charNode); + } + }, + skippedEntity:function(name) { + }, + endDocument:function() { + this.doc.normalize(); + }, + setDocumentLocator:function (locator) { + if(this.locator = locator){// && !('lineNumber' in locator)){ + locator.lineNumber = 0; + } + }, + //LexicalHandler + comment:function(chars, start, length) { + chars = _toString.apply(this,arguments); + var comm = this.doc.createComment(chars); + this.locator && position(this.locator,comm); + appendElement(this, comm); + }, + + startCDATA:function() { + //used in characters() methods + this.cdata = true; + }, + endCDATA:function() { + this.cdata = false; + }, + + startDTD:function(name, publicId, systemId) { + var impl = this.doc.implementation; + if (impl && impl.createDocumentType) { + var dt = impl.createDocumentType(name, publicId, systemId); + this.locator && position(this.locator,dt); + appendElement(this, dt); + } + }, + /** + * @see org.xml.sax.ErrorHandler + * @link http://www.saxproject.org/apidoc/org/xml/sax/ErrorHandler.html + */ + warning:function(error) { + console.warn('[xmldom warning]\t'+error,_locator(this.locator)); + }, + error:function(error) { + console.error('[xmldom error]\t'+error,_locator(this.locator)); + }, + fatalError:function(error) { + console.error('[xmldom fatalError]\t'+error,_locator(this.locator)); + throw error; + } +}; +function _locator(l){ + if(l){ + return '\n@'+(l.systemId ||'')+'#[line:'+l.lineNumber+',col:'+l.columnNumber+']' + } +} +function _toString(chars,start,length){ + if(typeof chars == 'string'){ + return chars.substr(start,length) + }else{//java sax connect width xmldom on rhino(what about: "? && !(chars instanceof String)") + if(chars.length >= start+length || start){ + return new java.lang.String(chars,start,length)+''; + } + return chars; + } +} + +/* + * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/LexicalHandler.html + * used method of org.xml.sax.ext.LexicalHandler: + * #comment(chars, start, length) + * #startCDATA() + * #endCDATA() + * #startDTD(name, publicId, systemId) + * + * + * IGNORED method of org.xml.sax.ext.LexicalHandler: + * #endDTD() + * #startEntity(name) + * #endEntity(name) + * + * + * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/DeclHandler.html + * IGNORED method of org.xml.sax.ext.DeclHandler + * #attributeDecl(eName, aName, type, mode, value) + * #elementDecl(name, model) + * #externalEntityDecl(name, publicId, systemId) + * #internalEntityDecl(name, value) + * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/EntityResolver2.html + * IGNORED method of org.xml.sax.EntityResolver2 + * #resolveEntity(String name,String publicId,String baseURI,String systemId) + * #resolveEntity(publicId, systemId) + * #getExternalSubset(name, baseURI) + * @link http://www.saxproject.org/apidoc/org/xml/sax/DTDHandler.html + * IGNORED method of org.xml.sax.DTDHandler + * #notationDecl(name, publicId, systemId) {}; + * #unparsedEntityDecl(name, publicId, systemId, notationName) {}; + */ +"endDTD,startEntity,endEntity,attributeDecl,elementDecl,externalEntityDecl,internalEntityDecl,resolveEntity,getExternalSubset,notationDecl,unparsedEntityDecl".replace(/\w+/g,function(key){ + DOMHandler.prototype[key] = function(){return null}; +}); + +/* Private static helpers treated below as private instance methods, so don't need to add these to the public API; we might use a Relator to also get rid of non-standard public properties */ +function appendElement (hander,node) { + if (!hander.currentElement) { + hander.doc.appendChild(node); + } else { + hander.currentElement.appendChild(node); + } +}//appendChild and setAttributeNS are preformance key + +//if(typeof require == 'function'){ + var XMLReader = sax.XMLReader; + var DOMImplementation = exports.DOMImplementation = dom.DOMImplementation; + exports.XMLSerializer = dom.XMLSerializer ; + exports.DOMParser = DOMParser; +//} +}); + var Blob$6 = makeBlob(); +var XMLSerializer$$1 = domParser.XMLSerializer; +// NOTE: might be useful :https://github.com/jindw/xmldom/pull/152/commits/be5176ece6fa1591daef96a5f361aaacaa445175 + function toX3D (CSG) { + var DOMImplementation$$1 = typeof document !== 'undefined' ? document.implementation : new domParser.DOMImplementation(); // materialPolygonLists // key: a color string (e.g. "0 1 1" for yellow) // value: an array of strings specifying polygons of this color @@ -6999,9 +9162,9 @@ function toX3D (CSG) { }); // create output document - var docType = document.implementation.createDocumentType('X3D', + var docType = DOMImplementation$$1.createDocumentType('X3D', 'ISO//Web3D//DTD X3D 3.1//EN', 'http://www.web3d.org/specifications/x3d-3.1.dtd'); - var exportDoc = document.implementation.createDocument(null, 'X3D', docType); + var exportDoc = DOMImplementation$$1.createDocument(null, 'X3D', docType); exportDoc.insertBefore( exportDoc.createProcessingInstruction('xml', 'version="1.0" encoding="UTF-8"'), exportDoc.doctype); @@ -7053,7 +9216,7 @@ function toX3D (CSG) { } } - var x3dstring = (new XMLSerializer()).serializeToString(exportDoc); + var x3dstring = (new XMLSerializer$$1()).serializeToString(exportDoc); return new Blob$6([x3dstring], { type: 'model/x3d+xml' }) diff --git a/dist/cli.js.map b/dist/cli.js.map index 57f52a228..08112c9f8 100644 --- a/dist/cli.js.map +++ b/dist/cli.js.map @@ -1 +1 @@ -{"version":3,"file":null,"sources":["../src/jscad/version.js","../src/jscad/env.js","../src/csg.js","../src/utils/Blob.js","../src/io/writers/CSGToStla.js","../src/io/writers/CSGToStlb.js","../src/io/writers/CSGToAMF.js","../src/io/writers/CSGToX3D.js","../src/io/writers/CAGtoSvg.js","../src/io/writers/CAGToJson.js","../src/io/writers/CAGtoDxf.js","../src/utils/misc.js","../src/io/convertToBlob.js","../src/jscad/jscad-function.js","../src/jscad/includeJscadSync.js","../src/modeling/primitives2d.js","../src/modeling/ops-extrusions.js","../src/modeling/primitives3d.js","../src/modeling/ops-booleans.js","../src/modeling/ops-transformations.js","../src/modeling/color.js","../src/modeling/maths.js","../src/modeling/text.js","../src/modeling/debug.js","../src/jscad/log.js","../src/modeling/index.js","../src/jscad/rebuildSolid.js","../src/utils/getParameterDefinitionsCLI.js","../src/io/formats.js","../src/utils/generateOutputData.js","../src/cli.js"],"sourcesContent":["const json = require('../../package.json')\nexport const version = json.version // TODO/ add version date ?\n","import { version } from './version'\n\nexport default function env () {\n var env = 'OpenJSCAD ' + version\n if (typeof document !== 'undefined') {\n var w = document.defaultView\n env = env + ' [' + w.navigator.userAgent + ']'\n } else {\n if (typeof require === 'function') {\n var os = require('os')\n env = env + ' [' + os.type() + ':' + os.release() + ',' + os.platform() + ':' + os.arch() + ']'\n }\n }\n console.log(env)\n}\n","/*\n\n## IMPORTANT NOTE --- IMPORTANT \nThe master for this file is located at:\nhttps://github.com/joostn/openjscad/tree/gh-pages\nThat is the gh-pages branch of the joostn/openjscad project\nIf contributing from openjscad.org, please do NOT edit this local file but make pull requests against\nabove joostn/gh-pages branch.\n## IMPORTANT NOTE --- IMPORTANT NOTE\n\n\n## License\n\nCopyright (c) 2014 bebbi (elghatta@gmail.com)\nCopyright (c) 2013 Eduard Bespalov (edwbes@gmail.com)\nCopyright (c) 2012 Joost Nieuwenhuijse (joost@newhouse.nl)\nCopyright (c) 2011 Evan Wallace (http://evanw.github.com/csg.js/)\nCopyright (c) 2012 Alexandre Girard (https://github.com/alx)\n\nAll code released under MIT license\n\n## Overview\n\nFor an overview of the CSG process see the original csg.js code:\nhttp://evanw.github.com/csg.js/\n\nCSG operations through BSP trees suffer from one problem: heavy fragmentation\nof polygons. If two CSG solids of n polygons are unified, the resulting solid may have\nin the order of n*n polygons, because each polygon is split by the planes of all other\npolygons. After a few operations the number of polygons explodes.\n\nThis version of CSG.js solves the problem in 3 ways:\n\n1. Every polygon split is recorded in a tree (CSG.PolygonTreeNode). This is a separate\ntree, not to be confused with the CSG tree. If a polygon is split into two parts but in\nthe end both fragments have not been discarded by the CSG operation, we can retrieve\nthe original unsplit polygon from the tree, instead of the two fragments.\n\nThis does not completely solve the issue though: if a polygon is split multiple times\nthe number of fragments depends on the order of subsequent splits, and we might still\nend up with unncessary splits:\nSuppose a polygon is first split into A and B, and then into A1, B1, A2, B2. Suppose B2 is\ndiscarded. We will end up with 2 polygons: A and B1. Depending on the actual split boundaries\nwe could still have joined A and B1 into one polygon. Therefore a second approach is used as well:\n\n2. After CSG operations all coplanar polygon fragments are joined by a retesselating\noperation. See CSG.reTesselated(). Retesselation is done through a\nlinear sweep over the polygon surface. The sweep line passes over the y coordinates\nof all vertices in the polygon. Polygons are split at each sweep line, and the fragments\nare joined horizontally and vertically into larger polygons (making sure that we\nwill end up with convex polygons).\nThis still doesn't solve the problem completely: due to floating point imprecisions\nwe may end up with small gaps between polygons, and polygons may not be exactly coplanar\nanymore, and as a result the retesselation algorithm may fail to join those polygons.\nTherefore:\n\n3. A canonicalization algorithm is implemented: it looks for vertices that have\napproximately the same coordinates (with a certain tolerance, say 1e-5) and replaces\nthem with the same vertex. If polygons share a vertex they will actually point to the\nsame CSG.Vertex instance. The same is done for polygon planes. See CSG.canonicalized().\n\n\nPerformance improvements to the original CSG.js:\n\nReplaced the flip() and invert() methods by flipped() and inverted() which don't\nmodify the source object. This allows to get rid of all clone() calls, so that\nmultiple polygons can refer to the same CSG.Plane instance etc.\n\nThe original union() used an extra invert(), clipTo(), invert() sequence just to remove the\ncoplanar front faces from b; this is now combined in a single b.clipTo(a, true) call.\n\nDetection whether a polygon is in front or in back of a plane: for each polygon\nwe are caching the coordinates of the bounding sphere. If the bounding sphere is\nin front or in back of the plane we don't have to check the individual vertices\nanymore.\n\n\nOther additions to the original CSG.js:\n\nCSG.Vector class has been renamed into CSG.Vector3D\n\nClasses for 3D lines, 2D vectors, 2D lines, and methods to find the intersection of\na line and a plane etc.\n\nTransformations: CSG.transform(), CSG.translate(), CSG.rotate(), CSG.scale()\n\nExpanding or contracting a solid: CSG.expand() and CSG.contract(). Creates nice\nsmooth corners.\n\nThe vertex normal has been removed since it complicates retesselation. It's not needed\nfor solid CAD anyway.\n\n*/\n\n var _CSGDEBUG = false;\n\n function fnNumberSort(a, b) {\n return a - b;\n }\n\n // # class CSG\n // Holds a binary space partition tree representing a 3D solid. Two solids can\n // be combined using the `union()`, `subtract()`, and `intersect()` methods.\n var CSG = function() {\n this.polygons = [];\n this.properties = new CSG.Properties();\n this.isCanonicalized = true;\n this.isRetesselated = true;\n };\n\n CSG.defaultResolution2D = 32;\n CSG.defaultResolution3D = 12;\n\n // Construct a CSG solid from a list of `CSG.Polygon` instances.\n CSG.fromPolygons = function(polygons) {\n var csg = new CSG();\n csg.polygons = polygons;\n csg.isCanonicalized = false;\n csg.isRetesselated = false;\n return csg;\n };\n\n // Construct a CSG solid from generated slices.\n // Look at CSG.Polygon.prototype.solidFromSlices for details\n CSG.fromSlices = function(options) {\n return (new CSG.Polygon.createFromPoints([\n [0, 0, 0],\n [1, 0, 0],\n [1, 1, 0],\n [0, 1, 0]\n ])).solidFromSlices(options);\n };\n\n // create from an untyped object with identical property names:\n CSG.fromObject = function(obj) {\n var polygons = obj.polygons.map(function(p) {\n return CSG.Polygon.fromObject(p);\n });\n var csg = CSG.fromPolygons(polygons);\n csg.isCanonicalized = obj.isCanonicalized;\n csg.isRetesselated = obj.isRetesselated;\n return csg;\n };\n\n // Reconstruct a CSG from the output of toCompactBinary()\n CSG.fromCompactBinary = function(bin) {\n if (bin['class'] != \"CSG\") throw new Error(\"Not a CSG\");\n var planes = [],\n planeData = bin.planeData,\n numplanes = planeData.length / 4,\n arrayindex = 0,\n x, y, z, w, normal, plane;\n for (var planeindex = 0; planeindex < numplanes; planeindex++) {\n x = planeData[arrayindex++];\n y = planeData[arrayindex++];\n z = planeData[arrayindex++];\n w = planeData[arrayindex++];\n normal = CSG.Vector3D.Create(x, y, z);\n plane = new CSG.Plane(normal, w);\n planes.push(plane);\n }\n\n var vertices = [],\n vertexData = bin.vertexData,\n numvertices = vertexData.length / 3,\n pos, vertex;\n arrayindex = 0;\n for (var vertexindex = 0; vertexindex < numvertices; vertexindex++) {\n x = vertexData[arrayindex++];\n y = vertexData[arrayindex++];\n z = vertexData[arrayindex++];\n pos = CSG.Vector3D.Create(x, y, z);\n vertex = new CSG.Vertex(pos);\n vertices.push(vertex);\n }\n\n var shareds = bin.shared.map(function(shared) {\n return CSG.Polygon.Shared.fromObject(shared);\n });\n\n var polygons = [],\n numpolygons = bin.numPolygons,\n numVerticesPerPolygon = bin.numVerticesPerPolygon,\n polygonVertices = bin.polygonVertices,\n polygonPlaneIndexes = bin.polygonPlaneIndexes,\n polygonSharedIndexes = bin.polygonSharedIndexes,\n numpolygonvertices, polygonvertices, shared, polygon; //already defined plane,\n arrayindex = 0;\n for (var polygonindex = 0; polygonindex < numpolygons; polygonindex++) {\n numpolygonvertices = numVerticesPerPolygon[polygonindex];\n polygonvertices = [];\n for (var i = 0; i < numpolygonvertices; i++) {\n polygonvertices.push(vertices[polygonVertices[arrayindex++]]);\n }\n plane = planes[polygonPlaneIndexes[polygonindex]];\n shared = shareds[polygonSharedIndexes[polygonindex]];\n polygon = new CSG.Polygon(polygonvertices, shared, plane);\n polygons.push(polygon);\n }\n var csg = CSG.fromPolygons(polygons);\n csg.isCanonicalized = true;\n csg.isRetesselated = true;\n return csg;\n };\n\n CSG.prototype = {\n toPolygons: function() {\n return this.polygons;\n },\n\n // Return a new CSG solid representing space in either this solid or in the\n // solid `csg`. Neither this solid nor the solid `csg` are modified.\n //\n // A.union(B)\n //\n // +-------+ +-------+\n // | | | |\n // | A | | |\n // | +--+----+ = | +----+\n // +----+--+ | +----+ |\n // | B | | |\n // | | | |\n // +-------+ +-------+\n //\n union: function(csg) {\n var csgs;\n if (csg instanceof Array) {\n csgs = csg.slice(0);\n csgs.push(this);\n } else {\n csgs = [this, csg];\n }\n\n // combine csg pairs in a way that forms a balanced binary tree pattern\n for (var i = 1; i < csgs.length; i += 2) {\n csgs.push(csgs[i-1].unionSub(csgs[i]));\n }\n\n return csgs[i - 1].reTesselated().canonicalized();\n },\n\n unionSub: function(csg, retesselate, canonicalize) {\n if (!this.mayOverlap(csg)) {\n return this.unionForNonIntersecting(csg);\n } else {\n var a = new CSG.Tree(this.polygons);\n var b = new CSG.Tree(csg.polygons);\n a.clipTo(b, false);\n\n // b.clipTo(a, true); // ERROR: this doesn't work\n b.clipTo(a);\n b.invert();\n b.clipTo(a);\n b.invert();\n\n var newpolygons = a.allPolygons().concat(b.allPolygons());\n var result = CSG.fromPolygons(newpolygons);\n result.properties = this.properties._merge(csg.properties);\n if (retesselate) result = result.reTesselated();\n if (canonicalize) result = result.canonicalized();\n return result;\n }\n },\n\n // Like union, but when we know that the two solids are not intersecting\n // Do not use if you are not completely sure that the solids do not intersect!\n unionForNonIntersecting: function(csg) {\n var newpolygons = this.polygons.concat(csg.polygons);\n var result = CSG.fromPolygons(newpolygons);\n result.properties = this.properties._merge(csg.properties);\n result.isCanonicalized = this.isCanonicalized && csg.isCanonicalized;\n result.isRetesselated = this.isRetesselated && csg.isRetesselated;\n return result;\n },\n\n // Return a new CSG solid representing space in this solid but not in the\n // solid `csg`. Neither this solid nor the solid `csg` are modified.\n //\n // A.subtract(B)\n //\n // +-------+ +-------+\n // | | | |\n // | A | | |\n // | +--+----+ = | +--+\n // +----+--+ | +----+\n // | B |\n // | |\n // +-------+\n //\n subtract: function(csg) {\n var csgs;\n if (csg instanceof Array) {\n csgs = csg;\n } else {\n csgs = [csg];\n }\n var result = this;\n for (var i = 0; i < csgs.length; i++) {\n var islast = (i == (csgs.length - 1));\n result = result.subtractSub(csgs[i], islast, islast);\n }\n return result;\n },\n\n subtractSub: function(csg, retesselate, canonicalize) {\n var a = new CSG.Tree(this.polygons);\n var b = new CSG.Tree(csg.polygons);\n a.invert();\n a.clipTo(b);\n b.clipTo(a, true);\n a.addPolygons(b.allPolygons());\n a.invert();\n var result = CSG.fromPolygons(a.allPolygons());\n result.properties = this.properties._merge(csg.properties);\n if (retesselate) result = result.reTesselated();\n if (canonicalize) result = result.canonicalized();\n return result;\n },\n\n // Return a new CSG solid representing space both this solid and in the\n // solid `csg`. Neither this solid nor the solid `csg` are modified.\n //\n // A.intersect(B)\n //\n // +-------+\n // | |\n // | A |\n // | +--+----+ = +--+\n // +----+--+ | +--+\n // | B |\n // | |\n // +-------+\n //\n intersect: function(csg) {\n var csgs;\n if (csg instanceof Array) {\n csgs = csg;\n } else {\n csgs = [csg];\n }\n var result = this;\n for (var i = 0; i < csgs.length; i++) {\n var islast = (i == (csgs.length - 1));\n result = result.intersectSub(csgs[i], islast, islast);\n }\n return result;\n },\n\n intersectSub: function(csg, retesselate, canonicalize) {\n var a = new CSG.Tree(this.polygons);\n var b = new CSG.Tree(csg.polygons);\n a.invert();\n b.clipTo(a);\n b.invert();\n a.clipTo(b);\n b.clipTo(a);\n a.addPolygons(b.allPolygons());\n a.invert();\n var result = CSG.fromPolygons(a.allPolygons());\n result.properties = this.properties._merge(csg.properties);\n if (retesselate) result = result.reTesselated();\n if (canonicalize) result = result.canonicalized();\n return result;\n },\n\n // Return a new CSG solid with solid and empty space switched. This solid is\n // not modified.\n invert: function() {\n var flippedpolygons = this.polygons.map(function(p) {\n return p.flipped();\n });\n return CSG.fromPolygons(flippedpolygons);\n // TODO: flip properties?\n },\n\n // Affine transformation of CSG object. Returns a new CSG object\n transform1: function(matrix4x4) {\n var newpolygons = this.polygons.map(function(p) {\n return p.transform(matrix4x4);\n });\n var result = CSG.fromPolygons(newpolygons);\n result.properties = this.properties._transform(matrix4x4);\n result.isRetesselated = this.isRetesselated;\n return result;\n },\n\n transform: function(matrix4x4) {\n var ismirror = matrix4x4.isMirroring();\n var transformedvertices = {};\n var transformedplanes = {};\n var newpolygons = this.polygons.map(function(p) {\n var newplane;\n var plane = p.plane;\n var planetag = plane.getTag();\n if (planetag in transformedplanes) {\n newplane = transformedplanes[planetag];\n } else {\n newplane = plane.transform(matrix4x4);\n transformedplanes[planetag] = newplane;\n }\n var newvertices = p.vertices.map(function(v) {\n var newvertex;\n var vertextag = v.getTag();\n if (vertextag in transformedvertices) {\n newvertex = transformedvertices[vertextag];\n } else {\n newvertex = v.transform(matrix4x4);\n transformedvertices[vertextag] = newvertex;\n }\n return newvertex;\n });\n if (ismirror) newvertices.reverse();\n return new CSG.Polygon(newvertices, p.shared, newplane);\n });\n var result = CSG.fromPolygons(newpolygons);\n result.properties = this.properties._transform(matrix4x4);\n result.isRetesselated = this.isRetesselated;\n result.isCanonicalized = this.isCanonicalized;\n return result;\n },\n\n toString: function() {\n var result = \"CSG solid:\\n\";\n this.polygons.map(function(p) {\n result += p.toString();\n });\n return result;\n },\n\n // Expand the solid\n // resolution: number of points per 360 degree for the rounded corners\n expand: function(radius, resolution) {\n var result = this.expandedShell(radius, resolution, true);\n result = result.reTesselated();\n result.properties = this.properties; // keep original properties\n return result;\n },\n\n // Contract the solid\n // resolution: number of points per 360 degree for the rounded corners\n contract: function(radius, resolution) {\n var expandedshell = this.expandedShell(radius, resolution, false);\n var result = this.subtract(expandedshell);\n result = result.reTesselated();\n result.properties = this.properties; // keep original properties\n return result;\n },\n\n // cut the solid at a plane, and stretch the cross-section found along plane normal\n stretchAtPlane: function(normal, point, length) {\n var plane = CSG.Plane.fromNormalAndPoint(normal, point);\n var onb = new CSG.OrthoNormalBasis(plane);\n var crosssect = this.sectionCut(onb);\n var midpiece = crosssect.extrudeInOrthonormalBasis(onb, length);\n var piece1 = this.cutByPlane(plane);\n var piece2 = this.cutByPlane(plane.flipped());\n var result = piece1.union([midpiece, piece2.translate(plane.normal.times(length))]);\n return result;\n },\n\n\n // Create the expanded shell of the solid:\n // All faces are extruded to get a thickness of 2*radius\n // Cylinders are constructed around every side\n // Spheres are placed on every vertex\n // unionWithThis: if true, the resulting solid will be united with 'this' solid;\n // the result is a true expansion of the solid\n // If false, returns only the shell\n expandedShell: function(radius, resolution, unionWithThis) {\n var csg = this.reTesselated();\n var result;\n if (unionWithThis) {\n result = csg;\n } else {\n result = new CSG();\n }\n\n // first extrude all polygons:\n csg.polygons.map(function(polygon) {\n var extrudevector = polygon.plane.normal.unit().times(2 * radius);\n var translatedpolygon = polygon.translate(extrudevector.times(-0.5));\n var extrudedface = translatedpolygon.extrude(extrudevector);\n result = result.unionSub(extrudedface, false, false);\n });\n\n // Make a list of all unique vertex pairs (i.e. all sides of the solid)\n // For each vertex pair we collect the following:\n // v1: first coordinate\n // v2: second coordinate\n // planenormals: array of normal vectors of all planes touching this side\n var vertexpairs = {}; // map of 'vertex pair tag' to {v1, v2, planenormals}\n csg.polygons.map(function(polygon) {\n var numvertices = polygon.vertices.length;\n var prevvertex = polygon.vertices[numvertices - 1];\n var prevvertextag = prevvertex.getTag();\n for (var i = 0; i < numvertices; i++) {\n var vertex = polygon.vertices[i];\n var vertextag = vertex.getTag();\n var vertextagpair;\n if (vertextag < prevvertextag) {\n vertextagpair = vertextag + \"-\" + prevvertextag;\n } else {\n vertextagpair = prevvertextag + \"-\" + vertextag;\n }\n var obj;\n if (vertextagpair in vertexpairs) {\n obj = vertexpairs[vertextagpair];\n } else {\n obj = {\n v1: prevvertex,\n v2: vertex,\n planenormals: []\n };\n vertexpairs[vertextagpair] = obj;\n }\n obj.planenormals.push(polygon.plane.normal);\n\n prevvertextag = vertextag;\n prevvertex = vertex;\n }\n });\n\n // now construct a cylinder on every side\n // The cylinder is always an approximation of a true cylinder: it will have polygons\n // around the sides. We will make sure though that the cylinder will have an edge at every\n // face that touches this side. This ensures that we will get a smooth fill even\n // if two edges are at, say, 10 degrees and the resolution is low.\n // Note: the result is not retesselated yet but it really should be!\n for (var vertextagpair in vertexpairs) {\n var vertexpair = vertexpairs[vertextagpair],\n startpoint = vertexpair.v1.pos,\n endpoint = vertexpair.v2.pos,\n // our x,y and z vectors:\n zbase = endpoint.minus(startpoint).unit(),\n xbase = vertexpair.planenormals[0].unit(),\n ybase = xbase.cross(zbase),\n\n // make a list of angles that the cylinder should traverse:\n angles = [];\n\n // first of all equally spaced around the cylinder:\n for (var i = 0; i < resolution; i++) {\n angles.push(i * Math.PI * 2 / resolution);\n }\n\n // and also at every normal of all touching planes:\n for (var i = 0, iMax = vertexpair.planenormals.length; i < iMax; i++) {\n var planenormal = vertexpair.planenormals[i],\n si = ybase.dot(planenormal),\n co = xbase.dot(planenormal),\n angle = Math.atan2(si, co);\n\n if (angle < 0) angle += Math.PI * 2;\n angles.push(angle);\n angle = Math.atan2(-si, -co);\n if (angle < 0) angle += Math.PI * 2;\n angles.push(angle);\n }\n\n // this will result in some duplicate angles but we will get rid of those later.\n // Sort:\n angles = angles.sort(fnNumberSort);\n\n // Now construct the cylinder by traversing all angles:\n var numangles = angles.length,\n prevp1, prevp2,\n startfacevertices = [],\n endfacevertices = [],\n polygons = [];\n for (var i = -1; i < numangles; i++) {\n var angle = angles[(i < 0) ? (i + numangles) : i],\n si = Math.sin(angle),\n co = Math.cos(angle),\n p = xbase.times(co * radius).plus(ybase.times(si * radius)),\n p1 = startpoint.plus(p),\n p2 = endpoint.plus(p),\n skip = false;\n if (i >= 0) {\n if (p1.distanceTo(prevp1) < 1e-5) {\n skip = true;\n }\n }\n if (!skip) {\n if (i >= 0) {\n startfacevertices.push(new CSG.Vertex(p1));\n endfacevertices.push(new CSG.Vertex(p2));\n var polygonvertices = [\n new CSG.Vertex(prevp2),\n new CSG.Vertex(p2),\n new CSG.Vertex(p1),\n new CSG.Vertex(prevp1)\n ];\n var polygon = new CSG.Polygon(polygonvertices);\n polygons.push(polygon);\n }\n prevp1 = p1;\n prevp2 = p2;\n }\n }\n endfacevertices.reverse();\n polygons.push(new CSG.Polygon(startfacevertices));\n polygons.push(new CSG.Polygon(endfacevertices));\n var cylinder = CSG.fromPolygons(polygons);\n result = result.unionSub(cylinder, false, false);\n }\n\n // make a list of all unique vertices\n // For each vertex we also collect the list of normals of the planes touching the vertices\n var vertexmap = {};\n csg.polygons.map(function(polygon) {\n polygon.vertices.map(function(vertex) {\n var vertextag = vertex.getTag();\n var obj;\n if (vertextag in vertexmap) {\n obj = vertexmap[vertextag];\n } else {\n obj = {\n pos: vertex.pos,\n normals: []\n };\n vertexmap[vertextag] = obj;\n }\n obj.normals.push(polygon.plane.normal);\n });\n });\n\n // and build spheres at each vertex\n // We will try to set the x and z axis to the normals of 2 planes\n // This will ensure that our sphere tesselation somewhat matches 2 planes\n for (var vertextag in vertexmap) {\n var vertexobj = vertexmap[vertextag];\n // use the first normal to be the x axis of our sphere:\n var xaxis = vertexobj.normals[0].unit();\n // and find a suitable z axis. We will use the normal which is most perpendicular to the x axis:\n var bestzaxis = null;\n var bestzaxisorthogonality = 0;\n for (var i = 1; i < vertexobj.normals.length; i++) {\n var normal = vertexobj.normals[i].unit();\n var cross = xaxis.cross(normal);\n var crosslength = cross.length();\n if (crosslength > 0.05) {\n if (crosslength > bestzaxisorthogonality) {\n bestzaxisorthogonality = crosslength;\n bestzaxis = normal;\n }\n }\n }\n if (!bestzaxis) {\n bestzaxis = xaxis.randomNonParallelVector();\n }\n var yaxis = xaxis.cross(bestzaxis).unit();\n var zaxis = yaxis.cross(xaxis);\n var sphere = CSG.sphere({\n center: vertexobj.pos,\n radius: radius,\n resolution: resolution,\n axes: [xaxis, yaxis, zaxis]\n });\n result = result.unionSub(sphere, false, false);\n }\n\n return result;\n },\n\n canonicalized: function() {\n if (this.isCanonicalized) {\n return this;\n } else {\n var factory = new CSG.fuzzyCSGFactory();\n var result = factory.getCSG(this);\n result.isCanonicalized = true;\n result.isRetesselated = this.isRetesselated;\n result.properties = this.properties; // keep original properties\n return result;\n }\n },\n\n reTesselated: function() {\n if (this.isRetesselated) {\n return this;\n } else {\n var csg = this;\n var polygonsPerPlane = {};\n var isCanonicalized = csg.isCanonicalized;\n var fuzzyfactory = new CSG.fuzzyCSGFactory();\n csg.polygons.map(function(polygon) {\n var plane = polygon.plane;\n var shared = polygon.shared;\n if (!isCanonicalized) {\n // in order to identify to polygons having the same plane, we need to canonicalize the planes\n // We don't have to do a full canonizalization (including vertices), to save time only do the planes and the shared data:\n plane = fuzzyfactory.getPlane(plane);\n shared = fuzzyfactory.getPolygonShared(shared);\n }\n var tag = plane.getTag() + \"/\" + shared.getTag();\n if (!(tag in polygonsPerPlane)) {\n polygonsPerPlane[tag] = [polygon];\n } else {\n polygonsPerPlane[tag].push(polygon);\n }\n });\n var destpolygons = [];\n for (var planetag in polygonsPerPlane) {\n var sourcepolygons = polygonsPerPlane[planetag];\n if (sourcepolygons.length < 2) {\n destpolygons = destpolygons.concat(sourcepolygons);\n } else {\n var retesselayedpolygons = [];\n CSG.reTesselateCoplanarPolygons(sourcepolygons, retesselayedpolygons);\n destpolygons = destpolygons.concat(retesselayedpolygons);\n }\n }\n var result = CSG.fromPolygons(destpolygons);\n result.isRetesselated = true;\n // result = result.canonicalized();\n result.properties = this.properties; // keep original properties\n return result;\n }\n },\n\n // returns an array of two CSG.Vector3Ds (minimum coordinates and maximum coordinates)\n getBounds: function() {\n if (!this.cachedBoundingBox) {\n var minpoint = new CSG.Vector3D(0, 0, 0);\n var maxpoint = new CSG.Vector3D(0, 0, 0);\n var polygons = this.polygons;\n var numpolygons = polygons.length;\n for (var i = 0; i < numpolygons; i++) {\n var polygon = polygons[i];\n var bounds = polygon.boundingBox();\n if (i === 0) {\n minpoint = bounds[0];\n maxpoint = bounds[1];\n } else {\n minpoint = minpoint.min(bounds[0]);\n maxpoint = maxpoint.max(bounds[1]);\n }\n }\n this.cachedBoundingBox = [minpoint, maxpoint];\n }\n return this.cachedBoundingBox;\n },\n\n // returns true if there is a possibility that the two solids overlap\n // returns false if we can be sure that they do not overlap\n mayOverlap: function(csg) {\n if ((this.polygons.length === 0) || (csg.polygons.length === 0)) {\n return false;\n } else {\n var mybounds = this.getBounds();\n var otherbounds = csg.getBounds();\n if (mybounds[1].x < otherbounds[0].x) return false;\n if (mybounds[0].x > otherbounds[1].x) return false;\n if (mybounds[1].y < otherbounds[0].y) return false;\n if (mybounds[0].y > otherbounds[1].y) return false;\n if (mybounds[1].z < otherbounds[0].z) return false;\n if (mybounds[0].z > otherbounds[1].z) return false;\n return true;\n }\n },\n\n // Cut the solid by a plane. Returns the solid on the back side of the plane\n cutByPlane: function(plane) {\n if (this.polygons.length === 0) {\n return new CSG();\n }\n // Ideally we would like to do an intersection with a polygon of inifinite size\n // but this is not supported by our implementation. As a workaround, we will create\n // a cube, with one face on the plane, and a size larger enough so that the entire\n // solid fits in the cube.\n // find the max distance of any vertex to the center of the plane:\n var planecenter = plane.normal.times(plane.w);\n var maxdistance = 0;\n this.polygons.map(function(polygon) {\n polygon.vertices.map(function(vertex) {\n var distance = vertex.pos.distanceToSquared(planecenter);\n if (distance > maxdistance) maxdistance = distance;\n });\n });\n maxdistance = Math.sqrt(maxdistance);\n maxdistance *= 1.01; // make sure it's really larger\n // Now build a polygon on the plane, at any point farther than maxdistance from the plane center:\n var vertices = [];\n var orthobasis = new CSG.OrthoNormalBasis(plane);\n vertices.push(new CSG.Vertex(orthobasis.to3D(new CSG.Vector2D(maxdistance, -maxdistance))));\n vertices.push(new CSG.Vertex(orthobasis.to3D(new CSG.Vector2D(-maxdistance, -maxdistance))));\n vertices.push(new CSG.Vertex(orthobasis.to3D(new CSG.Vector2D(-maxdistance, maxdistance))));\n vertices.push(new CSG.Vertex(orthobasis.to3D(new CSG.Vector2D(maxdistance, maxdistance))));\n var polygon = new CSG.Polygon(vertices, null, plane.flipped());\n\n // and extrude the polygon into a cube, backwards of the plane:\n var cube = polygon.extrude(plane.normal.times(-maxdistance));\n\n // Now we can do the intersection:\n var result = this.intersect(cube);\n result.properties = this.properties; // keep original properties\n return result;\n },\n\n // Connect a solid to another solid, such that two CSG.Connectors become connected\n // myConnector: a CSG.Connector of this solid\n // otherConnector: a CSG.Connector to which myConnector should be connected\n // mirror: false: the 'axis' vectors of the connectors should point in the same direction\n // true: the 'axis' vectors of the connectors should point in opposite direction\n // normalrotation: degrees of rotation between the 'normal' vectors of the two\n // connectors\n connectTo: function(myConnector, otherConnector, mirror, normalrotation) {\n var matrix = myConnector.getTransformationTo(otherConnector, mirror, normalrotation);\n return this.transform(matrix);\n },\n\n // set the .shared property of all polygons\n // Returns a new CSG solid, the original is unmodified!\n setShared: function(shared) {\n var polygons = this.polygons.map(function(p) {\n return new CSG.Polygon(p.vertices, shared, p.plane);\n });\n var result = CSG.fromPolygons(polygons);\n result.properties = this.properties; // keep original properties\n result.isRetesselated = this.isRetesselated;\n result.isCanonicalized = this.isCanonicalized;\n return result;\n },\n\n setColor: function(args) {\n var newshared = CSG.Polygon.Shared.fromColor.apply(this, arguments);\n return this.setShared(newshared);\n },\n\n toCompactBinary: function() {\n var csg = this.canonicalized(),\n numpolygons = csg.polygons.length,\n numpolygonvertices = 0,\n numvertices = 0,\n vertexmap = {},\n vertices = [],\n numplanes = 0,\n planemap = {},\n polygonindex = 0,\n planes = [],\n shareds = [],\n sharedmap = {},\n numshared = 0;\n // for (var i = 0, iMax = csg.polygons.length; i < iMax; i++) {\n // var p = csg.polygons[i];\n // for (var j = 0, jMax = p.length; j < jMax; j++) {\n // ++numpolygonvertices;\n // var vertextag = p[j].getTag();\n // if(!(vertextag in vertexmap)) {\n // vertexmap[vertextag] = numvertices++;\n // vertices.push(p[j]);\n // }\n // }\n csg.polygons.map(function(p) {\n p.vertices.map(function(v) {\n ++numpolygonvertices;\n var vertextag = v.getTag();\n if (!(vertextag in vertexmap)) {\n vertexmap[vertextag] = numvertices++;\n vertices.push(v);\n }\n });\n\n var planetag = p.plane.getTag();\n if (!(planetag in planemap)) {\n planemap[planetag] = numplanes++;\n planes.push(p.plane);\n }\n var sharedtag = p.shared.getTag();\n if (!(sharedtag in sharedmap)) {\n sharedmap[sharedtag] = numshared++;\n shareds.push(p.shared);\n }\n });\n var numVerticesPerPolygon = new Uint32Array(numpolygons),\n polygonSharedIndexes = new Uint32Array(numpolygons),\n polygonVertices = new Uint32Array(numpolygonvertices),\n polygonPlaneIndexes = new Uint32Array(numpolygons),\n vertexData = new Float64Array(numvertices * 3),\n planeData = new Float64Array(numplanes * 4),\n polygonVerticesIndex = 0;\n for (var polygonindex = 0; polygonindex < numpolygons; ++polygonindex) {\n var p = csg.polygons[polygonindex];\n numVerticesPerPolygon[polygonindex] = p.vertices.length;\n p.vertices.map(function(v) {\n var vertextag = v.getTag();\n var vertexindex = vertexmap[vertextag];\n polygonVertices[polygonVerticesIndex++] = vertexindex;\n });\n var planetag = p.plane.getTag();\n var planeindex = planemap[planetag];\n polygonPlaneIndexes[polygonindex] = planeindex;\n var sharedtag = p.shared.getTag();\n var sharedindex = sharedmap[sharedtag];\n polygonSharedIndexes[polygonindex] = sharedindex;\n }\n var verticesArrayIndex = 0;\n vertices.map(function(v) {\n var pos = v.pos;\n vertexData[verticesArrayIndex++] = pos._x;\n vertexData[verticesArrayIndex++] = pos._y;\n vertexData[verticesArrayIndex++] = pos._z;\n });\n var planesArrayIndex = 0;\n planes.map(function(p) {\n var normal = p.normal;\n planeData[planesArrayIndex++] = normal._x;\n planeData[planesArrayIndex++] = normal._y;\n planeData[planesArrayIndex++] = normal._z;\n planeData[planesArrayIndex++] = p.w;\n });\n var result = {\n \"class\": \"CSG\",\n numPolygons: numpolygons,\n numVerticesPerPolygon: numVerticesPerPolygon,\n polygonPlaneIndexes: polygonPlaneIndexes,\n polygonSharedIndexes: polygonSharedIndexes,\n polygonVertices: polygonVertices,\n vertexData: vertexData,\n planeData: planeData,\n shared: shareds\n };\n return result;\n },\n\n // For debugging\n // Creates a new solid with a tiny cube at every vertex of the source solid\n toPointCloud: function(cuberadius) {\n var csg = this.reTesselated();\n\n var result = new CSG();\n\n // make a list of all unique vertices\n // For each vertex we also collect the list of normals of the planes touching the vertices\n var vertexmap = {};\n csg.polygons.map(function(polygon) {\n polygon.vertices.map(function(vertex) {\n vertexmap[vertex.getTag()] = vertex.pos;\n });\n });\n\n for (var vertextag in vertexmap) {\n var pos = vertexmap[vertextag];\n var cube = CSG.cube({\n center: pos,\n radius: cuberadius\n });\n result = result.unionSub(cube, false, false);\n }\n result = result.reTesselated();\n return result;\n },\n\n // Get the transformation that transforms this CSG such that it is lying on the z=0 plane,\n // as flat as possible (i.e. the least z-height).\n // So that it is in an orientation suitable for CNC milling\n getTransformationAndInverseTransformationToFlatLying: function() {\n if (this.polygons.length === 0) {\n var m = new CSG.Matrix4x4(); // unity\n return [m,m];\n } else {\n // get a list of unique planes in the CSG:\n var csg = this.canonicalized();\n var planemap = {};\n csg.polygons.map(function(polygon) {\n planemap[polygon.plane.getTag()] = polygon.plane;\n });\n // try each plane in the CSG and find the plane that, when we align it flat onto z=0,\n // gives the least height in z-direction.\n // If two planes give the same height, pick the plane that originally had a normal closest\n // to [0,0,-1].\n var xvector = new CSG.Vector3D(1, 0, 0);\n var yvector = new CSG.Vector3D(0, 1, 0);\n var zvector = new CSG.Vector3D(0, 0, 1);\n var z0connectorx = new CSG.Connector([0, 0, 0], [0, 0, -1], xvector);\n var z0connectory = new CSG.Connector([0, 0, 0], [0, 0, -1], yvector);\n var isfirst = true;\n var minheight = 0;\n var maxdotz = 0;\n var besttransformation, bestinversetransformation;\n for (var planetag in planemap) {\n var plane = planemap[planetag];\n var pointonplane = plane.normal.times(plane.w);\n var transformation, inversetransformation;\n // We need a normal vecrtor for the transformation\n // determine which is more perpendicular to the plane normal: x or y?\n // we will align this as much as possible to the x or y axis vector\n var xorthogonality = plane.normal.cross(xvector).length();\n var yorthogonality = plane.normal.cross(yvector).length();\n if (xorthogonality > yorthogonality) {\n // x is better:\n var planeconnector = new CSG.Connector(pointonplane, plane.normal, xvector);\n transformation = planeconnector.getTransformationTo(z0connectorx, false, 0);\n inversetransformation = z0connectorx.getTransformationTo(planeconnector, false, 0);\n } else {\n // y is better:\n var planeconnector = new CSG.Connector(pointonplane, plane.normal, yvector);\n transformation = planeconnector.getTransformationTo(z0connectory, false, 0);\n inversetransformation = z0connectory.getTransformationTo(planeconnector, false, 0);\n }\n var transformedcsg = csg.transform(transformation);\n var dotz = -plane.normal.dot(zvector);\n var bounds = transformedcsg.getBounds();\n var zheight = bounds[1].z - bounds[0].z;\n var isbetter = isfirst;\n if (!isbetter) {\n if (zheight < minheight) {\n isbetter = true;\n } else if (zheight == minheight) {\n if (dotz > maxdotz) isbetter = true;\n }\n }\n if (isbetter) {\n // translate the transformation around the z-axis and onto the z plane:\n var translation = new CSG.Vector3D([-0.5 * (bounds[1].x + bounds[0].x), -0.5 * (bounds[1].y + bounds[0].y), -bounds[0].z]);\n transformation = transformation.multiply(CSG.Matrix4x4.translation(translation));\n inversetransformation = CSG.Matrix4x4.translation(translation.negated()).multiply(inversetransformation);\n minheight = zheight;\n maxdotz = dotz;\n besttransformation = transformation;\n bestinversetransformation = inversetransformation;\n }\n isfirst = false;\n }\n return [besttransformation, bestinversetransformation];\n }\n },\n\n getTransformationToFlatLying: function() {\n var result = this.getTransformationAndInverseTransformationToFlatLying();\n return result[0];\n },\n\n lieFlat: function() {\n var transformation = this.getTransformationToFlatLying();\n return this.transform(transformation);\n },\n\n // project the 3D CSG onto a plane\n // This returns a 2D CAG with the 'shadow' shape of the 3D solid when projected onto the\n // plane represented by the orthonormal basis\n projectToOrthoNormalBasis: function(orthobasis) {\n var EPS = 1e-5;\n var cags = [];\n this.polygons.filter(function(p) {\n // only return polys in plane, others may disturb result\n return p.plane.normal.minus(orthobasis.plane.normal).lengthSquared() < EPS*EPS;\n })\n .map(function(polygon) {\n var cag = polygon.projectToOrthoNormalBasis(orthobasis);\n if (cag.sides.length > 0) {\n cags.push(cag);\n }\n });\n var result = new CAG().union(cags);\n return result;\n },\n\n sectionCut: function(orthobasis) {\n var EPS = 1e-5;\n var plane1 = orthobasis.plane;\n var plane2 = orthobasis.plane.flipped();\n plane1 = new CSG.Plane(plane1.normal, plane1.w);\n plane2 = new CSG.Plane(plane2.normal, plane2.w + 5*EPS);\n var cut3d = this.cutByPlane(plane1);\n cut3d = cut3d.cutByPlane(plane2);\n return cut3d.projectToOrthoNormalBasis(orthobasis);\n },\n\n /*\n fixTJunctions:\n\n Suppose we have two polygons ACDB and EDGF:\n\n A-----B\n | |\n | E--F\n | | |\n C-----D--G\n\n Note that vertex E forms a T-junction on the side BD. In this case some STL slicers will complain\n that the solid is not watertight. This is because the watertightness check is done by checking if\n each side DE is matched by another side ED.\n\n This function will return a new solid with ACDB replaced by ACDEB\n\n Note that this can create polygons that are slightly non-convex (due to rounding errors). Therefore the result should\n not be used for further CSG operations!\n */\n fixTJunctions: function() {\n var csg = this.canonicalized();\n var sidemap = {};\n for (var polygonindex = 0; polygonindex < csg.polygons.length; polygonindex++) {\n var polygon = csg.polygons[polygonindex];\n var numvertices = polygon.vertices.length;\n if (numvertices >= 3) // should be true\n {\n var vertex = polygon.vertices[0];\n var vertextag = vertex.getTag();\n for (var vertexindex = 0; vertexindex < numvertices; vertexindex++) {\n var nextvertexindex = vertexindex + 1;\n if (nextvertexindex == numvertices) nextvertexindex = 0;\n var nextvertex = polygon.vertices[nextvertexindex];\n var nextvertextag = nextvertex.getTag();\n var sidetag = vertextag + \"/\" + nextvertextag;\n var reversesidetag = nextvertextag + \"/\" + vertextag;\n if (reversesidetag in sidemap) {\n // this side matches the same side in another polygon. Remove from sidemap:\n var ar = sidemap[reversesidetag];\n ar.splice(-1, 1);\n if (ar.length === 0) {\n delete sidemap[reversesidetag];\n }\n } else {\n var sideobj = {\n vertex0: vertex,\n vertex1: nextvertex,\n polygonindex: polygonindex\n };\n if (!(sidetag in sidemap)) {\n sidemap[sidetag] = [sideobj];\n } else {\n sidemap[sidetag].push(sideobj);\n }\n }\n vertex = nextvertex;\n vertextag = nextvertextag;\n }\n }\n }\n // now sidemap contains 'unmatched' sides\n // i.e. side AB in one polygon does not have a matching side BA in another polygon\n var vertextag2sidestart = {};\n var vertextag2sideend = {};\n var sidestocheck = {};\n var sidemapisempty = true;\n for (var sidetag in sidemap) {\n sidemapisempty = false;\n sidestocheck[sidetag] = true;\n sidemap[sidetag].map(function(sideobj) {\n var starttag = sideobj.vertex0.getTag();\n var endtag = sideobj.vertex1.getTag();\n if (starttag in vertextag2sidestart) {\n vertextag2sidestart[starttag].push(sidetag);\n } else {\n vertextag2sidestart[starttag] = [sidetag];\n }\n if (endtag in vertextag2sideend) {\n vertextag2sideend[endtag].push(sidetag);\n } else {\n vertextag2sideend[endtag] = [sidetag];\n }\n });\n }\n\n if (!sidemapisempty) {\n // make a copy of the polygons array, since we are going to modify it:\n var polygons = csg.polygons.slice(0);\n\n function addSide(vertex0, vertex1, polygonindex) {\n var starttag = vertex0.getTag();\n var endtag = vertex1.getTag();\n if (starttag == endtag) throw new Error(\"Assertion failed\");\n var newsidetag = starttag + \"/\" + endtag;\n var reversesidetag = endtag + \"/\" + starttag;\n if (reversesidetag in sidemap) {\n // we have a matching reverse oriented side.\n // Instead of adding the new side, cancel out the reverse side:\n // console.log(\"addSide(\"+newsidetag+\") has reverse side:\");\n deleteSide(vertex1, vertex0, null);\n return null;\n }\n // console.log(\"addSide(\"+newsidetag+\")\");\n var newsideobj = {\n vertex0: vertex0,\n vertex1: vertex1,\n polygonindex: polygonindex\n };\n if (!(newsidetag in sidemap)) {\n sidemap[newsidetag] = [newsideobj];\n } else {\n sidemap[newsidetag].push(newsideobj);\n }\n if (starttag in vertextag2sidestart) {\n vertextag2sidestart[starttag].push(newsidetag);\n } else {\n vertextag2sidestart[starttag] = [newsidetag];\n }\n if (endtag in vertextag2sideend) {\n vertextag2sideend[endtag].push(newsidetag);\n } else {\n vertextag2sideend[endtag] = [newsidetag];\n }\n return newsidetag;\n }\n\n function deleteSide(vertex0, vertex1, polygonindex) {\n var starttag = vertex0.getTag();\n var endtag = vertex1.getTag();\n var sidetag = starttag + \"/\" + endtag;\n // console.log(\"deleteSide(\"+sidetag+\")\");\n if (!(sidetag in sidemap)) throw new Error(\"Assertion failed\");\n var idx = -1;\n var sideobjs = sidemap[sidetag];\n for (var i = 0; i < sideobjs.length; i++) {\n var sideobj = sideobjs[i];\n if (sideobj.vertex0 != vertex0) continue;\n if (sideobj.vertex1 != vertex1) continue;\n if (polygonindex !== null) {\n if (sideobj.polygonindex != polygonindex) continue;\n }\n idx = i;\n break;\n }\n if (idx < 0) throw new Error(\"Assertion failed\");\n sideobjs.splice(idx, 1);\n if (sideobjs.length === 0) {\n delete sidemap[sidetag];\n }\n idx = vertextag2sidestart[starttag].indexOf(sidetag);\n if (idx < 0) throw new Error(\"Assertion failed\");\n vertextag2sidestart[starttag].splice(idx, 1);\n if (vertextag2sidestart[starttag].length === 0) {\n delete vertextag2sidestart[starttag];\n }\n\n idx = vertextag2sideend[endtag].indexOf(sidetag);\n if (idx < 0) throw new Error(\"Assertion failed\");\n vertextag2sideend[endtag].splice(idx, 1);\n if (vertextag2sideend[endtag].length === 0) {\n delete vertextag2sideend[endtag];\n }\n }\n\n\n while (true) {\n var sidemapisempty = true;\n for (var sidetag in sidemap) {\n sidemapisempty = false;\n sidestocheck[sidetag] = true;\n }\n if (sidemapisempty) break;\n var donesomething = false;\n while (true) {\n var sidetagtocheck = null;\n for (var sidetag in sidestocheck) {\n sidetagtocheck = sidetag;\n break;\n }\n if (sidetagtocheck === null) break; // sidestocheck is empty, we're done!\n var donewithside = true;\n if (sidetagtocheck in sidemap) {\n var sideobjs = sidemap[sidetagtocheck];\n if (sideobjs.length === 0) throw new Error(\"Assertion failed\");\n var sideobj = sideobjs[0];\n for (var directionindex = 0; directionindex < 2; directionindex++) {\n var startvertex = (directionindex === 0) ? sideobj.vertex0 : sideobj.vertex1;\n var endvertex = (directionindex === 0) ? sideobj.vertex1 : sideobj.vertex0;\n var startvertextag = startvertex.getTag();\n var endvertextag = endvertex.getTag();\n var matchingsides = [];\n if (directionindex === 0) {\n if (startvertextag in vertextag2sideend) {\n matchingsides = vertextag2sideend[startvertextag];\n }\n } else {\n if (startvertextag in vertextag2sidestart) {\n matchingsides = vertextag2sidestart[startvertextag];\n }\n }\n for (var matchingsideindex = 0; matchingsideindex < matchingsides.length; matchingsideindex++) {\n var matchingsidetag = matchingsides[matchingsideindex];\n var matchingside = sidemap[matchingsidetag][0];\n var matchingsidestartvertex = (directionindex === 0) ? matchingside.vertex0 : matchingside.vertex1;\n var matchingsideendvertex = (directionindex === 0) ? matchingside.vertex1 : matchingside.vertex0;\n var matchingsidestartvertextag = matchingsidestartvertex.getTag();\n var matchingsideendvertextag = matchingsideendvertex.getTag();\n if (matchingsideendvertextag != startvertextag) throw new Error(\"Assertion failed\");\n if (matchingsidestartvertextag == endvertextag) {\n // matchingside cancels sidetagtocheck\n deleteSide(startvertex, endvertex, null);\n deleteSide(endvertex, startvertex, null);\n donewithside = false;\n directionindex = 2; // skip reverse direction check\n donesomething = true;\n break;\n } else {\n var startpos = startvertex.pos;\n var endpos = endvertex.pos;\n var checkpos = matchingsidestartvertex.pos;\n var direction = checkpos.minus(startpos);\n // Now we need to check if endpos is on the line startpos-checkpos:\n var t = endpos.minus(startpos).dot(direction) / direction.dot(direction);\n if ((t > 0) && (t < 1)) {\n var closestpoint = startpos.plus(direction.times(t));\n var distancesquared = closestpoint.distanceToSquared(endpos);\n if (distancesquared < 1e-10) {\n // Yes it's a t-junction! We need to split matchingside in two:\n var polygonindex = matchingside.polygonindex;\n var polygon = polygons[polygonindex];\n // find the index of startvertextag in polygon:\n var insertionvertextag = matchingside.vertex1.getTag();\n var insertionvertextagindex = -1;\n for (var i = 0; i < polygon.vertices.length; i++) {\n if (polygon.vertices[i].getTag() == insertionvertextag) {\n insertionvertextagindex = i;\n break;\n }\n }\n if (insertionvertextagindex < 0) throw new Error(\"Assertion failed\");\n // split the side by inserting the vertex:\n var newvertices = polygon.vertices.slice(0);\n newvertices.splice(insertionvertextagindex, 0, endvertex);\n var newpolygon = new CSG.Polygon(newvertices, polygon.shared /*polygon.plane*/ );\n\n// FIX\n //calculate plane with differents point\n if(isNaN(newpolygon.plane.w)){\n\n var found = false,\n loop = function(callback){\n newpolygon.vertices.forEach(function(item){\n if(found) return;\n callback(item);\n })\n };\n\n loop(function(a){\n loop(function(b) {\n loop(function (c) {\n newpolygon.plane = CSG.Plane.fromPoints(a.pos, b.pos, c.pos)\n if(!isNaN(newpolygon.plane.w)) {\n found = true;\n }\n })\n })\n })\n }\n// FIX\n\n polygons[polygonindex] = newpolygon;\n\n // remove the original sides from our maps:\n // deleteSide(sideobj.vertex0, sideobj.vertex1, null);\n deleteSide(matchingside.vertex0, matchingside.vertex1, polygonindex);\n var newsidetag1 = addSide(matchingside.vertex0, endvertex, polygonindex);\n var newsidetag2 = addSide(endvertex, matchingside.vertex1, polygonindex);\n if (newsidetag1 !== null) sidestocheck[newsidetag1] = true;\n if (newsidetag2 !== null) sidestocheck[newsidetag2] = true;\n donewithside = false;\n directionindex = 2; // skip reverse direction check\n donesomething = true;\n break;\n } // if(distancesquared < 1e-10)\n } // if( (t > 0) && (t < 1) )\n } // if(endingstidestartvertextag == endvertextag)\n } // for matchingsideindex\n } // for directionindex\n } // if(sidetagtocheck in sidemap)\n if (donewithside) {\n delete sidestocheck[sidetag];\n }\n }\n if (!donesomething) break;\n }\n var newcsg = CSG.fromPolygons(polygons);\n newcsg.properties = csg.properties;\n newcsg.isCanonicalized = true;\n newcsg.isRetesselated = true;\n csg = newcsg;\n } // if(!sidemapisempty)\n var sidemapisempty = true;\n for (var sidetag in sidemap) {\n sidemapisempty = false;\n break;\n }\n if (!sidemapisempty) {\n // throw new Error(\"!sidemapisempty\");\n OpenJsCad.log(\"!sidemapisempty\");\n }\n return csg;\n },\n\n toTriangles: function() {\n var polygons = [];\n this.polygons.forEach(function(poly) {\n var firstVertex = poly.vertices[0];\n for (var i = poly.vertices.length - 3; i >= 0; i--) {\n polygons.push(new CSG.Polygon([\n firstVertex, poly.vertices[i + 1], poly.vertices[i + 2]\n ],\n poly.shared, poly.plane));\n }\n });\n return polygons;\n },\n\n // features: string, or array containing 1 or more strings of: 'volume', 'area'\n // more could be added here (Fourier coeff, moments)\n getFeatures: function(features) {\n if (!(features instanceof Array)) {\n features = [features];\n }\n var result = this.toTriangles().map(function(triPoly) {\n return triPoly.getTetraFeatures(features);\n })\n .reduce(function(pv, v) {\n return v.map(function(feat, i) {\n return feat + (pv === 0 ? 0 : pv[i]);\n });\n }, 0);\n return (result.length == 1) ? result[0] : result;\n }\n };\n\n // Parse an option from the options object\n // If the option is not present, return the default value\n CSG.parseOption = function(options, optionname, defaultvalue) {\n var result = defaultvalue;\n if (options) {\n if (optionname in options) {\n result = options[optionname];\n }\n }\n return result;\n };\n\n // Parse an option and force into a CSG.Vector3D. If a scalar is passed it is converted\n // into a vector with equal x,y,z\n CSG.parseOptionAs3DVector = function(options, optionname, defaultvalue) {\n var result = CSG.parseOption(options, optionname, defaultvalue);\n result = new CSG.Vector3D(result);\n return result;\n };\n\n CSG.parseOptionAs3DVectorList = function(options, optionname, defaultvalue) {\n var result = CSG.parseOption(options, optionname, defaultvalue);\n return result.map(function(res) {\n return new CSG.Vector3D(res);\n });\n };\n\n // Parse an option and force into a CSG.Vector2D. If a scalar is passed it is converted\n // into a vector with equal x,y\n CSG.parseOptionAs2DVector = function(options, optionname, defaultvalue) {\n var result = CSG.parseOption(options, optionname, defaultvalue);\n result = new CSG.Vector2D(result);\n return result;\n };\n\n CSG.parseOptionAsFloat = function(options, optionname, defaultvalue) {\n var result = CSG.parseOption(options, optionname, defaultvalue);\n if (typeof(result) == \"string\") {\n result = Number(result);\n }\n if (isNaN(result) || typeof(result) != \"number\") {\n throw new Error(\"Parameter \" + optionname + \" should be a number\");\n }\n return result;\n };\n\n CSG.parseOptionAsInt = function(options, optionname, defaultvalue) {\n var result = CSG.parseOption(options, optionname, defaultvalue);\n result = Number(Math.floor(result));\n if (isNaN(result)) {\n throw new Error(\"Parameter \" + optionname + \" should be a number\");\n }\n return result;\n };\n\n CSG.parseOptionAsBool = function(options, optionname, defaultvalue) {\n var result = CSG.parseOption(options, optionname, defaultvalue);\n if (typeof(result) == \"string\") {\n if (result == \"true\") result = true;\n else if (result == \"false\") result = false;\n else if (result == 0) result = false;\n }\n result = !!result;\n return result;\n };\n\n // Construct an axis-aligned solid cuboid.\n // Parameters:\n // center: center of cube (default [0,0,0])\n // radius: radius of cube (default [1,1,1]), can be specified as scalar or as 3D vector\n //\n // Example code:\n //\n // var cube = CSG.cube({\n // center: [0, 0, 0],\n // radius: 1\n // });\n CSG.cube = function(options) {\n var c, r;\n options = options || {};\n if (('corner1' in options) || ('corner2' in options)) {\n if (('center' in options) || ('radius' in options)) {\n throw new Error(\"cube: should either give a radius and center parameter, or a corner1 and corner2 parameter\")\n }\n corner1 = CSG.parseOptionAs3DVector(options, \"corner1\", [0, 0, 0]);\n corner2 = CSG.parseOptionAs3DVector(options, \"corner2\", [1, 1, 1]);\n c = corner1.plus(corner2).times(0.5);\n r = corner2.minus(corner1).times(0.5);\n } else {\n c = CSG.parseOptionAs3DVector(options, \"center\", [0, 0, 0]);\n r = CSG.parseOptionAs3DVector(options, \"radius\", [1, 1, 1]);\n }\n r = r.abs(); // negative radii make no sense\n var result = CSG.fromPolygons([\n [\n [0, 4, 6, 2],\n [-1, 0, 0]\n ],\n [\n [1, 3, 7, 5],\n [+1, 0, 0]\n ],\n [\n [0, 1, 5, 4],\n [0, -1, 0]\n ],\n [\n [2, 6, 7, 3],\n [0, +1, 0]\n ],\n [\n [0, 2, 3, 1],\n [0, 0, -1]\n ],\n [\n [4, 5, 7, 6],\n [0, 0, +1]\n ]\n ].map(function(info) {\n //var normal = new CSG.Vector3D(info[1]);\n //var plane = new CSG.Plane(normal, 1);\n var vertices = info[0].map(function(i) {\n var pos = new CSG.Vector3D(\n c.x + r.x * (2 * !!(i & 1) - 1), c.y + r.y * (2 * !!(i & 2) - 1), c.z + r.z * (2 * !!(i & 4) - 1));\n return new CSG.Vertex(pos);\n });\n return new CSG.Polygon(vertices, null /* , plane */ );\n }));\n result.properties.cube = new CSG.Properties();\n result.properties.cube.center = new CSG.Vector3D(c);\n // add 6 connectors, at the centers of each face:\n result.properties.cube.facecenters = [\n new CSG.Connector(new CSG.Vector3D([r.x, 0, 0]).plus(c), [1, 0, 0], [0, 0, 1]),\n new CSG.Connector(new CSG.Vector3D([-r.x, 0, 0]).plus(c), [-1, 0, 0], [0, 0, 1]),\n new CSG.Connector(new CSG.Vector3D([0, r.y, 0]).plus(c), [0, 1, 0], [0, 0, 1]),\n new CSG.Connector(new CSG.Vector3D([0, -r.y, 0]).plus(c), [0, -1, 0], [0, 0, 1]),\n new CSG.Connector(new CSG.Vector3D([0, 0, r.z]).plus(c), [0, 0, 1], [1, 0, 0]),\n new CSG.Connector(new CSG.Vector3D([0, 0, -r.z]).plus(c), [0, 0, -1], [1, 0, 0])\n ];\n return result;\n };\n\n // Construct a solid sphere\n //\n // Parameters:\n // center: center of sphere (default [0,0,0])\n // radius: radius of sphere (default 1), must be a scalar\n // resolution: determines the number of polygons per 360 degree revolution (default 12)\n // axes: (optional) an array with 3 vectors for the x, y and z base vectors\n //\n // Example usage:\n //\n // var sphere = CSG.sphere({\n // center: [0, 0, 0],\n // radius: 2,\n // resolution: 32,\n // });\n CSG.sphere = function(options) {\n options = options || {};\n var center = CSG.parseOptionAs3DVector(options, \"center\", [0, 0, 0]);\n var radius = CSG.parseOptionAsFloat(options, \"radius\", 1);\n var resolution = CSG.parseOptionAsInt(options, \"resolution\", CSG.defaultResolution3D);\n var xvector, yvector, zvector;\n if ('axes' in options) {\n xvector = options.axes[0].unit().times(radius);\n yvector = options.axes[1].unit().times(radius);\n zvector = options.axes[2].unit().times(radius);\n } else {\n xvector = new CSG.Vector3D([1, 0, 0]).times(radius);\n yvector = new CSG.Vector3D([0, -1, 0]).times(radius);\n zvector = new CSG.Vector3D([0, 0, 1]).times(radius);\n }\n if (resolution < 4) resolution = 4;\n var qresolution = Math.round(resolution / 4);\n var prevcylinderpoint;\n var polygons = [];\n for (var slice1 = 0; slice1 <= resolution; slice1++) {\n var angle = Math.PI * 2.0 * slice1 / resolution;\n var cylinderpoint = xvector.times(Math.cos(angle)).plus(yvector.times(Math.sin(angle)));\n if (slice1 > 0) {\n // cylinder vertices:\n var vertices = [];\n var prevcospitch, prevsinpitch;\n for (var slice2 = 0; slice2 <= qresolution; slice2++) {\n var pitch = 0.5 * Math.PI * slice2 / qresolution;\n var cospitch = Math.cos(pitch);\n var sinpitch = Math.sin(pitch);\n if (slice2 > 0) {\n vertices = [];\n vertices.push(new CSG.Vertex(center.plus(prevcylinderpoint.times(prevcospitch).minus(zvector.times(prevsinpitch)))));\n vertices.push(new CSG.Vertex(center.plus(cylinderpoint.times(prevcospitch).minus(zvector.times(prevsinpitch)))));\n if (slice2 < qresolution) {\n vertices.push(new CSG.Vertex(center.plus(cylinderpoint.times(cospitch).minus(zvector.times(sinpitch)))));\n }\n vertices.push(new CSG.Vertex(center.plus(prevcylinderpoint.times(cospitch).minus(zvector.times(sinpitch)))));\n polygons.push(new CSG.Polygon(vertices));\n vertices = [];\n vertices.push(new CSG.Vertex(center.plus(prevcylinderpoint.times(prevcospitch).plus(zvector.times(prevsinpitch)))));\n vertices.push(new CSG.Vertex(center.plus(cylinderpoint.times(prevcospitch).plus(zvector.times(prevsinpitch)))));\n if (slice2 < qresolution) {\n vertices.push(new CSG.Vertex(center.plus(cylinderpoint.times(cospitch).plus(zvector.times(sinpitch)))));\n }\n vertices.push(new CSG.Vertex(center.plus(prevcylinderpoint.times(cospitch).plus(zvector.times(sinpitch)))));\n vertices.reverse();\n polygons.push(new CSG.Polygon(vertices));\n }\n prevcospitch = cospitch;\n prevsinpitch = sinpitch;\n }\n }\n prevcylinderpoint = cylinderpoint;\n }\n var result = CSG.fromPolygons(polygons);\n result.properties.sphere = new CSG.Properties();\n result.properties.sphere.center = new CSG.Vector3D(center);\n result.properties.sphere.facepoint = center.plus(xvector);\n return result;\n };\n\n // Construct a solid cylinder.\n //\n // Parameters:\n // start: start point of cylinder (default [0, -1, 0])\n // end: end point of cylinder (default [0, 1, 0])\n // radius: radius of cylinder (default 1), must be a scalar\n // resolution: determines the number of polygons per 360 degree revolution (default 12)\n //\n // Example usage:\n //\n // var cylinder = CSG.cylinder({\n // start: [0, -1, 0],\n // end: [0, 1, 0],\n // radius: 1,\n // resolution: 16\n // });\n CSG.cylinder = function(options) {\n var s = CSG.parseOptionAs3DVector(options, \"start\", [0, -1, 0]);\n var e = CSG.parseOptionAs3DVector(options, \"end\", [0, 1, 0]);\n var r = CSG.parseOptionAsFloat(options, \"radius\", 1);\n var rEnd = CSG.parseOptionAsFloat(options, \"radiusEnd\", r);\n var rStart = CSG.parseOptionAsFloat(options, \"radiusStart\", r);\n var alpha = CSG.parseOptionAsFloat(options, \"sectorAngle\", 360);\n alpha = alpha > 360 ? alpha % 360 : alpha;\n\n if ((rEnd < 0) || (rStart < 0)) {\n throw new Error(\"Radius should be non-negative\");\n }\n if ((rEnd === 0) && (rStart === 0)) {\n throw new Error(\"Either radiusStart or radiusEnd should be positive\");\n }\n\n var slices = CSG.parseOptionAsInt(options, \"resolution\", CSG.defaultResolution2D);\n var ray = e.minus(s);\n var axisZ = ray.unit(); //, isY = (Math.abs(axisZ.y) > 0.5);\n var axisX = axisZ.randomNonParallelVector().unit();\n\n // var axisX = new CSG.Vector3D(isY, !isY, 0).cross(axisZ).unit();\n var axisY = axisX.cross(axisZ).unit();\n var start = new CSG.Vertex(s);\n var end = new CSG.Vertex(e);\n var polygons = [];\n\n function point(stack, slice, radius) {\n var angle = slice * Math.PI * alpha / 180;\n var out = axisX.times(Math.cos(angle)).plus(axisY.times(Math.sin(angle)));\n var pos = s.plus(ray.times(stack)).plus(out.times(radius));\n return new CSG.Vertex(pos);\n }\n if (alpha > 0) {\n for (var i = 0; i < slices; i++) {\n var t0 = i / slices,\n t1 = (i + 1) / slices;\n if (rEnd == rStart) {\n polygons.push(new CSG.Polygon([start, point(0, t0, rEnd), point(0, t1, rEnd)]));\n polygons.push(new CSG.Polygon([point(0, t1, rEnd), point(0, t0, rEnd), point(1, t0, rEnd), point(1, t1, rEnd)]));\n polygons.push(new CSG.Polygon([end, point(1, t1, rEnd), point(1, t0, rEnd)]));\n } else {\n if (rStart > 0) {\n polygons.push(new CSG.Polygon([start, point(0, t0, rStart), point(0, t1, rStart)]));\n polygons.push(new CSG.Polygon([point(0, t0, rStart), point(1, t0, rEnd), point(0, t1, rStart)]));\n }\n if (rEnd > 0) {\n polygons.push(new CSG.Polygon([end, point(1, t1, rEnd), point(1, t0, rEnd)]));\n polygons.push(new CSG.Polygon([point(1, t0, rEnd), point(1, t1, rEnd), point(0, t1, rStart)]));\n }\n }\n }\n if (alpha < 360) {\n polygons.push(new CSG.Polygon([start, end, point(0, 0, rStart)]));\n polygons.push(new CSG.Polygon([point(0, 0, rStart), end, point(1, 0, rEnd)]));\n polygons.push(new CSG.Polygon([start, point(0, 1, rStart), end]));\n polygons.push(new CSG.Polygon([point(0, 1, rStart), point(1, 1, rEnd), end]));\n }\n }\n var result = CSG.fromPolygons(polygons);\n result.properties.cylinder = new CSG.Properties();\n result.properties.cylinder.start = new CSG.Connector(s, axisZ.negated(), axisX);\n result.properties.cylinder.end = new CSG.Connector(e, axisZ, axisX);\n var cylCenter = s.plus(ray.times(0.5));\n var fptVec = axisX.rotate(s, axisZ, -alpha / 2).times((rStart + rEnd) / 2);\n var fptVec90 = fptVec.cross(axisZ);\n // note this one is NOT a face normal for a cone. - It's horizontal from cyl perspective\n result.properties.cylinder.facepointH = new CSG.Connector(cylCenter.plus(fptVec), fptVec, axisZ);\n result.properties.cylinder.facepointH90 = new CSG.Connector(cylCenter.plus(fptVec90), fptVec90, axisZ);\n return result;\n };\n\n // Like a cylinder, but with rounded ends instead of flat\n //\n // Parameters:\n // start: start point of cylinder (default [0, -1, 0])\n // end: end point of cylinder (default [0, 1, 0])\n // radius: radius of cylinder (default 1), must be a scalar\n // resolution: determines the number of polygons per 360 degree revolution (default 12)\n // normal: a vector determining the starting angle for tesselation. Should be non-parallel to start.minus(end)\n //\n // Example usage:\n //\n // var cylinder = CSG.roundedCylinder({\n // start: [0, -1, 0],\n // end: [0, 1, 0],\n // radius: 1,\n // resolution: 16\n // });\n CSG.roundedCylinder = function(options) {\n var p1 = CSG.parseOptionAs3DVector(options, \"start\", [0, -1, 0]);\n var p2 = CSG.parseOptionAs3DVector(options, \"end\", [0, 1, 0]);\n var radius = CSG.parseOptionAsFloat(options, \"radius\", 1);\n var direction = p2.minus(p1);\n var defaultnormal;\n if (Math.abs(direction.x) > Math.abs(direction.y)) {\n defaultnormal = new CSG.Vector3D(0, 1, 0);\n } else {\n defaultnormal = new CSG.Vector3D(1, 0, 0);\n }\n var normal = CSG.parseOptionAs3DVector(options, \"normal\", defaultnormal);\n var resolution = CSG.parseOptionAsInt(options, \"resolution\", CSG.defaultResolution3D);\n if (resolution < 4) resolution = 4;\n var polygons = [];\n var qresolution = Math.floor(0.25 * resolution);\n var length = direction.length();\n if (length < 1e-10) {\n return CSG.sphere({\n center: p1,\n radius: radius,\n resolution: resolution\n });\n }\n var zvector = direction.unit().times(radius);\n var xvector = zvector.cross(normal).unit().times(radius);\n var yvector = xvector.cross(zvector).unit().times(radius);\n var prevcylinderpoint;\n for (var slice1 = 0; slice1 <= resolution; slice1++) {\n var angle = Math.PI * 2.0 * slice1 / resolution;\n var cylinderpoint = xvector.times(Math.cos(angle)).plus(yvector.times(Math.sin(angle)));\n if (slice1 > 0) {\n // cylinder vertices:\n var vertices = [];\n vertices.push(new CSG.Vertex(p1.plus(cylinderpoint)));\n vertices.push(new CSG.Vertex(p1.plus(prevcylinderpoint)));\n vertices.push(new CSG.Vertex(p2.plus(prevcylinderpoint)));\n vertices.push(new CSG.Vertex(p2.plus(cylinderpoint)));\n polygons.push(new CSG.Polygon(vertices));\n var prevcospitch, prevsinpitch;\n for (var slice2 = 0; slice2 <= qresolution; slice2++) {\n var pitch = 0.5 * Math.PI * slice2 / qresolution;\n //var pitch = Math.asin(slice2/qresolution);\n var cospitch = Math.cos(pitch);\n var sinpitch = Math.sin(pitch);\n if (slice2 > 0) {\n vertices = [];\n vertices.push(new CSG.Vertex(p1.plus(prevcylinderpoint.times(prevcospitch).minus(zvector.times(prevsinpitch)))));\n vertices.push(new CSG.Vertex(p1.plus(cylinderpoint.times(prevcospitch).minus(zvector.times(prevsinpitch)))));\n if (slice2 < qresolution) {\n vertices.push(new CSG.Vertex(p1.plus(cylinderpoint.times(cospitch).minus(zvector.times(sinpitch)))));\n }\n vertices.push(new CSG.Vertex(p1.plus(prevcylinderpoint.times(cospitch).minus(zvector.times(sinpitch)))));\n polygons.push(new CSG.Polygon(vertices));\n vertices = [];\n vertices.push(new CSG.Vertex(p2.plus(prevcylinderpoint.times(prevcospitch).plus(zvector.times(prevsinpitch)))));\n vertices.push(new CSG.Vertex(p2.plus(cylinderpoint.times(prevcospitch).plus(zvector.times(prevsinpitch)))));\n if (slice2 < qresolution) {\n vertices.push(new CSG.Vertex(p2.plus(cylinderpoint.times(cospitch).plus(zvector.times(sinpitch)))));\n }\n vertices.push(new CSG.Vertex(p2.plus(prevcylinderpoint.times(cospitch).plus(zvector.times(sinpitch)))));\n vertices.reverse();\n polygons.push(new CSG.Polygon(vertices));\n }\n prevcospitch = cospitch;\n prevsinpitch = sinpitch;\n }\n }\n prevcylinderpoint = cylinderpoint;\n }\n var result = CSG.fromPolygons(polygons);\n var ray = zvector.unit();\n var axisX = xvector.unit();\n result.properties.roundedCylinder = new CSG.Properties();\n result.properties.roundedCylinder.start = new CSG.Connector(p1, ray.negated(), axisX);\n result.properties.roundedCylinder.end = new CSG.Connector(p2, ray, axisX);\n result.properties.roundedCylinder.facepoint = p1.plus(xvector);\n return result;\n };\n\n // Construct an axis-aligned solid rounded cuboid.\n // Parameters:\n // center: center of cube (default [0,0,0])\n // radius: radius of cube (default [1,1,1]), can be specified as scalar or as 3D vector\n // roundradius: radius of rounded corners (default 0.2), must be a scalar\n // resolution: determines the number of polygons per 360 degree revolution (default 8)\n //\n // Example code:\n //\n // var cube = CSG.roundedCube({\n // center: [0, 0, 0],\n // radius: 1,\n // roundradius: 0.2,\n // resolution: 8,\n // });\n CSG.roundedCube = function(options) {\n var EPS = 1e-5;\n var minRR = 1e-2; //minroundradius 1e-3 gives rounding errors already\n var center, cuberadius;\n options = options || {};\n if (('corner1' in options) || ('corner2' in options)) {\n if (('center' in options) || ('radius' in options)) {\n throw new Error(\"roundedCube: should either give a radius and center parameter, or a corner1 and corner2 parameter\");\n }\n corner1 = CSG.parseOptionAs3DVector(options, \"corner1\", [0, 0, 0]);\n corner2 = CSG.parseOptionAs3DVector(options, \"corner2\", [1, 1, 1]);\n center = corner1.plus(corner2).times(0.5);\n cuberadius = corner2.minus(corner1).times(0.5);\n } else {\n center = CSG.parseOptionAs3DVector(options, \"center\", [0, 0, 0]);\n cuberadius = CSG.parseOptionAs3DVector(options, \"radius\", [1, 1, 1]);\n }\n cuberadius = cuberadius.abs(); // negative radii make no sense\n var resolution = CSG.parseOptionAsInt(options, \"resolution\", CSG.defaultResolution3D);\n if (resolution < 4) resolution = 4;\n if (resolution%2 == 1 && resolution < 8) resolution = 8; // avoid ugly\n var roundradius = CSG.parseOptionAs3DVector(options, \"roundradius\", [0.2, 0.2, 0.2]);\n // slight hack for now - total radius stays ok\n roundradius = CSG.Vector3D.Create(Math.max(roundradius.x, minRR), Math.max(roundradius.y, minRR), Math.max(roundradius.z, minRR));\n var innerradius = cuberadius.minus(roundradius);\n if (innerradius.x < 0 || innerradius.y < 0 || innerradius.z < 0) {\n throw('roundradius <= radius!');\n }\n var res = CSG.sphere({radius:1, resolution:resolution});\n res = res.scale(roundradius);\n innerradius.x > EPS && (res = res.stretchAtPlane([1, 0, 0], [0, 0, 0], 2*innerradius.x));\n innerradius.y > EPS && (res = res.stretchAtPlane([0, 1, 0], [0, 0, 0], 2*innerradius.y));\n innerradius.z > EPS && (res = res.stretchAtPlane([0, 0, 1], [0, 0, 0], 2*innerradius.z));\n res = res.translate([-innerradius.x+center.x, -innerradius.y+center.y, -innerradius.z+center.z]);\n res = res.reTesselated();\n res.properties.roundedCube = new CSG.Properties();\n res.properties.roundedCube.center = new CSG.Vertex(center);\n res.properties.roundedCube.facecenters = [\n new CSG.Connector(new CSG.Vector3D([cuberadius.x, 0, 0]).plus(center), [1, 0, 0], [0, 0, 1]),\n new CSG.Connector(new CSG.Vector3D([-cuberadius.x, 0, 0]).plus(center), [-1, 0, 0], [0, 0, 1]),\n new CSG.Connector(new CSG.Vector3D([0, cuberadius.y, 0]).plus(center), [0, 1, 0], [0, 0, 1]),\n new CSG.Connector(new CSG.Vector3D([0, -cuberadius.y, 0]).plus(center), [0, -1, 0], [0, 0, 1]),\n new CSG.Connector(new CSG.Vector3D([0, 0, cuberadius.z]).plus(center), [0, 0, 1], [1, 0, 0]),\n new CSG.Connector(new CSG.Vector3D([0, 0, -cuberadius.z]).plus(center), [0, 0, -1], [1, 0, 0])\n ];\n return res;\n };\n\n /**\n * polyhedron accepts openscad style arguments. I.e. define face vertices clockwise looking from outside\n */\n CSG.polyhedron = function(options) {\n options = options || {};\n if (('points' in options) !== ('faces' in options)) {\n throw new Error(\"polyhedron needs 'points' and 'faces' arrays\");\n }\n var vertices = CSG.parseOptionAs3DVectorList(options, \"points\", [\n [1, 1, 0],\n [1, -1, 0],\n [-1, -1, 0],\n [-1, 1, 0],\n [0, 0, 1]\n ])\n .map(function(pt) {\n return new CSG.Vertex(pt);\n });\n var faces = CSG.parseOption(options, \"faces\", [\n [0, 1, 4],\n [1, 2, 4],\n [2, 3, 4],\n [3, 0, 4],\n [1, 0, 3],\n [2, 1, 3]\n ]);\n // openscad convention defines inward normals - so we have to invert here\n faces.forEach(function(face) {\n face.reverse();\n });\n var polygons = faces.map(function(face) {\n return new CSG.Polygon(face.map(function(idx) {\n return vertices[idx];\n }));\n });\n\n // TODO: facecenters as connectors? probably overkill. Maybe centroid\n // the re-tesselation here happens because it's so easy for a user to\n // create parametrized polyhedrons that end up with 1-2 dimensional polygons.\n // These will create infinite loops at CSG.Tree()\n return CSG.fromPolygons(polygons).reTesselated();\n };\n\n CSG.IsFloat = function(n) {\n return (!isNaN(n)) || (n === Infinity) || (n === -Infinity);\n };\n\n // solve 2x2 linear equation:\n // [ab][x] = [u]\n // [cd][y] [v]\n CSG.solve2Linear = function(a, b, c, d, u, v) {\n var det = a * d - b * c;\n var invdet = 1.0 / det;\n var x = u * d - b * v;\n var y = -u * c + a * v;\n x *= invdet;\n y *= invdet;\n return [x, y];\n };\n\n // # class Vector3D\n // Represents a 3D vector.\n //\n // Example usage:\n //\n // new CSG.Vector3D(1, 2, 3);\n // new CSG.Vector3D([1, 2, 3]);\n // new CSG.Vector3D({ x: 1, y: 2, z: 3 });\n // new CSG.Vector3D(1, 2); // assumes z=0\n // new CSG.Vector3D([1, 2]); // assumes z=0\n CSG.Vector3D = function(x, y, z) {\n if (arguments.length == 3) {\n this._x = parseFloat(x);\n this._y = parseFloat(y);\n this._z = parseFloat(z);\n } else if (arguments.length == 2) {\n this._x = parseFloat(x);\n this._y = parseFloat(y);\n this._z = 0;\n } else {\n var ok = true;\n if (arguments.length == 1) {\n if (typeof(x) == \"object\") {\n if (x instanceof CSG.Vector3D) {\n this._x = x._x;\n this._y = x._y;\n this._z = x._z;\n } else if (x instanceof CSG.Vector2D) {\n this._x = x._x;\n this._y = x._y;\n this._z = 0;\n } else if (x instanceof Array) {\n if ((x.length < 2) || (x.length > 3)) {\n ok = false;\n } else {\n this._x = parseFloat(x[0]);\n this._y = parseFloat(x[1]);\n if (x.length == 3) {\n this._z = parseFloat(x[2]);\n } else {\n this._z = 0;\n }\n }\n } else if (('_x' in x) && ('_y' in x)) {\n this._x = parseFloat(x._x);\n this._y = parseFloat(x._y);\n if ('_z' in x) {\n this._z = parseFloat(x._z);\n } else {\n this._z = 0;\n }\n } else ok = false;\n } else {\n var v = parseFloat(x);\n this._x = v;\n this._y = v;\n this._z = v;\n }\n } else ok = false;\n if (ok) {\n if ((!CSG.IsFloat(this._x)) || (!CSG.IsFloat(this._y)) || (!CSG.IsFloat(this._z))) ok = false;\n }\n if (!ok) {\n throw new Error(\"wrong arguments\");\n }\n }\n };\n\n // This does the same as new CSG.Vector3D(x,y,z) but it doesn't go through the constructor\n // and the parameters are not validated. Is much faster.\n CSG.Vector3D.Create = function(x, y, z) {\n var result = Object.create(CSG.Vector3D.prototype);\n result._x = x;\n result._y = y;\n result._z = z;\n return result;\n };\n\n CSG.Vector3D.prototype = {\n get x() {\n return this._x;\n },\n get y() {\n return this._y;\n },\n get z() {\n return this._z;\n },\n\n set x(v) {\n throw new Error(\"Vector3D is immutable\");\n },\n set y(v) {\n throw new Error(\"Vector3D is immutable\");\n },\n set z(v) {\n throw new Error(\"Vector3D is immutable\");\n },\n\n clone: function() {\n return CSG.Vector3D.Create(this._x, this._y, this._z);\n },\n\n negated: function() {\n return CSG.Vector3D.Create(-this._x, -this._y, -this._z);\n },\n\n abs: function() {\n return CSG.Vector3D.Create(Math.abs(this._x), Math.abs(this._y), Math.abs(this._z));\n },\n\n plus: function(a) {\n return CSG.Vector3D.Create(this._x + a._x, this._y + a._y, this._z + a._z);\n },\n\n minus: function(a) {\n return CSG.Vector3D.Create(this._x - a._x, this._y - a._y, this._z - a._z);\n },\n\n times: function(a) {\n return CSG.Vector3D.Create(this._x * a, this._y * a, this._z * a);\n },\n\n dividedBy: function(a) {\n return CSG.Vector3D.Create(this._x / a, this._y / a, this._z / a);\n },\n\n dot: function(a) {\n return this._x * a._x + this._y * a._y + this._z * a._z;\n },\n\n lerp: function(a, t) {\n return this.plus(a.minus(this).times(t));\n },\n\n lengthSquared: function() {\n return this.dot(this);\n },\n\n length: function() {\n return Math.sqrt(this.lengthSquared());\n },\n\n unit: function() {\n return this.dividedBy(this.length());\n },\n\n cross: function(a) {\n return CSG.Vector3D.Create(\n this._y * a._z - this._z * a._y, this._z * a._x - this._x * a._z, this._x * a._y - this._y * a._x);\n },\n\n distanceTo: function(a) {\n return this.minus(a).length();\n },\n\n distanceToSquared: function(a) {\n return this.minus(a).lengthSquared();\n },\n\n equals: function(a) {\n return (this._x == a._x) && (this._y == a._y) && (this._z == a._z);\n },\n\n // Right multiply by a 4x4 matrix (the vector is interpreted as a row vector)\n // Returns a new CSG.Vector3D\n multiply4x4: function(matrix4x4) {\n return matrix4x4.leftMultiply1x3Vector(this);\n },\n\n transform: function(matrix4x4) {\n return matrix4x4.leftMultiply1x3Vector(this);\n },\n\n toString: function() {\n return \"(\" + this._x.toFixed(2) + \", \" + this._y.toFixed(2) + \", \" + this._z.toFixed(2) + \")\";\n },\n\n // find a vector that is somewhat perpendicular to this one\n randomNonParallelVector: function() {\n var abs = this.abs();\n if ((abs._x <= abs._y) && (abs._x <= abs._z)) {\n return CSG.Vector3D.Create(1, 0, 0);\n } else if ((abs._y <= abs._x) && (abs._y <= abs._z)) {\n return CSG.Vector3D.Create(0, 1, 0);\n } else {\n return CSG.Vector3D.Create(0, 0, 1);\n }\n },\n\n min: function(p) {\n return CSG.Vector3D.Create(\n Math.min(this._x, p._x), Math.min(this._y, p._y), Math.min(this._z, p._z));\n },\n\n max: function(p) {\n return CSG.Vector3D.Create(\n Math.max(this._x, p._x), Math.max(this._y, p._y), Math.max(this._z, p._z));\n }\n };\n\n // # class Vertex\n // Represents a vertex of a polygon. Use your own vertex class instead of this\n // one to provide additional features like texture coordinates and vertex\n // colors. Custom vertex classes need to provide a `pos` property\n // `flipped()`, and `interpolate()` methods that behave analogous to the ones\n // defined by `CSG.Vertex`.\n CSG.Vertex = function(pos) {\n this.pos = pos;\n };\n\n // create from an untyped object with identical property names:\n CSG.Vertex.fromObject = function(obj) {\n var pos = new CSG.Vector3D(obj.pos);\n return new CSG.Vertex(pos);\n };\n\n CSG.Vertex.prototype = {\n // Return a vertex with all orientation-specific data (e.g. vertex normal) flipped. Called when the\n // orientation of a polygon is flipped.\n flipped: function() {\n return this;\n },\n\n getTag: function() {\n var result = this.tag;\n if (!result) {\n result = CSG.getTag();\n this.tag = result;\n }\n return result;\n },\n\n // Create a new vertex between this vertex and `other` by linearly\n // interpolating all properties using a parameter of `t`. Subclasses should\n // override this to interpolate additional properties.\n interpolate: function(other, t) {\n var newpos = this.pos.lerp(other.pos, t);\n return new CSG.Vertex(newpos);\n },\n\n // Affine transformation of vertex. Returns a new CSG.Vertex\n transform: function(matrix4x4) {\n var newpos = this.pos.multiply4x4(matrix4x4);\n return new CSG.Vertex(newpos);\n },\n\n toString: function() {\n return this.pos.toString();\n }\n };\n\n // # class Plane\n // Represents a plane in 3D space.\n CSG.Plane = function(normal, w) {\n this.normal = normal;\n this.w = w;\n };\n\n // create from an untyped object with identical property names:\n CSG.Plane.fromObject = function(obj) {\n var normal = new CSG.Vector3D(obj.normal);\n var w = parseFloat(obj.w);\n return new CSG.Plane(normal, w);\n };\n\n // `CSG.Plane.EPSILON` is the tolerance used by `splitPolygon()` to decide if a\n // point is on the plane.\n CSG.Plane.EPSILON = 1e-5;\n\n CSG.Plane.fromVector3Ds = function(a, b, c) {\n var n = b.minus(a).cross(c.minus(a)).unit();\n return new CSG.Plane(n, n.dot(a));\n };\n\n // like fromVector3Ds, but allow the vectors to be on one point or one line\n // in such a case a random plane through the given points is constructed\n CSG.Plane.anyPlaneFromVector3Ds = function(a, b, c) {\n var v1 = b.minus(a);\n var v2 = c.minus(a);\n if (v1.length() < 1e-5) {\n v1 = v2.randomNonParallelVector();\n }\n if (v2.length() < 1e-5) {\n v2 = v1.randomNonParallelVector();\n }\n var normal = v1.cross(v2);\n if (normal.length() < 1e-5) {\n // this would mean that v1 == v2.negated()\n v2 = v1.randomNonParallelVector();\n normal = v1.cross(v2);\n }\n normal = normal.unit();\n return new CSG.Plane(normal, normal.dot(a));\n };\n\n CSG.Plane.fromPoints = function(a, b, c) {\n a = new CSG.Vector3D(a);\n b = new CSG.Vector3D(b);\n c = new CSG.Vector3D(c);\n return CSG.Plane.fromVector3Ds(a, b, c);\n };\n\n CSG.Plane.fromNormalAndPoint = function(normal, point) {\n normal = new CSG.Vector3D(normal);\n point = new CSG.Vector3D(point);\n normal = normal.unit();\n var w = point.dot(normal);\n return new CSG.Plane(normal, w);\n };\n\n CSG.Plane.prototype = {\n flipped: function() {\n return new CSG.Plane(this.normal.negated(), -this.w);\n },\n\n getTag: function() {\n var result = this.tag;\n if (!result) {\n result = CSG.getTag();\n this.tag = result;\n }\n return result;\n },\n\n equals: function(n) {\n return this.normal.equals(n.normal) && this.w == n.w;\n },\n\n transform: function(matrix4x4) {\n var ismirror = matrix4x4.isMirroring();\n // get two vectors in the plane:\n var r = this.normal.randomNonParallelVector();\n var u = this.normal.cross(r);\n var v = this.normal.cross(u);\n // get 3 points in the plane:\n var point1 = this.normal.times(this.w);\n var point2 = point1.plus(u);\n var point3 = point1.plus(v);\n // transform the points:\n point1 = point1.multiply4x4(matrix4x4);\n point2 = point2.multiply4x4(matrix4x4);\n point3 = point3.multiply4x4(matrix4x4);\n // and create a new plane from the transformed points:\n var newplane = CSG.Plane.fromVector3Ds(point1, point2, point3);\n if (ismirror) {\n // the transform is mirroring\n // We should mirror the plane:\n newplane = newplane.flipped();\n }\n return newplane;\n },\n\n // Returns object:\n // .type:\n // 0: coplanar-front\n // 1: coplanar-back\n // 2: front\n // 3: back\n // 4: spanning\n // In case the polygon is spanning, returns:\n // .front: a CSG.Polygon of the front part\n // .back: a CSG.Polygon of the back part\n splitPolygon: function(polygon) {\n var result = {\n type: null,\n front: null,\n back: null\n };\n // cache in local vars (speedup):\n var planenormal = this.normal;\n var vertices = polygon.vertices;\n var numvertices = vertices.length;\n if (polygon.plane.equals(this)) {\n result.type = 0;\n } else {\n var EPS = CSG.Plane.EPSILON;\n var thisw = this.w;\n var hasfront = false;\n var hasback = false;\n var vertexIsBack = [];\n var MINEPS = -EPS;\n for (var i = 0; i < numvertices; i++) {\n var t = planenormal.dot(vertices[i].pos) - thisw;\n var isback = (t < 0);\n vertexIsBack.push(isback);\n if (t > EPS) hasfront = true;\n if (t < MINEPS) hasback = true;\n }\n if ((!hasfront) && (!hasback)) {\n // all points coplanar\n var t = planenormal.dot(polygon.plane.normal);\n result.type = (t >= 0) ? 0 : 1;\n } else if (!hasback) {\n result.type = 2;\n } else if (!hasfront) {\n result.type = 3;\n } else {\n // spanning\n result.type = 4;\n var frontvertices = [],\n backvertices = [];\n var isback = vertexIsBack[0];\n for (var vertexindex = 0; vertexindex < numvertices; vertexindex++) {\n var vertex = vertices[vertexindex];\n var nextvertexindex = vertexindex + 1;\n if (nextvertexindex >= numvertices) nextvertexindex = 0;\n var nextisback = vertexIsBack[nextvertexindex];\n if (isback == nextisback) {\n // line segment is on one side of the plane:\n if (isback) {\n backvertices.push(vertex);\n } else {\n frontvertices.push(vertex);\n }\n } else {\n // line segment intersects plane:\n var point = vertex.pos;\n var nextpoint = vertices[nextvertexindex].pos;\n var intersectionpoint = this.splitLineBetweenPoints(point, nextpoint);\n var intersectionvertex = new CSG.Vertex(intersectionpoint);\n if (isback) {\n backvertices.push(vertex);\n backvertices.push(intersectionvertex);\n frontvertices.push(intersectionvertex);\n } else {\n frontvertices.push(vertex);\n frontvertices.push(intersectionvertex);\n backvertices.push(intersectionvertex);\n }\n }\n isback = nextisback;\n } // for vertexindex\n // remove duplicate vertices:\n var EPS_SQUARED = CSG.Plane.EPSILON * CSG.Plane.EPSILON;\n if (backvertices.length >= 3) {\n var prevvertex = backvertices[backvertices.length - 1];\n for (var vertexindex = 0; vertexindex < backvertices.length; vertexindex++) {\n var vertex = backvertices[vertexindex];\n if (vertex.pos.distanceToSquared(prevvertex.pos) < EPS_SQUARED) {\n backvertices.splice(vertexindex, 1);\n vertexindex--;\n }\n prevvertex = vertex;\n }\n }\n if (frontvertices.length >= 3) {\n var prevvertex = frontvertices[frontvertices.length - 1];\n for (var vertexindex = 0; vertexindex < frontvertices.length; vertexindex++) {\n var vertex = frontvertices[vertexindex];\n if (vertex.pos.distanceToSquared(prevvertex.pos) < EPS_SQUARED) {\n frontvertices.splice(vertexindex, 1);\n vertexindex--;\n }\n prevvertex = vertex;\n }\n }\n if (frontvertices.length >= 3) {\n result.front = new CSG.Polygon(frontvertices, polygon.shared, polygon.plane);\n }\n if (backvertices.length >= 3) {\n result.back = new CSG.Polygon(backvertices, polygon.shared, polygon.plane);\n }\n }\n }\n return result;\n },\n\n // robust splitting of a line by a plane\n // will work even if the line is parallel to the plane\n splitLineBetweenPoints: function(p1, p2) {\n var direction = p2.minus(p1);\n var labda = (this.w - this.normal.dot(p1)) / this.normal.dot(direction);\n if (isNaN(labda)) labda = 0;\n if (labda > 1) labda = 1;\n if (labda < 0) labda = 0;\n var result = p1.plus(direction.times(labda));\n return result;\n },\n\n // returns CSG.Vector3D\n intersectWithLine: function(line3d) {\n return line3d.intersectWithPlane(this);\n },\n\n // intersection of two planes\n intersectWithPlane: function(plane) {\n return CSG.Line3D.fromPlanes(this, plane);\n },\n\n signedDistanceToPoint: function(point) {\n var t = this.normal.dot(point) - this.w;\n return t;\n },\n\n toString: function() {\n return \"[normal: \" + this.normal.toString() + \", w: \" + this.w + \"]\";\n },\n\n mirrorPoint: function(point3d) {\n var distance = this.signedDistanceToPoint(point3d);\n var mirrored = point3d.minus(this.normal.times(distance * 2.0));\n return mirrored;\n }\n };\n\n\n // # class Polygon\n // Represents a convex polygon. The vertices used to initialize a polygon must\n // be coplanar and form a convex loop. They do not have to be `CSG.Vertex`\n // instances but they must behave similarly (duck typing can be used for\n // customization).\n //\n // Each convex polygon has a `shared` property, which is shared between all\n // polygons that are clones of each other or were split from the same polygon.\n // This can be used to define per-polygon properties (such as surface color).\n //\n // The plane of the polygon is calculated from the vertex coordinates\n // To avoid unnecessary recalculation, the plane can alternatively be\n // passed as the third argument\n CSG.Polygon = function(vertices, shared, plane) {\n this.vertices = vertices;\n if (!shared) shared = CSG.Polygon.defaultShared;\n this.shared = shared;\n //var numvertices = vertices.length;\n\n if (arguments.length >= 3) {\n this.plane = plane;\n } else {\n this.plane = CSG.Plane.fromVector3Ds(vertices[0].pos, vertices[1].pos, vertices[2].pos);\n }\n\n if (_CSGDEBUG) {\n this.checkIfConvex();\n }\n };\n\n // create from an untyped object with identical property names:\n CSG.Polygon.fromObject = function(obj) {\n var vertices = obj.vertices.map(function(v) {\n return CSG.Vertex.fromObject(v);\n });\n var shared = CSG.Polygon.Shared.fromObject(obj.shared);\n var plane = CSG.Plane.fromObject(obj.plane);\n return new CSG.Polygon(vertices, shared, plane);\n };\n\n CSG.Polygon.prototype = {\n // check whether the polygon is convex (it should be, otherwise we will get unexpected results)\n checkIfConvex: function() {\n if (!CSG.Polygon.verticesConvex(this.vertices, this.plane.normal)) {\n CSG.Polygon.verticesConvex(this.vertices, this.plane.normal);\n throw new Error(\"Not convex!\");\n }\n },\n\n setColor: function(args) {\n var newshared = CSG.Polygon.Shared.fromColor.apply(this, arguments);\n this.shared = newshared;\n return this;\n },\n\n getSignedVolume: function() {\n var signedVolume = 0;\n for (var i = 0; i < this.vertices.length - 2; i++) {\n signedVolume += this.vertices[0].pos.dot(this.vertices[i+1].pos\n .cross(this.vertices[i+2].pos));\n }\n signedVolume /= 6;\n return signedVolume;\n },\n\n // Note: could calculate vectors only once to speed up\n getArea: function() {\n var polygonArea = 0;\n for (var i = 0; i < this.vertices.length - 2; i++) {\n polygonArea += this.vertices[i+1].pos.minus(this.vertices[0].pos)\n .cross(this.vertices[i+2].pos.minus(this.vertices[i+1].pos)).length();\n }\n polygonArea /= 2;\n return polygonArea;\n },\n\n\n // accepts array of features to calculate\n // returns array of results\n getTetraFeatures: function(features) {\n var result = [];\n features.forEach(function(feature) {\n if (feature == 'volume') {\n result.push(this.getSignedVolume());\n } else if (feature == 'area') {\n result.push(this.getArea());\n }\n }, this);\n return result;\n },\n\n // Extrude a polygon into the direction offsetvector\n // Returns a CSG object\n extrude: function(offsetvector) {\n var newpolygons = [];\n\n var polygon1 = this;\n var direction = polygon1.plane.normal.dot(offsetvector);\n if (direction > 0) {\n polygon1 = polygon1.flipped();\n }\n newpolygons.push(polygon1);\n var polygon2 = polygon1.translate(offsetvector);\n var numvertices = this.vertices.length;\n for (var i = 0; i < numvertices; i++) {\n var sidefacepoints = [];\n var nexti = (i < (numvertices - 1)) ? i + 1 : 0;\n sidefacepoints.push(polygon1.vertices[i].pos);\n sidefacepoints.push(polygon2.vertices[i].pos);\n sidefacepoints.push(polygon2.vertices[nexti].pos);\n sidefacepoints.push(polygon1.vertices[nexti].pos);\n var sidefacepolygon = CSG.Polygon.createFromPoints(sidefacepoints, this.shared);\n newpolygons.push(sidefacepolygon);\n }\n polygon2 = polygon2.flipped();\n newpolygons.push(polygon2);\n return CSG.fromPolygons(newpolygons);\n },\n\n translate: function(offset) {\n return this.transform(CSG.Matrix4x4.translation(offset));\n },\n\n // returns an array with a CSG.Vector3D (center point) and a radius\n boundingSphere: function() {\n if (!this.cachedBoundingSphere) {\n var box = this.boundingBox();\n var middle = box[0].plus(box[1]).times(0.5);\n var radius3 = box[1].minus(middle);\n var radius = radius3.length();\n this.cachedBoundingSphere = [middle, radius];\n }\n return this.cachedBoundingSphere;\n },\n\n // returns an array of two CSG.Vector3Ds (minimum coordinates and maximum coordinates)\n boundingBox: function() {\n if (!this.cachedBoundingBox) {\n var minpoint, maxpoint;\n var vertices = this.vertices;\n var numvertices = vertices.length;\n if (numvertices === 0) {\n minpoint = new CSG.Vector3D(0, 0, 0);\n } else {\n minpoint = vertices[0].pos;\n }\n maxpoint = minpoint;\n for (var i = 1; i < numvertices; i++) {\n var point = vertices[i].pos;\n minpoint = minpoint.min(point);\n maxpoint = maxpoint.max(point);\n }\n this.cachedBoundingBox = [minpoint, maxpoint];\n }\n return this.cachedBoundingBox;\n },\n\n flipped: function() {\n var newvertices = this.vertices.map(function(v) {\n return v.flipped();\n });\n newvertices.reverse();\n var newplane = this.plane.flipped();\n return new CSG.Polygon(newvertices, this.shared, newplane);\n },\n\n // Affine transformation of polygon. Returns a new CSG.Polygon\n transform: function(matrix4x4) {\n var newvertices = this.vertices.map(function(v) {\n return v.transform(matrix4x4);\n });\n var newplane = this.plane.transform(matrix4x4);\n if (matrix4x4.isMirroring()) {\n // need to reverse the vertex order\n // in order to preserve the inside/outside orientation:\n newvertices.reverse();\n }\n return new CSG.Polygon(newvertices, this.shared, newplane);\n },\n\n toString: function() {\n var result = \"Polygon plane: \" + this.plane.toString() + \"\\n\";\n this.vertices.map(function(vertex) {\n result += \" \" + vertex.toString() + \"\\n\";\n });\n return result;\n },\n\n // project the 3D polygon onto a plane\n projectToOrthoNormalBasis: function(orthobasis) {\n var points2d = this.vertices.map(function(vertex) {\n return orthobasis.to2D(vertex.pos);\n });\n var result = CAG.fromPointsNoCheck(points2d);\n var area = result.area();\n if (Math.abs(area) < 1e-5) {\n // the polygon was perpendicular to the orthnormal plane. The resulting 2D polygon would be degenerate\n // return an empty area instead:\n result = new CAG();\n } else if (area < 0) {\n result = result.flipped();\n }\n return result;\n },\n\n /**\n * Creates solid from slices (CSG.Polygon) by generating walls\n * @param {Object} options Solid generating options\n * - numslices {Number} Number of slices to be generated\n * - callback(t, slice) {Function} Callback function generating slices.\n * arguments: t = [0..1], slice = [0..numslices - 1]\n * return: CSG.Polygon or null to skip\n * - loop {Boolean} no flats, only walls, it's used to generate solids like a tor\n */\n solidFromSlices: function(options) {\n var polygons = [],\n csg = null,\n prev = null,\n bottom = null,\n top = null,\n numSlices = 2,\n bLoop = false,\n fnCallback,\n flipped = null;\n\n if (options) {\n bLoop = Boolean(options['loop']);\n\n if (options.numslices)\n numSlices = options.numslices;\n\n if (options.callback)\n fnCallback = options.callback;\n }\n if (!fnCallback) {\n var square = new CSG.Polygon.createFromPoints([\n [0, 0, 0],\n [1, 0, 0],\n [1, 1, 0],\n [0, 1, 0]\n ]);\n fnCallback = function(t, slice) {\n return t == 0 || t == 1 ? square.translate([0, 0, t]) : null;\n }\n }\n for (var i = 0, iMax = numSlices - 1; i <= iMax; i++) {\n csg = fnCallback.call(this, i / iMax, i);\n if (csg) {\n if (!(csg instanceof CSG.Polygon)) {\n throw new Error(\"CSG.Polygon.solidFromSlices callback error: CSG.Polygon expected\");\n }\n csg.checkIfConvex();\n\n if (prev) { //generate walls\n if (flipped === null) { //not generated yet\n flipped = prev.plane.signedDistanceToPoint(csg.vertices[0].pos) < 0;\n }\n this._addWalls(polygons, prev, csg, flipped);\n\n } else { //the first - will be a bottom\n bottom = csg;\n }\n prev = csg;\n } //callback can return null to skip that slice\n }\n top = csg;\n\n if (bLoop) {\n var bSameTopBottom = bottom.vertices.length == top.vertices.length &&\n bottom.vertices.every(function(v, index) {\n return v.pos.equals(top.vertices[index].pos)\n });\n //if top and bottom are not the same -\n //generate walls between them\n if (!bSameTopBottom) {\n this._addWalls(polygons, top, bottom, flipped);\n } //else - already generated\n } else {\n //save top and bottom\n //TODO: flip if necessary\n polygons.unshift(flipped ? bottom : bottom.flipped());\n polygons.push(flipped ? top.flipped() : top);\n }\n return CSG.fromPolygons(polygons);\n },\n /**\n *\n * @param walls Array of wall polygons\n * @param bottom Bottom polygon\n * @param top Top polygon\n */\n _addWalls: function(walls, bottom, top, bFlipped) {\n var bottomPoints = bottom.vertices.slice(0), //make a copy\n topPoints = top.vertices.slice(0), //make a copy\n color = top.shared || null;\n\n //check if bottom perimeter is closed\n if (!bottomPoints[0].pos.equals(bottomPoints[bottomPoints.length - 1].pos)) {\n bottomPoints.push(bottomPoints[0]);\n }\n\n //check if top perimeter is closed\n if (!topPoints[0].pos.equals(topPoints[topPoints.length - 1].pos)) {\n topPoints.push(topPoints[0]);\n }\n if (bFlipped) {\n bottomPoints = bottomPoints.reverse();\n topPoints = topPoints.reverse();\n }\n\n var iTopLen = topPoints.length - 1,\n iBotLen = bottomPoints.length - 1,\n iExtra = iTopLen - iBotLen, //how many extra triangles we need\n bMoreTops = iExtra > 0,\n bMoreBottoms = iExtra < 0;\n\n var aMin = []; //indexes to start extra triangles (polygon with minimal square)\n //init - we need exactly /iExtra/ small triangles\n for (var i = Math.abs(iExtra); i > 0; i--) {\n aMin.push({\n len: Infinity,\n index: -1\n });\n }\n\n var len;\n if (bMoreBottoms) {\n for (var i = 0; i < iBotLen; i++) {\n len = bottomPoints[i].pos.distanceToSquared(bottomPoints[i + 1].pos);\n //find the element to replace\n for (var j = aMin.length - 1; j >= 0; j--) {\n if (aMin[j].len > len) {\n aMin[j].len = len;\n aMin.index = j;\n break;\n }\n } //for\n }\n } else if (bMoreTops) {\n for (var i = 0; i < iTopLen; i++) {\n len = topPoints[i].pos.distanceToSquared(topPoints[i + 1].pos);\n //find the element to replace\n for (var j = aMin.length - 1; j >= 0; j--) {\n if (aMin[j].len > len) {\n aMin[j].len = len;\n aMin.index = j;\n break;\n }\n } //for\n }\n } //if\n //sort by index\n aMin.sort(fnSortByIndex);\n var getTriangle = function addWallsPutTriangle(pointA, pointB, pointC, color) {\n return new CSG.Polygon([pointA, pointB, pointC], color);\n //return bFlipped ? triangle.flipped() : triangle;\n };\n\n var bpoint = bottomPoints[0],\n tpoint = topPoints[0],\n secondPoint,\n nBotFacet, nTopFacet; //length of triangle facet side\n for (var iB = 0, iT = 0, iMax = iTopLen + iBotLen; iB + iT < iMax;) {\n if (aMin.length) {\n if (bMoreTops && iT == aMin[0].index) { //one vertex is on the bottom, 2 - on the top\n secondPoint = topPoints[++iT];\n //console.log('<<< extra top: ' + secondPoint + ', ' + tpoint + ', bottom: ' + bpoint);\n walls.push(getTriangle(\n secondPoint, tpoint, bpoint, color\n ));\n tpoint = secondPoint;\n aMin.shift();\n continue;\n } else if (bMoreBottoms && iB == aMin[0].index) {\n secondPoint = bottomPoints[++iB];\n walls.push(getTriangle(\n tpoint, bpoint, secondPoint, color\n ));\n bpoint = secondPoint;\n aMin.shift();\n continue;\n }\n }\n //choose the shortest path\n if (iB < iBotLen) { //one vertex is on the top, 2 - on the bottom\n nBotFacet = tpoint.pos.distanceToSquared(bottomPoints[iB + 1].pos);\n } else {\n nBotFacet = Infinity;\n }\n if (iT < iTopLen) { //one vertex is on the bottom, 2 - on the top\n nTopFacet = bpoint.pos.distanceToSquared(topPoints[iT + 1].pos);\n } else {\n nTopFacet = Infinity;\n }\n if (nBotFacet <= nTopFacet) {\n secondPoint = bottomPoints[++iB];\n walls.push(getTriangle(\n tpoint, bpoint, secondPoint, color\n ));\n bpoint = secondPoint;\n } else if (iT < iTopLen) { //nTopFacet < Infinity\n secondPoint = topPoints[++iT];\n //console.log('<<< top: ' + secondPoint + ', ' + tpoint + ', bottom: ' + bpoint);\n walls.push(getTriangle(\n secondPoint, tpoint, bpoint, color\n ));\n tpoint = secondPoint;\n };\n }\n return walls;\n }\n };\n\n CSG.Polygon.verticesConvex = function(vertices, planenormal) {\n var numvertices = vertices.length;\n if (numvertices > 2) {\n var prevprevpos = vertices[numvertices - 2].pos;\n var prevpos = vertices[numvertices - 1].pos;\n for (var i = 0; i < numvertices; i++) {\n var pos = vertices[i].pos;\n if (!CSG.Polygon.isConvexPoint(prevprevpos, prevpos, pos, planenormal)) {\n return false;\n }\n prevprevpos = prevpos;\n prevpos = pos;\n }\n }\n return true;\n };\n\n // Create a polygon from the given points\n CSG.Polygon.createFromPoints = function(points, shared, plane) {\n var normal;\n if (arguments.length < 3) {\n // initially set a dummy vertex normal:\n normal = new CSG.Vector3D(0, 0, 0);\n } else {\n normal = plane.normal;\n }\n var vertices = [];\n points.map(function(p) {\n var vec = new CSG.Vector3D(p);\n var vertex = new CSG.Vertex(vec);\n vertices.push(vertex);\n });\n var polygon;\n if (arguments.length < 3) {\n polygon = new CSG.Polygon(vertices, shared);\n } else {\n polygon = new CSG.Polygon(vertices, shared, plane);\n }\n return polygon;\n };\n\n // calculate whether three points form a convex corner\n // prevpoint, point, nextpoint: the 3 coordinates (CSG.Vector3D instances)\n // normal: the normal vector of the plane\n CSG.Polygon.isConvexPoint = function(prevpoint, point, nextpoint, normal) {\n var crossproduct = point.minus(prevpoint).cross(nextpoint.minus(point));\n var crossdotnormal = crossproduct.dot(normal);\n return (crossdotnormal >= 0);\n };\n\n CSG.Polygon.isStrictlyConvexPoint = function(prevpoint, point, nextpoint, normal) {\n var crossproduct = point.minus(prevpoint).cross(nextpoint.minus(point));\n var crossdotnormal = crossproduct.dot(normal);\n return (crossdotnormal >= 1e-5);\n };\n\n // # class CSG.Polygon.Shared\n // Holds the shared properties for each polygon (currently only color)\n // Constructor expects a 4 element array [r,g,b,a], values from 0 to 1, or null\n CSG.Polygon.Shared = function(color) {\n if(color !== null)\n {\n if (color.length != 4) {\n throw new Error(\"Expecting 4 element array\");\n }\n }\n this.color = color;\n };\n\n CSG.Polygon.Shared.fromObject = function(obj) {\n return new CSG.Polygon.Shared(obj.color);\n };\n\n // Create CSG.Polygon.Shared from a color, can be called as follows:\n // var s = CSG.Polygon.Shared.fromColor(r,g,b [,a])\n // var s = CSG.Polygon.Shared.fromColor([r,g,b [,a]])\n CSG.Polygon.Shared.fromColor = function(args) {\n var color;\n if(arguments.length == 1) {\n color = arguments[0].slice(); // make deep copy\n }\n else {\n color = [];\n for(var i=0; i < arguments.length; i++) {\n color.push(arguments[i]);\n }\n }\n if(color.length == 3) {\n color.push(1);\n } else if(color.length != 4) {\n throw new Error(\"setColor expects either an array with 3 or 4 elements, or 3 or 4 parameters.\");\n }\n return new CSG.Polygon.Shared(color);\n };\n\n CSG.Polygon.Shared.prototype = {\n getTag: function() {\n var result = this.tag;\n if (!result) {\n result = CSG.getTag();\n this.tag = result;\n }\n return result;\n },\n // get a string uniquely identifying this object\n getHash: function() {\n if (!this.color) return \"null\";\n return this.color.join(\"/\");\n }\n };\n\n CSG.Polygon.defaultShared = new CSG.Polygon.Shared(null);\n\n // # class PolygonTreeNode\n // This class manages hierarchical splits of polygons\n // At the top is a root node which doesn hold a polygon, only child PolygonTreeNodes\n // Below that are zero or more 'top' nodes; each holds a polygon. The polygons can be in different planes\n // splitByPlane() splits a node by a plane. If the plane intersects the polygon, two new child nodes\n // are created holding the splitted polygon.\n // getPolygons() retrieves the polygon from the tree. If for PolygonTreeNode the polygon is split but\n // the two split parts (child nodes) are still intact, then the unsplit polygon is returned.\n // This ensures that we can safely split a polygon into many fragments. If the fragments are untouched,\n // getPolygons() will return the original unsplit polygon instead of the fragments.\n // remove() removes a polygon from the tree. Once a polygon is removed, the parent polygons are invalidated\n // since they are no longer intact.\n // constructor creates the root node:\n CSG.PolygonTreeNode = function() {\n this.parent = null;\n this.children = [];\n this.polygon = null;\n this.removed = false;\n };\n\n CSG.PolygonTreeNode.prototype = {\n // fill the tree with polygons. Should be called on the root node only; child nodes must\n // always be a derivate (split) of the parent node.\n addPolygons: function(polygons) {\n if (!this.isRootNode())\n // new polygons can only be added to root node; children can only be splitted polygons\n throw new Error(\"Assertion failed\");\n var _this = this;\n polygons.map(function(polygon) {\n _this.addChild(polygon);\n });\n },\n\n // remove a node\n // - the siblings become toplevel nodes\n // - the parent is removed recursively\n remove: function() {\n if (!this.removed) {\n this.removed = true;\n\n if (_CSGDEBUG) {\n if (this.isRootNode()) throw new Error(\"Assertion failed\"); // can't remove root node\n if (this.children.length) throw new Error(\"Assertion failed\"); // we shouldn't remove nodes with children\n }\n\n // remove ourselves from the parent's children list:\n var parentschildren = this.parent.children;\n var i = parentschildren.indexOf(this);\n if (i < 0) throw new Error(\"Assertion failed\");\n parentschildren.splice(i, 1);\n\n // invalidate the parent's polygon, and of all parents above it:\n this.parent.recursivelyInvalidatePolygon();\n }\n },\n\n isRemoved: function() {\n return this.removed;\n },\n\n isRootNode: function() {\n return !this.parent;\n },\n\n // invert all polygons in the tree. Call on the root node\n invert: function() {\n if (!this.isRootNode()) throw new Error(\"Assertion failed\"); // can only call this on the root node\n this.invertSub();\n },\n\n getPolygon: function() {\n if (!this.polygon) throw new Error(\"Assertion failed\"); // doesn't have a polygon, which means that it has been broken down\n return this.polygon;\n },\n\n getPolygons: function(result) {\n var children = [this];\n var queue = [children];\n var i, j, l, node;\n for (i = 0; i < queue.length; ++i ) { // queue size can change in loop, don't cache length\n children = queue[i];\n for (j = 0, l = children.length; j < l; j++) { // ok to cache length\n node = children[j];\n if (node.polygon) {\n // the polygon hasn't been broken yet. We can ignore the children and return our polygon:\n result.push(node.polygon);\n } else {\n // our polygon has been split up and broken, so gather all subpolygons from the children\n queue.push(node.children);\n }\n }\n }\n },\n\n // split the node by a plane; add the resulting nodes to the frontnodes and backnodes array\n // If the plane doesn't intersect the polygon, the 'this' object is added to one of the arrays\n // If the plane does intersect the polygon, two new child nodes are created for the front and back fragments,\n // and added to both arrays.\n splitByPlane: function(plane, coplanarfrontnodes, coplanarbacknodes, frontnodes, backnodes) {\n if (this.children.length) {\n var queue = [this.children], i, j, l, node, nodes;\n for (i = 0; i < queue.length; i++) { // queue.length can increase, do not cache\n nodes = queue[i];\n for (j = 0, l = nodes.length; j < l; j++) { // ok to cache length\n node = nodes[j];\n if (node.children.length) {\n queue.push(node.children);\n } else {\n // no children. Split the polygon:\n node._splitByPlane(plane, coplanarfrontnodes, coplanarbacknodes, frontnodes, backnodes);\n }\n }\n }\n } else {\n this._splitByPlane(plane, coplanarfrontnodes, coplanarbacknodes, frontnodes, backnodes);\n }\n },\n\n // only to be called for nodes with no children\n _splitByPlane: function (plane, coplanarfrontnodes, coplanarbacknodes, frontnodes, backnodes) {\n var polygon = this.polygon;\n if (polygon) {\n var bound = polygon.boundingSphere();\n var sphereradius = bound[1] + 1e-4;\n var planenormal = plane.normal;\n var spherecenter = bound[0];\n var d = planenormal.dot(spherecenter) - plane.w;\n if (d > sphereradius) {\n frontnodes.push(this);\n } else if (d < -sphereradius) {\n backnodes.push(this);\n } else {\n var splitresult = plane.splitPolygon(polygon);\n switch (splitresult.type) {\n case 0:\n // coplanar front:\n coplanarfrontnodes.push(this);\n break;\n\n case 1:\n // coplanar back:\n coplanarbacknodes.push(this);\n break;\n\n case 2:\n // front:\n frontnodes.push(this);\n break;\n\n case 3:\n // back:\n backnodes.push(this);\n break;\n\n case 4:\n // spanning:\n if (splitresult.front) {\n var frontnode = this.addChild(splitresult.front);\n frontnodes.push(frontnode);\n }\n if (splitresult.back) {\n var backnode = this.addChild(splitresult.back);\n backnodes.push(backnode);\n }\n break;\n }\n }\n }\n },\n\n\n // PRIVATE methods from here:\n // add child to a node\n // this should be called whenever the polygon is split\n // a child should be created for every fragment of the split polygon\n // returns the newly created child\n addChild: function(polygon) {\n var newchild = new CSG.PolygonTreeNode();\n newchild.parent = this;\n newchild.polygon = polygon;\n this.children.push(newchild);\n return newchild;\n },\n\n invertSub: function() {\n var children = [this];\n var queue = [children];\n var i, j, l, node;\n for (i = 0; i < queue.length; i++) {\n children = queue[i];\n for (j = 0, l = children.length; j < l; j++) {\n node = children[j];\n if (node.polygon) {\n node.polygon = node.polygon.flipped();\n }\n queue.push(node.children);\n }\n }\n },\n\n recursivelyInvalidatePolygon: function() {\n var node = this;\n while (node.polygon) {\n node.polygon = null;\n if (node.parent) {\n node = node.parent;\n }\n }\n }\n };\n\n\n\n // # class Tree\n // This is the root of a BSP tree\n // We are using this separate class for the root of the tree, to hold the PolygonTreeNode root\n // The actual tree is kept in this.rootnode\n CSG.Tree = function(polygons) {\n this.polygonTree = new CSG.PolygonTreeNode();\n this.rootnode = new CSG.Node(null);\n if (polygons) this.addPolygons(polygons);\n };\n\n CSG.Tree.prototype = {\n invert: function() {\n this.polygonTree.invert();\n this.rootnode.invert();\n },\n\n // Remove all polygons in this BSP tree that are inside the other BSP tree\n // `tree`.\n clipTo: function(tree, alsoRemovecoplanarFront) {\n alsoRemovecoplanarFront = alsoRemovecoplanarFront ? true : false;\n this.rootnode.clipTo(tree, alsoRemovecoplanarFront);\n },\n\n allPolygons: function() {\n var result = [];\n this.polygonTree.getPolygons(result);\n return result;\n },\n\n addPolygons: function(polygons) {\n var _this = this;\n var polygontreenodes = polygons.map(function(p) {\n return _this.polygonTree.addChild(p);\n });\n this.rootnode.addPolygonTreeNodes(polygontreenodes);\n }\n };\n\n // # class Node\n // Holds a node in a BSP tree. A BSP tree is built from a collection of polygons\n // by picking a polygon to split along.\n // Polygons are not stored directly in the tree, but in PolygonTreeNodes, stored in\n // this.polygontreenodes. Those PolygonTreeNodes are children of the owning\n // CSG.Tree.polygonTree\n // This is not a leafy BSP tree since there is\n // no distinction between internal and leaf nodes.\n CSG.Node = function(parent) {\n this.plane = null;\n this.front = null;\n this.back = null;\n this.polygontreenodes = [];\n this.parent = parent;\n };\n\n CSG.Node.prototype = {\n // Convert solid space to empty space and empty space to solid space.\n invert: function() {\n var queue = [this];\n var i, node;\n for (var i = 0; i < queue.length; i++) {\n node = queue[i];\n if(node.plane) node.plane = node.plane.flipped();\n if(node.front) queue.push(node.front);\n if(node.back) queue.push(node.back);\n var temp = node.front;\n node.front = node.back;\n node.back = temp;\n }\n },\n\n // clip polygontreenodes to our plane\n // calls remove() for all clipped PolygonTreeNodes\n clipPolygons: function(polygontreenodes, alsoRemovecoplanarFront) {\n var args = {'node': this, 'polygontreenodes': polygontreenodes }\n var node;\n var stack = [];\n\n do {\n node = args.node;\n polygontreenodes = args.polygontreenodes;\n\n // begin \"function\"\n if(node.plane) {\n var backnodes = [];\n var frontnodes = [];\n var coplanarfrontnodes = alsoRemovecoplanarFront ? backnodes : frontnodes;\n var plane = node.plane;\n var numpolygontreenodes = polygontreenodes.length;\n for(i = 0; i < numpolygontreenodes; i++) {\n var node1 = polygontreenodes[i];\n if(!node1.isRemoved()) {\n node1.splitByPlane(plane, coplanarfrontnodes, backnodes, frontnodes, backnodes);\n }\n }\n\n if(node.front && (frontnodes.length > 0)) {\n stack.push({'node': node.front, 'polygontreenodes': frontnodes});\n }\n var numbacknodes = backnodes.length;\n if (node.back && (numbacknodes > 0)) {\n stack.push({'node': node.back, 'polygontreenodes': backnodes});\n } else {\n // there's nothing behind this plane. Delete the nodes behind this plane:\n for (var i = 0; i < numbacknodes; i++) {\n backnodes[i].remove();\n }\n }\n }\n args = stack.pop();\n } while (typeof(args) !== 'undefined');\n },\n\n // Remove all polygons in this BSP tree that are inside the other BSP tree\n // `tree`.\n clipTo: function(tree, alsoRemovecoplanarFront) {\n var node = this, stack = [];\n do {\n if(node.polygontreenodes.length > 0) {\n tree.rootnode.clipPolygons(node.polygontreenodes, alsoRemovecoplanarFront);\n }\n if(node.front) stack.push(node.front);\n if(node.back) stack.push(node.back);\n node = stack.pop();\n } while(typeof(node) !== 'undefined');\n },\n\n addPolygonTreeNodes: function(polygontreenodes) {\n var args = {'node': this, 'polygontreenodes': polygontreenodes };\n var node;\n var stack = [];\n do {\n node = args.node;\n polygontreenodes = args.polygontreenodes;\n\n if (polygontreenodes.length === 0) {\n args = stack.pop();\n continue;\n }\n var _this = node;\n if (!node.plane) {\n var bestplane = polygontreenodes[0].getPolygon().plane;\n node.plane = bestplane;\n }\n var frontnodes = [];\n var backnodes = [];\n\n for (var i = 0, n = polygontreenodes.length ; i < n; ++i) {\n polygontreenodes[i].splitByPlane(_this.plane, _this.polygontreenodes, backnodes, frontnodes, backnodes);\n }\n\n if (frontnodes.length > 0) {\n if (!node.front) node.front = new CSG.Node(node);\n stack.push({'node': node.front, 'polygontreenodes': frontnodes});\n }\n if (backnodes.length > 0) {\n if (!node.back) node.back = new CSG.Node(node);\n stack.push({'node': node.back, 'polygontreenodes': backnodes});\n }\n\n args = stack.pop();\n } while (typeof(args) !== 'undefined');\n },\n\n getParentPlaneNormals: function(normals, maxdepth) {\n if (maxdepth > 0) {\n if (this.parent) {\n normals.push(this.parent.plane.normal);\n this.parent.getParentPlaneNormals(normals, maxdepth - 1);\n }\n }\n }\n };\n\n //////////\n // # class Matrix4x4:\n // Represents a 4x4 matrix. Elements are specified in row order\n CSG.Matrix4x4 = function(elements) {\n if (arguments.length >= 1) {\n this.elements = elements;\n } else {\n // if no arguments passed: create unity matrix\n this.elements = [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1];\n }\n };\n\n CSG.Matrix4x4.prototype = {\n plus: function(m) {\n var r = [];\n for (var i = 0; i < 16; i++) {\n r[i] = this.elements[i] + m.elements[i];\n }\n return new CSG.Matrix4x4(r);\n },\n\n minus: function(m) {\n var r = [];\n for (var i = 0; i < 16; i++) {\n r[i] = this.elements[i] - m.elements[i];\n }\n return new CSG.Matrix4x4(r);\n },\n\n // right multiply by another 4x4 matrix:\n multiply: function(m) {\n // cache elements in local variables, for speedup:\n var this0 = this.elements[0];\n var this1 = this.elements[1];\n var this2 = this.elements[2];\n var this3 = this.elements[3];\n var this4 = this.elements[4];\n var this5 = this.elements[5];\n var this6 = this.elements[6];\n var this7 = this.elements[7];\n var this8 = this.elements[8];\n var this9 = this.elements[9];\n var this10 = this.elements[10];\n var this11 = this.elements[11];\n var this12 = this.elements[12];\n var this13 = this.elements[13];\n var this14 = this.elements[14];\n var this15 = this.elements[15];\n var m0 = m.elements[0];\n var m1 = m.elements[1];\n var m2 = m.elements[2];\n var m3 = m.elements[3];\n var m4 = m.elements[4];\n var m5 = m.elements[5];\n var m6 = m.elements[6];\n var m7 = m.elements[7];\n var m8 = m.elements[8];\n var m9 = m.elements[9];\n var m10 = m.elements[10];\n var m11 = m.elements[11];\n var m12 = m.elements[12];\n var m13 = m.elements[13];\n var m14 = m.elements[14];\n var m15 = m.elements[15];\n\n var result = [];\n result[0] = this0 * m0 + this1 * m4 + this2 * m8 + this3 * m12;\n result[1] = this0 * m1 + this1 * m5 + this2 * m9 + this3 * m13;\n result[2] = this0 * m2 + this1 * m6 + this2 * m10 + this3 * m14;\n result[3] = this0 * m3 + this1 * m7 + this2 * m11 + this3 * m15;\n result[4] = this4 * m0 + this5 * m4 + this6 * m8 + this7 * m12;\n result[5] = this4 * m1 + this5 * m5 + this6 * m9 + this7 * m13;\n result[6] = this4 * m2 + this5 * m6 + this6 * m10 + this7 * m14;\n result[7] = this4 * m3 + this5 * m7 + this6 * m11 + this7 * m15;\n result[8] = this8 * m0 + this9 * m4 + this10 * m8 + this11 * m12;\n result[9] = this8 * m1 + this9 * m5 + this10 * m9 + this11 * m13;\n result[10] = this8 * m2 + this9 * m6 + this10 * m10 + this11 * m14;\n result[11] = this8 * m3 + this9 * m7 + this10 * m11 + this11 * m15;\n result[12] = this12 * m0 + this13 * m4 + this14 * m8 + this15 * m12;\n result[13] = this12 * m1 + this13 * m5 + this14 * m9 + this15 * m13;\n result[14] = this12 * m2 + this13 * m6 + this14 * m10 + this15 * m14;\n result[15] = this12 * m3 + this13 * m7 + this14 * m11 + this15 * m15;\n return new CSG.Matrix4x4(result);\n },\n\n clone: function() {\n var elements = this.elements.map(function(p) {\n return p;\n });\n return new CSG.Matrix4x4(elements);\n },\n\n // Right multiply the matrix by a CSG.Vector3D (interpreted as 3 row, 1 column)\n // (result = M*v)\n // Fourth element is taken as 1\n rightMultiply1x3Vector: function(v) {\n var v0 = v._x;\n var v1 = v._y;\n var v2 = v._z;\n var v3 = 1;\n var x = v0 * this.elements[0] + v1 * this.elements[1] + v2 * this.elements[2] + v3 * this.elements[3];\n var y = v0 * this.elements[4] + v1 * this.elements[5] + v2 * this.elements[6] + v3 * this.elements[7];\n var z = v0 * this.elements[8] + v1 * this.elements[9] + v2 * this.elements[10] + v3 * this.elements[11];\n var w = v0 * this.elements[12] + v1 * this.elements[13] + v2 * this.elements[14] + v3 * this.elements[15];\n // scale such that fourth element becomes 1:\n if (w != 1) {\n var invw = 1.0 / w;\n x *= invw;\n y *= invw;\n z *= invw;\n }\n return new CSG.Vector3D(x, y, z);\n },\n\n // Multiply a CSG.Vector3D (interpreted as 3 column, 1 row) by this matrix\n // (result = v*M)\n // Fourth element is taken as 1\n leftMultiply1x3Vector: function(v) {\n var v0 = v._x;\n var v1 = v._y;\n var v2 = v._z;\n var v3 = 1;\n var x = v0 * this.elements[0] + v1 * this.elements[4] + v2 * this.elements[8] + v3 * this.elements[12];\n var y = v0 * this.elements[1] + v1 * this.elements[5] + v2 * this.elements[9] + v3 * this.elements[13];\n var z = v0 * this.elements[2] + v1 * this.elements[6] + v2 * this.elements[10] + v3 * this.elements[14];\n var w = v0 * this.elements[3] + v1 * this.elements[7] + v2 * this.elements[11] + v3 * this.elements[15];\n // scale such that fourth element becomes 1:\n if (w != 1) {\n var invw = 1.0 / w;\n x *= invw;\n y *= invw;\n z *= invw;\n }\n return new CSG.Vector3D(x, y, z);\n },\n\n // Right multiply the matrix by a CSG.Vector2D (interpreted as 2 row, 1 column)\n // (result = M*v)\n // Fourth element is taken as 1\n rightMultiply1x2Vector: function(v) {\n var v0 = v.x;\n var v1 = v.y;\n var v2 = 0;\n var v3 = 1;\n var x = v0 * this.elements[0] + v1 * this.elements[1] + v2 * this.elements[2] + v3 * this.elements[3];\n var y = v0 * this.elements[4] + v1 * this.elements[5] + v2 * this.elements[6] + v3 * this.elements[7];\n var z = v0 * this.elements[8] + v1 * this.elements[9] + v2 * this.elements[10] + v3 * this.elements[11];\n var w = v0 * this.elements[12] + v1 * this.elements[13] + v2 * this.elements[14] + v3 * this.elements[15];\n // scale such that fourth element becomes 1:\n if (w != 1) {\n var invw = 1.0 / w;\n x *= invw;\n y *= invw;\n z *= invw;\n }\n return new CSG.Vector2D(x, y);\n },\n\n // Multiply a CSG.Vector2D (interpreted as 2 column, 1 row) by this matrix\n // (result = v*M)\n // Fourth element is taken as 1\n leftMultiply1x2Vector: function(v) {\n var v0 = v.x;\n var v1 = v.y;\n var v2 = 0;\n var v3 = 1;\n var x = v0 * this.elements[0] + v1 * this.elements[4] + v2 * this.elements[8] + v3 * this.elements[12];\n var y = v0 * this.elements[1] + v1 * this.elements[5] + v2 * this.elements[9] + v3 * this.elements[13];\n var z = v0 * this.elements[2] + v1 * this.elements[6] + v2 * this.elements[10] + v3 * this.elements[14];\n var w = v0 * this.elements[3] + v1 * this.elements[7] + v2 * this.elements[11] + v3 * this.elements[15];\n // scale such that fourth element becomes 1:\n if (w != 1) {\n var invw = 1.0 / w;\n x *= invw;\n y *= invw;\n z *= invw;\n }\n return new CSG.Vector2D(x, y);\n },\n\n // determine whether this matrix is a mirroring transformation\n isMirroring: function() {\n var u = new CSG.Vector3D(this.elements[0], this.elements[4], this.elements[8]);\n var v = new CSG.Vector3D(this.elements[1], this.elements[5], this.elements[9]);\n var w = new CSG.Vector3D(this.elements[2], this.elements[6], this.elements[10]);\n\n // for a true orthogonal, non-mirrored base, u.cross(v) == w\n // If they have an opposite direction then we are mirroring\n var mirrorvalue = u.cross(v).dot(w);\n var ismirror = (mirrorvalue < 0);\n return ismirror;\n }\n };\n\n // return the unity matrix\n CSG.Matrix4x4.unity = function() {\n return new CSG.Matrix4x4();\n };\n\n // Create a rotation matrix for rotating around the x axis\n CSG.Matrix4x4.rotationX = function(degrees) {\n var radians = degrees * Math.PI * (1.0 / 180.0);\n var cos = Math.cos(radians);\n var sin = Math.sin(radians);\n var els = [\n 1, 0, 0, 0, 0, cos, sin, 0, 0, -sin, cos, 0, 0, 0, 0, 1\n ];\n return new CSG.Matrix4x4(els);\n };\n\n // Create a rotation matrix for rotating around the y axis\n CSG.Matrix4x4.rotationY = function(degrees) {\n var radians = degrees * Math.PI * (1.0 / 180.0);\n var cos = Math.cos(radians);\n var sin = Math.sin(radians);\n var els = [\n cos, 0, -sin, 0, 0, 1, 0, 0, sin, 0, cos, 0, 0, 0, 0, 1\n ];\n return new CSG.Matrix4x4(els);\n };\n\n // Create a rotation matrix for rotating around the z axis\n CSG.Matrix4x4.rotationZ = function(degrees) {\n var radians = degrees * Math.PI * (1.0 / 180.0);\n var cos = Math.cos(radians);\n var sin = Math.sin(radians);\n var els = [\n cos, sin, 0, 0, -sin, cos, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1\n ];\n return new CSG.Matrix4x4(els);\n };\n\n // Matrix for rotation about arbitrary point and axis\n CSG.Matrix4x4.rotation = function(rotationCenter, rotationAxis, degrees) {\n rotationCenter = new CSG.Vector3D(rotationCenter);\n rotationAxis = new CSG.Vector3D(rotationAxis);\n var rotationPlane = CSG.Plane.fromNormalAndPoint(rotationAxis, rotationCenter);\n var orthobasis = new CSG.OrthoNormalBasis(rotationPlane);\n var transformation = CSG.Matrix4x4.translation(rotationCenter.negated());\n transformation = transformation.multiply(orthobasis.getProjectionMatrix());\n transformation = transformation.multiply(CSG.Matrix4x4.rotationZ(degrees));\n transformation = transformation.multiply(orthobasis.getInverseProjectionMatrix());\n transformation = transformation.multiply(CSG.Matrix4x4.translation(rotationCenter));\n return transformation;\n };\n\n // Create an affine matrix for translation:\n CSG.Matrix4x4.translation = function(v) {\n // parse as CSG.Vector3D, so we can pass an array or a CSG.Vector3D\n var vec = new CSG.Vector3D(v);\n var els = [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, vec.x, vec.y, vec.z, 1];\n return new CSG.Matrix4x4(els);\n };\n\n // Create an affine matrix for mirroring into an arbitrary plane:\n CSG.Matrix4x4.mirroring = function(plane) {\n var nx = plane.normal.x;\n var ny = plane.normal.y;\n var nz = plane.normal.z;\n var w = plane.w;\n var els = [\n (1.0 - 2.0 * nx * nx), (-2.0 * ny * nx), (-2.0 * nz * nx), 0,\n (-2.0 * nx * ny), (1.0 - 2.0 * ny * ny), (-2.0 * nz * ny), 0,\n (-2.0 * nx * nz), (-2.0 * ny * nz), (1.0 - 2.0 * nz * nz), 0,\n (2.0 * nx * w), (2.0 * ny * w), (2.0 * nz * w), 1\n ];\n return new CSG.Matrix4x4(els);\n };\n\n // Create an affine matrix for scaling:\n CSG.Matrix4x4.scaling = function(v) {\n // parse as CSG.Vector3D, so we can pass an array or a CSG.Vector3D\n var vec = new CSG.Vector3D(v);\n var els = [\n vec.x, 0, 0, 0, 0, vec.y, 0, 0, 0, 0, vec.z, 0, 0, 0, 0, 1\n ];\n return new CSG.Matrix4x4(els);\n };\n\n ///////////////////////////////////////////////////\n // # class Vector2D:\n // Represents a 2 element vector\n CSG.Vector2D = function(x, y) {\n if (arguments.length == 2) {\n this._x = parseFloat(x);\n this._y = parseFloat(y);\n } else {\n var ok = true;\n if (arguments.length == 1) {\n if (typeof(x) == \"object\") {\n if (x instanceof CSG.Vector2D) {\n this._x = x._x;\n this._y = x._y;\n } else if (x instanceof Array) {\n this._x = parseFloat(x[0]);\n this._y = parseFloat(x[1]);\n } else if (('x' in x) && ('y' in x)) {\n this._x = parseFloat(x.x);\n this._y = parseFloat(x.y);\n } else ok = false;\n } else {\n var v = parseFloat(x);\n this._x = v;\n this._y = v;\n }\n } else ok = false;\n if (ok) {\n if ((!CSG.IsFloat(this._x)) || (!CSG.IsFloat(this._y))) ok = false;\n }\n if (!ok) {\n throw new Error(\"wrong arguments\");\n }\n }\n };\n\n CSG.Vector2D.fromAngle = function(radians) {\n return CSG.Vector2D.fromAngleRadians(radians);\n };\n\n CSG.Vector2D.fromAngleDegrees = function(degrees) {\n var radians = Math.PI * degrees / 180;\n return CSG.Vector2D.fromAngleRadians(radians);\n };\n\n CSG.Vector2D.fromAngleRadians = function(radians) {\n return CSG.Vector2D.Create(Math.cos(radians), Math.sin(radians));\n };\n\n // This does the same as new CSG.Vector2D(x,y) but it doesn't go through the constructor\n // and the parameters are not validated. Is much faster.\n CSG.Vector2D.Create = function(x, y) {\n var result = Object.create(CSG.Vector2D.prototype);\n result._x = x;\n result._y = y;\n return result;\n };\n\n CSG.Vector2D.prototype = {\n get x() {\n return this._x;\n },\n get y() {\n return this._y;\n },\n\n set x(v) {\n throw new Error(\"Vector2D is immutable\");\n },\n set y(v) {\n throw new Error(\"Vector2D is immutable\");\n },\n\n // extend to a 3D vector by adding a z coordinate:\n toVector3D: function(z) {\n return new CSG.Vector3D(this._x, this._y, z);\n },\n\n equals: function(a) {\n return (this._x == a._x) && (this._y == a._y);\n },\n\n clone: function() {\n return CSG.Vector2D.Create(this._x, this._y);\n },\n\n negated: function() {\n return CSG.Vector2D.Create(-this._x, -this._y);\n },\n\n plus: function(a) {\n return CSG.Vector2D.Create(this._x + a._x, this._y + a._y);\n },\n\n minus: function(a) {\n return CSG.Vector2D.Create(this._x - a._x, this._y - a._y);\n },\n\n times: function(a) {\n return CSG.Vector2D.Create(this._x * a, this._y * a);\n },\n\n dividedBy: function(a) {\n return CSG.Vector2D.Create(this._x / a, this._y / a);\n },\n\n dot: function(a) {\n return this._x * a._x + this._y * a._y;\n },\n\n lerp: function(a, t) {\n return this.plus(a.minus(this).times(t));\n },\n\n length: function() {\n return Math.sqrt(this.dot(this));\n },\n\n distanceTo: function(a) {\n return this.minus(a).length();\n },\n\n distanceToSquared: function(a) {\n return this.minus(a).lengthSquared();\n },\n\n lengthSquared: function() {\n return this.dot(this);\n },\n\n unit: function() {\n return this.dividedBy(this.length());\n },\n\n cross: function(a) {\n return this._x * a._y - this._y * a._x;\n },\n\n // returns the vector rotated by 90 degrees clockwise\n normal: function() {\n return CSG.Vector2D.Create(this._y, -this._x);\n },\n\n // Right multiply by a 4x4 matrix (the vector is interpreted as a row vector)\n // Returns a new CSG.Vector2D\n multiply4x4: function(matrix4x4) {\n return matrix4x4.leftMultiply1x2Vector(this);\n },\n\n transform: function(matrix4x4) {\n return matrix4x4.leftMultiply1x2Vector(this);\n },\n\n angle: function() {\n return this.angleRadians();\n },\n\n angleDegrees: function() {\n var radians = this.angleRadians();\n return 180 * radians / Math.PI;\n },\n\n angleRadians: function() {\n // y=sin, x=cos\n return Math.atan2(this._y, this._x);\n },\n\n min: function(p) {\n return CSG.Vector2D.Create(\n Math.min(this._x, p._x), Math.min(this._y, p._y));\n },\n\n max: function(p) {\n return CSG.Vector2D.Create(\n Math.max(this._x, p._x), Math.max(this._y, p._y));\n },\n\n toString: function() {\n return \"(\" + this._x.toFixed(2) + \", \" + this._y.toFixed(2) + \")\";\n },\n\n abs: function() {\n return CSG.Vector2D.Create(Math.abs(this._x), Math.abs(this._y));\n },\n };\n\n\n // # class Line2D\n // Represents a directional line in 2D space\n // A line is parametrized by its normal vector (perpendicular to the line, rotated 90 degrees counter clockwise)\n // and w. The line passes through the point .times(w).\n // normal must be a unit vector!\n // Equation: p is on line if normal.dot(p)==w\n CSG.Line2D = function(normal, w) {\n normal = new CSG.Vector2D(normal);\n w = parseFloat(w);\n var l = normal.length();\n // normalize:\n w *= l;\n normal = normal.times(1.0 / l);\n this.normal = normal;\n this.w = w;\n };\n\n CSG.Line2D.fromPoints = function(p1, p2) {\n p1 = new CSG.Vector2D(p1);\n p2 = new CSG.Vector2D(p2);\n var direction = p2.minus(p1);\n var normal = direction.normal().negated().unit();\n var w = p1.dot(normal);\n return new CSG.Line2D(normal, w);\n };\n\n CSG.Line2D.prototype = {\n // same line but opposite direction:\n reverse: function() {\n return new CSG.Line2D(this.normal.negated(), -this.w);\n },\n\n equals: function(l) {\n return (l.normal.equals(this.normal) && (l.w == this.w));\n },\n\n origin: function() {\n return this.normal.times(this.w);\n },\n\n direction: function() {\n return this.normal.normal();\n },\n\n xAtY: function(y) {\n // (py == y) && (normal * p == w)\n // -> px = (w - normal._y * y) / normal.x\n var x = (this.w - this.normal._y * y) / this.normal.x;\n return x;\n },\n\n absDistanceToPoint: function(point) {\n point = new CSG.Vector2D(point);\n var point_projected = point.dot(this.normal);\n var distance = Math.abs(point_projected - this.w);\n return distance;\n },\n /*FIXME: has error - origin is not defined, the method is never used\n closestPoint: function(point) {\n point = new CSG.Vector2D(point);\n var vector = point.dot(this.direction());\n return origin.plus(vector);\n },\n */\n\n // intersection between two lines, returns point as Vector2D\n intersectWithLine: function(line2d) {\n var point = CSG.solve2Linear(this.normal.x, this.normal.y, line2d.normal.x, line2d.normal.y, this.w, line2d.w);\n point = new CSG.Vector2D(point); // make vector2d\n return point;\n },\n\n transform: function(matrix4x4) {\n var origin = new CSG.Vector2D(0, 0);\n var pointOnPlane = this.normal.times(this.w);\n var neworigin = origin.multiply4x4(matrix4x4);\n var neworiginPlusNormal = this.normal.multiply4x4(matrix4x4);\n var newnormal = neworiginPlusNormal.minus(neworigin);\n var newpointOnPlane = pointOnPlane.multiply4x4(matrix4x4);\n var neww = newnormal.dot(newpointOnPlane);\n return new CSG.Line2D(newnormal, neww);\n }\n };\n\n // # class Line3D\n // Represents a line in 3D space\n // direction must be a unit vector\n // point is a random point on the line\n CSG.Line3D = function(point, direction) {\n point = new CSG.Vector3D(point);\n direction = new CSG.Vector3D(direction);\n this.point = point;\n this.direction = direction.unit();\n };\n\n CSG.Line3D.fromPoints = function(p1, p2) {\n p1 = new CSG.Vector3D(p1);\n p2 = new CSG.Vector3D(p2);\n var direction = p2.minus(p1);\n return new CSG.Line3D(p1, direction);\n };\n\n CSG.Line3D.fromPlanes = function(p1, p2) {\n var direction = p1.normal.cross(p2.normal);\n var l = direction.length();\n if (l < 1e-10) {\n throw new Error(\"Parallel planes\");\n }\n direction = direction.times(1.0 / l);\n\n var mabsx = Math.abs(direction.x);\n var mabsy = Math.abs(direction.y);\n var mabsz = Math.abs(direction.z);\n var origin;\n if ((mabsx >= mabsy) && (mabsx >= mabsz)) {\n // direction vector is mostly pointing towards x\n // find a point p for which x is zero:\n var r = CSG.solve2Linear(p1.normal.y, p1.normal.z, p2.normal.y, p2.normal.z, p1.w, p2.w);\n origin = new CSG.Vector3D(0, r[0], r[1]);\n } else if ((mabsy >= mabsx) && (mabsy >= mabsz)) {\n // find a point p for which y is zero:\n var r = CSG.solve2Linear(p1.normal.x, p1.normal.z, p2.normal.x, p2.normal.z, p1.w, p2.w);\n origin = new CSG.Vector3D(r[0], 0, r[1]);\n } else {\n // find a point p for which z is zero:\n var r = CSG.solve2Linear(p1.normal.x, p1.normal.y, p2.normal.x, p2.normal.y, p1.w, p2.w);\n origin = new CSG.Vector3D(r[0], r[1], 0);\n }\n return new CSG.Line3D(origin, direction);\n };\n\n\n CSG.Line3D.prototype = {\n intersectWithPlane: function(plane) {\n // plane: plane.normal * p = plane.w\n // line: p=line.point + labda * line.direction\n var labda = (plane.w - plane.normal.dot(this.point)) / plane.normal.dot(this.direction);\n var point = this.point.plus(this.direction.times(labda));\n return point;\n },\n\n clone: function(line) {\n return new CSG.Line3D(this.point.clone(), this.direction.clone());\n },\n\n reverse: function() {\n return new CSG.Line3D(this.point.clone(), this.direction.negated());\n },\n\n transform: function(matrix4x4) {\n var newpoint = this.point.multiply4x4(matrix4x4);\n var pointPlusDirection = this.point.plus(this.direction);\n var newPointPlusDirection = pointPlusDirection.multiply4x4(matrix4x4);\n var newdirection = newPointPlusDirection.minus(newpoint);\n return new CSG.Line3D(newpoint, newdirection);\n },\n\n closestPointOnLine: function(point) {\n point = new CSG.Vector3D(point);\n var t = point.minus(this.point).dot(this.direction) / this.direction.dot(this.direction);\n var closestpoint = this.point.plus(this.direction.times(t));\n return closestpoint;\n },\n\n distanceToPoint: function(point) {\n point = new CSG.Vector3D(point);\n var closestpoint = this.closestPointOnLine(point);\n var distancevector = point.minus(closestpoint);\n var distance = distancevector.length();\n return distance;\n },\n\n equals: function(line3d) {\n if (!this.direction.equals(line3d.direction)) return false;\n var distance = this.distanceToPoint(line3d.point);\n if (distance > 1e-8) return false;\n return true;\n }\n };\n\n\n // # class OrthoNormalBasis\n // Reprojects points on a 3D plane onto a 2D plane\n // or from a 2D plane back onto the 3D plane\n CSG.OrthoNormalBasis = function(plane, rightvector) {\n if (arguments.length < 2) {\n // choose an arbitrary right hand vector, making sure it is somewhat orthogonal to the plane normal:\n rightvector = plane.normal.randomNonParallelVector();\n } else {\n rightvector = new CSG.Vector3D(rightvector);\n }\n this.v = plane.normal.cross(rightvector).unit();\n this.u = this.v.cross(plane.normal);\n this.plane = plane;\n this.planeorigin = plane.normal.times(plane.w);\n };\n\n // Get an orthonormal basis for the standard XYZ planes.\n // Parameters: the names of two 3D axes. The 2d x axis will map to the first given 3D axis, the 2d y \n // axis will map to the second.\n // Prepend the axis with a \"-\" to invert the direction of this axis.\n // For example: CSG.OrthoNormalBasis.GetCartesian(\"-Y\",\"Z\")\n // will return an orthonormal basis where the 2d X axis maps to the 3D inverted Y axis, and\n // the 2d Y axis maps to the 3D Z axis.\n CSG.OrthoNormalBasis.GetCartesian = function(xaxisid, yaxisid) {\n var axisid = xaxisid + \"/\" + yaxisid;\n var planenormal, rightvector;\n if (axisid == \"X/Y\") {\n planenormal = [0, 0, 1];\n rightvector = [1, 0, 0];\n } else if (axisid == \"Y/-X\") {\n planenormal = [0, 0, 1];\n rightvector = [0, 1, 0];\n } else if (axisid == \"-X/-Y\") {\n planenormal = [0, 0, 1];\n rightvector = [-1, 0, 0];\n } else if (axisid == \"-Y/X\") {\n planenormal = [0, 0, 1];\n rightvector = [0, -1, 0];\n } else if (axisid == \"-X/Y\") {\n planenormal = [0, 0, -1];\n rightvector = [-1, 0, 0];\n } else if (axisid == \"-Y/-X\") {\n planenormal = [0, 0, -1];\n rightvector = [0, -1, 0];\n } else if (axisid == \"X/-Y\") {\n planenormal = [0, 0, -1];\n rightvector = [1, 0, 0];\n } else if (axisid == \"Y/X\") {\n planenormal = [0, 0, -1];\n rightvector = [0, 1, 0];\n } else if (axisid == \"X/Z\") {\n planenormal = [0, -1, 0];\n rightvector = [1, 0, 0];\n } else if (axisid == \"Z/-X\") {\n planenormal = [0, -1, 0];\n rightvector = [0, 0, 1];\n } else if (axisid == \"-X/-Z\") {\n planenormal = [0, -1, 0];\n rightvector = [-1, 0, 0];\n } else if (axisid == \"-Z/X\") {\n planenormal = [0, -1, 0];\n rightvector = [0, 0, -1];\n } else if (axisid == \"-X/Z\") {\n planenormal = [0, 1, 0];\n rightvector = [-1, 0, 0];\n } else if (axisid == \"-Z/-X\") {\n planenormal = [0, 1, 0];\n rightvector = [0, 0, -1];\n } else if (axisid == \"X/-Z\") {\n planenormal = [0, 1, 0];\n rightvector = [1, 0, 0];\n } else if (axisid == \"Z/X\") {\n planenormal = [0, 1, 0];\n rightvector = [0, 0, 1];\n } else if (axisid == \"Y/Z\") {\n planenormal = [1, 0, 0];\n rightvector = [0, 1, 0];\n } else if (axisid == \"Z/-Y\") {\n planenormal = [1, 0, 0];\n rightvector = [0, 0, 1];\n } else if (axisid == \"-Y/-Z\") {\n planenormal = [1, 0, 0];\n rightvector = [0, -1, 0];\n } else if (axisid == \"-Z/Y\") {\n planenormal = [1, 0, 0];\n rightvector = [0, 0, -1];\n } else if (axisid == \"-Y/Z\") {\n planenormal = [-1, 0, 0];\n rightvector = [0, -1, 0];\n } else if (axisid == \"-Z/-Y\") {\n planenormal = [-1, 0, 0];\n rightvector = [0, 0, -1];\n } else if (axisid == \"Y/-Z\") {\n planenormal = [-1, 0, 0];\n rightvector = [0, 1, 0];\n } else if (axisid == \"Z/Y\") {\n planenormal = [-1, 0, 0];\n rightvector = [0, 0, 1];\n } else {\n throw new Error(\"CSG.OrthoNormalBasis.GetCartesian: invalid combination of axis identifiers. Should pass two string arguments from [X,Y,Z,-X,-Y,-Z], being two different axes.\");\n }\n return new CSG.OrthoNormalBasis(new CSG.Plane(new CSG.Vector3D(planenormal), 0), new CSG.Vector3D(rightvector));\n };\n\n /*\n // test code for CSG.OrthoNormalBasis.GetCartesian()\n CSG.OrthoNormalBasis.GetCartesian_Test=function() {\n var axisnames=[\"X\",\"Y\",\"Z\",\"-X\",\"-Y\",\"-Z\"];\n var axisvectors=[[1,0,0], [0,1,0], [0,0,1], [-1,0,0], [0,-1,0], [0,0,-1]];\n for(var axis1=0; axis1 < 3; axis1++) {\n for(var axis1inverted=0; axis1inverted < 2; axis1inverted++) {\n var axis1name=axisnames[axis1+3*axis1inverted];\n var axis1vector=axisvectors[axis1+3*axis1inverted];\n for(var axis2=0; axis2 < 3; axis2++) {\n if(axis2 != axis1) {\n for(var axis2inverted=0; axis2inverted < 2; axis2inverted++) {\n var axis2name=axisnames[axis2+3*axis2inverted];\n var axis2vector=axisvectors[axis2+3*axis2inverted];\n var orthobasis=CSG.OrthoNormalBasis.GetCartesian(axis1name, axis2name);\n var test1=orthobasis.to3D(new CSG.Vector2D([1,0]));\n var test2=orthobasis.to3D(new CSG.Vector2D([0,1]));\n var expected1=new CSG.Vector3D(axis1vector);\n var expected2=new CSG.Vector3D(axis2vector);\n var d1=test1.distanceTo(expected1);\n var d2=test2.distanceTo(expected2);\n if( (d1 > 0.01) || (d2 > 0.01) ) {\n throw new Error(\"Wrong!\");\n }}}}}}\n throw new Error(\"OK\");\n };\n */\n\n // The z=0 plane, with the 3D x and y vectors mapped to the 2D x and y vector\n CSG.OrthoNormalBasis.Z0Plane = function() {\n var plane = new CSG.Plane(new CSG.Vector3D([0, 0, 1]), 0);\n return new CSG.OrthoNormalBasis(plane, new CSG.Vector3D([1, 0, 0]));\n };\n\n CSG.OrthoNormalBasis.prototype = {\n getProjectionMatrix: function() {\n return new CSG.Matrix4x4([\n this.u.x, this.v.x, this.plane.normal.x, 0,\n this.u.y, this.v.y, this.plane.normal.y, 0,\n this.u.z, this.v.z, this.plane.normal.z, 0,\n 0, 0, -this.plane.w, 1\n ]);\n },\n\n getInverseProjectionMatrix: function() {\n var p = this.plane.normal.times(this.plane.w);\n return new CSG.Matrix4x4([\n this.u.x, this.u.y, this.u.z, 0,\n this.v.x, this.v.y, this.v.z, 0,\n this.plane.normal.x, this.plane.normal.y, this.plane.normal.z, 0,\n p.x, p.y, p.z, 1\n ]);\n },\n\n to2D: function(vec3) {\n return new CSG.Vector2D(vec3.dot(this.u), vec3.dot(this.v));\n },\n\n to3D: function(vec2) {\n return this.planeorigin.plus(this.u.times(vec2.x)).plus(this.v.times(vec2.y));\n },\n\n line3Dto2D: function(line3d) {\n var a = line3d.point;\n var b = line3d.direction.plus(a);\n var a2d = this.to2D(a);\n var b2d = this.to2D(b);\n return CSG.Line2D.fromPoints(a2d, b2d);\n },\n\n line2Dto3D: function(line2d) {\n var a = line2d.origin();\n var b = line2d.direction().plus(a);\n var a3d = this.to3D(a);\n var b3d = this.to3D(b);\n return CSG.Line3D.fromPoints(a3d, b3d);\n },\n\n transform: function(matrix4x4) {\n // todo: this may not work properly in case of mirroring\n var newplane = this.plane.transform(matrix4x4);\n var rightpoint_transformed = this.u.transform(matrix4x4);\n var origin_transformed = new CSG.Vector3D(0, 0, 0).transform(matrix4x4);\n var newrighthandvector = rightpoint_transformed.minus(origin_transformed);\n var newbasis = new CSG.OrthoNormalBasis(newplane, newrighthandvector);\n return newbasis;\n }\n };\n\n function insertSorted(array, element, comparefunc) {\n var leftbound = 0;\n var rightbound = array.length;\n while (rightbound > leftbound) {\n var testindex = Math.floor((leftbound + rightbound) / 2);\n var testelement = array[testindex];\n var compareresult = comparefunc(element, testelement);\n if (compareresult > 0) // element > testelement\n {\n leftbound = testindex + 1;\n } else {\n rightbound = testindex;\n }\n }\n array.splice(leftbound, 0, element);\n }\n\n // Get the x coordinate of a point with a certain y coordinate, interpolated between two\n // points (CSG.Vector2D).\n // Interpolation is robust even if the points have the same y coordinate\n CSG.interpolateBetween2DPointsForY = function(point1, point2, y) {\n var f1 = y - point1.y;\n var f2 = point2.y - point1.y;\n if (f2 < 0) {\n f1 = -f1;\n f2 = -f2;\n }\n var t;\n if (f1 <= 0) {\n t = 0.0;\n } else if (f1 >= f2) {\n t = 1.0;\n } else if (f2 < 1e-10) {\n t = 0.5;\n } else {\n t = f1 / f2;\n }\n var result = point1.x + t * (point2.x - point1.x);\n return result;\n };\n\n // Retesselation function for a set of coplanar polygons. See the introduction at the top of\n // this file.\n CSG.reTesselateCoplanarPolygons = function(sourcepolygons, destpolygons) {\n var EPS = 1e-5;\n\n var numpolygons = sourcepolygons.length;\n if (numpolygons > 0) {\n var plane = sourcepolygons[0].plane;\n var shared = sourcepolygons[0].shared;\n var orthobasis = new CSG.OrthoNormalBasis(plane);\n var polygonvertices2d = []; // array of array of CSG.Vector2D\n var polygontopvertexindexes = []; // array of indexes of topmost vertex per polygon\n var topy2polygonindexes = {};\n var ycoordinatetopolygonindexes = {};\n\n var xcoordinatebins = {};\n var ycoordinatebins = {};\n\n // convert all polygon vertices to 2D\n // Make a list of all encountered y coordinates\n // And build a map of all polygons that have a vertex at a certain y coordinate:\n var ycoordinateBinningFactor = 1.0 / EPS * 10;\n for (var polygonindex = 0; polygonindex < numpolygons; polygonindex++) {\n var poly3d = sourcepolygons[polygonindex];\n var vertices2d = [];\n var numvertices = poly3d.vertices.length;\n var minindex = -1;\n if (numvertices > 0) {\n var miny, maxy, maxindex;\n for (var i = 0; i < numvertices; i++) {\n var pos2d = orthobasis.to2D(poly3d.vertices[i].pos);\n // perform binning of y coordinates: If we have multiple vertices very\n // close to each other, give them the same y coordinate:\n var ycoordinatebin = Math.floor(pos2d.y * ycoordinateBinningFactor);\n var newy;\n if (ycoordinatebin in ycoordinatebins) {\n newy = ycoordinatebins[ycoordinatebin];\n } else if (ycoordinatebin + 1 in ycoordinatebins) {\n newy = ycoordinatebins[ycoordinatebin + 1];\n } else if (ycoordinatebin - 1 in ycoordinatebins) {\n newy = ycoordinatebins[ycoordinatebin - 1];\n } else {\n newy = pos2d.y;\n ycoordinatebins[ycoordinatebin] = pos2d.y;\n }\n pos2d = CSG.Vector2D.Create(pos2d.x, newy);\n vertices2d.push(pos2d);\n var y = pos2d.y;\n if ((i === 0) || (y < miny)) {\n miny = y;\n minindex = i;\n }\n if ((i === 0) || (y > maxy)) {\n maxy = y;\n maxindex = i;\n }\n if (!(y in ycoordinatetopolygonindexes)) {\n ycoordinatetopolygonindexes[y] = {};\n }\n ycoordinatetopolygonindexes[y][polygonindex] = true;\n }\n if (miny >= maxy) {\n // degenerate polygon, all vertices have same y coordinate. Just ignore it from now:\n vertices2d = [];\n numvertices = 0;\n minindex = -1;\n } else {\n if (!(miny in topy2polygonindexes)) {\n topy2polygonindexes[miny] = [];\n }\n topy2polygonindexes[miny].push(polygonindex);\n }\n } // if(numvertices > 0)\n // reverse the vertex order:\n vertices2d.reverse();\n minindex = numvertices - minindex - 1;\n polygonvertices2d.push(vertices2d);\n polygontopvertexindexes.push(minindex);\n }\n var ycoordinates = [];\n for (var ycoordinate in ycoordinatetopolygonindexes) ycoordinates.push(ycoordinate);\n ycoordinates.sort(fnNumberSort);\n\n // Now we will iterate over all y coordinates, from lowest to highest y coordinate\n // activepolygons: source polygons that are 'active', i.e. intersect with our y coordinate\n // Is sorted so the polygons are in left to right order\n // Each element in activepolygons has these properties:\n // polygonindex: the index of the source polygon (i.e. an index into the sourcepolygons\n // and polygonvertices2d arrays)\n // leftvertexindex: the index of the vertex at the left side of the polygon (lowest x)\n // that is at or just above the current y coordinate\n // rightvertexindex: dito at right hand side of polygon\n // topleft, bottomleft: coordinates of the left side of the polygon crossing the current y coordinate\n // topright, bottomright: coordinates of the right hand side of the polygon crossing the current y coordinate\n var activepolygons = [];\n var prevoutpolygonrow = [];\n for (var yindex = 0; yindex < ycoordinates.length; yindex++) {\n var newoutpolygonrow = [];\n var ycoordinate_as_string = ycoordinates[yindex];\n var ycoordinate = Number(ycoordinate_as_string);\n\n // update activepolygons for this y coordinate:\n // - Remove any polygons that end at this y coordinate\n // - update leftvertexindex and rightvertexindex (which point to the current vertex index\n // at the the left and right side of the polygon\n // Iterate over all polygons that have a corner at this y coordinate:\n var polygonindexeswithcorner = ycoordinatetopolygonindexes[ycoordinate_as_string];\n for (var activepolygonindex = 0; activepolygonindex < activepolygons.length; ++activepolygonindex) {\n var activepolygon = activepolygons[activepolygonindex];\n var polygonindex = activepolygon.polygonindex;\n if (polygonindexeswithcorner[polygonindex]) {\n // this active polygon has a corner at this y coordinate:\n var vertices2d = polygonvertices2d[polygonindex];\n var numvertices = vertices2d.length;\n var newleftvertexindex = activepolygon.leftvertexindex;\n var newrightvertexindex = activepolygon.rightvertexindex;\n // See if we need to increase leftvertexindex or decrease rightvertexindex:\n while (true) {\n var nextleftvertexindex = newleftvertexindex + 1;\n if (nextleftvertexindex >= numvertices) nextleftvertexindex = 0;\n if (vertices2d[nextleftvertexindex].y != ycoordinate) break;\n newleftvertexindex = nextleftvertexindex;\n }\n var nextrightvertexindex = newrightvertexindex - 1;\n if (nextrightvertexindex < 0) nextrightvertexindex = numvertices - 1;\n if (vertices2d[nextrightvertexindex].y == ycoordinate) {\n newrightvertexindex = nextrightvertexindex;\n }\n if ((newleftvertexindex != activepolygon.leftvertexindex) && (newleftvertexindex == newrightvertexindex)) {\n // We have increased leftvertexindex or decreased rightvertexindex, and now they point to the same vertex\n // This means that this is the bottom point of the polygon. We'll remove it:\n activepolygons.splice(activepolygonindex, 1);\n --activepolygonindex;\n } else {\n activepolygon.leftvertexindex = newleftvertexindex;\n activepolygon.rightvertexindex = newrightvertexindex;\n activepolygon.topleft = vertices2d[newleftvertexindex];\n activepolygon.topright = vertices2d[newrightvertexindex];\n var nextleftvertexindex = newleftvertexindex + 1;\n if (nextleftvertexindex >= numvertices) nextleftvertexindex = 0;\n activepolygon.bottomleft = vertices2d[nextleftvertexindex];\n var nextrightvertexindex = newrightvertexindex - 1;\n if (nextrightvertexindex < 0) nextrightvertexindex = numvertices - 1;\n activepolygon.bottomright = vertices2d[nextrightvertexindex];\n }\n } // if polygon has corner here\n } // for activepolygonindex\n var nextycoordinate;\n if (yindex >= ycoordinates.length - 1) {\n // last row, all polygons must be finished here:\n activepolygons = [];\n nextycoordinate = null;\n } else // yindex < ycoordinates.length-1\n {\n nextycoordinate = Number(ycoordinates[yindex + 1]);\n var middleycoordinate = 0.5 * (ycoordinate + nextycoordinate);\n // update activepolygons by adding any polygons that start here:\n var startingpolygonindexes = topy2polygonindexes[ycoordinate_as_string];\n for (var polygonindex_key in startingpolygonindexes) {\n var polygonindex = startingpolygonindexes[polygonindex_key];\n var vertices2d = polygonvertices2d[polygonindex];\n var numvertices = vertices2d.length;\n var topvertexindex = polygontopvertexindexes[polygonindex];\n // the top of the polygon may be a horizontal line. In that case topvertexindex can point to any point on this line.\n // Find the left and right topmost vertices which have the current y coordinate:\n var topleftvertexindex = topvertexindex;\n while (true) {\n var i = topleftvertexindex + 1;\n if (i >= numvertices) i = 0;\n if (vertices2d[i].y != ycoordinate) break;\n if (i == topvertexindex) break; // should not happen, but just to prevent endless loops\n topleftvertexindex = i;\n }\n var toprightvertexindex = topvertexindex;\n while (true) {\n var i = toprightvertexindex - 1;\n if (i < 0) i = numvertices - 1;\n if (vertices2d[i].y != ycoordinate) break;\n if (i == topleftvertexindex) break; // should not happen, but just to prevent endless loops\n toprightvertexindex = i;\n }\n var nextleftvertexindex = topleftvertexindex + 1;\n if (nextleftvertexindex >= numvertices) nextleftvertexindex = 0;\n var nextrightvertexindex = toprightvertexindex - 1;\n if (nextrightvertexindex < 0) nextrightvertexindex = numvertices - 1;\n var newactivepolygon = {\n polygonindex: polygonindex,\n leftvertexindex: topleftvertexindex,\n rightvertexindex: toprightvertexindex,\n topleft: vertices2d[topleftvertexindex],\n topright: vertices2d[toprightvertexindex],\n bottomleft: vertices2d[nextleftvertexindex],\n bottomright: vertices2d[nextrightvertexindex],\n };\n insertSorted(activepolygons, newactivepolygon, function(el1, el2) {\n var x1 = CSG.interpolateBetween2DPointsForY(\n el1.topleft, el1.bottomleft, middleycoordinate);\n var x2 = CSG.interpolateBetween2DPointsForY(\n el2.topleft, el2.bottomleft, middleycoordinate);\n if (x1 > x2) return 1;\n if (x1 < x2) return -1;\n return 0;\n });\n } // for(var polygonindex in startingpolygonindexes)\n } // yindex < ycoordinates.length-1\n //if( (yindex == ycoordinates.length-1) || (nextycoordinate - ycoordinate > EPS) )\n if (true) {\n // Now activepolygons is up to date\n // Build the output polygons for the next row in newoutpolygonrow:\n for (var activepolygon_key in activepolygons) {\n var activepolygon = activepolygons[activepolygon_key];\n var polygonindex = activepolygon.polygonindex;\n var vertices2d = polygonvertices2d[polygonindex];\n var numvertices = vertices2d.length;\n\n var x = CSG.interpolateBetween2DPointsForY(activepolygon.topleft, activepolygon.bottomleft, ycoordinate);\n var topleft = CSG.Vector2D.Create(x, ycoordinate);\n x = CSG.interpolateBetween2DPointsForY(activepolygon.topright, activepolygon.bottomright, ycoordinate);\n var topright = CSG.Vector2D.Create(x, ycoordinate);\n x = CSG.interpolateBetween2DPointsForY(activepolygon.topleft, activepolygon.bottomleft, nextycoordinate);\n var bottomleft = CSG.Vector2D.Create(x, nextycoordinate);\n x = CSG.interpolateBetween2DPointsForY(activepolygon.topright, activepolygon.bottomright, nextycoordinate);\n var bottomright = CSG.Vector2D.Create(x, nextycoordinate);\n var outpolygon = {\n topleft: topleft,\n topright: topright,\n bottomleft: bottomleft,\n bottomright: bottomright,\n leftline: CSG.Line2D.fromPoints(topleft, bottomleft),\n rightline: CSG.Line2D.fromPoints(bottomright, topright)\n };\n if (newoutpolygonrow.length > 0) {\n var prevoutpolygon = newoutpolygonrow[newoutpolygonrow.length - 1];\n var d1 = outpolygon.topleft.distanceTo(prevoutpolygon.topright);\n var d2 = outpolygon.bottomleft.distanceTo(prevoutpolygon.bottomright);\n if ((d1 < EPS) && (d2 < EPS)) {\n // we can join this polygon with the one to the left:\n outpolygon.topleft = prevoutpolygon.topleft;\n outpolygon.leftline = prevoutpolygon.leftline;\n outpolygon.bottomleft = prevoutpolygon.bottomleft;\n newoutpolygonrow.splice(newoutpolygonrow.length - 1, 1);\n }\n }\n newoutpolygonrow.push(outpolygon);\n } // for(activepolygon in activepolygons)\n if (yindex > 0) {\n // try to match the new polygons against the previous row:\n var prevcontinuedindexes = {};\n var matchedindexes = {};\n for (var i = 0; i < newoutpolygonrow.length; i++) {\n var thispolygon = newoutpolygonrow[i];\n for (var ii = 0; ii < prevoutpolygonrow.length; ii++) {\n if (!matchedindexes[ii]) // not already processed?\n {\n // We have a match if the sidelines are equal or if the top coordinates\n // are on the sidelines of the previous polygon\n var prevpolygon = prevoutpolygonrow[ii];\n if (prevpolygon.bottomleft.distanceTo(thispolygon.topleft) < EPS) {\n if (prevpolygon.bottomright.distanceTo(thispolygon.topright) < EPS) {\n // Yes, the top of this polygon matches the bottom of the previous:\n matchedindexes[ii] = true;\n // Now check if the joined polygon would remain convex:\n var d1 = thispolygon.leftline.direction().x - prevpolygon.leftline.direction().x;\n var d2 = thispolygon.rightline.direction().x - prevpolygon.rightline.direction().x;\n var leftlinecontinues = Math.abs(d1) < EPS;\n var rightlinecontinues = Math.abs(d2) < EPS;\n var leftlineisconvex = leftlinecontinues || (d1 >= 0);\n var rightlineisconvex = rightlinecontinues || (d2 >= 0);\n if (leftlineisconvex && rightlineisconvex) {\n // yes, both sides have convex corners:\n // This polygon will continue the previous polygon\n thispolygon.outpolygon = prevpolygon.outpolygon;\n thispolygon.leftlinecontinues = leftlinecontinues;\n thispolygon.rightlinecontinues = rightlinecontinues;\n prevcontinuedindexes[ii] = true;\n }\n break;\n }\n }\n } // if(!prevcontinuedindexes[ii])\n } // for ii\n } // for i\n for (var ii = 0; ii < prevoutpolygonrow.length; ii++) {\n if (!prevcontinuedindexes[ii]) {\n // polygon ends here\n // Finish the polygon with the last point(s):\n var prevpolygon = prevoutpolygonrow[ii];\n prevpolygon.outpolygon.rightpoints.push(prevpolygon.bottomright);\n if (prevpolygon.bottomright.distanceTo(prevpolygon.bottomleft) > EPS) {\n // polygon ends with a horizontal line:\n prevpolygon.outpolygon.leftpoints.push(prevpolygon.bottomleft);\n }\n // reverse the left half so we get a counterclockwise circle:\n prevpolygon.outpolygon.leftpoints.reverse();\n var points2d = prevpolygon.outpolygon.rightpoints.concat(prevpolygon.outpolygon.leftpoints);\n var vertices3d = [];\n points2d.map(function(point2d) {\n var point3d = orthobasis.to3D(point2d);\n var vertex3d = new CSG.Vertex(point3d);\n vertices3d.push(vertex3d);\n });\n var polygon = new CSG.Polygon(vertices3d, shared, plane);\n destpolygons.push(polygon);\n }\n }\n } // if(yindex > 0)\n for (var i = 0; i < newoutpolygonrow.length; i++) {\n var thispolygon = newoutpolygonrow[i];\n if (!thispolygon.outpolygon) {\n // polygon starts here:\n thispolygon.outpolygon = {\n leftpoints: [],\n rightpoints: []\n };\n thispolygon.outpolygon.leftpoints.push(thispolygon.topleft);\n if (thispolygon.topleft.distanceTo(thispolygon.topright) > EPS) {\n // we have a horizontal line at the top:\n thispolygon.outpolygon.rightpoints.push(thispolygon.topright);\n }\n } else {\n // continuation of a previous row\n if (!thispolygon.leftlinecontinues) {\n thispolygon.outpolygon.leftpoints.push(thispolygon.topleft);\n }\n if (!thispolygon.rightlinecontinues) {\n thispolygon.outpolygon.rightpoints.push(thispolygon.topright);\n }\n }\n }\n prevoutpolygonrow = newoutpolygonrow;\n }\n } // for yindex\n } // if(numpolygons > 0)\n };\n\n ////////////////////////////////\n // ## class fuzzyFactory\n // This class acts as a factory for objects. We can search for an object with approximately\n // the desired properties (say a rectangle with width 2 and height 1)\n // The lookupOrCreate() method looks for an existing object (for example it may find an existing rectangle\n // with width 2.0001 and height 0.999. If no object is found, the user supplied callback is\n // called, which should generate a new object. The new object is inserted into the database\n // so it can be found by future lookupOrCreate() calls.\n // Constructor:\n // numdimensions: the number of parameters for each object\n // for example for a 2D rectangle this would be 2\n // tolerance: The maximum difference for each parameter allowed to be considered a match\n CSG.fuzzyFactory = function(numdimensions, tolerance) {\n this.lookuptable = {};\n this.multiplier = 1.0 / tolerance;\n };\n\n CSG.fuzzyFactory.prototype = {\n // var obj = f.lookupOrCreate([el1, el2, el3], function(elements) {/* create the new object */});\n // Performs a fuzzy lookup of the object with the specified elements.\n // If found, returns the existing object\n // If not found, calls the supplied callback function which should create a new object with\n // the specified properties. This object is inserted in the lookup database.\n lookupOrCreate: function(els, creatorCallback) {\n var hash = \"\";\n var multiplier = this.multiplier;\n els.forEach(function(el) {\n var valueQuantized = Math.round(el * multiplier);\n hash += valueQuantized + \"/\";\n });\n if (hash in this.lookuptable) {\n return this.lookuptable[hash];\n } else {\n var object = creatorCallback(els);\n var hashparts = els.map(function(el) {\n var q0 = Math.floor(el * multiplier);\n var q1 = q0 + 1;\n return [\"\" + q0 + \"/\", \"\" + q1 + \"/\"];\n });\n var numelements = els.length;\n var numhashes = 1 << numelements;\n for (var hashmask = 0; hashmask < numhashes; ++hashmask) {\n var hashmask_shifted = hashmask;\n hash = \"\";\n hashparts.forEach(function(hashpart) {\n hash += hashpart[hashmask_shifted & 1];\n hashmask_shifted >>= 1;\n });\n this.lookuptable[hash] = object;\n }\n return object;\n }\n },\n };\n\n\n //////////////////////////////////////\n CSG.fuzzyCSGFactory = function() {\n this.vertexfactory = new CSG.fuzzyFactory(3, 1e-5);\n this.planefactory = new CSG.fuzzyFactory(4, 1e-5);\n this.polygonsharedfactory = {};\n };\n\n CSG.fuzzyCSGFactory.prototype = {\n getPolygonShared: function(sourceshared) {\n var hash = sourceshared.getHash();\n if (hash in this.polygonsharedfactory) {\n return this.polygonsharedfactory[hash];\n } else {\n this.polygonsharedfactory[hash] = sourceshared;\n return sourceshared;\n }\n },\n\n getVertex: function(sourcevertex) {\n var elements = [sourcevertex.pos._x, sourcevertex.pos._y, sourcevertex.pos._z];\n var result = this.vertexfactory.lookupOrCreate(elements, function(els) {\n return sourcevertex;\n });\n return result;\n },\n\n getPlane: function(sourceplane) {\n var elements = [sourceplane.normal._x, sourceplane.normal._y, sourceplane.normal._z, sourceplane.w];\n var result = this.planefactory.lookupOrCreate(elements, function(els) {\n return sourceplane;\n });\n return result;\n },\n\n getPolygon: function(sourcepolygon) {\n var newplane = this.getPlane(sourcepolygon.plane);\n var newshared = this.getPolygonShared(sourcepolygon.shared);\n var _this = this;\n var newvertices = sourcepolygon.vertices.map(function(vertex) {\n return _this.getVertex(vertex);\n });\n // two vertices that were originally very close may now have become\n // truly identical (referring to the same CSG.Vertex object).\n // Remove duplicate vertices:\n var newvertices_dedup = [];\n if(newvertices.length > 0) {\n var prevvertextag = newvertices[newvertices.length-1].getTag();\n newvertices.forEach(function(vertex) {\n var vertextag = vertex.getTag();\n if(vertextag != prevvertextag)\n {\n newvertices_dedup.push(vertex);\n }\n prevvertextag = vertextag;\n });\n }\n // If it's degenerate, remove all vertices:\n if(newvertices_dedup.length < 3) {\n newvertices_dedup = [];\n }\n return new CSG.Polygon(newvertices_dedup, newshared, newplane);\n },\n\n getCSG: function(sourcecsg) {\n var _this = this;\n var newpolygons = [];\n sourcecsg.polygons.forEach(function(polygon) {\n var newpolygon = _this.getPolygon(polygon);\n // see getPolygon above: we may get a polygon with no vertices, discard it:\n if(newpolygon.vertices.length >= 3)\n {\n newpolygons.push(newpolygon);\n }\n });\n return CSG.fromPolygons(newpolygons);\n }\n };\n\n //////////////////////////////////////\n // Tag factory: we can request a unique tag through CSG.getTag()\n CSG.staticTag = 1;\n\n CSG.getTag = function() {\n return CSG.staticTag++;\n };\n\n //////////////////////////////////////\n // # Class Properties\n // This class is used to store properties of a solid\n // A property can for example be a CSG.Vertex, a CSG.Plane or a CSG.Line3D\n // Whenever an affine transform is applied to the CSG solid, all its properties are\n // transformed as well.\n // The properties can be stored in a complex nested structure (using arrays and objects)\n CSG.Properties = function() {};\n\n CSG.Properties.prototype = {\n _transform: function(matrix4x4) {\n var result = new CSG.Properties();\n CSG.Properties.transformObj(this, result, matrix4x4);\n return result;\n },\n _merge: function(otherproperties) {\n var result = new CSG.Properties();\n CSG.Properties.cloneObj(this, result);\n CSG.Properties.addFrom(result, otherproperties);\n return result;\n }\n };\n\n CSG.Properties.transformObj = function(source, result, matrix4x4) {\n for (var propertyname in source) {\n if (propertyname == \"_transform\") continue;\n if (propertyname == \"_merge\") continue;\n var propertyvalue = source[propertyname];\n var transformed = propertyvalue;\n if (typeof(propertyvalue) == \"object\") {\n if (('transform' in propertyvalue) && (typeof(propertyvalue.transform) == \"function\")) {\n transformed = propertyvalue.transform(matrix4x4);\n } else if (propertyvalue instanceof Array) {\n transformed = [];\n CSG.Properties.transformObj(propertyvalue, transformed, matrix4x4);\n } else if (propertyvalue instanceof CSG.Properties) {\n transformed = new CSG.Properties();\n CSG.Properties.transformObj(propertyvalue, transformed, matrix4x4);\n }\n }\n result[propertyname] = transformed;\n }\n };\n\n CSG.Properties.cloneObj = function(source, result) {\n for (var propertyname in source) {\n if (propertyname == \"_transform\") continue;\n if (propertyname == \"_merge\") continue;\n var propertyvalue = source[propertyname];\n var cloned = propertyvalue;\n if (typeof(propertyvalue) == \"object\") {\n if (propertyvalue instanceof Array) {\n cloned = [];\n for (var i = 0; i < propertyvalue.length; i++) {\n cloned.push(propertyvalue[i]);\n }\n } else if (propertyvalue instanceof CSG.Properties) {\n cloned = new CSG.Properties();\n CSG.Properties.cloneObj(propertyvalue, cloned);\n }\n }\n result[propertyname] = cloned;\n }\n };\n\n CSG.Properties.addFrom = function(result, otherproperties) {\n for (var propertyname in otherproperties) {\n if (propertyname == \"_transform\") continue;\n if (propertyname == \"_merge\") continue;\n if ((propertyname in result) &&\n (typeof(result[propertyname]) == \"object\") &&\n (result[propertyname] instanceof CSG.Properties) &&\n (typeof(otherproperties[propertyname]) == \"object\") &&\n (otherproperties[propertyname] instanceof CSG.Properties)) {\n CSG.Properties.addFrom(result[propertyname], otherproperties[propertyname]);\n } else if (!(propertyname in result)) {\n result[propertyname] = otherproperties[propertyname];\n }\n }\n };\n\n //////////////////////////////////////\n // # class Connector\n // A connector allows to attach two objects at predefined positions\n // For example a servo motor and a servo horn:\n // Both can have a Connector called 'shaft'\n // The horn can be moved and rotated such that the two connectors match\n // and the horn is attached to the servo motor at the proper position.\n // Connectors are stored in the properties of a CSG solid so they are\n // ge the same transformations applied as the solid\n CSG.Connector = function(point, axisvector, normalvector) {\n this.point = new CSG.Vector3D(point);\n this.axisvector = new CSG.Vector3D(axisvector).unit();\n this.normalvector = new CSG.Vector3D(normalvector).unit();\n };\n\n CSG.Connector.prototype = {\n normalized: function() {\n var axisvector = this.axisvector.unit();\n // make the normal vector truly normal:\n var n = this.normalvector.cross(axisvector).unit();\n var normalvector = axisvector.cross(n);\n return new CSG.Connector(this.point, axisvector, normalvector);\n },\n\n transform: function(matrix4x4) {\n var point = this.point.multiply4x4(matrix4x4);\n var axisvector = this.point.plus(this.axisvector).multiply4x4(matrix4x4).minus(point);\n var normalvector = this.point.plus(this.normalvector).multiply4x4(matrix4x4).minus(point);\n return new CSG.Connector(point, axisvector, normalvector);\n },\n\n // Get the transformation matrix to connect this Connector to another connector\n // other: a CSG.Connector to which this connector should be connected\n // mirror: false: the 'axis' vectors of the connectors should point in the same direction\n // true: the 'axis' vectors of the connectors should point in opposite direction\n // normalrotation: degrees of rotation between the 'normal' vectors of the two\n // connectors\n getTransformationTo: function(other, mirror, normalrotation) {\n mirror = mirror ? true : false;\n normalrotation = normalrotation ? Number(normalrotation) : 0;\n var us = this.normalized();\n other = other.normalized();\n // shift to the origin:\n var transformation = CSG.Matrix4x4.translation(this.point.negated());\n // construct the plane crossing through the origin and the two axes:\n var axesplane = CSG.Plane.anyPlaneFromVector3Ds(\n new CSG.Vector3D(0, 0, 0), us.axisvector, other.axisvector);\n var axesbasis = new CSG.OrthoNormalBasis(axesplane);\n var angle1 = axesbasis.to2D(us.axisvector).angle();\n var angle2 = axesbasis.to2D(other.axisvector).angle();\n var rotation = 180.0 * (angle2 - angle1) / Math.PI;\n if (mirror) rotation += 180.0;\n transformation = transformation.multiply(axesbasis.getProjectionMatrix());\n transformation = transformation.multiply(CSG.Matrix4x4.rotationZ(rotation));\n transformation = transformation.multiply(axesbasis.getInverseProjectionMatrix());\n var usAxesAligned = us.transform(transformation);\n // Now we have done the transformation for aligning the axes.\n // We still need to align the normals:\n var normalsplane = CSG.Plane.fromNormalAndPoint(other.axisvector, new CSG.Vector3D(0, 0, 0));\n var normalsbasis = new CSG.OrthoNormalBasis(normalsplane);\n angle1 = normalsbasis.to2D(usAxesAligned.normalvector).angle();\n angle2 = normalsbasis.to2D(other.normalvector).angle();\n rotation = 180.0 * (angle2 - angle1) / Math.PI;\n rotation += normalrotation;\n transformation = transformation.multiply(normalsbasis.getProjectionMatrix());\n transformation = transformation.multiply(CSG.Matrix4x4.rotationZ(rotation));\n transformation = transformation.multiply(normalsbasis.getInverseProjectionMatrix());\n // and translate to the destination point:\n transformation = transformation.multiply(CSG.Matrix4x4.translation(other.point));\n // var usAligned = us.transform(transformation);\n return transformation;\n },\n\n axisLine: function() {\n return new CSG.Line3D(this.point, this.axisvector);\n },\n\n // creates a new Connector, with the connection point moved in the direction of the axisvector\n extend: function(distance) {\n var newpoint = this.point.plus(this.axisvector.unit().times(distance));\n return new CSG.Connector(newpoint, this.axisvector, this.normalvector);\n }\n };\n\n CSG.ConnectorList = function(connectors) {\n this.connectors_ = connectors ? connectors.slice() : [];\n };\n\n CSG.ConnectorList.defaultNormal = [0, 0, 1];\n\n CSG.ConnectorList.fromPath2D = function(path2D, arg1, arg2) {\n if (arguments.length === 3) {\n return CSG.ConnectorList._fromPath2DTangents(path2D, arg1, arg2);\n } else if (arguments.length == 2) {\n return CSG.ConnectorList._fromPath2DExplicit(path2D, arg1);\n } else {\n throw(\"call with path2D and either 2 direction vectors, or a function returning direction vectors\");\n }\n };\n\n /*\n * calculate the connector axisvectors by calculating the \"tangent\" for path2D.\n * This is undefined for start and end points, so axis for these have to be manually\n * provided.\n */\n CSG.ConnectorList._fromPath2DTangents = function(path2D, start, end) {\n // path2D\n var axis;\n var pathLen = path2D.points.length;\n var result = new CSG.ConnectorList([new CSG.Connector(path2D.points[0],\n start, CSG.ConnectorList.defaultNormal)]);\n // middle points\n path2D.points.slice(1, pathLen - 1).forEach(function(p2, i) {\n axis = path2D.points[i + 2].minus(path2D.points[i]).toVector3D(0);\n result.appendConnector(new CSG.Connector(p2.toVector3D(0), axis,\n CSG.ConnectorList.defaultNormal));\n }, this);\n result.appendConnector(new CSG.Connector(path2D.points[pathLen - 1], end,\n CSG.ConnectorList.defaultNormal));\n result.closed = path2D.closed;\n return result;\n };\n\n /*\n * angleIsh: either a static angle, or a function(point) returning an angle\n */\n CSG.ConnectorList._fromPath2DExplicit = function(path2D, angleIsh) {\n function getAngle(angleIsh, pt, i) {\n if (typeof angleIsh == 'function') {\n angleIsh = angleIsh(pt, i);\n }\n return angleIsh;\n }\n var result = new CSG.ConnectorList(\n path2D.points.map(function(p2, i) {\n return new CSG.Connector(p2.toVector3D(0),\n CSG.Vector3D.Create(1, 0, 0).rotateZ(getAngle(angleIsh, p2, i)),\n CSG.ConnectorList.defaultNormal);\n }, this)\n );\n result.closed = path2D.closed;\n return result;\n };\n\n\n CSG.ConnectorList.prototype = {\n setClosed: function(bool) {\n this.closed = !!closed;\n },\n appendConnector: function(conn) {\n this.connectors_.push(conn);\n },\n /*\n * arguments: cagish: a cag or a function(connector) returning a cag\n * closed: whether the 3d path defined by connectors location\n * should be closed or stay open\n * Note: don't duplicate connectors in the path\n * TODO: consider an option \"maySelfIntersect\" to close & force union all single segments\n */\n followWith: function(cagish) {\n this.verify();\n function getCag(cagish, connector) {\n if (typeof cagish == \"function\") {\n cagish = cagish(connector.point, connector.axisvector, connector.normalvector);\n }\n return cagish;\n }\n\n var polygons = [], currCag;\n var prevConnector = this.connectors_[this.connectors_.length - 1];\n var prevCag = getCag(cagish, prevConnector);\n // add walls\n this.connectors_.forEach(function(connector, notFirst) {\n currCag = getCag(cagish, connector);\n if (notFirst || this.closed) {\n polygons.push.apply(polygons, prevCag._toWallPolygons({\n toConnector1: prevConnector, toConnector2: connector, cag: currCag}));\n } else {\n // it is the first, and shape not closed -> build start wall\n polygons.push.apply(polygons,\n currCag._toPlanePolygons({toConnector: connector, flipped: true}));\n }\n if (notFirst == this.connectors_.length - 1 && !this.closed) {\n // build end wall\n polygons.push.apply(polygons,\n currCag._toPlanePolygons({toConnector: connector}));\n }\n prevCag = currCag;\n prevConnector = connector;\n }, this);\n return CSG.fromPolygons(polygons).reTesselated().canonicalized();\n },\n /*\n * general idea behind these checks: connectors need to have smooth transition from one to another\n * TODO: add a check that 2 follow-on CAGs are not intersecting\n */\n verify: function() {\n var connI, connI1, dPosToAxis, axisToNextAxis;\n for (var i = 0; i < this.connectors_.length - 1; i++) {\n connI = this.connectors_[i], connI1 = this.connectors_[i + 1];\n if (connI1.point.minus(connI.point).dot(connI.axisvector) <= 0) {\n throw(\"Invalid ConnectorList. Each connectors position needs to be within a <90deg range of previous connectors axisvector\");\n }\n if (connI.axisvector.dot(connI1.axisvector) <= 0) {\n throw(\"invalid ConnectorList. No neighboring connectors axisvectors may span a >=90deg angle\");\n }\n }\n }\n };\n\n //////////////////////////////////////\n // # Class Path2D\n CSG.Path2D = function(points, closed) {\n closed = !!closed;\n points = points || [];\n // re-parse the points into CSG.Vector2D\n // and remove any duplicate points\n var prevpoint = null;\n if (closed && (points.length > 0)) {\n prevpoint = new CSG.Vector2D(points[points.length - 1]);\n }\n var newpoints = [];\n points.map(function(point) {\n point = new CSG.Vector2D(point);\n var skip = false;\n if (prevpoint !== null) {\n var distance = point.distanceTo(prevpoint);\n skip = distance < 1e-5;\n }\n if (!skip) newpoints.push(point);\n prevpoint = point;\n });\n this.points = newpoints;\n this.closed = closed;\n };\n\n /*\n Construct a (part of a) circle. Parameters:\n options.center: the center point of the arc (CSG.Vector2D or array [x,y])\n options.radius: the circle radius (float)\n options.startangle: the starting angle of the arc, in degrees\n 0 degrees corresponds to [1,0]\n 90 degrees to [0,1]\n and so on\n options.endangle: the ending angle of the arc, in degrees\n options.resolution: number of points per 360 degree of rotation\n options.maketangent: adds two extra tiny line segments at both ends of the circle\n this ensures that the gradients at the edges are tangent to the circle\n Returns a CSG.Path2D. The path is not closed (even if it is a 360 degree arc).\n close() the resulting path if you want to create a true circle.\n */\n CSG.Path2D.arc = function(options) {\n var center = CSG.parseOptionAs2DVector(options, \"center\", 0);\n var radius = CSG.parseOptionAsFloat(options, \"radius\", 1);\n var startangle = CSG.parseOptionAsFloat(options, \"startangle\", 0);\n var endangle = CSG.parseOptionAsFloat(options, \"endangle\", 360);\n var resolution = CSG.parseOptionAsInt(options, \"resolution\", CSG.defaultResolution2D);\n var maketangent = CSG.parseOptionAsBool(options, \"maketangent\", false);\n // no need to make multiple turns:\n while (endangle - startangle >= 720) {\n endangle -= 360;\n }\n while (endangle - startangle <= -720) {\n endangle += 360;\n }\n var points = [],\n point;\n var absangledif = Math.abs(endangle - startangle);\n if (absangledif < 1e-5) {\n point = CSG.Vector2D.fromAngle(startangle / 180.0 * Math.PI).times(radius);\n points.push(point.plus(center));\n } else {\n var numsteps = Math.floor(resolution * absangledif / 360) + 1;\n var edgestepsize = numsteps * 0.5 / absangledif; // step size for half a degree\n if (edgestepsize > 0.25) edgestepsize = 0.25;\n var numsteps_mod = maketangent ? (numsteps + 2) : numsteps;\n for (var i = 0; i <= numsteps_mod; i++) {\n var step = i;\n if (maketangent) {\n step = (i - 1) * (numsteps - 2 * edgestepsize) / numsteps + edgestepsize;\n if (step < 0) step = 0;\n if (step > numsteps) step = numsteps;\n }\n var angle = startangle + step * (endangle - startangle) / numsteps;\n point = CSG.Vector2D.fromAngle(angle / 180.0 * Math.PI).times(radius);\n points.push(point.plus(center));\n }\n }\n return new CSG.Path2D(points, false);\n };\n\n CSG.Path2D.prototype = {\n concat: function(otherpath) {\n if (this.closed || otherpath.closed) {\n throw new Error(\"Paths must not be closed\");\n }\n var newpoints = this.points.concat(otherpath.points);\n return new CSG.Path2D(newpoints);\n },\n\n appendPoint: function(point) {\n if (this.closed) {\n throw new Error(\"Path must not be closed\");\n }\n point = new CSG.Vector2D(point); // cast to Vector2D\n var newpoints = this.points.concat([point]);\n return new CSG.Path2D(newpoints);\n },\n\n appendPoints: function(points) {\n if (this.closed) {\n throw new Error(\"Path must not be closed\");\n }\n var newpoints = this.points;\n points.forEach(function(point) {\n newpoints.push(new CSG.Vector2D(point)); // cast to Vector2D\n })\n return new CSG.Path2D(newpoints);\n },\n\n close: function() {\n return new CSG.Path2D(this.points, true);\n },\n\n // Extrude the path by following it with a rectangle (upright, perpendicular to the path direction)\n // Returns a CSG solid\n // width: width of the extrusion, in the z=0 plane\n // height: height of the extrusion in the z direction\n // resolution: number of segments per 360 degrees for the curve in a corner\n rectangularExtrude: function(width, height, resolution) {\n var cag = this.expandToCAG(width / 2, resolution);\n var result = cag.extrude({\n offset: [0, 0, height]\n });\n return result;\n },\n\n // Expand the path to a CAG\n // This traces the path with a circle with radius pathradius\n expandToCAG: function(pathradius, resolution) {\n var sides = [];\n var numpoints = this.points.length;\n var startindex = 0;\n if (this.closed && (numpoints > 2)) startindex = -1;\n var prevvertex;\n for (var i = startindex; i < numpoints; i++) {\n var pointindex = i;\n if (pointindex < 0) pointindex = numpoints - 1;\n var point = this.points[pointindex];\n var vertex = new CAG.Vertex(point);\n if (i > startindex) {\n var side = new CAG.Side(prevvertex, vertex);\n sides.push(side);\n }\n prevvertex = vertex;\n }\n var shellcag = CAG.fromSides(sides);\n var expanded = shellcag.expandedShell(pathradius, resolution);\n return expanded;\n },\n\n innerToCAG: function() {\n if (!this.closed) throw new Error(\"The path should be closed!\");\n return CAG.fromPoints(this.points);\n },\n\n transform: function(matrix4x4) {\n var newpoints = this.points.map(function(point) {\n return point.multiply4x4(matrix4x4);\n });\n return new CSG.Path2D(newpoints, this.closed);\n },\n\n appendBezier: function(controlpoints, options) {\n if (arguments.length < 2) {\n options = {};\n }\n if (this.closed) {\n throw new Error(\"Path must not be closed\");\n }\n if (!(controlpoints instanceof Array)) {\n throw new Error(\"appendBezier: should pass an array of control points\")\n }\n if (controlpoints.length < 1) {\n throw new Error(\"appendBezier: need at least 1 control point\")\n }\n if (this.points.length < 1) {\n throw new Error(\"appendBezier: path must already contain a point (the endpoint of the path is used as the starting point for the bezier curve)\");\n }\n var resolution = CSG.parseOptionAsInt(options, \"resolution\", CSG.defaultResolution2D);\n if (resolution < 4) resolution = 4;\n var factorials = [];\n var controlpoints_parsed = [];\n controlpoints_parsed.push(this.points[this.points.length - 1]); // start at the previous end point\n for (var i = 0; i < controlpoints.length; ++i) {\n var p = controlpoints[i];\n if (p === null) {\n // we can pass null as the first control point. In that case a smooth gradient is ensured:\n if (i != 0) {\n throw new Error(\"appendBezier: null can only be passed as the first control point\");\n }\n if (controlpoints.length < 2) {\n throw new Error(\"appendBezier: null can only be passed if there is at least one more control point\");\n }\n var lastBezierControlPoint;\n if ('lastBezierControlPoint' in this) {\n lastBezierControlPoint = this.lastBezierControlPoint;\n } else {\n if (this.points.length < 2) {\n throw new Error(\"appendBezier: null is passed as a control point but this requires a previous bezier curve or at least two points in the existing path\");\n }\n lastBezierControlPoint = this.points[this.points.length - 2];\n }\n // mirror the last bezier control point:\n p = this.points[this.points.length - 1].times(2).minus(lastBezierControlPoint);\n } else {\n p = new CSG.Vector2D(p); // cast to Vector2D\n }\n controlpoints_parsed.push(p);\n }\n var bezier_order = controlpoints_parsed.length - 1;\n var fact = 1;\n for (var i = 0; i <= bezier_order; ++i) {\n if (i > 0) fact *= i;\n factorials.push(fact);\n }\n var binomials = [];\n for (var i = 0; i <= bezier_order; ++i) {\n var binomial = factorials[bezier_order] / (factorials[i] * factorials[bezier_order - i]);\n binomials.push(binomial);\n }\n var getPointForT = function(t) {\n var t_k = 1; // = pow(t,k)\n var one_minus_t_n_minus_k = Math.pow(1 - t, bezier_order); // = pow( 1-t, bezier_order - k)\n var inv_1_minus_t = (t != 1) ? (1 / (1 - t)) : 1;\n var point = new CSG.Vector2D(0, 0);\n for (var k = 0; k <= bezier_order; ++k) {\n if (k == bezier_order) one_minus_t_n_minus_k = 1;\n var bernstein_coefficient = binomials[k] * t_k * one_minus_t_n_minus_k;\n point = point.plus(controlpoints_parsed[k].times(bernstein_coefficient));\n t_k *= t;\n one_minus_t_n_minus_k *= inv_1_minus_t;\n }\n return point;\n };\n var newpoints = [];\n var newpoints_t = [];\n var numsteps = bezier_order + 1;\n for (var i = 0; i < numsteps; ++i) {\n var t = i / (numsteps - 1);\n var point = getPointForT(t);\n newpoints.push(point);\n newpoints_t.push(t);\n }\n // subdivide each segment until the angle at each vertex becomes small enough:\n var subdivide_base = 1;\n var maxangle = Math.PI * 2 / resolution; // segments may have differ no more in angle than this\n var maxsinangle = Math.sin(maxangle);\n while (subdivide_base < newpoints.length - 1) {\n var dir1 = newpoints[subdivide_base].minus(newpoints[subdivide_base - 1]).unit();\n var dir2 = newpoints[subdivide_base + 1].minus(newpoints[subdivide_base]).unit();\n var sinangle = dir1.cross(dir2); // this is the sine of the angle\n if (Math.abs(sinangle) > maxsinangle) {\n // angle is too big, we need to subdivide\n var t0 = newpoints_t[subdivide_base - 1];\n var t1 = newpoints_t[subdivide_base + 1];\n var t0_new = t0 + (t1 - t0) * 1 / 3;\n var t1_new = t0 + (t1 - t0) * 2 / 3;\n var point0_new = getPointForT(t0_new);\n var point1_new = getPointForT(t1_new);\n // remove the point at subdivide_base and replace with 2 new points:\n newpoints.splice(subdivide_base, 1, point0_new, point1_new);\n newpoints_t.splice(subdivide_base, 1, t0_new, t1_new);\n // re - evaluate the angles, starting at the previous junction since it has changed:\n subdivide_base--;\n if (subdivide_base < 1) subdivide_base = 1;\n } else {\n ++subdivide_base;\n }\n }\n // append to the previous points, but skip the first new point because it is identical to the last point:\n newpoints = this.points.concat(newpoints.slice(1));\n var result = new CSG.Path2D(newpoints);\n result.lastBezierControlPoint = controlpoints_parsed[controlpoints_parsed.length - 2];\n return result;\n },\n\n /*\n options:\n .resolution // smoothness of the arc (number of segments per 360 degree of rotation)\n // to create a circular arc:\n .radius\n // to create an elliptical arc:\n .xradius\n .yradius\n .xaxisrotation // the rotation (in degrees) of the x axis of the ellipse with respect to the x axis of our coordinate system\n // this still leaves 4 possible arcs between the two given points. The following two flags select which one we draw:\n .clockwise // = true | false (default is false). Two of the 4 solutions draw clockwise with respect to the center point, the other 2 counterclockwise\n .large // = true | false (default is false). Two of the 4 solutions are an arc longer than 180 degrees, the other two are <= 180 degrees\n This implementation follows the SVG arc specs. For the details see\n http://www.w3.org/TR/SVG/paths.html#PathDataEllipticalArcCommands\n */\n appendArc: function(endpoint, options) {\n var decimals = 100000;\n if (arguments.length < 2) {\n options = {};\n }\n if (this.closed) {\n throw new Error(\"Path must not be closed\");\n }\n if (this.points.length < 1) {\n throw new Error(\"appendArc: path must already contain a point (the endpoint of the path is used as the starting point for the arc)\");\n }\n var resolution = CSG.parseOptionAsInt(options, \"resolution\", CSG.defaultResolution2D);\n if (resolution < 4) resolution = 4;\n var xradius, yradius;\n if (('xradius' in options) || ('yradius' in options)) {\n if ('radius' in options) {\n throw new Error(\"Should either give an xradius and yradius parameter, or a radius parameter\");\n }\n xradius = CSG.parseOptionAsFloat(options, \"xradius\", 0);\n yradius = CSG.parseOptionAsFloat(options, \"yradius\", 0);\n } else {\n xradius = CSG.parseOptionAsFloat(options, \"radius\", 0);\n yradius = xradius;\n }\n var xaxisrotation = CSG.parseOptionAsFloat(options, \"xaxisrotation\", 0);\n var clockwise = CSG.parseOptionAsBool(options, \"clockwise\", false);\n var largearc = CSG.parseOptionAsBool(options, \"large\", false);\n var startpoint = this.points[this.points.length - 1];\n endpoint = new CSG.Vector2D(endpoint);\n // round to precision in order to have determinate calculations\n xradius = Math.round(xradius*decimals)/decimals;\n yradius = Math.round(yradius*decimals)/decimals;\n endpoint = new CSG.Vector2D(Math.round(endpoint.x*decimals)/decimals,Math.round(endpoint.y*decimals)/decimals);\n\n var sweep_flag = !clockwise;\n var newpoints = [];\n if ((xradius == 0) || (yradius == 0)) {\n // http://www.w3.org/TR/SVG/implnote.html#ArcImplementationNotes:\n // If rx = 0 or ry = 0, then treat this as a straight line from (x1, y1) to (x2, y2) and stop\n newpoints.push(endpoint);\n } else {\n xradius = Math.abs(xradius);\n yradius = Math.abs(yradius);\n\n // see http://www.w3.org/TR/SVG/implnote.html#ArcImplementationNotes :\n var phi = xaxisrotation * Math.PI / 180.0;\n var cosphi = Math.cos(phi);\n var sinphi = Math.sin(phi);\n var minushalfdistance = startpoint.minus(endpoint).times(0.5);\n // F.6.5.1:\n // round to precision in order to have determinate calculations\n var x = Math.round((cosphi * minushalfdistance.x + sinphi * minushalfdistance.y)*decimals)/decimals;\n var y = Math.round((-sinphi * minushalfdistance.x + cosphi * minushalfdistance.y)*decimals)/decimals;\n var start_translated = new CSG.Vector2D(x,y);\n // F.6.6.2:\n var biglambda = (start_translated.x * start_translated.x) / (xradius * xradius) + (start_translated.y * start_translated.y) / (yradius * yradius);\n if (biglambda > 1.0) {\n // F.6.6.3:\n var sqrtbiglambda = Math.sqrt(biglambda);\n xradius *= sqrtbiglambda;\n yradius *= sqrtbiglambda;\n // round to precision in order to have determinate calculations\n xradius = Math.round(xradius*decimals)/decimals;\n yradius = Math.round(yradius*decimals)/decimals;\n }\n // F.6.5.2:\n var multiplier1 = Math.sqrt((xradius * xradius * yradius * yradius - xradius * xradius * start_translated.y * start_translated.y - yradius * yradius * start_translated.x * start_translated.x) / (xradius * xradius * start_translated.y * start_translated.y + yradius * yradius * start_translated.x * start_translated.x));\n if (sweep_flag == largearc) multiplier1 = -multiplier1;\n var center_translated = new CSG.Vector2D(xradius * start_translated.y / yradius, -yradius * start_translated.x / xradius).times(multiplier1);\n // F.6.5.3:\n var center = new CSG.Vector2D(cosphi * center_translated.x - sinphi * center_translated.y, sinphi * center_translated.x + cosphi * center_translated.y).plus((startpoint.plus(endpoint)).times(0.5));\n // F.6.5.5:\n var vec1 = new CSG.Vector2D((start_translated.x - center_translated.x) / xradius, (start_translated.y - center_translated.y) / yradius);\n var vec2 = new CSG.Vector2D((-start_translated.x - center_translated.x) / xradius, (-start_translated.y - center_translated.y) / yradius);\n var theta1 = vec1.angleRadians();\n var theta2 = vec2.angleRadians();\n var deltatheta = theta2 - theta1;\n deltatheta = deltatheta % (2 * Math.PI);\n if ((!sweep_flag) && (deltatheta > 0)) {\n deltatheta -= 2 * Math.PI;\n } else if ((sweep_flag) && (deltatheta < 0)) {\n deltatheta += 2 * Math.PI;\n }\n\n // Ok, we have the center point and angle range (from theta1, deltatheta radians) so we can create the ellipse\n var numsteps = Math.ceil(Math.abs(deltatheta) / (2 * Math.PI) * resolution) + 1;\n if (numsteps < 1) numsteps = 1;\n for (var step = 1; step <= numsteps; step++) {\n var theta = theta1 + step / numsteps * deltatheta;\n var costheta = Math.cos(theta);\n var sintheta = Math.sin(theta);\n // F.6.3.1:\n var point = new CSG.Vector2D(cosphi * xradius * costheta - sinphi * yradius * sintheta, sinphi * xradius * costheta + cosphi * yradius * sintheta).plus(center);\n newpoints.push(point);\n }\n }\n newpoints = this.points.concat(newpoints);\n var result = new CSG.Path2D(newpoints);\n return result;\n },\n };\n\n // Add several convenience methods to the classes that support a transform() method:\n CSG.addTransformationMethodsToPrototype = function(prot) {\n prot.mirrored = function(plane) {\n return this.transform(CSG.Matrix4x4.mirroring(plane));\n };\n\n prot.mirroredX = function() {\n var plane = new CSG.Plane(CSG.Vector3D.Create(1, 0, 0), 0);\n return this.mirrored(plane);\n };\n\n prot.mirroredY = function() {\n var plane = new CSG.Plane(CSG.Vector3D.Create(0, 1, 0), 0);\n return this.mirrored(plane);\n };\n\n prot.mirroredZ = function() {\n var plane = new CSG.Plane(CSG.Vector3D.Create(0, 0, 1), 0);\n return this.mirrored(plane);\n };\n\n prot.translate = function(v) {\n return this.transform(CSG.Matrix4x4.translation(v));\n };\n\n prot.scale = function(f) {\n return this.transform(CSG.Matrix4x4.scaling(f));\n };\n\n prot.rotateX = function(deg) {\n return this.transform(CSG.Matrix4x4.rotationX(deg));\n };\n\n prot.rotateY = function(deg) {\n return this.transform(CSG.Matrix4x4.rotationY(deg));\n };\n\n prot.rotateZ = function(deg) {\n return this.transform(CSG.Matrix4x4.rotationZ(deg));\n };\n\n prot.rotate = function(rotationCenter, rotationAxis, degrees) {\n return this.transform(CSG.Matrix4x4.rotation(rotationCenter, rotationAxis, degrees));\n };\n\n prot.rotateEulerAngles = function(alpha, beta, gamma, position) {\n position = position || [0,0,0];\n\n var Rz1 = CSG.Matrix4x4.rotationZ(alpha);\n var Rx = CSG.Matrix4x4.rotationX(beta);\n var Rz2 = CSG.Matrix4x4.rotationZ(gamma);\n var T = CSG.Matrix4x4.translation(new CSG.Vector3D(position));\n\n return this.transform(Rz2.multiply(Rx).multiply(Rz1).multiply(T));\n };\n };\n\n // TODO: consider generalization and adding to addTransformationMethodsToPrototype\n CSG.addCenteringToPrototype = function(prot, axes) {\n prot.center = function(cAxes) {\n cAxes = Array.prototype.map.call(arguments, function(a) {\n return a; //.toLowerCase();\n });\n // no args: center on all axes\n if (!cAxes.length) {\n cAxes = axes.slice();\n }\n var b = this.getBounds();\n return this.translate(axes.map(function(a) {\n return cAxes.indexOf(a) > -1 ?\n -(b[0][a] + b[1][a])/2 : 0;\n }));\n };\n };\n\n //////////////////\n // CAG: solid area geometry: like CSG but 2D\n // Each area consists of a number of sides\n // Each side is a line between 2 points\n var CAG = function() {\n this.sides = [];\n this.isCanonicalized = false;\n };\n\n // create from an untyped object with identical property names:\n CAG.fromObject = function(obj) {\n var sides = obj.sides.map(function(s) {\n return CAG.Side.fromObject(s);\n });\n var cag = CAG.fromSides(sides);\n return cag;\n }\n\n // Construct a CAG from a list of `CAG.Side` instances.\n CAG.fromSides = function(sides) {\n var cag = new CAG();\n cag.sides = sides;\n return cag;\n };\n\n // Construct a CAG from a list of points (a polygon)\n // Rotation direction of the points is not relevant. Points can be a convex or concave polygon.\n // Polygon must not self intersect\n CAG.fromPoints = function(points) {\n var numpoints = points.length;\n if (numpoints < 3) throw new Error(\"CAG shape needs at least 3 points\");\n var sides = [];\n var prevpoint = new CSG.Vector2D(points[numpoints - 1]);\n var prevvertex = new CAG.Vertex(prevpoint);\n points.map(function(p) {\n var point = new CSG.Vector2D(p);\n var vertex = new CAG.Vertex(point);\n var side = new CAG.Side(prevvertex, vertex);\n sides.push(side);\n prevvertex = vertex;\n });\n var result = CAG.fromSides(sides);\n if (result.isSelfIntersecting()) {\n throw new Error(\"Polygon is self intersecting!\");\n }\n var area = result.area();\n if (Math.abs(area) < 1e-5) {\n throw new Error(\"Degenerate polygon!\");\n }\n if (area < 0) {\n result = result.flipped();\n }\n result = result.canonicalized();\n return result;\n };\n\n // Like CAG.fromPoints but does not check if it's a valid polygon.\n // Points should rotate counter clockwise\n CAG.fromPointsNoCheck = function(points) {\n var sides = [];\n var prevpoint = new CSG.Vector2D(points[points.length - 1]);\n var prevvertex = new CAG.Vertex(prevpoint);\n points.map(function(p) {\n var point = new CSG.Vector2D(p);\n var vertex = new CAG.Vertex(point);\n var side = new CAG.Side(prevvertex, vertex);\n sides.push(side);\n prevvertex = vertex;\n });\n return CAG.fromSides(sides);\n };\n\n // Converts a CSG to a CAG. The CSG must consist of polygons with only z coordinates +1 and -1\n // as constructed by CAG._toCSGWall(-1, 1). This is so we can use the 3D union(), intersect() etc\n CAG.fromFakeCSG = function(csg) {\n var sides = csg.polygons.map(function(p) {\n return CAG.Side._fromFakePolygon(p);\n })\n .filter(function(s) {\n return s !== null;\n });\n return CAG.fromSides(sides);\n };\n\n // see if the line between p0start and p0end intersects with the line between p1start and p1end\n // returns true if the lines strictly intersect, the end points are not counted!\n CAG.linesIntersect = function(p0start, p0end, p1start, p1end) {\n if (p0end.equals(p1start) || p1end.equals(p0start)) {\n var d = p1end.minus(p1start).unit().plus(p0end.minus(p0start).unit()).length();\n if (d < 1e-5) {\n return true;\n }\n } else {\n var d0 = p0end.minus(p0start);\n var d1 = p1end.minus(p1start);\n if (Math.abs(d0.cross(d1)) < 1e-9) return false; // lines are parallel\n var alphas = CSG.solve2Linear(-d0.x, d1.x, -d0.y, d1.y, p0start.x - p1start.x, p0start.y - p1start.y);\n if ((alphas[0] > 1e-6) && (alphas[0] < 0.999999) && (alphas[1] > 1e-5) && (alphas[1] < 0.999999)) return true;\n // if( (alphas[0] >= 0) && (alphas[0] <= 1) && (alphas[1] >= 0) && (alphas[1] <= 1) ) return true;\n }\n return false;\n };\n\n /* Construct a circle\n options:\n center: a 2D center point\n radius: a scalar\n resolution: number of sides per 360 degree rotation\n returns a CAG object\n */\n CAG.circle = function(options) {\n options = options || {};\n var center = CSG.parseOptionAs2DVector(options, \"center\", [0, 0]);\n var radius = CSG.parseOptionAsFloat(options, \"radius\", 1);\n var resolution = CSG.parseOptionAsInt(options, \"resolution\", CSG.defaultResolution2D);\n var sides = [];\n var prevvertex;\n for (var i = 0; i <= resolution; i++) {\n var radians = 2 * Math.PI * i / resolution;\n var point = CSG.Vector2D.fromAngleRadians(radians).times(radius).plus(center);\n var vertex = new CAG.Vertex(point);\n if (i > 0) {\n sides.push(new CAG.Side(prevvertex, vertex));\n }\n prevvertex = vertex;\n }\n return CAG.fromSides(sides);\n };\n\n /* Construct an ellispe\n options:\n center: a 2D center point\n radius: a 2D vector with width and height\n resolution: number of sides per 360 degree rotation\n returns a CAG object\n */\n CAG.ellipse = function(options) {\n options = options || {};\n var c = CSG.parseOptionAs2DVector(options, \"center\", [0, 0]);\n var r = CSG.parseOptionAs2DVector(options, \"radius\", [1, 1]);\n r = r.abs(); // negative radii make no sense\n var res = CSG.parseOptionAsInt(options, \"resolution\", CSG.defaultResolution2D);\n\n var e2 = new CSG.Path2D([[c.x,c.y + r.y]]);\n e2 = e2.appendArc([c.x,c.y - r.y], {\n xradius: r.x,\n yradius: r.y,\n xaxisrotation: 0,\n resolution: res,\n clockwise: true,\n large: false,\n });\n e2 = e2.appendArc([c.x,c.y + r.y], {\n xradius: r.x,\n yradius: r.y,\n xaxisrotation: 0,\n resolution: res,\n clockwise: true,\n large: false,\n });\n e2 = e2.close();\n return e2.innerToCAG();\n };\n\n /* Construct a rectangle\n options:\n center: a 2D center point\n radius: a 2D vector with width and height\n returns a CAG object\n */\n CAG.rectangle = function(options) {\n options = options || {};\n var c, r;\n if (('corner1' in options) || ('corner2' in options)) {\n if (('center' in options) || ('radius' in options)) {\n throw new Error(\"rectangle: should either give a radius and center parameter, or a corner1 and corner2 parameter\")\n }\n corner1 = CSG.parseOptionAs2DVector(options, \"corner1\", [0, 0]);\n corner2 = CSG.parseOptionAs2DVector(options, \"corner2\", [1, 1]);\n c = corner1.plus(corner2).times(0.5);\n r = corner2.minus(corner1).times(0.5);\n } else {\n c = CSG.parseOptionAs2DVector(options, \"center\", [0, 0]);\n r = CSG.parseOptionAs2DVector(options, \"radius\", [1, 1]);\n }\n r = r.abs(); // negative radii make no sense\n var rswap = new CSG.Vector2D(r.x, -r.y);\n var points = [\n c.plus(r), c.plus(rswap), c.minus(r), c.minus(rswap)\n ];\n return CAG.fromPoints(points);\n };\n\n // var r = CSG.roundedRectangle({\n // center: [0, 0],\n // radius: [2, 1],\n // roundradius: 0.2,\n // resolution: 8,\n // });\n CAG.roundedRectangle = function(options) {\n options = options || {};\n var center, radius;\n if (('corner1' in options) || ('corner2' in options)) {\n if (('center' in options) || ('radius' in options)) {\n throw new Error(\"roundedRectangle: should either give a radius and center parameter, or a corner1 and corner2 parameter\")\n }\n corner1 = CSG.parseOptionAs2DVector(options, \"corner1\", [0, 0]);\n corner2 = CSG.parseOptionAs2DVector(options, \"corner2\", [1, 1]);\n center = corner1.plus(corner2).times(0.5);\n radius = corner2.minus(corner1).times(0.5);\n } else {\n center = CSG.parseOptionAs2DVector(options, \"center\", [0, 0]);\n radius = CSG.parseOptionAs2DVector(options, \"radius\", [1, 1]);\n }\n radius = radius.abs(); // negative radii make no sense\n var roundradius = CSG.parseOptionAsFloat(options, \"roundradius\", 0.2);\n var resolution = CSG.parseOptionAsInt(options, \"resolution\", CSG.defaultResolution2D);\n var maxroundradius = Math.min(radius.x, radius.y);\n maxroundradius -= 0.1;\n roundradius = Math.min(roundradius, maxroundradius);\n roundradius = Math.max(0, roundradius);\n radius = new CSG.Vector2D(radius.x - roundradius, radius.y - roundradius);\n var rect = CAG.rectangle({\n center: center,\n radius: radius\n });\n if (roundradius > 0) {\n rect = rect.expand(roundradius, resolution);\n }\n return rect;\n };\n\n // Reconstruct a CAG from the output of toCompactBinary()\n CAG.fromCompactBinary = function(bin) {\n if (bin['class'] != \"CAG\") throw new Error(\"Not a CAG\");\n var vertices = [];\n var vertexData = bin.vertexData;\n var numvertices = vertexData.length / 2;\n var arrayindex = 0;\n for (var vertexindex = 0; vertexindex < numvertices; vertexindex++) {\n var x = vertexData[arrayindex++];\n var y = vertexData[arrayindex++];\n var pos = new CSG.Vector2D(x, y);\n var vertex = new CAG.Vertex(pos);\n vertices.push(vertex);\n }\n\n var sides = [];\n var numsides = bin.sideVertexIndices.length / 2;\n arrayindex = 0;\n for (var sideindex = 0; sideindex < numsides; sideindex++) {\n var vertexindex0 = bin.sideVertexIndices[arrayindex++];\n var vertexindex1 = bin.sideVertexIndices[arrayindex++];\n var side = new CAG.Side(vertices[vertexindex0], vertices[vertexindex1]);\n sides.push(side);\n }\n var cag = CAG.fromSides(sides);\n cag.isCanonicalized = true;\n return cag;\n };\n\n function fnSortByIndex(a, b) {\n return a.index - b.index;\n }\n\n CAG.prototype = {\n toString: function() {\n var result = \"CAG (\" + this.sides.length + \" sides):\\n\";\n this.sides.map(function(side) {\n result += \" \" + side.toString() + \"\\n\";\n });\n return result;\n },\n\n _toCSGWall: function(z0, z1) {\n var polygons = this.sides.map(function(side) {\n return side.toPolygon3D(z0, z1);\n });\n return CSG.fromPolygons(polygons);\n },\n\n _toVector3DPairs: function(m) {\n // transform m\n var pairs = this.sides.map(function(side) {\n var p0 = side.vertex0.pos, p1 = side.vertex1.pos;\n return [CSG.Vector3D.Create(p0.x, p0.y, 0),\n CSG.Vector3D.Create(p1.x, p1.y, 0)];\n });\n if (typeof m != 'undefined') {\n pairs = pairs.map(function(pair) {\n return pair.map(function(v) {\n return v.transform(m);\n });\n });\n }\n return pairs;\n },\n\n /*\n * transform a cag into the polygons of a corresponding 3d plane, positioned per options\n * Accepts a connector for plane positioning, or optionally\n * single translation, axisVector, normalVector arguments\n * (toConnector has precedence over single arguments if provided)\n */\n _toPlanePolygons: function(options) {\n var flipped = options.flipped || false;\n // reference connector for transformation\n var origin = [0, 0, 0], defaultAxis = [0, 0, 1], defaultNormal = [0, 1, 0];\n var thisConnector = new CSG.Connector(origin, defaultAxis, defaultNormal);\n // translated connector per options\n var translation = options.translation || origin;\n var axisVector = options.axisVector || defaultAxis;\n var normalVector = options.normalVector || defaultNormal;\n // will override above if options has toConnector\n var toConnector = options.toConnector ||\n new CSG.Connector(translation, axisVector, normalVector);\n // resulting transform\n var m = thisConnector.getTransformationTo(toConnector, false, 0);\n // create plane as a (partial non-closed) CSG in XY plane\n var bounds = this.getBounds();\n bounds[0] = bounds[0].minus(new CSG.Vector2D(1, 1));\n bounds[1] = bounds[1].plus(new CSG.Vector2D(1, 1));\n var csgshell = this._toCSGWall(-1, 1);\n var csgplane = CSG.fromPolygons([new CSG.Polygon([\n new CSG.Vertex(new CSG.Vector3D(bounds[0].x, bounds[0].y, 0)),\n new CSG.Vertex(new CSG.Vector3D(bounds[1].x, bounds[0].y, 0)),\n new CSG.Vertex(new CSG.Vector3D(bounds[1].x, bounds[1].y, 0)),\n new CSG.Vertex(new CSG.Vector3D(bounds[0].x, bounds[1].y, 0))\n ])]);\n if (flipped) {\n csgplane = csgplane.invert();\n }\n // intersectSub -> prevent premature retesselate/canonicalize\n csgplane = csgplane.intersectSub(csgshell);\n // only keep the polygons in the z plane:\n var polys = csgplane.polygons.filter(function(polygon) {\n return Math.abs(polygon.plane.normal.z) > 0.99;\n });\n // finally, position the plane per passed transformations\n return polys.map(function(poly) {\n return poly.transform(m);\n });\n },\n\n\n /*\n * given 2 connectors, this returns all polygons of a \"wall\" between 2\n * copies of this cag, positioned in 3d space as \"bottom\" and\n * \"top\" plane per connectors toConnector1, and toConnector2, respectively \n */\n _toWallPolygons: function(options) {\n // normals are going to be correct as long as toConn2.point - toConn1.point\n // points into cag normal direction (check in caller)\n // arguments: options.toConnector1, options.toConnector2, options.cag\n // walls go from toConnector1 to toConnector2\n // optionally, target cag to point to - cag needs to have same number of sides as this!\n var origin = [0, 0, 0], defaultAxis = [0, 0, 1], defaultNormal = [0, 1, 0];\n var thisConnector = new CSG.Connector(origin, defaultAxis, defaultNormal);\n // arguments:\n var toConnector1 = options.toConnector1;\n // var toConnector2 = new CSG.Connector([0, 0, -30], defaultAxis, defaultNormal);\n var toConnector2 = options.toConnector2;\n if (!(toConnector1 instanceof CSG.Connector && toConnector2 instanceof CSG.Connector)) {\n throw('could not parse CSG.Connector arguments toConnector1 or toConnector2');\n }\n if (options.cag) {\n if (options.cag.sides.length != this.sides.length) {\n throw('target cag needs same sides count as start cag');\n }\n }\n // target cag is same as this unless specified\n var toCag = options.cag || this;\n var m1 = thisConnector.getTransformationTo(toConnector1, false, 0);\n var m2 = thisConnector.getTransformationTo(toConnector2, false, 0);\n var vps1 = this._toVector3DPairs(m1);\n var vps2 = toCag._toVector3DPairs(m2);\n\n var polygons = [];\n vps1.forEach(function(vp1, i) {\n polygons.push(new CSG.Polygon([\n new CSG.Vertex(vps2[i][1]), new CSG.Vertex(vps2[i][0]), new CSG.Vertex(vp1[0])]));\n polygons.push(new CSG.Polygon([\n new CSG.Vertex(vps2[i][1]), new CSG.Vertex(vp1[0]), new CSG.Vertex(vp1[1])]));\n });\n return polygons;\n },\n\n union: function(cag) {\n var cags;\n if (cag instanceof Array) {\n cags = cag;\n } else {\n cags = [cag];\n }\n var r = this._toCSGWall(-1, 1);\n var r = r.union(\n cags.map(function(cag) {\n return cag._toCSGWall(-1, 1).reTesselated();\n }), false, false)\n return CAG.fromFakeCSG(r).canonicalized();\n },\n\n subtract: function(cag) {\n var cags;\n if (cag instanceof Array) {\n cags = cag;\n } else {\n cags = [cag];\n }\n var r = this._toCSGWall(-1, 1);\n cags.map(function(cag) {\n r = r.subtractSub(cag._toCSGWall(-1, 1), false, false);\n });\n r = r.reTesselated();\n r = r.canonicalized();\n r = CAG.fromFakeCSG(r);\n r = r.canonicalized();\n return r;\n },\n\n intersect: function(cag) {\n var cags;\n if (cag instanceof Array) {\n cags = cag;\n } else {\n cags = [cag];\n }\n var r = this._toCSGWall(-1, 1);\n cags.map(function(cag) {\n r = r.intersectSub(cag._toCSGWall(-1, 1), false, false);\n });\n r = r.reTesselated();\n r = r.canonicalized();\n r = CAG.fromFakeCSG(r);\n r = r.canonicalized();\n return r;\n },\n\n transform: function(matrix4x4) {\n var ismirror = matrix4x4.isMirroring();\n var newsides = this.sides.map(function(side) {\n return side.transform(matrix4x4);\n });\n var result = CAG.fromSides(newsides);\n if (ismirror) {\n result = result.flipped();\n }\n return result;\n },\n\n // see http://local.wasp.uwa.edu.au/~pbourke/geometry/polyarea/ :\n // Area of the polygon. For a counter clockwise rotating polygon the area is positive, otherwise negative\n // Note(bebbi): this looks wrong. See polygon getArea()\n area: function() {\n var polygonArea = 0;\n this.sides.map(function(side) {\n polygonArea += side.vertex0.pos.cross(side.vertex1.pos);\n });\n polygonArea *= 0.5;\n return polygonArea;\n },\n\n flipped: function() {\n var newsides = this.sides.map(function(side) {\n return side.flipped();\n });\n newsides.reverse();\n return CAG.fromSides(newsides);\n },\n\n getBounds: function() {\n var minpoint;\n if (this.sides.length === 0) {\n minpoint = new CSG.Vector2D(0, 0);\n } else {\n minpoint = this.sides[0].vertex0.pos;\n }\n var maxpoint = minpoint;\n this.sides.map(function(side) {\n minpoint = minpoint.min(side.vertex0.pos);\n minpoint = minpoint.min(side.vertex1.pos);\n maxpoint = maxpoint.max(side.vertex0.pos);\n maxpoint = maxpoint.max(side.vertex1.pos);\n });\n return [minpoint, maxpoint];\n },\n\n isSelfIntersecting: function(debug) {\n var numsides = this.sides.length;\n for (var i = 0; i < numsides; i++) {\n var side0 = this.sides[i];\n for (var ii = i + 1; ii < numsides; ii++) {\n var side1 = this.sides[ii];\n if (CAG.linesIntersect(side0.vertex0.pos, side0.vertex1.pos, side1.vertex0.pos, side1.vertex1.pos)) {\n if (debug) { OpenJsCad.log(side0); OpenJsCad.log(side1);}\n return true;\n }\n }\n }\n return false;\n },\n\n expandedShell: function(radius, resolution) {\n resolution = resolution || 8;\n if (resolution < 4) resolution = 4;\n var cags = [];\n var pointmap = {};\n var cag = this.canonicalized();\n cag.sides.map(function(side) {\n var d = side.vertex1.pos.minus(side.vertex0.pos);\n var dl = d.length();\n if (dl > 1e-5) {\n d = d.times(1.0 / dl);\n var normal = d.normal().times(radius);\n var shellpoints = [\n side.vertex1.pos.plus(normal),\n side.vertex1.pos.minus(normal),\n side.vertex0.pos.minus(normal),\n side.vertex0.pos.plus(normal)\n ];\n // var newcag = CAG.fromPointsNoCheck(shellpoints);\n var newcag = CAG.fromPoints(shellpoints);\n cags.push(newcag);\n for (var step = 0; step < 2; step++) {\n var p1 = (step === 0) ? side.vertex0.pos : side.vertex1.pos;\n var p2 = (step === 0) ? side.vertex1.pos : side.vertex0.pos;\n var tag = p1.x + \" \" + p1.y;\n if (!(tag in pointmap)) {\n pointmap[tag] = [];\n }\n pointmap[tag].push({\n \"p1\": p1,\n \"p2\": p2\n });\n }\n }\n });\n for (var tag in pointmap) {\n var m = pointmap[tag];\n var angle1, angle2;\n var pcenter = m[0].p1;\n if (m.length == 2) {\n var end1 = m[0].p2;\n var end2 = m[1].p2;\n angle1 = end1.minus(pcenter).angleDegrees();\n angle2 = end2.minus(pcenter).angleDegrees();\n if (angle2 < angle1) angle2 += 360;\n if (angle2 >= (angle1 + 360)) angle2 -= 360;\n if (angle2 < angle1 + 180) {\n var t = angle2;\n angle2 = angle1 + 360;\n angle1 = t;\n }\n angle1 += 90;\n angle2 -= 90;\n } else {\n angle1 = 0;\n angle2 = 360;\n }\n var fullcircle = (angle2 > angle1 + 359.999);\n if (fullcircle) {\n angle1 = 0;\n angle2 = 360;\n }\n if (angle2 > (angle1 + 1e-5)) {\n var points = [];\n if (!fullcircle) {\n points.push(pcenter);\n }\n var numsteps = Math.round(resolution * (angle2 - angle1) / 360);\n if (numsteps < 1) numsteps = 1;\n for (var step = 0; step <= numsteps; step++) {\n var angle = angle1 + step / numsteps * (angle2 - angle1);\n if (step == numsteps) angle = angle2; // prevent rounding errors\n var point = pcenter.plus(CSG.Vector2D.fromAngleDegrees(angle).times(radius));\n if ((!fullcircle) || (step > 0)) {\n points.push(point);\n }\n }\n var newcag = CAG.fromPointsNoCheck(points);\n cags.push(newcag);\n }\n }\n var result = new CAG();\n result = result.union(cags);\n return result;\n },\n\n expand: function(radius, resolution) {\n var result = this.union(this.expandedShell(radius, resolution));\n return result;\n },\n\n contract: function(radius, resolution) {\n var result = this.subtract(this.expandedShell(radius, resolution));\n return result;\n },\n\n // extrude the CAG in a certain plane. \n // Giving just a plane is not enough, multiple different extrusions in the same plane would be possible\n // by rotating around the plane's origin. An additional right-hand vector should be specified as well,\n // and this is exactly a CSG.OrthoNormalBasis.\n // orthonormalbasis: characterizes the plane in which to extrude\n // depth: thickness of the extruded shape. Extrusion is done symmetrically above and below the plane.\n extrudeInOrthonormalBasis: function(orthonormalbasis, depth) {\n // first extrude in the regular Z plane:\n if (!(orthonormalbasis instanceof CSG.OrthoNormalBasis)) {\n throw new Error(\"extrudeInPlane: the first parameter should be a CSG.OrthoNormalBasis\");\n }\n var extruded = this.extrude({\n offset: [0, 0, depth]\n });\n var matrix = orthonormalbasis.getInverseProjectionMatrix();\n extruded = extruded.transform(matrix);\n return extruded;\n },\n\n // Extrude in a standard cartesian plane, specified by two axis identifiers. Each identifier can be\n // one of [\"X\",\"Y\",\"Z\",\"-X\",\"-Y\",\"-Z\"]\n // The 2d x axis will map to the first given 3D axis, the 2d y axis will map to the second.\n // See CSG.OrthoNormalBasis.GetCartesian for details.\n extrudeInPlane: function(axis1, axis2, depth) {\n return this.extrudeInOrthonormalBasis(CSG.OrthoNormalBasis.GetCartesian(axis1, axis2), depth);\n },\n\n // extruded=cag.extrude({offset: [0,0,10], twistangle: 360, twiststeps: 100});\n // linear extrusion of 2D shape, with optional twist\n // The 2d shape is placed in in z=0 plane and extruded into direction (a CSG.Vector3D)\n // The final face is rotated degrees. Rotation is done around the origin of the 2d shape (i.e. x=0, y=0)\n // twiststeps determines the resolution of the twist (should be >= 1)\n // returns a CSG object\n extrude: function(options) {\n if (this.sides.length == 0) {\n // empty!\n return new CSG();\n }\n var offsetVector = CSG.parseOptionAs3DVector(options, \"offset\", [0, 0, 1]);\n var twistangle = CSG.parseOptionAsFloat(options, \"twistangle\", 0);\n var twiststeps = CSG.parseOptionAsInt(options, \"twiststeps\", CSG.defaultResolution3D);\n if (offsetVector.z == 0) {\n throw('offset cannot be orthogonal to Z axis');\n }\n if (twistangle == 0 || twiststeps < 1) {\n twiststeps = 1;\n }\n var normalVector = CSG.Vector3D.Create(0, 1, 0);\n\n var polygons = [];\n // bottom and top\n polygons = polygons.concat(this._toPlanePolygons({translation: [0, 0, 0],\n normalVector: normalVector, flipped: !(offsetVector.z < 0)}));\n polygons = polygons.concat(this._toPlanePolygons({translation: offsetVector,\n normalVector: normalVector.rotateZ(twistangle), flipped: offsetVector.z < 0}));\n // walls\n for (var i = 0; i < twiststeps; i++) {\n var c1 = new CSG.Connector(offsetVector.times(i / twiststeps), [0, 0, offsetVector.z],\n normalVector.rotateZ(i * twistangle/twiststeps));\n var c2 = new CSG.Connector(offsetVector.times((i + 1) / twiststeps), [0, 0, offsetVector.z],\n normalVector.rotateZ((i + 1) * twistangle/twiststeps));\n polygons = polygons.concat(this._toWallPolygons({toConnector1: c1, toConnector2: c2}));\n }\n\n return CSG.fromPolygons(polygons);\n },\n\n /*\n * extrude CAG to 3d object by rotating the origin around the y axis\n * (and turning everything into XY plane)\n * arguments: options dict with angle and resolution, both optional\n */\n rotateExtrude: function(options) {\n var alpha = CSG.parseOptionAsFloat(options, \"angle\", 360);\n var resolution = CSG.parseOptionAsInt(options, \"resolution\", CSG.defaultResolution3D);\n\n var EPS = 1e-5;\n\n alpha = alpha > 360 ? alpha % 360 : alpha;\n var origin = [0, 0, 0];\n var axisV = CSG.Vector3D.Create(0, 1, 0);\n var normalV = [0, 0, 1];\n var polygons = [];\n // planes only needed if alpha > 0\n var connS = new CSG.Connector(origin, axisV, normalV);\n if (alpha > 0 && alpha < 360) {\n // we need to rotate negative to satisfy wall function condition of\n // building in the direction of axis vector\n var connE = new CSG.Connector(origin, axisV.rotateZ(-alpha), normalV);\n polygons = polygons.concat(\n this._toPlanePolygons({toConnector: connS, flipped: true}));\n polygons = polygons.concat(\n this._toPlanePolygons({toConnector: connE}));\n }\n var connT1 = connS, connT2;\n var step = alpha/resolution;\n for (var a = step; a <= alpha + EPS; a += step) {\n connT2 = new CSG.Connector(origin, axisV.rotateZ(-a), normalV);\n polygons = polygons.concat(this._toWallPolygons(\n {toConnector1: connT1, toConnector2: connT2}));\n connT1 = connT2;\n }\n return CSG.fromPolygons(polygons).reTesselated();\n },\n\n // check if we are a valid CAG (for debugging)\n // NOTE(bebbi) uneven side count doesn't work because rounding with EPS isn't taken into account\n check: function() {\n var EPS = 1e-5;\n var errors = [];\n if (this.isSelfIntersecting(true)) {\n errors.push(\"Self intersects\");\n }\n var pointcount = {};\n this.sides.map(function(side) {\n function mappoint(p) {\n var tag = p.x + \" \" + p.y;\n if (!(tag in pointcount)) pointcount[tag] = 0;\n pointcount[tag] ++;\n }\n mappoint(side.vertex0.pos);\n mappoint(side.vertex1.pos);\n });\n for (var tag in pointcount) {\n var count = pointcount[tag];\n if (count & 1) {\n errors.push(\"Uneven number of sides (\" + count + \") for point \" + tag);\n }\n }\n var area = this.area();\n if (area < EPS*EPS) {\n errors.push(\"Area is \" + area);\n }\n if (errors.length > 0) {\n var ertxt = \"\";\n errors.map(function(err) {\n ertxt += err + \"\\n\";\n });\n throw new Error(ertxt);\n }\n },\n\n canonicalized: function() {\n if (this.isCanonicalized) {\n return this;\n } else {\n var factory = new CAG.fuzzyCAGFactory();\n var result = factory.getCAG(this);\n result.isCanonicalized = true;\n return result;\n }\n },\n\n toCompactBinary: function() {\n var cag = this.canonicalized();\n var numsides = cag.sides.length;\n var vertexmap = {};\n var vertices = [];\n var numvertices = 0;\n var sideVertexIndices = new Uint32Array(2 * numsides);\n var sidevertexindicesindex = 0;\n cag.sides.map(function(side) {\n [side.vertex0, side.vertex1].map(function(v) {\n var vertextag = v.getTag();\n var vertexindex;\n if (!(vertextag in vertexmap)) {\n vertexindex = numvertices++;\n vertexmap[vertextag] = vertexindex;\n vertices.push(v);\n } else {\n vertexindex = vertexmap[vertextag];\n }\n sideVertexIndices[sidevertexindicesindex++] = vertexindex;\n });\n });\n var vertexData = new Float64Array(numvertices * 2);\n var verticesArrayIndex = 0;\n vertices.map(function(v) {\n var pos = v.pos;\n vertexData[verticesArrayIndex++] = pos._x;\n vertexData[verticesArrayIndex++] = pos._y;\n });\n var result = {\n 'class': \"CAG\",\n sideVertexIndices: sideVertexIndices,\n vertexData: vertexData\n };\n return result;\n },\n\n getOutlinePaths: function() {\n var cag = this.canonicalized();\n var sideTagToSideMap = {};\n var startVertexTagToSideTagMap = {};\n cag.sides.map(function(side) {\n var sidetag = side.getTag();\n sideTagToSideMap[sidetag] = side;\n var startvertextag = side.vertex0.getTag();\n if (!(startvertextag in startVertexTagToSideTagMap)) {\n startVertexTagToSideTagMap[startvertextag] = [];\n }\n startVertexTagToSideTagMap[startvertextag].push(sidetag);\n });\n var paths = [];\n while (true) {\n var startsidetag = null;\n for (var aVertexTag in startVertexTagToSideTagMap) {\n var sidesForThisVertex = startVertexTagToSideTagMap[aVertexTag];\n startsidetag = sidesForThisVertex[0];\n sidesForThisVertex.splice(0, 1);\n if (sidesForThisVertex.length === 0) {\n delete startVertexTagToSideTagMap[aVertexTag];\n }\n break;\n }\n if (startsidetag === null) break; // we've had all sides\n var connectedVertexPoints = [];\n var sidetag = startsidetag;\n var thisside = sideTagToSideMap[sidetag];\n var startvertextag = thisside.vertex0.getTag();\n while (true) {\n connectedVertexPoints.push(thisside.vertex0.pos);\n var nextvertextag = thisside.vertex1.getTag();\n if (nextvertextag == startvertextag) break; // we've closed the polygon\n if (!(nextvertextag in startVertexTagToSideTagMap)) {\n throw new Error(\"Area is not closed!\");\n }\n var nextpossiblesidetags = startVertexTagToSideTagMap[nextvertextag];\n var nextsideindex = -1;\n if (nextpossiblesidetags.length == 1) {\n nextsideindex = 0;\n } else {\n // more than one side starting at the same vertex. This means we have\n // two shapes touching at the same corner\n var bestangle = null;\n var thisangle = thisside.direction().angleDegrees();\n for (var sideindex = 0; sideindex < nextpossiblesidetags.length; sideindex++) {\n var nextpossiblesidetag = nextpossiblesidetags[sideindex];\n var possibleside = sideTagToSideMap[nextpossiblesidetag];\n var angle = possibleside.direction().angleDegrees();\n var angledif = angle - thisangle;\n if (angledif < -180) angledif += 360;\n if (angledif >= 180) angledif -= 360;\n if ((nextsideindex < 0) || (angledif > bestangle)) {\n nextsideindex = sideindex;\n bestangle = angledif;\n }\n }\n }\n var nextsidetag = nextpossiblesidetags[nextsideindex];\n nextpossiblesidetags.splice(nextsideindex, 1);\n if (nextpossiblesidetags.length === 0) {\n delete startVertexTagToSideTagMap[nextvertextag];\n }\n thisside = sideTagToSideMap[nextsidetag];\n } // inner loop\n var path = new CSG.Path2D(connectedVertexPoints, true);\n paths.push(path);\n } // outer loop\n return paths;\n },\n\n /*\n cag = cag.overCutInsideCorners(cutterradius);\n\n Using a CNC router it's impossible to cut out a true sharp inside corner. The inside corner\n will be rounded due to the radius of the cutter. This function compensates for this by creating\n an extra cutout at each inner corner so that the actual cut out shape will be at least as large\n as needed.\n */\n overCutInsideCorners: function(cutterradius) {\n var cag = this.canonicalized();\n // for each vertex determine the 'incoming' side and 'outgoing' side:\n var pointmap = {}; // tag => {pos: coord, from: [], to: []}\n cag.sides.map(function(side) {\n if (!(side.vertex0.getTag() in pointmap)) {\n pointmap[side.vertex0.getTag()] = {\n pos: side.vertex0.pos,\n from: [],\n to: []\n };\n }\n pointmap[side.vertex0.getTag()].to.push(side.vertex1.pos);\n if (!(side.vertex1.getTag() in pointmap)) {\n pointmap[side.vertex1.getTag()] = {\n pos: side.vertex1.pos,\n from: [],\n to: []\n };\n }\n pointmap[side.vertex1.getTag()].from.push(side.vertex0.pos);\n });\n // overcut all sharp corners:\n var cutouts = [];\n for (var pointtag in pointmap) {\n var pointobj = pointmap[pointtag];\n if ((pointobj.from.length == 1) && (pointobj.to.length == 1)) {\n // ok, 1 incoming side and 1 outgoing side:\n var fromcoord = pointobj.from[0];\n var pointcoord = pointobj.pos;\n var tocoord = pointobj.to[0];\n var v1 = pointcoord.minus(fromcoord).unit();\n var v2 = tocoord.minus(pointcoord).unit();\n var crossproduct = v1.cross(v2);\n var isInnerCorner = (crossproduct < 0.001);\n if (isInnerCorner) {\n // yes it's a sharp corner:\n var alpha = v2.angleRadians() - v1.angleRadians() + Math.PI;\n if (alpha < 0) {\n alpha += 2 * Math.PI;\n } else if (alpha >= 2 * Math.PI) {\n alpha -= 2 * Math.PI;\n }\n var midvector = v2.minus(v1).unit();\n var circlesegmentangle = 30 / 180 * Math.PI; // resolution of the circle: segments of 30 degrees\n // we need to increase the radius slightly so that our imperfect circle will contain a perfect circle of cutterradius\n var radiuscorrected = cutterradius / Math.cos(circlesegmentangle / 2);\n var circlecenter = pointcoord.plus(midvector.times(radiuscorrected));\n // we don't need to create a full circle; a pie is enough. Find the angles for the pie:\n var startangle = alpha + midvector.angleRadians();\n var deltaangle = 2 * (Math.PI - alpha);\n var numsteps = 2 * Math.ceil(deltaangle / circlesegmentangle / 2); // should be even\n // build the pie:\n var points = [circlecenter];\n for (var i = 0; i <= numsteps; i++) {\n var angle = startangle + i / numsteps * deltaangle;\n var p = CSG.Vector2D.fromAngleRadians(angle).times(radiuscorrected).plus(circlecenter);\n points.push(p);\n }\n cutouts.push(CAG.fromPoints(points));\n }\n }\n }\n var result = cag.subtract(cutouts);\n return result;\n }\n };\n\n CAG.Vertex = function(pos) {\n this.pos = pos;\n };\n\n CAG.Vertex.fromObject = function(obj) {\n return new CAG.Vertex(new CSG.Vector2D(obj.pos._x,obj.pos._y));\n };\n\n CAG.Vertex.prototype = {\n toString: function() {\n return \"(\" + this.pos.x.toFixed(2) + \",\" + this.pos.y.toFixed(2) + \")\";\n },\n getTag: function() {\n var result = this.tag;\n if (!result) {\n result = CSG.getTag();\n this.tag = result;\n }\n return result;\n }\n };\n\n CAG.Side = function(vertex0, vertex1) {\n if (!(vertex0 instanceof CAG.Vertex)) throw new Error(\"Assertion failed\");\n if (!(vertex1 instanceof CAG.Vertex)) throw new Error(\"Assertion failed\");\n this.vertex0 = vertex0;\n this.vertex1 = vertex1;\n };\n\n CAG.Side.fromObject = function(obj) {\n var vertex0 = CAG.Vertex.fromObject(obj.vertex0);\n var vertex1 = CAG.Vertex.fromObject(obj.vertex1);\n return new CAG.Side(vertex0,vertex1);\n };\n\n CAG.Side._fromFakePolygon = function(polygon) {\n polygon.vertices.forEach(function(v) {\n if (!((v.pos.z >= -1.001) && (v.pos.z < -0.999)) && !((v.pos.z >= 0.999) && (v.pos.z < 1.001))) {\n throw(\"Assertion failed: _fromFakePolygon expects abs z values of 1\");\n }\n })\n // this can happen based on union, seems to be residuals -\n // return null and handle in caller\n if (polygon.vertices.length < 4) {\n return null;\n }\n var reverse = false;\n var vert1Indices = [];\n var pts2d = polygon.vertices.filter(function(v, i) {\n if (v.pos.z > 0) {\n vert1Indices.push(i);\n return true;\n }\n })\n .map(function(v) {\n return new CSG.Vector2D(v.pos.x, v.pos.y);\n });\n if (pts2d.length != 2) {\n throw('Assertion failed: _fromFakePolygon: not enough points found')\n }\n var d = vert1Indices[1] - vert1Indices[0];\n if (d == 1 || d == 3) {\n if (d == 1) {\n pts2d.reverse();\n }\n } else {\n throw('Assertion failed: _fromFakePolygon: unknown index ordering');\n }\n var result = new CAG.Side(new CAG.Vertex(pts2d[0]), new CAG.Vertex(pts2d[1]));\n return result;\n };\n\n CAG.Side.prototype = {\n toString: function() {\n return this.vertex0 + \" -> \" + this.vertex1;\n },\n\n toPolygon3D: function(z0, z1) {\n var vertices = [\n new CSG.Vertex(this.vertex0.pos.toVector3D(z0)),\n new CSG.Vertex(this.vertex1.pos.toVector3D(z0)),\n new CSG.Vertex(this.vertex1.pos.toVector3D(z1)),\n new CSG.Vertex(this.vertex0.pos.toVector3D(z1))\n ];\n return new CSG.Polygon(vertices);\n },\n\n transform: function(matrix4x4) {\n var newp1 = this.vertex0.pos.transform(matrix4x4);\n var newp2 = this.vertex1.pos.transform(matrix4x4);\n return new CAG.Side(new CAG.Vertex(newp1), new CAG.Vertex(newp2));\n },\n\n flipped: function() {\n return new CAG.Side(this.vertex1, this.vertex0);\n },\n\n direction: function() {\n return this.vertex1.pos.minus(this.vertex0.pos);\n },\n\n getTag: function() {\n var result = this.tag;\n if (!result) {\n result = CSG.getTag();\n this.tag = result;\n }\n return result;\n },\n\n lengthSquared: function() {\n var x = this.vertex1.pos.x - this.vertex0.pos.x,\n y = this.vertex1.pos.y - this.vertex0.pos.y;\n return x * x + y * y;\n },\n\n length: function() {\n return Math.sqrt(this.lengthSquared());\n }\n };\n\n //////////////////////////////////////\n CAG.fuzzyCAGFactory = function() {\n this.vertexfactory = new CSG.fuzzyFactory(2, 1e-5);\n };\n\n CAG.fuzzyCAGFactory.prototype = {\n getVertex: function(sourcevertex) {\n var elements = [sourcevertex.pos._x, sourcevertex.pos._y];\n var result = this.vertexfactory.lookupOrCreate(elements, function(els) {\n return sourcevertex;\n });\n return result;\n },\n\n getSide: function(sourceside) {\n var vertex0 = this.getVertex(sourceside.vertex0);\n var vertex1 = this.getVertex(sourceside.vertex1);\n return new CAG.Side(vertex0, vertex1);\n },\n\n getCAG: function(sourcecag) {\n var _this = this;\n var newsides = sourcecag.sides.map(function(side) {\n return _this.getSide(side);\n })\n // remove bad sides (mostly a user input issue)\n .filter(function(side) {\n return side.length() > 1e-5;\n });\n return CAG.fromSides(newsides);\n }\n };\n\n //////////////////////////////////////\n CSG.addTransformationMethodsToPrototype(CSG.prototype);\n CSG.addTransformationMethodsToPrototype(CSG.Vector2D.prototype);\n CSG.addTransformationMethodsToPrototype(CSG.Vector3D.prototype);\n CSG.addTransformationMethodsToPrototype(CSG.Vertex.prototype);\n CSG.addTransformationMethodsToPrototype(CSG.Plane.prototype);\n CSG.addTransformationMethodsToPrototype(CSG.Polygon.prototype);\n CSG.addTransformationMethodsToPrototype(CSG.Line3D.prototype);\n CSG.addTransformationMethodsToPrototype(CSG.Connector.prototype);\n CSG.addTransformationMethodsToPrototype(CSG.Path2D.prototype);\n CSG.addTransformationMethodsToPrototype(CSG.Line2D.prototype);\n CSG.addTransformationMethodsToPrototype(CAG.prototype);\n CSG.addTransformationMethodsToPrototype(CAG.Side.prototype);\n CSG.addTransformationMethodsToPrototype(CSG.OrthoNormalBasis.prototype);\n\n CSG.addCenteringToPrototype(CSG.prototype, ['x', 'y', 'z']);\n CSG.addCenteringToPrototype(CAG.prototype, ['x', 'y']);\n\n /*\n 2D polygons are now supported through the CAG class.\n With many improvements (see documentation):\n - shapes do no longer have to be convex\n - union/intersect/subtract is supported\n - expand / contract are supported\n\n But we'll keep CSG.Polygon2D as a stub for backwards compatibility\n */\n \n CSG.Polygon2D = function(points) {\n var cag = CAG.fromPoints(points);\n this.sides = cag.sides;\n };\n CSG.Polygon2D.prototype = CAG.prototype;\n\n\n //console.log('module', module)\n //module.CSG = CSG;\n //module.CAG = CAG;\n//})(this); //module to export to\n\nmodule.exports = {CSG,CAG}//({})(module)\n","/*\n * Blob.js\n * See https://developer.mozilla.org/en-US/docs/Web/API/Blob\n *\n * Node and Browserify Compatible\n *\n * Copyright (c) 2015 by Z3 Dev (@zdev/www.z3dev.jp)\n * License: MIT License\n *\n * This implementation uses the Buffer class for all storage.\n * See https://nodejs.org/api/buffer.html\n *\n * URL.createObjectURL(blob)\n *\n * History:\n * 2015/07/02: 0.0.1: contributed to OpenJSCAD.org CLI openjscad\n */\n\nexport default function makeBlob(contents, options){\n const blob = typeof window !== 'undefined' ? window.Blob : Blob\n return blob\n}\n\nfunction Blob (contents, options) {\n // make the optional options non-optional\n options = options || {}\n // number of bytes\n this.size = 0 // contents, not allocation\n // media type\n this.type = ''\n // readability state (CLOSED: true, OPENED: false)\n this.isClosed = false\n // encoding of given strings\n this.encoding = 'utf8'\n // storage\n this.buffer = null\n this.length = 32e+6 // allocation, not contents\n\n if (!contents) return\n if (!Array.isArray(contents)) return\n\n // process options if any\n if (options.type) {\n // TBD if type contains any chars outside range U+0020 to U+007E, then set type to the empty string\n // Convert every character in type to lowercase\n this.type = options.type.toLowerCase()\n }\n if (options.endings) {\n // convert the EOL on strings\n }\n if (options.encoding) {\n this.encoding = options.encoding.toLowerCase()\n }\n if (options.length) {\n this.length = options.length\n }\n\n let wbytes\n let object\n // convert the contents (String, ArrayBufferView, ArrayBuffer, Blob)\n this.buffer = new Buffer(this.length)\n var index = 0\n for (index = 0; index < contents.length; index++) {\n switch (typeof (contents[index])) {\n case 'string':\n wbytes = this.buffer.write(contents[index], this.size, this.encoding)\n this.size = this.size + wbytes\n break\n case 'object':\n object = contents[index] // this should be a reference to an object\n if (Buffer.isBuffer(object)) {\n }\n if (object instanceof ArrayBuffer) {\n var view = new DataView(object)\n var bindex = 0\n for (bindex = 0; bindex < object.byteLength; bindex++) {\n var xbyte = view.getUint8(bindex)\n wbytes = this.buffer.writeUInt8(xbyte, this.size, false)\n this.size++\n }\n }\n break\n default:\n break\n }\n }\n return this\n}\n\nBlob.prototype = {\n asBuffer: function () {\n return this.buffer.slice(0, this.size)\n },\n\n slice: function (start, end, type) {\n start = start || 0\n end = end || this.size\n type = type || ''\n return new Blob()\n },\n\n close: function () {\n // if state of context objext is already CLOSED then return\n if (this.isClosed) return\n // set the readbility state of the context object to CLOSED and remove storage\n this.isClosed = true\n },\n\n toString: function () {\n return 'blob blob blob'\n }\n}\n\nexport function revokeBlobUrl (url) {\n if (window.URL) window.URL.revokeObjectURL(url)\n else if (window.webkitURL) window.webkitURL.revokeObjectURL(url)\n else throw new Error(\"Your browser doesn't support window.URL\")\n}\n","import makeBlob from '../../utils/Blob'\nconst Blob = makeBlob()\n\nexport default function toStlString (CSG) {\n var result = 'solid csg.js\\n'\n CSG.polygons.map(function (p) {\n result += CSGPolygontoStlString(p)\n })\n result += 'endsolid csg.js\\n'\n return new Blob([result], {\n type: 'application/sla'\n })\n}\n\nfunction CSGVector3DtoStlString (v) {\n return v._x + ' ' + v._y + ' ' + v._z\n}\n\nfunction CSGVertextoStlString (vertex) {\n return 'vertex ' + CSGVector3DtoStlString(vertex.pos) + '\\n'\n}\n\nfunction CSGPolygontoStlString (polygon) {\n var result = ''\n if (polygon.vertices.length >= 3) // should be!\n {\n // STL requires triangular polygons. If our polygon has more vertices, create\n // multiple triangles:\n var firstVertexStl = CSGVertextoStlString(polygon.vertices[0])\n for (var i = 0; i < polygon.vertices.length - 2; i++) {\n result += 'facet normal ' + CSGVector3DtoStlString(polygon.plane.normal) + '\\nouter loop\\n'\n result += firstVertexStl\n result += CSGVertextoStlString(polygon.vertices[i + 1])\n result += CSGVertextoStlString(polygon.vertices[i + 2])\n result += 'endloop\\nendfacet\\n'\n }\n }\n return result\n}\n","import makeBlob from '../../utils/Blob'\nconst Blob = makeBlob()\n\n// see http://en.wikipedia.org/wiki/STL_%28file_format%29#Binary_STL\nexport default function toStlBinary (CSG) {\n // first check if the host is little-endian:\n var buffer = new ArrayBuffer(4)\n var int32buffer = new Int32Array(buffer, 0, 1)\n var int8buffer = new Int8Array(buffer, 0, 4)\n int32buffer[0] = 0x11223344\n if (int8buffer[0] != 0x44) {\n throw new Error('Binary STL output is currently only supported on little-endian (Intel) processors')\n }\n\n var numtriangles = 0\n CSG.polygons.map(function (p) {\n var numvertices = p.vertices.length\n var thisnumtriangles = (numvertices >= 3) ? numvertices - 2 : 0\n numtriangles += thisnumtriangles\n })\n var headerarray = new Uint8Array(80)\n for (var i = 0; i < 80; i++) {\n headerarray[i] = 65\n }\n var ar1 = new Uint32Array(1)\n ar1[0] = numtriangles\n // write the triangles to allTrianglesBuffer:\n var allTrianglesBuffer = new ArrayBuffer(50 * numtriangles)\n var allTrianglesBufferAsInt8 = new Int8Array(allTrianglesBuffer)\n // a tricky problem is that a Float32Array must be aligned at 4-byte boundaries (at least in certain browsers)\n // while each triangle takes 50 bytes. Therefore we write each triangle to a temporary buffer, and copy that\n // into allTrianglesBuffer:\n var triangleBuffer = new ArrayBuffer(50)\n var triangleBufferAsInt8 = new Int8Array(triangleBuffer)\n // each triangle consists of 12 floats:\n var triangleFloat32array = new Float32Array(triangleBuffer, 0, 12)\n // and one uint16:\n var triangleUint16array = new Uint16Array(triangleBuffer, 48, 1)\n var byteoffset = 0\n CSG.polygons.map(function (p) {\n var numvertices = p.vertices.length\n for (var i = 0; i < numvertices - 2; i++) {\n var normal = p.plane.normal\n triangleFloat32array[0] = normal._x\n triangleFloat32array[1] = normal._y\n triangleFloat32array[2] = normal._z\n var arindex = 3\n for (var v = 0; v < 3; v++) {\n var vv = v + ((v > 0) ? i : 0)\n var vertexpos = p.vertices[vv].pos\n triangleFloat32array[arindex++] = vertexpos._x\n triangleFloat32array[arindex++] = vertexpos._y\n triangleFloat32array[arindex++] = vertexpos._z\n }\n triangleUint16array[0] = 0\n // copy the triangle into allTrianglesBuffer:\n allTrianglesBufferAsInt8.set(triangleBufferAsInt8, byteoffset)\n byteoffset += 50\n }\n })\n return new Blob([headerarray.buffer, ar1.buffer, allTrianglesBuffer], {\n type: 'application/sla'\n })\n}\n","import makeBlob from '../../utils/Blob'\nconst Blob = makeBlob()\n\nexport default function toAMFString (CSG, m) {\n var result = '\\n\\n'\n for (var k in m) {\n result += '' + m[k] + '\\n'\n }\n result += '\\n\\n\\n'\n\n CSG.polygons.map(function (p) { // first we dump all vertices of all polygons\n for (var i = 0; i < p.vertices.length; i++) {\n result += CSGVertextoAMFString(p.vertices[i])\n }\n })\n result += '\\n'\n\n var n = 0\n CSG.polygons.map(function (p) { // then we dump all polygons\n result += '\\n'\n if (p.vertices.length < 3)\n return\n var color = null\n if (p.shared && p.shared.color) {\n color = p.shared.color\n } else if (p.color) {\n color = p.color\n }\n if (color != null) {\n if (color.length < 4) color.push(1.)\n result += '' + color[0] + '' + color[1] + '' + color[2] + '' + color[3] + ''\n }\n\n for (var i = 0; i < p.vertices.length - 2; i++) { // making sure they are all triangles (triangular polygons)\n result += ''\n result += '' + (n) + ''\n result += '' + (n + i + 1) + ''\n result += '' + (n + i + 2) + ''\n result += '\\n'\n }\n n += p.vertices.length\n result += '\\n'\n })\n result += '\\n\\n'\n result += '\\n'\n\n return new Blob([result], {\n type: 'application/amf+xml'\n })\n}\n\nfunction CSGVectortoAMFString(v){\n return '' + v._x + '' + v._y + '' + v._z + ''\n}\n\nfunction CSGVertextoAMFString(vertex){\n return '' + CSGVectortoAMFString(vertex.pos) + '\\n'\n}\n/*\nCSG.Vector3D.prototype.toAMFString = function () {\n return '' + this._x + '' + this._y + '' + this._z + ''\n}\n\nCSG.Vertex.prototype.toAMFString = function () {\n return '' + this.pos.toAMFString() + '\\n'\n}*/\n","import makeBlob from '../../utils/Blob'\nconst Blob = makeBlob()\n\nexport default function toX3D (CSG) {\n // materialPolygonLists\n // key: a color string (e.g. \"0 1 1\" for yellow)\n // value: an array of strings specifying polygons of this color\n // (as space-separated indices into vertexCoords)\n var materialPolygonLists = {},\n // list of coordinates (as \"x y z\" strings)\n vertexCoords = [],\n // map to look up the index in vertexCoords of a given vertex\n vertexTagToCoordIndexMap = {}\n\n CSG.polygons.map(function (p) {\n var red = 0,\n green = 0,\n blue = 1 // default color is blue\n if (p.shared && p.shared.color) {\n red = p.shared.color[0]\n green = p.shared.color[1]\n blue = p.shared.color[2]\n }\n\n var polygonVertexIndices = [],\n numvertices = p.vertices.length,\n vertex\n for (var i = 0; i < numvertices; i++) {\n vertex = p.vertices[i]\n if (!(vertex.getTag() in vertexTagToCoordIndexMap)) {\n vertexCoords.push(vertex.pos._x.toString() + ' ' +\n vertex.pos._y.toString() + ' ' +\n vertex.pos._z.toString()\n )\n vertexTagToCoordIndexMap[vertex.getTag()] = vertexCoords.length - 1\n }\n polygonVertexIndices.push(vertexTagToCoordIndexMap[vertex.getTag()])\n }\n\n var polygonString = polygonVertexIndices.join(' ')\n\n var colorString = red.toString() + ' ' + green.toString() + ' ' + blue.toString()\n if (!(colorString in materialPolygonLists)) {\n materialPolygonLists[colorString] = []\n }\n // add this polygonString to the list of colorString-colored polygons\n materialPolygonLists[colorString].push(polygonString)\n })\n\n // create output document\n var docType = document.implementation.createDocumentType('X3D',\n 'ISO//Web3D//DTD X3D 3.1//EN', 'http://www.web3d.org/specifications/x3d-3.1.dtd')\n var exportDoc = document.implementation.createDocument(null, 'X3D', docType)\n exportDoc.insertBefore(\n exportDoc.createProcessingInstruction('xml', 'version=\"1.0\" encoding=\"UTF-8\"'),\n exportDoc.doctype)\n\n var exportRoot = exportDoc.getElementsByTagName('X3D')[0]\n exportRoot.setAttribute('profile', 'Interchange')\n exportRoot.setAttribute('version', '3.1')\n exportRoot.setAttribute('xsd:noNamespaceSchemaLocation', 'http://www.web3d.org/specifications/x3d-3.1.xsd')\n exportRoot.setAttribute('xmlns:xsd', 'http://www.w3.org/2001/XMLSchema-instance')\n\n var exportScene = exportDoc.createElement('Scene')\n exportRoot.appendChild(exportScene)\n\n /*\n For each color, create a shape made of an appropriately colored\n material which contains all polygons that are this color.\n\n The first shape will contain the definition of all vertices,\n (), which will be referenced by\n subsequent shapes.\n */\n var coordsMeshDefined = false\n for (var colorString in materialPolygonLists) {\n var polygonList = materialPolygonLists[colorString]\n var shape = exportDoc.createElement('Shape')\n exportScene.appendChild(shape)\n\n var appearance = exportDoc.createElement('Appearance')\n shape.appendChild(appearance)\n\n var material = exportDoc.createElement('Material')\n appearance.appendChild(material)\n material.setAttribute('diffuseColor', colorString)\n material.setAttribute('ambientIntensity', '1.0')\n\n var ifs = exportDoc.createElement('IndexedFaceSet')\n shape.appendChild(ifs)\n ifs.setAttribute('solid', 'true')\n ifs.setAttribute('coordIndex', polygonList.join(' -1 ') + ' -1')\n\n var coordinate = exportDoc.createElement('Coordinate')\n ifs.appendChild(coordinate)\n if (coordsMeshDefined) {\n coordinate.setAttribute('USE', 'coords_mesh')\n } else {\n coordinate.setAttribute('DEF', 'coords_mesh')\n coordinate.setAttribute('point', vertexCoords.join(' '))\n coordsMeshDefined = true\n }\n }\n\n var x3dstring = (new XMLSerializer()).serializeToString(exportDoc)\n return new Blob([x3dstring], {\n type: 'model/x3d+xml'\n })\n}\n","import { CSG } from '../../csg'\nimport makeBlob from '../../utils/Blob'\nconst Blob = makeBlob()\n\nexport default function CAGtoSvg (cagObject) {\n var decimals = 1000\n\n // mirror the CAG about the X axis in order to generate paths into the POSITIVE direction\n var plane = new CSG.Plane(CSG.Vector3D.Create(0, 1, 0), 0)\n var cag = cagObject.transform(CSG.Matrix4x4.mirroring(plane))\n\n var bounds = cag.getBounds()\n var paths = cag.getOutlinePaths()\n var width = Math.round((bounds[1].x - bounds[0].x) * decimals) / decimals\n var height = Math.round((bounds[1].y - bounds[0].y) * decimals) / decimals\n var svg = '\\n'\n svg += '\\n'\n svg += '\\n'\n svg += '\\n'\n svg += PathsToSvg(paths, bounds)\n svg += ''\n return new Blob([svg], {\n type: 'image/svg+xml'\n })\n}\n\nfunction PathsToSvg (paths, bounds) {\n // calculate offsets in order to create paths orientated from the 0,0 axis\n var xoffset = 0 - bounds[0].x\n var yoffset = 0 - bounds[0].y\n var str = '\\n'\n paths.map(function (path) {\n str += '= path.points.length) pointindexwrapped -= path.points.length\n var point = path.points[pointindexwrapped]\n if (pointindex > 0) {\n str += 'L' + (point.x + xoffset) + ' ' + (point.y + yoffset)\n } else {\n str += 'M' + (point.x + xoffset) + ' ' + (point.y + yoffset)\n }\n }\n str += '\"/>\\n'\n })\n str += '\\n'\n return str\n}\n","import makeBlob from '../../utils/Blob'\nconst Blob = makeBlob()\n\nexport default function CAGToJson (CAG) {\n var str = '{ \"type\": \"cag\",\"sides\": ['\n var comma = ''\n CAG.sides.map(\n function (side) {\n str += comma\n str += JSON.stringify(side)\n comma = ','\n }\n )\n str += '] }'\n return new Blob([str], {\n type: 'application/json'\n })\n}\n","import makeBlob from '../../utils/Blob'\nconst Blob = makeBlob()\n\nexport default function CAGtoDxf (cagObject) {\n var paths = cagObject.getOutlinePaths()\n return PathsToDxf(paths)\n}\n\nfunction PathsToDxf (paths) {\n var str = '999\\nDXF generated by OpenJsCad\\n'\n str += ' 0\\nSECTION\\n 2\\nHEADER\\n'\n str += ' 0\\nENDSEC\\n'\n str += ' 0\\nSECTION\\n 2\\nTABLES\\n'\n str += ' 0\\nTABLE\\n 2\\nLTYPE\\n 70\\n1\\n'\n str += ' 0\\nLTYPE\\n 2\\nCONTINUOUS\\n 3\\nSolid Line\\n 72\\n65\\n 73\\n0\\n 40\\n0.0\\n'\n str += ' 0\\nENDTAB\\n'\n str += ' 0\\nTABLE\\n 2\\nLAYER\\n 70\\n1\\n'\n str += ' 0\\nLAYER\\n 2\\nOpenJsCad\\n 62\\n7\\n 6\\ncontinuous\\n'\n str += ' 0\\nENDTAB\\n'\n str += ' 0\\nTABLE\\n 2\\nSTYLE\\n 70\\n0\\n 0\\nENDTAB\\n'\n str += ' 0\\nTABLE\\n 2\\nVIEW\\n 70\\n0\\n 0\\nENDTAB\\n'\n str += ' 0\\nENDSEC\\n'\n str += ' 0\\nSECTION\\n 2\\nBLOCKS\\n'\n str += ' 0\\nENDSEC\\n'\n str += ' 0\\nSECTION\\n 2\\nENTITIES\\n'\n paths.map(function (path) {\n var numpoints_closed = path.points.length + (path.closed ? 1 : 0)\n str += ' 0\\nLWPOLYLINE\\n 8\\nOpenJsCad\\n 90\\n' + numpoints_closed + '\\n 70\\n' + (path.closed ? 1 : 0) + '\\n'\n for (var pointindex = 0; pointindex < numpoints_closed; pointindex++) {\n var pointindexwrapped = pointindex\n if (pointindexwrapped >= path.points.length) pointindexwrapped -= path.points.length\n var point = path.points[pointindexwrapped]\n str += ' 10\\n' + point.x + '\\n 20\\n' + point.y + '\\n 30\\n0.0\\n'\n }\n })\n str += ' 0\\nENDSEC\\n 0\\nEOF\\n'\n return new Blob([str], {\n type: 'application/dxf'\n })\n}\n","/* converts input data to array if it is not already an array*/\nexport function toArray (data) {\n if (!data) return []\n if (data.constructor !== Array) return [data]\n return data\n}\n","import { version } from '../jscad/version'\nimport { CSG, CAG } from '../csg'\nimport toStlString from '../io/writers/CSGToStla'\nimport toStlBinary from '../io/writers/CSGToStlb'\nimport toAMFString from '../io/writers/CSGToAMF'\nimport toX3D from '../io/writers/CSGToX3D'\nimport CAGtoSvg from '../io/writers/CAGtoSvg'\nimport CAGToJson from '../io/writers/CAGToJson'\nimport CAGtoDxf from '../io/writers/CAGtoDxf'\n\nimport {toArray} from '../utils/misc'\nimport makeBlob from '../utils/Blob'\nconst Blob = makeBlob()\n\nexport default function convertToBlob (objects, params) {\n const {format, formatInfo} = params\n\n let object\n\n if (format === 'jscad') {\n object = objects\n } else {\n objects = toArray(objects)\n //console.log('convertToBlob', objects, format)\n //console.log('object', objects[0], objects[0] instanceof CSG)\n\n // review the given objects\n let foundCSG = false\n let foundCAG = false\n for (let i = 0; i < objects.length; i++) {\n if (objects[i] instanceof CSG) { foundCSG = true }\n if (objects[i] instanceof CAG) { foundCAG = true }\n }\n // convert based on the given format\n foundCSG = foundCSG && formatInfo.convertCSG\n foundCAG = foundCAG && formatInfo.convertCAG\n if (foundCSG && foundCAG) { foundCAG = false } // use 3D conversion\n\n object = !foundCSG ? new CAG() : new CSG()\n\n for (let i = 0; i < objects.length; i++) {\n if (foundCSG === true && objects[i] instanceof CAG) {\n object = object.union(objects[i].extrude({offset: [0, 0, 0.1]})) // convert CAG to a thin solid CSG\n continue\n }\n if (foundCAG === true && objects[i] instanceof CSG) {\n continue\n }\n object = object.union(objects[i])\n }\n }\n\n const meta = {\n producer: 'OpenJSCAD.org ' + version,\n date: new Date()\n }\n\n const outputFormatHandlers = {\n amf: (object) => toAMFString(object, meta), // CSG to AMF\n stl: (object) => toStlString(object), // CSG to STL ASCII\n stla: (object) => toStlString(object), // CSG to STL ASCII\n stlb: (object) => toStlBinary(object, {webBlob: true}), // CSG to STL BINARY\n dxf: (object) => CAGtoDxf(object), // CAG to DXF\n svg: (object) => CAGtoSvg(object), // CAG to SVG\n x3d: (object) => toX3D(object.fixTJunctions()), // CSG to X3D Only possible via browsers\n json: (object) => CAGToJson(object), // CSG or CAG to JSON\n js: (object) => object, // js , pass through\n jscad: (object) => object, // jscad, pass through\n undefined: () => {\n throw new Error('Not supported : only jscad, stl, amf, dxf, svg or json as output format')\n }\n }\n\n let blob = outputFormatHandlers[format](object)\n\n if (format === 'jscad') {\n blob = new Blob([blob], { type: formatInfo.mimetype })\n }\n return blob\n}\n","// == OpenJSCAD.org, Copyright (c) 2013-2016, Licensed under MIT License\n//\n// History:\n// 2016/02/02: 0.4.0: GUI refactored, functionality split up into more files, mostly done by Z3 Dev\n\n/**\n * Create an function for processing the JSCAD script into CSG/CAG objects\n * @param {String} script the script\n * @param {Object} globals the globals to use when evaluating the script: these are not ..\n * ...ACTUAL globals, merely functions/ variable accessible AS IF they were globals !\n */\nexport default function createJscadFunction (script, globals) {\n // console.log('globals', globals)\n // not a fan of this, we have way too many explicit api elements\n let globalsList = ''\n // each top key is a library ie : openscad helpers etc\n // one level below that is the list of libs\n // last level is the actual function we want to export to 'local' scope\n Object.keys(globals).forEach(function (libKey) {\n const lib = globals[libKey]\n // console.log(`lib:${libKey}: ${lib}`)\n Object.keys(lib).forEach(function (libItemKey) {\n const libItems = lib[libItemKey]\n // console.log('libItems', libItems)\n Object.keys(libItems).forEach(function (toExposeKey) {\n // console.log('toExpose',toExpose )\n const text = `const ${toExposeKey} = globals['${libKey}']['${libItemKey}']['${toExposeKey}']\n`\n globalsList += text\n })\n })\n })\n\n const source = `// SYNC WORKER\n ${globalsList}\n\n //user defined script(s)\n ${script}\n\n if (typeof (main) !== 'function') {\n throw new Error('The JSCAD script must contain a function main() which returns one or more CSG or CAG solids.')\n }\n\n return main(params)\n `\n\n var f = new Function('params', 'include', 'globals', source)\n return f\n}\n","//\n// THESE FUNCTIONS ARE SERIALIZED FOR INCLUSION IN THE FULL SCRIPT\n//\n// TODO It might be possible to cache the serialized versions\n//\n\n// Include the requested script via MemFs (if available) or HTTP Request\n//\n// (Note: This function is appended together with the JSCAD script)\n//\nexport default function includeJscadSync (relpath, fn) {\n //console.log('include', relpath, fn)\n // include the requested script via MemFs if possible\n return new Promise(function (resolve, reject) {\n if (typeof (gMemFs) === 'object') {\n for (var fs in gMemFs) {\n if (gMemFs[fs].name === fn) {\n //eval(gMemFs[fs].source)\n resolve(gMemFs[fs].source)\n }\n }\n }\n // include the requested script via webserver access\n var xhr = new XMLHttpRequest()\n var url = relpath + fn\n if (fn.match(/^(https:|http:)/i)) {\n url = fn\n }\n xhr.open('GET', url, false)\n xhr.onload = function () {\n var src = this.responseText\n //console.log('src',src)\n //eval(src) // UGH ???\n resolve(src)\n }\n xhr.onerror = function () {}\n xhr.send()\n })\n}\n","import { CAG } from '../csg'\n\n// -- 2D primitives (OpenSCAD like notion)\n\nexport function square () {\n let v = [1, 1]\n let off\n let a = arguments\n let p = a[0]\n\n if (p && !p.size) v = [p, p]\n if (p && p.length) v = a[0], p = a[1]\n if (p && p.size && p.size.length) v = p.size\n\n off = [v[0] / 2, v[1] / 2]\n if (p && p.center === true) off = [0, 0]\n\n var o = CAG.rectangle({center: off, radius: [v[0] / 2, v[1] / 2]})\n\n return o\n}\n\nexport function circle () {\n let r = 1\n let off\n let fn = 32\n let a = arguments\n let p = a[0]\n if (p && p.r) r = p.r\n if (p && p.fn) fn = p.fn\n if (p && !p.r && !p.fn && !p.center) r = p\n off = [r, r]\n if (p && p.center === true) { off = [0, 0] }\n var o = CAG.circle({center: off, radius: r, resolution: fn})\n return o\n}\n\nexport function polygon (p) { // array of po(ints) and pa(ths)\n var points = [ ]\n if (p.paths && p.paths.length && p.paths[0].length) { // pa(th): [[0,1,2],[2,3,1]] (two paths)\n for (var j = 0; j < p.paths.length; j++) {\n for (var i = 0; i < p.paths[j].length; i++) {\n points[i] = p.points[p.paths[j][i]]\n }\n }\n } else if (p.paths && p.paths.length) { // pa(th): [0,1,2,3,4] (single path)\n for (var i = 0; i < p.paths.length; i++) {\n points[i] = p.points[p.paths[i]]\n }\n } else { // pa(th) = po(ints)\n if (p.length) {\n points = p\n } else {\n points = p.points\n }\n }\n return CAG.fromPoints(points)\n}\n\nexport function triangle () { // -- new addition\n var a = arguments\n if (a[0] && a[0].length) a = a[0]\n var o = CAG.fromPoints(a)\n return o\n}\n","import { CSG } from '../csg'\n// -- 2D to 3D primitives (OpenSCAD like notion)\n\nexport function linear_extrude (p, s) {\n // console.log(\"linear_extrude() not yet implemented\")\n // return\n let h = 1\n let off = 0\n let twist = 0\n let slices = 10\n /* convexity = 10,*/\n\n if (p.height) h = p.height\n // if(p.convexity) convexity = p.convexity // abandoned\n if (p.twist) twist = p.twist\n if (p.slices) slices = p.slices\n var o = s.extrude({offset: [0, 0, h], twistangle: twist, twiststeps: slices})\n if (p.center === true) {\n var b = [ ]\n b = o.getBounds() // b[0] = min, b[1] = max\n off = b[1].plus(b[0])\n off = off.times(-0.5)\n o = o.translate(off)\n }\n return o\n}\n\nexport function rotate_extrude (p, o) {\n var fn = 32\n if (arguments.length < 2) {\n o = p // no switches, just an object\n } else if (p !== undefined) {\n fn = p.fn\n }\n if (fn < 3) fn = 3\n var ps = []\n for (var i = 0; i < fn; i++) {\n // o.{x,y} -> rotate([0,0,i:0..360], obj->{o.x,0,o.y})\n for (var j = 0; j < o.sides.length; j++) {\n // has o.sides[j].vertex{0,1}.pos (only x,y)\n var p = []\n var m\n\n m = new CSG.Matrix4x4.rotationZ(i / fn * 360)\n p[0] = new CSG.Vector3D(o.sides[j].vertex0.pos.x, 0, o.sides[j].vertex0.pos.y)\n p[0] = m.rightMultiply1x3Vector(p[0])\n\n p[1] = new CSG.Vector3D(o.sides[j].vertex1.pos.x, 0, o.sides[j].vertex1.pos.y)\n p[1] = m.rightMultiply1x3Vector(p[1])\n\n m = new CSG.Matrix4x4.rotationZ((i + 1) / fn * 360)\n p[2] = new CSG.Vector3D(o.sides[j].vertex1.pos.x, 0, o.sides[j].vertex1.pos.y)\n p[2] = m.rightMultiply1x3Vector(p[2])\n\n p[3] = new CSG.Vector3D(o.sides[j].vertex0.pos.x, 0, o.sides[j].vertex0.pos.y)\n p[3] = m.rightMultiply1x3Vector(p[3])\n\n var p1 = new CSG.Polygon([\n new CSG.Vertex(p[0]),\n new CSG.Vertex(p[1]),\n new CSG.Vertex(p[2]),\n new CSG.Vertex(p[3]), // we make a square polygon (instead of 2 triangles)\n ])\n // var p2 = new CSG.Polygon([\n // new CSG.Vertex(p[0]),\n // new CSG.Vertex(p[2]),\n // new CSG.Vertex(p[3]),\n // ])\n ps.push(p1)\n // ps.push(p2)\n // echo(\"i=\"+i,i/fn*360,\"j=\"+j)\n }\n }\n return CSG.fromPolygons(ps)\n}\n\nexport function rectangular_extrude (pa, p) {\n let w = 1\n let h = 1\n let fn = 8\n let closed = false\n let round = true\n if (p) {\n if (p.w) w = p.w\n if (p.h) h = p.h\n if (p.fn) fn = p.fn\n if (p.closed !== undefined) closed = p.closed\n if (p.round !== undefined) round = p.round\n }\n return new CSG.Path2D(pa, closed).rectangularExtrude(w, h, fn, round)\n}\n","// -- 3D primitives (OpenSCAD like notion)\nimport { CSG } from '../csg'\nimport { circle } from './primitives2d'\nimport { rotate_extrude } from './ops-extrusions'\n\nexport function cube (p) {\n var s = 1, v = null, off = [0, 0, 0], round = false, r = 0, fn = 8\n if (p && p.length) v = p\n if (p && p.size && p.size.length) v = p.size // { size: [1,2,3] }\n if (p && p.size && !p.size.length) s = p.size // { size: 1 }\n // if(p&&!p.size&&!p.length&&p.center===undefined&&!p.round&&!p.radius) s = p // (2)\n if (p && (typeof p != 'object')) s = p// (2)\n if (p && p.round == true) { round = true, r = v && v.length ? (v[0] + v[1] + v[2]) / 30 : s / 10}\n if (p && p.radius) { round = true, r = p.radius }\n if (p && p.fn) fn = p.fn // applies in case of round: true\n\n var x = s, y = s, z = s\n if (v && v.length) {\n x = v[0], y = v[1], z = v[2]\n }\n off = [x / 2, y / 2, z / 2] // center: false default\n var o = round ?\n CSG.roundedCube({radius: [x / 2, y / 2, z / 2], roundradius: r, resolution: fn}) :\n CSG.cube({radius: [x / 2, y / 2, z / 2]})\n if (p && p.center && p.center.length) {\n off = [p.center[0] ? 0 : x / 2, p.center[1] ? 0 : y / 2, p.center[2] ? 0 : z / 2]\n } else if (p && p.center == true) {\n off = [0, 0, 0]\n } else if (p && p.center == false) {\n off = [x / 2, y / 2, z / 2]\n }\n if (off[0] || off[1] || off[2]) o = o.translate(off)\n // if(v&&v.length) o = o.scale(v) // we don't scale afterwards, we already created box with the correct size\n return o\n}\n\nexport function sphere (p) {\n var r = 1\n var fn = 32\n var off = [0, 0, 0]\n var type = 'normal'\n\n // var zoff = 0 // sphere() in openscad has no center:true|false\n if (p && p.r) r = p.r\n if (p && p.fn) fn = p.fn\n if (p && p.type) type = p.type\n // if(p&&!p.r&&!p.fn&&!p.type) r = p\n if (p && (typeof p != 'object')) r = p\n off = [0, 0, 0] // center: false (default)\n\n var o\n if (type == 'geodesic')\n o = geodesicSphere(p)\n else\n o = CSG.sphere({radius: r,resolution: fn})\n\n if (p && p.center && p.center.length) { // preparing individual x,y,z center\n off = [p.center[0] ? 0 : r, p.center[1] ? 0 : r, p.center[2] ? 0 : r]\n } else if (p && p.center == true) {\n off = [0, 0, 0]\n } else if (p && p.center == false) {\n off = [r, r, r]\n }\n if (off[0] || off[1] || off[2]) o = o.translate(off)\n return o\n}\n\nexport function geodesicSphere (p) {\n var r = 1, fn = 5\n\n var ci = [ // hard-coded data of icosahedron (20 faces, all triangles)\n [0.850651, 0.000000, -0.525731],\n [0.850651, -0.000000, 0.525731],\n [-0.850651, -0.000000, 0.525731],\n [-0.850651, 0.000000, -0.525731],\n [0.000000, -0.525731, 0.850651],\n [0.000000, 0.525731, 0.850651],\n [0.000000, 0.525731, -0.850651],\n [0.000000, -0.525731, -0.850651],\n [-0.525731, -0.850651, -0.000000],\n [0.525731, -0.850651, -0.000000],\n [0.525731, 0.850651, 0.000000],\n [-0.525731, 0.850651, 0.000000]]\n\n var ti = [ [0, 9, 1], [1, 10, 0], [6, 7, 0], [10, 6, 0], [7, 9, 0], [5, 1, 4], [4, 1, 9], [5, 10, 1], [2, 8, 3], [3, 11, 2], [2, 5, 4],\n [4, 8, 2], [2, 11, 5], [3, 7, 6], [6, 11, 3], [8, 7, 3], [9, 8, 4], [11, 10, 5], [10, 11, 6], [8, 9, 7]]\n\n var geodesicSubDivide = function (p, fn, off) {\n var p1 = p[0], p2 = p[1], p3 = p[2]\n var n = off\n var c = []\n var f = []\n\n // p3\n // /\\\n // /__\\ fn = 3\n // i /\\ /\\\n // /__\\/__\\ total triangles = 9 (fn*fn)\n // /\\ /\\ /\\\n // 0/__\\/__\\/__\\\n // p1 0 j p2\n\n for (var i = 0; i < fn; i++) {\n for (var j = 0; j < fn - i; j++) {\n var t0 = i / fn\n var t1 = (i + 1) / fn\n var s0 = j / (fn - i)\n var s1 = (j + 1) / (fn - i)\n var s2 = fn - i - 1 ? j / (fn - i - 1) : 1\n var q = []\n\n q[0] = mix3(mix3(p1, p2, s0), p3, t0)\n q[1] = mix3(mix3(p1, p2, s1), p3, t0)\n q[2] = mix3(mix3(p1, p2, s2), p3, t1)\n\n // -- normalize\n for (var k = 0; k < 3; k++) {\n var r = Math.sqrt(q[k][0] * q[k][0] + q[k][1] * q[k][1] + q[k][2] * q[k][2])\n for (var l = 0; l < 3; l++) {\n q[k][l] /= r\n }\n }\n c.push(q[0], q[1], q[2])\n f.push([n, n + 1, n + 2]); n += 3\n\n if (j < fn - i - 1) {\n var s3 = fn - i - 1 ? (j + 1) / (fn - i - 1) : 1\n q[0] = mix3(mix3(p1, p2, s1), p3, t0)\n q[1] = mix3(mix3(p1, p2, s3), p3, t1)\n q[2] = mix3(mix3(p1, p2, s2), p3, t1)\n\n // -- normalize\n for (var k = 0; k < 3; k++) {\n var r = Math.sqrt(q[k][0] * q[k][0] + q[k][1] * q[k][1] + q[k][2] * q[k][2])\n for (var l = 0; l < 3; l++) {\n q[k][l] /= r\n }\n }\n c.push(q[0], q[1], q[2])\n f.push([n, n + 1, n + 2]); n += 3\n }\n }\n }\n return { points: c, triangles: f, off: n }\n }\n\n var mix3 = function (a, b, f) {\n var _f = 1 - f\n var c = []\n for (var i = 0; i < 3; i++) {\n c[i] = a[i] * _f + b[i] * f\n }\n return c\n }\n\n if (p) {\n if (p.fn) fn = Math.floor(p.fn / 6)\n if (p.r) r = p.r\n }\n\n if (fn <= 0) fn = 1\n\n var q = []\n var c = [], f = []\n var off = 0\n\n for (var i = 0; i < ti.length; i++) {\n var g = geodesicSubDivide([ ci[ti[i][0]], ci[ti[i][1]], ci[ti[i][2]]], fn, off)\n c = c.concat(g.points)\n f = f.concat(g.triangles)\n off = g.off\n }\n return polyhedron({points: c, triangles: f}).scale(r)\n}\n\nexport function cylinder (p) {\n var r1 = 1, r2 = 1, h = 1, fn = 32, round = false\n var a = arguments\n var off = [0, 0, 0]\n if (p && p.d) {\n r1 = r2 = p.d / 2\n }\n if (p && p.r) {\n r1 = p.r\n r2 = p.r\n }\n if (p && p.h) {\n h = p.h\n }\n if (p && (p.r1 || p.r2)) {\n r1 = p.r1\n r2 = p.r2\n if (p.h) h = p.h\n }\n if (p && (p.d1 || p.d2)) {\n r1 = p.d1 / 2\n r2 = p.d2 / 2\n }\n\n if (a && a[0] && a[0].length) {\n a = a[0]\n r1 = a[0]\n r2 = a[1]\n h = a[2]\n if (a.length === 4) fn = a[3]\n }\n if (p && p.fn) fn = p.fn\n // if(p&&p.center==true) zoff = -h/2\n if (p && p.round === true) round = true\n var o\n if (p && (p.start && p.end)) {\n o = round ?\n CSG.roundedCylinder({start: p.start, end: p.end, radiusStart: r1, radiusEnd: r2, resolution: fn}) :\n CSG.cylinder({start: p.start, end: p.end, radiusStart: r1, radiusEnd: r2, resolution: fn})\n } else {\n o = round ?\n CSG.roundedCylinder({start: [0, 0, 0], end: [0, 0, h], radiusStart: r1, radiusEnd: r2, resolution: fn}) :\n CSG.cylinder({start: [0, 0, 0], end: [0, 0, h], radiusStart: r1, radiusEnd: r2, resolution: fn})\n var r = r1 > r2 ? r1 : r2\n if (p && p.center && p.center.length) { // preparing individual x,y,z center\n off = [p.center[0] ? 0 : r, p.center[1] ? 0 : r, p.center[2] ? -h / 2 : 0]\n } else if (p && p.center === true) {\n off = [0, 0, -h / 2]\n } else if (p && p.center === false) {\n off = [0, 0, 0]\n }\n if (off[0] || off[1] || off[2]) o = o.translate(off)\n }\n return o\n}\n\nexport function torus (p) {\n var ri = 1, ro = 4, fni = 16, fno = 32, roti = 0\n if (p) {\n if (p.ri) ri = p.ri\n if (p.fni) fni = p.fni\n if (p.roti) roti = p.roti\n if (p.ro) ro = p.ro\n if (p.fno) fno = p.fno\n }\n if (fni < 3) fni = 3\n if (fno < 3) fno = 3\n var c = circle({r: ri, fn: fni, center: true})\n if (roti) c = c.rotateZ(roti)\n return rotate_extrude({fn: fno}, c.translate([ro, 0, 0]))\n}\n\nexport function polyhedron (p) {\n var pgs = []\n var ref = p.triangles || p.polygons\n var colors = p.colors || null\n\n for (var i = 0; i < ref.length; i++) {\n var pp = []\n for (var j = 0; j < ref[i].length; j++) {\n pp[j] = p.points[ref[i][j]]\n }\n\n var v = []\n for (j = ref[i].length - 1; j >= 0; j--) { // --- we reverse order for examples of OpenSCAD work\n v.push(new CSG.Vertex(new CSG.Vector3D(pp[j][0], pp[j][1], pp[j][2])))\n }\n var s = CSG.Polygon.defaultShared\n if (colors && colors[i]) {\n s = CSG.Polygon.Shared.fromColor(colors[i])\n }\n pgs.push(new CSG.Polygon(v, s))\n }\n var r = CSG.fromPolygons(pgs)\n return r\n}\n","import {CAG, CSG} from '../csg'\n\n// -- 3D operations (OpenSCAD like notion)\nexport function union () {\n var o,i = 0,a = arguments\n if (a[0].length) a = a[0]\n\n o = a[i++]\n if (0) { // we leave to code for now, perhaps later we allow mixed CAG/CSG union\n if ((typeof (a[i]) == 'object') && (a[i] instanceof CAG)) {\n o = a[i].extrude({offset: [0, 0, 0.1]}) // -- convert a 2D shape to a thin solid, note: do not a[i] = a[i].extrude()\n } else {\n o = a[i++]\n }\n }\n for (; i < a.length; i++) {\n var obj = a[i]\n\n // for now disabled, later perhaps allow mixed union of CAG/CSG\n if (0 && (typeof (a[i]) == 'object') && (a[i] instanceof CAG)) {\n obj = a[i].extrude({offset: [0, 0, 0.1]}) // -- convert a 2D shape to a thin solid:\n }\n o = o.union(obj)\n }\n return o\n}\n\nexport function difference () {\n var o,i = 0,a = arguments\n if (a[0].length) a = a[0]\n for (o = a[i++]; i < a.length; i++) {\n if (a[i] instanceof CAG) {\n o = o.subtract(a[i])\n } else {\n o = o.subtract(a[i].setColor(1, 1, 0)) // -- color the cuts\n }\n }\n return o\n}\n\nexport function intersection () {\n var o,i = 0,a = arguments\n if (a[0].length) a = a[0]\n for (o = a[i++]; i < a.length; i++) {\n if (a[i] instanceof CAG) {\n o = o.intersect(a[i])\n } else {\n o = o.intersect(a[i].setColor(1, 1, 0)) // -- color the cuts\n }\n }\n return o\n}\n","import { CSG, CAG } from '../csg'\nimport { union } from './ops-booleans'\n// -- 3D transformations (OpenSCAD like notion)\n\n\nexport function translate() { // v, obj or array\n var a = arguments, v = a[0], o, i = 1;\n if(a[1].length) { a = a[1]; i = 0; }\n for(o=a[i++]; ip.angle)\n return 1;\n else {\n if (this.distancep.distance)\n return 1;\n }\n return 0;\n }\n }\n\n var ConvexHull = function() {\n this.points = null;\n this.indices = null;\n\n this.getIndices = function() {\n return this.indices;\n }\n\n this.clear = function() {\n this.indices = null;\n this.points = null;\n }\n\n this.ccw = function(p1, p2, p3) {\n var ccw = (this.points[p2].x - this.points[p1].x)*(this.points[p3].y - this.points[p1].y) -\n (this.points[p2].y - this.points[p1].y)*(this.points[p3].x - this.points[p1].x);\n if(ccw<1e-5) // we need this, otherwise sorting never ends, see https://github.com/Spiritdude/OpenJSCAD.org/issues/18\n return 0\n return ccw;\n }\n\n this.angle = function(o, a) {\n //return Math.atan((this.points[a].y-this.points[o].y) / (this.points[a].x - this.points[o].x));\n return Math.atan2((this.points[a].y-this.points[o].y), (this.points[a].x - this.points[o].x));\n }\n\n this.distance = function(a, b) {\n return ((this.points[b].x-this.points[a].x)*(this.points[b].x-this.points[a].x)+\n (this.points[b].y-this.points[a].y)*(this.points[b].y-this.points[a].y));\n }\n\n this.compute = function(_points) {\n this.indices=null;\n if (_points.length<3)\n return;\n this.points=_points;\n\n // Find the lowest point\n var min = 0;\n for(var i = 1; i < this.points.length; i++) {\n if(this.points[i].y==this.points[min].y) {\n if(this.points[i].x0) {\n var ch = [];\n for(var i=0; i 0.5 ? d / (2 - max - min) : d / (max + min)\n switch (max) {\n case r:\n h = (g - b) / d + (g < b ? 6 : 0)\n break\n case g:\n h = (b - r) / d + 2\n break\n case b:\n h = (r - g) / d + 4\n break\n }\n h /= 6\n }\n\n return [h, s, l]\n}\n\n/**\n * Converts an HSL color value to RGB. Conversion formula\n * adapted from http://en.wikipedia.org/wiki/HSL_color_space.\n * Assumes h, s, and l are contained in the set [0, 1] and\n * returns r, g, and b in the set [0, 1].\n *\n * @param Number h The hue\n * @param Number s The saturation\n * @param Number l The lightness\n * @return Array The RGB representation\n */\nexport function hsl2rgb (h, s, l) {\n if (h.length) { l = h[2], s = h[1], h = h[0]; }\n var r, g, b\n\n if (s == 0) {\n r = g = b = l // achromatic\n } else {\n function hue2rgb (p, q, t) {\n if (t < 0) t += 1\n if (t > 1) t -= 1\n if (t < 1 / 6) return p + (q - p) * 6 * t\n if (t < 1 / 2) return q\n if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6\n return p\n }\n\n var q = l < 0.5 ? l * (1 + s) : l + s - l * s\n var p = 2 * l - q\n r = hue2rgb(p, q, h + 1 / 3)\n g = hue2rgb(p, q, h)\n b = hue2rgb(p, q, h - 1 / 3)\n }\n\n return [r, g, b]\n}\n\n/**\n * Converts an RGB color value to HSV. Conversion formula\n * adapted from http://en.wikipedia.org/wiki/HSV_color_space.\n * Assumes r, g, and b are contained in the set [0, 1] and\n * returns h, s, and v in the set [0, 1].\n *\n * @param Number r The red color value\n * @param Number g The green color value\n * @param Number b The blue color value\n * @return Array The HSV representation\n */\n\nexport function rgb2hsv (r, g, b) {\n if (r.length) { b = r[2], g = r[1], r = r[0]; }\n var max = Math.max(r, g, b), min = Math.min(r, g, b)\n var h, s, v = max\n\n var d = max - min\n s = max == 0 ? 0 : d / max\n\n if (max == min) {\n h = 0 // achromatic\n } else {\n switch (max) {\n case r:\n h = (g - b) / d + (g < b ? 6 : 0)\n break\n case g:\n h = (b - r) / d + 2\n break\n case b:\n h = (r - g) / d + 4\n break\n }\n h /= 6\n }\n\n return [h, s, v]\n}\n\n/**\n * Converts an HSV color value to RGB. Conversion formula\n * adapted from http://en.wikipedia.org/wiki/HSV_color_space.\n * Assumes h, s, and v are contained in the set [0, 1] and\n * returns r, g, and b in the set [0, 1].\n *\n * @param Number h The hue\n * @param Number s The saturation\n * @param Number v The value\n * @return Array The RGB representation\n */\nexport function hsv2rgb (h, s, v) {\n if (h.length) { v = h[2], s = h[1], h = h[0]; }\n var r, g, b\n\n var i = Math.floor(h * 6)\n var f = h * 6 - i\n var p = v * (1 - s)\n var q = v * (1 - f * s)\n var t = v * (1 - (1 - f) * s)\n\n switch (i % 6) {\n case 0:\n r = v, g = t, b = p\n break\n case 1:\n r = q, g = v, b = p\n break\n case 2:\n r = p, g = v, b = t\n break\n case 3:\n r = p, g = q, b = v\n break\n case 4:\n r = t, g = p, b = v\n break\n case 5:\n r = v, g = p, b = q\n break\n }\n\n return [r, g, b]\n}\n\n/**\n * Converts a HTML5 color value (string) to RGB values\n * See the color input type of HTML5 forms\n * Conversion formula:\n * - split the string; \"#RRGGBB\" into RGB components\n * - convert the HEX value into RGB values\n */\nexport function html2rgb (s) {\n var r = 0\n var g = 0\n var b = 0\n if (s.length == 7) {\n r = parseInt('0x' + s.slice(1, 3)) / 255\n g = parseInt('0x' + s.slice(3, 5)) / 255\n b = parseInt('0x' + s.slice(5, 7)) / 255\n }\n return [r, g, b]\n}\n\n/**\n * Converts RGB color value to HTML5 color value (string)\n * Conversion forumla:\n * - convert R, G, B into HEX strings\n * - return HTML formatted string \"#RRGGBB\"\n */\nexport function rgb2html (r, g, b) {\n if (r.length) { b = r[2], g = r[1], r = r[0]; }\n var s = '#' +\n Number(0x1000000 + r * 255 * 0x10000 + g * 255 * 0x100 + b * 255).toString(16).substring(1)\n return s\n}\n","// -- Math functions (360 deg based vs 2pi)\n\nexport function sin (a) {\n return Math.sin(a / 360 * Math.PI * 2)\n}\nexport function cos (a) {\n return Math.cos(a / 360 * Math.PI * 2)\n}\nexport function asin (a) {\n return Math.asin(a) / (Math.PI * 2) * 360\n}\nexport function acos (a) {\n return Math.acos(a) / (Math.PI * 2) * 360\n}\nexport function tan (a) {\n return Math.tan(a / 360 * Math.PI * 2)\n}\nexport function atan (a) {\n return Math.atan(a) / (Math.PI * 2) * 360\n}\nexport function atan2 (a, b) {\n return Math.atan2(a, b) / (Math.PI * 2) * 360\n}\nexport function ceil (a) {\n return Math.ceil(a)\n}\nexport function floor (a) {\n return Math.floor(a)\n}\nexport function abs (a) {\n return Math.abs(a)\n}\nexport function min (a, b) {\n return a < b ? a : b\n}\nexport function max (a, b) {\n return a > b ? a : b\n}\nexport function rands (min, max, vn, seed) {\n // -- seed is ignored for now, FIX IT (requires reimplementation of random())\n // see http://stackoverflow.com/questions/424292/how-to-create-my-own-javascript-random-number-generator-that-i-can-also-set-the\n var v = new Array(vn)\n for (var i = 0; i < vn; i++) {\n v[i] = Math.random() * (max - min) + min\n }\n}\nexport function log (a) {\n return Math.log(a)\n}\nexport function lookup (ix, v) {\n var r = 0\n for (var i = 0; i < v.length; i++) {\n var a0 = v[i]\n if (a0[0] >= ix) {\n i--\n a0 = v[i]\n var a1 = v[i + 1]\n var m = 0\n if (a0[0] !== a1[0]) {\n m = abs((ix - a0[0]) / (a1[0] - a0[0]))\n }\n // echo(\">>\",i,ix,a0[0],a1[0],\";\",m,a0[1],a1[1])\n if (m > 0) {\n r = a0[1] * (1 - m) + a1[1] * m\n } else {\n r = a0[1]\n }\n return r\n }\n }\n return r\n}\n\nexport function pow (a, b) {\n return Math.pow(a, b)\n}\n\nexport function sign (a) {\n return a < 0 ? -1 : (a > 1 ? 1 : 0)\n}\n\nexport function sqrt (a) {\n return Math.sqrt(a)\n}\n\nexport function round (a) {\n return floor(a + 0.5)\n}\n","\nexport function vector_char(x,y,c) {\n c = c.charCodeAt(0);\n c -= 32;\n if(c<0||c>=95) return { width: 0, segments: [] };\n\n var off = c*112;\n var n = simplexFont[off++];\n var w = simplexFont[off++];\n var l = [];\n var segs = [];\n\n for(var i=0; i\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n * Redistributions of source code must retain the above copyright\n notice, this list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above copyright\n notice, this list of conditions and the following disclaimer in the\n documentation and/or other materials provided with the distribution.\n * Neither the name of sprintf() for JavaScript nor the\n names of its contributors may be used to endorse or promote products\n derived from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\nANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL Alexandru Marasteanu BE LIABLE FOR ANY\nDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\nON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\nChangelog:\n2010.09.06 - 0.7-beta1\n - features: vsprintf, support for named placeholders\n - enhancements: format cache, reduced global namespace pollution\n\n2010.05.22 - 0.6:\n - reverted to 0.4 and fixed the bug regarding the sign of the number 0\n Note:\n Thanks to Raphael Pigulla (http://www.n3rd.org/)\n who warned me about a bug in 0.5, I discovered that the last update was\n a regress. I appologize for that.\n\n2010.05.09 - 0.5:\n - bug fix: 0 is now preceeded with a + sign\n - bug fix: the sign was not at the right position on padded results (Kamal Abdali)\n - switched from GPL to BSD license\n\n2007.10.21 - 0.4:\n - unit test and patch (David Baird)\n\n2007.09.17 - 0.3:\n - bug fix: no longer throws exception on empty paramenters (Hans Pufal)\n\n2007.09.11 - 0.2:\n - feature: added argument swapping\n\n2007.04.03 - 0.1:\n - initial release\n**/\n\nlet sprintf = (function () {\n function get_type (variable) {\n return Object.prototype.toString.call(variable).slice(8, -1).toLowerCase()\n }\n function str_repeat (input, multiplier) {\n for (var output = []; multiplier > 0; output[--multiplier] = input) { /* do nothing */}\n return output.join('')\n }\n\n var str_format = function () {\n if (!str_format.cache.hasOwnProperty(arguments[0])) {\n str_format.cache[arguments[0]] = str_format.parse(arguments[0])\n }\n return str_format.format.call(null, str_format.cache[arguments[0]], arguments)\n }\n\n str_format.format = function (parse_tree, argv) {\n var cursor = 1, tree_length = parse_tree.length, node_type = '', arg, output = [], i, k, match, pad, pad_character, pad_length\n for (i = 0; i < tree_length; i++) {\n node_type = get_type(parse_tree[i])\n if (node_type === 'string') {\n output.push(parse_tree[i])\n }\n else if (node_type === 'array') {\n match = parse_tree[i] // convenience purposes only\n if (match[2]) { // keyword argument\n arg = argv[cursor]\n for (k = 0; k < match[2].length; k++) {\n if (!arg.hasOwnProperty(match[2][k])) {\n throw(sprintf('[sprintf] property \"%s\" does not exist', match[2][k]))\n }\n arg = arg[match[2][k]]\n }\n }\n else if (match[1]) { // positional argument (explicit)\n arg = argv[match[1]]\n } else { // positional argument (implicit)\n arg = argv[cursor++]\n }\n\n if (/[^s]/.test(match[8]) && (get_type(arg) != 'number')) {\n throw(sprintf('[sprintf] expecting number but found %s', get_type(arg)))\n }\n switch (match[8]) {\n case 'b':\n arg = arg.toString(2)\n break\n case 'c':\n arg = String.fromCharCode(arg)\n break\n case 'd':\n arg = parseInt(arg, 10)\n break\n case 'e':\n arg = match[7] ? arg.toExponential(match[7]) : arg.toExponential()\n break\n case 'f':\n arg = match[7] ? parseFloat(arg).toFixed(match[7]) : parseFloat(arg)\n break\n case 'o':\n arg = arg.toString(8)\n break\n case 's':\n arg = ((arg = String(arg)) && match[7] ? arg.substring(0, match[7]) : arg)\n break\n case 'u':\n arg = Math.abs(arg)\n break\n case 'x':\n arg = arg.toString(16)\n break\n case 'X':\n arg = arg.toString(16).toUpperCase()\n break\n }\n arg = (/[def]/.test(match[8]) && match[3] && arg >= 0 ? '+' + arg : arg)\n pad_character = match[4] ? match[4] == '0' ? '0' : match[4].charAt(1) : ' '\n pad_length = match[6] - String(arg).length\n pad = match[6] ? str_repeat(pad_character, pad_length) : ''\n output.push(match[5] ? arg + pad : pad + arg)\n }\n }\n return output.join('')\n }\n\n str_format.cache = {}\n\n str_format.parse = function (fmt) {\n var _fmt = fmt, match = [], parse_tree = [], arg_names = 0\n while (_fmt) {\n if ((match = /^[^\\x25]+/.exec(_fmt)) !== null) {\n parse_tree.push(match[0])\n }\n else if ((match = /^\\x25{2}/.exec(_fmt)) !== null) {\n parse_tree.push('%')\n }\n else if ((match = /^\\x25(?:([1-9]\\d*)\\$|\\(([^\\)]+)\\))?(\\+)?(0|'[^$])?(-)?(\\d+)?(?:\\.(\\d+))?([b-fosuxX])/.exec(_fmt)) !== null) {\n if (match[2]) {\n arg_names |= 1\n var field_list = [], replacement_field = match[2], field_match = []\n if ((field_match = /^([a-z_][a-z_\\d]*)/i.exec(replacement_field)) !== null) {\n field_list.push(field_match[1])\n while ((replacement_field = replacement_field.substring(field_match[0].length)) !== '') {\n if ((field_match = /^\\.([a-z_][a-z_\\d]*)/i.exec(replacement_field)) !== null) {\n field_list.push(field_match[1])\n }\n else if ((field_match = /^\\[(\\d+)\\]/.exec(replacement_field)) !== null) {\n field_list.push(field_match[1])\n } else {\n throw('[sprintf] huh?')\n }\n }\n } else {\n throw('[sprintf] huh?')\n }\n match[2] = field_list\n } else {\n arg_names |= 2\n }\n if (arg_names === 3) {\n throw('[sprintf] mixing positional and named placeholders is not (yet) supported')\n }\n parse_tree.push(match)\n } else {\n throw('[sprintf] huh?')\n }\n _fmt = _fmt.substring(match[0].length)\n }\n return parse_tree\n }\n\n return str_format\n})()\n\nfunction vsprintf (fmt, argv) {\n argv.unshift(fmt)\n return sprintf.apply(null, argv)\n}\n","export function log (txt) {\n var timeInMs = Date.now()\n var prevtime = undefined//OpenJsCad.log.prevLogTime\n if (!prevtime) prevtime = timeInMs\n var deltatime = timeInMs - prevtime\n log.prevLogTime = timeInMs\n var timefmt = (deltatime * 0.001).toFixed(3)\n txt = '[' + timefmt + '] ' + txt\n if ((typeof (console) == 'object') && (typeof (console.log) == 'function')) {\n console.log(txt)\n } else if ((typeof (self) == 'object') && (typeof (self.postMessage) == 'function')) {\n self.postMessage({cmd: 'log', txt: txt})\n }\n else throw new Error('Cannot log')\n}\n\n// See Processor.setStatus()\n// Note: leave for compatibility\nexport function status (s) {\n log(s)\n}\n","import * as primitives3d from './primitives3d'\nimport * as primitives2d from './primitives2d'\nimport * as booleanOps from './ops-booleans'\nimport * as transformations from './ops-transformations'\nimport * as extrusions from './ops-extrusions'\nimport * as color from './color'\nimport * as maths from './maths'\nimport * as text from './text'\nimport { echo } from './debug'\n\n// these are 'external' to this folder ...needs to be reviewed\nimport { CAG, CSG } from '../csg'\nimport { log } from '../jscad/log'\n\nconst exportedApi = {\n csg: {CAG, CSG},\n primitives2d,\n primitives3d,\n booleanOps,\n transformations,\n extrusions,\n color,\n maths,\n text,\n OpenJsCad: {OpenJsCad: {log}},\n debug: {echo}\n}\n\nexport default exportedApi\n","import createJscadFunction from './jscad-function'\nimport includeJscadSync from './includeJscadSync'\nimport WebWorkify from 'webWorkify'\nimport { CAG, CSG } from '../csg'\nimport { toArray } from '../utils/misc'\nimport oscad from '../modeling/index'\n\n/**\n * helper function that finds include() statements in files,\n * fetches their code & returns it (recursively) returning the whole code with\n * inlined includes\n * this is more reliable than async xhr + eval()\n * @param {String} text the original script (with include statements)\n * @param {String} relpath relative path, for xhr resolution\n * @returns {String} the full script, with inlined\n */\nfunction replaceIncludes (text, relpath) {\n return new Promise(function (resolve, reject) {\n let scriptWithIncludes = text\n const includesPattern = /(?:include)\\s?\\(\"([\\w\\/.\\s]*)\"\\);?/gm\n\n let foundIncludes = []\n let foundIncludesFull = []\n let match\n while(match = includesPattern.exec(text)) {\n foundIncludes.push(match[1])\n foundIncludesFull.push(match[0])\n }\n\n let tmpPromises = foundIncludes.map(function (uri, index) {\n const promise = includeJscadSync(relpath, uri)\n return promise.then(function (includedScript) {\n return replaceIncludes(includedScript, relpath).then(function (substring) {\n let currentItem = foundIncludesFull[index]\n scriptWithIncludes = scriptWithIncludes.replace(currentItem, substring)\n return scriptWithIncludes\n })\n })\n })\n Promise.all(tmpPromises).then(x => resolve(scriptWithIncludes))\n })\n}\n\n/**\n * evaluate script & rebuild solids, in main thread\n * @param {String} script the script\n * @param {String} fullurl full url of current script\n * @param {Object} parameters the parameters to use with the script\n * @param {Object} callback the callback to call once evaluation is done /failed\n * @param {Object} options the settings to use when rebuilding the solid\n */\nexport function rebuildSolidSync (script, fullurl, parameters, callback, options) {\n let relpath = fullurl\n if (relpath.lastIndexOf('/') >= 0) {\n relpath = relpath.substring(0, relpath.lastIndexOf('/') + 1)\n }\n const defaults = {\n implicitGlobals: true\n }\n options = Object.assign({}, defaults, options)\n\n replaceIncludes(script, relpath).then(function (fullScript) {\n const globals = options.implicitGlobals ? (options.globals ? options.globals : {oscad}) : {}\n const func = createJscadFunction(fullScript, globals)\n // stand-in for the include function(no-op)\n const include = (x) => x\n try {\n let objects = func(parameters, include, globals)\n objects = toArray(objects)\n if (objects.length === 0) {\n throw new Error('The JSCAD script must return one or more CSG or CAG solids.')\n }\n callback(undefined, objects)\n } catch(error) {\n callback(error, undefined)\n }\n }).catch(error => callback(error, undefined))\n\n // have we been asked to stop our work?\n return {\n cancel: () => {\n console.log('cannot stop work in main thread, sorry')\n }\n }\n}\n\n/**\n * evaluate script & rebuild solids, in seperate thread/webworker\n * @param {String} script the script\n * @param {String} fullurl full url of current script\n * @param {Object} parameters the parameters to use with the script\n * @param {Object} callback the callback to call once evaluation is done /failed\n * @param {Object} options the settings to use when rebuilding the solid\n */\nexport function rebuildSolidAsync (script, fullurl, parameters, callback, options) {\n if (!parameters) { throw new Error(\"JSCAD: missing 'parameters'\") }\n if (!window.Worker) throw new Error('Worker threads are unsupported.')\n const defaults = {\n implicitGlobals: true\n }\n options = Object.assign({}, defaults, options)\n\n let relpath = fullurl\n if (relpath.lastIndexOf('/') >= 0) {\n relpath = relpath.substring(0, relpath.lastIndexOf('/') + 1)\n }\n\n let worker\n replaceIncludes(script, relpath).then(function (script) {\n worker = WebWorkify(require('./jscad-worker.js'))\n worker.onmessage = function (e) {\n if (e.data instanceof Object) {\n const data = e.data.objects.map(function (object) {\n if (object['class'] === 'CSG') { return CSG.fromCompactBinary(object) }\n if (object['class'] === 'CAG') { return CAG.fromCompactBinary(object) }\n })\n callback(undefined, data)\n }\n }\n worker.onerror = function (e) {\n callback(`Error in line ${e.lineno} : ${e.message}`, undefined)\n }\n worker.postMessage({cmd: 'render', fullurl, script, parameters, options})\n }).catch(error => callback(error, undefined))\n\n // have we been asked to stop our work?\n return {\n cancel: () => {\n worker.terminate()\n }\n }\n}\n","export default function getParameterDefinitionsCLI (getParameterDefinitions, param) { // used for openjscad CLI only\n if (typeof getParameterDefinitions !== 'undefined') {\n var p = {}\n var pa = getParameterDefinitions()\n for (var a in pa) { // defaults, given by getParameterDefinitions()\n var x = pa[a]\n if ('default' in x) {\n p[pa[a].name] = pa[a].default\n } else if ('initial' in x) {\n p[pa[a].name] = pa[a].initial\n } else if ('checked' in x) {\n p[pa[a].name] = pa[a].checked\n }\n }\n for (var a in param) { // given by command-line\n p[a] = param[a]\n }\n if (0) {\n for (var a in p) {\n echo('param=', a, p[a])\n }\n }\n return p\n } else\n return param\n}\n","export const formats = {\n stl: { displayName: 'STL (ASCII)', description: 'STereoLithography, ASCII', extension: 'stl', mimetype: 'application/sla', convertCSG: true, convertCAG: false },\n stla: { displayName: 'STL (ASCII)', description: 'STereoLithography, ASCII', extension: 'stl', mimetype: 'application/sla', convertCSG: true, convertCAG: false },\n stlb: { displayName: 'STL (Binary)', description: 'STereoLithography, Binary', extension: 'stl', mimetype: 'application/sla', convertCSG: true, convertCAG: false },\n amf: { displayName: 'AMF (experimental)', description: 'Additive Manufacturing File Format', extension: 'amf', mimetype: 'application/amf+xml', convertCSG: true, convertCAG: false },\n x3d: { displayName: 'X3D', description: 'X3D File Format', extension: 'x3d', mimetype: 'model/x3d+xml', convertCSG: true, convertCAG: false },\n dxf: { displayName: 'DXF', description: 'AutoCAD Drawing Exchange Format', extension: 'dxf', mimetype: 'application/dxf', convertCSG: false, convertCAG: true },\n jscad: { displayName: 'JSCAD', description: 'OpenJSCAD.org Source', extension: 'jscad', mimetype: 'application/javascript', convertCSG: true, convertCAG: true },\n svg: { displayName: 'SVG', description: 'Scalable Vector Graphics Format', extension: 'svg', mimetype: 'image/svg+xml', convertCSG: false, convertCAG: true },\n js: { displayName: 'js', description: 'JavaScript Source' },\n gcode: { displayName: 'gcode', description: 'G Programming Language File Format' },\n json: { displayName: 'json', description: 'JavaScript Object Notation Format' }\n}\n","import convertToBlob from '../io/convertToBlob'\nimport {rebuildSolidSync} from '../jscad/rebuildSolid'\nimport getParameterDefinitionsCLI from './getParameterDefinitionsCLI'\nimport {formats} from '../io/formats'\nimport oscad from '../modeling/index'\n\n/**\n * generate output data from source\n * @param {String} source the original source\n * @param {Object} params hash of parameters to pass to main function\n * @param {String} options\n * @return a Promise with the output data\n */\nexport default function generateOutputData (source, params, options) {\n const defaults = {\n implicitGlobals: true,\n outputFormat: 'stl'\n }\n options = Object.assign({}, defaults, options)\n const {implicitGlobals, outputFormat} = options\n\n let globals = {}\n if (implicitGlobals) {\n globals.oscad = oscad\n }\n globals.extras = {cli: {getParameterDefinitionsCLI}}\n\n // modify main to adapt parameters\n const mainFunction = `var wrappedMain = main\n main = function(){\n var paramsDefinition = (typeof getParameterDefinitions !== 'undefined') ? getParameterDefinitions : undefined\n return wrappedMain(getParameterDefinitionsCLI(paramsDefinition, ${JSON.stringify(params)}))\n }`\n source = `${source}\n ${mainFunction}\n `\n\n // objects = rebuildSolidSync(source, '', params, globals, callback)\n return new Promise(function (resolve, reject) {\n const callback = (err, result) => {\n if (!err) {\n return resolve(result)\n }\n return reject(err)\n }\n\n if (outputFormat === 'jscad' || outputFormat === 'js') {\n resolve(source)\n } else {\n rebuildSolidSync(source, '', params, callback, {implicitGlobals, globals})\n }\n })\n .then(function (objects) {\n const formatInfo = {\n convertCAG: true, convertCSG: true, mimetype: formats[outputFormat].mimetype\n }\n return convertToBlob(objects, {format: outputFormat, formatInfo})\n })\n\n// return convertToBlob(objects, {format: outputFormat, formatInfo: {convertCAG: true, convertCSG: true}})\n}\n","// shebang gets auto added here\n//--log_all\n\n// NOTE: this will only run on Node > 6 or needs to be transpiled, or launched via launch-cli\n\n// == OpenJSCAD.org CLI interface, written by Rene K. Mueller , Licensed under MIT License\n//\n// Description:\n// openjscad [-of ] [-o ]\n// e.g.\n// openjscad test.jscad\n// openjscad test.jscad -o test.stl\n// openjscad test.jscad -o test.amf\n// openjscad test.jscad -o test.dxf\n// openjscad test.scad -o testFromSCAD.jscad\n// openjscad test.scad -o test.stl\n// openjscad test.stl -o test2.stl # reprocessed: stl -> jscad -> stl\n// openjscad test.amf -o test2.jscad\n// openjscad test.jscad -of amf\n// openjscad test.jscad -of dxf\n// openjscad test.jscad -of stl\n// openjscad name_plate.jscad --name \"Just Me\" --title \"CEO\" -o amf test.amf\n//\n// History:\n// 2016/10/01: 0.5.2: changes for libraries\n// 2016/06/27: 0.5.1: refactored AMF import and export by Z3 Dev\n// enhanced STL import, adding support for MM colors by Z3 Dev\n// 2016/02/02: 0.4.0: GUI refactored, functionality split up into more files, mostly done by Z3 Dev\n// 2015/07/02: 0.3.0: node 0.10.x support, /usr/bin/nodejs, new files involved: formats.js (Stefan Baumann) and Blob.js (Z3 Dev)\n// 2014/12/09: 0.019: support of DXF output for 2D objects (laser cutter)\n// 2013/04/25: 0.010: support of params passed to main()\n// 2013/04/12: 0.008: reimplement parseAMF without jquery\n// 2013/04/11: 0.007: support of alpha for AMF addded, bumping version\n// 2013/04/05: 0.006: support of AMF added, requires node 0.8.1+\n// 2013/03/25: 0.005: more sanity check on input and local installation support\n// 2013/03/18: 0.004: STL .stl (binary & ascii) support (experimental via openscad.js)\n// 2013/03/18: 0.003: OpenSCAD .scad support by Gary Hodgson's openscad-openjscad-translator module\n// 2013/03/02: 0.002: proper installation of the dependencies (csg.js & openscad.js) so openjscad can be used properly\n// 2013/03/01: 0.001: initial version, with base function from openscad.jscad\n//\nimport fs from 'fs'\n\nimport {version} from './jscad/version'\nimport env from './jscad/env'\n\nimport generateOutputData from './utils/generateOutputData'\nimport { formats } from './io/formats'\n\n// var csg = sphere(1); // -- basic test\n// var csg = require(file).main; // -- treating .jscad as module? later perhaps\n\nconst args = process.argv.splice(2)\n\n// -- main code\n\n// handle arguments\n// inputs, outputs\nlet {inputFile, inputFormat, outputFile, outputFormat, params} = parseArgs(args)\n\n// outputs\nconst output = determineOutputNameAndFormat(outputFormat, outputFile)\noutputFormat = output.outputFormat\noutputFile = output.outputFile\n\nconsole.log(`converting ${inputFile} -> ${outputFile} (${formats[outputFormat].description})`)\n\nlet src = fs.readFileSync(inputFile, inputFile.match(/\\.stl$/i) ? 'binary' : 'UTF8')\n// -- include input, and convert into JSCAD source\n// src = inputFormatHandlers[inputFormat](src, inputFile, outputFile)\n\nif(inputFormat === 'scad')\n{\n var scadParser = require('openscad-openjscad-translator') // hardcoded is bad, but works\n src = scadParser.parse(src) // doing the magick\n src = '// producer: OpenJSCAD ' + version + '\\n' + src\n src = '// source: ' + outputFile + '\\n\\n' + src\n}\n\n// -- convert from JSCAD script into the desired output format\n// const outputData = generateOutputData(src, params, {outputFormat})\n// -- and write it to disk\n// writeOutputDataToFile(outputFile, outputData)\ngenerateOutputData(src, params, {outputFormat})\n .then(function (outputData) {\n writeOutputDataToFile(outputFile, outputData)\n }).catch(error=>console.error(error))\n\n// -- helper functions ---------------------------------------------------------------------------------------\nfunction parseArgs (args) {\n // hint: https://github.com/substack/node-optimist\n // https://github.com/visionmedia/commander.js\n //\n // process.argv.forEach(function (val, index, array) {\n // console.log(index + ': ' + val)\n // })\n if (args.length < 1) {\n console.log('USAGE:\\n\\nopenjscad [-v] [-of ] [-o ]')\n console.log('\\t :\\tinput file (Supported types: .jscad, .js, .scad, .stl, .amf, .obj, .gcode, .svg, .json)')\n console.log('\\t:\\toutput file (Supported types: .jscad, .stl, .amf, .dxf, .svg, .json)')\n console.log(\"\\t:\\t'jscad', 'stla' (STL ASCII, default), 'stlb' (STL Binary), 'amf', 'dxf', 'svg', 'json'\")\n process.exit(1)\n }\n\n let inputFile\n let inputFormat\n let outputFile\n let outputFormat\n let params = {}\n\n for (var i = 0; i < args.length; i++) {\n if (args[i] === '-of') { // -of \n outputFormat = args[++i]\n } else if (args[i].match(/^-o(\\S.+)/)) { // -o\n outputFile = args[i]\n outputFile = outputFile.replace(/^\\-o(\\S+)$/, '$1')\n } else if (args[i] === '-o') { // -o \n outputFile = args[++i]\n } else if (args[i].match(/^--(\\w+)=(.*)/)) { // params for main()\n params[RegExp.$1] = RegExp.$2\n } else if (args[i].match(/^--(\\w+)$/)) { // params for main()\n params[RegExp.$1] = args[++i]\n } else if (args[i].match(/^--(\\w+)$/)) { // params for main()\n params[RegExp.$1] = args[++i]\n } else if (args[i].match(/.+\\.(jscad|js|scad|stl|amf|obj|gcode|svg|json)$/i)) {\n inputFile = args[i]\n inputFormat = RegExp.$1\n if (!fs.statSync(inputFile).isFile()) {\n console.log('ERROR: cannot open file <' + inputFile + '>')\n process.exit(1)\n }\n } else if (args[i].match(/^-v$/)) { // show the version and the environment information\n env()\n console.log('OpenSCAD Compatibility (' + version + ')')\n } else {\n console.log('ERROR: invalid file name or argument <' + args[i] + '>')\n console.log(\"Type 'openjscad' for help\")\n process.exit(1)\n }\n }\n // exit if a input file was not provided\n if (inputFile === null) process.exit(1)\n\n if (!outputFormat && !outputFile) {\n outputFormat = 'stla'\n }\n\n return {\n inputFile,\n inputFormat,\n outputFile,\n outputFormat,\n params}\n}\n\nfunction determineOutputNameAndFormat (outputFormat, outputFile) {\n if (!outputFormat && outputFile && outputFile.length && outputFile.match(/\\.(jscad|js|stl|amf|dxf|svg)$/)) { // output filename set\n outputFormat = RegExp.$1\n } else if (!outputFormat && outputFile && outputFile.length) { // output filename isn't valid\n console.log('ERROR: invalid output file <' + outputFile + '>')\n process.exit(1)\n } else if (outputFormat.match(/(jscad|js|stl|stla|stlb|amf|dxf|svg)/i)) { // output format defined?\n var ext = RegExp.$1\n if (!outputFile) { // unless output filename not set, compose it\n ext = ext.replace(/stl[ab]/, 'stl') // drop [ab] from stl\n outputFile = inputFile\n outputFile = outputFile.replace(/\\.([^\\.]+)$/, '.' + ext) // compose output filename\n }\n } else {\n console.log(`ERROR: invalid output format <${outputFormat}`)\n process.exit(1)\n }\n return {outputFormat, outputFile}\n}\n\nfunction writeOutputDataToFile (outputFile, outputData) {\n fs.writeFile(outputFile, outputData.asBuffer(),\n function (err) {\n if (err) {\n console.log('err', err)\n } else {\n //console.log('success')\n }\n }\n )\n}\n"],"names":["const","this","arguments","Blob","let","CSG","CAG","i","fs","log","color","index","oscad"],"mappings":"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AAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;GACL,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;GACpE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;IACnE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;GACL,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;GACpE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;GACpE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;GACL,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;IACnE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;IACnE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;GACL,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,EAAE;GACL,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,EAAE;IACJ,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,EAAE;IACJ,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,EAAE;IACJ,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,EAAE;GACL,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE;IACnE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;GACpE,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;IACnE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,EAAE;GACL,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;GACL,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE;IACnE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;GACL,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE;IACnE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,EAAE;GACL,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE;IACnE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;GACpE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;GACL,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;GACpE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;GACpE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,EAAE;GACL,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;GACpE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;GACL,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE;IACnE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;GACpE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;GACpE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;GACpE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;IACpD,CAAC,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;GACpE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;GACL,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;IACnE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE;IACnE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;GACL,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;IACnE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,EAAE,CAAC;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;GACL,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE;IACnE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;GACpE,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE;IACnE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;GACpE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;GACpE,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;GACL,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;IACnE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,EAAE;GACL,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,EAAE;IACJ,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;GACL,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;IACnE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE;IACnE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;GACL,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE;IACnE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;GACL,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;IACnE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;IACJ,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;IACnE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,EAAE;GACL,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;GACL,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;GACpE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,EAAE,CAAC;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,EAAE,CAAC;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE;GACpE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE;IACnE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE;IACnE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;GACL,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;IACnE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;GACL,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE;IACnE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,EAAE;GACL,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;GACpE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;IACnE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;GACpE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,EAAE,CAAC;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;GACpE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;IACnE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;GACpE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;IACJ,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC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"} \ No newline at end of file +{"version":3,"file":null,"sources":["../src/jscad/version.js","../src/jscad/env.js","../src/csg.js","../src/utils/Blob.js","../src/io/writers/CSGToStla.js","../src/io/writers/CSGToStlb.js","../src/io/writers/CSGToAMF.js","../node_modules/xmldom/sax.js","../node_modules/xmldom/dom.js","../node_modules/xmldom/dom-parser.js","../src/io/writers/CSGToX3D.js","../src/io/writers/CAGtoSvg.js","../src/io/writers/CAGToJson.js","../src/io/writers/CAGtoDxf.js","../src/utils/misc.js","../src/io/convertToBlob.js","../src/jscad/jscad-function.js","../src/jscad/includeJscadSync.js","../src/modeling/primitives2d.js","../src/modeling/ops-extrusions.js","../src/modeling/primitives3d.js","../src/modeling/ops-booleans.js","../src/modeling/ops-transformations.js","../src/modeling/color.js","../src/modeling/maths.js","../src/modeling/text.js","../src/modeling/debug.js","../src/jscad/log.js","../src/modeling/index.js","../src/jscad/rebuildSolid.js","../src/utils/getParameterDefinitionsCLI.js","../src/io/formats.js","../src/utils/generateOutputData.js","../src/cli.js"],"sourcesContent":["const json = require('../../package.json')\nexport const version = json.version // TODO/ add version date ?\n","import { version } from './version'\n\nexport default function env () {\n var env = 'OpenJSCAD ' + version\n if (typeof document !== 'undefined') {\n var w = document.defaultView\n env = env + ' [' + w.navigator.userAgent + ']'\n } else {\n if (typeof require === 'function') {\n var os = require('os')\n env = env + ' [' + os.type() + ':' + os.release() + ',' + os.platform() + ':' + os.arch() + ']'\n }\n }\n console.log(env)\n}\n","/*\n\n## IMPORTANT NOTE --- IMPORTANT \nThe master for this file is located at:\nhttps://github.com/joostn/openjscad/tree/gh-pages\nThat is the gh-pages branch of the joostn/openjscad project\nIf contributing from openjscad.org, please do NOT edit this local file but make pull requests against\nabove joostn/gh-pages branch.\n## IMPORTANT NOTE --- IMPORTANT NOTE\n\n\n## License\n\nCopyright (c) 2014 bebbi (elghatta@gmail.com)\nCopyright (c) 2013 Eduard Bespalov (edwbes@gmail.com)\nCopyright (c) 2012 Joost Nieuwenhuijse (joost@newhouse.nl)\nCopyright (c) 2011 Evan Wallace (http://evanw.github.com/csg.js/)\nCopyright (c) 2012 Alexandre Girard (https://github.com/alx)\n\nAll code released under MIT license\n\n## Overview\n\nFor an overview of the CSG process see the original csg.js code:\nhttp://evanw.github.com/csg.js/\n\nCSG operations through BSP trees suffer from one problem: heavy fragmentation\nof polygons. If two CSG solids of n polygons are unified, the resulting solid may have\nin the order of n*n polygons, because each polygon is split by the planes of all other\npolygons. After a few operations the number of polygons explodes.\n\nThis version of CSG.js solves the problem in 3 ways:\n\n1. Every polygon split is recorded in a tree (CSG.PolygonTreeNode). This is a separate\ntree, not to be confused with the CSG tree. If a polygon is split into two parts but in\nthe end both fragments have not been discarded by the CSG operation, we can retrieve\nthe original unsplit polygon from the tree, instead of the two fragments.\n\nThis does not completely solve the issue though: if a polygon is split multiple times\nthe number of fragments depends on the order of subsequent splits, and we might still\nend up with unncessary splits:\nSuppose a polygon is first split into A and B, and then into A1, B1, A2, B2. Suppose B2 is\ndiscarded. We will end up with 2 polygons: A and B1. Depending on the actual split boundaries\nwe could still have joined A and B1 into one polygon. Therefore a second approach is used as well:\n\n2. After CSG operations all coplanar polygon fragments are joined by a retesselating\noperation. See CSG.reTesselated(). Retesselation is done through a\nlinear sweep over the polygon surface. The sweep line passes over the y coordinates\nof all vertices in the polygon. Polygons are split at each sweep line, and the fragments\nare joined horizontally and vertically into larger polygons (making sure that we\nwill end up with convex polygons).\nThis still doesn't solve the problem completely: due to floating point imprecisions\nwe may end up with small gaps between polygons, and polygons may not be exactly coplanar\nanymore, and as a result the retesselation algorithm may fail to join those polygons.\nTherefore:\n\n3. A canonicalization algorithm is implemented: it looks for vertices that have\napproximately the same coordinates (with a certain tolerance, say 1e-5) and replaces\nthem with the same vertex. If polygons share a vertex they will actually point to the\nsame CSG.Vertex instance. The same is done for polygon planes. See CSG.canonicalized().\n\n\nPerformance improvements to the original CSG.js:\n\nReplaced the flip() and invert() methods by flipped() and inverted() which don't\nmodify the source object. This allows to get rid of all clone() calls, so that\nmultiple polygons can refer to the same CSG.Plane instance etc.\n\nThe original union() used an extra invert(), clipTo(), invert() sequence just to remove the\ncoplanar front faces from b; this is now combined in a single b.clipTo(a, true) call.\n\nDetection whether a polygon is in front or in back of a plane: for each polygon\nwe are caching the coordinates of the bounding sphere. If the bounding sphere is\nin front or in back of the plane we don't have to check the individual vertices\nanymore.\n\n\nOther additions to the original CSG.js:\n\nCSG.Vector class has been renamed into CSG.Vector3D\n\nClasses for 3D lines, 2D vectors, 2D lines, and methods to find the intersection of\na line and a plane etc.\n\nTransformations: CSG.transform(), CSG.translate(), CSG.rotate(), CSG.scale()\n\nExpanding or contracting a solid: CSG.expand() and CSG.contract(). Creates nice\nsmooth corners.\n\nThe vertex normal has been removed since it complicates retesselation. It's not needed\nfor solid CAD anyway.\n\n*/\n\n var _CSGDEBUG = false;\n\n function fnNumberSort(a, b) {\n return a - b;\n }\n\n // # class CSG\n // Holds a binary space partition tree representing a 3D solid. Two solids can\n // be combined using the `union()`, `subtract()`, and `intersect()` methods.\n var CSG = function() {\n this.polygons = [];\n this.properties = new CSG.Properties();\n this.isCanonicalized = true;\n this.isRetesselated = true;\n };\n\n CSG.defaultResolution2D = 32;\n CSG.defaultResolution3D = 12;\n\n // Construct a CSG solid from a list of `CSG.Polygon` instances.\n CSG.fromPolygons = function(polygons) {\n var csg = new CSG();\n csg.polygons = polygons;\n csg.isCanonicalized = false;\n csg.isRetesselated = false;\n return csg;\n };\n\n // Construct a CSG solid from generated slices.\n // Look at CSG.Polygon.prototype.solidFromSlices for details\n CSG.fromSlices = function(options) {\n return (new CSG.Polygon.createFromPoints([\n [0, 0, 0],\n [1, 0, 0],\n [1, 1, 0],\n [0, 1, 0]\n ])).solidFromSlices(options);\n };\n\n // create from an untyped object with identical property names:\n CSG.fromObject = function(obj) {\n var polygons = obj.polygons.map(function(p) {\n return CSG.Polygon.fromObject(p);\n });\n var csg = CSG.fromPolygons(polygons);\n csg.isCanonicalized = obj.isCanonicalized;\n csg.isRetesselated = obj.isRetesselated;\n return csg;\n };\n\n // Reconstruct a CSG from the output of toCompactBinary()\n CSG.fromCompactBinary = function(bin) {\n if (bin['class'] != \"CSG\") throw new Error(\"Not a CSG\");\n var planes = [],\n planeData = bin.planeData,\n numplanes = planeData.length / 4,\n arrayindex = 0,\n x, y, z, w, normal, plane;\n for (var planeindex = 0; planeindex < numplanes; planeindex++) {\n x = planeData[arrayindex++];\n y = planeData[arrayindex++];\n z = planeData[arrayindex++];\n w = planeData[arrayindex++];\n normal = CSG.Vector3D.Create(x, y, z);\n plane = new CSG.Plane(normal, w);\n planes.push(plane);\n }\n\n var vertices = [],\n vertexData = bin.vertexData,\n numvertices = vertexData.length / 3,\n pos, vertex;\n arrayindex = 0;\n for (var vertexindex = 0; vertexindex < numvertices; vertexindex++) {\n x = vertexData[arrayindex++];\n y = vertexData[arrayindex++];\n z = vertexData[arrayindex++];\n pos = CSG.Vector3D.Create(x, y, z);\n vertex = new CSG.Vertex(pos);\n vertices.push(vertex);\n }\n\n var shareds = bin.shared.map(function(shared) {\n return CSG.Polygon.Shared.fromObject(shared);\n });\n\n var polygons = [],\n numpolygons = bin.numPolygons,\n numVerticesPerPolygon = bin.numVerticesPerPolygon,\n polygonVertices = bin.polygonVertices,\n polygonPlaneIndexes = bin.polygonPlaneIndexes,\n polygonSharedIndexes = bin.polygonSharedIndexes,\n numpolygonvertices, polygonvertices, shared, polygon; //already defined plane,\n arrayindex = 0;\n for (var polygonindex = 0; polygonindex < numpolygons; polygonindex++) {\n numpolygonvertices = numVerticesPerPolygon[polygonindex];\n polygonvertices = [];\n for (var i = 0; i < numpolygonvertices; i++) {\n polygonvertices.push(vertices[polygonVertices[arrayindex++]]);\n }\n plane = planes[polygonPlaneIndexes[polygonindex]];\n shared = shareds[polygonSharedIndexes[polygonindex]];\n polygon = new CSG.Polygon(polygonvertices, shared, plane);\n polygons.push(polygon);\n }\n var csg = CSG.fromPolygons(polygons);\n csg.isCanonicalized = true;\n csg.isRetesselated = true;\n return csg;\n };\n\n CSG.prototype = {\n toPolygons: function() {\n return this.polygons;\n },\n\n // Return a new CSG solid representing space in either this solid or in the\n // solid `csg`. Neither this solid nor the solid `csg` are modified.\n //\n // A.union(B)\n //\n // +-------+ +-------+\n // | | | |\n // | A | | |\n // | +--+----+ = | +----+\n // +----+--+ | +----+ |\n // | B | | |\n // | | | |\n // +-------+ +-------+\n //\n union: function(csg) {\n var csgs;\n if (csg instanceof Array) {\n csgs = csg.slice(0);\n csgs.push(this);\n } else {\n csgs = [this, csg];\n }\n\n // combine csg pairs in a way that forms a balanced binary tree pattern\n for (var i = 1; i < csgs.length; i += 2) {\n csgs.push(csgs[i-1].unionSub(csgs[i]));\n }\n\n return csgs[i - 1].reTesselated().canonicalized();\n },\n\n unionSub: function(csg, retesselate, canonicalize) {\n if (!this.mayOverlap(csg)) {\n return this.unionForNonIntersecting(csg);\n } else {\n var a = new CSG.Tree(this.polygons);\n var b = new CSG.Tree(csg.polygons);\n a.clipTo(b, false);\n\n // b.clipTo(a, true); // ERROR: this doesn't work\n b.clipTo(a);\n b.invert();\n b.clipTo(a);\n b.invert();\n\n var newpolygons = a.allPolygons().concat(b.allPolygons());\n var result = CSG.fromPolygons(newpolygons);\n result.properties = this.properties._merge(csg.properties);\n if (retesselate) result = result.reTesselated();\n if (canonicalize) result = result.canonicalized();\n return result;\n }\n },\n\n // Like union, but when we know that the two solids are not intersecting\n // Do not use if you are not completely sure that the solids do not intersect!\n unionForNonIntersecting: function(csg) {\n var newpolygons = this.polygons.concat(csg.polygons);\n var result = CSG.fromPolygons(newpolygons);\n result.properties = this.properties._merge(csg.properties);\n result.isCanonicalized = this.isCanonicalized && csg.isCanonicalized;\n result.isRetesselated = this.isRetesselated && csg.isRetesselated;\n return result;\n },\n\n // Return a new CSG solid representing space in this solid but not in the\n // solid `csg`. Neither this solid nor the solid `csg` are modified.\n //\n // A.subtract(B)\n //\n // +-------+ +-------+\n // | | | |\n // | A | | |\n // | +--+----+ = | +--+\n // +----+--+ | +----+\n // | B |\n // | |\n // +-------+\n //\n subtract: function(csg) {\n var csgs;\n if (csg instanceof Array) {\n csgs = csg;\n } else {\n csgs = [csg];\n }\n var result = this;\n for (var i = 0; i < csgs.length; i++) {\n var islast = (i == (csgs.length - 1));\n result = result.subtractSub(csgs[i], islast, islast);\n }\n return result;\n },\n\n subtractSub: function(csg, retesselate, canonicalize) {\n var a = new CSG.Tree(this.polygons);\n var b = new CSG.Tree(csg.polygons);\n a.invert();\n a.clipTo(b);\n b.clipTo(a, true);\n a.addPolygons(b.allPolygons());\n a.invert();\n var result = CSG.fromPolygons(a.allPolygons());\n result.properties = this.properties._merge(csg.properties);\n if (retesselate) result = result.reTesselated();\n if (canonicalize) result = result.canonicalized();\n return result;\n },\n\n // Return a new CSG solid representing space both this solid and in the\n // solid `csg`. Neither this solid nor the solid `csg` are modified.\n //\n // A.intersect(B)\n //\n // +-------+\n // | |\n // | A |\n // | +--+----+ = +--+\n // +----+--+ | +--+\n // | B |\n // | |\n // +-------+\n //\n intersect: function(csg) {\n var csgs;\n if (csg instanceof Array) {\n csgs = csg;\n } else {\n csgs = [csg];\n }\n var result = this;\n for (var i = 0; i < csgs.length; i++) {\n var islast = (i == (csgs.length - 1));\n result = result.intersectSub(csgs[i], islast, islast);\n }\n return result;\n },\n\n intersectSub: function(csg, retesselate, canonicalize) {\n var a = new CSG.Tree(this.polygons);\n var b = new CSG.Tree(csg.polygons);\n a.invert();\n b.clipTo(a);\n b.invert();\n a.clipTo(b);\n b.clipTo(a);\n a.addPolygons(b.allPolygons());\n a.invert();\n var result = CSG.fromPolygons(a.allPolygons());\n result.properties = this.properties._merge(csg.properties);\n if (retesselate) result = result.reTesselated();\n if (canonicalize) result = result.canonicalized();\n return result;\n },\n\n // Return a new CSG solid with solid and empty space switched. This solid is\n // not modified.\n invert: function() {\n var flippedpolygons = this.polygons.map(function(p) {\n return p.flipped();\n });\n return CSG.fromPolygons(flippedpolygons);\n // TODO: flip properties?\n },\n\n // Affine transformation of CSG object. Returns a new CSG object\n transform1: function(matrix4x4) {\n var newpolygons = this.polygons.map(function(p) {\n return p.transform(matrix4x4);\n });\n var result = CSG.fromPolygons(newpolygons);\n result.properties = this.properties._transform(matrix4x4);\n result.isRetesselated = this.isRetesselated;\n return result;\n },\n\n transform: function(matrix4x4) {\n var ismirror = matrix4x4.isMirroring();\n var transformedvertices = {};\n var transformedplanes = {};\n var newpolygons = this.polygons.map(function(p) {\n var newplane;\n var plane = p.plane;\n var planetag = plane.getTag();\n if (planetag in transformedplanes) {\n newplane = transformedplanes[planetag];\n } else {\n newplane = plane.transform(matrix4x4);\n transformedplanes[planetag] = newplane;\n }\n var newvertices = p.vertices.map(function(v) {\n var newvertex;\n var vertextag = v.getTag();\n if (vertextag in transformedvertices) {\n newvertex = transformedvertices[vertextag];\n } else {\n newvertex = v.transform(matrix4x4);\n transformedvertices[vertextag] = newvertex;\n }\n return newvertex;\n });\n if (ismirror) newvertices.reverse();\n return new CSG.Polygon(newvertices, p.shared, newplane);\n });\n var result = CSG.fromPolygons(newpolygons);\n result.properties = this.properties._transform(matrix4x4);\n result.isRetesselated = this.isRetesselated;\n result.isCanonicalized = this.isCanonicalized;\n return result;\n },\n\n toString: function() {\n var result = \"CSG solid:\\n\";\n this.polygons.map(function(p) {\n result += p.toString();\n });\n return result;\n },\n\n // Expand the solid\n // resolution: number of points per 360 degree for the rounded corners\n expand: function(radius, resolution) {\n var result = this.expandedShell(radius, resolution, true);\n result = result.reTesselated();\n result.properties = this.properties; // keep original properties\n return result;\n },\n\n // Contract the solid\n // resolution: number of points per 360 degree for the rounded corners\n contract: function(radius, resolution) {\n var expandedshell = this.expandedShell(radius, resolution, false);\n var result = this.subtract(expandedshell);\n result = result.reTesselated();\n result.properties = this.properties; // keep original properties\n return result;\n },\n\n // cut the solid at a plane, and stretch the cross-section found along plane normal\n stretchAtPlane: function(normal, point, length) {\n var plane = CSG.Plane.fromNormalAndPoint(normal, point);\n var onb = new CSG.OrthoNormalBasis(plane);\n var crosssect = this.sectionCut(onb);\n var midpiece = crosssect.extrudeInOrthonormalBasis(onb, length);\n var piece1 = this.cutByPlane(plane);\n var piece2 = this.cutByPlane(plane.flipped());\n var result = piece1.union([midpiece, piece2.translate(plane.normal.times(length))]);\n return result;\n },\n\n\n // Create the expanded shell of the solid:\n // All faces are extruded to get a thickness of 2*radius\n // Cylinders are constructed around every side\n // Spheres are placed on every vertex\n // unionWithThis: if true, the resulting solid will be united with 'this' solid;\n // the result is a true expansion of the solid\n // If false, returns only the shell\n expandedShell: function(radius, resolution, unionWithThis) {\n var csg = this.reTesselated();\n var result;\n if (unionWithThis) {\n result = csg;\n } else {\n result = new CSG();\n }\n\n // first extrude all polygons:\n csg.polygons.map(function(polygon) {\n var extrudevector = polygon.plane.normal.unit().times(2 * radius);\n var translatedpolygon = polygon.translate(extrudevector.times(-0.5));\n var extrudedface = translatedpolygon.extrude(extrudevector);\n result = result.unionSub(extrudedface, false, false);\n });\n\n // Make a list of all unique vertex pairs (i.e. all sides of the solid)\n // For each vertex pair we collect the following:\n // v1: first coordinate\n // v2: second coordinate\n // planenormals: array of normal vectors of all planes touching this side\n var vertexpairs = {}; // map of 'vertex pair tag' to {v1, v2, planenormals}\n csg.polygons.map(function(polygon) {\n var numvertices = polygon.vertices.length;\n var prevvertex = polygon.vertices[numvertices - 1];\n var prevvertextag = prevvertex.getTag();\n for (var i = 0; i < numvertices; i++) {\n var vertex = polygon.vertices[i];\n var vertextag = vertex.getTag();\n var vertextagpair;\n if (vertextag < prevvertextag) {\n vertextagpair = vertextag + \"-\" + prevvertextag;\n } else {\n vertextagpair = prevvertextag + \"-\" + vertextag;\n }\n var obj;\n if (vertextagpair in vertexpairs) {\n obj = vertexpairs[vertextagpair];\n } else {\n obj = {\n v1: prevvertex,\n v2: vertex,\n planenormals: []\n };\n vertexpairs[vertextagpair] = obj;\n }\n obj.planenormals.push(polygon.plane.normal);\n\n prevvertextag = vertextag;\n prevvertex = vertex;\n }\n });\n\n // now construct a cylinder on every side\n // The cylinder is always an approximation of a true cylinder: it will have polygons\n // around the sides. We will make sure though that the cylinder will have an edge at every\n // face that touches this side. This ensures that we will get a smooth fill even\n // if two edges are at, say, 10 degrees and the resolution is low.\n // Note: the result is not retesselated yet but it really should be!\n for (var vertextagpair in vertexpairs) {\n var vertexpair = vertexpairs[vertextagpair],\n startpoint = vertexpair.v1.pos,\n endpoint = vertexpair.v2.pos,\n // our x,y and z vectors:\n zbase = endpoint.minus(startpoint).unit(),\n xbase = vertexpair.planenormals[0].unit(),\n ybase = xbase.cross(zbase),\n\n // make a list of angles that the cylinder should traverse:\n angles = [];\n\n // first of all equally spaced around the cylinder:\n for (var i = 0; i < resolution; i++) {\n angles.push(i * Math.PI * 2 / resolution);\n }\n\n // and also at every normal of all touching planes:\n for (var i = 0, iMax = vertexpair.planenormals.length; i < iMax; i++) {\n var planenormal = vertexpair.planenormals[i],\n si = ybase.dot(planenormal),\n co = xbase.dot(planenormal),\n angle = Math.atan2(si, co);\n\n if (angle < 0) angle += Math.PI * 2;\n angles.push(angle);\n angle = Math.atan2(-si, -co);\n if (angle < 0) angle += Math.PI * 2;\n angles.push(angle);\n }\n\n // this will result in some duplicate angles but we will get rid of those later.\n // Sort:\n angles = angles.sort(fnNumberSort);\n\n // Now construct the cylinder by traversing all angles:\n var numangles = angles.length,\n prevp1, prevp2,\n startfacevertices = [],\n endfacevertices = [],\n polygons = [];\n for (var i = -1; i < numangles; i++) {\n var angle = angles[(i < 0) ? (i + numangles) : i],\n si = Math.sin(angle),\n co = Math.cos(angle),\n p = xbase.times(co * radius).plus(ybase.times(si * radius)),\n p1 = startpoint.plus(p),\n p2 = endpoint.plus(p),\n skip = false;\n if (i >= 0) {\n if (p1.distanceTo(prevp1) < 1e-5) {\n skip = true;\n }\n }\n if (!skip) {\n if (i >= 0) {\n startfacevertices.push(new CSG.Vertex(p1));\n endfacevertices.push(new CSG.Vertex(p2));\n var polygonvertices = [\n new CSG.Vertex(prevp2),\n new CSG.Vertex(p2),\n new CSG.Vertex(p1),\n new CSG.Vertex(prevp1)\n ];\n var polygon = new CSG.Polygon(polygonvertices);\n polygons.push(polygon);\n }\n prevp1 = p1;\n prevp2 = p2;\n }\n }\n endfacevertices.reverse();\n polygons.push(new CSG.Polygon(startfacevertices));\n polygons.push(new CSG.Polygon(endfacevertices));\n var cylinder = CSG.fromPolygons(polygons);\n result = result.unionSub(cylinder, false, false);\n }\n\n // make a list of all unique vertices\n // For each vertex we also collect the list of normals of the planes touching the vertices\n var vertexmap = {};\n csg.polygons.map(function(polygon) {\n polygon.vertices.map(function(vertex) {\n var vertextag = vertex.getTag();\n var obj;\n if (vertextag in vertexmap) {\n obj = vertexmap[vertextag];\n } else {\n obj = {\n pos: vertex.pos,\n normals: []\n };\n vertexmap[vertextag] = obj;\n }\n obj.normals.push(polygon.plane.normal);\n });\n });\n\n // and build spheres at each vertex\n // We will try to set the x and z axis to the normals of 2 planes\n // This will ensure that our sphere tesselation somewhat matches 2 planes\n for (var vertextag in vertexmap) {\n var vertexobj = vertexmap[vertextag];\n // use the first normal to be the x axis of our sphere:\n var xaxis = vertexobj.normals[0].unit();\n // and find a suitable z axis. We will use the normal which is most perpendicular to the x axis:\n var bestzaxis = null;\n var bestzaxisorthogonality = 0;\n for (var i = 1; i < vertexobj.normals.length; i++) {\n var normal = vertexobj.normals[i].unit();\n var cross = xaxis.cross(normal);\n var crosslength = cross.length();\n if (crosslength > 0.05) {\n if (crosslength > bestzaxisorthogonality) {\n bestzaxisorthogonality = crosslength;\n bestzaxis = normal;\n }\n }\n }\n if (!bestzaxis) {\n bestzaxis = xaxis.randomNonParallelVector();\n }\n var yaxis = xaxis.cross(bestzaxis).unit();\n var zaxis = yaxis.cross(xaxis);\n var sphere = CSG.sphere({\n center: vertexobj.pos,\n radius: radius,\n resolution: resolution,\n axes: [xaxis, yaxis, zaxis]\n });\n result = result.unionSub(sphere, false, false);\n }\n\n return result;\n },\n\n canonicalized: function() {\n if (this.isCanonicalized) {\n return this;\n } else {\n var factory = new CSG.fuzzyCSGFactory();\n var result = factory.getCSG(this);\n result.isCanonicalized = true;\n result.isRetesselated = this.isRetesselated;\n result.properties = this.properties; // keep original properties\n return result;\n }\n },\n\n reTesselated: function() {\n if (this.isRetesselated) {\n return this;\n } else {\n var csg = this;\n var polygonsPerPlane = {};\n var isCanonicalized = csg.isCanonicalized;\n var fuzzyfactory = new CSG.fuzzyCSGFactory();\n csg.polygons.map(function(polygon) {\n var plane = polygon.plane;\n var shared = polygon.shared;\n if (!isCanonicalized) {\n // in order to identify to polygons having the same plane, we need to canonicalize the planes\n // We don't have to do a full canonizalization (including vertices), to save time only do the planes and the shared data:\n plane = fuzzyfactory.getPlane(plane);\n shared = fuzzyfactory.getPolygonShared(shared);\n }\n var tag = plane.getTag() + \"/\" + shared.getTag();\n if (!(tag in polygonsPerPlane)) {\n polygonsPerPlane[tag] = [polygon];\n } else {\n polygonsPerPlane[tag].push(polygon);\n }\n });\n var destpolygons = [];\n for (var planetag in polygonsPerPlane) {\n var sourcepolygons = polygonsPerPlane[planetag];\n if (sourcepolygons.length < 2) {\n destpolygons = destpolygons.concat(sourcepolygons);\n } else {\n var retesselayedpolygons = [];\n CSG.reTesselateCoplanarPolygons(sourcepolygons, retesselayedpolygons);\n destpolygons = destpolygons.concat(retesselayedpolygons);\n }\n }\n var result = CSG.fromPolygons(destpolygons);\n result.isRetesselated = true;\n // result = result.canonicalized();\n result.properties = this.properties; // keep original properties\n return result;\n }\n },\n\n // returns an array of two CSG.Vector3Ds (minimum coordinates and maximum coordinates)\n getBounds: function() {\n if (!this.cachedBoundingBox) {\n var minpoint = new CSG.Vector3D(0, 0, 0);\n var maxpoint = new CSG.Vector3D(0, 0, 0);\n var polygons = this.polygons;\n var numpolygons = polygons.length;\n for (var i = 0; i < numpolygons; i++) {\n var polygon = polygons[i];\n var bounds = polygon.boundingBox();\n if (i === 0) {\n minpoint = bounds[0];\n maxpoint = bounds[1];\n } else {\n minpoint = minpoint.min(bounds[0]);\n maxpoint = maxpoint.max(bounds[1]);\n }\n }\n this.cachedBoundingBox = [minpoint, maxpoint];\n }\n return this.cachedBoundingBox;\n },\n\n // returns true if there is a possibility that the two solids overlap\n // returns false if we can be sure that they do not overlap\n mayOverlap: function(csg) {\n if ((this.polygons.length === 0) || (csg.polygons.length === 0)) {\n return false;\n } else {\n var mybounds = this.getBounds();\n var otherbounds = csg.getBounds();\n if (mybounds[1].x < otherbounds[0].x) return false;\n if (mybounds[0].x > otherbounds[1].x) return false;\n if (mybounds[1].y < otherbounds[0].y) return false;\n if (mybounds[0].y > otherbounds[1].y) return false;\n if (mybounds[1].z < otherbounds[0].z) return false;\n if (mybounds[0].z > otherbounds[1].z) return false;\n return true;\n }\n },\n\n // Cut the solid by a plane. Returns the solid on the back side of the plane\n cutByPlane: function(plane) {\n if (this.polygons.length === 0) {\n return new CSG();\n }\n // Ideally we would like to do an intersection with a polygon of inifinite size\n // but this is not supported by our implementation. As a workaround, we will create\n // a cube, with one face on the plane, and a size larger enough so that the entire\n // solid fits in the cube.\n // find the max distance of any vertex to the center of the plane:\n var planecenter = plane.normal.times(plane.w);\n var maxdistance = 0;\n this.polygons.map(function(polygon) {\n polygon.vertices.map(function(vertex) {\n var distance = vertex.pos.distanceToSquared(planecenter);\n if (distance > maxdistance) maxdistance = distance;\n });\n });\n maxdistance = Math.sqrt(maxdistance);\n maxdistance *= 1.01; // make sure it's really larger\n // Now build a polygon on the plane, at any point farther than maxdistance from the plane center:\n var vertices = [];\n var orthobasis = new CSG.OrthoNormalBasis(plane);\n vertices.push(new CSG.Vertex(orthobasis.to3D(new CSG.Vector2D(maxdistance, -maxdistance))));\n vertices.push(new CSG.Vertex(orthobasis.to3D(new CSG.Vector2D(-maxdistance, -maxdistance))));\n vertices.push(new CSG.Vertex(orthobasis.to3D(new CSG.Vector2D(-maxdistance, maxdistance))));\n vertices.push(new CSG.Vertex(orthobasis.to3D(new CSG.Vector2D(maxdistance, maxdistance))));\n var polygon = new CSG.Polygon(vertices, null, plane.flipped());\n\n // and extrude the polygon into a cube, backwards of the plane:\n var cube = polygon.extrude(plane.normal.times(-maxdistance));\n\n // Now we can do the intersection:\n var result = this.intersect(cube);\n result.properties = this.properties; // keep original properties\n return result;\n },\n\n // Connect a solid to another solid, such that two CSG.Connectors become connected\n // myConnector: a CSG.Connector of this solid\n // otherConnector: a CSG.Connector to which myConnector should be connected\n // mirror: false: the 'axis' vectors of the connectors should point in the same direction\n // true: the 'axis' vectors of the connectors should point in opposite direction\n // normalrotation: degrees of rotation between the 'normal' vectors of the two\n // connectors\n connectTo: function(myConnector, otherConnector, mirror, normalrotation) {\n var matrix = myConnector.getTransformationTo(otherConnector, mirror, normalrotation);\n return this.transform(matrix);\n },\n\n // set the .shared property of all polygons\n // Returns a new CSG solid, the original is unmodified!\n setShared: function(shared) {\n var polygons = this.polygons.map(function(p) {\n return new CSG.Polygon(p.vertices, shared, p.plane);\n });\n var result = CSG.fromPolygons(polygons);\n result.properties = this.properties; // keep original properties\n result.isRetesselated = this.isRetesselated;\n result.isCanonicalized = this.isCanonicalized;\n return result;\n },\n\n setColor: function(args) {\n var newshared = CSG.Polygon.Shared.fromColor.apply(this, arguments);\n return this.setShared(newshared);\n },\n\n toCompactBinary: function() {\n var csg = this.canonicalized(),\n numpolygons = csg.polygons.length,\n numpolygonvertices = 0,\n numvertices = 0,\n vertexmap = {},\n vertices = [],\n numplanes = 0,\n planemap = {},\n polygonindex = 0,\n planes = [],\n shareds = [],\n sharedmap = {},\n numshared = 0;\n // for (var i = 0, iMax = csg.polygons.length; i < iMax; i++) {\n // var p = csg.polygons[i];\n // for (var j = 0, jMax = p.length; j < jMax; j++) {\n // ++numpolygonvertices;\n // var vertextag = p[j].getTag();\n // if(!(vertextag in vertexmap)) {\n // vertexmap[vertextag] = numvertices++;\n // vertices.push(p[j]);\n // }\n // }\n csg.polygons.map(function(p) {\n p.vertices.map(function(v) {\n ++numpolygonvertices;\n var vertextag = v.getTag();\n if (!(vertextag in vertexmap)) {\n vertexmap[vertextag] = numvertices++;\n vertices.push(v);\n }\n });\n\n var planetag = p.plane.getTag();\n if (!(planetag in planemap)) {\n planemap[planetag] = numplanes++;\n planes.push(p.plane);\n }\n var sharedtag = p.shared.getTag();\n if (!(sharedtag in sharedmap)) {\n sharedmap[sharedtag] = numshared++;\n shareds.push(p.shared);\n }\n });\n var numVerticesPerPolygon = new Uint32Array(numpolygons),\n polygonSharedIndexes = new Uint32Array(numpolygons),\n polygonVertices = new Uint32Array(numpolygonvertices),\n polygonPlaneIndexes = new Uint32Array(numpolygons),\n vertexData = new Float64Array(numvertices * 3),\n planeData = new Float64Array(numplanes * 4),\n polygonVerticesIndex = 0;\n for (var polygonindex = 0; polygonindex < numpolygons; ++polygonindex) {\n var p = csg.polygons[polygonindex];\n numVerticesPerPolygon[polygonindex] = p.vertices.length;\n p.vertices.map(function(v) {\n var vertextag = v.getTag();\n var vertexindex = vertexmap[vertextag];\n polygonVertices[polygonVerticesIndex++] = vertexindex;\n });\n var planetag = p.plane.getTag();\n var planeindex = planemap[planetag];\n polygonPlaneIndexes[polygonindex] = planeindex;\n var sharedtag = p.shared.getTag();\n var sharedindex = sharedmap[sharedtag];\n polygonSharedIndexes[polygonindex] = sharedindex;\n }\n var verticesArrayIndex = 0;\n vertices.map(function(v) {\n var pos = v.pos;\n vertexData[verticesArrayIndex++] = pos._x;\n vertexData[verticesArrayIndex++] = pos._y;\n vertexData[verticesArrayIndex++] = pos._z;\n });\n var planesArrayIndex = 0;\n planes.map(function(p) {\n var normal = p.normal;\n planeData[planesArrayIndex++] = normal._x;\n planeData[planesArrayIndex++] = normal._y;\n planeData[planesArrayIndex++] = normal._z;\n planeData[planesArrayIndex++] = p.w;\n });\n var result = {\n \"class\": \"CSG\",\n numPolygons: numpolygons,\n numVerticesPerPolygon: numVerticesPerPolygon,\n polygonPlaneIndexes: polygonPlaneIndexes,\n polygonSharedIndexes: polygonSharedIndexes,\n polygonVertices: polygonVertices,\n vertexData: vertexData,\n planeData: planeData,\n shared: shareds\n };\n return result;\n },\n\n // For debugging\n // Creates a new solid with a tiny cube at every vertex of the source solid\n toPointCloud: function(cuberadius) {\n var csg = this.reTesselated();\n\n var result = new CSG();\n\n // make a list of all unique vertices\n // For each vertex we also collect the list of normals of the planes touching the vertices\n var vertexmap = {};\n csg.polygons.map(function(polygon) {\n polygon.vertices.map(function(vertex) {\n vertexmap[vertex.getTag()] = vertex.pos;\n });\n });\n\n for (var vertextag in vertexmap) {\n var pos = vertexmap[vertextag];\n var cube = CSG.cube({\n center: pos,\n radius: cuberadius\n });\n result = result.unionSub(cube, false, false);\n }\n result = result.reTesselated();\n return result;\n },\n\n // Get the transformation that transforms this CSG such that it is lying on the z=0 plane,\n // as flat as possible (i.e. the least z-height).\n // So that it is in an orientation suitable for CNC milling\n getTransformationAndInverseTransformationToFlatLying: function() {\n if (this.polygons.length === 0) {\n var m = new CSG.Matrix4x4(); // unity\n return [m,m];\n } else {\n // get a list of unique planes in the CSG:\n var csg = this.canonicalized();\n var planemap = {};\n csg.polygons.map(function(polygon) {\n planemap[polygon.plane.getTag()] = polygon.plane;\n });\n // try each plane in the CSG and find the plane that, when we align it flat onto z=0,\n // gives the least height in z-direction.\n // If two planes give the same height, pick the plane that originally had a normal closest\n // to [0,0,-1].\n var xvector = new CSG.Vector3D(1, 0, 0);\n var yvector = new CSG.Vector3D(0, 1, 0);\n var zvector = new CSG.Vector3D(0, 0, 1);\n var z0connectorx = new CSG.Connector([0, 0, 0], [0, 0, -1], xvector);\n var z0connectory = new CSG.Connector([0, 0, 0], [0, 0, -1], yvector);\n var isfirst = true;\n var minheight = 0;\n var maxdotz = 0;\n var besttransformation, bestinversetransformation;\n for (var planetag in planemap) {\n var plane = planemap[planetag];\n var pointonplane = plane.normal.times(plane.w);\n var transformation, inversetransformation;\n // We need a normal vecrtor for the transformation\n // determine which is more perpendicular to the plane normal: x or y?\n // we will align this as much as possible to the x or y axis vector\n var xorthogonality = plane.normal.cross(xvector).length();\n var yorthogonality = plane.normal.cross(yvector).length();\n if (xorthogonality > yorthogonality) {\n // x is better:\n var planeconnector = new CSG.Connector(pointonplane, plane.normal, xvector);\n transformation = planeconnector.getTransformationTo(z0connectorx, false, 0);\n inversetransformation = z0connectorx.getTransformationTo(planeconnector, false, 0);\n } else {\n // y is better:\n var planeconnector = new CSG.Connector(pointonplane, plane.normal, yvector);\n transformation = planeconnector.getTransformationTo(z0connectory, false, 0);\n inversetransformation = z0connectory.getTransformationTo(planeconnector, false, 0);\n }\n var transformedcsg = csg.transform(transformation);\n var dotz = -plane.normal.dot(zvector);\n var bounds = transformedcsg.getBounds();\n var zheight = bounds[1].z - bounds[0].z;\n var isbetter = isfirst;\n if (!isbetter) {\n if (zheight < minheight) {\n isbetter = true;\n } else if (zheight == minheight) {\n if (dotz > maxdotz) isbetter = true;\n }\n }\n if (isbetter) {\n // translate the transformation around the z-axis and onto the z plane:\n var translation = new CSG.Vector3D([-0.5 * (bounds[1].x + bounds[0].x), -0.5 * (bounds[1].y + bounds[0].y), -bounds[0].z]);\n transformation = transformation.multiply(CSG.Matrix4x4.translation(translation));\n inversetransformation = CSG.Matrix4x4.translation(translation.negated()).multiply(inversetransformation);\n minheight = zheight;\n maxdotz = dotz;\n besttransformation = transformation;\n bestinversetransformation = inversetransformation;\n }\n isfirst = false;\n }\n return [besttransformation, bestinversetransformation];\n }\n },\n\n getTransformationToFlatLying: function() {\n var result = this.getTransformationAndInverseTransformationToFlatLying();\n return result[0];\n },\n\n lieFlat: function() {\n var transformation = this.getTransformationToFlatLying();\n return this.transform(transformation);\n },\n\n // project the 3D CSG onto a plane\n // This returns a 2D CAG with the 'shadow' shape of the 3D solid when projected onto the\n // plane represented by the orthonormal basis\n projectToOrthoNormalBasis: function(orthobasis) {\n var EPS = 1e-5;\n var cags = [];\n this.polygons.filter(function(p) {\n // only return polys in plane, others may disturb result\n return p.plane.normal.minus(orthobasis.plane.normal).lengthSquared() < EPS*EPS;\n })\n .map(function(polygon) {\n var cag = polygon.projectToOrthoNormalBasis(orthobasis);\n if (cag.sides.length > 0) {\n cags.push(cag);\n }\n });\n var result = new CAG().union(cags);\n return result;\n },\n\n sectionCut: function(orthobasis) {\n var EPS = 1e-5;\n var plane1 = orthobasis.plane;\n var plane2 = orthobasis.plane.flipped();\n plane1 = new CSG.Plane(plane1.normal, plane1.w);\n plane2 = new CSG.Plane(plane2.normal, plane2.w + 5*EPS);\n var cut3d = this.cutByPlane(plane1);\n cut3d = cut3d.cutByPlane(plane2);\n return cut3d.projectToOrthoNormalBasis(orthobasis);\n },\n\n /*\n fixTJunctions:\n\n Suppose we have two polygons ACDB and EDGF:\n\n A-----B\n | |\n | E--F\n | | |\n C-----D--G\n\n Note that vertex E forms a T-junction on the side BD. In this case some STL slicers will complain\n that the solid is not watertight. This is because the watertightness check is done by checking if\n each side DE is matched by another side ED.\n\n This function will return a new solid with ACDB replaced by ACDEB\n\n Note that this can create polygons that are slightly non-convex (due to rounding errors). Therefore the result should\n not be used for further CSG operations!\n */\n fixTJunctions: function() {\n var csg = this.canonicalized();\n var sidemap = {};\n for (var polygonindex = 0; polygonindex < csg.polygons.length; polygonindex++) {\n var polygon = csg.polygons[polygonindex];\n var numvertices = polygon.vertices.length;\n if (numvertices >= 3) // should be true\n {\n var vertex = polygon.vertices[0];\n var vertextag = vertex.getTag();\n for (var vertexindex = 0; vertexindex < numvertices; vertexindex++) {\n var nextvertexindex = vertexindex + 1;\n if (nextvertexindex == numvertices) nextvertexindex = 0;\n var nextvertex = polygon.vertices[nextvertexindex];\n var nextvertextag = nextvertex.getTag();\n var sidetag = vertextag + \"/\" + nextvertextag;\n var reversesidetag = nextvertextag + \"/\" + vertextag;\n if (reversesidetag in sidemap) {\n // this side matches the same side in another polygon. Remove from sidemap:\n var ar = sidemap[reversesidetag];\n ar.splice(-1, 1);\n if (ar.length === 0) {\n delete sidemap[reversesidetag];\n }\n } else {\n var sideobj = {\n vertex0: vertex,\n vertex1: nextvertex,\n polygonindex: polygonindex\n };\n if (!(sidetag in sidemap)) {\n sidemap[sidetag] = [sideobj];\n } else {\n sidemap[sidetag].push(sideobj);\n }\n }\n vertex = nextvertex;\n vertextag = nextvertextag;\n }\n }\n }\n // now sidemap contains 'unmatched' sides\n // i.e. side AB in one polygon does not have a matching side BA in another polygon\n var vertextag2sidestart = {};\n var vertextag2sideend = {};\n var sidestocheck = {};\n var sidemapisempty = true;\n for (var sidetag in sidemap) {\n sidemapisempty = false;\n sidestocheck[sidetag] = true;\n sidemap[sidetag].map(function(sideobj) {\n var starttag = sideobj.vertex0.getTag();\n var endtag = sideobj.vertex1.getTag();\n if (starttag in vertextag2sidestart) {\n vertextag2sidestart[starttag].push(sidetag);\n } else {\n vertextag2sidestart[starttag] = [sidetag];\n }\n if (endtag in vertextag2sideend) {\n vertextag2sideend[endtag].push(sidetag);\n } else {\n vertextag2sideend[endtag] = [sidetag];\n }\n });\n }\n\n if (!sidemapisempty) {\n // make a copy of the polygons array, since we are going to modify it:\n var polygons = csg.polygons.slice(0);\n\n function addSide(vertex0, vertex1, polygonindex) {\n var starttag = vertex0.getTag();\n var endtag = vertex1.getTag();\n if (starttag == endtag) throw new Error(\"Assertion failed\");\n var newsidetag = starttag + \"/\" + endtag;\n var reversesidetag = endtag + \"/\" + starttag;\n if (reversesidetag in sidemap) {\n // we have a matching reverse oriented side.\n // Instead of adding the new side, cancel out the reverse side:\n // console.log(\"addSide(\"+newsidetag+\") has reverse side:\");\n deleteSide(vertex1, vertex0, null);\n return null;\n }\n // console.log(\"addSide(\"+newsidetag+\")\");\n var newsideobj = {\n vertex0: vertex0,\n vertex1: vertex1,\n polygonindex: polygonindex\n };\n if (!(newsidetag in sidemap)) {\n sidemap[newsidetag] = [newsideobj];\n } else {\n sidemap[newsidetag].push(newsideobj);\n }\n if (starttag in vertextag2sidestart) {\n vertextag2sidestart[starttag].push(newsidetag);\n } else {\n vertextag2sidestart[starttag] = [newsidetag];\n }\n if (endtag in vertextag2sideend) {\n vertextag2sideend[endtag].push(newsidetag);\n } else {\n vertextag2sideend[endtag] = [newsidetag];\n }\n return newsidetag;\n }\n\n function deleteSide(vertex0, vertex1, polygonindex) {\n var starttag = vertex0.getTag();\n var endtag = vertex1.getTag();\n var sidetag = starttag + \"/\" + endtag;\n // console.log(\"deleteSide(\"+sidetag+\")\");\n if (!(sidetag in sidemap)) throw new Error(\"Assertion failed\");\n var idx = -1;\n var sideobjs = sidemap[sidetag];\n for (var i = 0; i < sideobjs.length; i++) {\n var sideobj = sideobjs[i];\n if (sideobj.vertex0 != vertex0) continue;\n if (sideobj.vertex1 != vertex1) continue;\n if (polygonindex !== null) {\n if (sideobj.polygonindex != polygonindex) continue;\n }\n idx = i;\n break;\n }\n if (idx < 0) throw new Error(\"Assertion failed\");\n sideobjs.splice(idx, 1);\n if (sideobjs.length === 0) {\n delete sidemap[sidetag];\n }\n idx = vertextag2sidestart[starttag].indexOf(sidetag);\n if (idx < 0) throw new Error(\"Assertion failed\");\n vertextag2sidestart[starttag].splice(idx, 1);\n if (vertextag2sidestart[starttag].length === 0) {\n delete vertextag2sidestart[starttag];\n }\n\n idx = vertextag2sideend[endtag].indexOf(sidetag);\n if (idx < 0) throw new Error(\"Assertion failed\");\n vertextag2sideend[endtag].splice(idx, 1);\n if (vertextag2sideend[endtag].length === 0) {\n delete vertextag2sideend[endtag];\n }\n }\n\n\n while (true) {\n var sidemapisempty = true;\n for (var sidetag in sidemap) {\n sidemapisempty = false;\n sidestocheck[sidetag] = true;\n }\n if (sidemapisempty) break;\n var donesomething = false;\n while (true) {\n var sidetagtocheck = null;\n for (var sidetag in sidestocheck) {\n sidetagtocheck = sidetag;\n break;\n }\n if (sidetagtocheck === null) break; // sidestocheck is empty, we're done!\n var donewithside = true;\n if (sidetagtocheck in sidemap) {\n var sideobjs = sidemap[sidetagtocheck];\n if (sideobjs.length === 0) throw new Error(\"Assertion failed\");\n var sideobj = sideobjs[0];\n for (var directionindex = 0; directionindex < 2; directionindex++) {\n var startvertex = (directionindex === 0) ? sideobj.vertex0 : sideobj.vertex1;\n var endvertex = (directionindex === 0) ? sideobj.vertex1 : sideobj.vertex0;\n var startvertextag = startvertex.getTag();\n var endvertextag = endvertex.getTag();\n var matchingsides = [];\n if (directionindex === 0) {\n if (startvertextag in vertextag2sideend) {\n matchingsides = vertextag2sideend[startvertextag];\n }\n } else {\n if (startvertextag in vertextag2sidestart) {\n matchingsides = vertextag2sidestart[startvertextag];\n }\n }\n for (var matchingsideindex = 0; matchingsideindex < matchingsides.length; matchingsideindex++) {\n var matchingsidetag = matchingsides[matchingsideindex];\n var matchingside = sidemap[matchingsidetag][0];\n var matchingsidestartvertex = (directionindex === 0) ? matchingside.vertex0 : matchingside.vertex1;\n var matchingsideendvertex = (directionindex === 0) ? matchingside.vertex1 : matchingside.vertex0;\n var matchingsidestartvertextag = matchingsidestartvertex.getTag();\n var matchingsideendvertextag = matchingsideendvertex.getTag();\n if (matchingsideendvertextag != startvertextag) throw new Error(\"Assertion failed\");\n if (matchingsidestartvertextag == endvertextag) {\n // matchingside cancels sidetagtocheck\n deleteSide(startvertex, endvertex, null);\n deleteSide(endvertex, startvertex, null);\n donewithside = false;\n directionindex = 2; // skip reverse direction check\n donesomething = true;\n break;\n } else {\n var startpos = startvertex.pos;\n var endpos = endvertex.pos;\n var checkpos = matchingsidestartvertex.pos;\n var direction = checkpos.minus(startpos);\n // Now we need to check if endpos is on the line startpos-checkpos:\n var t = endpos.minus(startpos).dot(direction) / direction.dot(direction);\n if ((t > 0) && (t < 1)) {\n var closestpoint = startpos.plus(direction.times(t));\n var distancesquared = closestpoint.distanceToSquared(endpos);\n if (distancesquared < 1e-10) {\n // Yes it's a t-junction! We need to split matchingside in two:\n var polygonindex = matchingside.polygonindex;\n var polygon = polygons[polygonindex];\n // find the index of startvertextag in polygon:\n var insertionvertextag = matchingside.vertex1.getTag();\n var insertionvertextagindex = -1;\n for (var i = 0; i < polygon.vertices.length; i++) {\n if (polygon.vertices[i].getTag() == insertionvertextag) {\n insertionvertextagindex = i;\n break;\n }\n }\n if (insertionvertextagindex < 0) throw new Error(\"Assertion failed\");\n // split the side by inserting the vertex:\n var newvertices = polygon.vertices.slice(0);\n newvertices.splice(insertionvertextagindex, 0, endvertex);\n var newpolygon = new CSG.Polygon(newvertices, polygon.shared /*polygon.plane*/ );\n\n// FIX\n //calculate plane with differents point\n if(isNaN(newpolygon.plane.w)){\n\n var found = false,\n loop = function(callback){\n newpolygon.vertices.forEach(function(item){\n if(found) return;\n callback(item);\n })\n };\n\n loop(function(a){\n loop(function(b) {\n loop(function (c) {\n newpolygon.plane = CSG.Plane.fromPoints(a.pos, b.pos, c.pos)\n if(!isNaN(newpolygon.plane.w)) {\n found = true;\n }\n })\n })\n })\n }\n// FIX\n\n polygons[polygonindex] = newpolygon;\n\n // remove the original sides from our maps:\n // deleteSide(sideobj.vertex0, sideobj.vertex1, null);\n deleteSide(matchingside.vertex0, matchingside.vertex1, polygonindex);\n var newsidetag1 = addSide(matchingside.vertex0, endvertex, polygonindex);\n var newsidetag2 = addSide(endvertex, matchingside.vertex1, polygonindex);\n if (newsidetag1 !== null) sidestocheck[newsidetag1] = true;\n if (newsidetag2 !== null) sidestocheck[newsidetag2] = true;\n donewithside = false;\n directionindex = 2; // skip reverse direction check\n donesomething = true;\n break;\n } // if(distancesquared < 1e-10)\n } // if( (t > 0) && (t < 1) )\n } // if(endingstidestartvertextag == endvertextag)\n } // for matchingsideindex\n } // for directionindex\n } // if(sidetagtocheck in sidemap)\n if (donewithside) {\n delete sidestocheck[sidetag];\n }\n }\n if (!donesomething) break;\n }\n var newcsg = CSG.fromPolygons(polygons);\n newcsg.properties = csg.properties;\n newcsg.isCanonicalized = true;\n newcsg.isRetesselated = true;\n csg = newcsg;\n } // if(!sidemapisempty)\n var sidemapisempty = true;\n for (var sidetag in sidemap) {\n sidemapisempty = false;\n break;\n }\n if (!sidemapisempty) {\n // throw new Error(\"!sidemapisempty\");\n OpenJsCad.log(\"!sidemapisempty\");\n }\n return csg;\n },\n\n toTriangles: function() {\n var polygons = [];\n this.polygons.forEach(function(poly) {\n var firstVertex = poly.vertices[0];\n for (var i = poly.vertices.length - 3; i >= 0; i--) {\n polygons.push(new CSG.Polygon([\n firstVertex, poly.vertices[i + 1], poly.vertices[i + 2]\n ],\n poly.shared, poly.plane));\n }\n });\n return polygons;\n },\n\n // features: string, or array containing 1 or more strings of: 'volume', 'area'\n // more could be added here (Fourier coeff, moments)\n getFeatures: function(features) {\n if (!(features instanceof Array)) {\n features = [features];\n }\n var result = this.toTriangles().map(function(triPoly) {\n return triPoly.getTetraFeatures(features);\n })\n .reduce(function(pv, v) {\n return v.map(function(feat, i) {\n return feat + (pv === 0 ? 0 : pv[i]);\n });\n }, 0);\n return (result.length == 1) ? result[0] : result;\n }\n };\n\n // Parse an option from the options object\n // If the option is not present, return the default value\n CSG.parseOption = function(options, optionname, defaultvalue) {\n var result = defaultvalue;\n if (options) {\n if (optionname in options) {\n result = options[optionname];\n }\n }\n return result;\n };\n\n // Parse an option and force into a CSG.Vector3D. If a scalar is passed it is converted\n // into a vector with equal x,y,z\n CSG.parseOptionAs3DVector = function(options, optionname, defaultvalue) {\n var result = CSG.parseOption(options, optionname, defaultvalue);\n result = new CSG.Vector3D(result);\n return result;\n };\n\n CSG.parseOptionAs3DVectorList = function(options, optionname, defaultvalue) {\n var result = CSG.parseOption(options, optionname, defaultvalue);\n return result.map(function(res) {\n return new CSG.Vector3D(res);\n });\n };\n\n // Parse an option and force into a CSG.Vector2D. If a scalar is passed it is converted\n // into a vector with equal x,y\n CSG.parseOptionAs2DVector = function(options, optionname, defaultvalue) {\n var result = CSG.parseOption(options, optionname, defaultvalue);\n result = new CSG.Vector2D(result);\n return result;\n };\n\n CSG.parseOptionAsFloat = function(options, optionname, defaultvalue) {\n var result = CSG.parseOption(options, optionname, defaultvalue);\n if (typeof(result) == \"string\") {\n result = Number(result);\n }\n if (isNaN(result) || typeof(result) != \"number\") {\n throw new Error(\"Parameter \" + optionname + \" should be a number\");\n }\n return result;\n };\n\n CSG.parseOptionAsInt = function(options, optionname, defaultvalue) {\n var result = CSG.parseOption(options, optionname, defaultvalue);\n result = Number(Math.floor(result));\n if (isNaN(result)) {\n throw new Error(\"Parameter \" + optionname + \" should be a number\");\n }\n return result;\n };\n\n CSG.parseOptionAsBool = function(options, optionname, defaultvalue) {\n var result = CSG.parseOption(options, optionname, defaultvalue);\n if (typeof(result) == \"string\") {\n if (result == \"true\") result = true;\n else if (result == \"false\") result = false;\n else if (result == 0) result = false;\n }\n result = !!result;\n return result;\n };\n\n // Construct an axis-aligned solid cuboid.\n // Parameters:\n // center: center of cube (default [0,0,0])\n // radius: radius of cube (default [1,1,1]), can be specified as scalar or as 3D vector\n //\n // Example code:\n //\n // var cube = CSG.cube({\n // center: [0, 0, 0],\n // radius: 1\n // });\n CSG.cube = function(options) {\n var c, r;\n options = options || {};\n if (('corner1' in options) || ('corner2' in options)) {\n if (('center' in options) || ('radius' in options)) {\n throw new Error(\"cube: should either give a radius and center parameter, or a corner1 and corner2 parameter\")\n }\n corner1 = CSG.parseOptionAs3DVector(options, \"corner1\", [0, 0, 0]);\n corner2 = CSG.parseOptionAs3DVector(options, \"corner2\", [1, 1, 1]);\n c = corner1.plus(corner2).times(0.5);\n r = corner2.minus(corner1).times(0.5);\n } else {\n c = CSG.parseOptionAs3DVector(options, \"center\", [0, 0, 0]);\n r = CSG.parseOptionAs3DVector(options, \"radius\", [1, 1, 1]);\n }\n r = r.abs(); // negative radii make no sense\n var result = CSG.fromPolygons([\n [\n [0, 4, 6, 2],\n [-1, 0, 0]\n ],\n [\n [1, 3, 7, 5],\n [+1, 0, 0]\n ],\n [\n [0, 1, 5, 4],\n [0, -1, 0]\n ],\n [\n [2, 6, 7, 3],\n [0, +1, 0]\n ],\n [\n [0, 2, 3, 1],\n [0, 0, -1]\n ],\n [\n [4, 5, 7, 6],\n [0, 0, +1]\n ]\n ].map(function(info) {\n //var normal = new CSG.Vector3D(info[1]);\n //var plane = new CSG.Plane(normal, 1);\n var vertices = info[0].map(function(i) {\n var pos = new CSG.Vector3D(\n c.x + r.x * (2 * !!(i & 1) - 1), c.y + r.y * (2 * !!(i & 2) - 1), c.z + r.z * (2 * !!(i & 4) - 1));\n return new CSG.Vertex(pos);\n });\n return new CSG.Polygon(vertices, null /* , plane */ );\n }));\n result.properties.cube = new CSG.Properties();\n result.properties.cube.center = new CSG.Vector3D(c);\n // add 6 connectors, at the centers of each face:\n result.properties.cube.facecenters = [\n new CSG.Connector(new CSG.Vector3D([r.x, 0, 0]).plus(c), [1, 0, 0], [0, 0, 1]),\n new CSG.Connector(new CSG.Vector3D([-r.x, 0, 0]).plus(c), [-1, 0, 0], [0, 0, 1]),\n new CSG.Connector(new CSG.Vector3D([0, r.y, 0]).plus(c), [0, 1, 0], [0, 0, 1]),\n new CSG.Connector(new CSG.Vector3D([0, -r.y, 0]).plus(c), [0, -1, 0], [0, 0, 1]),\n new CSG.Connector(new CSG.Vector3D([0, 0, r.z]).plus(c), [0, 0, 1], [1, 0, 0]),\n new CSG.Connector(new CSG.Vector3D([0, 0, -r.z]).plus(c), [0, 0, -1], [1, 0, 0])\n ];\n return result;\n };\n\n // Construct a solid sphere\n //\n // Parameters:\n // center: center of sphere (default [0,0,0])\n // radius: radius of sphere (default 1), must be a scalar\n // resolution: determines the number of polygons per 360 degree revolution (default 12)\n // axes: (optional) an array with 3 vectors for the x, y and z base vectors\n //\n // Example usage:\n //\n // var sphere = CSG.sphere({\n // center: [0, 0, 0],\n // radius: 2,\n // resolution: 32,\n // });\n CSG.sphere = function(options) {\n options = options || {};\n var center = CSG.parseOptionAs3DVector(options, \"center\", [0, 0, 0]);\n var radius = CSG.parseOptionAsFloat(options, \"radius\", 1);\n var resolution = CSG.parseOptionAsInt(options, \"resolution\", CSG.defaultResolution3D);\n var xvector, yvector, zvector;\n if ('axes' in options) {\n xvector = options.axes[0].unit().times(radius);\n yvector = options.axes[1].unit().times(radius);\n zvector = options.axes[2].unit().times(radius);\n } else {\n xvector = new CSG.Vector3D([1, 0, 0]).times(radius);\n yvector = new CSG.Vector3D([0, -1, 0]).times(radius);\n zvector = new CSG.Vector3D([0, 0, 1]).times(radius);\n }\n if (resolution < 4) resolution = 4;\n var qresolution = Math.round(resolution / 4);\n var prevcylinderpoint;\n var polygons = [];\n for (var slice1 = 0; slice1 <= resolution; slice1++) {\n var angle = Math.PI * 2.0 * slice1 / resolution;\n var cylinderpoint = xvector.times(Math.cos(angle)).plus(yvector.times(Math.sin(angle)));\n if (slice1 > 0) {\n // cylinder vertices:\n var vertices = [];\n var prevcospitch, prevsinpitch;\n for (var slice2 = 0; slice2 <= qresolution; slice2++) {\n var pitch = 0.5 * Math.PI * slice2 / qresolution;\n var cospitch = Math.cos(pitch);\n var sinpitch = Math.sin(pitch);\n if (slice2 > 0) {\n vertices = [];\n vertices.push(new CSG.Vertex(center.plus(prevcylinderpoint.times(prevcospitch).minus(zvector.times(prevsinpitch)))));\n vertices.push(new CSG.Vertex(center.plus(cylinderpoint.times(prevcospitch).minus(zvector.times(prevsinpitch)))));\n if (slice2 < qresolution) {\n vertices.push(new CSG.Vertex(center.plus(cylinderpoint.times(cospitch).minus(zvector.times(sinpitch)))));\n }\n vertices.push(new CSG.Vertex(center.plus(prevcylinderpoint.times(cospitch).minus(zvector.times(sinpitch)))));\n polygons.push(new CSG.Polygon(vertices));\n vertices = [];\n vertices.push(new CSG.Vertex(center.plus(prevcylinderpoint.times(prevcospitch).plus(zvector.times(prevsinpitch)))));\n vertices.push(new CSG.Vertex(center.plus(cylinderpoint.times(prevcospitch).plus(zvector.times(prevsinpitch)))));\n if (slice2 < qresolution) {\n vertices.push(new CSG.Vertex(center.plus(cylinderpoint.times(cospitch).plus(zvector.times(sinpitch)))));\n }\n vertices.push(new CSG.Vertex(center.plus(prevcylinderpoint.times(cospitch).plus(zvector.times(sinpitch)))));\n vertices.reverse();\n polygons.push(new CSG.Polygon(vertices));\n }\n prevcospitch = cospitch;\n prevsinpitch = sinpitch;\n }\n }\n prevcylinderpoint = cylinderpoint;\n }\n var result = CSG.fromPolygons(polygons);\n result.properties.sphere = new CSG.Properties();\n result.properties.sphere.center = new CSG.Vector3D(center);\n result.properties.sphere.facepoint = center.plus(xvector);\n return result;\n };\n\n // Construct a solid cylinder.\n //\n // Parameters:\n // start: start point of cylinder (default [0, -1, 0])\n // end: end point of cylinder (default [0, 1, 0])\n // radius: radius of cylinder (default 1), must be a scalar\n // resolution: determines the number of polygons per 360 degree revolution (default 12)\n //\n // Example usage:\n //\n // var cylinder = CSG.cylinder({\n // start: [0, -1, 0],\n // end: [0, 1, 0],\n // radius: 1,\n // resolution: 16\n // });\n CSG.cylinder = function(options) {\n var s = CSG.parseOptionAs3DVector(options, \"start\", [0, -1, 0]);\n var e = CSG.parseOptionAs3DVector(options, \"end\", [0, 1, 0]);\n var r = CSG.parseOptionAsFloat(options, \"radius\", 1);\n var rEnd = CSG.parseOptionAsFloat(options, \"radiusEnd\", r);\n var rStart = CSG.parseOptionAsFloat(options, \"radiusStart\", r);\n var alpha = CSG.parseOptionAsFloat(options, \"sectorAngle\", 360);\n alpha = alpha > 360 ? alpha % 360 : alpha;\n\n if ((rEnd < 0) || (rStart < 0)) {\n throw new Error(\"Radius should be non-negative\");\n }\n if ((rEnd === 0) && (rStart === 0)) {\n throw new Error(\"Either radiusStart or radiusEnd should be positive\");\n }\n\n var slices = CSG.parseOptionAsInt(options, \"resolution\", CSG.defaultResolution2D);\n var ray = e.minus(s);\n var axisZ = ray.unit(); //, isY = (Math.abs(axisZ.y) > 0.5);\n var axisX = axisZ.randomNonParallelVector().unit();\n\n // var axisX = new CSG.Vector3D(isY, !isY, 0).cross(axisZ).unit();\n var axisY = axisX.cross(axisZ).unit();\n var start = new CSG.Vertex(s);\n var end = new CSG.Vertex(e);\n var polygons = [];\n\n function point(stack, slice, radius) {\n var angle = slice * Math.PI * alpha / 180;\n var out = axisX.times(Math.cos(angle)).plus(axisY.times(Math.sin(angle)));\n var pos = s.plus(ray.times(stack)).plus(out.times(radius));\n return new CSG.Vertex(pos);\n }\n if (alpha > 0) {\n for (var i = 0; i < slices; i++) {\n var t0 = i / slices,\n t1 = (i + 1) / slices;\n if (rEnd == rStart) {\n polygons.push(new CSG.Polygon([start, point(0, t0, rEnd), point(0, t1, rEnd)]));\n polygons.push(new CSG.Polygon([point(0, t1, rEnd), point(0, t0, rEnd), point(1, t0, rEnd), point(1, t1, rEnd)]));\n polygons.push(new CSG.Polygon([end, point(1, t1, rEnd), point(1, t0, rEnd)]));\n } else {\n if (rStart > 0) {\n polygons.push(new CSG.Polygon([start, point(0, t0, rStart), point(0, t1, rStart)]));\n polygons.push(new CSG.Polygon([point(0, t0, rStart), point(1, t0, rEnd), point(0, t1, rStart)]));\n }\n if (rEnd > 0) {\n polygons.push(new CSG.Polygon([end, point(1, t1, rEnd), point(1, t0, rEnd)]));\n polygons.push(new CSG.Polygon([point(1, t0, rEnd), point(1, t1, rEnd), point(0, t1, rStart)]));\n }\n }\n }\n if (alpha < 360) {\n polygons.push(new CSG.Polygon([start, end, point(0, 0, rStart)]));\n polygons.push(new CSG.Polygon([point(0, 0, rStart), end, point(1, 0, rEnd)]));\n polygons.push(new CSG.Polygon([start, point(0, 1, rStart), end]));\n polygons.push(new CSG.Polygon([point(0, 1, rStart), point(1, 1, rEnd), end]));\n }\n }\n var result = CSG.fromPolygons(polygons);\n result.properties.cylinder = new CSG.Properties();\n result.properties.cylinder.start = new CSG.Connector(s, axisZ.negated(), axisX);\n result.properties.cylinder.end = new CSG.Connector(e, axisZ, axisX);\n var cylCenter = s.plus(ray.times(0.5));\n var fptVec = axisX.rotate(s, axisZ, -alpha / 2).times((rStart + rEnd) / 2);\n var fptVec90 = fptVec.cross(axisZ);\n // note this one is NOT a face normal for a cone. - It's horizontal from cyl perspective\n result.properties.cylinder.facepointH = new CSG.Connector(cylCenter.plus(fptVec), fptVec, axisZ);\n result.properties.cylinder.facepointH90 = new CSG.Connector(cylCenter.plus(fptVec90), fptVec90, axisZ);\n return result;\n };\n\n // Like a cylinder, but with rounded ends instead of flat\n //\n // Parameters:\n // start: start point of cylinder (default [0, -1, 0])\n // end: end point of cylinder (default [0, 1, 0])\n // radius: radius of cylinder (default 1), must be a scalar\n // resolution: determines the number of polygons per 360 degree revolution (default 12)\n // normal: a vector determining the starting angle for tesselation. Should be non-parallel to start.minus(end)\n //\n // Example usage:\n //\n // var cylinder = CSG.roundedCylinder({\n // start: [0, -1, 0],\n // end: [0, 1, 0],\n // radius: 1,\n // resolution: 16\n // });\n CSG.roundedCylinder = function(options) {\n var p1 = CSG.parseOptionAs3DVector(options, \"start\", [0, -1, 0]);\n var p2 = CSG.parseOptionAs3DVector(options, \"end\", [0, 1, 0]);\n var radius = CSG.parseOptionAsFloat(options, \"radius\", 1);\n var direction = p2.minus(p1);\n var defaultnormal;\n if (Math.abs(direction.x) > Math.abs(direction.y)) {\n defaultnormal = new CSG.Vector3D(0, 1, 0);\n } else {\n defaultnormal = new CSG.Vector3D(1, 0, 0);\n }\n var normal = CSG.parseOptionAs3DVector(options, \"normal\", defaultnormal);\n var resolution = CSG.parseOptionAsInt(options, \"resolution\", CSG.defaultResolution3D);\n if (resolution < 4) resolution = 4;\n var polygons = [];\n var qresolution = Math.floor(0.25 * resolution);\n var length = direction.length();\n if (length < 1e-10) {\n return CSG.sphere({\n center: p1,\n radius: radius,\n resolution: resolution\n });\n }\n var zvector = direction.unit().times(radius);\n var xvector = zvector.cross(normal).unit().times(radius);\n var yvector = xvector.cross(zvector).unit().times(radius);\n var prevcylinderpoint;\n for (var slice1 = 0; slice1 <= resolution; slice1++) {\n var angle = Math.PI * 2.0 * slice1 / resolution;\n var cylinderpoint = xvector.times(Math.cos(angle)).plus(yvector.times(Math.sin(angle)));\n if (slice1 > 0) {\n // cylinder vertices:\n var vertices = [];\n vertices.push(new CSG.Vertex(p1.plus(cylinderpoint)));\n vertices.push(new CSG.Vertex(p1.plus(prevcylinderpoint)));\n vertices.push(new CSG.Vertex(p2.plus(prevcylinderpoint)));\n vertices.push(new CSG.Vertex(p2.plus(cylinderpoint)));\n polygons.push(new CSG.Polygon(vertices));\n var prevcospitch, prevsinpitch;\n for (var slice2 = 0; slice2 <= qresolution; slice2++) {\n var pitch = 0.5 * Math.PI * slice2 / qresolution;\n //var pitch = Math.asin(slice2/qresolution);\n var cospitch = Math.cos(pitch);\n var sinpitch = Math.sin(pitch);\n if (slice2 > 0) {\n vertices = [];\n vertices.push(new CSG.Vertex(p1.plus(prevcylinderpoint.times(prevcospitch).minus(zvector.times(prevsinpitch)))));\n vertices.push(new CSG.Vertex(p1.plus(cylinderpoint.times(prevcospitch).minus(zvector.times(prevsinpitch)))));\n if (slice2 < qresolution) {\n vertices.push(new CSG.Vertex(p1.plus(cylinderpoint.times(cospitch).minus(zvector.times(sinpitch)))));\n }\n vertices.push(new CSG.Vertex(p1.plus(prevcylinderpoint.times(cospitch).minus(zvector.times(sinpitch)))));\n polygons.push(new CSG.Polygon(vertices));\n vertices = [];\n vertices.push(new CSG.Vertex(p2.plus(prevcylinderpoint.times(prevcospitch).plus(zvector.times(prevsinpitch)))));\n vertices.push(new CSG.Vertex(p2.plus(cylinderpoint.times(prevcospitch).plus(zvector.times(prevsinpitch)))));\n if (slice2 < qresolution) {\n vertices.push(new CSG.Vertex(p2.plus(cylinderpoint.times(cospitch).plus(zvector.times(sinpitch)))));\n }\n vertices.push(new CSG.Vertex(p2.plus(prevcylinderpoint.times(cospitch).plus(zvector.times(sinpitch)))));\n vertices.reverse();\n polygons.push(new CSG.Polygon(vertices));\n }\n prevcospitch = cospitch;\n prevsinpitch = sinpitch;\n }\n }\n prevcylinderpoint = cylinderpoint;\n }\n var result = CSG.fromPolygons(polygons);\n var ray = zvector.unit();\n var axisX = xvector.unit();\n result.properties.roundedCylinder = new CSG.Properties();\n result.properties.roundedCylinder.start = new CSG.Connector(p1, ray.negated(), axisX);\n result.properties.roundedCylinder.end = new CSG.Connector(p2, ray, axisX);\n result.properties.roundedCylinder.facepoint = p1.plus(xvector);\n return result;\n };\n\n // Construct an axis-aligned solid rounded cuboid.\n // Parameters:\n // center: center of cube (default [0,0,0])\n // radius: radius of cube (default [1,1,1]), can be specified as scalar or as 3D vector\n // roundradius: radius of rounded corners (default 0.2), must be a scalar\n // resolution: determines the number of polygons per 360 degree revolution (default 8)\n //\n // Example code:\n //\n // var cube = CSG.roundedCube({\n // center: [0, 0, 0],\n // radius: 1,\n // roundradius: 0.2,\n // resolution: 8,\n // });\n CSG.roundedCube = function(options) {\n var EPS = 1e-5;\n var minRR = 1e-2; //minroundradius 1e-3 gives rounding errors already\n var center, cuberadius;\n options = options || {};\n if (('corner1' in options) || ('corner2' in options)) {\n if (('center' in options) || ('radius' in options)) {\n throw new Error(\"roundedCube: should either give a radius and center parameter, or a corner1 and corner2 parameter\");\n }\n corner1 = CSG.parseOptionAs3DVector(options, \"corner1\", [0, 0, 0]);\n corner2 = CSG.parseOptionAs3DVector(options, \"corner2\", [1, 1, 1]);\n center = corner1.plus(corner2).times(0.5);\n cuberadius = corner2.minus(corner1).times(0.5);\n } else {\n center = CSG.parseOptionAs3DVector(options, \"center\", [0, 0, 0]);\n cuberadius = CSG.parseOptionAs3DVector(options, \"radius\", [1, 1, 1]);\n }\n cuberadius = cuberadius.abs(); // negative radii make no sense\n var resolution = CSG.parseOptionAsInt(options, \"resolution\", CSG.defaultResolution3D);\n if (resolution < 4) resolution = 4;\n if (resolution%2 == 1 && resolution < 8) resolution = 8; // avoid ugly\n var roundradius = CSG.parseOptionAs3DVector(options, \"roundradius\", [0.2, 0.2, 0.2]);\n // slight hack for now - total radius stays ok\n roundradius = CSG.Vector3D.Create(Math.max(roundradius.x, minRR), Math.max(roundradius.y, minRR), Math.max(roundradius.z, minRR));\n var innerradius = cuberadius.minus(roundradius);\n if (innerradius.x < 0 || innerradius.y < 0 || innerradius.z < 0) {\n throw('roundradius <= radius!');\n }\n var res = CSG.sphere({radius:1, resolution:resolution});\n res = res.scale(roundradius);\n innerradius.x > EPS && (res = res.stretchAtPlane([1, 0, 0], [0, 0, 0], 2*innerradius.x));\n innerradius.y > EPS && (res = res.stretchAtPlane([0, 1, 0], [0, 0, 0], 2*innerradius.y));\n innerradius.z > EPS && (res = res.stretchAtPlane([0, 0, 1], [0, 0, 0], 2*innerradius.z));\n res = res.translate([-innerradius.x+center.x, -innerradius.y+center.y, -innerradius.z+center.z]);\n res = res.reTesselated();\n res.properties.roundedCube = new CSG.Properties();\n res.properties.roundedCube.center = new CSG.Vertex(center);\n res.properties.roundedCube.facecenters = [\n new CSG.Connector(new CSG.Vector3D([cuberadius.x, 0, 0]).plus(center), [1, 0, 0], [0, 0, 1]),\n new CSG.Connector(new CSG.Vector3D([-cuberadius.x, 0, 0]).plus(center), [-1, 0, 0], [0, 0, 1]),\n new CSG.Connector(new CSG.Vector3D([0, cuberadius.y, 0]).plus(center), [0, 1, 0], [0, 0, 1]),\n new CSG.Connector(new CSG.Vector3D([0, -cuberadius.y, 0]).plus(center), [0, -1, 0], [0, 0, 1]),\n new CSG.Connector(new CSG.Vector3D([0, 0, cuberadius.z]).plus(center), [0, 0, 1], [1, 0, 0]),\n new CSG.Connector(new CSG.Vector3D([0, 0, -cuberadius.z]).plus(center), [0, 0, -1], [1, 0, 0])\n ];\n return res;\n };\n\n /**\n * polyhedron accepts openscad style arguments. I.e. define face vertices clockwise looking from outside\n */\n CSG.polyhedron = function(options) {\n options = options || {};\n if (('points' in options) !== ('faces' in options)) {\n throw new Error(\"polyhedron needs 'points' and 'faces' arrays\");\n }\n var vertices = CSG.parseOptionAs3DVectorList(options, \"points\", [\n [1, 1, 0],\n [1, -1, 0],\n [-1, -1, 0],\n [-1, 1, 0],\n [0, 0, 1]\n ])\n .map(function(pt) {\n return new CSG.Vertex(pt);\n });\n var faces = CSG.parseOption(options, \"faces\", [\n [0, 1, 4],\n [1, 2, 4],\n [2, 3, 4],\n [3, 0, 4],\n [1, 0, 3],\n [2, 1, 3]\n ]);\n // openscad convention defines inward normals - so we have to invert here\n faces.forEach(function(face) {\n face.reverse();\n });\n var polygons = faces.map(function(face) {\n return new CSG.Polygon(face.map(function(idx) {\n return vertices[idx];\n }));\n });\n\n // TODO: facecenters as connectors? probably overkill. Maybe centroid\n // the re-tesselation here happens because it's so easy for a user to\n // create parametrized polyhedrons that end up with 1-2 dimensional polygons.\n // These will create infinite loops at CSG.Tree()\n return CSG.fromPolygons(polygons).reTesselated();\n };\n\n CSG.IsFloat = function(n) {\n return (!isNaN(n)) || (n === Infinity) || (n === -Infinity);\n };\n\n // solve 2x2 linear equation:\n // [ab][x] = [u]\n // [cd][y] [v]\n CSG.solve2Linear = function(a, b, c, d, u, v) {\n var det = a * d - b * c;\n var invdet = 1.0 / det;\n var x = u * d - b * v;\n var y = -u * c + a * v;\n x *= invdet;\n y *= invdet;\n return [x, y];\n };\n\n // # class Vector3D\n // Represents a 3D vector.\n //\n // Example usage:\n //\n // new CSG.Vector3D(1, 2, 3);\n // new CSG.Vector3D([1, 2, 3]);\n // new CSG.Vector3D({ x: 1, y: 2, z: 3 });\n // new CSG.Vector3D(1, 2); // assumes z=0\n // new CSG.Vector3D([1, 2]); // assumes z=0\n CSG.Vector3D = function(x, y, z) {\n if (arguments.length == 3) {\n this._x = parseFloat(x);\n this._y = parseFloat(y);\n this._z = parseFloat(z);\n } else if (arguments.length == 2) {\n this._x = parseFloat(x);\n this._y = parseFloat(y);\n this._z = 0;\n } else {\n var ok = true;\n if (arguments.length == 1) {\n if (typeof(x) == \"object\") {\n if (x instanceof CSG.Vector3D) {\n this._x = x._x;\n this._y = x._y;\n this._z = x._z;\n } else if (x instanceof CSG.Vector2D) {\n this._x = x._x;\n this._y = x._y;\n this._z = 0;\n } else if (x instanceof Array) {\n if ((x.length < 2) || (x.length > 3)) {\n ok = false;\n } else {\n this._x = parseFloat(x[0]);\n this._y = parseFloat(x[1]);\n if (x.length == 3) {\n this._z = parseFloat(x[2]);\n } else {\n this._z = 0;\n }\n }\n } else if (('_x' in x) && ('_y' in x)) {\n this._x = parseFloat(x._x);\n this._y = parseFloat(x._y);\n if ('_z' in x) {\n this._z = parseFloat(x._z);\n } else {\n this._z = 0;\n }\n } else ok = false;\n } else {\n var v = parseFloat(x);\n this._x = v;\n this._y = v;\n this._z = v;\n }\n } else ok = false;\n if (ok) {\n if ((!CSG.IsFloat(this._x)) || (!CSG.IsFloat(this._y)) || (!CSG.IsFloat(this._z))) ok = false;\n }\n if (!ok) {\n throw new Error(\"wrong arguments\");\n }\n }\n };\n\n // This does the same as new CSG.Vector3D(x,y,z) but it doesn't go through the constructor\n // and the parameters are not validated. Is much faster.\n CSG.Vector3D.Create = function(x, y, z) {\n var result = Object.create(CSG.Vector3D.prototype);\n result._x = x;\n result._y = y;\n result._z = z;\n return result;\n };\n\n CSG.Vector3D.prototype = {\n get x() {\n return this._x;\n },\n get y() {\n return this._y;\n },\n get z() {\n return this._z;\n },\n\n set x(v) {\n throw new Error(\"Vector3D is immutable\");\n },\n set y(v) {\n throw new Error(\"Vector3D is immutable\");\n },\n set z(v) {\n throw new Error(\"Vector3D is immutable\");\n },\n\n clone: function() {\n return CSG.Vector3D.Create(this._x, this._y, this._z);\n },\n\n negated: function() {\n return CSG.Vector3D.Create(-this._x, -this._y, -this._z);\n },\n\n abs: function() {\n return CSG.Vector3D.Create(Math.abs(this._x), Math.abs(this._y), Math.abs(this._z));\n },\n\n plus: function(a) {\n return CSG.Vector3D.Create(this._x + a._x, this._y + a._y, this._z + a._z);\n },\n\n minus: function(a) {\n return CSG.Vector3D.Create(this._x - a._x, this._y - a._y, this._z - a._z);\n },\n\n times: function(a) {\n return CSG.Vector3D.Create(this._x * a, this._y * a, this._z * a);\n },\n\n dividedBy: function(a) {\n return CSG.Vector3D.Create(this._x / a, this._y / a, this._z / a);\n },\n\n dot: function(a) {\n return this._x * a._x + this._y * a._y + this._z * a._z;\n },\n\n lerp: function(a, t) {\n return this.plus(a.minus(this).times(t));\n },\n\n lengthSquared: function() {\n return this.dot(this);\n },\n\n length: function() {\n return Math.sqrt(this.lengthSquared());\n },\n\n unit: function() {\n return this.dividedBy(this.length());\n },\n\n cross: function(a) {\n return CSG.Vector3D.Create(\n this._y * a._z - this._z * a._y, this._z * a._x - this._x * a._z, this._x * a._y - this._y * a._x);\n },\n\n distanceTo: function(a) {\n return this.minus(a).length();\n },\n\n distanceToSquared: function(a) {\n return this.minus(a).lengthSquared();\n },\n\n equals: function(a) {\n return (this._x == a._x) && (this._y == a._y) && (this._z == a._z);\n },\n\n // Right multiply by a 4x4 matrix (the vector is interpreted as a row vector)\n // Returns a new CSG.Vector3D\n multiply4x4: function(matrix4x4) {\n return matrix4x4.leftMultiply1x3Vector(this);\n },\n\n transform: function(matrix4x4) {\n return matrix4x4.leftMultiply1x3Vector(this);\n },\n\n toString: function() {\n return \"(\" + this._x.toFixed(2) + \", \" + this._y.toFixed(2) + \", \" + this._z.toFixed(2) + \")\";\n },\n\n // find a vector that is somewhat perpendicular to this one\n randomNonParallelVector: function() {\n var abs = this.abs();\n if ((abs._x <= abs._y) && (abs._x <= abs._z)) {\n return CSG.Vector3D.Create(1, 0, 0);\n } else if ((abs._y <= abs._x) && (abs._y <= abs._z)) {\n return CSG.Vector3D.Create(0, 1, 0);\n } else {\n return CSG.Vector3D.Create(0, 0, 1);\n }\n },\n\n min: function(p) {\n return CSG.Vector3D.Create(\n Math.min(this._x, p._x), Math.min(this._y, p._y), Math.min(this._z, p._z));\n },\n\n max: function(p) {\n return CSG.Vector3D.Create(\n Math.max(this._x, p._x), Math.max(this._y, p._y), Math.max(this._z, p._z));\n }\n };\n\n // # class Vertex\n // Represents a vertex of a polygon. Use your own vertex class instead of this\n // one to provide additional features like texture coordinates and vertex\n // colors. Custom vertex classes need to provide a `pos` property\n // `flipped()`, and `interpolate()` methods that behave analogous to the ones\n // defined by `CSG.Vertex`.\n CSG.Vertex = function(pos) {\n this.pos = pos;\n };\n\n // create from an untyped object with identical property names:\n CSG.Vertex.fromObject = function(obj) {\n var pos = new CSG.Vector3D(obj.pos);\n return new CSG.Vertex(pos);\n };\n\n CSG.Vertex.prototype = {\n // Return a vertex with all orientation-specific data (e.g. vertex normal) flipped. Called when the\n // orientation of a polygon is flipped.\n flipped: function() {\n return this;\n },\n\n getTag: function() {\n var result = this.tag;\n if (!result) {\n result = CSG.getTag();\n this.tag = result;\n }\n return result;\n },\n\n // Create a new vertex between this vertex and `other` by linearly\n // interpolating all properties using a parameter of `t`. Subclasses should\n // override this to interpolate additional properties.\n interpolate: function(other, t) {\n var newpos = this.pos.lerp(other.pos, t);\n return new CSG.Vertex(newpos);\n },\n\n // Affine transformation of vertex. Returns a new CSG.Vertex\n transform: function(matrix4x4) {\n var newpos = this.pos.multiply4x4(matrix4x4);\n return new CSG.Vertex(newpos);\n },\n\n toString: function() {\n return this.pos.toString();\n }\n };\n\n // # class Plane\n // Represents a plane in 3D space.\n CSG.Plane = function(normal, w) {\n this.normal = normal;\n this.w = w;\n };\n\n // create from an untyped object with identical property names:\n CSG.Plane.fromObject = function(obj) {\n var normal = new CSG.Vector3D(obj.normal);\n var w = parseFloat(obj.w);\n return new CSG.Plane(normal, w);\n };\n\n // `CSG.Plane.EPSILON` is the tolerance used by `splitPolygon()` to decide if a\n // point is on the plane.\n CSG.Plane.EPSILON = 1e-5;\n\n CSG.Plane.fromVector3Ds = function(a, b, c) {\n var n = b.minus(a).cross(c.minus(a)).unit();\n return new CSG.Plane(n, n.dot(a));\n };\n\n // like fromVector3Ds, but allow the vectors to be on one point or one line\n // in such a case a random plane through the given points is constructed\n CSG.Plane.anyPlaneFromVector3Ds = function(a, b, c) {\n var v1 = b.minus(a);\n var v2 = c.minus(a);\n if (v1.length() < 1e-5) {\n v1 = v2.randomNonParallelVector();\n }\n if (v2.length() < 1e-5) {\n v2 = v1.randomNonParallelVector();\n }\n var normal = v1.cross(v2);\n if (normal.length() < 1e-5) {\n // this would mean that v1 == v2.negated()\n v2 = v1.randomNonParallelVector();\n normal = v1.cross(v2);\n }\n normal = normal.unit();\n return new CSG.Plane(normal, normal.dot(a));\n };\n\n CSG.Plane.fromPoints = function(a, b, c) {\n a = new CSG.Vector3D(a);\n b = new CSG.Vector3D(b);\n c = new CSG.Vector3D(c);\n return CSG.Plane.fromVector3Ds(a, b, c);\n };\n\n CSG.Plane.fromNormalAndPoint = function(normal, point) {\n normal = new CSG.Vector3D(normal);\n point = new CSG.Vector3D(point);\n normal = normal.unit();\n var w = point.dot(normal);\n return new CSG.Plane(normal, w);\n };\n\n CSG.Plane.prototype = {\n flipped: function() {\n return new CSG.Plane(this.normal.negated(), -this.w);\n },\n\n getTag: function() {\n var result = this.tag;\n if (!result) {\n result = CSG.getTag();\n this.tag = result;\n }\n return result;\n },\n\n equals: function(n) {\n return this.normal.equals(n.normal) && this.w == n.w;\n },\n\n transform: function(matrix4x4) {\n var ismirror = matrix4x4.isMirroring();\n // get two vectors in the plane:\n var r = this.normal.randomNonParallelVector();\n var u = this.normal.cross(r);\n var v = this.normal.cross(u);\n // get 3 points in the plane:\n var point1 = this.normal.times(this.w);\n var point2 = point1.plus(u);\n var point3 = point1.plus(v);\n // transform the points:\n point1 = point1.multiply4x4(matrix4x4);\n point2 = point2.multiply4x4(matrix4x4);\n point3 = point3.multiply4x4(matrix4x4);\n // and create a new plane from the transformed points:\n var newplane = CSG.Plane.fromVector3Ds(point1, point2, point3);\n if (ismirror) {\n // the transform is mirroring\n // We should mirror the plane:\n newplane = newplane.flipped();\n }\n return newplane;\n },\n\n // Returns object:\n // .type:\n // 0: coplanar-front\n // 1: coplanar-back\n // 2: front\n // 3: back\n // 4: spanning\n // In case the polygon is spanning, returns:\n // .front: a CSG.Polygon of the front part\n // .back: a CSG.Polygon of the back part\n splitPolygon: function(polygon) {\n var result = {\n type: null,\n front: null,\n back: null\n };\n // cache in local vars (speedup):\n var planenormal = this.normal;\n var vertices = polygon.vertices;\n var numvertices = vertices.length;\n if (polygon.plane.equals(this)) {\n result.type = 0;\n } else {\n var EPS = CSG.Plane.EPSILON;\n var thisw = this.w;\n var hasfront = false;\n var hasback = false;\n var vertexIsBack = [];\n var MINEPS = -EPS;\n for (var i = 0; i < numvertices; i++) {\n var t = planenormal.dot(vertices[i].pos) - thisw;\n var isback = (t < 0);\n vertexIsBack.push(isback);\n if (t > EPS) hasfront = true;\n if (t < MINEPS) hasback = true;\n }\n if ((!hasfront) && (!hasback)) {\n // all points coplanar\n var t = planenormal.dot(polygon.plane.normal);\n result.type = (t >= 0) ? 0 : 1;\n } else if (!hasback) {\n result.type = 2;\n } else if (!hasfront) {\n result.type = 3;\n } else {\n // spanning\n result.type = 4;\n var frontvertices = [],\n backvertices = [];\n var isback = vertexIsBack[0];\n for (var vertexindex = 0; vertexindex < numvertices; vertexindex++) {\n var vertex = vertices[vertexindex];\n var nextvertexindex = vertexindex + 1;\n if (nextvertexindex >= numvertices) nextvertexindex = 0;\n var nextisback = vertexIsBack[nextvertexindex];\n if (isback == nextisback) {\n // line segment is on one side of the plane:\n if (isback) {\n backvertices.push(vertex);\n } else {\n frontvertices.push(vertex);\n }\n } else {\n // line segment intersects plane:\n var point = vertex.pos;\n var nextpoint = vertices[nextvertexindex].pos;\n var intersectionpoint = this.splitLineBetweenPoints(point, nextpoint);\n var intersectionvertex = new CSG.Vertex(intersectionpoint);\n if (isback) {\n backvertices.push(vertex);\n backvertices.push(intersectionvertex);\n frontvertices.push(intersectionvertex);\n } else {\n frontvertices.push(vertex);\n frontvertices.push(intersectionvertex);\n backvertices.push(intersectionvertex);\n }\n }\n isback = nextisback;\n } // for vertexindex\n // remove duplicate vertices:\n var EPS_SQUARED = CSG.Plane.EPSILON * CSG.Plane.EPSILON;\n if (backvertices.length >= 3) {\n var prevvertex = backvertices[backvertices.length - 1];\n for (var vertexindex = 0; vertexindex < backvertices.length; vertexindex++) {\n var vertex = backvertices[vertexindex];\n if (vertex.pos.distanceToSquared(prevvertex.pos) < EPS_SQUARED) {\n backvertices.splice(vertexindex, 1);\n vertexindex--;\n }\n prevvertex = vertex;\n }\n }\n if (frontvertices.length >= 3) {\n var prevvertex = frontvertices[frontvertices.length - 1];\n for (var vertexindex = 0; vertexindex < frontvertices.length; vertexindex++) {\n var vertex = frontvertices[vertexindex];\n if (vertex.pos.distanceToSquared(prevvertex.pos) < EPS_SQUARED) {\n frontvertices.splice(vertexindex, 1);\n vertexindex--;\n }\n prevvertex = vertex;\n }\n }\n if (frontvertices.length >= 3) {\n result.front = new CSG.Polygon(frontvertices, polygon.shared, polygon.plane);\n }\n if (backvertices.length >= 3) {\n result.back = new CSG.Polygon(backvertices, polygon.shared, polygon.plane);\n }\n }\n }\n return result;\n },\n\n // robust splitting of a line by a plane\n // will work even if the line is parallel to the plane\n splitLineBetweenPoints: function(p1, p2) {\n var direction = p2.minus(p1);\n var labda = (this.w - this.normal.dot(p1)) / this.normal.dot(direction);\n if (isNaN(labda)) labda = 0;\n if (labda > 1) labda = 1;\n if (labda < 0) labda = 0;\n var result = p1.plus(direction.times(labda));\n return result;\n },\n\n // returns CSG.Vector3D\n intersectWithLine: function(line3d) {\n return line3d.intersectWithPlane(this);\n },\n\n // intersection of two planes\n intersectWithPlane: function(plane) {\n return CSG.Line3D.fromPlanes(this, plane);\n },\n\n signedDistanceToPoint: function(point) {\n var t = this.normal.dot(point) - this.w;\n return t;\n },\n\n toString: function() {\n return \"[normal: \" + this.normal.toString() + \", w: \" + this.w + \"]\";\n },\n\n mirrorPoint: function(point3d) {\n var distance = this.signedDistanceToPoint(point3d);\n var mirrored = point3d.minus(this.normal.times(distance * 2.0));\n return mirrored;\n }\n };\n\n\n // # class Polygon\n // Represents a convex polygon. The vertices used to initialize a polygon must\n // be coplanar and form a convex loop. They do not have to be `CSG.Vertex`\n // instances but they must behave similarly (duck typing can be used for\n // customization).\n //\n // Each convex polygon has a `shared` property, which is shared between all\n // polygons that are clones of each other or were split from the same polygon.\n // This can be used to define per-polygon properties (such as surface color).\n //\n // The plane of the polygon is calculated from the vertex coordinates\n // To avoid unnecessary recalculation, the plane can alternatively be\n // passed as the third argument\n CSG.Polygon = function(vertices, shared, plane) {\n this.vertices = vertices;\n if (!shared) shared = CSG.Polygon.defaultShared;\n this.shared = shared;\n //var numvertices = vertices.length;\n\n if (arguments.length >= 3) {\n this.plane = plane;\n } else {\n this.plane = CSG.Plane.fromVector3Ds(vertices[0].pos, vertices[1].pos, vertices[2].pos);\n }\n\n if (_CSGDEBUG) {\n this.checkIfConvex();\n }\n };\n\n // create from an untyped object with identical property names:\n CSG.Polygon.fromObject = function(obj) {\n var vertices = obj.vertices.map(function(v) {\n return CSG.Vertex.fromObject(v);\n });\n var shared = CSG.Polygon.Shared.fromObject(obj.shared);\n var plane = CSG.Plane.fromObject(obj.plane);\n return new CSG.Polygon(vertices, shared, plane);\n };\n\n CSG.Polygon.prototype = {\n // check whether the polygon is convex (it should be, otherwise we will get unexpected results)\n checkIfConvex: function() {\n if (!CSG.Polygon.verticesConvex(this.vertices, this.plane.normal)) {\n CSG.Polygon.verticesConvex(this.vertices, this.plane.normal);\n throw new Error(\"Not convex!\");\n }\n },\n\n setColor: function(args) {\n var newshared = CSG.Polygon.Shared.fromColor.apply(this, arguments);\n this.shared = newshared;\n return this;\n },\n\n getSignedVolume: function() {\n var signedVolume = 0;\n for (var i = 0; i < this.vertices.length - 2; i++) {\n signedVolume += this.vertices[0].pos.dot(this.vertices[i+1].pos\n .cross(this.vertices[i+2].pos));\n }\n signedVolume /= 6;\n return signedVolume;\n },\n\n // Note: could calculate vectors only once to speed up\n getArea: function() {\n var polygonArea = 0;\n for (var i = 0; i < this.vertices.length - 2; i++) {\n polygonArea += this.vertices[i+1].pos.minus(this.vertices[0].pos)\n .cross(this.vertices[i+2].pos.minus(this.vertices[i+1].pos)).length();\n }\n polygonArea /= 2;\n return polygonArea;\n },\n\n\n // accepts array of features to calculate\n // returns array of results\n getTetraFeatures: function(features) {\n var result = [];\n features.forEach(function(feature) {\n if (feature == 'volume') {\n result.push(this.getSignedVolume());\n } else if (feature == 'area') {\n result.push(this.getArea());\n }\n }, this);\n return result;\n },\n\n // Extrude a polygon into the direction offsetvector\n // Returns a CSG object\n extrude: function(offsetvector) {\n var newpolygons = [];\n\n var polygon1 = this;\n var direction = polygon1.plane.normal.dot(offsetvector);\n if (direction > 0) {\n polygon1 = polygon1.flipped();\n }\n newpolygons.push(polygon1);\n var polygon2 = polygon1.translate(offsetvector);\n var numvertices = this.vertices.length;\n for (var i = 0; i < numvertices; i++) {\n var sidefacepoints = [];\n var nexti = (i < (numvertices - 1)) ? i + 1 : 0;\n sidefacepoints.push(polygon1.vertices[i].pos);\n sidefacepoints.push(polygon2.vertices[i].pos);\n sidefacepoints.push(polygon2.vertices[nexti].pos);\n sidefacepoints.push(polygon1.vertices[nexti].pos);\n var sidefacepolygon = CSG.Polygon.createFromPoints(sidefacepoints, this.shared);\n newpolygons.push(sidefacepolygon);\n }\n polygon2 = polygon2.flipped();\n newpolygons.push(polygon2);\n return CSG.fromPolygons(newpolygons);\n },\n\n translate: function(offset) {\n return this.transform(CSG.Matrix4x4.translation(offset));\n },\n\n // returns an array with a CSG.Vector3D (center point) and a radius\n boundingSphere: function() {\n if (!this.cachedBoundingSphere) {\n var box = this.boundingBox();\n var middle = box[0].plus(box[1]).times(0.5);\n var radius3 = box[1].minus(middle);\n var radius = radius3.length();\n this.cachedBoundingSphere = [middle, radius];\n }\n return this.cachedBoundingSphere;\n },\n\n // returns an array of two CSG.Vector3Ds (minimum coordinates and maximum coordinates)\n boundingBox: function() {\n if (!this.cachedBoundingBox) {\n var minpoint, maxpoint;\n var vertices = this.vertices;\n var numvertices = vertices.length;\n if (numvertices === 0) {\n minpoint = new CSG.Vector3D(0, 0, 0);\n } else {\n minpoint = vertices[0].pos;\n }\n maxpoint = minpoint;\n for (var i = 1; i < numvertices; i++) {\n var point = vertices[i].pos;\n minpoint = minpoint.min(point);\n maxpoint = maxpoint.max(point);\n }\n this.cachedBoundingBox = [minpoint, maxpoint];\n }\n return this.cachedBoundingBox;\n },\n\n flipped: function() {\n var newvertices = this.vertices.map(function(v) {\n return v.flipped();\n });\n newvertices.reverse();\n var newplane = this.plane.flipped();\n return new CSG.Polygon(newvertices, this.shared, newplane);\n },\n\n // Affine transformation of polygon. Returns a new CSG.Polygon\n transform: function(matrix4x4) {\n var newvertices = this.vertices.map(function(v) {\n return v.transform(matrix4x4);\n });\n var newplane = this.plane.transform(matrix4x4);\n if (matrix4x4.isMirroring()) {\n // need to reverse the vertex order\n // in order to preserve the inside/outside orientation:\n newvertices.reverse();\n }\n return new CSG.Polygon(newvertices, this.shared, newplane);\n },\n\n toString: function() {\n var result = \"Polygon plane: \" + this.plane.toString() + \"\\n\";\n this.vertices.map(function(vertex) {\n result += \" \" + vertex.toString() + \"\\n\";\n });\n return result;\n },\n\n // project the 3D polygon onto a plane\n projectToOrthoNormalBasis: function(orthobasis) {\n var points2d = this.vertices.map(function(vertex) {\n return orthobasis.to2D(vertex.pos);\n });\n var result = CAG.fromPointsNoCheck(points2d);\n var area = result.area();\n if (Math.abs(area) < 1e-5) {\n // the polygon was perpendicular to the orthnormal plane. The resulting 2D polygon would be degenerate\n // return an empty area instead:\n result = new CAG();\n } else if (area < 0) {\n result = result.flipped();\n }\n return result;\n },\n\n /**\n * Creates solid from slices (CSG.Polygon) by generating walls\n * @param {Object} options Solid generating options\n * - numslices {Number} Number of slices to be generated\n * - callback(t, slice) {Function} Callback function generating slices.\n * arguments: t = [0..1], slice = [0..numslices - 1]\n * return: CSG.Polygon or null to skip\n * - loop {Boolean} no flats, only walls, it's used to generate solids like a tor\n */\n solidFromSlices: function(options) {\n var polygons = [],\n csg = null,\n prev = null,\n bottom = null,\n top = null,\n numSlices = 2,\n bLoop = false,\n fnCallback,\n flipped = null;\n\n if (options) {\n bLoop = Boolean(options['loop']);\n\n if (options.numslices)\n numSlices = options.numslices;\n\n if (options.callback)\n fnCallback = options.callback;\n }\n if (!fnCallback) {\n var square = new CSG.Polygon.createFromPoints([\n [0, 0, 0],\n [1, 0, 0],\n [1, 1, 0],\n [0, 1, 0]\n ]);\n fnCallback = function(t, slice) {\n return t == 0 || t == 1 ? square.translate([0, 0, t]) : null;\n }\n }\n for (var i = 0, iMax = numSlices - 1; i <= iMax; i++) {\n csg = fnCallback.call(this, i / iMax, i);\n if (csg) {\n if (!(csg instanceof CSG.Polygon)) {\n throw new Error(\"CSG.Polygon.solidFromSlices callback error: CSG.Polygon expected\");\n }\n csg.checkIfConvex();\n\n if (prev) { //generate walls\n if (flipped === null) { //not generated yet\n flipped = prev.plane.signedDistanceToPoint(csg.vertices[0].pos) < 0;\n }\n this._addWalls(polygons, prev, csg, flipped);\n\n } else { //the first - will be a bottom\n bottom = csg;\n }\n prev = csg;\n } //callback can return null to skip that slice\n }\n top = csg;\n\n if (bLoop) {\n var bSameTopBottom = bottom.vertices.length == top.vertices.length &&\n bottom.vertices.every(function(v, index) {\n return v.pos.equals(top.vertices[index].pos)\n });\n //if top and bottom are not the same -\n //generate walls between them\n if (!bSameTopBottom) {\n this._addWalls(polygons, top, bottom, flipped);\n } //else - already generated\n } else {\n //save top and bottom\n //TODO: flip if necessary\n polygons.unshift(flipped ? bottom : bottom.flipped());\n polygons.push(flipped ? top.flipped() : top);\n }\n return CSG.fromPolygons(polygons);\n },\n /**\n *\n * @param walls Array of wall polygons\n * @param bottom Bottom polygon\n * @param top Top polygon\n */\n _addWalls: function(walls, bottom, top, bFlipped) {\n var bottomPoints = bottom.vertices.slice(0), //make a copy\n topPoints = top.vertices.slice(0), //make a copy\n color = top.shared || null;\n\n //check if bottom perimeter is closed\n if (!bottomPoints[0].pos.equals(bottomPoints[bottomPoints.length - 1].pos)) {\n bottomPoints.push(bottomPoints[0]);\n }\n\n //check if top perimeter is closed\n if (!topPoints[0].pos.equals(topPoints[topPoints.length - 1].pos)) {\n topPoints.push(topPoints[0]);\n }\n if (bFlipped) {\n bottomPoints = bottomPoints.reverse();\n topPoints = topPoints.reverse();\n }\n\n var iTopLen = topPoints.length - 1,\n iBotLen = bottomPoints.length - 1,\n iExtra = iTopLen - iBotLen, //how many extra triangles we need\n bMoreTops = iExtra > 0,\n bMoreBottoms = iExtra < 0;\n\n var aMin = []; //indexes to start extra triangles (polygon with minimal square)\n //init - we need exactly /iExtra/ small triangles\n for (var i = Math.abs(iExtra); i > 0; i--) {\n aMin.push({\n len: Infinity,\n index: -1\n });\n }\n\n var len;\n if (bMoreBottoms) {\n for (var i = 0; i < iBotLen; i++) {\n len = bottomPoints[i].pos.distanceToSquared(bottomPoints[i + 1].pos);\n //find the element to replace\n for (var j = aMin.length - 1; j >= 0; j--) {\n if (aMin[j].len > len) {\n aMin[j].len = len;\n aMin.index = j;\n break;\n }\n } //for\n }\n } else if (bMoreTops) {\n for (var i = 0; i < iTopLen; i++) {\n len = topPoints[i].pos.distanceToSquared(topPoints[i + 1].pos);\n //find the element to replace\n for (var j = aMin.length - 1; j >= 0; j--) {\n if (aMin[j].len > len) {\n aMin[j].len = len;\n aMin.index = j;\n break;\n }\n } //for\n }\n } //if\n //sort by index\n aMin.sort(fnSortByIndex);\n var getTriangle = function addWallsPutTriangle(pointA, pointB, pointC, color) {\n return new CSG.Polygon([pointA, pointB, pointC], color);\n //return bFlipped ? triangle.flipped() : triangle;\n };\n\n var bpoint = bottomPoints[0],\n tpoint = topPoints[0],\n secondPoint,\n nBotFacet, nTopFacet; //length of triangle facet side\n for (var iB = 0, iT = 0, iMax = iTopLen + iBotLen; iB + iT < iMax;) {\n if (aMin.length) {\n if (bMoreTops && iT == aMin[0].index) { //one vertex is on the bottom, 2 - on the top\n secondPoint = topPoints[++iT];\n //console.log('<<< extra top: ' + secondPoint + ', ' + tpoint + ', bottom: ' + bpoint);\n walls.push(getTriangle(\n secondPoint, tpoint, bpoint, color\n ));\n tpoint = secondPoint;\n aMin.shift();\n continue;\n } else if (bMoreBottoms && iB == aMin[0].index) {\n secondPoint = bottomPoints[++iB];\n walls.push(getTriangle(\n tpoint, bpoint, secondPoint, color\n ));\n bpoint = secondPoint;\n aMin.shift();\n continue;\n }\n }\n //choose the shortest path\n if (iB < iBotLen) { //one vertex is on the top, 2 - on the bottom\n nBotFacet = tpoint.pos.distanceToSquared(bottomPoints[iB + 1].pos);\n } else {\n nBotFacet = Infinity;\n }\n if (iT < iTopLen) { //one vertex is on the bottom, 2 - on the top\n nTopFacet = bpoint.pos.distanceToSquared(topPoints[iT + 1].pos);\n } else {\n nTopFacet = Infinity;\n }\n if (nBotFacet <= nTopFacet) {\n secondPoint = bottomPoints[++iB];\n walls.push(getTriangle(\n tpoint, bpoint, secondPoint, color\n ));\n bpoint = secondPoint;\n } else if (iT < iTopLen) { //nTopFacet < Infinity\n secondPoint = topPoints[++iT];\n //console.log('<<< top: ' + secondPoint + ', ' + tpoint + ', bottom: ' + bpoint);\n walls.push(getTriangle(\n secondPoint, tpoint, bpoint, color\n ));\n tpoint = secondPoint;\n };\n }\n return walls;\n }\n };\n\n CSG.Polygon.verticesConvex = function(vertices, planenormal) {\n var numvertices = vertices.length;\n if (numvertices > 2) {\n var prevprevpos = vertices[numvertices - 2].pos;\n var prevpos = vertices[numvertices - 1].pos;\n for (var i = 0; i < numvertices; i++) {\n var pos = vertices[i].pos;\n if (!CSG.Polygon.isConvexPoint(prevprevpos, prevpos, pos, planenormal)) {\n return false;\n }\n prevprevpos = prevpos;\n prevpos = pos;\n }\n }\n return true;\n };\n\n // Create a polygon from the given points\n CSG.Polygon.createFromPoints = function(points, shared, plane) {\n var normal;\n if (arguments.length < 3) {\n // initially set a dummy vertex normal:\n normal = new CSG.Vector3D(0, 0, 0);\n } else {\n normal = plane.normal;\n }\n var vertices = [];\n points.map(function(p) {\n var vec = new CSG.Vector3D(p);\n var vertex = new CSG.Vertex(vec);\n vertices.push(vertex);\n });\n var polygon;\n if (arguments.length < 3) {\n polygon = new CSG.Polygon(vertices, shared);\n } else {\n polygon = new CSG.Polygon(vertices, shared, plane);\n }\n return polygon;\n };\n\n // calculate whether three points form a convex corner\n // prevpoint, point, nextpoint: the 3 coordinates (CSG.Vector3D instances)\n // normal: the normal vector of the plane\n CSG.Polygon.isConvexPoint = function(prevpoint, point, nextpoint, normal) {\n var crossproduct = point.minus(prevpoint).cross(nextpoint.minus(point));\n var crossdotnormal = crossproduct.dot(normal);\n return (crossdotnormal >= 0);\n };\n\n CSG.Polygon.isStrictlyConvexPoint = function(prevpoint, point, nextpoint, normal) {\n var crossproduct = point.minus(prevpoint).cross(nextpoint.minus(point));\n var crossdotnormal = crossproduct.dot(normal);\n return (crossdotnormal >= 1e-5);\n };\n\n // # class CSG.Polygon.Shared\n // Holds the shared properties for each polygon (currently only color)\n // Constructor expects a 4 element array [r,g,b,a], values from 0 to 1, or null\n CSG.Polygon.Shared = function(color) {\n if(color !== null)\n {\n if (color.length != 4) {\n throw new Error(\"Expecting 4 element array\");\n }\n }\n this.color = color;\n };\n\n CSG.Polygon.Shared.fromObject = function(obj) {\n return new CSG.Polygon.Shared(obj.color);\n };\n\n // Create CSG.Polygon.Shared from a color, can be called as follows:\n // var s = CSG.Polygon.Shared.fromColor(r,g,b [,a])\n // var s = CSG.Polygon.Shared.fromColor([r,g,b [,a]])\n CSG.Polygon.Shared.fromColor = function(args) {\n var color;\n if(arguments.length == 1) {\n color = arguments[0].slice(); // make deep copy\n }\n else {\n color = [];\n for(var i=0; i < arguments.length; i++) {\n color.push(arguments[i]);\n }\n }\n if(color.length == 3) {\n color.push(1);\n } else if(color.length != 4) {\n throw new Error(\"setColor expects either an array with 3 or 4 elements, or 3 or 4 parameters.\");\n }\n return new CSG.Polygon.Shared(color);\n };\n\n CSG.Polygon.Shared.prototype = {\n getTag: function() {\n var result = this.tag;\n if (!result) {\n result = CSG.getTag();\n this.tag = result;\n }\n return result;\n },\n // get a string uniquely identifying this object\n getHash: function() {\n if (!this.color) return \"null\";\n return this.color.join(\"/\");\n }\n };\n\n CSG.Polygon.defaultShared = new CSG.Polygon.Shared(null);\n\n // # class PolygonTreeNode\n // This class manages hierarchical splits of polygons\n // At the top is a root node which doesn hold a polygon, only child PolygonTreeNodes\n // Below that are zero or more 'top' nodes; each holds a polygon. The polygons can be in different planes\n // splitByPlane() splits a node by a plane. If the plane intersects the polygon, two new child nodes\n // are created holding the splitted polygon.\n // getPolygons() retrieves the polygon from the tree. If for PolygonTreeNode the polygon is split but\n // the two split parts (child nodes) are still intact, then the unsplit polygon is returned.\n // This ensures that we can safely split a polygon into many fragments. If the fragments are untouched,\n // getPolygons() will return the original unsplit polygon instead of the fragments.\n // remove() removes a polygon from the tree. Once a polygon is removed, the parent polygons are invalidated\n // since they are no longer intact.\n // constructor creates the root node:\n CSG.PolygonTreeNode = function() {\n this.parent = null;\n this.children = [];\n this.polygon = null;\n this.removed = false;\n };\n\n CSG.PolygonTreeNode.prototype = {\n // fill the tree with polygons. Should be called on the root node only; child nodes must\n // always be a derivate (split) of the parent node.\n addPolygons: function(polygons) {\n if (!this.isRootNode())\n // new polygons can only be added to root node; children can only be splitted polygons\n throw new Error(\"Assertion failed\");\n var _this = this;\n polygons.map(function(polygon) {\n _this.addChild(polygon);\n });\n },\n\n // remove a node\n // - the siblings become toplevel nodes\n // - the parent is removed recursively\n remove: function() {\n if (!this.removed) {\n this.removed = true;\n\n if (_CSGDEBUG) {\n if (this.isRootNode()) throw new Error(\"Assertion failed\"); // can't remove root node\n if (this.children.length) throw new Error(\"Assertion failed\"); // we shouldn't remove nodes with children\n }\n\n // remove ourselves from the parent's children list:\n var parentschildren = this.parent.children;\n var i = parentschildren.indexOf(this);\n if (i < 0) throw new Error(\"Assertion failed\");\n parentschildren.splice(i, 1);\n\n // invalidate the parent's polygon, and of all parents above it:\n this.parent.recursivelyInvalidatePolygon();\n }\n },\n\n isRemoved: function() {\n return this.removed;\n },\n\n isRootNode: function() {\n return !this.parent;\n },\n\n // invert all polygons in the tree. Call on the root node\n invert: function() {\n if (!this.isRootNode()) throw new Error(\"Assertion failed\"); // can only call this on the root node\n this.invertSub();\n },\n\n getPolygon: function() {\n if (!this.polygon) throw new Error(\"Assertion failed\"); // doesn't have a polygon, which means that it has been broken down\n return this.polygon;\n },\n\n getPolygons: function(result) {\n var children = [this];\n var queue = [children];\n var i, j, l, node;\n for (i = 0; i < queue.length; ++i ) { // queue size can change in loop, don't cache length\n children = queue[i];\n for (j = 0, l = children.length; j < l; j++) { // ok to cache length\n node = children[j];\n if (node.polygon) {\n // the polygon hasn't been broken yet. We can ignore the children and return our polygon:\n result.push(node.polygon);\n } else {\n // our polygon has been split up and broken, so gather all subpolygons from the children\n queue.push(node.children);\n }\n }\n }\n },\n\n // split the node by a plane; add the resulting nodes to the frontnodes and backnodes array\n // If the plane doesn't intersect the polygon, the 'this' object is added to one of the arrays\n // If the plane does intersect the polygon, two new child nodes are created for the front and back fragments,\n // and added to both arrays.\n splitByPlane: function(plane, coplanarfrontnodes, coplanarbacknodes, frontnodes, backnodes) {\n if (this.children.length) {\n var queue = [this.children], i, j, l, node, nodes;\n for (i = 0; i < queue.length; i++) { // queue.length can increase, do not cache\n nodes = queue[i];\n for (j = 0, l = nodes.length; j < l; j++) { // ok to cache length\n node = nodes[j];\n if (node.children.length) {\n queue.push(node.children);\n } else {\n // no children. Split the polygon:\n node._splitByPlane(plane, coplanarfrontnodes, coplanarbacknodes, frontnodes, backnodes);\n }\n }\n }\n } else {\n this._splitByPlane(plane, coplanarfrontnodes, coplanarbacknodes, frontnodes, backnodes);\n }\n },\n\n // only to be called for nodes with no children\n _splitByPlane: function (plane, coplanarfrontnodes, coplanarbacknodes, frontnodes, backnodes) {\n var polygon = this.polygon;\n if (polygon) {\n var bound = polygon.boundingSphere();\n var sphereradius = bound[1] + 1e-4;\n var planenormal = plane.normal;\n var spherecenter = bound[0];\n var d = planenormal.dot(spherecenter) - plane.w;\n if (d > sphereradius) {\n frontnodes.push(this);\n } else if (d < -sphereradius) {\n backnodes.push(this);\n } else {\n var splitresult = plane.splitPolygon(polygon);\n switch (splitresult.type) {\n case 0:\n // coplanar front:\n coplanarfrontnodes.push(this);\n break;\n\n case 1:\n // coplanar back:\n coplanarbacknodes.push(this);\n break;\n\n case 2:\n // front:\n frontnodes.push(this);\n break;\n\n case 3:\n // back:\n backnodes.push(this);\n break;\n\n case 4:\n // spanning:\n if (splitresult.front) {\n var frontnode = this.addChild(splitresult.front);\n frontnodes.push(frontnode);\n }\n if (splitresult.back) {\n var backnode = this.addChild(splitresult.back);\n backnodes.push(backnode);\n }\n break;\n }\n }\n }\n },\n\n\n // PRIVATE methods from here:\n // add child to a node\n // this should be called whenever the polygon is split\n // a child should be created for every fragment of the split polygon\n // returns the newly created child\n addChild: function(polygon) {\n var newchild = new CSG.PolygonTreeNode();\n newchild.parent = this;\n newchild.polygon = polygon;\n this.children.push(newchild);\n return newchild;\n },\n\n invertSub: function() {\n var children = [this];\n var queue = [children];\n var i, j, l, node;\n for (i = 0; i < queue.length; i++) {\n children = queue[i];\n for (j = 0, l = children.length; j < l; j++) {\n node = children[j];\n if (node.polygon) {\n node.polygon = node.polygon.flipped();\n }\n queue.push(node.children);\n }\n }\n },\n\n recursivelyInvalidatePolygon: function() {\n var node = this;\n while (node.polygon) {\n node.polygon = null;\n if (node.parent) {\n node = node.parent;\n }\n }\n }\n };\n\n\n\n // # class Tree\n // This is the root of a BSP tree\n // We are using this separate class for the root of the tree, to hold the PolygonTreeNode root\n // The actual tree is kept in this.rootnode\n CSG.Tree = function(polygons) {\n this.polygonTree = new CSG.PolygonTreeNode();\n this.rootnode = new CSG.Node(null);\n if (polygons) this.addPolygons(polygons);\n };\n\n CSG.Tree.prototype = {\n invert: function() {\n this.polygonTree.invert();\n this.rootnode.invert();\n },\n\n // Remove all polygons in this BSP tree that are inside the other BSP tree\n // `tree`.\n clipTo: function(tree, alsoRemovecoplanarFront) {\n alsoRemovecoplanarFront = alsoRemovecoplanarFront ? true : false;\n this.rootnode.clipTo(tree, alsoRemovecoplanarFront);\n },\n\n allPolygons: function() {\n var result = [];\n this.polygonTree.getPolygons(result);\n return result;\n },\n\n addPolygons: function(polygons) {\n var _this = this;\n var polygontreenodes = polygons.map(function(p) {\n return _this.polygonTree.addChild(p);\n });\n this.rootnode.addPolygonTreeNodes(polygontreenodes);\n }\n };\n\n // # class Node\n // Holds a node in a BSP tree. A BSP tree is built from a collection of polygons\n // by picking a polygon to split along.\n // Polygons are not stored directly in the tree, but in PolygonTreeNodes, stored in\n // this.polygontreenodes. Those PolygonTreeNodes are children of the owning\n // CSG.Tree.polygonTree\n // This is not a leafy BSP tree since there is\n // no distinction between internal and leaf nodes.\n CSG.Node = function(parent) {\n this.plane = null;\n this.front = null;\n this.back = null;\n this.polygontreenodes = [];\n this.parent = parent;\n };\n\n CSG.Node.prototype = {\n // Convert solid space to empty space and empty space to solid space.\n invert: function() {\n var queue = [this];\n var i, node;\n for (var i = 0; i < queue.length; i++) {\n node = queue[i];\n if(node.plane) node.plane = node.plane.flipped();\n if(node.front) queue.push(node.front);\n if(node.back) queue.push(node.back);\n var temp = node.front;\n node.front = node.back;\n node.back = temp;\n }\n },\n\n // clip polygontreenodes to our plane\n // calls remove() for all clipped PolygonTreeNodes\n clipPolygons: function(polygontreenodes, alsoRemovecoplanarFront) {\n var args = {'node': this, 'polygontreenodes': polygontreenodes }\n var node;\n var stack = [];\n\n do {\n node = args.node;\n polygontreenodes = args.polygontreenodes;\n\n // begin \"function\"\n if(node.plane) {\n var backnodes = [];\n var frontnodes = [];\n var coplanarfrontnodes = alsoRemovecoplanarFront ? backnodes : frontnodes;\n var plane = node.plane;\n var numpolygontreenodes = polygontreenodes.length;\n for(i = 0; i < numpolygontreenodes; i++) {\n var node1 = polygontreenodes[i];\n if(!node1.isRemoved()) {\n node1.splitByPlane(plane, coplanarfrontnodes, backnodes, frontnodes, backnodes);\n }\n }\n\n if(node.front && (frontnodes.length > 0)) {\n stack.push({'node': node.front, 'polygontreenodes': frontnodes});\n }\n var numbacknodes = backnodes.length;\n if (node.back && (numbacknodes > 0)) {\n stack.push({'node': node.back, 'polygontreenodes': backnodes});\n } else {\n // there's nothing behind this plane. Delete the nodes behind this plane:\n for (var i = 0; i < numbacknodes; i++) {\n backnodes[i].remove();\n }\n }\n }\n args = stack.pop();\n } while (typeof(args) !== 'undefined');\n },\n\n // Remove all polygons in this BSP tree that are inside the other BSP tree\n // `tree`.\n clipTo: function(tree, alsoRemovecoplanarFront) {\n var node = this, stack = [];\n do {\n if(node.polygontreenodes.length > 0) {\n tree.rootnode.clipPolygons(node.polygontreenodes, alsoRemovecoplanarFront);\n }\n if(node.front) stack.push(node.front);\n if(node.back) stack.push(node.back);\n node = stack.pop();\n } while(typeof(node) !== 'undefined');\n },\n\n addPolygonTreeNodes: function(polygontreenodes) {\n var args = {'node': this, 'polygontreenodes': polygontreenodes };\n var node;\n var stack = [];\n do {\n node = args.node;\n polygontreenodes = args.polygontreenodes;\n\n if (polygontreenodes.length === 0) {\n args = stack.pop();\n continue;\n }\n var _this = node;\n if (!node.plane) {\n var bestplane = polygontreenodes[0].getPolygon().plane;\n node.plane = bestplane;\n }\n var frontnodes = [];\n var backnodes = [];\n\n for (var i = 0, n = polygontreenodes.length ; i < n; ++i) {\n polygontreenodes[i].splitByPlane(_this.plane, _this.polygontreenodes, backnodes, frontnodes, backnodes);\n }\n\n if (frontnodes.length > 0) {\n if (!node.front) node.front = new CSG.Node(node);\n stack.push({'node': node.front, 'polygontreenodes': frontnodes});\n }\n if (backnodes.length > 0) {\n if (!node.back) node.back = new CSG.Node(node);\n stack.push({'node': node.back, 'polygontreenodes': backnodes});\n }\n\n args = stack.pop();\n } while (typeof(args) !== 'undefined');\n },\n\n getParentPlaneNormals: function(normals, maxdepth) {\n if (maxdepth > 0) {\n if (this.parent) {\n normals.push(this.parent.plane.normal);\n this.parent.getParentPlaneNormals(normals, maxdepth - 1);\n }\n }\n }\n };\n\n //////////\n // # class Matrix4x4:\n // Represents a 4x4 matrix. Elements are specified in row order\n CSG.Matrix4x4 = function(elements) {\n if (arguments.length >= 1) {\n this.elements = elements;\n } else {\n // if no arguments passed: create unity matrix\n this.elements = [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1];\n }\n };\n\n CSG.Matrix4x4.prototype = {\n plus: function(m) {\n var r = [];\n for (var i = 0; i < 16; i++) {\n r[i] = this.elements[i] + m.elements[i];\n }\n return new CSG.Matrix4x4(r);\n },\n\n minus: function(m) {\n var r = [];\n for (var i = 0; i < 16; i++) {\n r[i] = this.elements[i] - m.elements[i];\n }\n return new CSG.Matrix4x4(r);\n },\n\n // right multiply by another 4x4 matrix:\n multiply: function(m) {\n // cache elements in local variables, for speedup:\n var this0 = this.elements[0];\n var this1 = this.elements[1];\n var this2 = this.elements[2];\n var this3 = this.elements[3];\n var this4 = this.elements[4];\n var this5 = this.elements[5];\n var this6 = this.elements[6];\n var this7 = this.elements[7];\n var this8 = this.elements[8];\n var this9 = this.elements[9];\n var this10 = this.elements[10];\n var this11 = this.elements[11];\n var this12 = this.elements[12];\n var this13 = this.elements[13];\n var this14 = this.elements[14];\n var this15 = this.elements[15];\n var m0 = m.elements[0];\n var m1 = m.elements[1];\n var m2 = m.elements[2];\n var m3 = m.elements[3];\n var m4 = m.elements[4];\n var m5 = m.elements[5];\n var m6 = m.elements[6];\n var m7 = m.elements[7];\n var m8 = m.elements[8];\n var m9 = m.elements[9];\n var m10 = m.elements[10];\n var m11 = m.elements[11];\n var m12 = m.elements[12];\n var m13 = m.elements[13];\n var m14 = m.elements[14];\n var m15 = m.elements[15];\n\n var result = [];\n result[0] = this0 * m0 + this1 * m4 + this2 * m8 + this3 * m12;\n result[1] = this0 * m1 + this1 * m5 + this2 * m9 + this3 * m13;\n result[2] = this0 * m2 + this1 * m6 + this2 * m10 + this3 * m14;\n result[3] = this0 * m3 + this1 * m7 + this2 * m11 + this3 * m15;\n result[4] = this4 * m0 + this5 * m4 + this6 * m8 + this7 * m12;\n result[5] = this4 * m1 + this5 * m5 + this6 * m9 + this7 * m13;\n result[6] = this4 * m2 + this5 * m6 + this6 * m10 + this7 * m14;\n result[7] = this4 * m3 + this5 * m7 + this6 * m11 + this7 * m15;\n result[8] = this8 * m0 + this9 * m4 + this10 * m8 + this11 * m12;\n result[9] = this8 * m1 + this9 * m5 + this10 * m9 + this11 * m13;\n result[10] = this8 * m2 + this9 * m6 + this10 * m10 + this11 * m14;\n result[11] = this8 * m3 + this9 * m7 + this10 * m11 + this11 * m15;\n result[12] = this12 * m0 + this13 * m4 + this14 * m8 + this15 * m12;\n result[13] = this12 * m1 + this13 * m5 + this14 * m9 + this15 * m13;\n result[14] = this12 * m2 + this13 * m6 + this14 * m10 + this15 * m14;\n result[15] = this12 * m3 + this13 * m7 + this14 * m11 + this15 * m15;\n return new CSG.Matrix4x4(result);\n },\n\n clone: function() {\n var elements = this.elements.map(function(p) {\n return p;\n });\n return new CSG.Matrix4x4(elements);\n },\n\n // Right multiply the matrix by a CSG.Vector3D (interpreted as 3 row, 1 column)\n // (result = M*v)\n // Fourth element is taken as 1\n rightMultiply1x3Vector: function(v) {\n var v0 = v._x;\n var v1 = v._y;\n var v2 = v._z;\n var v3 = 1;\n var x = v0 * this.elements[0] + v1 * this.elements[1] + v2 * this.elements[2] + v3 * this.elements[3];\n var y = v0 * this.elements[4] + v1 * this.elements[5] + v2 * this.elements[6] + v3 * this.elements[7];\n var z = v0 * this.elements[8] + v1 * this.elements[9] + v2 * this.elements[10] + v3 * this.elements[11];\n var w = v0 * this.elements[12] + v1 * this.elements[13] + v2 * this.elements[14] + v3 * this.elements[15];\n // scale such that fourth element becomes 1:\n if (w != 1) {\n var invw = 1.0 / w;\n x *= invw;\n y *= invw;\n z *= invw;\n }\n return new CSG.Vector3D(x, y, z);\n },\n\n // Multiply a CSG.Vector3D (interpreted as 3 column, 1 row) by this matrix\n // (result = v*M)\n // Fourth element is taken as 1\n leftMultiply1x3Vector: function(v) {\n var v0 = v._x;\n var v1 = v._y;\n var v2 = v._z;\n var v3 = 1;\n var x = v0 * this.elements[0] + v1 * this.elements[4] + v2 * this.elements[8] + v3 * this.elements[12];\n var y = v0 * this.elements[1] + v1 * this.elements[5] + v2 * this.elements[9] + v3 * this.elements[13];\n var z = v0 * this.elements[2] + v1 * this.elements[6] + v2 * this.elements[10] + v3 * this.elements[14];\n var w = v0 * this.elements[3] + v1 * this.elements[7] + v2 * this.elements[11] + v3 * this.elements[15];\n // scale such that fourth element becomes 1:\n if (w != 1) {\n var invw = 1.0 / w;\n x *= invw;\n y *= invw;\n z *= invw;\n }\n return new CSG.Vector3D(x, y, z);\n },\n\n // Right multiply the matrix by a CSG.Vector2D (interpreted as 2 row, 1 column)\n // (result = M*v)\n // Fourth element is taken as 1\n rightMultiply1x2Vector: function(v) {\n var v0 = v.x;\n var v1 = v.y;\n var v2 = 0;\n var v3 = 1;\n var x = v0 * this.elements[0] + v1 * this.elements[1] + v2 * this.elements[2] + v3 * this.elements[3];\n var y = v0 * this.elements[4] + v1 * this.elements[5] + v2 * this.elements[6] + v3 * this.elements[7];\n var z = v0 * this.elements[8] + v1 * this.elements[9] + v2 * this.elements[10] + v3 * this.elements[11];\n var w = v0 * this.elements[12] + v1 * this.elements[13] + v2 * this.elements[14] + v3 * this.elements[15];\n // scale such that fourth element becomes 1:\n if (w != 1) {\n var invw = 1.0 / w;\n x *= invw;\n y *= invw;\n z *= invw;\n }\n return new CSG.Vector2D(x, y);\n },\n\n // Multiply a CSG.Vector2D (interpreted as 2 column, 1 row) by this matrix\n // (result = v*M)\n // Fourth element is taken as 1\n leftMultiply1x2Vector: function(v) {\n var v0 = v.x;\n var v1 = v.y;\n var v2 = 0;\n var v3 = 1;\n var x = v0 * this.elements[0] + v1 * this.elements[4] + v2 * this.elements[8] + v3 * this.elements[12];\n var y = v0 * this.elements[1] + v1 * this.elements[5] + v2 * this.elements[9] + v3 * this.elements[13];\n var z = v0 * this.elements[2] + v1 * this.elements[6] + v2 * this.elements[10] + v3 * this.elements[14];\n var w = v0 * this.elements[3] + v1 * this.elements[7] + v2 * this.elements[11] + v3 * this.elements[15];\n // scale such that fourth element becomes 1:\n if (w != 1) {\n var invw = 1.0 / w;\n x *= invw;\n y *= invw;\n z *= invw;\n }\n return new CSG.Vector2D(x, y);\n },\n\n // determine whether this matrix is a mirroring transformation\n isMirroring: function() {\n var u = new CSG.Vector3D(this.elements[0], this.elements[4], this.elements[8]);\n var v = new CSG.Vector3D(this.elements[1], this.elements[5], this.elements[9]);\n var w = new CSG.Vector3D(this.elements[2], this.elements[6], this.elements[10]);\n\n // for a true orthogonal, non-mirrored base, u.cross(v) == w\n // If they have an opposite direction then we are mirroring\n var mirrorvalue = u.cross(v).dot(w);\n var ismirror = (mirrorvalue < 0);\n return ismirror;\n }\n };\n\n // return the unity matrix\n CSG.Matrix4x4.unity = function() {\n return new CSG.Matrix4x4();\n };\n\n // Create a rotation matrix for rotating around the x axis\n CSG.Matrix4x4.rotationX = function(degrees) {\n var radians = degrees * Math.PI * (1.0 / 180.0);\n var cos = Math.cos(radians);\n var sin = Math.sin(radians);\n var els = [\n 1, 0, 0, 0, 0, cos, sin, 0, 0, -sin, cos, 0, 0, 0, 0, 1\n ];\n return new CSG.Matrix4x4(els);\n };\n\n // Create a rotation matrix for rotating around the y axis\n CSG.Matrix4x4.rotationY = function(degrees) {\n var radians = degrees * Math.PI * (1.0 / 180.0);\n var cos = Math.cos(radians);\n var sin = Math.sin(radians);\n var els = [\n cos, 0, -sin, 0, 0, 1, 0, 0, sin, 0, cos, 0, 0, 0, 0, 1\n ];\n return new CSG.Matrix4x4(els);\n };\n\n // Create a rotation matrix for rotating around the z axis\n CSG.Matrix4x4.rotationZ = function(degrees) {\n var radians = degrees * Math.PI * (1.0 / 180.0);\n var cos = Math.cos(radians);\n var sin = Math.sin(radians);\n var els = [\n cos, sin, 0, 0, -sin, cos, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1\n ];\n return new CSG.Matrix4x4(els);\n };\n\n // Matrix for rotation about arbitrary point and axis\n CSG.Matrix4x4.rotation = function(rotationCenter, rotationAxis, degrees) {\n rotationCenter = new CSG.Vector3D(rotationCenter);\n rotationAxis = new CSG.Vector3D(rotationAxis);\n var rotationPlane = CSG.Plane.fromNormalAndPoint(rotationAxis, rotationCenter);\n var orthobasis = new CSG.OrthoNormalBasis(rotationPlane);\n var transformation = CSG.Matrix4x4.translation(rotationCenter.negated());\n transformation = transformation.multiply(orthobasis.getProjectionMatrix());\n transformation = transformation.multiply(CSG.Matrix4x4.rotationZ(degrees));\n transformation = transformation.multiply(orthobasis.getInverseProjectionMatrix());\n transformation = transformation.multiply(CSG.Matrix4x4.translation(rotationCenter));\n return transformation;\n };\n\n // Create an affine matrix for translation:\n CSG.Matrix4x4.translation = function(v) {\n // parse as CSG.Vector3D, so we can pass an array or a CSG.Vector3D\n var vec = new CSG.Vector3D(v);\n var els = [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, vec.x, vec.y, vec.z, 1];\n return new CSG.Matrix4x4(els);\n };\n\n // Create an affine matrix for mirroring into an arbitrary plane:\n CSG.Matrix4x4.mirroring = function(plane) {\n var nx = plane.normal.x;\n var ny = plane.normal.y;\n var nz = plane.normal.z;\n var w = plane.w;\n var els = [\n (1.0 - 2.0 * nx * nx), (-2.0 * ny * nx), (-2.0 * nz * nx), 0,\n (-2.0 * nx * ny), (1.0 - 2.0 * ny * ny), (-2.0 * nz * ny), 0,\n (-2.0 * nx * nz), (-2.0 * ny * nz), (1.0 - 2.0 * nz * nz), 0,\n (2.0 * nx * w), (2.0 * ny * w), (2.0 * nz * w), 1\n ];\n return new CSG.Matrix4x4(els);\n };\n\n // Create an affine matrix for scaling:\n CSG.Matrix4x4.scaling = function(v) {\n // parse as CSG.Vector3D, so we can pass an array or a CSG.Vector3D\n var vec = new CSG.Vector3D(v);\n var els = [\n vec.x, 0, 0, 0, 0, vec.y, 0, 0, 0, 0, vec.z, 0, 0, 0, 0, 1\n ];\n return new CSG.Matrix4x4(els);\n };\n\n ///////////////////////////////////////////////////\n // # class Vector2D:\n // Represents a 2 element vector\n CSG.Vector2D = function(x, y) {\n if (arguments.length == 2) {\n this._x = parseFloat(x);\n this._y = parseFloat(y);\n } else {\n var ok = true;\n if (arguments.length == 1) {\n if (typeof(x) == \"object\") {\n if (x instanceof CSG.Vector2D) {\n this._x = x._x;\n this._y = x._y;\n } else if (x instanceof Array) {\n this._x = parseFloat(x[0]);\n this._y = parseFloat(x[1]);\n } else if (('x' in x) && ('y' in x)) {\n this._x = parseFloat(x.x);\n this._y = parseFloat(x.y);\n } else ok = false;\n } else {\n var v = parseFloat(x);\n this._x = v;\n this._y = v;\n }\n } else ok = false;\n if (ok) {\n if ((!CSG.IsFloat(this._x)) || (!CSG.IsFloat(this._y))) ok = false;\n }\n if (!ok) {\n throw new Error(\"wrong arguments\");\n }\n }\n };\n\n CSG.Vector2D.fromAngle = function(radians) {\n return CSG.Vector2D.fromAngleRadians(radians);\n };\n\n CSG.Vector2D.fromAngleDegrees = function(degrees) {\n var radians = Math.PI * degrees / 180;\n return CSG.Vector2D.fromAngleRadians(radians);\n };\n\n CSG.Vector2D.fromAngleRadians = function(radians) {\n return CSG.Vector2D.Create(Math.cos(radians), Math.sin(radians));\n };\n\n // This does the same as new CSG.Vector2D(x,y) but it doesn't go through the constructor\n // and the parameters are not validated. Is much faster.\n CSG.Vector2D.Create = function(x, y) {\n var result = Object.create(CSG.Vector2D.prototype);\n result._x = x;\n result._y = y;\n return result;\n };\n\n CSG.Vector2D.prototype = {\n get x() {\n return this._x;\n },\n get y() {\n return this._y;\n },\n\n set x(v) {\n throw new Error(\"Vector2D is immutable\");\n },\n set y(v) {\n throw new Error(\"Vector2D is immutable\");\n },\n\n // extend to a 3D vector by adding a z coordinate:\n toVector3D: function(z) {\n return new CSG.Vector3D(this._x, this._y, z);\n },\n\n equals: function(a) {\n return (this._x == a._x) && (this._y == a._y);\n },\n\n clone: function() {\n return CSG.Vector2D.Create(this._x, this._y);\n },\n\n negated: function() {\n return CSG.Vector2D.Create(-this._x, -this._y);\n },\n\n plus: function(a) {\n return CSG.Vector2D.Create(this._x + a._x, this._y + a._y);\n },\n\n minus: function(a) {\n return CSG.Vector2D.Create(this._x - a._x, this._y - a._y);\n },\n\n times: function(a) {\n return CSG.Vector2D.Create(this._x * a, this._y * a);\n },\n\n dividedBy: function(a) {\n return CSG.Vector2D.Create(this._x / a, this._y / a);\n },\n\n dot: function(a) {\n return this._x * a._x + this._y * a._y;\n },\n\n lerp: function(a, t) {\n return this.plus(a.minus(this).times(t));\n },\n\n length: function() {\n return Math.sqrt(this.dot(this));\n },\n\n distanceTo: function(a) {\n return this.minus(a).length();\n },\n\n distanceToSquared: function(a) {\n return this.minus(a).lengthSquared();\n },\n\n lengthSquared: function() {\n return this.dot(this);\n },\n\n unit: function() {\n return this.dividedBy(this.length());\n },\n\n cross: function(a) {\n return this._x * a._y - this._y * a._x;\n },\n\n // returns the vector rotated by 90 degrees clockwise\n normal: function() {\n return CSG.Vector2D.Create(this._y, -this._x);\n },\n\n // Right multiply by a 4x4 matrix (the vector is interpreted as a row vector)\n // Returns a new CSG.Vector2D\n multiply4x4: function(matrix4x4) {\n return matrix4x4.leftMultiply1x2Vector(this);\n },\n\n transform: function(matrix4x4) {\n return matrix4x4.leftMultiply1x2Vector(this);\n },\n\n angle: function() {\n return this.angleRadians();\n },\n\n angleDegrees: function() {\n var radians = this.angleRadians();\n return 180 * radians / Math.PI;\n },\n\n angleRadians: function() {\n // y=sin, x=cos\n return Math.atan2(this._y, this._x);\n },\n\n min: function(p) {\n return CSG.Vector2D.Create(\n Math.min(this._x, p._x), Math.min(this._y, p._y));\n },\n\n max: function(p) {\n return CSG.Vector2D.Create(\n Math.max(this._x, p._x), Math.max(this._y, p._y));\n },\n\n toString: function() {\n return \"(\" + this._x.toFixed(2) + \", \" + this._y.toFixed(2) + \")\";\n },\n\n abs: function() {\n return CSG.Vector2D.Create(Math.abs(this._x), Math.abs(this._y));\n },\n };\n\n\n // # class Line2D\n // Represents a directional line in 2D space\n // A line is parametrized by its normal vector (perpendicular to the line, rotated 90 degrees counter clockwise)\n // and w. The line passes through the point .times(w).\n // normal must be a unit vector!\n // Equation: p is on line if normal.dot(p)==w\n CSG.Line2D = function(normal, w) {\n normal = new CSG.Vector2D(normal);\n w = parseFloat(w);\n var l = normal.length();\n // normalize:\n w *= l;\n normal = normal.times(1.0 / l);\n this.normal = normal;\n this.w = w;\n };\n\n CSG.Line2D.fromPoints = function(p1, p2) {\n p1 = new CSG.Vector2D(p1);\n p2 = new CSG.Vector2D(p2);\n var direction = p2.minus(p1);\n var normal = direction.normal().negated().unit();\n var w = p1.dot(normal);\n return new CSG.Line2D(normal, w);\n };\n\n CSG.Line2D.prototype = {\n // same line but opposite direction:\n reverse: function() {\n return new CSG.Line2D(this.normal.negated(), -this.w);\n },\n\n equals: function(l) {\n return (l.normal.equals(this.normal) && (l.w == this.w));\n },\n\n origin: function() {\n return this.normal.times(this.w);\n },\n\n direction: function() {\n return this.normal.normal();\n },\n\n xAtY: function(y) {\n // (py == y) && (normal * p == w)\n // -> px = (w - normal._y * y) / normal.x\n var x = (this.w - this.normal._y * y) / this.normal.x;\n return x;\n },\n\n absDistanceToPoint: function(point) {\n point = new CSG.Vector2D(point);\n var point_projected = point.dot(this.normal);\n var distance = Math.abs(point_projected - this.w);\n return distance;\n },\n /*FIXME: has error - origin is not defined, the method is never used\n closestPoint: function(point) {\n point = new CSG.Vector2D(point);\n var vector = point.dot(this.direction());\n return origin.plus(vector);\n },\n */\n\n // intersection between two lines, returns point as Vector2D\n intersectWithLine: function(line2d) {\n var point = CSG.solve2Linear(this.normal.x, this.normal.y, line2d.normal.x, line2d.normal.y, this.w, line2d.w);\n point = new CSG.Vector2D(point); // make vector2d\n return point;\n },\n\n transform: function(matrix4x4) {\n var origin = new CSG.Vector2D(0, 0);\n var pointOnPlane = this.normal.times(this.w);\n var neworigin = origin.multiply4x4(matrix4x4);\n var neworiginPlusNormal = this.normal.multiply4x4(matrix4x4);\n var newnormal = neworiginPlusNormal.minus(neworigin);\n var newpointOnPlane = pointOnPlane.multiply4x4(matrix4x4);\n var neww = newnormal.dot(newpointOnPlane);\n return new CSG.Line2D(newnormal, neww);\n }\n };\n\n // # class Line3D\n // Represents a line in 3D space\n // direction must be a unit vector\n // point is a random point on the line\n CSG.Line3D = function(point, direction) {\n point = new CSG.Vector3D(point);\n direction = new CSG.Vector3D(direction);\n this.point = point;\n this.direction = direction.unit();\n };\n\n CSG.Line3D.fromPoints = function(p1, p2) {\n p1 = new CSG.Vector3D(p1);\n p2 = new CSG.Vector3D(p2);\n var direction = p2.minus(p1);\n return new CSG.Line3D(p1, direction);\n };\n\n CSG.Line3D.fromPlanes = function(p1, p2) {\n var direction = p1.normal.cross(p2.normal);\n var l = direction.length();\n if (l < 1e-10) {\n throw new Error(\"Parallel planes\");\n }\n direction = direction.times(1.0 / l);\n\n var mabsx = Math.abs(direction.x);\n var mabsy = Math.abs(direction.y);\n var mabsz = Math.abs(direction.z);\n var origin;\n if ((mabsx >= mabsy) && (mabsx >= mabsz)) {\n // direction vector is mostly pointing towards x\n // find a point p for which x is zero:\n var r = CSG.solve2Linear(p1.normal.y, p1.normal.z, p2.normal.y, p2.normal.z, p1.w, p2.w);\n origin = new CSG.Vector3D(0, r[0], r[1]);\n } else if ((mabsy >= mabsx) && (mabsy >= mabsz)) {\n // find a point p for which y is zero:\n var r = CSG.solve2Linear(p1.normal.x, p1.normal.z, p2.normal.x, p2.normal.z, p1.w, p2.w);\n origin = new CSG.Vector3D(r[0], 0, r[1]);\n } else {\n // find a point p for which z is zero:\n var r = CSG.solve2Linear(p1.normal.x, p1.normal.y, p2.normal.x, p2.normal.y, p1.w, p2.w);\n origin = new CSG.Vector3D(r[0], r[1], 0);\n }\n return new CSG.Line3D(origin, direction);\n };\n\n\n CSG.Line3D.prototype = {\n intersectWithPlane: function(plane) {\n // plane: plane.normal * p = plane.w\n // line: p=line.point + labda * line.direction\n var labda = (plane.w - plane.normal.dot(this.point)) / plane.normal.dot(this.direction);\n var point = this.point.plus(this.direction.times(labda));\n return point;\n },\n\n clone: function(line) {\n return new CSG.Line3D(this.point.clone(), this.direction.clone());\n },\n\n reverse: function() {\n return new CSG.Line3D(this.point.clone(), this.direction.negated());\n },\n\n transform: function(matrix4x4) {\n var newpoint = this.point.multiply4x4(matrix4x4);\n var pointPlusDirection = this.point.plus(this.direction);\n var newPointPlusDirection = pointPlusDirection.multiply4x4(matrix4x4);\n var newdirection = newPointPlusDirection.minus(newpoint);\n return new CSG.Line3D(newpoint, newdirection);\n },\n\n closestPointOnLine: function(point) {\n point = new CSG.Vector3D(point);\n var t = point.minus(this.point).dot(this.direction) / this.direction.dot(this.direction);\n var closestpoint = this.point.plus(this.direction.times(t));\n return closestpoint;\n },\n\n distanceToPoint: function(point) {\n point = new CSG.Vector3D(point);\n var closestpoint = this.closestPointOnLine(point);\n var distancevector = point.minus(closestpoint);\n var distance = distancevector.length();\n return distance;\n },\n\n equals: function(line3d) {\n if (!this.direction.equals(line3d.direction)) return false;\n var distance = this.distanceToPoint(line3d.point);\n if (distance > 1e-8) return false;\n return true;\n }\n };\n\n\n // # class OrthoNormalBasis\n // Reprojects points on a 3D plane onto a 2D plane\n // or from a 2D plane back onto the 3D plane\n CSG.OrthoNormalBasis = function(plane, rightvector) {\n if (arguments.length < 2) {\n // choose an arbitrary right hand vector, making sure it is somewhat orthogonal to the plane normal:\n rightvector = plane.normal.randomNonParallelVector();\n } else {\n rightvector = new CSG.Vector3D(rightvector);\n }\n this.v = plane.normal.cross(rightvector).unit();\n this.u = this.v.cross(plane.normal);\n this.plane = plane;\n this.planeorigin = plane.normal.times(plane.w);\n };\n\n // Get an orthonormal basis for the standard XYZ planes.\n // Parameters: the names of two 3D axes. The 2d x axis will map to the first given 3D axis, the 2d y \n // axis will map to the second.\n // Prepend the axis with a \"-\" to invert the direction of this axis.\n // For example: CSG.OrthoNormalBasis.GetCartesian(\"-Y\",\"Z\")\n // will return an orthonormal basis where the 2d X axis maps to the 3D inverted Y axis, and\n // the 2d Y axis maps to the 3D Z axis.\n CSG.OrthoNormalBasis.GetCartesian = function(xaxisid, yaxisid) {\n var axisid = xaxisid + \"/\" + yaxisid;\n var planenormal, rightvector;\n if (axisid == \"X/Y\") {\n planenormal = [0, 0, 1];\n rightvector = [1, 0, 0];\n } else if (axisid == \"Y/-X\") {\n planenormal = [0, 0, 1];\n rightvector = [0, 1, 0];\n } else if (axisid == \"-X/-Y\") {\n planenormal = [0, 0, 1];\n rightvector = [-1, 0, 0];\n } else if (axisid == \"-Y/X\") {\n planenormal = [0, 0, 1];\n rightvector = [0, -1, 0];\n } else if (axisid == \"-X/Y\") {\n planenormal = [0, 0, -1];\n rightvector = [-1, 0, 0];\n } else if (axisid == \"-Y/-X\") {\n planenormal = [0, 0, -1];\n rightvector = [0, -1, 0];\n } else if (axisid == \"X/-Y\") {\n planenormal = [0, 0, -1];\n rightvector = [1, 0, 0];\n } else if (axisid == \"Y/X\") {\n planenormal = [0, 0, -1];\n rightvector = [0, 1, 0];\n } else if (axisid == \"X/Z\") {\n planenormal = [0, -1, 0];\n rightvector = [1, 0, 0];\n } else if (axisid == \"Z/-X\") {\n planenormal = [0, -1, 0];\n rightvector = [0, 0, 1];\n } else if (axisid == \"-X/-Z\") {\n planenormal = [0, -1, 0];\n rightvector = [-1, 0, 0];\n } else if (axisid == \"-Z/X\") {\n planenormal = [0, -1, 0];\n rightvector = [0, 0, -1];\n } else if (axisid == \"-X/Z\") {\n planenormal = [0, 1, 0];\n rightvector = [-1, 0, 0];\n } else if (axisid == \"-Z/-X\") {\n planenormal = [0, 1, 0];\n rightvector = [0, 0, -1];\n } else if (axisid == \"X/-Z\") {\n planenormal = [0, 1, 0];\n rightvector = [1, 0, 0];\n } else if (axisid == \"Z/X\") {\n planenormal = [0, 1, 0];\n rightvector = [0, 0, 1];\n } else if (axisid == \"Y/Z\") {\n planenormal = [1, 0, 0];\n rightvector = [0, 1, 0];\n } else if (axisid == \"Z/-Y\") {\n planenormal = [1, 0, 0];\n rightvector = [0, 0, 1];\n } else if (axisid == \"-Y/-Z\") {\n planenormal = [1, 0, 0];\n rightvector = [0, -1, 0];\n } else if (axisid == \"-Z/Y\") {\n planenormal = [1, 0, 0];\n rightvector = [0, 0, -1];\n } else if (axisid == \"-Y/Z\") {\n planenormal = [-1, 0, 0];\n rightvector = [0, -1, 0];\n } else if (axisid == \"-Z/-Y\") {\n planenormal = [-1, 0, 0];\n rightvector = [0, 0, -1];\n } else if (axisid == \"Y/-Z\") {\n planenormal = [-1, 0, 0];\n rightvector = [0, 1, 0];\n } else if (axisid == \"Z/Y\") {\n planenormal = [-1, 0, 0];\n rightvector = [0, 0, 1];\n } else {\n throw new Error(\"CSG.OrthoNormalBasis.GetCartesian: invalid combination of axis identifiers. Should pass two string arguments from [X,Y,Z,-X,-Y,-Z], being two different axes.\");\n }\n return new CSG.OrthoNormalBasis(new CSG.Plane(new CSG.Vector3D(planenormal), 0), new CSG.Vector3D(rightvector));\n };\n\n /*\n // test code for CSG.OrthoNormalBasis.GetCartesian()\n CSG.OrthoNormalBasis.GetCartesian_Test=function() {\n var axisnames=[\"X\",\"Y\",\"Z\",\"-X\",\"-Y\",\"-Z\"];\n var axisvectors=[[1,0,0], [0,1,0], [0,0,1], [-1,0,0], [0,-1,0], [0,0,-1]];\n for(var axis1=0; axis1 < 3; axis1++) {\n for(var axis1inverted=0; axis1inverted < 2; axis1inverted++) {\n var axis1name=axisnames[axis1+3*axis1inverted];\n var axis1vector=axisvectors[axis1+3*axis1inverted];\n for(var axis2=0; axis2 < 3; axis2++) {\n if(axis2 != axis1) {\n for(var axis2inverted=0; axis2inverted < 2; axis2inverted++) {\n var axis2name=axisnames[axis2+3*axis2inverted];\n var axis2vector=axisvectors[axis2+3*axis2inverted];\n var orthobasis=CSG.OrthoNormalBasis.GetCartesian(axis1name, axis2name);\n var test1=orthobasis.to3D(new CSG.Vector2D([1,0]));\n var test2=orthobasis.to3D(new CSG.Vector2D([0,1]));\n var expected1=new CSG.Vector3D(axis1vector);\n var expected2=new CSG.Vector3D(axis2vector);\n var d1=test1.distanceTo(expected1);\n var d2=test2.distanceTo(expected2);\n if( (d1 > 0.01) || (d2 > 0.01) ) {\n throw new Error(\"Wrong!\");\n }}}}}}\n throw new Error(\"OK\");\n };\n */\n\n // The z=0 plane, with the 3D x and y vectors mapped to the 2D x and y vector\n CSG.OrthoNormalBasis.Z0Plane = function() {\n var plane = new CSG.Plane(new CSG.Vector3D([0, 0, 1]), 0);\n return new CSG.OrthoNormalBasis(plane, new CSG.Vector3D([1, 0, 0]));\n };\n\n CSG.OrthoNormalBasis.prototype = {\n getProjectionMatrix: function() {\n return new CSG.Matrix4x4([\n this.u.x, this.v.x, this.plane.normal.x, 0,\n this.u.y, this.v.y, this.plane.normal.y, 0,\n this.u.z, this.v.z, this.plane.normal.z, 0,\n 0, 0, -this.plane.w, 1\n ]);\n },\n\n getInverseProjectionMatrix: function() {\n var p = this.plane.normal.times(this.plane.w);\n return new CSG.Matrix4x4([\n this.u.x, this.u.y, this.u.z, 0,\n this.v.x, this.v.y, this.v.z, 0,\n this.plane.normal.x, this.plane.normal.y, this.plane.normal.z, 0,\n p.x, p.y, p.z, 1\n ]);\n },\n\n to2D: function(vec3) {\n return new CSG.Vector2D(vec3.dot(this.u), vec3.dot(this.v));\n },\n\n to3D: function(vec2) {\n return this.planeorigin.plus(this.u.times(vec2.x)).plus(this.v.times(vec2.y));\n },\n\n line3Dto2D: function(line3d) {\n var a = line3d.point;\n var b = line3d.direction.plus(a);\n var a2d = this.to2D(a);\n var b2d = this.to2D(b);\n return CSG.Line2D.fromPoints(a2d, b2d);\n },\n\n line2Dto3D: function(line2d) {\n var a = line2d.origin();\n var b = line2d.direction().plus(a);\n var a3d = this.to3D(a);\n var b3d = this.to3D(b);\n return CSG.Line3D.fromPoints(a3d, b3d);\n },\n\n transform: function(matrix4x4) {\n // todo: this may not work properly in case of mirroring\n var newplane = this.plane.transform(matrix4x4);\n var rightpoint_transformed = this.u.transform(matrix4x4);\n var origin_transformed = new CSG.Vector3D(0, 0, 0).transform(matrix4x4);\n var newrighthandvector = rightpoint_transformed.minus(origin_transformed);\n var newbasis = new CSG.OrthoNormalBasis(newplane, newrighthandvector);\n return newbasis;\n }\n };\n\n function insertSorted(array, element, comparefunc) {\n var leftbound = 0;\n var rightbound = array.length;\n while (rightbound > leftbound) {\n var testindex = Math.floor((leftbound + rightbound) / 2);\n var testelement = array[testindex];\n var compareresult = comparefunc(element, testelement);\n if (compareresult > 0) // element > testelement\n {\n leftbound = testindex + 1;\n } else {\n rightbound = testindex;\n }\n }\n array.splice(leftbound, 0, element);\n }\n\n // Get the x coordinate of a point with a certain y coordinate, interpolated between two\n // points (CSG.Vector2D).\n // Interpolation is robust even if the points have the same y coordinate\n CSG.interpolateBetween2DPointsForY = function(point1, point2, y) {\n var f1 = y - point1.y;\n var f2 = point2.y - point1.y;\n if (f2 < 0) {\n f1 = -f1;\n f2 = -f2;\n }\n var t;\n if (f1 <= 0) {\n t = 0.0;\n } else if (f1 >= f2) {\n t = 1.0;\n } else if (f2 < 1e-10) {\n t = 0.5;\n } else {\n t = f1 / f2;\n }\n var result = point1.x + t * (point2.x - point1.x);\n return result;\n };\n\n // Retesselation function for a set of coplanar polygons. See the introduction at the top of\n // this file.\n CSG.reTesselateCoplanarPolygons = function(sourcepolygons, destpolygons) {\n var EPS = 1e-5;\n\n var numpolygons = sourcepolygons.length;\n if (numpolygons > 0) {\n var plane = sourcepolygons[0].plane;\n var shared = sourcepolygons[0].shared;\n var orthobasis = new CSG.OrthoNormalBasis(plane);\n var polygonvertices2d = []; // array of array of CSG.Vector2D\n var polygontopvertexindexes = []; // array of indexes of topmost vertex per polygon\n var topy2polygonindexes = {};\n var ycoordinatetopolygonindexes = {};\n\n var xcoordinatebins = {};\n var ycoordinatebins = {};\n\n // convert all polygon vertices to 2D\n // Make a list of all encountered y coordinates\n // And build a map of all polygons that have a vertex at a certain y coordinate:\n var ycoordinateBinningFactor = 1.0 / EPS * 10;\n for (var polygonindex = 0; polygonindex < numpolygons; polygonindex++) {\n var poly3d = sourcepolygons[polygonindex];\n var vertices2d = [];\n var numvertices = poly3d.vertices.length;\n var minindex = -1;\n if (numvertices > 0) {\n var miny, maxy, maxindex;\n for (var i = 0; i < numvertices; i++) {\n var pos2d = orthobasis.to2D(poly3d.vertices[i].pos);\n // perform binning of y coordinates: If we have multiple vertices very\n // close to each other, give them the same y coordinate:\n var ycoordinatebin = Math.floor(pos2d.y * ycoordinateBinningFactor);\n var newy;\n if (ycoordinatebin in ycoordinatebins) {\n newy = ycoordinatebins[ycoordinatebin];\n } else if (ycoordinatebin + 1 in ycoordinatebins) {\n newy = ycoordinatebins[ycoordinatebin + 1];\n } else if (ycoordinatebin - 1 in ycoordinatebins) {\n newy = ycoordinatebins[ycoordinatebin - 1];\n } else {\n newy = pos2d.y;\n ycoordinatebins[ycoordinatebin] = pos2d.y;\n }\n pos2d = CSG.Vector2D.Create(pos2d.x, newy);\n vertices2d.push(pos2d);\n var y = pos2d.y;\n if ((i === 0) || (y < miny)) {\n miny = y;\n minindex = i;\n }\n if ((i === 0) || (y > maxy)) {\n maxy = y;\n maxindex = i;\n }\n if (!(y in ycoordinatetopolygonindexes)) {\n ycoordinatetopolygonindexes[y] = {};\n }\n ycoordinatetopolygonindexes[y][polygonindex] = true;\n }\n if (miny >= maxy) {\n // degenerate polygon, all vertices have same y coordinate. Just ignore it from now:\n vertices2d = [];\n numvertices = 0;\n minindex = -1;\n } else {\n if (!(miny in topy2polygonindexes)) {\n topy2polygonindexes[miny] = [];\n }\n topy2polygonindexes[miny].push(polygonindex);\n }\n } // if(numvertices > 0)\n // reverse the vertex order:\n vertices2d.reverse();\n minindex = numvertices - minindex - 1;\n polygonvertices2d.push(vertices2d);\n polygontopvertexindexes.push(minindex);\n }\n var ycoordinates = [];\n for (var ycoordinate in ycoordinatetopolygonindexes) ycoordinates.push(ycoordinate);\n ycoordinates.sort(fnNumberSort);\n\n // Now we will iterate over all y coordinates, from lowest to highest y coordinate\n // activepolygons: source polygons that are 'active', i.e. intersect with our y coordinate\n // Is sorted so the polygons are in left to right order\n // Each element in activepolygons has these properties:\n // polygonindex: the index of the source polygon (i.e. an index into the sourcepolygons\n // and polygonvertices2d arrays)\n // leftvertexindex: the index of the vertex at the left side of the polygon (lowest x)\n // that is at or just above the current y coordinate\n // rightvertexindex: dito at right hand side of polygon\n // topleft, bottomleft: coordinates of the left side of the polygon crossing the current y coordinate\n // topright, bottomright: coordinates of the right hand side of the polygon crossing the current y coordinate\n var activepolygons = [];\n var prevoutpolygonrow = [];\n for (var yindex = 0; yindex < ycoordinates.length; yindex++) {\n var newoutpolygonrow = [];\n var ycoordinate_as_string = ycoordinates[yindex];\n var ycoordinate = Number(ycoordinate_as_string);\n\n // update activepolygons for this y coordinate:\n // - Remove any polygons that end at this y coordinate\n // - update leftvertexindex and rightvertexindex (which point to the current vertex index\n // at the the left and right side of the polygon\n // Iterate over all polygons that have a corner at this y coordinate:\n var polygonindexeswithcorner = ycoordinatetopolygonindexes[ycoordinate_as_string];\n for (var activepolygonindex = 0; activepolygonindex < activepolygons.length; ++activepolygonindex) {\n var activepolygon = activepolygons[activepolygonindex];\n var polygonindex = activepolygon.polygonindex;\n if (polygonindexeswithcorner[polygonindex]) {\n // this active polygon has a corner at this y coordinate:\n var vertices2d = polygonvertices2d[polygonindex];\n var numvertices = vertices2d.length;\n var newleftvertexindex = activepolygon.leftvertexindex;\n var newrightvertexindex = activepolygon.rightvertexindex;\n // See if we need to increase leftvertexindex or decrease rightvertexindex:\n while (true) {\n var nextleftvertexindex = newleftvertexindex + 1;\n if (nextleftvertexindex >= numvertices) nextleftvertexindex = 0;\n if (vertices2d[nextleftvertexindex].y != ycoordinate) break;\n newleftvertexindex = nextleftvertexindex;\n }\n var nextrightvertexindex = newrightvertexindex - 1;\n if (nextrightvertexindex < 0) nextrightvertexindex = numvertices - 1;\n if (vertices2d[nextrightvertexindex].y == ycoordinate) {\n newrightvertexindex = nextrightvertexindex;\n }\n if ((newleftvertexindex != activepolygon.leftvertexindex) && (newleftvertexindex == newrightvertexindex)) {\n // We have increased leftvertexindex or decreased rightvertexindex, and now they point to the same vertex\n // This means that this is the bottom point of the polygon. We'll remove it:\n activepolygons.splice(activepolygonindex, 1);\n --activepolygonindex;\n } else {\n activepolygon.leftvertexindex = newleftvertexindex;\n activepolygon.rightvertexindex = newrightvertexindex;\n activepolygon.topleft = vertices2d[newleftvertexindex];\n activepolygon.topright = vertices2d[newrightvertexindex];\n var nextleftvertexindex = newleftvertexindex + 1;\n if (nextleftvertexindex >= numvertices) nextleftvertexindex = 0;\n activepolygon.bottomleft = vertices2d[nextleftvertexindex];\n var nextrightvertexindex = newrightvertexindex - 1;\n if (nextrightvertexindex < 0) nextrightvertexindex = numvertices - 1;\n activepolygon.bottomright = vertices2d[nextrightvertexindex];\n }\n } // if polygon has corner here\n } // for activepolygonindex\n var nextycoordinate;\n if (yindex >= ycoordinates.length - 1) {\n // last row, all polygons must be finished here:\n activepolygons = [];\n nextycoordinate = null;\n } else // yindex < ycoordinates.length-1\n {\n nextycoordinate = Number(ycoordinates[yindex + 1]);\n var middleycoordinate = 0.5 * (ycoordinate + nextycoordinate);\n // update activepolygons by adding any polygons that start here:\n var startingpolygonindexes = topy2polygonindexes[ycoordinate_as_string];\n for (var polygonindex_key in startingpolygonindexes) {\n var polygonindex = startingpolygonindexes[polygonindex_key];\n var vertices2d = polygonvertices2d[polygonindex];\n var numvertices = vertices2d.length;\n var topvertexindex = polygontopvertexindexes[polygonindex];\n // the top of the polygon may be a horizontal line. In that case topvertexindex can point to any point on this line.\n // Find the left and right topmost vertices which have the current y coordinate:\n var topleftvertexindex = topvertexindex;\n while (true) {\n var i = topleftvertexindex + 1;\n if (i >= numvertices) i = 0;\n if (vertices2d[i].y != ycoordinate) break;\n if (i == topvertexindex) break; // should not happen, but just to prevent endless loops\n topleftvertexindex = i;\n }\n var toprightvertexindex = topvertexindex;\n while (true) {\n var i = toprightvertexindex - 1;\n if (i < 0) i = numvertices - 1;\n if (vertices2d[i].y != ycoordinate) break;\n if (i == topleftvertexindex) break; // should not happen, but just to prevent endless loops\n toprightvertexindex = i;\n }\n var nextleftvertexindex = topleftvertexindex + 1;\n if (nextleftvertexindex >= numvertices) nextleftvertexindex = 0;\n var nextrightvertexindex = toprightvertexindex - 1;\n if (nextrightvertexindex < 0) nextrightvertexindex = numvertices - 1;\n var newactivepolygon = {\n polygonindex: polygonindex,\n leftvertexindex: topleftvertexindex,\n rightvertexindex: toprightvertexindex,\n topleft: vertices2d[topleftvertexindex],\n topright: vertices2d[toprightvertexindex],\n bottomleft: vertices2d[nextleftvertexindex],\n bottomright: vertices2d[nextrightvertexindex],\n };\n insertSorted(activepolygons, newactivepolygon, function(el1, el2) {\n var x1 = CSG.interpolateBetween2DPointsForY(\n el1.topleft, el1.bottomleft, middleycoordinate);\n var x2 = CSG.interpolateBetween2DPointsForY(\n el2.topleft, el2.bottomleft, middleycoordinate);\n if (x1 > x2) return 1;\n if (x1 < x2) return -1;\n return 0;\n });\n } // for(var polygonindex in startingpolygonindexes)\n } // yindex < ycoordinates.length-1\n //if( (yindex == ycoordinates.length-1) || (nextycoordinate - ycoordinate > EPS) )\n if (true) {\n // Now activepolygons is up to date\n // Build the output polygons for the next row in newoutpolygonrow:\n for (var activepolygon_key in activepolygons) {\n var activepolygon = activepolygons[activepolygon_key];\n var polygonindex = activepolygon.polygonindex;\n var vertices2d = polygonvertices2d[polygonindex];\n var numvertices = vertices2d.length;\n\n var x = CSG.interpolateBetween2DPointsForY(activepolygon.topleft, activepolygon.bottomleft, ycoordinate);\n var topleft = CSG.Vector2D.Create(x, ycoordinate);\n x = CSG.interpolateBetween2DPointsForY(activepolygon.topright, activepolygon.bottomright, ycoordinate);\n var topright = CSG.Vector2D.Create(x, ycoordinate);\n x = CSG.interpolateBetween2DPointsForY(activepolygon.topleft, activepolygon.bottomleft, nextycoordinate);\n var bottomleft = CSG.Vector2D.Create(x, nextycoordinate);\n x = CSG.interpolateBetween2DPointsForY(activepolygon.topright, activepolygon.bottomright, nextycoordinate);\n var bottomright = CSG.Vector2D.Create(x, nextycoordinate);\n var outpolygon = {\n topleft: topleft,\n topright: topright,\n bottomleft: bottomleft,\n bottomright: bottomright,\n leftline: CSG.Line2D.fromPoints(topleft, bottomleft),\n rightline: CSG.Line2D.fromPoints(bottomright, topright)\n };\n if (newoutpolygonrow.length > 0) {\n var prevoutpolygon = newoutpolygonrow[newoutpolygonrow.length - 1];\n var d1 = outpolygon.topleft.distanceTo(prevoutpolygon.topright);\n var d2 = outpolygon.bottomleft.distanceTo(prevoutpolygon.bottomright);\n if ((d1 < EPS) && (d2 < EPS)) {\n // we can join this polygon with the one to the left:\n outpolygon.topleft = prevoutpolygon.topleft;\n outpolygon.leftline = prevoutpolygon.leftline;\n outpolygon.bottomleft = prevoutpolygon.bottomleft;\n newoutpolygonrow.splice(newoutpolygonrow.length - 1, 1);\n }\n }\n newoutpolygonrow.push(outpolygon);\n } // for(activepolygon in activepolygons)\n if (yindex > 0) {\n // try to match the new polygons against the previous row:\n var prevcontinuedindexes = {};\n var matchedindexes = {};\n for (var i = 0; i < newoutpolygonrow.length; i++) {\n var thispolygon = newoutpolygonrow[i];\n for (var ii = 0; ii < prevoutpolygonrow.length; ii++) {\n if (!matchedindexes[ii]) // not already processed?\n {\n // We have a match if the sidelines are equal or if the top coordinates\n // are on the sidelines of the previous polygon\n var prevpolygon = prevoutpolygonrow[ii];\n if (prevpolygon.bottomleft.distanceTo(thispolygon.topleft) < EPS) {\n if (prevpolygon.bottomright.distanceTo(thispolygon.topright) < EPS) {\n // Yes, the top of this polygon matches the bottom of the previous:\n matchedindexes[ii] = true;\n // Now check if the joined polygon would remain convex:\n var d1 = thispolygon.leftline.direction().x - prevpolygon.leftline.direction().x;\n var d2 = thispolygon.rightline.direction().x - prevpolygon.rightline.direction().x;\n var leftlinecontinues = Math.abs(d1) < EPS;\n var rightlinecontinues = Math.abs(d2) < EPS;\n var leftlineisconvex = leftlinecontinues || (d1 >= 0);\n var rightlineisconvex = rightlinecontinues || (d2 >= 0);\n if (leftlineisconvex && rightlineisconvex) {\n // yes, both sides have convex corners:\n // This polygon will continue the previous polygon\n thispolygon.outpolygon = prevpolygon.outpolygon;\n thispolygon.leftlinecontinues = leftlinecontinues;\n thispolygon.rightlinecontinues = rightlinecontinues;\n prevcontinuedindexes[ii] = true;\n }\n break;\n }\n }\n } // if(!prevcontinuedindexes[ii])\n } // for ii\n } // for i\n for (var ii = 0; ii < prevoutpolygonrow.length; ii++) {\n if (!prevcontinuedindexes[ii]) {\n // polygon ends here\n // Finish the polygon with the last point(s):\n var prevpolygon = prevoutpolygonrow[ii];\n prevpolygon.outpolygon.rightpoints.push(prevpolygon.bottomright);\n if (prevpolygon.bottomright.distanceTo(prevpolygon.bottomleft) > EPS) {\n // polygon ends with a horizontal line:\n prevpolygon.outpolygon.leftpoints.push(prevpolygon.bottomleft);\n }\n // reverse the left half so we get a counterclockwise circle:\n prevpolygon.outpolygon.leftpoints.reverse();\n var points2d = prevpolygon.outpolygon.rightpoints.concat(prevpolygon.outpolygon.leftpoints);\n var vertices3d = [];\n points2d.map(function(point2d) {\n var point3d = orthobasis.to3D(point2d);\n var vertex3d = new CSG.Vertex(point3d);\n vertices3d.push(vertex3d);\n });\n var polygon = new CSG.Polygon(vertices3d, shared, plane);\n destpolygons.push(polygon);\n }\n }\n } // if(yindex > 0)\n for (var i = 0; i < newoutpolygonrow.length; i++) {\n var thispolygon = newoutpolygonrow[i];\n if (!thispolygon.outpolygon) {\n // polygon starts here:\n thispolygon.outpolygon = {\n leftpoints: [],\n rightpoints: []\n };\n thispolygon.outpolygon.leftpoints.push(thispolygon.topleft);\n if (thispolygon.topleft.distanceTo(thispolygon.topright) > EPS) {\n // we have a horizontal line at the top:\n thispolygon.outpolygon.rightpoints.push(thispolygon.topright);\n }\n } else {\n // continuation of a previous row\n if (!thispolygon.leftlinecontinues) {\n thispolygon.outpolygon.leftpoints.push(thispolygon.topleft);\n }\n if (!thispolygon.rightlinecontinues) {\n thispolygon.outpolygon.rightpoints.push(thispolygon.topright);\n }\n }\n }\n prevoutpolygonrow = newoutpolygonrow;\n }\n } // for yindex\n } // if(numpolygons > 0)\n };\n\n ////////////////////////////////\n // ## class fuzzyFactory\n // This class acts as a factory for objects. We can search for an object with approximately\n // the desired properties (say a rectangle with width 2 and height 1)\n // The lookupOrCreate() method looks for an existing object (for example it may find an existing rectangle\n // with width 2.0001 and height 0.999. If no object is found, the user supplied callback is\n // called, which should generate a new object. The new object is inserted into the database\n // so it can be found by future lookupOrCreate() calls.\n // Constructor:\n // numdimensions: the number of parameters for each object\n // for example for a 2D rectangle this would be 2\n // tolerance: The maximum difference for each parameter allowed to be considered a match\n CSG.fuzzyFactory = function(numdimensions, tolerance) {\n this.lookuptable = {};\n this.multiplier = 1.0 / tolerance;\n };\n\n CSG.fuzzyFactory.prototype = {\n // var obj = f.lookupOrCreate([el1, el2, el3], function(elements) {/* create the new object */});\n // Performs a fuzzy lookup of the object with the specified elements.\n // If found, returns the existing object\n // If not found, calls the supplied callback function which should create a new object with\n // the specified properties. This object is inserted in the lookup database.\n lookupOrCreate: function(els, creatorCallback) {\n var hash = \"\";\n var multiplier = this.multiplier;\n els.forEach(function(el) {\n var valueQuantized = Math.round(el * multiplier);\n hash += valueQuantized + \"/\";\n });\n if (hash in this.lookuptable) {\n return this.lookuptable[hash];\n } else {\n var object = creatorCallback(els);\n var hashparts = els.map(function(el) {\n var q0 = Math.floor(el * multiplier);\n var q1 = q0 + 1;\n return [\"\" + q0 + \"/\", \"\" + q1 + \"/\"];\n });\n var numelements = els.length;\n var numhashes = 1 << numelements;\n for (var hashmask = 0; hashmask < numhashes; ++hashmask) {\n var hashmask_shifted = hashmask;\n hash = \"\";\n hashparts.forEach(function(hashpart) {\n hash += hashpart[hashmask_shifted & 1];\n hashmask_shifted >>= 1;\n });\n this.lookuptable[hash] = object;\n }\n return object;\n }\n },\n };\n\n\n //////////////////////////////////////\n CSG.fuzzyCSGFactory = function() {\n this.vertexfactory = new CSG.fuzzyFactory(3, 1e-5);\n this.planefactory = new CSG.fuzzyFactory(4, 1e-5);\n this.polygonsharedfactory = {};\n };\n\n CSG.fuzzyCSGFactory.prototype = {\n getPolygonShared: function(sourceshared) {\n var hash = sourceshared.getHash();\n if (hash in this.polygonsharedfactory) {\n return this.polygonsharedfactory[hash];\n } else {\n this.polygonsharedfactory[hash] = sourceshared;\n return sourceshared;\n }\n },\n\n getVertex: function(sourcevertex) {\n var elements = [sourcevertex.pos._x, sourcevertex.pos._y, sourcevertex.pos._z];\n var result = this.vertexfactory.lookupOrCreate(elements, function(els) {\n return sourcevertex;\n });\n return result;\n },\n\n getPlane: function(sourceplane) {\n var elements = [sourceplane.normal._x, sourceplane.normal._y, sourceplane.normal._z, sourceplane.w];\n var result = this.planefactory.lookupOrCreate(elements, function(els) {\n return sourceplane;\n });\n return result;\n },\n\n getPolygon: function(sourcepolygon) {\n var newplane = this.getPlane(sourcepolygon.plane);\n var newshared = this.getPolygonShared(sourcepolygon.shared);\n var _this = this;\n var newvertices = sourcepolygon.vertices.map(function(vertex) {\n return _this.getVertex(vertex);\n });\n // two vertices that were originally very close may now have become\n // truly identical (referring to the same CSG.Vertex object).\n // Remove duplicate vertices:\n var newvertices_dedup = [];\n if(newvertices.length > 0) {\n var prevvertextag = newvertices[newvertices.length-1].getTag();\n newvertices.forEach(function(vertex) {\n var vertextag = vertex.getTag();\n if(vertextag != prevvertextag)\n {\n newvertices_dedup.push(vertex);\n }\n prevvertextag = vertextag;\n });\n }\n // If it's degenerate, remove all vertices:\n if(newvertices_dedup.length < 3) {\n newvertices_dedup = [];\n }\n return new CSG.Polygon(newvertices_dedup, newshared, newplane);\n },\n\n getCSG: function(sourcecsg) {\n var _this = this;\n var newpolygons = [];\n sourcecsg.polygons.forEach(function(polygon) {\n var newpolygon = _this.getPolygon(polygon);\n // see getPolygon above: we may get a polygon with no vertices, discard it:\n if(newpolygon.vertices.length >= 3)\n {\n newpolygons.push(newpolygon);\n }\n });\n return CSG.fromPolygons(newpolygons);\n }\n };\n\n //////////////////////////////////////\n // Tag factory: we can request a unique tag through CSG.getTag()\n CSG.staticTag = 1;\n\n CSG.getTag = function() {\n return CSG.staticTag++;\n };\n\n //////////////////////////////////////\n // # Class Properties\n // This class is used to store properties of a solid\n // A property can for example be a CSG.Vertex, a CSG.Plane or a CSG.Line3D\n // Whenever an affine transform is applied to the CSG solid, all its properties are\n // transformed as well.\n // The properties can be stored in a complex nested structure (using arrays and objects)\n CSG.Properties = function() {};\n\n CSG.Properties.prototype = {\n _transform: function(matrix4x4) {\n var result = new CSG.Properties();\n CSG.Properties.transformObj(this, result, matrix4x4);\n return result;\n },\n _merge: function(otherproperties) {\n var result = new CSG.Properties();\n CSG.Properties.cloneObj(this, result);\n CSG.Properties.addFrom(result, otherproperties);\n return result;\n }\n };\n\n CSG.Properties.transformObj = function(source, result, matrix4x4) {\n for (var propertyname in source) {\n if (propertyname == \"_transform\") continue;\n if (propertyname == \"_merge\") continue;\n var propertyvalue = source[propertyname];\n var transformed = propertyvalue;\n if (typeof(propertyvalue) == \"object\") {\n if (('transform' in propertyvalue) && (typeof(propertyvalue.transform) == \"function\")) {\n transformed = propertyvalue.transform(matrix4x4);\n } else if (propertyvalue instanceof Array) {\n transformed = [];\n CSG.Properties.transformObj(propertyvalue, transformed, matrix4x4);\n } else if (propertyvalue instanceof CSG.Properties) {\n transformed = new CSG.Properties();\n CSG.Properties.transformObj(propertyvalue, transformed, matrix4x4);\n }\n }\n result[propertyname] = transformed;\n }\n };\n\n CSG.Properties.cloneObj = function(source, result) {\n for (var propertyname in source) {\n if (propertyname == \"_transform\") continue;\n if (propertyname == \"_merge\") continue;\n var propertyvalue = source[propertyname];\n var cloned = propertyvalue;\n if (typeof(propertyvalue) == \"object\") {\n if (propertyvalue instanceof Array) {\n cloned = [];\n for (var i = 0; i < propertyvalue.length; i++) {\n cloned.push(propertyvalue[i]);\n }\n } else if (propertyvalue instanceof CSG.Properties) {\n cloned = new CSG.Properties();\n CSG.Properties.cloneObj(propertyvalue, cloned);\n }\n }\n result[propertyname] = cloned;\n }\n };\n\n CSG.Properties.addFrom = function(result, otherproperties) {\n for (var propertyname in otherproperties) {\n if (propertyname == \"_transform\") continue;\n if (propertyname == \"_merge\") continue;\n if ((propertyname in result) &&\n (typeof(result[propertyname]) == \"object\") &&\n (result[propertyname] instanceof CSG.Properties) &&\n (typeof(otherproperties[propertyname]) == \"object\") &&\n (otherproperties[propertyname] instanceof CSG.Properties)) {\n CSG.Properties.addFrom(result[propertyname], otherproperties[propertyname]);\n } else if (!(propertyname in result)) {\n result[propertyname] = otherproperties[propertyname];\n }\n }\n };\n\n //////////////////////////////////////\n // # class Connector\n // A connector allows to attach two objects at predefined positions\n // For example a servo motor and a servo horn:\n // Both can have a Connector called 'shaft'\n // The horn can be moved and rotated such that the two connectors match\n // and the horn is attached to the servo motor at the proper position.\n // Connectors are stored in the properties of a CSG solid so they are\n // ge the same transformations applied as the solid\n CSG.Connector = function(point, axisvector, normalvector) {\n this.point = new CSG.Vector3D(point);\n this.axisvector = new CSG.Vector3D(axisvector).unit();\n this.normalvector = new CSG.Vector3D(normalvector).unit();\n };\n\n CSG.Connector.prototype = {\n normalized: function() {\n var axisvector = this.axisvector.unit();\n // make the normal vector truly normal:\n var n = this.normalvector.cross(axisvector).unit();\n var normalvector = axisvector.cross(n);\n return new CSG.Connector(this.point, axisvector, normalvector);\n },\n\n transform: function(matrix4x4) {\n var point = this.point.multiply4x4(matrix4x4);\n var axisvector = this.point.plus(this.axisvector).multiply4x4(matrix4x4).minus(point);\n var normalvector = this.point.plus(this.normalvector).multiply4x4(matrix4x4).minus(point);\n return new CSG.Connector(point, axisvector, normalvector);\n },\n\n // Get the transformation matrix to connect this Connector to another connector\n // other: a CSG.Connector to which this connector should be connected\n // mirror: false: the 'axis' vectors of the connectors should point in the same direction\n // true: the 'axis' vectors of the connectors should point in opposite direction\n // normalrotation: degrees of rotation between the 'normal' vectors of the two\n // connectors\n getTransformationTo: function(other, mirror, normalrotation) {\n mirror = mirror ? true : false;\n normalrotation = normalrotation ? Number(normalrotation) : 0;\n var us = this.normalized();\n other = other.normalized();\n // shift to the origin:\n var transformation = CSG.Matrix4x4.translation(this.point.negated());\n // construct the plane crossing through the origin and the two axes:\n var axesplane = CSG.Plane.anyPlaneFromVector3Ds(\n new CSG.Vector3D(0, 0, 0), us.axisvector, other.axisvector);\n var axesbasis = new CSG.OrthoNormalBasis(axesplane);\n var angle1 = axesbasis.to2D(us.axisvector).angle();\n var angle2 = axesbasis.to2D(other.axisvector).angle();\n var rotation = 180.0 * (angle2 - angle1) / Math.PI;\n if (mirror) rotation += 180.0;\n transformation = transformation.multiply(axesbasis.getProjectionMatrix());\n transformation = transformation.multiply(CSG.Matrix4x4.rotationZ(rotation));\n transformation = transformation.multiply(axesbasis.getInverseProjectionMatrix());\n var usAxesAligned = us.transform(transformation);\n // Now we have done the transformation for aligning the axes.\n // We still need to align the normals:\n var normalsplane = CSG.Plane.fromNormalAndPoint(other.axisvector, new CSG.Vector3D(0, 0, 0));\n var normalsbasis = new CSG.OrthoNormalBasis(normalsplane);\n angle1 = normalsbasis.to2D(usAxesAligned.normalvector).angle();\n angle2 = normalsbasis.to2D(other.normalvector).angle();\n rotation = 180.0 * (angle2 - angle1) / Math.PI;\n rotation += normalrotation;\n transformation = transformation.multiply(normalsbasis.getProjectionMatrix());\n transformation = transformation.multiply(CSG.Matrix4x4.rotationZ(rotation));\n transformation = transformation.multiply(normalsbasis.getInverseProjectionMatrix());\n // and translate to the destination point:\n transformation = transformation.multiply(CSG.Matrix4x4.translation(other.point));\n // var usAligned = us.transform(transformation);\n return transformation;\n },\n\n axisLine: function() {\n return new CSG.Line3D(this.point, this.axisvector);\n },\n\n // creates a new Connector, with the connection point moved in the direction of the axisvector\n extend: function(distance) {\n var newpoint = this.point.plus(this.axisvector.unit().times(distance));\n return new CSG.Connector(newpoint, this.axisvector, this.normalvector);\n }\n };\n\n CSG.ConnectorList = function(connectors) {\n this.connectors_ = connectors ? connectors.slice() : [];\n };\n\n CSG.ConnectorList.defaultNormal = [0, 0, 1];\n\n CSG.ConnectorList.fromPath2D = function(path2D, arg1, arg2) {\n if (arguments.length === 3) {\n return CSG.ConnectorList._fromPath2DTangents(path2D, arg1, arg2);\n } else if (arguments.length == 2) {\n return CSG.ConnectorList._fromPath2DExplicit(path2D, arg1);\n } else {\n throw(\"call with path2D and either 2 direction vectors, or a function returning direction vectors\");\n }\n };\n\n /*\n * calculate the connector axisvectors by calculating the \"tangent\" for path2D.\n * This is undefined for start and end points, so axis for these have to be manually\n * provided.\n */\n CSG.ConnectorList._fromPath2DTangents = function(path2D, start, end) {\n // path2D\n var axis;\n var pathLen = path2D.points.length;\n var result = new CSG.ConnectorList([new CSG.Connector(path2D.points[0],\n start, CSG.ConnectorList.defaultNormal)]);\n // middle points\n path2D.points.slice(1, pathLen - 1).forEach(function(p2, i) {\n axis = path2D.points[i + 2].minus(path2D.points[i]).toVector3D(0);\n result.appendConnector(new CSG.Connector(p2.toVector3D(0), axis,\n CSG.ConnectorList.defaultNormal));\n }, this);\n result.appendConnector(new CSG.Connector(path2D.points[pathLen - 1], end,\n CSG.ConnectorList.defaultNormal));\n result.closed = path2D.closed;\n return result;\n };\n\n /*\n * angleIsh: either a static angle, or a function(point) returning an angle\n */\n CSG.ConnectorList._fromPath2DExplicit = function(path2D, angleIsh) {\n function getAngle(angleIsh, pt, i) {\n if (typeof angleIsh == 'function') {\n angleIsh = angleIsh(pt, i);\n }\n return angleIsh;\n }\n var result = new CSG.ConnectorList(\n path2D.points.map(function(p2, i) {\n return new CSG.Connector(p2.toVector3D(0),\n CSG.Vector3D.Create(1, 0, 0).rotateZ(getAngle(angleIsh, p2, i)),\n CSG.ConnectorList.defaultNormal);\n }, this)\n );\n result.closed = path2D.closed;\n return result;\n };\n\n\n CSG.ConnectorList.prototype = {\n setClosed: function(bool) {\n this.closed = !!closed;\n },\n appendConnector: function(conn) {\n this.connectors_.push(conn);\n },\n /*\n * arguments: cagish: a cag or a function(connector) returning a cag\n * closed: whether the 3d path defined by connectors location\n * should be closed or stay open\n * Note: don't duplicate connectors in the path\n * TODO: consider an option \"maySelfIntersect\" to close & force union all single segments\n */\n followWith: function(cagish) {\n this.verify();\n function getCag(cagish, connector) {\n if (typeof cagish == \"function\") {\n cagish = cagish(connector.point, connector.axisvector, connector.normalvector);\n }\n return cagish;\n }\n\n var polygons = [], currCag;\n var prevConnector = this.connectors_[this.connectors_.length - 1];\n var prevCag = getCag(cagish, prevConnector);\n // add walls\n this.connectors_.forEach(function(connector, notFirst) {\n currCag = getCag(cagish, connector);\n if (notFirst || this.closed) {\n polygons.push.apply(polygons, prevCag._toWallPolygons({\n toConnector1: prevConnector, toConnector2: connector, cag: currCag}));\n } else {\n // it is the first, and shape not closed -> build start wall\n polygons.push.apply(polygons,\n currCag._toPlanePolygons({toConnector: connector, flipped: true}));\n }\n if (notFirst == this.connectors_.length - 1 && !this.closed) {\n // build end wall\n polygons.push.apply(polygons,\n currCag._toPlanePolygons({toConnector: connector}));\n }\n prevCag = currCag;\n prevConnector = connector;\n }, this);\n return CSG.fromPolygons(polygons).reTesselated().canonicalized();\n },\n /*\n * general idea behind these checks: connectors need to have smooth transition from one to another\n * TODO: add a check that 2 follow-on CAGs are not intersecting\n */\n verify: function() {\n var connI, connI1, dPosToAxis, axisToNextAxis;\n for (var i = 0; i < this.connectors_.length - 1; i++) {\n connI = this.connectors_[i], connI1 = this.connectors_[i + 1];\n if (connI1.point.minus(connI.point).dot(connI.axisvector) <= 0) {\n throw(\"Invalid ConnectorList. Each connectors position needs to be within a <90deg range of previous connectors axisvector\");\n }\n if (connI.axisvector.dot(connI1.axisvector) <= 0) {\n throw(\"invalid ConnectorList. No neighboring connectors axisvectors may span a >=90deg angle\");\n }\n }\n }\n };\n\n //////////////////////////////////////\n // # Class Path2D\n CSG.Path2D = function(points, closed) {\n closed = !!closed;\n points = points || [];\n // re-parse the points into CSG.Vector2D\n // and remove any duplicate points\n var prevpoint = null;\n if (closed && (points.length > 0)) {\n prevpoint = new CSG.Vector2D(points[points.length - 1]);\n }\n var newpoints = [];\n points.map(function(point) {\n point = new CSG.Vector2D(point);\n var skip = false;\n if (prevpoint !== null) {\n var distance = point.distanceTo(prevpoint);\n skip = distance < 1e-5;\n }\n if (!skip) newpoints.push(point);\n prevpoint = point;\n });\n this.points = newpoints;\n this.closed = closed;\n };\n\n /*\n Construct a (part of a) circle. Parameters:\n options.center: the center point of the arc (CSG.Vector2D or array [x,y])\n options.radius: the circle radius (float)\n options.startangle: the starting angle of the arc, in degrees\n 0 degrees corresponds to [1,0]\n 90 degrees to [0,1]\n and so on\n options.endangle: the ending angle of the arc, in degrees\n options.resolution: number of points per 360 degree of rotation\n options.maketangent: adds two extra tiny line segments at both ends of the circle\n this ensures that the gradients at the edges are tangent to the circle\n Returns a CSG.Path2D. The path is not closed (even if it is a 360 degree arc).\n close() the resulting path if you want to create a true circle.\n */\n CSG.Path2D.arc = function(options) {\n var center = CSG.parseOptionAs2DVector(options, \"center\", 0);\n var radius = CSG.parseOptionAsFloat(options, \"radius\", 1);\n var startangle = CSG.parseOptionAsFloat(options, \"startangle\", 0);\n var endangle = CSG.parseOptionAsFloat(options, \"endangle\", 360);\n var resolution = CSG.parseOptionAsInt(options, \"resolution\", CSG.defaultResolution2D);\n var maketangent = CSG.parseOptionAsBool(options, \"maketangent\", false);\n // no need to make multiple turns:\n while (endangle - startangle >= 720) {\n endangle -= 360;\n }\n while (endangle - startangle <= -720) {\n endangle += 360;\n }\n var points = [],\n point;\n var absangledif = Math.abs(endangle - startangle);\n if (absangledif < 1e-5) {\n point = CSG.Vector2D.fromAngle(startangle / 180.0 * Math.PI).times(radius);\n points.push(point.plus(center));\n } else {\n var numsteps = Math.floor(resolution * absangledif / 360) + 1;\n var edgestepsize = numsteps * 0.5 / absangledif; // step size for half a degree\n if (edgestepsize > 0.25) edgestepsize = 0.25;\n var numsteps_mod = maketangent ? (numsteps + 2) : numsteps;\n for (var i = 0; i <= numsteps_mod; i++) {\n var step = i;\n if (maketangent) {\n step = (i - 1) * (numsteps - 2 * edgestepsize) / numsteps + edgestepsize;\n if (step < 0) step = 0;\n if (step > numsteps) step = numsteps;\n }\n var angle = startangle + step * (endangle - startangle) / numsteps;\n point = CSG.Vector2D.fromAngle(angle / 180.0 * Math.PI).times(radius);\n points.push(point.plus(center));\n }\n }\n return new CSG.Path2D(points, false);\n };\n\n CSG.Path2D.prototype = {\n concat: function(otherpath) {\n if (this.closed || otherpath.closed) {\n throw new Error(\"Paths must not be closed\");\n }\n var newpoints = this.points.concat(otherpath.points);\n return new CSG.Path2D(newpoints);\n },\n\n appendPoint: function(point) {\n if (this.closed) {\n throw new Error(\"Path must not be closed\");\n }\n point = new CSG.Vector2D(point); // cast to Vector2D\n var newpoints = this.points.concat([point]);\n return new CSG.Path2D(newpoints);\n },\n\n appendPoints: function(points) {\n if (this.closed) {\n throw new Error(\"Path must not be closed\");\n }\n var newpoints = this.points;\n points.forEach(function(point) {\n newpoints.push(new CSG.Vector2D(point)); // cast to Vector2D\n })\n return new CSG.Path2D(newpoints);\n },\n\n close: function() {\n return new CSG.Path2D(this.points, true);\n },\n\n // Extrude the path by following it with a rectangle (upright, perpendicular to the path direction)\n // Returns a CSG solid\n // width: width of the extrusion, in the z=0 plane\n // height: height of the extrusion in the z direction\n // resolution: number of segments per 360 degrees for the curve in a corner\n rectangularExtrude: function(width, height, resolution) {\n var cag = this.expandToCAG(width / 2, resolution);\n var result = cag.extrude({\n offset: [0, 0, height]\n });\n return result;\n },\n\n // Expand the path to a CAG\n // This traces the path with a circle with radius pathradius\n expandToCAG: function(pathradius, resolution) {\n var sides = [];\n var numpoints = this.points.length;\n var startindex = 0;\n if (this.closed && (numpoints > 2)) startindex = -1;\n var prevvertex;\n for (var i = startindex; i < numpoints; i++) {\n var pointindex = i;\n if (pointindex < 0) pointindex = numpoints - 1;\n var point = this.points[pointindex];\n var vertex = new CAG.Vertex(point);\n if (i > startindex) {\n var side = new CAG.Side(prevvertex, vertex);\n sides.push(side);\n }\n prevvertex = vertex;\n }\n var shellcag = CAG.fromSides(sides);\n var expanded = shellcag.expandedShell(pathradius, resolution);\n return expanded;\n },\n\n innerToCAG: function() {\n if (!this.closed) throw new Error(\"The path should be closed!\");\n return CAG.fromPoints(this.points);\n },\n\n transform: function(matrix4x4) {\n var newpoints = this.points.map(function(point) {\n return point.multiply4x4(matrix4x4);\n });\n return new CSG.Path2D(newpoints, this.closed);\n },\n\n appendBezier: function(controlpoints, options) {\n if (arguments.length < 2) {\n options = {};\n }\n if (this.closed) {\n throw new Error(\"Path must not be closed\");\n }\n if (!(controlpoints instanceof Array)) {\n throw new Error(\"appendBezier: should pass an array of control points\")\n }\n if (controlpoints.length < 1) {\n throw new Error(\"appendBezier: need at least 1 control point\")\n }\n if (this.points.length < 1) {\n throw new Error(\"appendBezier: path must already contain a point (the endpoint of the path is used as the starting point for the bezier curve)\");\n }\n var resolution = CSG.parseOptionAsInt(options, \"resolution\", CSG.defaultResolution2D);\n if (resolution < 4) resolution = 4;\n var factorials = [];\n var controlpoints_parsed = [];\n controlpoints_parsed.push(this.points[this.points.length - 1]); // start at the previous end point\n for (var i = 0; i < controlpoints.length; ++i) {\n var p = controlpoints[i];\n if (p === null) {\n // we can pass null as the first control point. In that case a smooth gradient is ensured:\n if (i != 0) {\n throw new Error(\"appendBezier: null can only be passed as the first control point\");\n }\n if (controlpoints.length < 2) {\n throw new Error(\"appendBezier: null can only be passed if there is at least one more control point\");\n }\n var lastBezierControlPoint;\n if ('lastBezierControlPoint' in this) {\n lastBezierControlPoint = this.lastBezierControlPoint;\n } else {\n if (this.points.length < 2) {\n throw new Error(\"appendBezier: null is passed as a control point but this requires a previous bezier curve or at least two points in the existing path\");\n }\n lastBezierControlPoint = this.points[this.points.length - 2];\n }\n // mirror the last bezier control point:\n p = this.points[this.points.length - 1].times(2).minus(lastBezierControlPoint);\n } else {\n p = new CSG.Vector2D(p); // cast to Vector2D\n }\n controlpoints_parsed.push(p);\n }\n var bezier_order = controlpoints_parsed.length - 1;\n var fact = 1;\n for (var i = 0; i <= bezier_order; ++i) {\n if (i > 0) fact *= i;\n factorials.push(fact);\n }\n var binomials = [];\n for (var i = 0; i <= bezier_order; ++i) {\n var binomial = factorials[bezier_order] / (factorials[i] * factorials[bezier_order - i]);\n binomials.push(binomial);\n }\n var getPointForT = function(t) {\n var t_k = 1; // = pow(t,k)\n var one_minus_t_n_minus_k = Math.pow(1 - t, bezier_order); // = pow( 1-t, bezier_order - k)\n var inv_1_minus_t = (t != 1) ? (1 / (1 - t)) : 1;\n var point = new CSG.Vector2D(0, 0);\n for (var k = 0; k <= bezier_order; ++k) {\n if (k == bezier_order) one_minus_t_n_minus_k = 1;\n var bernstein_coefficient = binomials[k] * t_k * one_minus_t_n_minus_k;\n point = point.plus(controlpoints_parsed[k].times(bernstein_coefficient));\n t_k *= t;\n one_minus_t_n_minus_k *= inv_1_minus_t;\n }\n return point;\n };\n var newpoints = [];\n var newpoints_t = [];\n var numsteps = bezier_order + 1;\n for (var i = 0; i < numsteps; ++i) {\n var t = i / (numsteps - 1);\n var point = getPointForT(t);\n newpoints.push(point);\n newpoints_t.push(t);\n }\n // subdivide each segment until the angle at each vertex becomes small enough:\n var subdivide_base = 1;\n var maxangle = Math.PI * 2 / resolution; // segments may have differ no more in angle than this\n var maxsinangle = Math.sin(maxangle);\n while (subdivide_base < newpoints.length - 1) {\n var dir1 = newpoints[subdivide_base].minus(newpoints[subdivide_base - 1]).unit();\n var dir2 = newpoints[subdivide_base + 1].minus(newpoints[subdivide_base]).unit();\n var sinangle = dir1.cross(dir2); // this is the sine of the angle\n if (Math.abs(sinangle) > maxsinangle) {\n // angle is too big, we need to subdivide\n var t0 = newpoints_t[subdivide_base - 1];\n var t1 = newpoints_t[subdivide_base + 1];\n var t0_new = t0 + (t1 - t0) * 1 / 3;\n var t1_new = t0 + (t1 - t0) * 2 / 3;\n var point0_new = getPointForT(t0_new);\n var point1_new = getPointForT(t1_new);\n // remove the point at subdivide_base and replace with 2 new points:\n newpoints.splice(subdivide_base, 1, point0_new, point1_new);\n newpoints_t.splice(subdivide_base, 1, t0_new, t1_new);\n // re - evaluate the angles, starting at the previous junction since it has changed:\n subdivide_base--;\n if (subdivide_base < 1) subdivide_base = 1;\n } else {\n ++subdivide_base;\n }\n }\n // append to the previous points, but skip the first new point because it is identical to the last point:\n newpoints = this.points.concat(newpoints.slice(1));\n var result = new CSG.Path2D(newpoints);\n result.lastBezierControlPoint = controlpoints_parsed[controlpoints_parsed.length - 2];\n return result;\n },\n\n /*\n options:\n .resolution // smoothness of the arc (number of segments per 360 degree of rotation)\n // to create a circular arc:\n .radius\n // to create an elliptical arc:\n .xradius\n .yradius\n .xaxisrotation // the rotation (in degrees) of the x axis of the ellipse with respect to the x axis of our coordinate system\n // this still leaves 4 possible arcs between the two given points. The following two flags select which one we draw:\n .clockwise // = true | false (default is false). Two of the 4 solutions draw clockwise with respect to the center point, the other 2 counterclockwise\n .large // = true | false (default is false). Two of the 4 solutions are an arc longer than 180 degrees, the other two are <= 180 degrees\n This implementation follows the SVG arc specs. For the details see\n http://www.w3.org/TR/SVG/paths.html#PathDataEllipticalArcCommands\n */\n appendArc: function(endpoint, options) {\n var decimals = 100000;\n if (arguments.length < 2) {\n options = {};\n }\n if (this.closed) {\n throw new Error(\"Path must not be closed\");\n }\n if (this.points.length < 1) {\n throw new Error(\"appendArc: path must already contain a point (the endpoint of the path is used as the starting point for the arc)\");\n }\n var resolution = CSG.parseOptionAsInt(options, \"resolution\", CSG.defaultResolution2D);\n if (resolution < 4) resolution = 4;\n var xradius, yradius;\n if (('xradius' in options) || ('yradius' in options)) {\n if ('radius' in options) {\n throw new Error(\"Should either give an xradius and yradius parameter, or a radius parameter\");\n }\n xradius = CSG.parseOptionAsFloat(options, \"xradius\", 0);\n yradius = CSG.parseOptionAsFloat(options, \"yradius\", 0);\n } else {\n xradius = CSG.parseOptionAsFloat(options, \"radius\", 0);\n yradius = xradius;\n }\n var xaxisrotation = CSG.parseOptionAsFloat(options, \"xaxisrotation\", 0);\n var clockwise = CSG.parseOptionAsBool(options, \"clockwise\", false);\n var largearc = CSG.parseOptionAsBool(options, \"large\", false);\n var startpoint = this.points[this.points.length - 1];\n endpoint = new CSG.Vector2D(endpoint);\n // round to precision in order to have determinate calculations\n xradius = Math.round(xradius*decimals)/decimals;\n yradius = Math.round(yradius*decimals)/decimals;\n endpoint = new CSG.Vector2D(Math.round(endpoint.x*decimals)/decimals,Math.round(endpoint.y*decimals)/decimals);\n\n var sweep_flag = !clockwise;\n var newpoints = [];\n if ((xradius == 0) || (yradius == 0)) {\n // http://www.w3.org/TR/SVG/implnote.html#ArcImplementationNotes:\n // If rx = 0 or ry = 0, then treat this as a straight line from (x1, y1) to (x2, y2) and stop\n newpoints.push(endpoint);\n } else {\n xradius = Math.abs(xradius);\n yradius = Math.abs(yradius);\n\n // see http://www.w3.org/TR/SVG/implnote.html#ArcImplementationNotes :\n var phi = xaxisrotation * Math.PI / 180.0;\n var cosphi = Math.cos(phi);\n var sinphi = Math.sin(phi);\n var minushalfdistance = startpoint.minus(endpoint).times(0.5);\n // F.6.5.1:\n // round to precision in order to have determinate calculations\n var x = Math.round((cosphi * minushalfdistance.x + sinphi * minushalfdistance.y)*decimals)/decimals;\n var y = Math.round((-sinphi * minushalfdistance.x + cosphi * minushalfdistance.y)*decimals)/decimals;\n var start_translated = new CSG.Vector2D(x,y);\n // F.6.6.2:\n var biglambda = (start_translated.x * start_translated.x) / (xradius * xradius) + (start_translated.y * start_translated.y) / (yradius * yradius);\n if (biglambda > 1.0) {\n // F.6.6.3:\n var sqrtbiglambda = Math.sqrt(biglambda);\n xradius *= sqrtbiglambda;\n yradius *= sqrtbiglambda;\n // round to precision in order to have determinate calculations\n xradius = Math.round(xradius*decimals)/decimals;\n yradius = Math.round(yradius*decimals)/decimals;\n }\n // F.6.5.2:\n var multiplier1 = Math.sqrt((xradius * xradius * yradius * yradius - xradius * xradius * start_translated.y * start_translated.y - yradius * yradius * start_translated.x * start_translated.x) / (xradius * xradius * start_translated.y * start_translated.y + yradius * yradius * start_translated.x * start_translated.x));\n if (sweep_flag == largearc) multiplier1 = -multiplier1;\n var center_translated = new CSG.Vector2D(xradius * start_translated.y / yradius, -yradius * start_translated.x / xradius).times(multiplier1);\n // F.6.5.3:\n var center = new CSG.Vector2D(cosphi * center_translated.x - sinphi * center_translated.y, sinphi * center_translated.x + cosphi * center_translated.y).plus((startpoint.plus(endpoint)).times(0.5));\n // F.6.5.5:\n var vec1 = new CSG.Vector2D((start_translated.x - center_translated.x) / xradius, (start_translated.y - center_translated.y) / yradius);\n var vec2 = new CSG.Vector2D((-start_translated.x - center_translated.x) / xradius, (-start_translated.y - center_translated.y) / yradius);\n var theta1 = vec1.angleRadians();\n var theta2 = vec2.angleRadians();\n var deltatheta = theta2 - theta1;\n deltatheta = deltatheta % (2 * Math.PI);\n if ((!sweep_flag) && (deltatheta > 0)) {\n deltatheta -= 2 * Math.PI;\n } else if ((sweep_flag) && (deltatheta < 0)) {\n deltatheta += 2 * Math.PI;\n }\n\n // Ok, we have the center point and angle range (from theta1, deltatheta radians) so we can create the ellipse\n var numsteps = Math.ceil(Math.abs(deltatheta) / (2 * Math.PI) * resolution) + 1;\n if (numsteps < 1) numsteps = 1;\n for (var step = 1; step <= numsteps; step++) {\n var theta = theta1 + step / numsteps * deltatheta;\n var costheta = Math.cos(theta);\n var sintheta = Math.sin(theta);\n // F.6.3.1:\n var point = new CSG.Vector2D(cosphi * xradius * costheta - sinphi * yradius * sintheta, sinphi * xradius * costheta + cosphi * yradius * sintheta).plus(center);\n newpoints.push(point);\n }\n }\n newpoints = this.points.concat(newpoints);\n var result = new CSG.Path2D(newpoints);\n return result;\n },\n };\n\n // Add several convenience methods to the classes that support a transform() method:\n CSG.addTransformationMethodsToPrototype = function(prot) {\n prot.mirrored = function(plane) {\n return this.transform(CSG.Matrix4x4.mirroring(plane));\n };\n\n prot.mirroredX = function() {\n var plane = new CSG.Plane(CSG.Vector3D.Create(1, 0, 0), 0);\n return this.mirrored(plane);\n };\n\n prot.mirroredY = function() {\n var plane = new CSG.Plane(CSG.Vector3D.Create(0, 1, 0), 0);\n return this.mirrored(plane);\n };\n\n prot.mirroredZ = function() {\n var plane = new CSG.Plane(CSG.Vector3D.Create(0, 0, 1), 0);\n return this.mirrored(plane);\n };\n\n prot.translate = function(v) {\n return this.transform(CSG.Matrix4x4.translation(v));\n };\n\n prot.scale = function(f) {\n return this.transform(CSG.Matrix4x4.scaling(f));\n };\n\n prot.rotateX = function(deg) {\n return this.transform(CSG.Matrix4x4.rotationX(deg));\n };\n\n prot.rotateY = function(deg) {\n return this.transform(CSG.Matrix4x4.rotationY(deg));\n };\n\n prot.rotateZ = function(deg) {\n return this.transform(CSG.Matrix4x4.rotationZ(deg));\n };\n\n prot.rotate = function(rotationCenter, rotationAxis, degrees) {\n return this.transform(CSG.Matrix4x4.rotation(rotationCenter, rotationAxis, degrees));\n };\n\n prot.rotateEulerAngles = function(alpha, beta, gamma, position) {\n position = position || [0,0,0];\n\n var Rz1 = CSG.Matrix4x4.rotationZ(alpha);\n var Rx = CSG.Matrix4x4.rotationX(beta);\n var Rz2 = CSG.Matrix4x4.rotationZ(gamma);\n var T = CSG.Matrix4x4.translation(new CSG.Vector3D(position));\n\n return this.transform(Rz2.multiply(Rx).multiply(Rz1).multiply(T));\n };\n };\n\n // TODO: consider generalization and adding to addTransformationMethodsToPrototype\n CSG.addCenteringToPrototype = function(prot, axes) {\n prot.center = function(cAxes) {\n cAxes = Array.prototype.map.call(arguments, function(a) {\n return a; //.toLowerCase();\n });\n // no args: center on all axes\n if (!cAxes.length) {\n cAxes = axes.slice();\n }\n var b = this.getBounds();\n return this.translate(axes.map(function(a) {\n return cAxes.indexOf(a) > -1 ?\n -(b[0][a] + b[1][a])/2 : 0;\n }));\n };\n };\n\n //////////////////\n // CAG: solid area geometry: like CSG but 2D\n // Each area consists of a number of sides\n // Each side is a line between 2 points\n var CAG = function() {\n this.sides = [];\n this.isCanonicalized = false;\n };\n\n // create from an untyped object with identical property names:\n CAG.fromObject = function(obj) {\n var sides = obj.sides.map(function(s) {\n return CAG.Side.fromObject(s);\n });\n var cag = CAG.fromSides(sides);\n return cag;\n }\n\n // Construct a CAG from a list of `CAG.Side` instances.\n CAG.fromSides = function(sides) {\n var cag = new CAG();\n cag.sides = sides;\n return cag;\n };\n\n // Construct a CAG from a list of points (a polygon)\n // Rotation direction of the points is not relevant. Points can be a convex or concave polygon.\n // Polygon must not self intersect\n CAG.fromPoints = function(points) {\n var numpoints = points.length;\n if (numpoints < 3) throw new Error(\"CAG shape needs at least 3 points\");\n var sides = [];\n var prevpoint = new CSG.Vector2D(points[numpoints - 1]);\n var prevvertex = new CAG.Vertex(prevpoint);\n points.map(function(p) {\n var point = new CSG.Vector2D(p);\n var vertex = new CAG.Vertex(point);\n var side = new CAG.Side(prevvertex, vertex);\n sides.push(side);\n prevvertex = vertex;\n });\n var result = CAG.fromSides(sides);\n if (result.isSelfIntersecting()) {\n throw new Error(\"Polygon is self intersecting!\");\n }\n var area = result.area();\n if (Math.abs(area) < 1e-5) {\n throw new Error(\"Degenerate polygon!\");\n }\n if (area < 0) {\n result = result.flipped();\n }\n result = result.canonicalized();\n return result;\n };\n\n // Like CAG.fromPoints but does not check if it's a valid polygon.\n // Points should rotate counter clockwise\n CAG.fromPointsNoCheck = function(points) {\n var sides = [];\n var prevpoint = new CSG.Vector2D(points[points.length - 1]);\n var prevvertex = new CAG.Vertex(prevpoint);\n points.map(function(p) {\n var point = new CSG.Vector2D(p);\n var vertex = new CAG.Vertex(point);\n var side = new CAG.Side(prevvertex, vertex);\n sides.push(side);\n prevvertex = vertex;\n });\n return CAG.fromSides(sides);\n };\n\n // Converts a CSG to a CAG. The CSG must consist of polygons with only z coordinates +1 and -1\n // as constructed by CAG._toCSGWall(-1, 1). This is so we can use the 3D union(), intersect() etc\n CAG.fromFakeCSG = function(csg) {\n var sides = csg.polygons.map(function(p) {\n return CAG.Side._fromFakePolygon(p);\n })\n .filter(function(s) {\n return s !== null;\n });\n return CAG.fromSides(sides);\n };\n\n // see if the line between p0start and p0end intersects with the line between p1start and p1end\n // returns true if the lines strictly intersect, the end points are not counted!\n CAG.linesIntersect = function(p0start, p0end, p1start, p1end) {\n if (p0end.equals(p1start) || p1end.equals(p0start)) {\n var d = p1end.minus(p1start).unit().plus(p0end.minus(p0start).unit()).length();\n if (d < 1e-5) {\n return true;\n }\n } else {\n var d0 = p0end.minus(p0start);\n var d1 = p1end.minus(p1start);\n if (Math.abs(d0.cross(d1)) < 1e-9) return false; // lines are parallel\n var alphas = CSG.solve2Linear(-d0.x, d1.x, -d0.y, d1.y, p0start.x - p1start.x, p0start.y - p1start.y);\n if ((alphas[0] > 1e-6) && (alphas[0] < 0.999999) && (alphas[1] > 1e-5) && (alphas[1] < 0.999999)) return true;\n // if( (alphas[0] >= 0) && (alphas[0] <= 1) && (alphas[1] >= 0) && (alphas[1] <= 1) ) return true;\n }\n return false;\n };\n\n /* Construct a circle\n options:\n center: a 2D center point\n radius: a scalar\n resolution: number of sides per 360 degree rotation\n returns a CAG object\n */\n CAG.circle = function(options) {\n options = options || {};\n var center = CSG.parseOptionAs2DVector(options, \"center\", [0, 0]);\n var radius = CSG.parseOptionAsFloat(options, \"radius\", 1);\n var resolution = CSG.parseOptionAsInt(options, \"resolution\", CSG.defaultResolution2D);\n var sides = [];\n var prevvertex;\n for (var i = 0; i <= resolution; i++) {\n var radians = 2 * Math.PI * i / resolution;\n var point = CSG.Vector2D.fromAngleRadians(radians).times(radius).plus(center);\n var vertex = new CAG.Vertex(point);\n if (i > 0) {\n sides.push(new CAG.Side(prevvertex, vertex));\n }\n prevvertex = vertex;\n }\n return CAG.fromSides(sides);\n };\n\n /* Construct an ellispe\n options:\n center: a 2D center point\n radius: a 2D vector with width and height\n resolution: number of sides per 360 degree rotation\n returns a CAG object\n */\n CAG.ellipse = function(options) {\n options = options || {};\n var c = CSG.parseOptionAs2DVector(options, \"center\", [0, 0]);\n var r = CSG.parseOptionAs2DVector(options, \"radius\", [1, 1]);\n r = r.abs(); // negative radii make no sense\n var res = CSG.parseOptionAsInt(options, \"resolution\", CSG.defaultResolution2D);\n\n var e2 = new CSG.Path2D([[c.x,c.y + r.y]]);\n e2 = e2.appendArc([c.x,c.y - r.y], {\n xradius: r.x,\n yradius: r.y,\n xaxisrotation: 0,\n resolution: res,\n clockwise: true,\n large: false,\n });\n e2 = e2.appendArc([c.x,c.y + r.y], {\n xradius: r.x,\n yradius: r.y,\n xaxisrotation: 0,\n resolution: res,\n clockwise: true,\n large: false,\n });\n e2 = e2.close();\n return e2.innerToCAG();\n };\n\n /* Construct a rectangle\n options:\n center: a 2D center point\n radius: a 2D vector with width and height\n returns a CAG object\n */\n CAG.rectangle = function(options) {\n options = options || {};\n var c, r;\n if (('corner1' in options) || ('corner2' in options)) {\n if (('center' in options) || ('radius' in options)) {\n throw new Error(\"rectangle: should either give a radius and center parameter, or a corner1 and corner2 parameter\")\n }\n corner1 = CSG.parseOptionAs2DVector(options, \"corner1\", [0, 0]);\n corner2 = CSG.parseOptionAs2DVector(options, \"corner2\", [1, 1]);\n c = corner1.plus(corner2).times(0.5);\n r = corner2.minus(corner1).times(0.5);\n } else {\n c = CSG.parseOptionAs2DVector(options, \"center\", [0, 0]);\n r = CSG.parseOptionAs2DVector(options, \"radius\", [1, 1]);\n }\n r = r.abs(); // negative radii make no sense\n var rswap = new CSG.Vector2D(r.x, -r.y);\n var points = [\n c.plus(r), c.plus(rswap), c.minus(r), c.minus(rswap)\n ];\n return CAG.fromPoints(points);\n };\n\n // var r = CSG.roundedRectangle({\n // center: [0, 0],\n // radius: [2, 1],\n // roundradius: 0.2,\n // resolution: 8,\n // });\n CAG.roundedRectangle = function(options) {\n options = options || {};\n var center, radius;\n if (('corner1' in options) || ('corner2' in options)) {\n if (('center' in options) || ('radius' in options)) {\n throw new Error(\"roundedRectangle: should either give a radius and center parameter, or a corner1 and corner2 parameter\")\n }\n corner1 = CSG.parseOptionAs2DVector(options, \"corner1\", [0, 0]);\n corner2 = CSG.parseOptionAs2DVector(options, \"corner2\", [1, 1]);\n center = corner1.plus(corner2).times(0.5);\n radius = corner2.minus(corner1).times(0.5);\n } else {\n center = CSG.parseOptionAs2DVector(options, \"center\", [0, 0]);\n radius = CSG.parseOptionAs2DVector(options, \"radius\", [1, 1]);\n }\n radius = radius.abs(); // negative radii make no sense\n var roundradius = CSG.parseOptionAsFloat(options, \"roundradius\", 0.2);\n var resolution = CSG.parseOptionAsInt(options, \"resolution\", CSG.defaultResolution2D);\n var maxroundradius = Math.min(radius.x, radius.y);\n maxroundradius -= 0.1;\n roundradius = Math.min(roundradius, maxroundradius);\n roundradius = Math.max(0, roundradius);\n radius = new CSG.Vector2D(radius.x - roundradius, radius.y - roundradius);\n var rect = CAG.rectangle({\n center: center,\n radius: radius\n });\n if (roundradius > 0) {\n rect = rect.expand(roundradius, resolution);\n }\n return rect;\n };\n\n // Reconstruct a CAG from the output of toCompactBinary()\n CAG.fromCompactBinary = function(bin) {\n if (bin['class'] != \"CAG\") throw new Error(\"Not a CAG\");\n var vertices = [];\n var vertexData = bin.vertexData;\n var numvertices = vertexData.length / 2;\n var arrayindex = 0;\n for (var vertexindex = 0; vertexindex < numvertices; vertexindex++) {\n var x = vertexData[arrayindex++];\n var y = vertexData[arrayindex++];\n var pos = new CSG.Vector2D(x, y);\n var vertex = new CAG.Vertex(pos);\n vertices.push(vertex);\n }\n\n var sides = [];\n var numsides = bin.sideVertexIndices.length / 2;\n arrayindex = 0;\n for (var sideindex = 0; sideindex < numsides; sideindex++) {\n var vertexindex0 = bin.sideVertexIndices[arrayindex++];\n var vertexindex1 = bin.sideVertexIndices[arrayindex++];\n var side = new CAG.Side(vertices[vertexindex0], vertices[vertexindex1]);\n sides.push(side);\n }\n var cag = CAG.fromSides(sides);\n cag.isCanonicalized = true;\n return cag;\n };\n\n function fnSortByIndex(a, b) {\n return a.index - b.index;\n }\n\n CAG.prototype = {\n toString: function() {\n var result = \"CAG (\" + this.sides.length + \" sides):\\n\";\n this.sides.map(function(side) {\n result += \" \" + side.toString() + \"\\n\";\n });\n return result;\n },\n\n _toCSGWall: function(z0, z1) {\n var polygons = this.sides.map(function(side) {\n return side.toPolygon3D(z0, z1);\n });\n return CSG.fromPolygons(polygons);\n },\n\n _toVector3DPairs: function(m) {\n // transform m\n var pairs = this.sides.map(function(side) {\n var p0 = side.vertex0.pos, p1 = side.vertex1.pos;\n return [CSG.Vector3D.Create(p0.x, p0.y, 0),\n CSG.Vector3D.Create(p1.x, p1.y, 0)];\n });\n if (typeof m != 'undefined') {\n pairs = pairs.map(function(pair) {\n return pair.map(function(v) {\n return v.transform(m);\n });\n });\n }\n return pairs;\n },\n\n /*\n * transform a cag into the polygons of a corresponding 3d plane, positioned per options\n * Accepts a connector for plane positioning, or optionally\n * single translation, axisVector, normalVector arguments\n * (toConnector has precedence over single arguments if provided)\n */\n _toPlanePolygons: function(options) {\n var flipped = options.flipped || false;\n // reference connector for transformation\n var origin = [0, 0, 0], defaultAxis = [0, 0, 1], defaultNormal = [0, 1, 0];\n var thisConnector = new CSG.Connector(origin, defaultAxis, defaultNormal);\n // translated connector per options\n var translation = options.translation || origin;\n var axisVector = options.axisVector || defaultAxis;\n var normalVector = options.normalVector || defaultNormal;\n // will override above if options has toConnector\n var toConnector = options.toConnector ||\n new CSG.Connector(translation, axisVector, normalVector);\n // resulting transform\n var m = thisConnector.getTransformationTo(toConnector, false, 0);\n // create plane as a (partial non-closed) CSG in XY plane\n var bounds = this.getBounds();\n bounds[0] = bounds[0].minus(new CSG.Vector2D(1, 1));\n bounds[1] = bounds[1].plus(new CSG.Vector2D(1, 1));\n var csgshell = this._toCSGWall(-1, 1);\n var csgplane = CSG.fromPolygons([new CSG.Polygon([\n new CSG.Vertex(new CSG.Vector3D(bounds[0].x, bounds[0].y, 0)),\n new CSG.Vertex(new CSG.Vector3D(bounds[1].x, bounds[0].y, 0)),\n new CSG.Vertex(new CSG.Vector3D(bounds[1].x, bounds[1].y, 0)),\n new CSG.Vertex(new CSG.Vector3D(bounds[0].x, bounds[1].y, 0))\n ])]);\n if (flipped) {\n csgplane = csgplane.invert();\n }\n // intersectSub -> prevent premature retesselate/canonicalize\n csgplane = csgplane.intersectSub(csgshell);\n // only keep the polygons in the z plane:\n var polys = csgplane.polygons.filter(function(polygon) {\n return Math.abs(polygon.plane.normal.z) > 0.99;\n });\n // finally, position the plane per passed transformations\n return polys.map(function(poly) {\n return poly.transform(m);\n });\n },\n\n\n /*\n * given 2 connectors, this returns all polygons of a \"wall\" between 2\n * copies of this cag, positioned in 3d space as \"bottom\" and\n * \"top\" plane per connectors toConnector1, and toConnector2, respectively \n */\n _toWallPolygons: function(options) {\n // normals are going to be correct as long as toConn2.point - toConn1.point\n // points into cag normal direction (check in caller)\n // arguments: options.toConnector1, options.toConnector2, options.cag\n // walls go from toConnector1 to toConnector2\n // optionally, target cag to point to - cag needs to have same number of sides as this!\n var origin = [0, 0, 0], defaultAxis = [0, 0, 1], defaultNormal = [0, 1, 0];\n var thisConnector = new CSG.Connector(origin, defaultAxis, defaultNormal);\n // arguments:\n var toConnector1 = options.toConnector1;\n // var toConnector2 = new CSG.Connector([0, 0, -30], defaultAxis, defaultNormal);\n var toConnector2 = options.toConnector2;\n if (!(toConnector1 instanceof CSG.Connector && toConnector2 instanceof CSG.Connector)) {\n throw('could not parse CSG.Connector arguments toConnector1 or toConnector2');\n }\n if (options.cag) {\n if (options.cag.sides.length != this.sides.length) {\n throw('target cag needs same sides count as start cag');\n }\n }\n // target cag is same as this unless specified\n var toCag = options.cag || this;\n var m1 = thisConnector.getTransformationTo(toConnector1, false, 0);\n var m2 = thisConnector.getTransformationTo(toConnector2, false, 0);\n var vps1 = this._toVector3DPairs(m1);\n var vps2 = toCag._toVector3DPairs(m2);\n\n var polygons = [];\n vps1.forEach(function(vp1, i) {\n polygons.push(new CSG.Polygon([\n new CSG.Vertex(vps2[i][1]), new CSG.Vertex(vps2[i][0]), new CSG.Vertex(vp1[0])]));\n polygons.push(new CSG.Polygon([\n new CSG.Vertex(vps2[i][1]), new CSG.Vertex(vp1[0]), new CSG.Vertex(vp1[1])]));\n });\n return polygons;\n },\n\n union: function(cag) {\n var cags;\n if (cag instanceof Array) {\n cags = cag;\n } else {\n cags = [cag];\n }\n var r = this._toCSGWall(-1, 1);\n var r = r.union(\n cags.map(function(cag) {\n return cag._toCSGWall(-1, 1).reTesselated();\n }), false, false)\n return CAG.fromFakeCSG(r).canonicalized();\n },\n\n subtract: function(cag) {\n var cags;\n if (cag instanceof Array) {\n cags = cag;\n } else {\n cags = [cag];\n }\n var r = this._toCSGWall(-1, 1);\n cags.map(function(cag) {\n r = r.subtractSub(cag._toCSGWall(-1, 1), false, false);\n });\n r = r.reTesselated();\n r = r.canonicalized();\n r = CAG.fromFakeCSG(r);\n r = r.canonicalized();\n return r;\n },\n\n intersect: function(cag) {\n var cags;\n if (cag instanceof Array) {\n cags = cag;\n } else {\n cags = [cag];\n }\n var r = this._toCSGWall(-1, 1);\n cags.map(function(cag) {\n r = r.intersectSub(cag._toCSGWall(-1, 1), false, false);\n });\n r = r.reTesselated();\n r = r.canonicalized();\n r = CAG.fromFakeCSG(r);\n r = r.canonicalized();\n return r;\n },\n\n transform: function(matrix4x4) {\n var ismirror = matrix4x4.isMirroring();\n var newsides = this.sides.map(function(side) {\n return side.transform(matrix4x4);\n });\n var result = CAG.fromSides(newsides);\n if (ismirror) {\n result = result.flipped();\n }\n return result;\n },\n\n // see http://local.wasp.uwa.edu.au/~pbourke/geometry/polyarea/ :\n // Area of the polygon. For a counter clockwise rotating polygon the area is positive, otherwise negative\n // Note(bebbi): this looks wrong. See polygon getArea()\n area: function() {\n var polygonArea = 0;\n this.sides.map(function(side) {\n polygonArea += side.vertex0.pos.cross(side.vertex1.pos);\n });\n polygonArea *= 0.5;\n return polygonArea;\n },\n\n flipped: function() {\n var newsides = this.sides.map(function(side) {\n return side.flipped();\n });\n newsides.reverse();\n return CAG.fromSides(newsides);\n },\n\n getBounds: function() {\n var minpoint;\n if (this.sides.length === 0) {\n minpoint = new CSG.Vector2D(0, 0);\n } else {\n minpoint = this.sides[0].vertex0.pos;\n }\n var maxpoint = minpoint;\n this.sides.map(function(side) {\n minpoint = minpoint.min(side.vertex0.pos);\n minpoint = minpoint.min(side.vertex1.pos);\n maxpoint = maxpoint.max(side.vertex0.pos);\n maxpoint = maxpoint.max(side.vertex1.pos);\n });\n return [minpoint, maxpoint];\n },\n\n isSelfIntersecting: function(debug) {\n var numsides = this.sides.length;\n for (var i = 0; i < numsides; i++) {\n var side0 = this.sides[i];\n for (var ii = i + 1; ii < numsides; ii++) {\n var side1 = this.sides[ii];\n if (CAG.linesIntersect(side0.vertex0.pos, side0.vertex1.pos, side1.vertex0.pos, side1.vertex1.pos)) {\n if (debug) { OpenJsCad.log(side0); OpenJsCad.log(side1);}\n return true;\n }\n }\n }\n return false;\n },\n\n expandedShell: function(radius, resolution) {\n resolution = resolution || 8;\n if (resolution < 4) resolution = 4;\n var cags = [];\n var pointmap = {};\n var cag = this.canonicalized();\n cag.sides.map(function(side) {\n var d = side.vertex1.pos.minus(side.vertex0.pos);\n var dl = d.length();\n if (dl > 1e-5) {\n d = d.times(1.0 / dl);\n var normal = d.normal().times(radius);\n var shellpoints = [\n side.vertex1.pos.plus(normal),\n side.vertex1.pos.minus(normal),\n side.vertex0.pos.minus(normal),\n side.vertex0.pos.plus(normal)\n ];\n // var newcag = CAG.fromPointsNoCheck(shellpoints);\n var newcag = CAG.fromPoints(shellpoints);\n cags.push(newcag);\n for (var step = 0; step < 2; step++) {\n var p1 = (step === 0) ? side.vertex0.pos : side.vertex1.pos;\n var p2 = (step === 0) ? side.vertex1.pos : side.vertex0.pos;\n var tag = p1.x + \" \" + p1.y;\n if (!(tag in pointmap)) {\n pointmap[tag] = [];\n }\n pointmap[tag].push({\n \"p1\": p1,\n \"p2\": p2\n });\n }\n }\n });\n for (var tag in pointmap) {\n var m = pointmap[tag];\n var angle1, angle2;\n var pcenter = m[0].p1;\n if (m.length == 2) {\n var end1 = m[0].p2;\n var end2 = m[1].p2;\n angle1 = end1.minus(pcenter).angleDegrees();\n angle2 = end2.minus(pcenter).angleDegrees();\n if (angle2 < angle1) angle2 += 360;\n if (angle2 >= (angle1 + 360)) angle2 -= 360;\n if (angle2 < angle1 + 180) {\n var t = angle2;\n angle2 = angle1 + 360;\n angle1 = t;\n }\n angle1 += 90;\n angle2 -= 90;\n } else {\n angle1 = 0;\n angle2 = 360;\n }\n var fullcircle = (angle2 > angle1 + 359.999);\n if (fullcircle) {\n angle1 = 0;\n angle2 = 360;\n }\n if (angle2 > (angle1 + 1e-5)) {\n var points = [];\n if (!fullcircle) {\n points.push(pcenter);\n }\n var numsteps = Math.round(resolution * (angle2 - angle1) / 360);\n if (numsteps < 1) numsteps = 1;\n for (var step = 0; step <= numsteps; step++) {\n var angle = angle1 + step / numsteps * (angle2 - angle1);\n if (step == numsteps) angle = angle2; // prevent rounding errors\n var point = pcenter.plus(CSG.Vector2D.fromAngleDegrees(angle).times(radius));\n if ((!fullcircle) || (step > 0)) {\n points.push(point);\n }\n }\n var newcag = CAG.fromPointsNoCheck(points);\n cags.push(newcag);\n }\n }\n var result = new CAG();\n result = result.union(cags);\n return result;\n },\n\n expand: function(radius, resolution) {\n var result = this.union(this.expandedShell(radius, resolution));\n return result;\n },\n\n contract: function(radius, resolution) {\n var result = this.subtract(this.expandedShell(radius, resolution));\n return result;\n },\n\n // extrude the CAG in a certain plane. \n // Giving just a plane is not enough, multiple different extrusions in the same plane would be possible\n // by rotating around the plane's origin. An additional right-hand vector should be specified as well,\n // and this is exactly a CSG.OrthoNormalBasis.\n // orthonormalbasis: characterizes the plane in which to extrude\n // depth: thickness of the extruded shape. Extrusion is done symmetrically above and below the plane.\n extrudeInOrthonormalBasis: function(orthonormalbasis, depth) {\n // first extrude in the regular Z plane:\n if (!(orthonormalbasis instanceof CSG.OrthoNormalBasis)) {\n throw new Error(\"extrudeInPlane: the first parameter should be a CSG.OrthoNormalBasis\");\n }\n var extruded = this.extrude({\n offset: [0, 0, depth]\n });\n var matrix = orthonormalbasis.getInverseProjectionMatrix();\n extruded = extruded.transform(matrix);\n return extruded;\n },\n\n // Extrude in a standard cartesian plane, specified by two axis identifiers. Each identifier can be\n // one of [\"X\",\"Y\",\"Z\",\"-X\",\"-Y\",\"-Z\"]\n // The 2d x axis will map to the first given 3D axis, the 2d y axis will map to the second.\n // See CSG.OrthoNormalBasis.GetCartesian for details.\n extrudeInPlane: function(axis1, axis2, depth) {\n return this.extrudeInOrthonormalBasis(CSG.OrthoNormalBasis.GetCartesian(axis1, axis2), depth);\n },\n\n // extruded=cag.extrude({offset: [0,0,10], twistangle: 360, twiststeps: 100});\n // linear extrusion of 2D shape, with optional twist\n // The 2d shape is placed in in z=0 plane and extruded into direction (a CSG.Vector3D)\n // The final face is rotated degrees. Rotation is done around the origin of the 2d shape (i.e. x=0, y=0)\n // twiststeps determines the resolution of the twist (should be >= 1)\n // returns a CSG object\n extrude: function(options) {\n if (this.sides.length == 0) {\n // empty!\n return new CSG();\n }\n var offsetVector = CSG.parseOptionAs3DVector(options, \"offset\", [0, 0, 1]);\n var twistangle = CSG.parseOptionAsFloat(options, \"twistangle\", 0);\n var twiststeps = CSG.parseOptionAsInt(options, \"twiststeps\", CSG.defaultResolution3D);\n if (offsetVector.z == 0) {\n throw('offset cannot be orthogonal to Z axis');\n }\n if (twistangle == 0 || twiststeps < 1) {\n twiststeps = 1;\n }\n var normalVector = CSG.Vector3D.Create(0, 1, 0);\n\n var polygons = [];\n // bottom and top\n polygons = polygons.concat(this._toPlanePolygons({translation: [0, 0, 0],\n normalVector: normalVector, flipped: !(offsetVector.z < 0)}));\n polygons = polygons.concat(this._toPlanePolygons({translation: offsetVector,\n normalVector: normalVector.rotateZ(twistangle), flipped: offsetVector.z < 0}));\n // walls\n for (var i = 0; i < twiststeps; i++) {\n var c1 = new CSG.Connector(offsetVector.times(i / twiststeps), [0, 0, offsetVector.z],\n normalVector.rotateZ(i * twistangle/twiststeps));\n var c2 = new CSG.Connector(offsetVector.times((i + 1) / twiststeps), [0, 0, offsetVector.z],\n normalVector.rotateZ((i + 1) * twistangle/twiststeps));\n polygons = polygons.concat(this._toWallPolygons({toConnector1: c1, toConnector2: c2}));\n }\n\n return CSG.fromPolygons(polygons);\n },\n\n /*\n * extrude CAG to 3d object by rotating the origin around the y axis\n * (and turning everything into XY plane)\n * arguments: options dict with angle and resolution, both optional\n */\n rotateExtrude: function(options) {\n var alpha = CSG.parseOptionAsFloat(options, \"angle\", 360);\n var resolution = CSG.parseOptionAsInt(options, \"resolution\", CSG.defaultResolution3D);\n\n var EPS = 1e-5;\n\n alpha = alpha > 360 ? alpha % 360 : alpha;\n var origin = [0, 0, 0];\n var axisV = CSG.Vector3D.Create(0, 1, 0);\n var normalV = [0, 0, 1];\n var polygons = [];\n // planes only needed if alpha > 0\n var connS = new CSG.Connector(origin, axisV, normalV);\n if (alpha > 0 && alpha < 360) {\n // we need to rotate negative to satisfy wall function condition of\n // building in the direction of axis vector\n var connE = new CSG.Connector(origin, axisV.rotateZ(-alpha), normalV);\n polygons = polygons.concat(\n this._toPlanePolygons({toConnector: connS, flipped: true}));\n polygons = polygons.concat(\n this._toPlanePolygons({toConnector: connE}));\n }\n var connT1 = connS, connT2;\n var step = alpha/resolution;\n for (var a = step; a <= alpha + EPS; a += step) {\n connT2 = new CSG.Connector(origin, axisV.rotateZ(-a), normalV);\n polygons = polygons.concat(this._toWallPolygons(\n {toConnector1: connT1, toConnector2: connT2}));\n connT1 = connT2;\n }\n return CSG.fromPolygons(polygons).reTesselated();\n },\n\n // check if we are a valid CAG (for debugging)\n // NOTE(bebbi) uneven side count doesn't work because rounding with EPS isn't taken into account\n check: function() {\n var EPS = 1e-5;\n var errors = [];\n if (this.isSelfIntersecting(true)) {\n errors.push(\"Self intersects\");\n }\n var pointcount = {};\n this.sides.map(function(side) {\n function mappoint(p) {\n var tag = p.x + \" \" + p.y;\n if (!(tag in pointcount)) pointcount[tag] = 0;\n pointcount[tag] ++;\n }\n mappoint(side.vertex0.pos);\n mappoint(side.vertex1.pos);\n });\n for (var tag in pointcount) {\n var count = pointcount[tag];\n if (count & 1) {\n errors.push(\"Uneven number of sides (\" + count + \") for point \" + tag);\n }\n }\n var area = this.area();\n if (area < EPS*EPS) {\n errors.push(\"Area is \" + area);\n }\n if (errors.length > 0) {\n var ertxt = \"\";\n errors.map(function(err) {\n ertxt += err + \"\\n\";\n });\n throw new Error(ertxt);\n }\n },\n\n canonicalized: function() {\n if (this.isCanonicalized) {\n return this;\n } else {\n var factory = new CAG.fuzzyCAGFactory();\n var result = factory.getCAG(this);\n result.isCanonicalized = true;\n return result;\n }\n },\n\n toCompactBinary: function() {\n var cag = this.canonicalized();\n var numsides = cag.sides.length;\n var vertexmap = {};\n var vertices = [];\n var numvertices = 0;\n var sideVertexIndices = new Uint32Array(2 * numsides);\n var sidevertexindicesindex = 0;\n cag.sides.map(function(side) {\n [side.vertex0, side.vertex1].map(function(v) {\n var vertextag = v.getTag();\n var vertexindex;\n if (!(vertextag in vertexmap)) {\n vertexindex = numvertices++;\n vertexmap[vertextag] = vertexindex;\n vertices.push(v);\n } else {\n vertexindex = vertexmap[vertextag];\n }\n sideVertexIndices[sidevertexindicesindex++] = vertexindex;\n });\n });\n var vertexData = new Float64Array(numvertices * 2);\n var verticesArrayIndex = 0;\n vertices.map(function(v) {\n var pos = v.pos;\n vertexData[verticesArrayIndex++] = pos._x;\n vertexData[verticesArrayIndex++] = pos._y;\n });\n var result = {\n 'class': \"CAG\",\n sideVertexIndices: sideVertexIndices,\n vertexData: vertexData\n };\n return result;\n },\n\n getOutlinePaths: function() {\n var cag = this.canonicalized();\n var sideTagToSideMap = {};\n var startVertexTagToSideTagMap = {};\n cag.sides.map(function(side) {\n var sidetag = side.getTag();\n sideTagToSideMap[sidetag] = side;\n var startvertextag = side.vertex0.getTag();\n if (!(startvertextag in startVertexTagToSideTagMap)) {\n startVertexTagToSideTagMap[startvertextag] = [];\n }\n startVertexTagToSideTagMap[startvertextag].push(sidetag);\n });\n var paths = [];\n while (true) {\n var startsidetag = null;\n for (var aVertexTag in startVertexTagToSideTagMap) {\n var sidesForThisVertex = startVertexTagToSideTagMap[aVertexTag];\n startsidetag = sidesForThisVertex[0];\n sidesForThisVertex.splice(0, 1);\n if (sidesForThisVertex.length === 0) {\n delete startVertexTagToSideTagMap[aVertexTag];\n }\n break;\n }\n if (startsidetag === null) break; // we've had all sides\n var connectedVertexPoints = [];\n var sidetag = startsidetag;\n var thisside = sideTagToSideMap[sidetag];\n var startvertextag = thisside.vertex0.getTag();\n while (true) {\n connectedVertexPoints.push(thisside.vertex0.pos);\n var nextvertextag = thisside.vertex1.getTag();\n if (nextvertextag == startvertextag) break; // we've closed the polygon\n if (!(nextvertextag in startVertexTagToSideTagMap)) {\n throw new Error(\"Area is not closed!\");\n }\n var nextpossiblesidetags = startVertexTagToSideTagMap[nextvertextag];\n var nextsideindex = -1;\n if (nextpossiblesidetags.length == 1) {\n nextsideindex = 0;\n } else {\n // more than one side starting at the same vertex. This means we have\n // two shapes touching at the same corner\n var bestangle = null;\n var thisangle = thisside.direction().angleDegrees();\n for (var sideindex = 0; sideindex < nextpossiblesidetags.length; sideindex++) {\n var nextpossiblesidetag = nextpossiblesidetags[sideindex];\n var possibleside = sideTagToSideMap[nextpossiblesidetag];\n var angle = possibleside.direction().angleDegrees();\n var angledif = angle - thisangle;\n if (angledif < -180) angledif += 360;\n if (angledif >= 180) angledif -= 360;\n if ((nextsideindex < 0) || (angledif > bestangle)) {\n nextsideindex = sideindex;\n bestangle = angledif;\n }\n }\n }\n var nextsidetag = nextpossiblesidetags[nextsideindex];\n nextpossiblesidetags.splice(nextsideindex, 1);\n if (nextpossiblesidetags.length === 0) {\n delete startVertexTagToSideTagMap[nextvertextag];\n }\n thisside = sideTagToSideMap[nextsidetag];\n } // inner loop\n var path = new CSG.Path2D(connectedVertexPoints, true);\n paths.push(path);\n } // outer loop\n return paths;\n },\n\n /*\n cag = cag.overCutInsideCorners(cutterradius);\n\n Using a CNC router it's impossible to cut out a true sharp inside corner. The inside corner\n will be rounded due to the radius of the cutter. This function compensates for this by creating\n an extra cutout at each inner corner so that the actual cut out shape will be at least as large\n as needed.\n */\n overCutInsideCorners: function(cutterradius) {\n var cag = this.canonicalized();\n // for each vertex determine the 'incoming' side and 'outgoing' side:\n var pointmap = {}; // tag => {pos: coord, from: [], to: []}\n cag.sides.map(function(side) {\n if (!(side.vertex0.getTag() in pointmap)) {\n pointmap[side.vertex0.getTag()] = {\n pos: side.vertex0.pos,\n from: [],\n to: []\n };\n }\n pointmap[side.vertex0.getTag()].to.push(side.vertex1.pos);\n if (!(side.vertex1.getTag() in pointmap)) {\n pointmap[side.vertex1.getTag()] = {\n pos: side.vertex1.pos,\n from: [],\n to: []\n };\n }\n pointmap[side.vertex1.getTag()].from.push(side.vertex0.pos);\n });\n // overcut all sharp corners:\n var cutouts = [];\n for (var pointtag in pointmap) {\n var pointobj = pointmap[pointtag];\n if ((pointobj.from.length == 1) && (pointobj.to.length == 1)) {\n // ok, 1 incoming side and 1 outgoing side:\n var fromcoord = pointobj.from[0];\n var pointcoord = pointobj.pos;\n var tocoord = pointobj.to[0];\n var v1 = pointcoord.minus(fromcoord).unit();\n var v2 = tocoord.minus(pointcoord).unit();\n var crossproduct = v1.cross(v2);\n var isInnerCorner = (crossproduct < 0.001);\n if (isInnerCorner) {\n // yes it's a sharp corner:\n var alpha = v2.angleRadians() - v1.angleRadians() + Math.PI;\n if (alpha < 0) {\n alpha += 2 * Math.PI;\n } else if (alpha >= 2 * Math.PI) {\n alpha -= 2 * Math.PI;\n }\n var midvector = v2.minus(v1).unit();\n var circlesegmentangle = 30 / 180 * Math.PI; // resolution of the circle: segments of 30 degrees\n // we need to increase the radius slightly so that our imperfect circle will contain a perfect circle of cutterradius\n var radiuscorrected = cutterradius / Math.cos(circlesegmentangle / 2);\n var circlecenter = pointcoord.plus(midvector.times(radiuscorrected));\n // we don't need to create a full circle; a pie is enough. Find the angles for the pie:\n var startangle = alpha + midvector.angleRadians();\n var deltaangle = 2 * (Math.PI - alpha);\n var numsteps = 2 * Math.ceil(deltaangle / circlesegmentangle / 2); // should be even\n // build the pie:\n var points = [circlecenter];\n for (var i = 0; i <= numsteps; i++) {\n var angle = startangle + i / numsteps * deltaangle;\n var p = CSG.Vector2D.fromAngleRadians(angle).times(radiuscorrected).plus(circlecenter);\n points.push(p);\n }\n cutouts.push(CAG.fromPoints(points));\n }\n }\n }\n var result = cag.subtract(cutouts);\n return result;\n }\n };\n\n CAG.Vertex = function(pos) {\n this.pos = pos;\n };\n\n CAG.Vertex.fromObject = function(obj) {\n return new CAG.Vertex(new CSG.Vector2D(obj.pos._x,obj.pos._y));\n };\n\n CAG.Vertex.prototype = {\n toString: function() {\n return \"(\" + this.pos.x.toFixed(2) + \",\" + this.pos.y.toFixed(2) + \")\";\n },\n getTag: function() {\n var result = this.tag;\n if (!result) {\n result = CSG.getTag();\n this.tag = result;\n }\n return result;\n }\n };\n\n CAG.Side = function(vertex0, vertex1) {\n if (!(vertex0 instanceof CAG.Vertex)) throw new Error(\"Assertion failed\");\n if (!(vertex1 instanceof CAG.Vertex)) throw new Error(\"Assertion failed\");\n this.vertex0 = vertex0;\n this.vertex1 = vertex1;\n };\n\n CAG.Side.fromObject = function(obj) {\n var vertex0 = CAG.Vertex.fromObject(obj.vertex0);\n var vertex1 = CAG.Vertex.fromObject(obj.vertex1);\n return new CAG.Side(vertex0,vertex1);\n };\n\n CAG.Side._fromFakePolygon = function(polygon) {\n polygon.vertices.forEach(function(v) {\n if (!((v.pos.z >= -1.001) && (v.pos.z < -0.999)) && !((v.pos.z >= 0.999) && (v.pos.z < 1.001))) {\n throw(\"Assertion failed: _fromFakePolygon expects abs z values of 1\");\n }\n })\n // this can happen based on union, seems to be residuals -\n // return null and handle in caller\n if (polygon.vertices.length < 4) {\n return null;\n }\n var reverse = false;\n var vert1Indices = [];\n var pts2d = polygon.vertices.filter(function(v, i) {\n if (v.pos.z > 0) {\n vert1Indices.push(i);\n return true;\n }\n })\n .map(function(v) {\n return new CSG.Vector2D(v.pos.x, v.pos.y);\n });\n if (pts2d.length != 2) {\n throw('Assertion failed: _fromFakePolygon: not enough points found')\n }\n var d = vert1Indices[1] - vert1Indices[0];\n if (d == 1 || d == 3) {\n if (d == 1) {\n pts2d.reverse();\n }\n } else {\n throw('Assertion failed: _fromFakePolygon: unknown index ordering');\n }\n var result = new CAG.Side(new CAG.Vertex(pts2d[0]), new CAG.Vertex(pts2d[1]));\n return result;\n };\n\n CAG.Side.prototype = {\n toString: function() {\n return this.vertex0 + \" -> \" + this.vertex1;\n },\n\n toPolygon3D: function(z0, z1) {\n var vertices = [\n new CSG.Vertex(this.vertex0.pos.toVector3D(z0)),\n new CSG.Vertex(this.vertex1.pos.toVector3D(z0)),\n new CSG.Vertex(this.vertex1.pos.toVector3D(z1)),\n new CSG.Vertex(this.vertex0.pos.toVector3D(z1))\n ];\n return new CSG.Polygon(vertices);\n },\n\n transform: function(matrix4x4) {\n var newp1 = this.vertex0.pos.transform(matrix4x4);\n var newp2 = this.vertex1.pos.transform(matrix4x4);\n return new CAG.Side(new CAG.Vertex(newp1), new CAG.Vertex(newp2));\n },\n\n flipped: function() {\n return new CAG.Side(this.vertex1, this.vertex0);\n },\n\n direction: function() {\n return this.vertex1.pos.minus(this.vertex0.pos);\n },\n\n getTag: function() {\n var result = this.tag;\n if (!result) {\n result = CSG.getTag();\n this.tag = result;\n }\n return result;\n },\n\n lengthSquared: function() {\n var x = this.vertex1.pos.x - this.vertex0.pos.x,\n y = this.vertex1.pos.y - this.vertex0.pos.y;\n return x * x + y * y;\n },\n\n length: function() {\n return Math.sqrt(this.lengthSquared());\n }\n };\n\n //////////////////////////////////////\n CAG.fuzzyCAGFactory = function() {\n this.vertexfactory = new CSG.fuzzyFactory(2, 1e-5);\n };\n\n CAG.fuzzyCAGFactory.prototype = {\n getVertex: function(sourcevertex) {\n var elements = [sourcevertex.pos._x, sourcevertex.pos._y];\n var result = this.vertexfactory.lookupOrCreate(elements, function(els) {\n return sourcevertex;\n });\n return result;\n },\n\n getSide: function(sourceside) {\n var vertex0 = this.getVertex(sourceside.vertex0);\n var vertex1 = this.getVertex(sourceside.vertex1);\n return new CAG.Side(vertex0, vertex1);\n },\n\n getCAG: function(sourcecag) {\n var _this = this;\n var newsides = sourcecag.sides.map(function(side) {\n return _this.getSide(side);\n })\n // remove bad sides (mostly a user input issue)\n .filter(function(side) {\n return side.length() > 1e-5;\n });\n return CAG.fromSides(newsides);\n }\n };\n\n //////////////////////////////////////\n CSG.addTransformationMethodsToPrototype(CSG.prototype);\n CSG.addTransformationMethodsToPrototype(CSG.Vector2D.prototype);\n CSG.addTransformationMethodsToPrototype(CSG.Vector3D.prototype);\n CSG.addTransformationMethodsToPrototype(CSG.Vertex.prototype);\n CSG.addTransformationMethodsToPrototype(CSG.Plane.prototype);\n CSG.addTransformationMethodsToPrototype(CSG.Polygon.prototype);\n CSG.addTransformationMethodsToPrototype(CSG.Line3D.prototype);\n CSG.addTransformationMethodsToPrototype(CSG.Connector.prototype);\n CSG.addTransformationMethodsToPrototype(CSG.Path2D.prototype);\n CSG.addTransformationMethodsToPrototype(CSG.Line2D.prototype);\n CSG.addTransformationMethodsToPrototype(CAG.prototype);\n CSG.addTransformationMethodsToPrototype(CAG.Side.prototype);\n CSG.addTransformationMethodsToPrototype(CSG.OrthoNormalBasis.prototype);\n\n CSG.addCenteringToPrototype(CSG.prototype, ['x', 'y', 'z']);\n CSG.addCenteringToPrototype(CAG.prototype, ['x', 'y']);\n\n /*\n 2D polygons are now supported through the CAG class.\n With many improvements (see documentation):\n - shapes do no longer have to be convex\n - union/intersect/subtract is supported\n - expand / contract are supported\n\n But we'll keep CSG.Polygon2D as a stub for backwards compatibility\n */\n \n CSG.Polygon2D = function(points) {\n var cag = CAG.fromPoints(points);\n this.sides = cag.sides;\n };\n CSG.Polygon2D.prototype = CAG.prototype;\n\n\n //console.log('module', module)\n //module.CSG = CSG;\n //module.CAG = CAG;\n//})(this); //module to export to\n\nmodule.exports = {CSG,CAG}//({})(module)\n","/*\n * Blob.js\n * See https://developer.mozilla.org/en-US/docs/Web/API/Blob\n *\n * Node and Browserify Compatible\n *\n * Copyright (c) 2015 by Z3 Dev (@zdev/www.z3dev.jp)\n * License: MIT License\n *\n * This implementation uses the Buffer class for all storage.\n * See https://nodejs.org/api/buffer.html\n *\n * URL.createObjectURL(blob)\n *\n * History:\n * 2015/07/02: 0.0.1: contributed to OpenJSCAD.org CLI openjscad\n */\n\nexport default function makeBlob(contents, options){\n const blob = typeof window !== 'undefined' ? window.Blob : Blob\n return blob\n}\n\nfunction Blob (contents, options) {\n // make the optional options non-optional\n options = options || {}\n // number of bytes\n this.size = 0 // contents, not allocation\n // media type\n this.type = ''\n // readability state (CLOSED: true, OPENED: false)\n this.isClosed = false\n // encoding of given strings\n this.encoding = 'utf8'\n // storage\n this.buffer = null\n this.length = 32e+6 // allocation, not contents\n\n if (!contents) return\n if (!Array.isArray(contents)) return\n\n // process options if any\n if (options.type) {\n // TBD if type contains any chars outside range U+0020 to U+007E, then set type to the empty string\n // Convert every character in type to lowercase\n this.type = options.type.toLowerCase()\n }\n if (options.endings) {\n // convert the EOL on strings\n }\n if (options.encoding) {\n this.encoding = options.encoding.toLowerCase()\n }\n if (options.length) {\n this.length = options.length\n }\n\n let wbytes\n let object\n // convert the contents (String, ArrayBufferView, ArrayBuffer, Blob)\n this.buffer = new Buffer(this.length)\n var index = 0\n for (index = 0; index < contents.length; index++) {\n switch (typeof (contents[index])) {\n case 'string':\n wbytes = this.buffer.write(contents[index], this.size, this.encoding)\n this.size = this.size + wbytes\n break\n case 'object':\n object = contents[index] // this should be a reference to an object\n if (Buffer.isBuffer(object)) {\n }\n if (object instanceof ArrayBuffer) {\n var view = new DataView(object)\n var bindex = 0\n for (bindex = 0; bindex < object.byteLength; bindex++) {\n var xbyte = view.getUint8(bindex)\n wbytes = this.buffer.writeUInt8(xbyte, this.size, false)\n this.size++\n }\n }\n break\n default:\n break\n }\n }\n return this\n}\n\nBlob.prototype = {\n asBuffer: function () {\n return this.buffer.slice(0, this.size)\n },\n\n slice: function (start, end, type) {\n start = start || 0\n end = end || this.size\n type = type || ''\n return new Blob()\n },\n\n close: function () {\n // if state of context objext is already CLOSED then return\n if (this.isClosed) return\n // set the readbility state of the context object to CLOSED and remove storage\n this.isClosed = true\n },\n\n toString: function () {\n return 'blob blob blob'\n }\n}\n\nexport function revokeBlobUrl (url) {\n if (window.URL) window.URL.revokeObjectURL(url)\n else if (window.webkitURL) window.webkitURL.revokeObjectURL(url)\n else throw new Error(\"Your browser doesn't support window.URL\")\n}\n","import makeBlob from '../../utils/Blob'\nconst Blob = makeBlob()\n\nexport default function toStlString (CSG) {\n var result = 'solid csg.js\\n'\n CSG.polygons.map(function (p) {\n result += CSGPolygontoStlString(p)\n })\n result += 'endsolid csg.js\\n'\n return new Blob([result], {\n type: 'application/sla'\n })\n}\n\nfunction CSGVector3DtoStlString (v) {\n return v._x + ' ' + v._y + ' ' + v._z\n}\n\nfunction CSGVertextoStlString (vertex) {\n return 'vertex ' + CSGVector3DtoStlString(vertex.pos) + '\\n'\n}\n\nfunction CSGPolygontoStlString (polygon) {\n var result = ''\n if (polygon.vertices.length >= 3) // should be!\n {\n // STL requires triangular polygons. If our polygon has more vertices, create\n // multiple triangles:\n var firstVertexStl = CSGVertextoStlString(polygon.vertices[0])\n for (var i = 0; i < polygon.vertices.length - 2; i++) {\n result += 'facet normal ' + CSGVector3DtoStlString(polygon.plane.normal) + '\\nouter loop\\n'\n result += firstVertexStl\n result += CSGVertextoStlString(polygon.vertices[i + 1])\n result += CSGVertextoStlString(polygon.vertices[i + 2])\n result += 'endloop\\nendfacet\\n'\n }\n }\n return result\n}\n","import makeBlob from '../../utils/Blob'\nconst Blob = makeBlob()\n\n// see http://en.wikipedia.org/wiki/STL_%28file_format%29#Binary_STL\nexport default function toStlBinary (CSG) {\n // first check if the host is little-endian:\n var buffer = new ArrayBuffer(4)\n var int32buffer = new Int32Array(buffer, 0, 1)\n var int8buffer = new Int8Array(buffer, 0, 4)\n int32buffer[0] = 0x11223344\n if (int8buffer[0] != 0x44) {\n throw new Error('Binary STL output is currently only supported on little-endian (Intel) processors')\n }\n\n var numtriangles = 0\n CSG.polygons.map(function (p) {\n var numvertices = p.vertices.length\n var thisnumtriangles = (numvertices >= 3) ? numvertices - 2 : 0\n numtriangles += thisnumtriangles\n })\n var headerarray = new Uint8Array(80)\n for (var i = 0; i < 80; i++) {\n headerarray[i] = 65\n }\n var ar1 = new Uint32Array(1)\n ar1[0] = numtriangles\n // write the triangles to allTrianglesBuffer:\n var allTrianglesBuffer = new ArrayBuffer(50 * numtriangles)\n var allTrianglesBufferAsInt8 = new Int8Array(allTrianglesBuffer)\n // a tricky problem is that a Float32Array must be aligned at 4-byte boundaries (at least in certain browsers)\n // while each triangle takes 50 bytes. Therefore we write each triangle to a temporary buffer, and copy that\n // into allTrianglesBuffer:\n var triangleBuffer = new ArrayBuffer(50)\n var triangleBufferAsInt8 = new Int8Array(triangleBuffer)\n // each triangle consists of 12 floats:\n var triangleFloat32array = new Float32Array(triangleBuffer, 0, 12)\n // and one uint16:\n var triangleUint16array = new Uint16Array(triangleBuffer, 48, 1)\n var byteoffset = 0\n CSG.polygons.map(function (p) {\n var numvertices = p.vertices.length\n for (var i = 0; i < numvertices - 2; i++) {\n var normal = p.plane.normal\n triangleFloat32array[0] = normal._x\n triangleFloat32array[1] = normal._y\n triangleFloat32array[2] = normal._z\n var arindex = 3\n for (var v = 0; v < 3; v++) {\n var vv = v + ((v > 0) ? i : 0)\n var vertexpos = p.vertices[vv].pos\n triangleFloat32array[arindex++] = vertexpos._x\n triangleFloat32array[arindex++] = vertexpos._y\n triangleFloat32array[arindex++] = vertexpos._z\n }\n triangleUint16array[0] = 0\n // copy the triangle into allTrianglesBuffer:\n allTrianglesBufferAsInt8.set(triangleBufferAsInt8, byteoffset)\n byteoffset += 50\n }\n })\n return new Blob([headerarray.buffer, ar1.buffer, allTrianglesBuffer], {\n type: 'application/sla'\n })\n}\n","import makeBlob from '../../utils/Blob'\nconst Blob = makeBlob()\n\nexport default function toAMFString (CSG, m) {\n var result = '\\n\\n'\n for (var k in m) {\n result += '' + m[k] + '\\n'\n }\n result += '\\n\\n\\n'\n\n CSG.polygons.map(function (p) { // first we dump all vertices of all polygons\n for (var i = 0; i < p.vertices.length; i++) {\n result += CSGVertextoAMFString(p.vertices[i])\n }\n })\n result += '\\n'\n\n var n = 0\n CSG.polygons.map(function (p) { // then we dump all polygons\n result += '\\n'\n if (p.vertices.length < 3)\n return\n var color = null\n if (p.shared && p.shared.color) {\n color = p.shared.color\n } else if (p.color) {\n color = p.color\n }\n if (color != null) {\n if (color.length < 4) color.push(1.)\n result += '' + color[0] + '' + color[1] + '' + color[2] + '' + color[3] + ''\n }\n\n for (var i = 0; i < p.vertices.length - 2; i++) { // making sure they are all triangles (triangular polygons)\n result += ''\n result += '' + (n) + ''\n result += '' + (n + i + 1) + ''\n result += '' + (n + i + 2) + ''\n result += '\\n'\n }\n n += p.vertices.length\n result += '\\n'\n })\n result += '\\n\\n'\n result += '\\n'\n\n return new Blob([result], {\n type: 'application/amf+xml'\n })\n}\n\nfunction CSGVectortoAMFString(v){\n return '' + v._x + '' + v._y + '' + v._z + ''\n}\n\nfunction CSGVertextoAMFString(vertex){\n return '' + CSGVectortoAMFString(vertex.pos) + '\\n'\n}\n/*\nCSG.Vector3D.prototype.toAMFString = function () {\n return '' + this._x + '' + this._y + '' + this._z + ''\n}\n\nCSG.Vertex.prototype.toAMFString = function () {\n return '' + this.pos.toAMFString() + '\\n'\n}*/\n","//[4] \tNameStartChar\t ::= \t\":\" | [A-Z] | \"_\" | [a-z] | [#xC0-#xD6] | [#xD8-#xF6] | [#xF8-#x2FF] | [#x370-#x37D] | [#x37F-#x1FFF] | [#x200C-#x200D] | [#x2070-#x218F] | [#x2C00-#x2FEF] | [#x3001-#xD7FF] | [#xF900-#xFDCF] | [#xFDF0-#xFFFD] | [#x10000-#xEFFFF]\r\n//[4a] \tNameChar\t ::= \tNameStartChar | \"-\" | \".\" | [0-9] | #xB7 | [#x0300-#x036F] | [#x203F-#x2040]\r\n//[5] \tName\t ::= \tNameStartChar (NameChar)*\r\nvar nameStartChar = /[A-Z_a-z\\xC0-\\xD6\\xD8-\\xF6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD]///\\u10000-\\uEFFFF\r\nvar nameChar = new RegExp(\"[\\\\-\\\\.0-9\"+nameStartChar.source.slice(1,-1)+\"\\\\u00B7\\\\u0300-\\\\u036F\\\\u203F-\\\\u2040]\");\r\nvar tagNamePattern = new RegExp('^'+nameStartChar.source+nameChar.source+'*(?:\\:'+nameStartChar.source+nameChar.source+'*)?$');\r\n//var tagNamePattern = /^[a-zA-Z_][\\w\\-\\.]*(?:\\:[a-zA-Z_][\\w\\-\\.]*)?$/\r\n//var handlers = 'resolveEntity,getExternalSubset,characters,endDocument,endElement,endPrefixMapping,ignorableWhitespace,processingInstruction,setDocumentLocator,skippedEntity,startDocument,startElement,startPrefixMapping,notationDecl,unparsedEntityDecl,error,fatalError,warning,attributeDecl,elementDecl,externalEntityDecl,internalEntityDecl,comment,endCDATA,endDTD,endEntity,startCDATA,startDTD,startEntity'.split(',')\r\n\r\n//S_TAG,\tS_ATTR,\tS_EQ,\tS_ATTR_NOQUOT_VALUE\r\n//S_ATTR_SPACE,\tS_ATTR_END,\tS_TAG_SPACE, S_TAG_CLOSE\r\nvar S_TAG = 0;//tag name offerring\r\nvar S_ATTR = 1;//attr name offerring \r\nvar S_ATTR_SPACE=2;//attr name end and space offer\r\nvar S_EQ = 3;//=space?\r\nvar S_ATTR_NOQUOT_VALUE = 4;//attr value(no quot value only)\r\nvar S_ATTR_END = 5;//attr value end and no space(quot end)\r\nvar S_TAG_SPACE = 6;//(attr value end || tag end ) && (space offer)\r\nvar S_TAG_CLOSE = 7;//closed el\r\n\r\nfunction XMLReader(){\r\n\t\r\n}\r\n\r\nXMLReader.prototype = {\r\n\tparse:function(source,defaultNSMap,entityMap){\r\n\t\tvar domBuilder = this.domBuilder;\r\n\t\tdomBuilder.startDocument();\r\n\t\t_copy(defaultNSMap ,defaultNSMap = {})\r\n\t\tparse(source,defaultNSMap,entityMap,\r\n\t\t\t\tdomBuilder,this.errorHandler);\r\n\t\tdomBuilder.endDocument();\r\n\t}\r\n}\r\nfunction parse(source,defaultNSMapCopy,entityMap,domBuilder,errorHandler){\r\n\tfunction fixedFromCharCode(code) {\r\n\t\t// String.prototype.fromCharCode does not supports\r\n\t\t// > 2 bytes unicode chars directly\r\n\t\tif (code > 0xffff) {\r\n\t\t\tcode -= 0x10000;\r\n\t\t\tvar surrogate1 = 0xd800 + (code >> 10)\r\n\t\t\t\t, surrogate2 = 0xdc00 + (code & 0x3ff);\r\n\r\n\t\t\treturn String.fromCharCode(surrogate1, surrogate2);\r\n\t\t} else {\r\n\t\t\treturn String.fromCharCode(code);\r\n\t\t}\r\n\t}\r\n\tfunction entityReplacer(a){\r\n\t\tvar k = a.slice(1,-1);\r\n\t\tif(k in entityMap){\r\n\t\t\treturn entityMap[k]; \r\n\t\t}else if(k.charAt(0) === '#'){\r\n\t\t\treturn fixedFromCharCode(parseInt(k.substr(1).replace('x','0x')))\r\n\t\t}else{\r\n\t\t\terrorHandler.error('entity not found:'+a);\r\n\t\t\treturn a;\r\n\t\t}\r\n\t}\r\n\tfunction appendText(end){//has some bugs\r\n\t\tif(end>start){\r\n\t\t\tvar xt = source.substring(start,end).replace(/&#?\\w+;/g,entityReplacer);\r\n\t\t\tlocator&&position(start);\r\n\t\t\tdomBuilder.characters(xt,0,end-start);\r\n\t\t\tstart = end\r\n\t\t}\r\n\t}\r\n\tfunction position(p,m){\r\n\t\twhile(p>=lineEnd && (m = linePattern.exec(source))){\r\n\t\t\tlineStart = m.index;\r\n\t\t\tlineEnd = lineStart + m[0].length;\r\n\t\t\tlocator.lineNumber++;\r\n\t\t\t//console.log('line++:',locator,startPos,endPos)\r\n\t\t}\r\n\t\tlocator.columnNumber = p-lineStart+1;\r\n\t}\r\n\tvar lineStart = 0;\r\n\tvar lineEnd = 0;\r\n\tvar linePattern = /.*(?:\\r\\n?|\\n)|.*$/g\r\n\tvar locator = domBuilder.locator;\r\n\t\r\n\tvar parseStack = [{currentNSMap:defaultNSMapCopy}]\r\n\tvar closeMap = {};\r\n\tvar start = 0;\r\n\twhile(true){\r\n\t\ttry{\r\n\t\t\tvar tagStart = source.indexOf('<',start);\r\n\t\t\tif(tagStart<0){\r\n\t\t\t\tif(!source.substr(start).match(/^\\s*$/)){\r\n\t\t\t\t\tvar doc = domBuilder.doc;\r\n\t \t\t\tvar text = doc.createTextNode(source.substr(start));\r\n\t \t\t\tdoc.appendChild(text);\r\n\t \t\t\tdomBuilder.currentElement = text;\r\n\t\t\t\t}\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tif(tagStart>start){\r\n\t\t\t\tappendText(tagStart);\r\n\t\t\t}\r\n\t\t\tswitch(source.charAt(tagStart+1)){\r\n\t\t\tcase '/':\r\n\t\t\t\tvar end = source.indexOf('>',tagStart+3);\r\n\t\t\t\tvar tagName = source.substring(tagStart+2,end);\r\n\t\t\t\tvar config = parseStack.pop();\r\n\t\t\t\tif(end<0){\r\n\t\t\t\t\t\r\n\t \t\ttagName = source.substring(tagStart+2).replace(/[\\s<].*/,'');\r\n\t \t\t//console.error('#@@@@@@'+tagName)\r\n\t \t\terrorHandler.error(\"end tag name: \"+tagName+' is not complete:'+config.tagName);\r\n\t \t\tend = tagStart+1+tagName.length;\r\n\t \t}else if(tagName.match(/\\s\r\n\t\t\t\tlocator&&position(tagStart);\r\n\t\t\t\tend = parseInstruction(source,tagStart,domBuilder);\r\n\t\t\t\tbreak;\r\n\t\t\tcase '!':// start){\r\n\t\t\tstart = end;\r\n\t\t}else{\r\n\t\t\t//TODO: 这里有可能sax回退,有位置错误风险\r\n\t\t\tappendText(Math.max(tagStart,start)+1);\r\n\t\t}\r\n\t}\r\n}\r\nfunction copyLocator(f,t){\r\n\tt.lineNumber = f.lineNumber;\r\n\tt.columnNumber = f.columnNumber;\r\n\treturn t;\r\n}\r\n\r\n/**\r\n * @see #appendElement(source,elStartEnd,el,selfClosed,entityReplacer,domBuilder,parseStack);\r\n * @return end of the elementStartPart(end of elementEndPart for selfClosed el)\r\n */\r\nfunction parseElementStartPart(source,start,el,currentNSMap,entityReplacer,errorHandler){\r\n\tvar attrName;\r\n\tvar value;\r\n\tvar p = ++start;\r\n\tvar s = S_TAG;//status\r\n\twhile(true){\r\n\t\tvar c = source.charAt(p);\r\n\t\tswitch(c){\r\n\t\tcase '=':\r\n\t\t\tif(s === S_ATTR){//attrName\r\n\t\t\t\tattrName = source.slice(start,p);\r\n\t\t\t\ts = S_EQ;\r\n\t\t\t}else if(s === S_ATTR_SPACE){\r\n\t\t\t\ts = S_EQ;\r\n\t\t\t}else{\r\n\t\t\t\t//fatalError: equal must after attrName or space after attrName\r\n\t\t\t\tthrow new Error('attribute equal must after attrName');\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\t\tcase '\\'':\r\n\t\tcase '\"':\r\n\t\t\tif(s === S_EQ || s === S_ATTR //|| s == S_ATTR_SPACE\r\n\t\t\t\t){//equal\r\n\t\t\t\tif(s === S_ATTR){\r\n\t\t\t\t\terrorHandler.warning('attribute value must after \"=\"')\r\n\t\t\t\t\tattrName = source.slice(start,p)\r\n\t\t\t\t}\r\n\t\t\t\tstart = p+1;\r\n\t\t\t\tp = source.indexOf(c,start)\r\n\t\t\t\tif(p>0){\r\n\t\t\t\t\tvalue = source.slice(start,p).replace(/&#?\\w+;/g,entityReplacer);\r\n\t\t\t\t\tel.add(attrName,value,start-1);\r\n\t\t\t\t\ts = S_ATTR_END;\r\n\t\t\t\t}else{\r\n\t\t\t\t\t//fatalError: no end quot match\r\n\t\t\t\t\tthrow new Error('attribute value no end \\''+c+'\\' match');\r\n\t\t\t\t}\r\n\t\t\t}else if(s == S_ATTR_NOQUOT_VALUE){\r\n\t\t\t\tvalue = source.slice(start,p).replace(/&#?\\w+;/g,entityReplacer);\r\n\t\t\t\t//console.log(attrName,value,start,p)\r\n\t\t\t\tel.add(attrName,value,start);\r\n\t\t\t\t//console.dir(el)\r\n\t\t\t\terrorHandler.warning('attribute \"'+attrName+'\" missed start quot('+c+')!!');\r\n\t\t\t\tstart = p+1;\r\n\t\t\t\ts = S_ATTR_END\r\n\t\t\t}else{\r\n\t\t\t\t//fatalError: no equal before\r\n\t\t\t\tthrow new Error('attribute value must after \"=\"');\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\t\tcase '/':\r\n\t\t\tswitch(s){\r\n\t\t\tcase S_TAG:\r\n\t\t\t\tel.setTagName(source.slice(start,p));\r\n\t\t\tcase S_ATTR_END:\r\n\t\t\tcase S_TAG_SPACE:\r\n\t\t\tcase S_TAG_CLOSE:\r\n\t\t\t\ts =S_TAG_CLOSE;\r\n\t\t\t\tel.closed = true;\r\n\t\t\tcase S_ATTR_NOQUOT_VALUE:\r\n\t\t\tcase S_ATTR:\r\n\t\t\tcase S_ATTR_SPACE:\r\n\t\t\t\tbreak;\r\n\t\t\t//case S_EQ:\r\n\t\t\tdefault:\r\n\t\t\t\tthrow new Error(\"attribute invalid close char('/')\")\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\t\tcase ''://end document\r\n\t\t\t//throw new Error('unexpected end of input')\r\n\t\t\terrorHandler.error('unexpected end of input');\r\n\t\t\tif(s == S_TAG){\r\n\t\t\t\tel.setTagName(source.slice(start,p));\r\n\t\t\t}\r\n\t\t\treturn p;\r\n\t\tcase '>':\r\n\t\t\tswitch(s){\r\n\t\t\tcase S_TAG:\r\n\t\t\t\tel.setTagName(source.slice(start,p));\r\n\t\t\tcase S_ATTR_END:\r\n\t\t\tcase S_TAG_SPACE:\r\n\t\t\tcase S_TAG_CLOSE:\r\n\t\t\t\tbreak;//normal\r\n\t\t\tcase S_ATTR_NOQUOT_VALUE://Compatible state\r\n\t\t\tcase S_ATTR:\r\n\t\t\t\tvalue = source.slice(start,p);\r\n\t\t\t\tif(value.slice(-1) === '/'){\r\n\t\t\t\t\tel.closed = true;\r\n\t\t\t\t\tvalue = value.slice(0,-1)\r\n\t\t\t\t}\r\n\t\t\tcase S_ATTR_SPACE:\r\n\t\t\t\tif(s === S_ATTR_SPACE){\r\n\t\t\t\t\tvalue = attrName;\r\n\t\t\t\t}\r\n\t\t\t\tif(s == S_ATTR_NOQUOT_VALUE){\r\n\t\t\t\t\terrorHandler.warning('attribute \"'+value+'\" missed quot(\")!!');\r\n\t\t\t\t\tel.add(attrName,value.replace(/&#?\\w+;/g,entityReplacer),start)\r\n\t\t\t\t}else{\r\n\t\t\t\t\tif(currentNSMap[''] !== 'http://www.w3.org/1999/xhtml' || !value.match(/^(?:disabled|checked|selected)$/i)){\r\n\t\t\t\t\t\terrorHandler.warning('attribute \"'+value+'\" missed value!! \"'+value+'\" instead!!')\r\n\t\t\t\t\t}\r\n\t\t\t\t\tel.add(value,value,start)\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\t\t\tcase S_EQ:\r\n\t\t\t\tthrow new Error('attribute value missed!!');\r\n\t\t\t}\r\n//\t\t\tconsole.log(tagName,tagNamePattern,tagNamePattern.test(tagName))\r\n\t\t\treturn p;\r\n\t\t/*xml space '\\x20' | #x9 | #xD | #xA; */\r\n\t\tcase '\\u0080':\r\n\t\t\tc = ' ';\r\n\t\tdefault:\r\n\t\t\tif(c<= ' '){//space\r\n\t\t\t\tswitch(s){\r\n\t\t\t\tcase S_TAG:\r\n\t\t\t\t\tel.setTagName(source.slice(start,p));//tagName\r\n\t\t\t\t\ts = S_TAG_SPACE;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase S_ATTR:\r\n\t\t\t\t\tattrName = source.slice(start,p)\r\n\t\t\t\t\ts = S_ATTR_SPACE;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase S_ATTR_NOQUOT_VALUE:\r\n\t\t\t\t\tvar value = source.slice(start,p).replace(/&#?\\w+;/g,entityReplacer);\r\n\t\t\t\t\terrorHandler.warning('attribute \"'+value+'\" missed quot(\")!!');\r\n\t\t\t\t\tel.add(attrName,value,start)\r\n\t\t\t\tcase S_ATTR_END:\r\n\t\t\t\t\ts = S_TAG_SPACE;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t//case S_TAG_SPACE:\r\n\t\t\t\t//case S_EQ:\r\n\t\t\t\t//case S_ATTR_SPACE:\r\n\t\t\t\t//\tvoid();break;\r\n\t\t\t\t//case S_TAG_CLOSE:\r\n\t\t\t\t\t//ignore warning\r\n\t\t\t\t}\r\n\t\t\t}else{//not space\r\n//S_TAG,\tS_ATTR,\tS_EQ,\tS_ATTR_NOQUOT_VALUE\r\n//S_ATTR_SPACE,\tS_ATTR_END,\tS_TAG_SPACE, S_TAG_CLOSE\r\n\t\t\t\tswitch(s){\r\n\t\t\t\t//case S_TAG:void();break;\r\n\t\t\t\t//case S_ATTR:void();break;\r\n\t\t\t\t//case S_ATTR_NOQUOT_VALUE:void();break;\r\n\t\t\t\tcase S_ATTR_SPACE:\r\n\t\t\t\t\tvar tagName = el.tagName;\r\n\t\t\t\t\tif(currentNSMap[''] !== 'http://www.w3.org/1999/xhtml' || !attrName.match(/^(?:disabled|checked|selected)$/i)){\r\n\t\t\t\t\t\terrorHandler.warning('attribute \"'+attrName+'\" missed value!! \"'+attrName+'\" instead2!!')\r\n\t\t\t\t\t}\r\n\t\t\t\t\tel.add(attrName,attrName,start);\r\n\t\t\t\t\tstart = p;\r\n\t\t\t\t\ts = S_ATTR;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase S_ATTR_END:\r\n\t\t\t\t\terrorHandler.warning('attribute space is required\"'+attrName+'\"!!')\r\n\t\t\t\tcase S_TAG_SPACE:\r\n\t\t\t\t\ts = S_ATTR;\r\n\t\t\t\t\tstart = p;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase S_EQ:\r\n\t\t\t\t\ts = S_ATTR_NOQUOT_VALUE;\r\n\t\t\t\t\tstart = p;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase S_TAG_CLOSE:\r\n\t\t\t\t\tthrow new Error(\"elements closed character '/' and '>' must be connected to\");\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}//end outer switch\r\n\t\t//console.log('p++',p)\r\n\t\tp++;\r\n\t}\r\n}\r\n/**\r\n * @return true if has new namespace define\r\n */\r\nfunction appendElement(el,domBuilder,currentNSMap){\r\n\tvar tagName = el.tagName;\r\n\tvar localNSMap = null;\r\n\t//var currentNSMap = parseStack[parseStack.length-1].currentNSMap;\r\n\tvar i = el.length;\r\n\twhile(i--){\r\n\t\tvar a = el[i];\r\n\t\tvar qName = a.qName;\r\n\t\tvar value = a.value;\r\n\t\tvar nsp = qName.indexOf(':');\r\n\t\tif(nsp>0){\r\n\t\t\tvar prefix = a.prefix = qName.slice(0,nsp);\r\n\t\t\tvar localName = qName.slice(nsp+1);\r\n\t\t\tvar nsPrefix = prefix === 'xmlns' && localName\r\n\t\t}else{\r\n\t\t\tlocalName = qName;\r\n\t\t\tprefix = null\r\n\t\t\tnsPrefix = qName === 'xmlns' && ''\r\n\t\t}\r\n\t\t//can not set prefix,because prefix !== ''\r\n\t\ta.localName = localName ;\r\n\t\t//prefix == null for no ns prefix attribute \r\n\t\tif(nsPrefix !== false){//hack!!\r\n\t\t\tif(localNSMap == null){\r\n\t\t\t\tlocalNSMap = {}\r\n\t\t\t\t//console.log(currentNSMap,0)\r\n\t\t\t\t_copy(currentNSMap,currentNSMap={})\r\n\t\t\t\t//console.log(currentNSMap,1)\r\n\t\t\t}\r\n\t\t\tcurrentNSMap[nsPrefix] = localNSMap[nsPrefix] = value;\r\n\t\t\ta.uri = 'http://www.w3.org/2000/xmlns/'\r\n\t\t\tdomBuilder.startPrefixMapping(nsPrefix, value) \r\n\t\t}\r\n\t}\r\n\tvar i = el.length;\r\n\twhile(i--){\r\n\t\ta = el[i];\r\n\t\tvar prefix = a.prefix;\r\n\t\tif(prefix){//no prefix attribute has no namespace\r\n\t\t\tif(prefix === 'xml'){\r\n\t\t\t\ta.uri = 'http://www.w3.org/XML/1998/namespace';\r\n\t\t\t}if(prefix !== 'xmlns'){\r\n\t\t\t\ta.uri = currentNSMap[prefix || '']\r\n\t\t\t\t\r\n\t\t\t\t//{console.log('###'+a.qName,domBuilder.locator.systemId+'',currentNSMap,a.uri)}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\tvar nsp = tagName.indexOf(':');\r\n\tif(nsp>0){\r\n\t\tprefix = el.prefix = tagName.slice(0,nsp);\r\n\t\tlocalName = el.localName = tagName.slice(nsp+1);\r\n\t}else{\r\n\t\tprefix = null;//important!!\r\n\t\tlocalName = el.localName = tagName;\r\n\t}\r\n\t//no prefix element has default namespace\r\n\tvar ns = el.uri = currentNSMap[prefix || ''];\r\n\tdomBuilder.startElement(ns,localName,tagName,el);\r\n\t//endPrefixMapping and startPrefixMapping have not any help for dom builder\r\n\t//localNSMap = null\r\n\tif(el.closed){\r\n\t\tdomBuilder.endElement(ns,localName,tagName);\r\n\t\tif(localNSMap){\r\n\t\t\tfor(prefix in localNSMap){\r\n\t\t\t\tdomBuilder.endPrefixMapping(prefix) \r\n\t\t\t}\r\n\t\t}\r\n\t}else{\r\n\t\tel.currentNSMap = currentNSMap;\r\n\t\tel.localNSMap = localNSMap;\r\n\t\t//parseStack.push(el);\r\n\t\treturn true;\r\n\t}\r\n}\r\nfunction parseHtmlSpecialContent(source,elStartEnd,tagName,entityReplacer,domBuilder){\r\n\tif(/^(?:script|textarea)$/i.test(tagName)){\r\n\t\tvar elEndStart = source.indexOf('',elStartEnd);\r\n\t\tvar text = source.substring(elStartEnd+1,elEndStart);\r\n\t\tif(/[&<]/.test(text)){\r\n\t\t\tif(/^script$/i.test(tagName)){\r\n\t\t\t\t//if(!/\\]\\]>/.test(text)){\r\n\t\t\t\t\t//lexHandler.startCDATA();\r\n\t\t\t\t\tdomBuilder.characters(text,0,text.length);\r\n\t\t\t\t\t//lexHandler.endCDATA();\r\n\t\t\t\t\treturn elEndStart;\r\n\t\t\t\t//}\r\n\t\t\t}//}else{//text area\r\n\t\t\t\ttext = text.replace(/&#?\\w+;/g,entityReplacer);\r\n\t\t\t\tdomBuilder.characters(text,0,text.length);\r\n\t\t\t\treturn elEndStart;\r\n\t\t\t//}\r\n\t\t\t\r\n\t\t}\r\n\t}\r\n\treturn elStartEnd+1;\r\n}\r\nfunction fixSelfClosed(source,elStartEnd,tagName,closeMap){\r\n\t//if(tagName in closeMap){\r\n\tvar pos = closeMap[tagName];\r\n\tif(pos == null){\r\n\t\t//console.log(tagName)\r\n\t\tpos = source.lastIndexOf('')\r\n\t\tif(pos',start+4);\r\n\t\t\t//append comment source.substring(4,end)//\");\n\tcase DOCUMENT_TYPE_NODE:\n\t\tvar pubid = node.publicId;\n\t\tvar sysid = node.systemId;\n\t\tbuf.push('');\n\t\t}else if(sysid && sysid!='.'){\n\t\t\tbuf.push(' SYSTEM \"',sysid,'\">');\n\t\t}else{\n\t\t\tvar sub = node.internalSubset;\n\t\t\tif(sub){\n\t\t\t\tbuf.push(\" [\",sub,\"]\");\n\t\t\t}\n\t\t\tbuf.push(\">\");\n\t\t}\n\t\treturn;\n\tcase PROCESSING_INSTRUCTION_NODE:\n\t\treturn buf.push( \"\");\n\tcase ENTITY_REFERENCE_NODE:\n\t\treturn buf.push( '&',node.nodeName,';');\n\t//case ENTITY_NODE:\n\t//case NOTATION_NODE:\n\tdefault:\n\t\tbuf.push('??',node.nodeName);\n\t}\n}\nfunction importNode(doc,node,deep){\n\tvar node2;\n\tswitch (node.nodeType) {\n\tcase ELEMENT_NODE:\n\t\tnode2 = node.cloneNode(false);\n\t\tnode2.ownerDocument = doc;\n\t\t//var attrs = node2.attributes;\n\t\t//var len = attrs.length;\n\t\t//for(var i=0;i','amp':'&','quot':'\"','apos':\"'\"}\r\n\tif(locator){\r\n\t\tdomBuilder.setDocumentLocator(locator)\r\n\t}\r\n\t\r\n\tsax.errorHandler = buildErrorHandler(errorHandler,domBuilder,locator);\r\n\tsax.domBuilder = options.domBuilder || domBuilder;\r\n\tif(/\\/x?html?$/.test(mimeType)){\r\n\t\tentityMap.nbsp = '\\xa0';\r\n\t\tentityMap.copy = '\\xa9';\r\n\t\tdefaultNSMap['']= 'http://www.w3.org/1999/xhtml';\r\n\t}\r\n\tdefaultNSMap.xml = defaultNSMap.xml || 'http://www.w3.org/XML/1998/namespace';\r\n\tif(source){\r\n\t\tsax.parse(source,defaultNSMap,entityMap);\r\n\t}else{\r\n\t\tsax.errorHandler.error(\"invalid doc source\");\r\n\t}\r\n\treturn domBuilder.doc;\r\n}\r\nfunction buildErrorHandler(errorImpl,domBuilder,locator){\r\n\tif(!errorImpl){\r\n\t\tif(domBuilder instanceof DOMHandler){\r\n\t\t\treturn domBuilder;\r\n\t\t}\r\n\t\terrorImpl = domBuilder ;\r\n\t}\r\n\tvar errorHandler = {}\r\n\tvar isCallback = errorImpl instanceof Function;\r\n\tlocator = locator||{}\r\n\tfunction build(key){\r\n\t\tvar fn = errorImpl[key];\r\n\t\tif(!fn && isCallback){\r\n\t\t\tfn = errorImpl.length == 2?function(msg){errorImpl(key,msg)}:errorImpl;\r\n\t\t}\r\n\t\terrorHandler[key] = fn && function(msg){\r\n\t\t\tfn('[xmldom '+key+']\\t'+msg+_locator(locator));\r\n\t\t}||function(){};\r\n\t}\r\n\tbuild('warning');\r\n\tbuild('error');\r\n\tbuild('fatalError');\r\n\treturn errorHandler;\r\n}\r\n\r\n//console.log('#\\n\\n\\n\\n\\n\\n\\n####')\r\n/**\r\n * +ContentHandler+ErrorHandler\r\n * +LexicalHandler+EntityResolver2\r\n * -DeclHandler-DTDHandler \r\n * \r\n * DefaultHandler:EntityResolver, DTDHandler, ContentHandler, ErrorHandler\r\n * DefaultHandler2:DefaultHandler,LexicalHandler, DeclHandler, EntityResolver2\r\n * @link http://www.saxproject.org/apidoc/org/xml/sax/helpers/DefaultHandler.html\r\n */\r\nfunction DOMHandler() {\r\n this.cdata = false;\r\n}\r\nfunction position(locator,node){\r\n\tnode.lineNumber = locator.lineNumber;\r\n\tnode.columnNumber = locator.columnNumber;\r\n}\r\n/**\r\n * @see org.xml.sax.ContentHandler#startDocument\r\n * @link http://www.saxproject.org/apidoc/org/xml/sax/ContentHandler.html\r\n */ \r\nDOMHandler.prototype = {\r\n\tstartDocument : function() {\r\n \tthis.doc = new DOMImplementation().createDocument(null, null, null);\r\n \tif (this.locator) {\r\n \tthis.doc.documentURI = this.locator.systemId;\r\n \t}\r\n\t},\r\n\tstartElement:function(namespaceURI, localName, qName, attrs) {\r\n\t\tvar doc = this.doc;\r\n\t var el = doc.createElementNS(namespaceURI, qName||localName);\r\n\t var len = attrs.length;\r\n\t appendElement(this, el);\r\n\t this.currentElement = el;\r\n\t \r\n\t\tthis.locator && position(this.locator,el)\r\n\t for (var i = 0 ; i < len; i++) {\r\n\t var namespaceURI = attrs.getURI(i);\r\n\t var value = attrs.getValue(i);\r\n\t var qName = attrs.getQName(i);\r\n\t\t\tvar attr = doc.createAttributeNS(namespaceURI, qName);\r\n\t\t\tthis.locator &&position(attrs.getLocator(i),attr);\r\n\t\t\tattr.value = attr.nodeValue = value;\r\n\t\t\tel.setAttributeNode(attr)\r\n\t }\r\n\t},\r\n\tendElement:function(namespaceURI, localName, qName) {\r\n\t\tvar current = this.currentElement\r\n\t\tvar tagName = current.tagName;\r\n\t\tthis.currentElement = current.parentNode;\r\n\t},\r\n\tstartPrefixMapping:function(prefix, uri) {\r\n\t},\r\n\tendPrefixMapping:function(prefix) {\r\n\t},\r\n\tprocessingInstruction:function(target, data) {\r\n\t var ins = this.doc.createProcessingInstruction(target, data);\r\n\t this.locator && position(this.locator,ins)\r\n\t appendElement(this, ins);\r\n\t},\r\n\tignorableWhitespace:function(ch, start, length) {\r\n\t},\r\n\tcharacters:function(chars, start, length) {\r\n\t\tchars = _toString.apply(this,arguments)\r\n\t\t//console.log(chars)\r\n\t\tif(chars){\r\n\t\t\tif (this.cdata) {\r\n\t\t\t\tvar charNode = this.doc.createCDATASection(chars);\r\n\t\t\t} else {\r\n\t\t\t\tvar charNode = this.doc.createTextNode(chars);\r\n\t\t\t}\r\n\t\t\tif(this.currentElement){\r\n\t\t\t\tthis.currentElement.appendChild(charNode);\r\n\t\t\t}else if(/^\\s*$/.test(chars)){\r\n\t\t\t\tthis.doc.appendChild(charNode);\r\n\t\t\t\t//process xml\r\n\t\t\t}\r\n\t\t\tthis.locator && position(this.locator,charNode)\r\n\t\t}\r\n\t},\r\n\tskippedEntity:function(name) {\r\n\t},\r\n\tendDocument:function() {\r\n\t\tthis.doc.normalize();\r\n\t},\r\n\tsetDocumentLocator:function (locator) {\r\n\t if(this.locator = locator){// && !('lineNumber' in locator)){\r\n\t \tlocator.lineNumber = 0;\r\n\t }\r\n\t},\r\n\t//LexicalHandler\r\n\tcomment:function(chars, start, length) {\r\n\t\tchars = _toString.apply(this,arguments)\r\n\t var comm = this.doc.createComment(chars);\r\n\t this.locator && position(this.locator,comm)\r\n\t appendElement(this, comm);\r\n\t},\r\n\t\r\n\tstartCDATA:function() {\r\n\t //used in characters() methods\r\n\t this.cdata = true;\r\n\t},\r\n\tendCDATA:function() {\r\n\t this.cdata = false;\r\n\t},\r\n\t\r\n\tstartDTD:function(name, publicId, systemId) {\r\n\t\tvar impl = this.doc.implementation;\r\n\t if (impl && impl.createDocumentType) {\r\n\t var dt = impl.createDocumentType(name, publicId, systemId);\r\n\t this.locator && position(this.locator,dt)\r\n\t appendElement(this, dt);\r\n\t }\r\n\t},\r\n\t/**\r\n\t * @see org.xml.sax.ErrorHandler\r\n\t * @link http://www.saxproject.org/apidoc/org/xml/sax/ErrorHandler.html\r\n\t */\r\n\twarning:function(error) {\r\n\t\tconsole.warn('[xmldom warning]\\t'+error,_locator(this.locator));\r\n\t},\r\n\terror:function(error) {\r\n\t\tconsole.error('[xmldom error]\\t'+error,_locator(this.locator));\r\n\t},\r\n\tfatalError:function(error) {\r\n\t\tconsole.error('[xmldom fatalError]\\t'+error,_locator(this.locator));\r\n\t throw error;\r\n\t}\r\n}\r\nfunction _locator(l){\r\n\tif(l){\r\n\t\treturn '\\n@'+(l.systemId ||'')+'#[line:'+l.lineNumber+',col:'+l.columnNumber+']'\r\n\t}\r\n}\r\nfunction _toString(chars,start,length){\r\n\tif(typeof chars == 'string'){\r\n\t\treturn chars.substr(start,length)\r\n\t}else{//java sax connect width xmldom on rhino(what about: \"? && !(chars instanceof String)\")\r\n\t\tif(chars.length >= start+length || start){\r\n\t\t\treturn new java.lang.String(chars,start,length)+'';\r\n\t\t}\r\n\t\treturn chars;\r\n\t}\r\n}\r\n\r\n/*\r\n * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/LexicalHandler.html\r\n * used method of org.xml.sax.ext.LexicalHandler:\r\n * #comment(chars, start, length)\r\n * #startCDATA()\r\n * #endCDATA()\r\n * #startDTD(name, publicId, systemId)\r\n *\r\n *\r\n * IGNORED method of org.xml.sax.ext.LexicalHandler:\r\n * #endDTD()\r\n * #startEntity(name)\r\n * #endEntity(name)\r\n *\r\n *\r\n * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/DeclHandler.html\r\n * IGNORED method of org.xml.sax.ext.DeclHandler\r\n * \t#attributeDecl(eName, aName, type, mode, value)\r\n * #elementDecl(name, model)\r\n * #externalEntityDecl(name, publicId, systemId)\r\n * #internalEntityDecl(name, value)\r\n * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/EntityResolver2.html\r\n * IGNORED method of org.xml.sax.EntityResolver2\r\n * #resolveEntity(String name,String publicId,String baseURI,String systemId)\r\n * #resolveEntity(publicId, systemId)\r\n * #getExternalSubset(name, baseURI)\r\n * @link http://www.saxproject.org/apidoc/org/xml/sax/DTDHandler.html\r\n * IGNORED method of org.xml.sax.DTDHandler\r\n * #notationDecl(name, publicId, systemId) {};\r\n * #unparsedEntityDecl(name, publicId, systemId, notationName) {};\r\n */\r\n\"endDTD,startEntity,endEntity,attributeDecl,elementDecl,externalEntityDecl,internalEntityDecl,resolveEntity,getExternalSubset,notationDecl,unparsedEntityDecl\".replace(/\\w+/g,function(key){\r\n\tDOMHandler.prototype[key] = function(){return null}\r\n})\r\n\r\n/* Private static helpers treated below as private instance methods, so don't need to add these to the public API; we might use a Relator to also get rid of non-standard public properties */\r\nfunction appendElement (hander,node) {\r\n if (!hander.currentElement) {\r\n hander.doc.appendChild(node);\r\n } else {\r\n hander.currentElement.appendChild(node);\r\n }\r\n}//appendChild and setAttributeNS are preformance key\r\n\r\n//if(typeof require == 'function'){\r\n\tvar XMLReader = require('./sax').XMLReader;\r\n\tvar DOMImplementation = exports.DOMImplementation = require('./dom').DOMImplementation;\r\n\texports.XMLSerializer = require('./dom').XMLSerializer ;\r\n\texports.DOMParser = DOMParser;\r\n//}\r\n","import makeBlob from '../../utils/Blob'\nconst Blob = makeBlob()\n\nimport xmldom from 'xmldom'\nconst XMLSerializer = xmldom.XMLSerializer\n// NOTE: might be useful :https://github.com/jindw/xmldom/pull/152/commits/be5176ece6fa1591daef96a5f361aaacaa445175\n\nexport default function toX3D (CSG) {\n const DOMImplementation = typeof document !== 'undefined' ? document.implementation : new xmldom.DOMImplementation()\n // materialPolygonLists\n // key: a color string (e.g. \"0 1 1\" for yellow)\n // value: an array of strings specifying polygons of this color\n // (as space-separated indices into vertexCoords)\n var materialPolygonLists = {},\n // list of coordinates (as \"x y z\" strings)\n vertexCoords = [],\n // map to look up the index in vertexCoords of a given vertex\n vertexTagToCoordIndexMap = {}\n\n CSG.polygons.map(function (p) {\n var red = 0,\n green = 0,\n blue = 1 // default color is blue\n if (p.shared && p.shared.color) {\n red = p.shared.color[0]\n green = p.shared.color[1]\n blue = p.shared.color[2]\n }\n\n var polygonVertexIndices = [],\n numvertices = p.vertices.length,\n vertex\n for (var i = 0; i < numvertices; i++) {\n vertex = p.vertices[i]\n if (!(vertex.getTag() in vertexTagToCoordIndexMap)) {\n vertexCoords.push(vertex.pos._x.toString() + ' ' +\n vertex.pos._y.toString() + ' ' +\n vertex.pos._z.toString()\n )\n vertexTagToCoordIndexMap[vertex.getTag()] = vertexCoords.length - 1\n }\n polygonVertexIndices.push(vertexTagToCoordIndexMap[vertex.getTag()])\n }\n\n var polygonString = polygonVertexIndices.join(' ')\n\n var colorString = red.toString() + ' ' + green.toString() + ' ' + blue.toString()\n if (!(colorString in materialPolygonLists)) {\n materialPolygonLists[colorString] = []\n }\n // add this polygonString to the list of colorString-colored polygons\n materialPolygonLists[colorString].push(polygonString)\n })\n\n // create output document\n var docType = DOMImplementation.createDocumentType('X3D',\n 'ISO//Web3D//DTD X3D 3.1//EN', 'http://www.web3d.org/specifications/x3d-3.1.dtd')\n var exportDoc = DOMImplementation.createDocument(null, 'X3D', docType)\n exportDoc.insertBefore(\n exportDoc.createProcessingInstruction('xml', 'version=\"1.0\" encoding=\"UTF-8\"'),\n exportDoc.doctype)\n\n var exportRoot = exportDoc.getElementsByTagName('X3D')[0]\n exportRoot.setAttribute('profile', 'Interchange')\n exportRoot.setAttribute('version', '3.1')\n exportRoot.setAttribute('xsd:noNamespaceSchemaLocation', 'http://www.web3d.org/specifications/x3d-3.1.xsd')\n exportRoot.setAttribute('xmlns:xsd', 'http://www.w3.org/2001/XMLSchema-instance')\n\n var exportScene = exportDoc.createElement('Scene')\n exportRoot.appendChild(exportScene)\n\n /*\n For each color, create a shape made of an appropriately colored\n material which contains all polygons that are this color.\n\n The first shape will contain the definition of all vertices,\n (), which will be referenced by\n subsequent shapes.\n */\n var coordsMeshDefined = false\n for (var colorString in materialPolygonLists) {\n var polygonList = materialPolygonLists[colorString]\n var shape = exportDoc.createElement('Shape')\n exportScene.appendChild(shape)\n\n var appearance = exportDoc.createElement('Appearance')\n shape.appendChild(appearance)\n\n var material = exportDoc.createElement('Material')\n appearance.appendChild(material)\n material.setAttribute('diffuseColor', colorString)\n material.setAttribute('ambientIntensity', '1.0')\n\n var ifs = exportDoc.createElement('IndexedFaceSet')\n shape.appendChild(ifs)\n ifs.setAttribute('solid', 'true')\n ifs.setAttribute('coordIndex', polygonList.join(' -1 ') + ' -1')\n\n var coordinate = exportDoc.createElement('Coordinate')\n ifs.appendChild(coordinate)\n if (coordsMeshDefined) {\n coordinate.setAttribute('USE', 'coords_mesh')\n } else {\n coordinate.setAttribute('DEF', 'coords_mesh')\n coordinate.setAttribute('point', vertexCoords.join(' '))\n coordsMeshDefined = true\n }\n }\n\n var x3dstring = (new XMLSerializer()).serializeToString(exportDoc)\n return new Blob([x3dstring], {\n type: 'model/x3d+xml'\n })\n}\n","import { CSG } from '../../csg'\nimport makeBlob from '../../utils/Blob'\nconst Blob = makeBlob()\n\nexport default function CAGtoSvg (cagObject) {\n var decimals = 1000\n\n // mirror the CAG about the X axis in order to generate paths into the POSITIVE direction\n var plane = new CSG.Plane(CSG.Vector3D.Create(0, 1, 0), 0)\n var cag = cagObject.transform(CSG.Matrix4x4.mirroring(plane))\n\n var bounds = cag.getBounds()\n var paths = cag.getOutlinePaths()\n var width = Math.round((bounds[1].x - bounds[0].x) * decimals) / decimals\n var height = Math.round((bounds[1].y - bounds[0].y) * decimals) / decimals\n var svg = '\\n'\n svg += '\\n'\n svg += '\\n'\n svg += '\\n'\n svg += PathsToSvg(paths, bounds)\n svg += ''\n return new Blob([svg], {\n type: 'image/svg+xml'\n })\n}\n\nfunction PathsToSvg (paths, bounds) {\n // calculate offsets in order to create paths orientated from the 0,0 axis\n var xoffset = 0 - bounds[0].x\n var yoffset = 0 - bounds[0].y\n var str = '\\n'\n paths.map(function (path) {\n str += '= path.points.length) pointindexwrapped -= path.points.length\n var point = path.points[pointindexwrapped]\n if (pointindex > 0) {\n str += 'L' + (point.x + xoffset) + ' ' + (point.y + yoffset)\n } else {\n str += 'M' + (point.x + xoffset) + ' ' + (point.y + yoffset)\n }\n }\n str += '\"/>\\n'\n })\n str += '\\n'\n return str\n}\n","import makeBlob from '../../utils/Blob'\nconst Blob = makeBlob()\n\nexport default function CAGToJson (CAG) {\n var str = '{ \"type\": \"cag\",\"sides\": ['\n var comma = ''\n CAG.sides.map(\n function (side) {\n str += comma\n str += JSON.stringify(side)\n comma = ','\n }\n )\n str += '] }'\n return new Blob([str], {\n type: 'application/json'\n })\n}\n","import makeBlob from '../../utils/Blob'\nconst Blob = makeBlob()\n\nexport default function CAGtoDxf (cagObject) {\n var paths = cagObject.getOutlinePaths()\n return PathsToDxf(paths)\n}\n\nfunction PathsToDxf (paths) {\n var str = '999\\nDXF generated by OpenJsCad\\n'\n str += ' 0\\nSECTION\\n 2\\nHEADER\\n'\n str += ' 0\\nENDSEC\\n'\n str += ' 0\\nSECTION\\n 2\\nTABLES\\n'\n str += ' 0\\nTABLE\\n 2\\nLTYPE\\n 70\\n1\\n'\n str += ' 0\\nLTYPE\\n 2\\nCONTINUOUS\\n 3\\nSolid Line\\n 72\\n65\\n 73\\n0\\n 40\\n0.0\\n'\n str += ' 0\\nENDTAB\\n'\n str += ' 0\\nTABLE\\n 2\\nLAYER\\n 70\\n1\\n'\n str += ' 0\\nLAYER\\n 2\\nOpenJsCad\\n 62\\n7\\n 6\\ncontinuous\\n'\n str += ' 0\\nENDTAB\\n'\n str += ' 0\\nTABLE\\n 2\\nSTYLE\\n 70\\n0\\n 0\\nENDTAB\\n'\n str += ' 0\\nTABLE\\n 2\\nVIEW\\n 70\\n0\\n 0\\nENDTAB\\n'\n str += ' 0\\nENDSEC\\n'\n str += ' 0\\nSECTION\\n 2\\nBLOCKS\\n'\n str += ' 0\\nENDSEC\\n'\n str += ' 0\\nSECTION\\n 2\\nENTITIES\\n'\n paths.map(function (path) {\n var numpoints_closed = path.points.length + (path.closed ? 1 : 0)\n str += ' 0\\nLWPOLYLINE\\n 8\\nOpenJsCad\\n 90\\n' + numpoints_closed + '\\n 70\\n' + (path.closed ? 1 : 0) + '\\n'\n for (var pointindex = 0; pointindex < numpoints_closed; pointindex++) {\n var pointindexwrapped = pointindex\n if (pointindexwrapped >= path.points.length) pointindexwrapped -= path.points.length\n var point = path.points[pointindexwrapped]\n str += ' 10\\n' + point.x + '\\n 20\\n' + point.y + '\\n 30\\n0.0\\n'\n }\n })\n str += ' 0\\nENDSEC\\n 0\\nEOF\\n'\n return new Blob([str], {\n type: 'application/dxf'\n })\n}\n","/* converts input data to array if it is not already an array*/\nexport function toArray (data) {\n if (!data) return []\n if (data.constructor !== Array) return [data]\n return data\n}\n","import { version } from '../jscad/version'\nimport { CSG, CAG } from '../csg'\nimport toStlString from '../io/writers/CSGToStla'\nimport toStlBinary from '../io/writers/CSGToStlb'\nimport toAMFString from '../io/writers/CSGToAMF'\nimport toX3D from '../io/writers/CSGToX3D'\nimport CAGtoSvg from '../io/writers/CAGtoSvg'\nimport CAGToJson from '../io/writers/CAGToJson'\nimport CAGtoDxf from '../io/writers/CAGtoDxf'\n\nimport {toArray} from '../utils/misc'\nimport makeBlob from '../utils/Blob'\nconst Blob = makeBlob()\n\nexport default function convertToBlob (objects, params) {\n const {format, formatInfo} = params\n\n let object\n\n if (format === 'jscad') {\n object = objects\n } else {\n objects = toArray(objects)\n //console.log('convertToBlob', objects, format)\n //console.log('object', objects[0], objects[0] instanceof CSG)\n\n // review the given objects\n let foundCSG = false\n let foundCAG = false\n for (let i = 0; i < objects.length; i++) {\n if (objects[i] instanceof CSG) { foundCSG = true }\n if (objects[i] instanceof CAG) { foundCAG = true }\n }\n // convert based on the given format\n foundCSG = foundCSG && formatInfo.convertCSG\n foundCAG = foundCAG && formatInfo.convertCAG\n if (foundCSG && foundCAG) { foundCAG = false } // use 3D conversion\n\n object = !foundCSG ? new CAG() : new CSG()\n\n for (let i = 0; i < objects.length; i++) {\n if (foundCSG === true && objects[i] instanceof CAG) {\n object = object.union(objects[i].extrude({offset: [0, 0, 0.1]})) // convert CAG to a thin solid CSG\n continue\n }\n if (foundCAG === true && objects[i] instanceof CSG) {\n continue\n }\n object = object.union(objects[i])\n }\n }\n\n const meta = {\n producer: 'OpenJSCAD.org ' + version,\n date: new Date()\n }\n\n const outputFormatHandlers = {\n amf: (object) => toAMFString(object, meta), // CSG to AMF\n stl: (object) => toStlString(object), // CSG to STL ASCII\n stla: (object) => toStlString(object), // CSG to STL ASCII\n stlb: (object) => toStlBinary(object, {webBlob: true}), // CSG to STL BINARY\n dxf: (object) => CAGtoDxf(object), // CAG to DXF\n svg: (object) => CAGtoSvg(object), // CAG to SVG\n x3d: (object) => toX3D(object.fixTJunctions()), // CSG to X3D Only possible via browsers\n json: (object) => CAGToJson(object), // CSG or CAG to JSON\n js: (object) => object, // js , pass through\n jscad: (object) => object, // jscad, pass through\n undefined: () => {\n throw new Error('Not supported : only jscad, stl, amf, dxf, svg or json as output format')\n }\n }\n\n let blob = outputFormatHandlers[format](object)\n\n if (format === 'jscad') {\n blob = new Blob([blob], { type: formatInfo.mimetype })\n }\n return blob\n}\n","// == OpenJSCAD.org, Copyright (c) 2013-2016, Licensed under MIT License\n//\n// History:\n// 2016/02/02: 0.4.0: GUI refactored, functionality split up into more files, mostly done by Z3 Dev\n\n/**\n * Create an function for processing the JSCAD script into CSG/CAG objects\n * @param {String} script the script\n * @param {Object} globals the globals to use when evaluating the script: these are not ..\n * ...ACTUAL globals, merely functions/ variable accessible AS IF they were globals !\n */\nexport default function createJscadFunction (script, globals) {\n // console.log('globals', globals)\n // not a fan of this, we have way too many explicit api elements\n let globalsList = ''\n // each top key is a library ie : openscad helpers etc\n // one level below that is the list of libs\n // last level is the actual function we want to export to 'local' scope\n Object.keys(globals).forEach(function (libKey) {\n const lib = globals[libKey]\n // console.log(`lib:${libKey}: ${lib}`)\n Object.keys(lib).forEach(function (libItemKey) {\n const libItems = lib[libItemKey]\n // console.log('libItems', libItems)\n Object.keys(libItems).forEach(function (toExposeKey) {\n // console.log('toExpose',toExpose )\n const text = `const ${toExposeKey} = globals['${libKey}']['${libItemKey}']['${toExposeKey}']\n`\n globalsList += text\n })\n })\n })\n\n const source = `// SYNC WORKER\n ${globalsList}\n\n //user defined script(s)\n ${script}\n\n if (typeof (main) !== 'function') {\n throw new Error('The JSCAD script must contain a function main() which returns one or more CSG or CAG solids.')\n }\n\n return main(params)\n `\n\n var f = new Function('params', 'include', 'globals', source)\n return f\n}\n","//\n// THESE FUNCTIONS ARE SERIALIZED FOR INCLUSION IN THE FULL SCRIPT\n//\n// TODO It might be possible to cache the serialized versions\n//\n\n// Include the requested script via MemFs (if available) or HTTP Request\n//\n// (Note: This function is appended together with the JSCAD script)\n//\nexport default function includeJscadSync (relpath, fn) {\n //console.log('include', relpath, fn)\n // include the requested script via MemFs if possible\n return new Promise(function (resolve, reject) {\n if (typeof (gMemFs) === 'object') {\n for (var fs in gMemFs) {\n if (gMemFs[fs].name === fn) {\n //eval(gMemFs[fs].source)\n resolve(gMemFs[fs].source)\n }\n }\n }\n // include the requested script via webserver access\n var xhr = new XMLHttpRequest()\n var url = relpath + fn\n if (fn.match(/^(https:|http:)/i)) {\n url = fn\n }\n xhr.open('GET', url, false)\n xhr.onload = function () {\n var src = this.responseText\n //console.log('src',src)\n //eval(src) // UGH ???\n resolve(src)\n }\n xhr.onerror = function () {}\n xhr.send()\n })\n}\n","import { CAG } from '../csg'\n\n// -- 2D primitives (OpenSCAD like notion)\n\nexport function square () {\n let v = [1, 1]\n let off\n let a = arguments\n let p = a[0]\n\n if (p && !p.size) v = [p, p]\n if (p && p.length) v = a[0], p = a[1]\n if (p && p.size && p.size.length) v = p.size\n\n off = [v[0] / 2, v[1] / 2]\n if (p && p.center === true) off = [0, 0]\n\n var o = CAG.rectangle({center: off, radius: [v[0] / 2, v[1] / 2]})\n\n return o\n}\n\nexport function circle () {\n let r = 1\n let off\n let fn = 32\n let a = arguments\n let p = a[0]\n if (p && p.r) r = p.r\n if (p && p.fn) fn = p.fn\n if (p && !p.r && !p.fn && !p.center) r = p\n off = [r, r]\n if (p && p.center === true) { off = [0, 0] }\n var o = CAG.circle({center: off, radius: r, resolution: fn})\n return o\n}\n\nexport function polygon (p) { // array of po(ints) and pa(ths)\n var points = [ ]\n if (p.paths && p.paths.length && p.paths[0].length) { // pa(th): [[0,1,2],[2,3,1]] (two paths)\n for (var j = 0; j < p.paths.length; j++) {\n for (var i = 0; i < p.paths[j].length; i++) {\n points[i] = p.points[p.paths[j][i]]\n }\n }\n } else if (p.paths && p.paths.length) { // pa(th): [0,1,2,3,4] (single path)\n for (var i = 0; i < p.paths.length; i++) {\n points[i] = p.points[p.paths[i]]\n }\n } else { // pa(th) = po(ints)\n if (p.length) {\n points = p\n } else {\n points = p.points\n }\n }\n return CAG.fromPoints(points)\n}\n\nexport function triangle () { // -- new addition\n var a = arguments\n if (a[0] && a[0].length) a = a[0]\n var o = CAG.fromPoints(a)\n return o\n}\n","import { CSG } from '../csg'\n// -- 2D to 3D primitives (OpenSCAD like notion)\n\nexport function linear_extrude (p, s) {\n // console.log(\"linear_extrude() not yet implemented\")\n // return\n let h = 1\n let off = 0\n let twist = 0\n let slices = 10\n /* convexity = 10,*/\n\n if (p.height) h = p.height\n // if(p.convexity) convexity = p.convexity // abandoned\n if (p.twist) twist = p.twist\n if (p.slices) slices = p.slices\n var o = s.extrude({offset: [0, 0, h], twistangle: twist, twiststeps: slices})\n if (p.center === true) {\n var b = [ ]\n b = o.getBounds() // b[0] = min, b[1] = max\n off = b[1].plus(b[0])\n off = off.times(-0.5)\n o = o.translate(off)\n }\n return o\n}\n\nexport function rotate_extrude (p, o) {\n var fn = 32\n if (arguments.length < 2) {\n o = p // no switches, just an object\n } else if (p !== undefined) {\n fn = p.fn\n }\n if (fn < 3) fn = 3\n var ps = []\n for (var i = 0; i < fn; i++) {\n // o.{x,y} -> rotate([0,0,i:0..360], obj->{o.x,0,o.y})\n for (var j = 0; j < o.sides.length; j++) {\n // has o.sides[j].vertex{0,1}.pos (only x,y)\n var p = []\n var m\n\n m = new CSG.Matrix4x4.rotationZ(i / fn * 360)\n p[0] = new CSG.Vector3D(o.sides[j].vertex0.pos.x, 0, o.sides[j].vertex0.pos.y)\n p[0] = m.rightMultiply1x3Vector(p[0])\n\n p[1] = new CSG.Vector3D(o.sides[j].vertex1.pos.x, 0, o.sides[j].vertex1.pos.y)\n p[1] = m.rightMultiply1x3Vector(p[1])\n\n m = new CSG.Matrix4x4.rotationZ((i + 1) / fn * 360)\n p[2] = new CSG.Vector3D(o.sides[j].vertex1.pos.x, 0, o.sides[j].vertex1.pos.y)\n p[2] = m.rightMultiply1x3Vector(p[2])\n\n p[3] = new CSG.Vector3D(o.sides[j].vertex0.pos.x, 0, o.sides[j].vertex0.pos.y)\n p[3] = m.rightMultiply1x3Vector(p[3])\n\n var p1 = new CSG.Polygon([\n new CSG.Vertex(p[0]),\n new CSG.Vertex(p[1]),\n new CSG.Vertex(p[2]),\n new CSG.Vertex(p[3]), // we make a square polygon (instead of 2 triangles)\n ])\n // var p2 = new CSG.Polygon([\n // new CSG.Vertex(p[0]),\n // new CSG.Vertex(p[2]),\n // new CSG.Vertex(p[3]),\n // ])\n ps.push(p1)\n // ps.push(p2)\n // echo(\"i=\"+i,i/fn*360,\"j=\"+j)\n }\n }\n return CSG.fromPolygons(ps)\n}\n\nexport function rectangular_extrude (pa, p) {\n let w = 1\n let h = 1\n let fn = 8\n let closed = false\n let round = true\n if (p) {\n if (p.w) w = p.w\n if (p.h) h = p.h\n if (p.fn) fn = p.fn\n if (p.closed !== undefined) closed = p.closed\n if (p.round !== undefined) round = p.round\n }\n return new CSG.Path2D(pa, closed).rectangularExtrude(w, h, fn, round)\n}\n","// -- 3D primitives (OpenSCAD like notion)\nimport { CSG } from '../csg'\nimport { circle } from './primitives2d'\nimport { rotate_extrude } from './ops-extrusions'\n\nexport function cube (p) {\n var s = 1, v = null, off = [0, 0, 0], round = false, r = 0, fn = 8\n if (p && p.length) v = p\n if (p && p.size && p.size.length) v = p.size // { size: [1,2,3] }\n if (p && p.size && !p.size.length) s = p.size // { size: 1 }\n // if(p&&!p.size&&!p.length&&p.center===undefined&&!p.round&&!p.radius) s = p // (2)\n if (p && (typeof p != 'object')) s = p// (2)\n if (p && p.round == true) { round = true, r = v && v.length ? (v[0] + v[1] + v[2]) / 30 : s / 10}\n if (p && p.radius) { round = true, r = p.radius }\n if (p && p.fn) fn = p.fn // applies in case of round: true\n\n var x = s, y = s, z = s\n if (v && v.length) {\n x = v[0], y = v[1], z = v[2]\n }\n off = [x / 2, y / 2, z / 2] // center: false default\n var o = round ?\n CSG.roundedCube({radius: [x / 2, y / 2, z / 2], roundradius: r, resolution: fn}) :\n CSG.cube({radius: [x / 2, y / 2, z / 2]})\n if (p && p.center && p.center.length) {\n off = [p.center[0] ? 0 : x / 2, p.center[1] ? 0 : y / 2, p.center[2] ? 0 : z / 2]\n } else if (p && p.center == true) {\n off = [0, 0, 0]\n } else if (p && p.center == false) {\n off = [x / 2, y / 2, z / 2]\n }\n if (off[0] || off[1] || off[2]) o = o.translate(off)\n // if(v&&v.length) o = o.scale(v) // we don't scale afterwards, we already created box with the correct size\n return o\n}\n\nexport function sphere (p) {\n var r = 1\n var fn = 32\n var off = [0, 0, 0]\n var type = 'normal'\n\n // var zoff = 0 // sphere() in openscad has no center:true|false\n if (p && p.r) r = p.r\n if (p && p.fn) fn = p.fn\n if (p && p.type) type = p.type\n // if(p&&!p.r&&!p.fn&&!p.type) r = p\n if (p && (typeof p != 'object')) r = p\n off = [0, 0, 0] // center: false (default)\n\n var o\n if (type == 'geodesic')\n o = geodesicSphere(p)\n else\n o = CSG.sphere({radius: r,resolution: fn})\n\n if (p && p.center && p.center.length) { // preparing individual x,y,z center\n off = [p.center[0] ? 0 : r, p.center[1] ? 0 : r, p.center[2] ? 0 : r]\n } else if (p && p.center == true) {\n off = [0, 0, 0]\n } else if (p && p.center == false) {\n off = [r, r, r]\n }\n if (off[0] || off[1] || off[2]) o = o.translate(off)\n return o\n}\n\nexport function geodesicSphere (p) {\n var r = 1, fn = 5\n\n var ci = [ // hard-coded data of icosahedron (20 faces, all triangles)\n [0.850651, 0.000000, -0.525731],\n [0.850651, -0.000000, 0.525731],\n [-0.850651, -0.000000, 0.525731],\n [-0.850651, 0.000000, -0.525731],\n [0.000000, -0.525731, 0.850651],\n [0.000000, 0.525731, 0.850651],\n [0.000000, 0.525731, -0.850651],\n [0.000000, -0.525731, -0.850651],\n [-0.525731, -0.850651, -0.000000],\n [0.525731, -0.850651, -0.000000],\n [0.525731, 0.850651, 0.000000],\n [-0.525731, 0.850651, 0.000000]]\n\n var ti = [ [0, 9, 1], [1, 10, 0], [6, 7, 0], [10, 6, 0], [7, 9, 0], [5, 1, 4], [4, 1, 9], [5, 10, 1], [2, 8, 3], [3, 11, 2], [2, 5, 4],\n [4, 8, 2], [2, 11, 5], [3, 7, 6], [6, 11, 3], [8, 7, 3], [9, 8, 4], [11, 10, 5], [10, 11, 6], [8, 9, 7]]\n\n var geodesicSubDivide = function (p, fn, off) {\n var p1 = p[0], p2 = p[1], p3 = p[2]\n var n = off\n var c = []\n var f = []\n\n // p3\n // /\\\n // /__\\ fn = 3\n // i /\\ /\\\n // /__\\/__\\ total triangles = 9 (fn*fn)\n // /\\ /\\ /\\\n // 0/__\\/__\\/__\\\n // p1 0 j p2\n\n for (var i = 0; i < fn; i++) {\n for (var j = 0; j < fn - i; j++) {\n var t0 = i / fn\n var t1 = (i + 1) / fn\n var s0 = j / (fn - i)\n var s1 = (j + 1) / (fn - i)\n var s2 = fn - i - 1 ? j / (fn - i - 1) : 1\n var q = []\n\n q[0] = mix3(mix3(p1, p2, s0), p3, t0)\n q[1] = mix3(mix3(p1, p2, s1), p3, t0)\n q[2] = mix3(mix3(p1, p2, s2), p3, t1)\n\n // -- normalize\n for (var k = 0; k < 3; k++) {\n var r = Math.sqrt(q[k][0] * q[k][0] + q[k][1] * q[k][1] + q[k][2] * q[k][2])\n for (var l = 0; l < 3; l++) {\n q[k][l] /= r\n }\n }\n c.push(q[0], q[1], q[2])\n f.push([n, n + 1, n + 2]); n += 3\n\n if (j < fn - i - 1) {\n var s3 = fn - i - 1 ? (j + 1) / (fn - i - 1) : 1\n q[0] = mix3(mix3(p1, p2, s1), p3, t0)\n q[1] = mix3(mix3(p1, p2, s3), p3, t1)\n q[2] = mix3(mix3(p1, p2, s2), p3, t1)\n\n // -- normalize\n for (var k = 0; k < 3; k++) {\n var r = Math.sqrt(q[k][0] * q[k][0] + q[k][1] * q[k][1] + q[k][2] * q[k][2])\n for (var l = 0; l < 3; l++) {\n q[k][l] /= r\n }\n }\n c.push(q[0], q[1], q[2])\n f.push([n, n + 1, n + 2]); n += 3\n }\n }\n }\n return { points: c, triangles: f, off: n }\n }\n\n var mix3 = function (a, b, f) {\n var _f = 1 - f\n var c = []\n for (var i = 0; i < 3; i++) {\n c[i] = a[i] * _f + b[i] * f\n }\n return c\n }\n\n if (p) {\n if (p.fn) fn = Math.floor(p.fn / 6)\n if (p.r) r = p.r\n }\n\n if (fn <= 0) fn = 1\n\n var q = []\n var c = [], f = []\n var off = 0\n\n for (var i = 0; i < ti.length; i++) {\n var g = geodesicSubDivide([ ci[ti[i][0]], ci[ti[i][1]], ci[ti[i][2]]], fn, off)\n c = c.concat(g.points)\n f = f.concat(g.triangles)\n off = g.off\n }\n return polyhedron({points: c, triangles: f}).scale(r)\n}\n\nexport function cylinder (p) {\n var r1 = 1, r2 = 1, h = 1, fn = 32, round = false\n var a = arguments\n var off = [0, 0, 0]\n if (p && p.d) {\n r1 = r2 = p.d / 2\n }\n if (p && p.r) {\n r1 = p.r\n r2 = p.r\n }\n if (p && p.h) {\n h = p.h\n }\n if (p && (p.r1 || p.r2)) {\n r1 = p.r1\n r2 = p.r2\n if (p.h) h = p.h\n }\n if (p && (p.d1 || p.d2)) {\n r1 = p.d1 / 2\n r2 = p.d2 / 2\n }\n\n if (a && a[0] && a[0].length) {\n a = a[0]\n r1 = a[0]\n r2 = a[1]\n h = a[2]\n if (a.length === 4) fn = a[3]\n }\n if (p && p.fn) fn = p.fn\n // if(p&&p.center==true) zoff = -h/2\n if (p && p.round === true) round = true\n var o\n if (p && (p.start && p.end)) {\n o = round ?\n CSG.roundedCylinder({start: p.start, end: p.end, radiusStart: r1, radiusEnd: r2, resolution: fn}) :\n CSG.cylinder({start: p.start, end: p.end, radiusStart: r1, radiusEnd: r2, resolution: fn})\n } else {\n o = round ?\n CSG.roundedCylinder({start: [0, 0, 0], end: [0, 0, h], radiusStart: r1, radiusEnd: r2, resolution: fn}) :\n CSG.cylinder({start: [0, 0, 0], end: [0, 0, h], radiusStart: r1, radiusEnd: r2, resolution: fn})\n var r = r1 > r2 ? r1 : r2\n if (p && p.center && p.center.length) { // preparing individual x,y,z center\n off = [p.center[0] ? 0 : r, p.center[1] ? 0 : r, p.center[2] ? -h / 2 : 0]\n } else if (p && p.center === true) {\n off = [0, 0, -h / 2]\n } else if (p && p.center === false) {\n off = [0, 0, 0]\n }\n if (off[0] || off[1] || off[2]) o = o.translate(off)\n }\n return o\n}\n\nexport function torus (p) {\n var ri = 1, ro = 4, fni = 16, fno = 32, roti = 0\n if (p) {\n if (p.ri) ri = p.ri\n if (p.fni) fni = p.fni\n if (p.roti) roti = p.roti\n if (p.ro) ro = p.ro\n if (p.fno) fno = p.fno\n }\n if (fni < 3) fni = 3\n if (fno < 3) fno = 3\n var c = circle({r: ri, fn: fni, center: true})\n if (roti) c = c.rotateZ(roti)\n return rotate_extrude({fn: fno}, c.translate([ro, 0, 0]))\n}\n\nexport function polyhedron (p) {\n var pgs = []\n var ref = p.triangles || p.polygons\n var colors = p.colors || null\n\n for (var i = 0; i < ref.length; i++) {\n var pp = []\n for (var j = 0; j < ref[i].length; j++) {\n pp[j] = p.points[ref[i][j]]\n }\n\n var v = []\n for (j = ref[i].length - 1; j >= 0; j--) { // --- we reverse order for examples of OpenSCAD work\n v.push(new CSG.Vertex(new CSG.Vector3D(pp[j][0], pp[j][1], pp[j][2])))\n }\n var s = CSG.Polygon.defaultShared\n if (colors && colors[i]) {\n s = CSG.Polygon.Shared.fromColor(colors[i])\n }\n pgs.push(new CSG.Polygon(v, s))\n }\n var r = CSG.fromPolygons(pgs)\n return r\n}\n","import {CAG, CSG} from '../csg'\n\n// -- 3D operations (OpenSCAD like notion)\nexport function union () {\n var o,i = 0,a = arguments\n if (a[0].length) a = a[0]\n\n o = a[i++]\n if (0) { // we leave to code for now, perhaps later we allow mixed CAG/CSG union\n if ((typeof (a[i]) == 'object') && (a[i] instanceof CAG)) {\n o = a[i].extrude({offset: [0, 0, 0.1]}) // -- convert a 2D shape to a thin solid, note: do not a[i] = a[i].extrude()\n } else {\n o = a[i++]\n }\n }\n for (; i < a.length; i++) {\n var obj = a[i]\n\n // for now disabled, later perhaps allow mixed union of CAG/CSG\n if (0 && (typeof (a[i]) == 'object') && (a[i] instanceof CAG)) {\n obj = a[i].extrude({offset: [0, 0, 0.1]}) // -- convert a 2D shape to a thin solid:\n }\n o = o.union(obj)\n }\n return o\n}\n\nexport function difference () {\n var o,i = 0,a = arguments\n if (a[0].length) a = a[0]\n for (o = a[i++]; i < a.length; i++) {\n if (a[i] instanceof CAG) {\n o = o.subtract(a[i])\n } else {\n o = o.subtract(a[i].setColor(1, 1, 0)) // -- color the cuts\n }\n }\n return o\n}\n\nexport function intersection () {\n var o,i = 0,a = arguments\n if (a[0].length) a = a[0]\n for (o = a[i++]; i < a.length; i++) {\n if (a[i] instanceof CAG) {\n o = o.intersect(a[i])\n } else {\n o = o.intersect(a[i].setColor(1, 1, 0)) // -- color the cuts\n }\n }\n return o\n}\n","import { CSG, CAG } from '../csg'\nimport { union } from './ops-booleans'\n// -- 3D transformations (OpenSCAD like notion)\n\n\nexport function translate() { // v, obj or array\n var a = arguments, v = a[0], o, i = 1;\n if(a[1].length) { a = a[1]; i = 0; }\n for(o=a[i++]; ip.angle)\n return 1;\n else {\n if (this.distancep.distance)\n return 1;\n }\n return 0;\n }\n }\n\n var ConvexHull = function() {\n this.points = null;\n this.indices = null;\n\n this.getIndices = function() {\n return this.indices;\n }\n\n this.clear = function() {\n this.indices = null;\n this.points = null;\n }\n\n this.ccw = function(p1, p2, p3) {\n var ccw = (this.points[p2].x - this.points[p1].x)*(this.points[p3].y - this.points[p1].y) -\n (this.points[p2].y - this.points[p1].y)*(this.points[p3].x - this.points[p1].x);\n if(ccw<1e-5) // we need this, otherwise sorting never ends, see https://github.com/Spiritdude/OpenJSCAD.org/issues/18\n return 0\n return ccw;\n }\n\n this.angle = function(o, a) {\n //return Math.atan((this.points[a].y-this.points[o].y) / (this.points[a].x - this.points[o].x));\n return Math.atan2((this.points[a].y-this.points[o].y), (this.points[a].x - this.points[o].x));\n }\n\n this.distance = function(a, b) {\n return ((this.points[b].x-this.points[a].x)*(this.points[b].x-this.points[a].x)+\n (this.points[b].y-this.points[a].y)*(this.points[b].y-this.points[a].y));\n }\n\n this.compute = function(_points) {\n this.indices=null;\n if (_points.length<3)\n return;\n this.points=_points;\n\n // Find the lowest point\n var min = 0;\n for(var i = 1; i < this.points.length; i++) {\n if(this.points[i].y==this.points[min].y) {\n if(this.points[i].x0) {\n var ch = [];\n for(var i=0; i 0.5 ? d / (2 - max - min) : d / (max + min)\n switch (max) {\n case r:\n h = (g - b) / d + (g < b ? 6 : 0)\n break\n case g:\n h = (b - r) / d + 2\n break\n case b:\n h = (r - g) / d + 4\n break\n }\n h /= 6\n }\n\n return [h, s, l]\n}\n\n/**\n * Converts an HSL color value to RGB. Conversion formula\n * adapted from http://en.wikipedia.org/wiki/HSL_color_space.\n * Assumes h, s, and l are contained in the set [0, 1] and\n * returns r, g, and b in the set [0, 1].\n *\n * @param Number h The hue\n * @param Number s The saturation\n * @param Number l The lightness\n * @return Array The RGB representation\n */\nexport function hsl2rgb (h, s, l) {\n if (h.length) { l = h[2], s = h[1], h = h[0]; }\n var r, g, b\n\n if (s == 0) {\n r = g = b = l // achromatic\n } else {\n function hue2rgb (p, q, t) {\n if (t < 0) t += 1\n if (t > 1) t -= 1\n if (t < 1 / 6) return p + (q - p) * 6 * t\n if (t < 1 / 2) return q\n if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6\n return p\n }\n\n var q = l < 0.5 ? l * (1 + s) : l + s - l * s\n var p = 2 * l - q\n r = hue2rgb(p, q, h + 1 / 3)\n g = hue2rgb(p, q, h)\n b = hue2rgb(p, q, h - 1 / 3)\n }\n\n return [r, g, b]\n}\n\n/**\n * Converts an RGB color value to HSV. Conversion formula\n * adapted from http://en.wikipedia.org/wiki/HSV_color_space.\n * Assumes r, g, and b are contained in the set [0, 1] and\n * returns h, s, and v in the set [0, 1].\n *\n * @param Number r The red color value\n * @param Number g The green color value\n * @param Number b The blue color value\n * @return Array The HSV representation\n */\n\nexport function rgb2hsv (r, g, b) {\n if (r.length) { b = r[2], g = r[1], r = r[0]; }\n var max = Math.max(r, g, b), min = Math.min(r, g, b)\n var h, s, v = max\n\n var d = max - min\n s = max == 0 ? 0 : d / max\n\n if (max == min) {\n h = 0 // achromatic\n } else {\n switch (max) {\n case r:\n h = (g - b) / d + (g < b ? 6 : 0)\n break\n case g:\n h = (b - r) / d + 2\n break\n case b:\n h = (r - g) / d + 4\n break\n }\n h /= 6\n }\n\n return [h, s, v]\n}\n\n/**\n * Converts an HSV color value to RGB. Conversion formula\n * adapted from http://en.wikipedia.org/wiki/HSV_color_space.\n * Assumes h, s, and v are contained in the set [0, 1] and\n * returns r, g, and b in the set [0, 1].\n *\n * @param Number h The hue\n * @param Number s The saturation\n * @param Number v The value\n * @return Array The RGB representation\n */\nexport function hsv2rgb (h, s, v) {\n if (h.length) { v = h[2], s = h[1], h = h[0]; }\n var r, g, b\n\n var i = Math.floor(h * 6)\n var f = h * 6 - i\n var p = v * (1 - s)\n var q = v * (1 - f * s)\n var t = v * (1 - (1 - f) * s)\n\n switch (i % 6) {\n case 0:\n r = v, g = t, b = p\n break\n case 1:\n r = q, g = v, b = p\n break\n case 2:\n r = p, g = v, b = t\n break\n case 3:\n r = p, g = q, b = v\n break\n case 4:\n r = t, g = p, b = v\n break\n case 5:\n r = v, g = p, b = q\n break\n }\n\n return [r, g, b]\n}\n\n/**\n * Converts a HTML5 color value (string) to RGB values\n * See the color input type of HTML5 forms\n * Conversion formula:\n * - split the string; \"#RRGGBB\" into RGB components\n * - convert the HEX value into RGB values\n */\nexport function html2rgb (s) {\n var r = 0\n var g = 0\n var b = 0\n if (s.length == 7) {\n r = parseInt('0x' + s.slice(1, 3)) / 255\n g = parseInt('0x' + s.slice(3, 5)) / 255\n b = parseInt('0x' + s.slice(5, 7)) / 255\n }\n return [r, g, b]\n}\n\n/**\n * Converts RGB color value to HTML5 color value (string)\n * Conversion forumla:\n * - convert R, G, B into HEX strings\n * - return HTML formatted string \"#RRGGBB\"\n */\nexport function rgb2html (r, g, b) {\n if (r.length) { b = r[2], g = r[1], r = r[0]; }\n var s = '#' +\n Number(0x1000000 + r * 255 * 0x10000 + g * 255 * 0x100 + b * 255).toString(16).substring(1)\n return s\n}\n","// -- Math functions (360 deg based vs 2pi)\n\nexport function sin (a) {\n return Math.sin(a / 360 * Math.PI * 2)\n}\nexport function cos (a) {\n return Math.cos(a / 360 * Math.PI * 2)\n}\nexport function asin (a) {\n return Math.asin(a) / (Math.PI * 2) * 360\n}\nexport function acos (a) {\n return Math.acos(a) / (Math.PI * 2) * 360\n}\nexport function tan (a) {\n return Math.tan(a / 360 * Math.PI * 2)\n}\nexport function atan (a) {\n return Math.atan(a) / (Math.PI * 2) * 360\n}\nexport function atan2 (a, b) {\n return Math.atan2(a, b) / (Math.PI * 2) * 360\n}\nexport function ceil (a) {\n return Math.ceil(a)\n}\nexport function floor (a) {\n return Math.floor(a)\n}\nexport function abs (a) {\n return Math.abs(a)\n}\nexport function min (a, b) {\n return a < b ? a : b\n}\nexport function max (a, b) {\n return a > b ? a : b\n}\nexport function rands (min, max, vn, seed) {\n // -- seed is ignored for now, FIX IT (requires reimplementation of random())\n // see http://stackoverflow.com/questions/424292/how-to-create-my-own-javascript-random-number-generator-that-i-can-also-set-the\n var v = new Array(vn)\n for (var i = 0; i < vn; i++) {\n v[i] = Math.random() * (max - min) + min\n }\n}\nexport function log (a) {\n return Math.log(a)\n}\nexport function lookup (ix, v) {\n var r = 0\n for (var i = 0; i < v.length; i++) {\n var a0 = v[i]\n if (a0[0] >= ix) {\n i--\n a0 = v[i]\n var a1 = v[i + 1]\n var m = 0\n if (a0[0] !== a1[0]) {\n m = abs((ix - a0[0]) / (a1[0] - a0[0]))\n }\n // echo(\">>\",i,ix,a0[0],a1[0],\";\",m,a0[1],a1[1])\n if (m > 0) {\n r = a0[1] * (1 - m) + a1[1] * m\n } else {\n r = a0[1]\n }\n return r\n }\n }\n return r\n}\n\nexport function pow (a, b) {\n return Math.pow(a, b)\n}\n\nexport function sign (a) {\n return a < 0 ? -1 : (a > 1 ? 1 : 0)\n}\n\nexport function sqrt (a) {\n return Math.sqrt(a)\n}\n\nexport function round (a) {\n return floor(a + 0.5)\n}\n","\nexport function vector_char(x,y,c) {\n c = c.charCodeAt(0);\n c -= 32;\n if(c<0||c>=95) return { width: 0, segments: [] };\n\n var off = c*112;\n var n = simplexFont[off++];\n var w = simplexFont[off++];\n var l = [];\n var segs = [];\n\n for(var i=0; i\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n * Redistributions of source code must retain the above copyright\n notice, this list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above copyright\n notice, this list of conditions and the following disclaimer in the\n documentation and/or other materials provided with the distribution.\n * Neither the name of sprintf() for JavaScript nor the\n names of its contributors may be used to endorse or promote products\n derived from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\nANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL Alexandru Marasteanu BE LIABLE FOR ANY\nDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\nON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\nChangelog:\n2010.09.06 - 0.7-beta1\n - features: vsprintf, support for named placeholders\n - enhancements: format cache, reduced global namespace pollution\n\n2010.05.22 - 0.6:\n - reverted to 0.4 and fixed the bug regarding the sign of the number 0\n Note:\n Thanks to Raphael Pigulla (http://www.n3rd.org/)\n who warned me about a bug in 0.5, I discovered that the last update was\n a regress. I appologize for that.\n\n2010.05.09 - 0.5:\n - bug fix: 0 is now preceeded with a + sign\n - bug fix: the sign was not at the right position on padded results (Kamal Abdali)\n - switched from GPL to BSD license\n\n2007.10.21 - 0.4:\n - unit test and patch (David Baird)\n\n2007.09.17 - 0.3:\n - bug fix: no longer throws exception on empty paramenters (Hans Pufal)\n\n2007.09.11 - 0.2:\n - feature: added argument swapping\n\n2007.04.03 - 0.1:\n - initial release\n**/\n\nlet sprintf = (function () {\n function get_type (variable) {\n return Object.prototype.toString.call(variable).slice(8, -1).toLowerCase()\n }\n function str_repeat (input, multiplier) {\n for (var output = []; multiplier > 0; output[--multiplier] = input) { /* do nothing */}\n return output.join('')\n }\n\n var str_format = function () {\n if (!str_format.cache.hasOwnProperty(arguments[0])) {\n str_format.cache[arguments[0]] = str_format.parse(arguments[0])\n }\n return str_format.format.call(null, str_format.cache[arguments[0]], arguments)\n }\n\n str_format.format = function (parse_tree, argv) {\n var cursor = 1, tree_length = parse_tree.length, node_type = '', arg, output = [], i, k, match, pad, pad_character, pad_length\n for (i = 0; i < tree_length; i++) {\n node_type = get_type(parse_tree[i])\n if (node_type === 'string') {\n output.push(parse_tree[i])\n }\n else if (node_type === 'array') {\n match = parse_tree[i] // convenience purposes only\n if (match[2]) { // keyword argument\n arg = argv[cursor]\n for (k = 0; k < match[2].length; k++) {\n if (!arg.hasOwnProperty(match[2][k])) {\n throw(sprintf('[sprintf] property \"%s\" does not exist', match[2][k]))\n }\n arg = arg[match[2][k]]\n }\n }\n else if (match[1]) { // positional argument (explicit)\n arg = argv[match[1]]\n } else { // positional argument (implicit)\n arg = argv[cursor++]\n }\n\n if (/[^s]/.test(match[8]) && (get_type(arg) != 'number')) {\n throw(sprintf('[sprintf] expecting number but found %s', get_type(arg)))\n }\n switch (match[8]) {\n case 'b':\n arg = arg.toString(2)\n break\n case 'c':\n arg = String.fromCharCode(arg)\n break\n case 'd':\n arg = parseInt(arg, 10)\n break\n case 'e':\n arg = match[7] ? arg.toExponential(match[7]) : arg.toExponential()\n break\n case 'f':\n arg = match[7] ? parseFloat(arg).toFixed(match[7]) : parseFloat(arg)\n break\n case 'o':\n arg = arg.toString(8)\n break\n case 's':\n arg = ((arg = String(arg)) && match[7] ? arg.substring(0, match[7]) : arg)\n break\n case 'u':\n arg = Math.abs(arg)\n break\n case 'x':\n arg = arg.toString(16)\n break\n case 'X':\n arg = arg.toString(16).toUpperCase()\n break\n }\n arg = (/[def]/.test(match[8]) && match[3] && arg >= 0 ? '+' + arg : arg)\n pad_character = match[4] ? match[4] == '0' ? '0' : match[4].charAt(1) : ' '\n pad_length = match[6] - String(arg).length\n pad = match[6] ? str_repeat(pad_character, pad_length) : ''\n output.push(match[5] ? arg + pad : pad + arg)\n }\n }\n return output.join('')\n }\n\n str_format.cache = {}\n\n str_format.parse = function (fmt) {\n var _fmt = fmt, match = [], parse_tree = [], arg_names = 0\n while (_fmt) {\n if ((match = /^[^\\x25]+/.exec(_fmt)) !== null) {\n parse_tree.push(match[0])\n }\n else if ((match = /^\\x25{2}/.exec(_fmt)) !== null) {\n parse_tree.push('%')\n }\n else if ((match = /^\\x25(?:([1-9]\\d*)\\$|\\(([^\\)]+)\\))?(\\+)?(0|'[^$])?(-)?(\\d+)?(?:\\.(\\d+))?([b-fosuxX])/.exec(_fmt)) !== null) {\n if (match[2]) {\n arg_names |= 1\n var field_list = [], replacement_field = match[2], field_match = []\n if ((field_match = /^([a-z_][a-z_\\d]*)/i.exec(replacement_field)) !== null) {\n field_list.push(field_match[1])\n while ((replacement_field = replacement_field.substring(field_match[0].length)) !== '') {\n if ((field_match = /^\\.([a-z_][a-z_\\d]*)/i.exec(replacement_field)) !== null) {\n field_list.push(field_match[1])\n }\n else if ((field_match = /^\\[(\\d+)\\]/.exec(replacement_field)) !== null) {\n field_list.push(field_match[1])\n } else {\n throw('[sprintf] huh?')\n }\n }\n } else {\n throw('[sprintf] huh?')\n }\n match[2] = field_list\n } else {\n arg_names |= 2\n }\n if (arg_names === 3) {\n throw('[sprintf] mixing positional and named placeholders is not (yet) supported')\n }\n parse_tree.push(match)\n } else {\n throw('[sprintf] huh?')\n }\n _fmt = _fmt.substring(match[0].length)\n }\n return parse_tree\n }\n\n return str_format\n})()\n\nfunction vsprintf (fmt, argv) {\n argv.unshift(fmt)\n return sprintf.apply(null, argv)\n}\n","export function log (txt) {\n var timeInMs = Date.now()\n var prevtime = undefined//OpenJsCad.log.prevLogTime\n if (!prevtime) prevtime = timeInMs\n var deltatime = timeInMs - prevtime\n log.prevLogTime = timeInMs\n var timefmt = (deltatime * 0.001).toFixed(3)\n txt = '[' + timefmt + '] ' + txt\n if ((typeof (console) == 'object') && (typeof (console.log) == 'function')) {\n console.log(txt)\n } else if ((typeof (self) == 'object') && (typeof (self.postMessage) == 'function')) {\n self.postMessage({cmd: 'log', txt: txt})\n }\n else throw new Error('Cannot log')\n}\n\n// See Processor.setStatus()\n// Note: leave for compatibility\nexport function status (s) {\n log(s)\n}\n","import * as primitives3d from './primitives3d'\nimport * as primitives2d from './primitives2d'\nimport * as booleanOps from './ops-booleans'\nimport * as transformations from './ops-transformations'\nimport * as extrusions from './ops-extrusions'\nimport * as color from './color'\nimport * as maths from './maths'\nimport * as text from './text'\nimport { echo } from './debug'\n\n// these are 'external' to this folder ...needs to be reviewed\nimport { CAG, CSG } from '../csg'\nimport { log } from '../jscad/log'\n\nconst exportedApi = {\n csg: {CAG, CSG},\n primitives2d,\n primitives3d,\n booleanOps,\n transformations,\n extrusions,\n color,\n maths,\n text,\n OpenJsCad: {OpenJsCad: {log}},\n debug: {echo}\n}\n\nexport default exportedApi\n","import createJscadFunction from './jscad-function'\nimport includeJscadSync from './includeJscadSync'\nimport WebWorkify from 'webWorkify'\nimport { CAG, CSG } from '../csg'\nimport { toArray } from '../utils/misc'\nimport oscad from '../modeling/index'\n\n/**\n * helper function that finds include() statements in files,\n * fetches their code & returns it (recursively) returning the whole code with\n * inlined includes\n * this is more reliable than async xhr + eval()\n * @param {String} text the original script (with include statements)\n * @param {String} relpath relative path, for xhr resolution\n * @returns {String} the full script, with inlined\n */\nfunction replaceIncludes (text, relpath) {\n return new Promise(function (resolve, reject) {\n let scriptWithIncludes = text\n const includesPattern = /(?:include)\\s?\\(\"([\\w\\/.\\s]*)\"\\);?/gm\n\n let foundIncludes = []\n let foundIncludesFull = []\n let match\n while(match = includesPattern.exec(text)) {\n foundIncludes.push(match[1])\n foundIncludesFull.push(match[0])\n }\n\n let tmpPromises = foundIncludes.map(function (uri, index) {\n const promise = includeJscadSync(relpath, uri)\n return promise.then(function (includedScript) {\n return replaceIncludes(includedScript, relpath).then(function (substring) {\n let currentItem = foundIncludesFull[index]\n scriptWithIncludes = scriptWithIncludes.replace(currentItem, substring)\n return scriptWithIncludes\n })\n })\n })\n Promise.all(tmpPromises).then(x => resolve(scriptWithIncludes))\n })\n}\n\n/**\n * evaluate script & rebuild solids, in main thread\n * @param {String} script the script\n * @param {String} fullurl full url of current script\n * @param {Object} parameters the parameters to use with the script\n * @param {Object} callback the callback to call once evaluation is done /failed\n * @param {Object} options the settings to use when rebuilding the solid\n */\nexport function rebuildSolidSync (script, fullurl, parameters, callback, options) {\n let relpath = fullurl\n if (relpath.lastIndexOf('/') >= 0) {\n relpath = relpath.substring(0, relpath.lastIndexOf('/') + 1)\n }\n const defaults = {\n implicitGlobals: true\n }\n options = Object.assign({}, defaults, options)\n\n replaceIncludes(script, relpath).then(function (fullScript) {\n const globals = options.implicitGlobals ? (options.globals ? options.globals : {oscad}) : {}\n const func = createJscadFunction(fullScript, globals)\n // stand-in for the include function(no-op)\n const include = (x) => x\n try {\n let objects = func(parameters, include, globals)\n objects = toArray(objects)\n if (objects.length === 0) {\n throw new Error('The JSCAD script must return one or more CSG or CAG solids.')\n }\n callback(undefined, objects)\n } catch(error) {\n callback(error, undefined)\n }\n }).catch(error => callback(error, undefined))\n\n // have we been asked to stop our work?\n return {\n cancel: () => {\n console.log('cannot stop work in main thread, sorry')\n }\n }\n}\n\n/**\n * evaluate script & rebuild solids, in seperate thread/webworker\n * @param {String} script the script\n * @param {String} fullurl full url of current script\n * @param {Object} parameters the parameters to use with the script\n * @param {Object} callback the callback to call once evaluation is done /failed\n * @param {Object} options the settings to use when rebuilding the solid\n */\nexport function rebuildSolidAsync (script, fullurl, parameters, callback, options) {\n if (!parameters) { throw new Error(\"JSCAD: missing 'parameters'\") }\n if (!window.Worker) throw new Error('Worker threads are unsupported.')\n const defaults = {\n implicitGlobals: true\n }\n options = Object.assign({}, defaults, options)\n\n let relpath = fullurl\n if (relpath.lastIndexOf('/') >= 0) {\n relpath = relpath.substring(0, relpath.lastIndexOf('/') + 1)\n }\n\n let worker\n replaceIncludes(script, relpath).then(function (script) {\n worker = WebWorkify(require('./jscad-worker.js'))\n worker.onmessage = function (e) {\n if (e.data instanceof Object) {\n const data = e.data.objects.map(function (object) {\n if (object['class'] === 'CSG') { return CSG.fromCompactBinary(object) }\n if (object['class'] === 'CAG') { return CAG.fromCompactBinary(object) }\n })\n callback(undefined, data)\n }\n }\n worker.onerror = function (e) {\n callback(`Error in line ${e.lineno} : ${e.message}`, undefined)\n }\n worker.postMessage({cmd: 'render', fullurl, script, parameters, options})\n }).catch(error => callback(error, undefined))\n\n // have we been asked to stop our work?\n return {\n cancel: () => {\n worker.terminate()\n }\n }\n}\n","export default function getParameterDefinitionsCLI (getParameterDefinitions, param) { // used for openjscad CLI only\n if (typeof getParameterDefinitions !== 'undefined') {\n var p = {}\n var pa = getParameterDefinitions()\n for (var a in pa) { // defaults, given by getParameterDefinitions()\n var x = pa[a]\n if ('default' in x) {\n p[pa[a].name] = pa[a].default\n } else if ('initial' in x) {\n p[pa[a].name] = pa[a].initial\n } else if ('checked' in x) {\n p[pa[a].name] = pa[a].checked\n }\n }\n for (var a in param) { // given by command-line\n p[a] = param[a]\n }\n if (0) {\n for (var a in p) {\n echo('param=', a, p[a])\n }\n }\n return p\n } else\n return param\n}\n","export const formats = {\n stl: { displayName: 'STL (ASCII)', description: 'STereoLithography, ASCII', extension: 'stl', mimetype: 'application/sla', convertCSG: true, convertCAG: false },\n stla: { displayName: 'STL (ASCII)', description: 'STereoLithography, ASCII', extension: 'stl', mimetype: 'application/sla', convertCSG: true, convertCAG: false },\n stlb: { displayName: 'STL (Binary)', description: 'STereoLithography, Binary', extension: 'stl', mimetype: 'application/sla', convertCSG: true, convertCAG: false },\n amf: { displayName: 'AMF (experimental)', description: 'Additive Manufacturing File Format', extension: 'amf', mimetype: 'application/amf+xml', convertCSG: true, convertCAG: false },\n x3d: { displayName: 'X3D', description: 'X3D File Format', extension: 'x3d', mimetype: 'model/x3d+xml', convertCSG: true, convertCAG: false },\n dxf: { displayName: 'DXF', description: 'AutoCAD Drawing Exchange Format', extension: 'dxf', mimetype: 'application/dxf', convertCSG: false, convertCAG: true },\n jscad: { displayName: 'JSCAD', description: 'OpenJSCAD.org Source', extension: 'jscad', mimetype: 'application/javascript', convertCSG: true, convertCAG: true },\n svg: { displayName: 'SVG', description: 'Scalable Vector Graphics Format', extension: 'svg', mimetype: 'image/svg+xml', convertCSG: false, convertCAG: true },\n js: { displayName: 'js', description: 'JavaScript Source' },\n gcode: { displayName: 'gcode', description: 'G Programming Language File Format' },\n json: { displayName: 'json', description: 'JavaScript Object Notation Format' }\n}\n","import convertToBlob from '../io/convertToBlob'\nimport {rebuildSolidSync} from '../jscad/rebuildSolid'\nimport getParameterDefinitionsCLI from './getParameterDefinitionsCLI'\nimport {formats} from '../io/formats'\nimport oscad from '../modeling/index'\n\n/**\n * generate output data from source\n * @param {String} source the original source\n * @param {Object} params hash of parameters to pass to main function\n * @param {String} options\n * @return a Promise with the output data\n */\nexport default function generateOutputData (source, params, options) {\n const defaults = {\n implicitGlobals: true,\n outputFormat: 'stl'\n }\n options = Object.assign({}, defaults, options)\n const {implicitGlobals, outputFormat} = options\n\n let globals = {}\n if (implicitGlobals) {\n globals.oscad = oscad\n }\n globals.extras = {cli: {getParameterDefinitionsCLI}}\n\n // modify main to adapt parameters\n const mainFunction = `var wrappedMain = main\n main = function(){\n var paramsDefinition = (typeof getParameterDefinitions !== 'undefined') ? getParameterDefinitions : undefined\n return wrappedMain(getParameterDefinitionsCLI(paramsDefinition, ${JSON.stringify(params)}))\n }`\n source = `${source}\n ${mainFunction}\n `\n\n // objects = rebuildSolidSync(source, '', params, globals, callback)\n return new Promise(function (resolve, reject) {\n const callback = (err, result) => {\n if (!err) {\n return resolve(result)\n }\n return reject(err)\n }\n\n if (outputFormat === 'jscad' || outputFormat === 'js') {\n resolve(source)\n } else {\n rebuildSolidSync(source, '', params, callback, {implicitGlobals, globals})\n }\n })\n .then(function (objects) {\n const formatInfo = {\n convertCAG: true, convertCSG: true, mimetype: formats[outputFormat].mimetype\n }\n return convertToBlob(objects, {format: outputFormat, formatInfo})\n })\n\n// return convertToBlob(objects, {format: outputFormat, formatInfo: {convertCAG: true, convertCSG: true}})\n}\n","// shebang gets auto added here\n//--log_all\n\n// NOTE: this will only run on Node > 6 or needs to be transpiled, or launched via launch-cli\n\n// == OpenJSCAD.org CLI interface, written by Rene K. Mueller , Licensed under MIT License\n//\n// Description:\n// openjscad [-of ] [-o ]\n// e.g.\n// openjscad test.jscad\n// openjscad test.jscad -o test.stl\n// openjscad test.jscad -o test.amf\n// openjscad test.jscad -o test.dxf\n// openjscad test.scad -o testFromSCAD.jscad\n// openjscad test.scad -o test.stl\n// openjscad test.stl -o test2.stl # reprocessed: stl -> jscad -> stl\n// openjscad test.amf -o test2.jscad\n// openjscad test.jscad -of amf\n// openjscad test.jscad -of dxf\n// openjscad test.jscad -of stl\n// openjscad name_plate.jscad --name \"Just Me\" --title \"CEO\" -o amf test.amf\n//\n// History:\n// 2016/10/01: 0.5.2: changes for libraries\n// 2016/06/27: 0.5.1: refactored AMF import and export by Z3 Dev\n// enhanced STL import, adding support for MM colors by Z3 Dev\n// 2016/02/02: 0.4.0: GUI refactored, functionality split up into more files, mostly done by Z3 Dev\n// 2015/07/02: 0.3.0: node 0.10.x support, /usr/bin/nodejs, new files involved: formats.js (Stefan Baumann) and Blob.js (Z3 Dev)\n// 2014/12/09: 0.019: support of DXF output for 2D objects (laser cutter)\n// 2013/04/25: 0.010: support of params passed to main()\n// 2013/04/12: 0.008: reimplement parseAMF without jquery\n// 2013/04/11: 0.007: support of alpha for AMF addded, bumping version\n// 2013/04/05: 0.006: support of AMF added, requires node 0.8.1+\n// 2013/03/25: 0.005: more sanity check on input and local installation support\n// 2013/03/18: 0.004: STL .stl (binary & ascii) support (experimental via openscad.js)\n// 2013/03/18: 0.003: OpenSCAD .scad support by Gary Hodgson's openscad-openjscad-translator module\n// 2013/03/02: 0.002: proper installation of the dependencies (csg.js & openscad.js) so openjscad can be used properly\n// 2013/03/01: 0.001: initial version, with base function from openscad.jscad\n//\nimport fs from 'fs'\n\nimport {version} from './jscad/version'\nimport env from './jscad/env'\n\nimport generateOutputData from './utils/generateOutputData'\nimport { formats } from './io/formats'\n\n// var csg = sphere(1); // -- basic test\n// var csg = require(file).main; // -- treating .jscad as module? later perhaps\n\nconst args = process.argv.splice(2)\n\n// -- main code\n\n// handle arguments\n// inputs, outputs\nlet {inputFile, inputFormat, outputFile, outputFormat, params} = parseArgs(args)\n\n// outputs\nconst output = determineOutputNameAndFormat(outputFormat, outputFile)\noutputFormat = output.outputFormat\noutputFile = output.outputFile\n\nconsole.log(`converting ${inputFile} -> ${outputFile} (${formats[outputFormat].description})`)\n\nlet src = fs.readFileSync(inputFile, inputFile.match(/\\.stl$/i) ? 'binary' : 'UTF8')\n// -- include input, and convert into JSCAD source\n// src = inputFormatHandlers[inputFormat](src, inputFile, outputFile)\n\nif(inputFormat === 'scad')\n{\n var scadParser = require('openscad-openjscad-translator') // hardcoded is bad, but works\n src = scadParser.parse(src) // doing the magick\n src = '// producer: OpenJSCAD ' + version + '\\n' + src\n src = '// source: ' + outputFile + '\\n\\n' + src\n}\n\n// -- convert from JSCAD script into the desired output format\n// const outputData = generateOutputData(src, params, {outputFormat})\n// -- and write it to disk\n// writeOutputDataToFile(outputFile, outputData)\ngenerateOutputData(src, params, {outputFormat})\n .then(function (outputData) {\n writeOutputDataToFile(outputFile, outputData)\n }).catch(error=>console.error(error))\n\n// -- helper functions ---------------------------------------------------------------------------------------\nfunction parseArgs (args) {\n // hint: https://github.com/substack/node-optimist\n // https://github.com/visionmedia/commander.js\n //\n // process.argv.forEach(function (val, index, array) {\n // console.log(index + ': ' + val)\n // })\n if (args.length < 1) {\n console.log('USAGE:\\n\\nopenjscad [-v] [-of ] [-o ]')\n console.log('\\t :\\tinput file (Supported types: .jscad, .js, .scad, .stl, .amf, .obj, .gcode, .svg, .json)')\n console.log('\\t:\\toutput file (Supported types: .jscad, .stl, .amf, .dxf, .svg, .json)')\n console.log(\"\\t:\\t'jscad', 'stla' (STL ASCII, default), 'stlb' (STL Binary), 'amf', 'dxf', 'svg', 'json'\")\n process.exit(1)\n }\n\n let inputFile\n let inputFormat\n let outputFile\n let outputFormat\n let params = {}\n\n for (var i = 0; i < args.length; i++) {\n if (args[i] === '-of') { // -of \n outputFormat = args[++i]\n } else if (args[i].match(/^-o(\\S.+)/)) { // -o\n outputFile = args[i]\n outputFile = outputFile.replace(/^\\-o(\\S+)$/, '$1')\n } else if (args[i] === '-o') { // -o \n outputFile = args[++i]\n } else if (args[i].match(/^--(\\w+)=(.*)/)) { // params for main()\n params[RegExp.$1] = RegExp.$2\n } else if (args[i].match(/^--(\\w+)$/)) { // params for main()\n params[RegExp.$1] = args[++i]\n } else if (args[i].match(/^--(\\w+)$/)) { // params for main()\n params[RegExp.$1] = args[++i]\n } else if (args[i].match(/.+\\.(jscad|js|scad|stl|amf|obj|gcode|svg|json)$/i)) {\n inputFile = args[i]\n inputFormat = RegExp.$1\n if (!fs.statSync(inputFile).isFile()) {\n console.log('ERROR: cannot open file <' + inputFile + '>')\n process.exit(1)\n }\n } else if (args[i].match(/^-v$/)) { // show the version and the environment information\n env()\n console.log('OpenSCAD Compatibility (' + version + ')')\n } else {\n console.log('ERROR: invalid file name or argument <' + args[i] + '>')\n console.log(\"Type 'openjscad' for help\")\n process.exit(1)\n }\n }\n // exit if a input file was not provided\n if (inputFile === null) process.exit(1)\n\n if (!outputFormat && !outputFile) {\n outputFormat = 'stla'\n }\n\n return {\n inputFile,\n inputFormat,\n outputFile,\n outputFormat,\n params}\n}\n\nfunction determineOutputNameAndFormat (outputFormat, outputFile) {\n if (!outputFormat && outputFile && outputFile.length && outputFile.match(/\\.(jscad|js|stl|amf|dxf|svg)$/)) { // output filename set\n outputFormat = RegExp.$1\n } else if (!outputFormat && outputFile && outputFile.length) { // output filename isn't valid\n console.log('ERROR: invalid output file <' + outputFile + '>')\n process.exit(1)\n } else if (outputFormat.match(/(jscad|js|stl|stla|stlb|amf|dxf|svg)/i)) { // output format defined?\n var ext = RegExp.$1\n if (!outputFile) { // unless output filename not set, compose it\n ext = ext.replace(/stl[ab]/, 'stl') // drop [ab] from stl\n outputFile = inputFile\n outputFile = outputFile.replace(/\\.([^\\.]+)$/, '.' + ext) // compose output filename\n }\n } else {\n console.log(`ERROR: invalid output format <${outputFormat}`)\n process.exit(1)\n }\n return {outputFormat, outputFile}\n}\n\nfunction writeOutputDataToFile (outputFile, outputData) {\n fs.writeFile(outputFile, outputData.asBuffer(),\n function (err) {\n if (err) {\n console.log('err', err)\n } else {\n //console.log('success')\n }\n }\n )\n}\n"],"names":["const","this","arguments","Blob","let","XMLSerializer","sax","require$$0","require$$1","xmldom","DOMImplementation","CSG","CAG","i","fs","log","color","index","oscad"],"mappings":"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AC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;GACL,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;GACpE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;IACnE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;GACL,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;GACpE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;GACpE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;GACL,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;IACnE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;IACnE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;GACL,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,EAAE;GACL,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,EAAE;IACJ,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,EAAE;IACJ,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,EAAE;IACJ,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,EAAE;GACL,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE;IACnE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;GACpE,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;IACnE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,EAAE;GACL,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;GACL,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE;IACnE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;GACL,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE;IACnE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,EAAE;GACL,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE;IACnE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;GACpE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;GACL,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;GACpE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;GACpE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,EAAE;GACL,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;GACpE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;GACL,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE;IACnE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;GACpE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;GACpE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;GACpE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;IACpD,CAAC,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;GACpE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;GACL,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;IACnE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE;IACnE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;GACL,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;IACnE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,EAAE,CAAC;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;GACL,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE;IACnE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;GACpE,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE;IACnE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;GACpE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;GACpE,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;GACL,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;IACnE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,EAAE;GACL,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,EAAE;IACJ,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;GACL,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;IACnE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE;IACnE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;GACL,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE;IACnE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;GACL,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;IACnE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;IACJ,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;IACnE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,EAAE;GACL,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;GACL,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;GACpE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,EAAE,CAAC;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,EAAE,CAAC;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE;GACpE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE;IACnE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE;IACnE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;GACL,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;IACnE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;GACL,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE;IACnE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,EAAE;GACL,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;GACpE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;IACnE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;GACpE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,EAAE,CAAC;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;GACpE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;IACnE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;GACpE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;IACJ,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,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"} \ No newline at end of file diff --git a/dist/index.js b/dist/index.js index afcc35c3b..319e0839c 100644 --- a/dist/index.js +++ b/dist/index.js @@ -29448,6 +29448,2140 @@ module.exports = function (fn, options) { }; },{}],35:[function(require,module,exports){ +function DOMParser(options){ + this.options = options ||{locator:{}}; + +} +DOMParser.prototype.parseFromString = function(source,mimeType){ + var options = this.options; + var sax = new XMLReader(); + var domBuilder = options.domBuilder || new DOMHandler();//contentHandler and LexicalHandler + var errorHandler = options.errorHandler; + var locator = options.locator; + var defaultNSMap = options.xmlns||{}; + var entityMap = {'lt':'<','gt':'>','amp':'&','quot':'"','apos':"'"} + if(locator){ + domBuilder.setDocumentLocator(locator) + } + + sax.errorHandler = buildErrorHandler(errorHandler,domBuilder,locator); + sax.domBuilder = options.domBuilder || domBuilder; + if(/\/x?html?$/.test(mimeType)){ + entityMap.nbsp = '\xa0'; + entityMap.copy = '\xa9'; + defaultNSMap['']= 'http://www.w3.org/1999/xhtml'; + } + defaultNSMap.xml = defaultNSMap.xml || 'http://www.w3.org/XML/1998/namespace'; + if(source){ + sax.parse(source,defaultNSMap,entityMap); + }else{ + sax.errorHandler.error("invalid doc source"); + } + return domBuilder.doc; +} +function buildErrorHandler(errorImpl,domBuilder,locator){ + if(!errorImpl){ + if(domBuilder instanceof DOMHandler){ + return domBuilder; + } + errorImpl = domBuilder ; + } + var errorHandler = {} + var isCallback = errorImpl instanceof Function; + locator = locator||{} + function build(key){ + var fn = errorImpl[key]; + if(!fn && isCallback){ + fn = errorImpl.length == 2?function(msg){errorImpl(key,msg)}:errorImpl; + } + errorHandler[key] = fn && function(msg){ + fn('[xmldom '+key+']\t'+msg+_locator(locator)); + }||function(){}; + } + build('warning'); + build('error'); + build('fatalError'); + return errorHandler; +} + +//console.log('#\n\n\n\n\n\n\n####') +/** + * +ContentHandler+ErrorHandler + * +LexicalHandler+EntityResolver2 + * -DeclHandler-DTDHandler + * + * DefaultHandler:EntityResolver, DTDHandler, ContentHandler, ErrorHandler + * DefaultHandler2:DefaultHandler,LexicalHandler, DeclHandler, EntityResolver2 + * @link http://www.saxproject.org/apidoc/org/xml/sax/helpers/DefaultHandler.html + */ +function DOMHandler() { + this.cdata = false; +} +function position(locator,node){ + node.lineNumber = locator.lineNumber; + node.columnNumber = locator.columnNumber; +} +/** + * @see org.xml.sax.ContentHandler#startDocument + * @link http://www.saxproject.org/apidoc/org/xml/sax/ContentHandler.html + */ +DOMHandler.prototype = { + startDocument : function() { + this.doc = new DOMImplementation().createDocument(null, null, null); + if (this.locator) { + this.doc.documentURI = this.locator.systemId; + } + }, + startElement:function(namespaceURI, localName, qName, attrs) { + var doc = this.doc; + var el = doc.createElementNS(namespaceURI, qName||localName); + var len = attrs.length; + appendElement(this, el); + this.currentElement = el; + + this.locator && position(this.locator,el) + for (var i = 0 ; i < len; i++) { + var namespaceURI = attrs.getURI(i); + var value = attrs.getValue(i); + var qName = attrs.getQName(i); + var attr = doc.createAttributeNS(namespaceURI, qName); + this.locator &&position(attrs.getLocator(i),attr); + attr.value = attr.nodeValue = value; + el.setAttributeNode(attr) + } + }, + endElement:function(namespaceURI, localName, qName) { + var current = this.currentElement + var tagName = current.tagName; + this.currentElement = current.parentNode; + }, + startPrefixMapping:function(prefix, uri) { + }, + endPrefixMapping:function(prefix) { + }, + processingInstruction:function(target, data) { + var ins = this.doc.createProcessingInstruction(target, data); + this.locator && position(this.locator,ins) + appendElement(this, ins); + }, + ignorableWhitespace:function(ch, start, length) { + }, + characters:function(chars, start, length) { + chars = _toString.apply(this,arguments) + //console.log(chars) + if(chars){ + if (this.cdata) { + var charNode = this.doc.createCDATASection(chars); + } else { + var charNode = this.doc.createTextNode(chars); + } + if(this.currentElement){ + this.currentElement.appendChild(charNode); + }else if(/^\s*$/.test(chars)){ + this.doc.appendChild(charNode); + //process xml + } + this.locator && position(this.locator,charNode) + } + }, + skippedEntity:function(name) { + }, + endDocument:function() { + this.doc.normalize(); + }, + setDocumentLocator:function (locator) { + if(this.locator = locator){// && !('lineNumber' in locator)){ + locator.lineNumber = 0; + } + }, + //LexicalHandler + comment:function(chars, start, length) { + chars = _toString.apply(this,arguments) + var comm = this.doc.createComment(chars); + this.locator && position(this.locator,comm) + appendElement(this, comm); + }, + + startCDATA:function() { + //used in characters() methods + this.cdata = true; + }, + endCDATA:function() { + this.cdata = false; + }, + + startDTD:function(name, publicId, systemId) { + var impl = this.doc.implementation; + if (impl && impl.createDocumentType) { + var dt = impl.createDocumentType(name, publicId, systemId); + this.locator && position(this.locator,dt) + appendElement(this, dt); + } + }, + /** + * @see org.xml.sax.ErrorHandler + * @link http://www.saxproject.org/apidoc/org/xml/sax/ErrorHandler.html + */ + warning:function(error) { + console.warn('[xmldom warning]\t'+error,_locator(this.locator)); + }, + error:function(error) { + console.error('[xmldom error]\t'+error,_locator(this.locator)); + }, + fatalError:function(error) { + console.error('[xmldom fatalError]\t'+error,_locator(this.locator)); + throw error; + } +} +function _locator(l){ + if(l){ + return '\n@'+(l.systemId ||'')+'#[line:'+l.lineNumber+',col:'+l.columnNumber+']' + } +} +function _toString(chars,start,length){ + if(typeof chars == 'string'){ + return chars.substr(start,length) + }else{//java sax connect width xmldom on rhino(what about: "? && !(chars instanceof String)") + if(chars.length >= start+length || start){ + return new java.lang.String(chars,start,length)+''; + } + return chars; + } +} + +/* + * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/LexicalHandler.html + * used method of org.xml.sax.ext.LexicalHandler: + * #comment(chars, start, length) + * #startCDATA() + * #endCDATA() + * #startDTD(name, publicId, systemId) + * + * + * IGNORED method of org.xml.sax.ext.LexicalHandler: + * #endDTD() + * #startEntity(name) + * #endEntity(name) + * + * + * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/DeclHandler.html + * IGNORED method of org.xml.sax.ext.DeclHandler + * #attributeDecl(eName, aName, type, mode, value) + * #elementDecl(name, model) + * #externalEntityDecl(name, publicId, systemId) + * #internalEntityDecl(name, value) + * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/EntityResolver2.html + * IGNORED method of org.xml.sax.EntityResolver2 + * #resolveEntity(String name,String publicId,String baseURI,String systemId) + * #resolveEntity(publicId, systemId) + * #getExternalSubset(name, baseURI) + * @link http://www.saxproject.org/apidoc/org/xml/sax/DTDHandler.html + * IGNORED method of org.xml.sax.DTDHandler + * #notationDecl(name, publicId, systemId) {}; + * #unparsedEntityDecl(name, publicId, systemId, notationName) {}; + */ +"endDTD,startEntity,endEntity,attributeDecl,elementDecl,externalEntityDecl,internalEntityDecl,resolveEntity,getExternalSubset,notationDecl,unparsedEntityDecl".replace(/\w+/g,function(key){ + DOMHandler.prototype[key] = function(){return null} +}) + +/* Private static helpers treated below as private instance methods, so don't need to add these to the public API; we might use a Relator to also get rid of non-standard public properties */ +function appendElement (hander,node) { + if (!hander.currentElement) { + hander.doc.appendChild(node); + } else { + hander.currentElement.appendChild(node); + } +}//appendChild and setAttributeNS are preformance key + +//if(typeof require == 'function'){ + var XMLReader = require('./sax').XMLReader; + var DOMImplementation = exports.DOMImplementation = require('./dom').DOMImplementation; + exports.XMLSerializer = require('./dom').XMLSerializer ; + exports.DOMParser = DOMParser; +//} + +},{"./dom":36,"./sax":37}],36:[function(require,module,exports){ +/* + * DOM Level 2 + * Object DOMException + * @see http://www.w3.org/TR/REC-DOM-Level-1/ecma-script-language-binding.html + * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/ecma-script-binding.html + */ + +function copy(src,dest){ + for(var p in src){ + dest[p] = src[p]; + } +} +/** +^\w+\.prototype\.([_\w]+)\s*=\s*((?:.*\{\s*?[\r\n][\s\S]*?^})|\S.*?(?=[;\r\n]));? +^\w+\.prototype\.([_\w]+)\s*=\s*(\S.*?(?=[;\r\n]));? + */ +function _extends(Class,Super){ + var pt = Class.prototype; + if(Object.create){ + var ppt = Object.create(Super.prototype) + pt.__proto__ = ppt; + } + if(!(pt instanceof Super)){ + function t(){}; + t.prototype = Super.prototype; + t = new t(); + copy(pt,t); + Class.prototype = pt = t; + } + if(pt.constructor != Class){ + if(typeof Class != 'function'){ + console.error("unknow Class:"+Class) + } + pt.constructor = Class + } +} +var htmlns = 'http://www.w3.org/1999/xhtml' ; +// Node Types +var NodeType = {} +var ELEMENT_NODE = NodeType.ELEMENT_NODE = 1; +var ATTRIBUTE_NODE = NodeType.ATTRIBUTE_NODE = 2; +var TEXT_NODE = NodeType.TEXT_NODE = 3; +var CDATA_SECTION_NODE = NodeType.CDATA_SECTION_NODE = 4; +var ENTITY_REFERENCE_NODE = NodeType.ENTITY_REFERENCE_NODE = 5; +var ENTITY_NODE = NodeType.ENTITY_NODE = 6; +var PROCESSING_INSTRUCTION_NODE = NodeType.PROCESSING_INSTRUCTION_NODE = 7; +var COMMENT_NODE = NodeType.COMMENT_NODE = 8; +var DOCUMENT_NODE = NodeType.DOCUMENT_NODE = 9; +var DOCUMENT_TYPE_NODE = NodeType.DOCUMENT_TYPE_NODE = 10; +var DOCUMENT_FRAGMENT_NODE = NodeType.DOCUMENT_FRAGMENT_NODE = 11; +var NOTATION_NODE = NodeType.NOTATION_NODE = 12; + +// ExceptionCode +var ExceptionCode = {} +var ExceptionMessage = {}; +var INDEX_SIZE_ERR = ExceptionCode.INDEX_SIZE_ERR = ((ExceptionMessage[1]="Index size error"),1); +var DOMSTRING_SIZE_ERR = ExceptionCode.DOMSTRING_SIZE_ERR = ((ExceptionMessage[2]="DOMString size error"),2); +var HIERARCHY_REQUEST_ERR = ExceptionCode.HIERARCHY_REQUEST_ERR = ((ExceptionMessage[3]="Hierarchy request error"),3); +var WRONG_DOCUMENT_ERR = ExceptionCode.WRONG_DOCUMENT_ERR = ((ExceptionMessage[4]="Wrong document"),4); +var INVALID_CHARACTER_ERR = ExceptionCode.INVALID_CHARACTER_ERR = ((ExceptionMessage[5]="Invalid character"),5); +var NO_DATA_ALLOWED_ERR = ExceptionCode.NO_DATA_ALLOWED_ERR = ((ExceptionMessage[6]="No data allowed"),6); +var NO_MODIFICATION_ALLOWED_ERR = ExceptionCode.NO_MODIFICATION_ALLOWED_ERR = ((ExceptionMessage[7]="No modification allowed"),7); +var NOT_FOUND_ERR = ExceptionCode.NOT_FOUND_ERR = ((ExceptionMessage[8]="Not found"),8); +var NOT_SUPPORTED_ERR = ExceptionCode.NOT_SUPPORTED_ERR = ((ExceptionMessage[9]="Not supported"),9); +var INUSE_ATTRIBUTE_ERR = ExceptionCode.INUSE_ATTRIBUTE_ERR = ((ExceptionMessage[10]="Attribute in use"),10); +//level2 +var INVALID_STATE_ERR = ExceptionCode.INVALID_STATE_ERR = ((ExceptionMessage[11]="Invalid state"),11); +var SYNTAX_ERR = ExceptionCode.SYNTAX_ERR = ((ExceptionMessage[12]="Syntax error"),12); +var INVALID_MODIFICATION_ERR = ExceptionCode.INVALID_MODIFICATION_ERR = ((ExceptionMessage[13]="Invalid modification"),13); +var NAMESPACE_ERR = ExceptionCode.NAMESPACE_ERR = ((ExceptionMessage[14]="Invalid namespace"),14); +var INVALID_ACCESS_ERR = ExceptionCode.INVALID_ACCESS_ERR = ((ExceptionMessage[15]="Invalid access"),15); + + +function DOMException(code, message) { + if(message instanceof Error){ + var error = message; + }else{ + error = this; + Error.call(this, ExceptionMessage[code]); + this.message = ExceptionMessage[code]; + if(Error.captureStackTrace) Error.captureStackTrace(this, DOMException); + } + error.code = code; + if(message) this.message = this.message + ": " + message; + return error; +}; +DOMException.prototype = Error.prototype; +copy(ExceptionCode,DOMException) +/** + * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-536297177 + * The NodeList interface provides the abstraction of an ordered collection of nodes, without defining or constraining how this collection is implemented. NodeList objects in the DOM are live. + * The items in the NodeList are accessible via an integral index, starting from 0. + */ +function NodeList() { +}; +NodeList.prototype = { + /** + * The number of nodes in the list. The range of valid child node indices is 0 to length-1 inclusive. + * @standard level1 + */ + length:0, + /** + * Returns the indexth item in the collection. If index is greater than or equal to the number of nodes in the list, this returns null. + * @standard level1 + * @param index unsigned long + * Index into the collection. + * @return Node + * The node at the indexth position in the NodeList, or null if that is not a valid index. + */ + item: function(index) { + return this[index] || null; + }, + toString:function(isHTML,nodeFilter){ + for(var buf = [], i = 0;i=0){ + var lastIndex = list.length-1 + while(i0 || key == 'xmlns'){ +// return null; +// } + //console.log() + var i = this.length; + while(i--){ + var attr = this[i]; + //console.log(attr.nodeName,key) + if(attr.nodeName == key){ + return attr; + } + } + }, + setNamedItem: function(attr) { + var el = attr.ownerElement; + if(el && el!=this._ownerElement){ + throw new DOMException(INUSE_ATTRIBUTE_ERR); + } + var oldAttr = this.getNamedItem(attr.nodeName); + _addNamedNode(this._ownerElement,this,attr,oldAttr); + return oldAttr; + }, + /* returns Node */ + setNamedItemNS: function(attr) {// raises: WRONG_DOCUMENT_ERR,NO_MODIFICATION_ALLOWED_ERR,INUSE_ATTRIBUTE_ERR + var el = attr.ownerElement, oldAttr; + if(el && el!=this._ownerElement){ + throw new DOMException(INUSE_ATTRIBUTE_ERR); + } + oldAttr = this.getNamedItemNS(attr.namespaceURI,attr.localName); + _addNamedNode(this._ownerElement,this,attr,oldAttr); + return oldAttr; + }, + + /* returns Node */ + removeNamedItem: function(key) { + var attr = this.getNamedItem(key); + _removeNamedNode(this._ownerElement,this,attr); + return attr; + + + },// raises: NOT_FOUND_ERR,NO_MODIFICATION_ALLOWED_ERR + + //for level2 + removeNamedItemNS:function(namespaceURI,localName){ + var attr = this.getNamedItemNS(namespaceURI,localName); + _removeNamedNode(this._ownerElement,this,attr); + return attr; + }, + getNamedItemNS: function(namespaceURI, localName) { + var i = this.length; + while(i--){ + var node = this[i]; + if(node.localName == localName && node.namespaceURI == namespaceURI){ + return node; + } + } + return null; + } +}; +/** + * @see http://www.w3.org/TR/REC-DOM-Level-1/level-one-core.html#ID-102161490 + */ +function DOMImplementation(/* Object */ features) { + this._features = {}; + if (features) { + for (var feature in features) { + this._features = features[feature]; + } + } +}; + +DOMImplementation.prototype = { + hasFeature: function(/* string */ feature, /* string */ version) { + var versions = this._features[feature.toLowerCase()]; + if (versions && (!version || version in versions)) { + return true; + } else { + return false; + } + }, + // Introduced in DOM Level 2: + createDocument:function(namespaceURI, qualifiedName, doctype){// raises:INVALID_CHARACTER_ERR,NAMESPACE_ERR,WRONG_DOCUMENT_ERR + var doc = new Document(); + doc.implementation = this; + doc.childNodes = new NodeList(); + doc.doctype = doctype; + if(doctype){ + doc.appendChild(doctype); + } + if(qualifiedName){ + var root = doc.createElementNS(namespaceURI,qualifiedName); + doc.appendChild(root); + } + return doc; + }, + // Introduced in DOM Level 2: + createDocumentType:function(qualifiedName, publicId, systemId){// raises:INVALID_CHARACTER_ERR,NAMESPACE_ERR + var node = new DocumentType(); + node.name = qualifiedName; + node.nodeName = qualifiedName; + node.publicId = publicId; + node.systemId = systemId; + // Introduced in DOM Level 2: + //readonly attribute DOMString internalSubset; + + //TODO:.. + // readonly attribute NamedNodeMap entities; + // readonly attribute NamedNodeMap notations; + return node; + } +}; + + +/** + * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-1950641247 + */ + +function Node() { +}; + +Node.prototype = { + firstChild : null, + lastChild : null, + previousSibling : null, + nextSibling : null, + attributes : null, + parentNode : null, + childNodes : null, + ownerDocument : null, + nodeValue : null, + namespaceURI : null, + prefix : null, + localName : null, + // Modified in DOM Level 2: + insertBefore:function(newChild, refChild){//raises + return _insertBefore(this,newChild,refChild); + }, + replaceChild:function(newChild, oldChild){//raises + this.insertBefore(newChild,oldChild); + if(oldChild){ + this.removeChild(oldChild); + } + }, + removeChild:function(oldChild){ + return _removeChild(this,oldChild); + }, + appendChild:function(newChild){ + return this.insertBefore(newChild,null); + }, + hasChildNodes:function(){ + return this.firstChild != null; + }, + cloneNode:function(deep){ + return cloneNode(this.ownerDocument||this,this,deep); + }, + // Modified in DOM Level 2: + normalize:function(){ + var child = this.firstChild; + while(child){ + var next = child.nextSibling; + if(next && next.nodeType == TEXT_NODE && child.nodeType == TEXT_NODE){ + this.removeChild(next); + child.appendData(next.data); + }else{ + child.normalize(); + child = next; + } + } + }, + // Introduced in DOM Level 2: + isSupported:function(feature, version){ + return this.ownerDocument.implementation.hasFeature(feature,version); + }, + // Introduced in DOM Level 2: + hasAttributes:function(){ + return this.attributes.length>0; + }, + lookupPrefix:function(namespaceURI){ + var el = this; + while(el){ + var map = el._nsMap; + //console.dir(map) + if(map){ + for(var n in map){ + if(map[n] == namespaceURI){ + return n; + } + } + } + el = el.nodeType == ATTRIBUTE_NODE?el.ownerDocument : el.parentNode; + } + return null; + }, + // Introduced in DOM Level 3: + lookupNamespaceURI:function(prefix){ + var el = this; + while(el){ + var map = el._nsMap; + //console.dir(map) + if(map){ + if(prefix in map){ + return map[prefix] ; + } + } + el = el.nodeType == ATTRIBUTE_NODE?el.ownerDocument : el.parentNode; + } + return null; + }, + // Introduced in DOM Level 3: + isDefaultNamespace:function(namespaceURI){ + var prefix = this.lookupPrefix(namespaceURI); + return prefix == null; + } +}; + + +function _xmlEncoder(c){ + return c == '<' && '<' || + c == '>' && '>' || + c == '&' && '&' || + c == '"' && '"' || + '&#'+c.charCodeAt()+';' +} + + +copy(NodeType,Node); +copy(NodeType,Node.prototype); + +/** + * @param callback return true for continue,false for break + * @return boolean true: break visit; + */ +function _visitNode(node,callback){ + if(callback(node)){ + return true; + } + if(node = node.firstChild){ + do{ + if(_visitNode(node,callback)){return true} + }while(node=node.nextSibling) + } +} + + + +function Document(){ +} +function _onAddAttribute(doc,el,newAttr){ + doc && doc._inc++; + var ns = newAttr.namespaceURI ; + if(ns == 'http://www.w3.org/2000/xmlns/'){ + //update namespace + el._nsMap[newAttr.prefix?newAttr.localName:''] = newAttr.value + } +} +function _onRemoveAttribute(doc,el,newAttr,remove){ + doc && doc._inc++; + var ns = newAttr.namespaceURI ; + if(ns == 'http://www.w3.org/2000/xmlns/'){ + //update namespace + delete el._nsMap[newAttr.prefix?newAttr.localName:''] + } +} +function _onUpdateChild(doc,el,newChild){ + if(doc && doc._inc){ + doc._inc++; + //update childNodes + var cs = el.childNodes; + if(newChild){ + cs[cs.length++] = newChild; + }else{ + //console.log(1) + var child = el.firstChild; + var i = 0; + while(child){ + cs[i++] = child; + child =child.nextSibling; + } + cs.length = i; + } + } +} + +/** + * attributes; + * children; + * + * writeable properties: + * nodeValue,Attr:value,CharacterData:data + * prefix + */ +function _removeChild(parentNode,child){ + var previous = child.previousSibling; + var next = child.nextSibling; + if(previous){ + previous.nextSibling = next; + }else{ + parentNode.firstChild = next + } + if(next){ + next.previousSibling = previous; + }else{ + parentNode.lastChild = previous; + } + _onUpdateChild(parentNode.ownerDocument,parentNode); + return child; +} +/** + * preformance key(refChild == null) + */ +function _insertBefore(parentNode,newChild,nextChild){ + var cp = newChild.parentNode; + if(cp){ + cp.removeChild(newChild);//remove and update + } + if(newChild.nodeType === DOCUMENT_FRAGMENT_NODE){ + var newFirst = newChild.firstChild; + if (newFirst == null) { + return newChild; + } + var newLast = newChild.lastChild; + }else{ + newFirst = newLast = newChild; + } + var pre = nextChild ? nextChild.previousSibling : parentNode.lastChild; + + newFirst.previousSibling = pre; + newLast.nextSibling = nextChild; + + + if(pre){ + pre.nextSibling = newFirst; + }else{ + parentNode.firstChild = newFirst; + } + if(nextChild == null){ + parentNode.lastChild = newLast; + }else{ + nextChild.previousSibling = newLast; + } + do{ + newFirst.parentNode = parentNode; + }while(newFirst !== newLast && (newFirst= newFirst.nextSibling)) + _onUpdateChild(parentNode.ownerDocument||parentNode,parentNode); + //console.log(parentNode.lastChild.nextSibling == null) + if (newChild.nodeType == DOCUMENT_FRAGMENT_NODE) { + newChild.firstChild = newChild.lastChild = null; + } + return newChild; +} +function _appendSingleChild(parentNode,newChild){ + var cp = newChild.parentNode; + if(cp){ + var pre = parentNode.lastChild; + cp.removeChild(newChild);//remove and update + var pre = parentNode.lastChild; + } + var pre = parentNode.lastChild; + newChild.parentNode = parentNode; + newChild.previousSibling = pre; + newChild.nextSibling = null; + if(pre){ + pre.nextSibling = newChild; + }else{ + parentNode.firstChild = newChild; + } + parentNode.lastChild = newChild; + _onUpdateChild(parentNode.ownerDocument,parentNode,newChild); + return newChild; + //console.log("__aa",parentNode.lastChild.nextSibling == null) +} +Document.prototype = { + //implementation : null, + nodeName : '#document', + nodeType : DOCUMENT_NODE, + doctype : null, + documentElement : null, + _inc : 1, + + insertBefore : function(newChild, refChild){//raises + if(newChild.nodeType == DOCUMENT_FRAGMENT_NODE){ + var child = newChild.firstChild; + while(child){ + var next = child.nextSibling; + this.insertBefore(child,refChild); + child = next; + } + return newChild; + } + if(this.documentElement == null && newChild.nodeType == ELEMENT_NODE){ + this.documentElement = newChild; + } + + return _insertBefore(this,newChild,refChild),(newChild.ownerDocument = this),newChild; + }, + removeChild : function(oldChild){ + if(this.documentElement == oldChild){ + this.documentElement = null; + } + return _removeChild(this,oldChild); + }, + // Introduced in DOM Level 2: + importNode : function(importedNode,deep){ + return importNode(this,importedNode,deep); + }, + // Introduced in DOM Level 2: + getElementById : function(id){ + var rtv = null; + _visitNode(this.documentElement,function(node){ + if(node.nodeType == ELEMENT_NODE){ + if(node.getAttribute('id') == id){ + rtv = node; + return true; + } + } + }) + return rtv; + }, + + //document factory method: + createElement : function(tagName){ + var node = new Element(); + node.ownerDocument = this; + node.nodeName = tagName; + node.tagName = tagName; + node.childNodes = new NodeList(); + var attrs = node.attributes = new NamedNodeMap(); + attrs._ownerElement = node; + return node; + }, + createDocumentFragment : function(){ + var node = new DocumentFragment(); + node.ownerDocument = this; + node.childNodes = new NodeList(); + return node; + }, + createTextNode : function(data){ + var node = new Text(); + node.ownerDocument = this; + node.appendData(data) + return node; + }, + createComment : function(data){ + var node = new Comment(); + node.ownerDocument = this; + node.appendData(data) + return node; + }, + createCDATASection : function(data){ + var node = new CDATASection(); + node.ownerDocument = this; + node.appendData(data) + return node; + }, + createProcessingInstruction : function(target,data){ + var node = new ProcessingInstruction(); + node.ownerDocument = this; + node.tagName = node.target = target; + node.nodeValue= node.data = data; + return node; + }, + createAttribute : function(name){ + var node = new Attr(); + node.ownerDocument = this; + node.name = name; + node.nodeName = name; + node.localName = name; + node.specified = true; + return node; + }, + createEntityReference : function(name){ + var node = new EntityReference(); + node.ownerDocument = this; + node.nodeName = name; + return node; + }, + // Introduced in DOM Level 2: + createElementNS : function(namespaceURI,qualifiedName){ + var node = new Element(); + var pl = qualifiedName.split(':'); + var attrs = node.attributes = new NamedNodeMap(); + node.childNodes = new NodeList(); + node.ownerDocument = this; + node.nodeName = qualifiedName; + node.tagName = qualifiedName; + node.namespaceURI = namespaceURI; + if(pl.length == 2){ + node.prefix = pl[0]; + node.localName = pl[1]; + }else{ + //el.prefix = null; + node.localName = qualifiedName; + } + attrs._ownerElement = node; + return node; + }, + // Introduced in DOM Level 2: + createAttributeNS : function(namespaceURI,qualifiedName){ + var node = new Attr(); + var pl = qualifiedName.split(':'); + node.ownerDocument = this; + node.nodeName = qualifiedName; + node.name = qualifiedName; + node.namespaceURI = namespaceURI; + node.specified = true; + if(pl.length == 2){ + node.prefix = pl[0]; + node.localName = pl[1]; + }else{ + //el.prefix = null; + node.localName = qualifiedName; + } + return node; + } +}; +_extends(Document,Node); + + +function Element() { + this._nsMap = {}; +}; +Element.prototype = { + nodeType : ELEMENT_NODE, + hasAttribute : function(name){ + return this.getAttributeNode(name)!=null; + }, + getAttribute : function(name){ + var attr = this.getAttributeNode(name); + return attr && attr.value || ''; + }, + getAttributeNode : function(name){ + return this.attributes.getNamedItem(name); + }, + setAttribute : function(name, value){ + var attr = this.ownerDocument.createAttribute(name); + attr.value = attr.nodeValue = "" + value; + this.setAttributeNode(attr) + }, + removeAttribute : function(name){ + var attr = this.getAttributeNode(name) + attr && this.removeAttributeNode(attr); + }, + + //four real opeartion method + appendChild:function(newChild){ + if(newChild.nodeType === DOCUMENT_FRAGMENT_NODE){ + return this.insertBefore(newChild,null); + }else{ + return _appendSingleChild(this,newChild); + } + }, + setAttributeNode : function(newAttr){ + return this.attributes.setNamedItem(newAttr); + }, + setAttributeNodeNS : function(newAttr){ + return this.attributes.setNamedItemNS(newAttr); + }, + removeAttributeNode : function(oldAttr){ + //console.log(this == oldAttr.ownerElement) + return this.attributes.removeNamedItem(oldAttr.nodeName); + }, + //get real attribute name,and remove it by removeAttributeNode + removeAttributeNS : function(namespaceURI, localName){ + var old = this.getAttributeNodeNS(namespaceURI, localName); + old && this.removeAttributeNode(old); + }, + + hasAttributeNS : function(namespaceURI, localName){ + return this.getAttributeNodeNS(namespaceURI, localName)!=null; + }, + getAttributeNS : function(namespaceURI, localName){ + var attr = this.getAttributeNodeNS(namespaceURI, localName); + return attr && attr.value || ''; + }, + setAttributeNS : function(namespaceURI, qualifiedName, value){ + var attr = this.ownerDocument.createAttributeNS(namespaceURI, qualifiedName); + attr.value = attr.nodeValue = "" + value; + this.setAttributeNode(attr) + }, + getAttributeNodeNS : function(namespaceURI, localName){ + return this.attributes.getNamedItemNS(namespaceURI, localName); + }, + + getElementsByTagName : function(tagName){ + return new LiveNodeList(this,function(base){ + var ls = []; + _visitNode(base,function(node){ + if(node !== base && node.nodeType == ELEMENT_NODE && (tagName === '*' || node.tagName == tagName)){ + ls.push(node); + } + }); + return ls; + }); + }, + getElementsByTagNameNS : function(namespaceURI, localName){ + return new LiveNodeList(this,function(base){ + var ls = []; + _visitNode(base,function(node){ + if(node !== base && node.nodeType === ELEMENT_NODE && (namespaceURI === '*' || node.namespaceURI === namespaceURI) && (localName === '*' || node.localName == localName)){ + ls.push(node); + } + }); + return ls; + + }); + } +}; +Document.prototype.getElementsByTagName = Element.prototype.getElementsByTagName; +Document.prototype.getElementsByTagNameNS = Element.prototype.getElementsByTagNameNS; + + +_extends(Element,Node); +function Attr() { +}; +Attr.prototype.nodeType = ATTRIBUTE_NODE; +_extends(Attr,Node); + + +function CharacterData() { +}; +CharacterData.prototype = { + data : '', + substringData : function(offset, count) { + return this.data.substring(offset, offset+count); + }, + appendData: function(text) { + text = this.data+text; + this.nodeValue = this.data = text; + this.length = text.length; + }, + insertData: function(offset,text) { + this.replaceData(offset,0,text); + + }, + appendChild:function(newChild){ + throw new Error(ExceptionMessage[HIERARCHY_REQUEST_ERR]) + }, + deleteData: function(offset, count) { + this.replaceData(offset,count,""); + }, + replaceData: function(offset, count, text) { + var start = this.data.substring(0,offset); + var end = this.data.substring(offset+count); + text = start + text + end; + this.nodeValue = this.data = text; + this.length = text.length; + } +} +_extends(CharacterData,Node); +function Text() { +}; +Text.prototype = { + nodeName : "#text", + nodeType : TEXT_NODE, + splitText : function(offset) { + var text = this.data; + var newText = text.substring(offset); + text = text.substring(0, offset); + this.data = this.nodeValue = text; + this.length = text.length; + var newNode = this.ownerDocument.createTextNode(newText); + if(this.parentNode){ + this.parentNode.insertBefore(newNode, this.nextSibling); + } + return newNode; + } +} +_extends(Text,CharacterData); +function Comment() { +}; +Comment.prototype = { + nodeName : "#comment", + nodeType : COMMENT_NODE +} +_extends(Comment,CharacterData); + +function CDATASection() { +}; +CDATASection.prototype = { + nodeName : "#cdata-section", + nodeType : CDATA_SECTION_NODE +} +_extends(CDATASection,CharacterData); + + +function DocumentType() { +}; +DocumentType.prototype.nodeType = DOCUMENT_TYPE_NODE; +_extends(DocumentType,Node); + +function Notation() { +}; +Notation.prototype.nodeType = NOTATION_NODE; +_extends(Notation,Node); + +function Entity() { +}; +Entity.prototype.nodeType = ENTITY_NODE; +_extends(Entity,Node); + +function EntityReference() { +}; +EntityReference.prototype.nodeType = ENTITY_REFERENCE_NODE; +_extends(EntityReference,Node); + +function DocumentFragment() { +}; +DocumentFragment.prototype.nodeName = "#document-fragment"; +DocumentFragment.prototype.nodeType = DOCUMENT_FRAGMENT_NODE; +_extends(DocumentFragment,Node); + + +function ProcessingInstruction() { +} +ProcessingInstruction.prototype.nodeType = PROCESSING_INSTRUCTION_NODE; +_extends(ProcessingInstruction,Node); +function XMLSerializer(){} +XMLSerializer.prototype.serializeToString = function(node,isHtml,nodeFilter){ + return nodeSerializeToString.call(node,isHtml,nodeFilter); +} +Node.prototype.toString = nodeSerializeToString; +function nodeSerializeToString(isHtml,nodeFilter){ + var buf = []; + var refNode = this.nodeType == 9?this.documentElement:this; + var prefix = refNode.prefix; + var uri = refNode.namespaceURI; + + if(uri && prefix == null){ + //console.log(prefix) + var prefix = refNode.lookupPrefix(uri); + if(prefix == null){ + //isHTML = true; + var visibleNamespaces=[ + {namespace:uri,prefix:null} + //{namespace:uri,prefix:''} + ] + } + } + serializeToString(this,buf,isHtml,nodeFilter,visibleNamespaces); + //console.log('###',this.nodeType,uri,prefix,buf.join('')) + return buf.join(''); +} +function needNamespaceDefine(node,isHTML, visibleNamespaces) { + var prefix = node.prefix||''; + var uri = node.namespaceURI; + if (!prefix && !uri){ + return false; + } + if (prefix === "xml" && uri === "http://www.w3.org/XML/1998/namespace" + || uri == 'http://www.w3.org/2000/xmlns/'){ + return false; + } + + var i = visibleNamespaces.length + //console.log('@@@@',node.tagName,prefix,uri,visibleNamespaces) + while (i--) { + var ns = visibleNamespaces[i]; + // get namespace prefix + //console.log(node.nodeType,node.tagName,ns.prefix,prefix) + if (ns.prefix == prefix){ + return ns.namespace != uri; + } + } + //console.log(isHTML,uri,prefix=='') + //if(isHTML && prefix ==null && uri == 'http://www.w3.org/1999/xhtml'){ + // return false; + //} + //node.flag = '11111' + //console.error(3,true,node.flag,node.prefix,node.namespaceURI) + return true; +} +function serializeToString(node,buf,isHTML,nodeFilter,visibleNamespaces){ + if(nodeFilter){ + node = nodeFilter(node); + if(node){ + if(typeof node == 'string'){ + buf.push(node); + return; + } + }else{ + return; + } + //buf.sort.apply(attrs, attributeSorter); + } + switch(node.nodeType){ + case ELEMENT_NODE: + if (!visibleNamespaces) visibleNamespaces = []; + var startVisibleNamespaces = visibleNamespaces.length; + var attrs = node.attributes; + var len = attrs.length; + var child = node.firstChild; + var nodeName = node.tagName; + + isHTML = (htmlns === node.namespaceURI) ||isHTML + buf.push('<',nodeName); + + + + for(var i=0;i'); + //if is cdata child node + if(isHTML && /^script$/i.test(nodeName)){ + while(child){ + if(child.data){ + buf.push(child.data); + }else{ + serializeToString(child,buf,isHTML,nodeFilter,visibleNamespaces); + } + child = child.nextSibling; + } + }else + { + while(child){ + serializeToString(child,buf,isHTML,nodeFilter,visibleNamespaces); + child = child.nextSibling; + } + } + buf.push(''); + }else{ + buf.push('/>'); + } + // remove added visible namespaces + //visibleNamespaces.length = startVisibleNamespaces; + return; + case DOCUMENT_NODE: + case DOCUMENT_FRAGMENT_NODE: + var child = node.firstChild; + while(child){ + serializeToString(child,buf,isHTML,nodeFilter,visibleNamespaces); + child = child.nextSibling; + } + return; + case ATTRIBUTE_NODE: + return buf.push(' ',node.name,'="',node.value.replace(/[<&"]/g,_xmlEncoder),'"'); + case TEXT_NODE: + return buf.push(node.data.replace(/[<&]/g,_xmlEncoder)); + case CDATA_SECTION_NODE: + return buf.push( ''); + case COMMENT_NODE: + return buf.push( ""); + case DOCUMENT_TYPE_NODE: + var pubid = node.publicId; + var sysid = node.systemId; + buf.push(''); + }else if(sysid && sysid!='.'){ + buf.push(' SYSTEM "',sysid,'">'); + }else{ + var sub = node.internalSubset; + if(sub){ + buf.push(" [",sub,"]"); + } + buf.push(">"); + } + return; + case PROCESSING_INSTRUCTION_NODE: + return buf.push( ""); + case ENTITY_REFERENCE_NODE: + return buf.push( '&',node.nodeName,';'); + //case ENTITY_NODE: + //case NOTATION_NODE: + default: + buf.push('??',node.nodeName); + } +} +function importNode(doc,node,deep){ + var node2; + switch (node.nodeType) { + case ELEMENT_NODE: + node2 = node.cloneNode(false); + node2.ownerDocument = doc; + //var attrs = node2.attributes; + //var len = attrs.length; + //for(var i=0;i + +function XMLReader(){ + +} + +XMLReader.prototype = { + parse:function(source,defaultNSMap,entityMap){ + var domBuilder = this.domBuilder; + domBuilder.startDocument(); + _copy(defaultNSMap ,defaultNSMap = {}) + parse(source,defaultNSMap,entityMap, + domBuilder,this.errorHandler); + domBuilder.endDocument(); + } +} +function parse(source,defaultNSMapCopy,entityMap,domBuilder,errorHandler){ + function fixedFromCharCode(code) { + // String.prototype.fromCharCode does not supports + // > 2 bytes unicode chars directly + if (code > 0xffff) { + code -= 0x10000; + var surrogate1 = 0xd800 + (code >> 10) + , surrogate2 = 0xdc00 + (code & 0x3ff); + + return String.fromCharCode(surrogate1, surrogate2); + } else { + return String.fromCharCode(code); + } + } + function entityReplacer(a){ + var k = a.slice(1,-1); + if(k in entityMap){ + return entityMap[k]; + }else if(k.charAt(0) === '#'){ + return fixedFromCharCode(parseInt(k.substr(1).replace('x','0x'))) + }else{ + errorHandler.error('entity not found:'+a); + return a; + } + } + function appendText(end){//has some bugs + if(end>start){ + var xt = source.substring(start,end).replace(/&#?\w+;/g,entityReplacer); + locator&&position(start); + domBuilder.characters(xt,0,end-start); + start = end + } + } + function position(p,m){ + while(p>=lineEnd && (m = linePattern.exec(source))){ + lineStart = m.index; + lineEnd = lineStart + m[0].length; + locator.lineNumber++; + //console.log('line++:',locator,startPos,endPos) + } + locator.columnNumber = p-lineStart+1; + } + var lineStart = 0; + var lineEnd = 0; + var linePattern = /.*(?:\r\n?|\n)|.*$/g + var locator = domBuilder.locator; + + var parseStack = [{currentNSMap:defaultNSMapCopy}] + var closeMap = {}; + var start = 0; + while(true){ + try{ + var tagStart = source.indexOf('<',start); + if(tagStart<0){ + if(!source.substr(start).match(/^\s*$/)){ + var doc = domBuilder.doc; + var text = doc.createTextNode(source.substr(start)); + doc.appendChild(text); + domBuilder.currentElement = text; + } + return; + } + if(tagStart>start){ + appendText(tagStart); + } + switch(source.charAt(tagStart+1)){ + case '/': + var end = source.indexOf('>',tagStart+3); + var tagName = source.substring(tagStart+2,end); + var config = parseStack.pop(); + if(end<0){ + + tagName = source.substring(tagStart+2).replace(/[\s<].*/,''); + //console.error('#@@@@@@'+tagName) + errorHandler.error("end tag name: "+tagName+' is not complete:'+config.tagName); + end = tagStart+1+tagName.length; + }else if(tagName.match(/\s + locator&&position(tagStart); + end = parseInstruction(source,tagStart,domBuilder); + break; + case '!':// start){ + start = end; + }else{ + //TODO: 这里有可能sax回退,有位置错误风险 + appendText(Math.max(tagStart,start)+1); + } + } +} +function copyLocator(f,t){ + t.lineNumber = f.lineNumber; + t.columnNumber = f.columnNumber; + return t; +} + +/** + * @see #appendElement(source,elStartEnd,el,selfClosed,entityReplacer,domBuilder,parseStack); + * @return end of the elementStartPart(end of elementEndPart for selfClosed el) + */ +function parseElementStartPart(source,start,el,currentNSMap,entityReplacer,errorHandler){ + var attrName; + var value; + var p = ++start; + var s = S_TAG;//status + while(true){ + var c = source.charAt(p); + switch(c){ + case '=': + if(s === S_ATTR){//attrName + attrName = source.slice(start,p); + s = S_EQ; + }else if(s === S_ATTR_SPACE){ + s = S_EQ; + }else{ + //fatalError: equal must after attrName or space after attrName + throw new Error('attribute equal must after attrName'); + } + break; + case '\'': + case '"': + if(s === S_EQ || s === S_ATTR //|| s == S_ATTR_SPACE + ){//equal + if(s === S_ATTR){ + errorHandler.warning('attribute value must after "="') + attrName = source.slice(start,p) + } + start = p+1; + p = source.indexOf(c,start) + if(p>0){ + value = source.slice(start,p).replace(/&#?\w+;/g,entityReplacer); + el.add(attrName,value,start-1); + s = S_ATTR_END; + }else{ + //fatalError: no end quot match + throw new Error('attribute value no end \''+c+'\' match'); + } + }else if(s == S_ATTR_NOQUOT_VALUE){ + value = source.slice(start,p).replace(/&#?\w+;/g,entityReplacer); + //console.log(attrName,value,start,p) + el.add(attrName,value,start); + //console.dir(el) + errorHandler.warning('attribute "'+attrName+'" missed start quot('+c+')!!'); + start = p+1; + s = S_ATTR_END + }else{ + //fatalError: no equal before + throw new Error('attribute value must after "="'); + } + break; + case '/': + switch(s){ + case S_TAG: + el.setTagName(source.slice(start,p)); + case S_ATTR_END: + case S_TAG_SPACE: + case S_TAG_CLOSE: + s =S_TAG_CLOSE; + el.closed = true; + case S_ATTR_NOQUOT_VALUE: + case S_ATTR: + case S_ATTR_SPACE: + break; + //case S_EQ: + default: + throw new Error("attribute invalid close char('/')") + } + break; + case ''://end document + //throw new Error('unexpected end of input') + errorHandler.error('unexpected end of input'); + if(s == S_TAG){ + el.setTagName(source.slice(start,p)); + } + return p; + case '>': + switch(s){ + case S_TAG: + el.setTagName(source.slice(start,p)); + case S_ATTR_END: + case S_TAG_SPACE: + case S_TAG_CLOSE: + break;//normal + case S_ATTR_NOQUOT_VALUE://Compatible state + case S_ATTR: + value = source.slice(start,p); + if(value.slice(-1) === '/'){ + el.closed = true; + value = value.slice(0,-1) + } + case S_ATTR_SPACE: + if(s === S_ATTR_SPACE){ + value = attrName; + } + if(s == S_ATTR_NOQUOT_VALUE){ + errorHandler.warning('attribute "'+value+'" missed quot(")!!'); + el.add(attrName,value.replace(/&#?\w+;/g,entityReplacer),start) + }else{ + if(currentNSMap[''] !== 'http://www.w3.org/1999/xhtml' || !value.match(/^(?:disabled|checked|selected)$/i)){ + errorHandler.warning('attribute "'+value+'" missed value!! "'+value+'" instead!!') + } + el.add(value,value,start) + } + break; + case S_EQ: + throw new Error('attribute value missed!!'); + } +// console.log(tagName,tagNamePattern,tagNamePattern.test(tagName)) + return p; + /*xml space '\x20' | #x9 | #xD | #xA; */ + case '\u0080': + c = ' '; + default: + if(c<= ' '){//space + switch(s){ + case S_TAG: + el.setTagName(source.slice(start,p));//tagName + s = S_TAG_SPACE; + break; + case S_ATTR: + attrName = source.slice(start,p) + s = S_ATTR_SPACE; + break; + case S_ATTR_NOQUOT_VALUE: + var value = source.slice(start,p).replace(/&#?\w+;/g,entityReplacer); + errorHandler.warning('attribute "'+value+'" missed quot(")!!'); + el.add(attrName,value,start) + case S_ATTR_END: + s = S_TAG_SPACE; + break; + //case S_TAG_SPACE: + //case S_EQ: + //case S_ATTR_SPACE: + // void();break; + //case S_TAG_CLOSE: + //ignore warning + } + }else{//not space +//S_TAG, S_ATTR, S_EQ, S_ATTR_NOQUOT_VALUE +//S_ATTR_SPACE, S_ATTR_END, S_TAG_SPACE, S_TAG_CLOSE + switch(s){ + //case S_TAG:void();break; + //case S_ATTR:void();break; + //case S_ATTR_NOQUOT_VALUE:void();break; + case S_ATTR_SPACE: + var tagName = el.tagName; + if(currentNSMap[''] !== 'http://www.w3.org/1999/xhtml' || !attrName.match(/^(?:disabled|checked|selected)$/i)){ + errorHandler.warning('attribute "'+attrName+'" missed value!! "'+attrName+'" instead2!!') + } + el.add(attrName,attrName,start); + start = p; + s = S_ATTR; + break; + case S_ATTR_END: + errorHandler.warning('attribute space is required"'+attrName+'"!!') + case S_TAG_SPACE: + s = S_ATTR; + start = p; + break; + case S_EQ: + s = S_ATTR_NOQUOT_VALUE; + start = p; + break; + case S_TAG_CLOSE: + throw new Error("elements closed character '/' and '>' must be connected to"); + } + } + }//end outer switch + //console.log('p++',p) + p++; + } +} +/** + * @return true if has new namespace define + */ +function appendElement(el,domBuilder,currentNSMap){ + var tagName = el.tagName; + var localNSMap = null; + //var currentNSMap = parseStack[parseStack.length-1].currentNSMap; + var i = el.length; + while(i--){ + var a = el[i]; + var qName = a.qName; + var value = a.value; + var nsp = qName.indexOf(':'); + if(nsp>0){ + var prefix = a.prefix = qName.slice(0,nsp); + var localName = qName.slice(nsp+1); + var nsPrefix = prefix === 'xmlns' && localName + }else{ + localName = qName; + prefix = null + nsPrefix = qName === 'xmlns' && '' + } + //can not set prefix,because prefix !== '' + a.localName = localName ; + //prefix == null for no ns prefix attribute + if(nsPrefix !== false){//hack!! + if(localNSMap == null){ + localNSMap = {} + //console.log(currentNSMap,0) + _copy(currentNSMap,currentNSMap={}) + //console.log(currentNSMap,1) + } + currentNSMap[nsPrefix] = localNSMap[nsPrefix] = value; + a.uri = 'http://www.w3.org/2000/xmlns/' + domBuilder.startPrefixMapping(nsPrefix, value) + } + } + var i = el.length; + while(i--){ + a = el[i]; + var prefix = a.prefix; + if(prefix){//no prefix attribute has no namespace + if(prefix === 'xml'){ + a.uri = 'http://www.w3.org/XML/1998/namespace'; + }if(prefix !== 'xmlns'){ + a.uri = currentNSMap[prefix || ''] + + //{console.log('###'+a.qName,domBuilder.locator.systemId+'',currentNSMap,a.uri)} + } + } + } + var nsp = tagName.indexOf(':'); + if(nsp>0){ + prefix = el.prefix = tagName.slice(0,nsp); + localName = el.localName = tagName.slice(nsp+1); + }else{ + prefix = null;//important!! + localName = el.localName = tagName; + } + //no prefix element has default namespace + var ns = el.uri = currentNSMap[prefix || '']; + domBuilder.startElement(ns,localName,tagName,el); + //endPrefixMapping and startPrefixMapping have not any help for dom builder + //localNSMap = null + if(el.closed){ + domBuilder.endElement(ns,localName,tagName); + if(localNSMap){ + for(prefix in localNSMap){ + domBuilder.endPrefixMapping(prefix) + } + } + }else{ + el.currentNSMap = currentNSMap; + el.localNSMap = localNSMap; + //parseStack.push(el); + return true; + } +} +function parseHtmlSpecialContent(source,elStartEnd,tagName,entityReplacer,domBuilder){ + if(/^(?:script|textarea)$/i.test(tagName)){ + var elEndStart = source.indexOf('',elStartEnd); + var text = source.substring(elStartEnd+1,elEndStart); + if(/[&<]/.test(text)){ + if(/^script$/i.test(tagName)){ + //if(!/\]\]>/.test(text)){ + //lexHandler.startCDATA(); + domBuilder.characters(text,0,text.length); + //lexHandler.endCDATA(); + return elEndStart; + //} + }//}else{//text area + text = text.replace(/&#?\w+;/g,entityReplacer); + domBuilder.characters(text,0,text.length); + return elEndStart; + //} + + } + } + return elStartEnd+1; +} +function fixSelfClosed(source,elStartEnd,tagName,closeMap){ + //if(tagName in closeMap){ + var pos = closeMap[tagName]; + if(pos == null){ + //console.log(tagName) + pos = source.lastIndexOf('') + if(pos',start+4); + //append comment source.substring(4,end)//',start+4); + //append comment source.substring(4,end)//"); + case DOCUMENT_TYPE_NODE: + var pubid = node.publicId; + var sysid = node.systemId; + buf.push(''); + }else if(sysid && sysid!='.'){ + buf.push(' SYSTEM "',sysid,'">'); + }else{ + var sub = node.internalSubset; + if(sub){ + buf.push(" [",sub,"]"); + } + buf.push(">"); + } + return; + case PROCESSING_INSTRUCTION_NODE: + return buf.push( ""); + case ENTITY_REFERENCE_NODE: + return buf.push( '&',node.nodeName,';'); + //case ENTITY_NODE: + //case NOTATION_NODE: + default: + buf.push('??',node.nodeName); + } +} +function importNode(doc,node,deep){ + var node2; + switch (node.nodeType) { + case ELEMENT_NODE: + node2 = node.cloneNode(false); + node2.ownerDocument = doc; + //var attrs = node2.attributes; + //var len = attrs.length; + //for(var i=0;i','amp':'&','quot':'"','apos':"'"}; + if(locator){ + domBuilder.setDocumentLocator(locator); + } + + sax$$1.errorHandler = buildErrorHandler(errorHandler,domBuilder,locator); + sax$$1.domBuilder = options.domBuilder || domBuilder; + if(/\/x?html?$/.test(mimeType)){ + entityMap.nbsp = '\xa0'; + entityMap.copy = '\xa9'; + defaultNSMap['']= 'http://www.w3.org/1999/xhtml'; + } + defaultNSMap.xml = defaultNSMap.xml || 'http://www.w3.org/XML/1998/namespace'; + if(source){ + sax$$1.parse(source,defaultNSMap,entityMap); + }else{ + sax$$1.errorHandler.error("invalid doc source"); + } + return domBuilder.doc; +}; +function buildErrorHandler(errorImpl,domBuilder,locator){ + if(!errorImpl){ + if(domBuilder instanceof DOMHandler){ + return domBuilder; + } + errorImpl = domBuilder ; + } + var errorHandler = {}; + var isCallback = errorImpl instanceof Function; + locator = locator||{}; + function build(key){ + var fn = errorImpl[key]; + if(!fn && isCallback){ + fn = errorImpl.length == 2?function(msg){errorImpl(key,msg);}:errorImpl; + } + errorHandler[key] = fn && function(msg){ + fn('[xmldom '+key+']\t'+msg+_locator(locator)); + }||function(){}; + } + build('warning'); + build('error'); + build('fatalError'); + return errorHandler; +} + +//console.log('#\n\n\n\n\n\n\n####') +/** + * +ContentHandler+ErrorHandler + * +LexicalHandler+EntityResolver2 + * -DeclHandler-DTDHandler + * + * DefaultHandler:EntityResolver, DTDHandler, ContentHandler, ErrorHandler + * DefaultHandler2:DefaultHandler,LexicalHandler, DeclHandler, EntityResolver2 + * @link http://www.saxproject.org/apidoc/org/xml/sax/helpers/DefaultHandler.html + */ +function DOMHandler() { + this.cdata = false; +} +function position(locator,node){ + node.lineNumber = locator.lineNumber; + node.columnNumber = locator.columnNumber; +} +/** + * @see org.xml.sax.ContentHandler#startDocument + * @link http://www.saxproject.org/apidoc/org/xml/sax/ContentHandler.html + */ +DOMHandler.prototype = { + startDocument : function() { + this.doc = new DOMImplementation().createDocument(null, null, null); + if (this.locator) { + this.doc.documentURI = this.locator.systemId; + } + }, + startElement:function(namespaceURI, localName, qName, attrs) { + var this$1 = this; + + var doc = this.doc; + var el = doc.createElementNS(namespaceURI, qName||localName); + var len = attrs.length; + appendElement(this, el); + this.currentElement = el; + + this.locator && position(this.locator,el); + for (var i = 0 ; i < len; i++) { + var namespaceURI = attrs.getURI(i); + var value = attrs.getValue(i); + var qName = attrs.getQName(i); + var attr = doc.createAttributeNS(namespaceURI, qName); + this$1.locator &&position(attrs.getLocator(i),attr); + attr.value = attr.nodeValue = value; + el.setAttributeNode(attr); + } + }, + endElement:function(namespaceURI, localName, qName) { + var current = this.currentElement; + var tagName = current.tagName; + this.currentElement = current.parentNode; + }, + startPrefixMapping:function(prefix, uri) { + }, + endPrefixMapping:function(prefix) { + }, + processingInstruction:function(target, data) { + var ins = this.doc.createProcessingInstruction(target, data); + this.locator && position(this.locator,ins); + appendElement(this, ins); + }, + ignorableWhitespace:function(ch, start, length) { + }, + characters:function(chars, start, length) { + chars = _toString.apply(this,arguments); + //console.log(chars) + if(chars){ + if (this.cdata) { + var charNode = this.doc.createCDATASection(chars); + } else { + var charNode = this.doc.createTextNode(chars); + } + if(this.currentElement){ + this.currentElement.appendChild(charNode); + }else if(/^\s*$/.test(chars)){ + this.doc.appendChild(charNode); + //process xml + } + this.locator && position(this.locator,charNode); + } + }, + skippedEntity:function(name) { + }, + endDocument:function() { + this.doc.normalize(); + }, + setDocumentLocator:function (locator) { + if(this.locator = locator){// && !('lineNumber' in locator)){ + locator.lineNumber = 0; + } + }, + //LexicalHandler + comment:function(chars, start, length) { + chars = _toString.apply(this,arguments); + var comm = this.doc.createComment(chars); + this.locator && position(this.locator,comm); + appendElement(this, comm); + }, + + startCDATA:function() { + //used in characters() methods + this.cdata = true; + }, + endCDATA:function() { + this.cdata = false; + }, + + startDTD:function(name, publicId, systemId) { + var impl = this.doc.implementation; + if (impl && impl.createDocumentType) { + var dt = impl.createDocumentType(name, publicId, systemId); + this.locator && position(this.locator,dt); + appendElement(this, dt); + } + }, + /** + * @see org.xml.sax.ErrorHandler + * @link http://www.saxproject.org/apidoc/org/xml/sax/ErrorHandler.html + */ + warning:function(error) { + console.warn('[xmldom warning]\t'+error,_locator(this.locator)); + }, + error:function(error) { + console.error('[xmldom error]\t'+error,_locator(this.locator)); + }, + fatalError:function(error) { + console.error('[xmldom fatalError]\t'+error,_locator(this.locator)); + throw error; + } +}; +function _locator(l){ + if(l){ + return '\n@'+(l.systemId ||'')+'#[line:'+l.lineNumber+',col:'+l.columnNumber+']' + } +} +function _toString(chars,start,length){ + if(typeof chars == 'string'){ + return chars.substr(start,length) + }else{//java sax connect width xmldom on rhino(what about: "? && !(chars instanceof String)") + if(chars.length >= start+length || start){ + return new java.lang.String(chars,start,length)+''; + } + return chars; + } +} + +/* + * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/LexicalHandler.html + * used method of org.xml.sax.ext.LexicalHandler: + * #comment(chars, start, length) + * #startCDATA() + * #endCDATA() + * #startDTD(name, publicId, systemId) + * + * + * IGNORED method of org.xml.sax.ext.LexicalHandler: + * #endDTD() + * #startEntity(name) + * #endEntity(name) + * + * + * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/DeclHandler.html + * IGNORED method of org.xml.sax.ext.DeclHandler + * #attributeDecl(eName, aName, type, mode, value) + * #elementDecl(name, model) + * #externalEntityDecl(name, publicId, systemId) + * #internalEntityDecl(name, value) + * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/EntityResolver2.html + * IGNORED method of org.xml.sax.EntityResolver2 + * #resolveEntity(String name,String publicId,String baseURI,String systemId) + * #resolveEntity(publicId, systemId) + * #getExternalSubset(name, baseURI) + * @link http://www.saxproject.org/apidoc/org/xml/sax/DTDHandler.html + * IGNORED method of org.xml.sax.DTDHandler + * #notationDecl(name, publicId, systemId) {}; + * #unparsedEntityDecl(name, publicId, systemId, notationName) {}; + */ +"endDTD,startEntity,endEntity,attributeDecl,elementDecl,externalEntityDecl,internalEntityDecl,resolveEntity,getExternalSubset,notationDecl,unparsedEntityDecl".replace(/\w+/g,function(key){ + DOMHandler.prototype[key] = function(){return null}; +}); + +/* Private static helpers treated below as private instance methods, so don't need to add these to the public API; we might use a Relator to also get rid of non-standard public properties */ +function appendElement (hander,node) { + if (!hander.currentElement) { + hander.doc.appendChild(node); + } else { + hander.currentElement.appendChild(node); + } +}//appendChild and setAttributeNS are preformance key + +//if(typeof require == 'function'){ + var XMLReader = sax.XMLReader; + var DOMImplementation = exports.DOMImplementation = dom.DOMImplementation; + exports.XMLSerializer = dom.XMLSerializer ; + exports.DOMParser = DOMParser; +//} +}); + var Blob$6 = makeBlob(); +var XMLSerializer$$1 = domParser.XMLSerializer; +// NOTE: might be useful :https://github.com/jindw/xmldom/pull/152/commits/be5176ece6fa1591daef96a5f361aaacaa445175 + function toX3D (CSG) { + var DOMImplementation$$1 = typeof document !== 'undefined' ? document.implementation : new domParser.DOMImplementation(); // materialPolygonLists // key: a color string (e.g. "0 1 1" for yellow) // value: an array of strings specifying polygons of this color @@ -6980,9 +9143,9 @@ function toX3D (CSG) { }); // create output document - var docType = document.implementation.createDocumentType('X3D', + var docType = DOMImplementation$$1.createDocumentType('X3D', 'ISO//Web3D//DTD X3D 3.1//EN', 'http://www.web3d.org/specifications/x3d-3.1.dtd'); - var exportDoc = document.implementation.createDocument(null, 'X3D', docType); + var exportDoc = DOMImplementation$$1.createDocument(null, 'X3D', docType); exportDoc.insertBefore( exportDoc.createProcessingInstruction('xml', 'version="1.0" encoding="UTF-8"'), exportDoc.doctype); @@ -7034,7 +9197,7 @@ function toX3D (CSG) { } } - var x3dstring = (new XMLSerializer()).serializeToString(exportDoc); + var x3dstring = (new XMLSerializer$$1()).serializeToString(exportDoc); return new Blob$6([x3dstring], { type: 'model/x3d+xml' }) diff --git a/dist/module.js.map b/dist/module.js.map index bd20a04ed..5e703fa7a 100644 --- a/dist/module.js.map +++ b/dist/module.js.map @@ -1 +1 @@ -{"version":3,"file":null,"sources":["../src/jscad/version.js","../src/csg.js","../src/utils/Blob.js","../src/io/writers/CSGToStla.js","../src/io/writers/CSGToStlb.js","../src/io/writers/CSGToAMF.js","../src/io/writers/CSGToX3D.js","../src/io/writers/CAGtoSvg.js","../src/io/writers/CAGToJson.js","../src/io/writers/CAGtoDxf.js","../src/utils/misc.js","../src/io/convertToBlob.js","../src/jscad/jscad-function.js","../src/jscad/includeJscadSync.js","../src/modeling/primitives2d.js","../src/modeling/ops-extrusions.js","../src/modeling/primitives3d.js","../src/modeling/ops-booleans.js","../src/modeling/ops-transformations.js","../src/modeling/color.js","../src/modeling/maths.js","../src/modeling/text.js","../src/modeling/debug.js","../src/jscad/log.js","../src/modeling/index.js","../src/jscad/rebuildSolid.js","../src/module.js"],"sourcesContent":["const json = require('../../package.json')\nexport const version = json.version // TODO/ add version date ?\n","/*\n\n## IMPORTANT NOTE --- IMPORTANT \nThe master for this file is located at:\nhttps://github.com/joostn/openjscad/tree/gh-pages\nThat is the gh-pages branch of the joostn/openjscad project\nIf contributing from openjscad.org, please do NOT edit this local file but make pull requests against\nabove joostn/gh-pages branch.\n## IMPORTANT NOTE --- IMPORTANT NOTE\n\n\n## License\n\nCopyright (c) 2014 bebbi (elghatta@gmail.com)\nCopyright (c) 2013 Eduard Bespalov (edwbes@gmail.com)\nCopyright (c) 2012 Joost Nieuwenhuijse (joost@newhouse.nl)\nCopyright (c) 2011 Evan Wallace (http://evanw.github.com/csg.js/)\nCopyright (c) 2012 Alexandre Girard (https://github.com/alx)\n\nAll code released under MIT license\n\n## Overview\n\nFor an overview of the CSG process see the original csg.js code:\nhttp://evanw.github.com/csg.js/\n\nCSG operations through BSP trees suffer from one problem: heavy fragmentation\nof polygons. If two CSG solids of n polygons are unified, the resulting solid may have\nin the order of n*n polygons, because each polygon is split by the planes of all other\npolygons. After a few operations the number of polygons explodes.\n\nThis version of CSG.js solves the problem in 3 ways:\n\n1. Every polygon split is recorded in a tree (CSG.PolygonTreeNode). This is a separate\ntree, not to be confused with the CSG tree. If a polygon is split into two parts but in\nthe end both fragments have not been discarded by the CSG operation, we can retrieve\nthe original unsplit polygon from the tree, instead of the two fragments.\n\nThis does not completely solve the issue though: if a polygon is split multiple times\nthe number of fragments depends on the order of subsequent splits, and we might still\nend up with unncessary splits:\nSuppose a polygon is first split into A and B, and then into A1, B1, A2, B2. Suppose B2 is\ndiscarded. We will end up with 2 polygons: A and B1. Depending on the actual split boundaries\nwe could still have joined A and B1 into one polygon. Therefore a second approach is used as well:\n\n2. After CSG operations all coplanar polygon fragments are joined by a retesselating\noperation. See CSG.reTesselated(). Retesselation is done through a\nlinear sweep over the polygon surface. The sweep line passes over the y coordinates\nof all vertices in the polygon. Polygons are split at each sweep line, and the fragments\nare joined horizontally and vertically into larger polygons (making sure that we\nwill end up with convex polygons).\nThis still doesn't solve the problem completely: due to floating point imprecisions\nwe may end up with small gaps between polygons, and polygons may not be exactly coplanar\nanymore, and as a result the retesselation algorithm may fail to join those polygons.\nTherefore:\n\n3. A canonicalization algorithm is implemented: it looks for vertices that have\napproximately the same coordinates (with a certain tolerance, say 1e-5) and replaces\nthem with the same vertex. If polygons share a vertex they will actually point to the\nsame CSG.Vertex instance. The same is done for polygon planes. See CSG.canonicalized().\n\n\nPerformance improvements to the original CSG.js:\n\nReplaced the flip() and invert() methods by flipped() and inverted() which don't\nmodify the source object. This allows to get rid of all clone() calls, so that\nmultiple polygons can refer to the same CSG.Plane instance etc.\n\nThe original union() used an extra invert(), clipTo(), invert() sequence just to remove the\ncoplanar front faces from b; this is now combined in a single b.clipTo(a, true) call.\n\nDetection whether a polygon is in front or in back of a plane: for each polygon\nwe are caching the coordinates of the bounding sphere. If the bounding sphere is\nin front or in back of the plane we don't have to check the individual vertices\nanymore.\n\n\nOther additions to the original CSG.js:\n\nCSG.Vector class has been renamed into CSG.Vector3D\n\nClasses for 3D lines, 2D vectors, 2D lines, and methods to find the intersection of\na line and a plane etc.\n\nTransformations: CSG.transform(), CSG.translate(), CSG.rotate(), CSG.scale()\n\nExpanding or contracting a solid: CSG.expand() and CSG.contract(). Creates nice\nsmooth corners.\n\nThe vertex normal has been removed since it complicates retesselation. It's not needed\nfor solid CAD anyway.\n\n*/\n\n var _CSGDEBUG = false;\n\n function fnNumberSort(a, b) {\n return a - b;\n }\n\n // # class CSG\n // Holds a binary space partition tree representing a 3D solid. Two solids can\n // be combined using the `union()`, `subtract()`, and `intersect()` methods.\n var CSG = function() {\n this.polygons = [];\n this.properties = new CSG.Properties();\n this.isCanonicalized = true;\n this.isRetesselated = true;\n };\n\n CSG.defaultResolution2D = 32;\n CSG.defaultResolution3D = 12;\n\n // Construct a CSG solid from a list of `CSG.Polygon` instances.\n CSG.fromPolygons = function(polygons) {\n var csg = new CSG();\n csg.polygons = polygons;\n csg.isCanonicalized = false;\n csg.isRetesselated = false;\n return csg;\n };\n\n // Construct a CSG solid from generated slices.\n // Look at CSG.Polygon.prototype.solidFromSlices for details\n CSG.fromSlices = function(options) {\n return (new CSG.Polygon.createFromPoints([\n [0, 0, 0],\n [1, 0, 0],\n [1, 1, 0],\n [0, 1, 0]\n ])).solidFromSlices(options);\n };\n\n // create from an untyped object with identical property names:\n CSG.fromObject = function(obj) {\n var polygons = obj.polygons.map(function(p) {\n return CSG.Polygon.fromObject(p);\n });\n var csg = CSG.fromPolygons(polygons);\n csg.isCanonicalized = obj.isCanonicalized;\n csg.isRetesselated = obj.isRetesselated;\n return csg;\n };\n\n // Reconstruct a CSG from the output of toCompactBinary()\n CSG.fromCompactBinary = function(bin) {\n if (bin['class'] != \"CSG\") throw new Error(\"Not a CSG\");\n var planes = [],\n planeData = bin.planeData,\n numplanes = planeData.length / 4,\n arrayindex = 0,\n x, y, z, w, normal, plane;\n for (var planeindex = 0; planeindex < numplanes; planeindex++) {\n x = planeData[arrayindex++];\n y = planeData[arrayindex++];\n z = planeData[arrayindex++];\n w = planeData[arrayindex++];\n normal = CSG.Vector3D.Create(x, y, z);\n plane = new CSG.Plane(normal, w);\n planes.push(plane);\n }\n\n var vertices = [],\n vertexData = bin.vertexData,\n numvertices = vertexData.length / 3,\n pos, vertex;\n arrayindex = 0;\n for (var vertexindex = 0; vertexindex < numvertices; vertexindex++) {\n x = vertexData[arrayindex++];\n y = vertexData[arrayindex++];\n z = vertexData[arrayindex++];\n pos = CSG.Vector3D.Create(x, y, z);\n vertex = new CSG.Vertex(pos);\n vertices.push(vertex);\n }\n\n var shareds = bin.shared.map(function(shared) {\n return CSG.Polygon.Shared.fromObject(shared);\n });\n\n var polygons = [],\n numpolygons = bin.numPolygons,\n numVerticesPerPolygon = bin.numVerticesPerPolygon,\n polygonVertices = bin.polygonVertices,\n polygonPlaneIndexes = bin.polygonPlaneIndexes,\n polygonSharedIndexes = bin.polygonSharedIndexes,\n numpolygonvertices, polygonvertices, shared, polygon; //already defined plane,\n arrayindex = 0;\n for (var polygonindex = 0; polygonindex < numpolygons; polygonindex++) {\n numpolygonvertices = numVerticesPerPolygon[polygonindex];\n polygonvertices = [];\n for (var i = 0; i < numpolygonvertices; i++) {\n polygonvertices.push(vertices[polygonVertices[arrayindex++]]);\n }\n plane = planes[polygonPlaneIndexes[polygonindex]];\n shared = shareds[polygonSharedIndexes[polygonindex]];\n polygon = new CSG.Polygon(polygonvertices, shared, plane);\n polygons.push(polygon);\n }\n var csg = CSG.fromPolygons(polygons);\n csg.isCanonicalized = true;\n csg.isRetesselated = true;\n return csg;\n };\n\n CSG.prototype = {\n toPolygons: function() {\n return this.polygons;\n },\n\n // Return a new CSG solid representing space in either this solid or in the\n // solid `csg`. Neither this solid nor the solid `csg` are modified.\n //\n // A.union(B)\n //\n // +-------+ +-------+\n // | | | |\n // | A | | |\n // | +--+----+ = | +----+\n // +----+--+ | +----+ |\n // | B | | |\n // | | | |\n // +-------+ +-------+\n //\n union: function(csg) {\n var csgs;\n if (csg instanceof Array) {\n csgs = csg.slice(0);\n csgs.push(this);\n } else {\n csgs = [this, csg];\n }\n\n // combine csg pairs in a way that forms a balanced binary tree pattern\n for (var i = 1; i < csgs.length; i += 2) {\n csgs.push(csgs[i-1].unionSub(csgs[i]));\n }\n\n return csgs[i - 1].reTesselated().canonicalized();\n },\n\n unionSub: function(csg, retesselate, canonicalize) {\n if (!this.mayOverlap(csg)) {\n return this.unionForNonIntersecting(csg);\n } else {\n var a = new CSG.Tree(this.polygons);\n var b = new CSG.Tree(csg.polygons);\n a.clipTo(b, false);\n\n // b.clipTo(a, true); // ERROR: this doesn't work\n b.clipTo(a);\n b.invert();\n b.clipTo(a);\n b.invert();\n\n var newpolygons = a.allPolygons().concat(b.allPolygons());\n var result = CSG.fromPolygons(newpolygons);\n result.properties = this.properties._merge(csg.properties);\n if (retesselate) result = result.reTesselated();\n if (canonicalize) result = result.canonicalized();\n return result;\n }\n },\n\n // Like union, but when we know that the two solids are not intersecting\n // Do not use if you are not completely sure that the solids do not intersect!\n unionForNonIntersecting: function(csg) {\n var newpolygons = this.polygons.concat(csg.polygons);\n var result = CSG.fromPolygons(newpolygons);\n result.properties = this.properties._merge(csg.properties);\n result.isCanonicalized = this.isCanonicalized && csg.isCanonicalized;\n result.isRetesselated = this.isRetesselated && csg.isRetesselated;\n return result;\n },\n\n // Return a new CSG solid representing space in this solid but not in the\n // solid `csg`. Neither this solid nor the solid `csg` are modified.\n //\n // A.subtract(B)\n //\n // +-------+ +-------+\n // | | | |\n // | A | | |\n // | +--+----+ = | +--+\n // +----+--+ | +----+\n // | B |\n // | |\n // +-------+\n //\n subtract: function(csg) {\n var csgs;\n if (csg instanceof Array) {\n csgs = csg;\n } else {\n csgs = [csg];\n }\n var result = this;\n for (var i = 0; i < csgs.length; i++) {\n var islast = (i == (csgs.length - 1));\n result = result.subtractSub(csgs[i], islast, islast);\n }\n return result;\n },\n\n subtractSub: function(csg, retesselate, canonicalize) {\n var a = new CSG.Tree(this.polygons);\n var b = new CSG.Tree(csg.polygons);\n a.invert();\n a.clipTo(b);\n b.clipTo(a, true);\n a.addPolygons(b.allPolygons());\n a.invert();\n var result = CSG.fromPolygons(a.allPolygons());\n result.properties = this.properties._merge(csg.properties);\n if (retesselate) result = result.reTesselated();\n if (canonicalize) result = result.canonicalized();\n return result;\n },\n\n // Return a new CSG solid representing space both this solid and in the\n // solid `csg`. Neither this solid nor the solid `csg` are modified.\n //\n // A.intersect(B)\n //\n // +-------+\n // | |\n // | A |\n // | +--+----+ = +--+\n // +----+--+ | +--+\n // | B |\n // | |\n // +-------+\n //\n intersect: function(csg) {\n var csgs;\n if (csg instanceof Array) {\n csgs = csg;\n } else {\n csgs = [csg];\n }\n var result = this;\n for (var i = 0; i < csgs.length; i++) {\n var islast = (i == (csgs.length - 1));\n result = result.intersectSub(csgs[i], islast, islast);\n }\n return result;\n },\n\n intersectSub: function(csg, retesselate, canonicalize) {\n var a = new CSG.Tree(this.polygons);\n var b = new CSG.Tree(csg.polygons);\n a.invert();\n b.clipTo(a);\n b.invert();\n a.clipTo(b);\n b.clipTo(a);\n a.addPolygons(b.allPolygons());\n a.invert();\n var result = CSG.fromPolygons(a.allPolygons());\n result.properties = this.properties._merge(csg.properties);\n if (retesselate) result = result.reTesselated();\n if (canonicalize) result = result.canonicalized();\n return result;\n },\n\n // Return a new CSG solid with solid and empty space switched. This solid is\n // not modified.\n invert: function() {\n var flippedpolygons = this.polygons.map(function(p) {\n return p.flipped();\n });\n return CSG.fromPolygons(flippedpolygons);\n // TODO: flip properties?\n },\n\n // Affine transformation of CSG object. Returns a new CSG object\n transform1: function(matrix4x4) {\n var newpolygons = this.polygons.map(function(p) {\n return p.transform(matrix4x4);\n });\n var result = CSG.fromPolygons(newpolygons);\n result.properties = this.properties._transform(matrix4x4);\n result.isRetesselated = this.isRetesselated;\n return result;\n },\n\n transform: function(matrix4x4) {\n var ismirror = matrix4x4.isMirroring();\n var transformedvertices = {};\n var transformedplanes = {};\n var newpolygons = this.polygons.map(function(p) {\n var newplane;\n var plane = p.plane;\n var planetag = plane.getTag();\n if (planetag in transformedplanes) {\n newplane = transformedplanes[planetag];\n } else {\n newplane = plane.transform(matrix4x4);\n transformedplanes[planetag] = newplane;\n }\n var newvertices = p.vertices.map(function(v) {\n var newvertex;\n var vertextag = v.getTag();\n if (vertextag in transformedvertices) {\n newvertex = transformedvertices[vertextag];\n } else {\n newvertex = v.transform(matrix4x4);\n transformedvertices[vertextag] = newvertex;\n }\n return newvertex;\n });\n if (ismirror) newvertices.reverse();\n return new CSG.Polygon(newvertices, p.shared, newplane);\n });\n var result = CSG.fromPolygons(newpolygons);\n result.properties = this.properties._transform(matrix4x4);\n result.isRetesselated = this.isRetesselated;\n result.isCanonicalized = this.isCanonicalized;\n return result;\n },\n\n toString: function() {\n var result = \"CSG solid:\\n\";\n this.polygons.map(function(p) {\n result += p.toString();\n });\n return result;\n },\n\n // Expand the solid\n // resolution: number of points per 360 degree for the rounded corners\n expand: function(radius, resolution) {\n var result = this.expandedShell(radius, resolution, true);\n result = result.reTesselated();\n result.properties = this.properties; // keep original properties\n return result;\n },\n\n // Contract the solid\n // resolution: number of points per 360 degree for the rounded corners\n contract: function(radius, resolution) {\n var expandedshell = this.expandedShell(radius, resolution, false);\n var result = this.subtract(expandedshell);\n result = result.reTesselated();\n result.properties = this.properties; // keep original properties\n return result;\n },\n\n // cut the solid at a plane, and stretch the cross-section found along plane normal\n stretchAtPlane: function(normal, point, length) {\n var plane = CSG.Plane.fromNormalAndPoint(normal, point);\n var onb = new CSG.OrthoNormalBasis(plane);\n var crosssect = this.sectionCut(onb);\n var midpiece = crosssect.extrudeInOrthonormalBasis(onb, length);\n var piece1 = this.cutByPlane(plane);\n var piece2 = this.cutByPlane(plane.flipped());\n var result = piece1.union([midpiece, piece2.translate(plane.normal.times(length))]);\n return result;\n },\n\n\n // Create the expanded shell of the solid:\n // All faces are extruded to get a thickness of 2*radius\n // Cylinders are constructed around every side\n // Spheres are placed on every vertex\n // unionWithThis: if true, the resulting solid will be united with 'this' solid;\n // the result is a true expansion of the solid\n // If false, returns only the shell\n expandedShell: function(radius, resolution, unionWithThis) {\n var csg = this.reTesselated();\n var result;\n if (unionWithThis) {\n result = csg;\n } else {\n result = new CSG();\n }\n\n // first extrude all polygons:\n csg.polygons.map(function(polygon) {\n var extrudevector = polygon.plane.normal.unit().times(2 * radius);\n var translatedpolygon = polygon.translate(extrudevector.times(-0.5));\n var extrudedface = translatedpolygon.extrude(extrudevector);\n result = result.unionSub(extrudedface, false, false);\n });\n\n // Make a list of all unique vertex pairs (i.e. all sides of the solid)\n // For each vertex pair we collect the following:\n // v1: first coordinate\n // v2: second coordinate\n // planenormals: array of normal vectors of all planes touching this side\n var vertexpairs = {}; // map of 'vertex pair tag' to {v1, v2, planenormals}\n csg.polygons.map(function(polygon) {\n var numvertices = polygon.vertices.length;\n var prevvertex = polygon.vertices[numvertices - 1];\n var prevvertextag = prevvertex.getTag();\n for (var i = 0; i < numvertices; i++) {\n var vertex = polygon.vertices[i];\n var vertextag = vertex.getTag();\n var vertextagpair;\n if (vertextag < prevvertextag) {\n vertextagpair = vertextag + \"-\" + prevvertextag;\n } else {\n vertextagpair = prevvertextag + \"-\" + vertextag;\n }\n var obj;\n if (vertextagpair in vertexpairs) {\n obj = vertexpairs[vertextagpair];\n } else {\n obj = {\n v1: prevvertex,\n v2: vertex,\n planenormals: []\n };\n vertexpairs[vertextagpair] = obj;\n }\n obj.planenormals.push(polygon.plane.normal);\n\n prevvertextag = vertextag;\n prevvertex = vertex;\n }\n });\n\n // now construct a cylinder on every side\n // The cylinder is always an approximation of a true cylinder: it will have polygons\n // around the sides. We will make sure though that the cylinder will have an edge at every\n // face that touches this side. This ensures that we will get a smooth fill even\n // if two edges are at, say, 10 degrees and the resolution is low.\n // Note: the result is not retesselated yet but it really should be!\n for (var vertextagpair in vertexpairs) {\n var vertexpair = vertexpairs[vertextagpair],\n startpoint = vertexpair.v1.pos,\n endpoint = vertexpair.v2.pos,\n // our x,y and z vectors:\n zbase = endpoint.minus(startpoint).unit(),\n xbase = vertexpair.planenormals[0].unit(),\n ybase = xbase.cross(zbase),\n\n // make a list of angles that the cylinder should traverse:\n angles = [];\n\n // first of all equally spaced around the cylinder:\n for (var i = 0; i < resolution; i++) {\n angles.push(i * Math.PI * 2 / resolution);\n }\n\n // and also at every normal of all touching planes:\n for (var i = 0, iMax = vertexpair.planenormals.length; i < iMax; i++) {\n var planenormal = vertexpair.planenormals[i],\n si = ybase.dot(planenormal),\n co = xbase.dot(planenormal),\n angle = Math.atan2(si, co);\n\n if (angle < 0) angle += Math.PI * 2;\n angles.push(angle);\n angle = Math.atan2(-si, -co);\n if (angle < 0) angle += Math.PI * 2;\n angles.push(angle);\n }\n\n // this will result in some duplicate angles but we will get rid of those later.\n // Sort:\n angles = angles.sort(fnNumberSort);\n\n // Now construct the cylinder by traversing all angles:\n var numangles = angles.length,\n prevp1, prevp2,\n startfacevertices = [],\n endfacevertices = [],\n polygons = [];\n for (var i = -1; i < numangles; i++) {\n var angle = angles[(i < 0) ? (i + numangles) : i],\n si = Math.sin(angle),\n co = Math.cos(angle),\n p = xbase.times(co * radius).plus(ybase.times(si * radius)),\n p1 = startpoint.plus(p),\n p2 = endpoint.plus(p),\n skip = false;\n if (i >= 0) {\n if (p1.distanceTo(prevp1) < 1e-5) {\n skip = true;\n }\n }\n if (!skip) {\n if (i >= 0) {\n startfacevertices.push(new CSG.Vertex(p1));\n endfacevertices.push(new CSG.Vertex(p2));\n var polygonvertices = [\n new CSG.Vertex(prevp2),\n new CSG.Vertex(p2),\n new CSG.Vertex(p1),\n new CSG.Vertex(prevp1)\n ];\n var polygon = new CSG.Polygon(polygonvertices);\n polygons.push(polygon);\n }\n prevp1 = p1;\n prevp2 = p2;\n }\n }\n endfacevertices.reverse();\n polygons.push(new CSG.Polygon(startfacevertices));\n polygons.push(new CSG.Polygon(endfacevertices));\n var cylinder = CSG.fromPolygons(polygons);\n result = result.unionSub(cylinder, false, false);\n }\n\n // make a list of all unique vertices\n // For each vertex we also collect the list of normals of the planes touching the vertices\n var vertexmap = {};\n csg.polygons.map(function(polygon) {\n polygon.vertices.map(function(vertex) {\n var vertextag = vertex.getTag();\n var obj;\n if (vertextag in vertexmap) {\n obj = vertexmap[vertextag];\n } else {\n obj = {\n pos: vertex.pos,\n normals: []\n };\n vertexmap[vertextag] = obj;\n }\n obj.normals.push(polygon.plane.normal);\n });\n });\n\n // and build spheres at each vertex\n // We will try to set the x and z axis to the normals of 2 planes\n // This will ensure that our sphere tesselation somewhat matches 2 planes\n for (var vertextag in vertexmap) {\n var vertexobj = vertexmap[vertextag];\n // use the first normal to be the x axis of our sphere:\n var xaxis = vertexobj.normals[0].unit();\n // and find a suitable z axis. We will use the normal which is most perpendicular to the x axis:\n var bestzaxis = null;\n var bestzaxisorthogonality = 0;\n for (var i = 1; i < vertexobj.normals.length; i++) {\n var normal = vertexobj.normals[i].unit();\n var cross = xaxis.cross(normal);\n var crosslength = cross.length();\n if (crosslength > 0.05) {\n if (crosslength > bestzaxisorthogonality) {\n bestzaxisorthogonality = crosslength;\n bestzaxis = normal;\n }\n }\n }\n if (!bestzaxis) {\n bestzaxis = xaxis.randomNonParallelVector();\n }\n var yaxis = xaxis.cross(bestzaxis).unit();\n var zaxis = yaxis.cross(xaxis);\n var sphere = CSG.sphere({\n center: vertexobj.pos,\n radius: radius,\n resolution: resolution,\n axes: [xaxis, yaxis, zaxis]\n });\n result = result.unionSub(sphere, false, false);\n }\n\n return result;\n },\n\n canonicalized: function() {\n if (this.isCanonicalized) {\n return this;\n } else {\n var factory = new CSG.fuzzyCSGFactory();\n var result = factory.getCSG(this);\n result.isCanonicalized = true;\n result.isRetesselated = this.isRetesselated;\n result.properties = this.properties; // keep original properties\n return result;\n }\n },\n\n reTesselated: function() {\n if (this.isRetesselated) {\n return this;\n } else {\n var csg = this;\n var polygonsPerPlane = {};\n var isCanonicalized = csg.isCanonicalized;\n var fuzzyfactory = new CSG.fuzzyCSGFactory();\n csg.polygons.map(function(polygon) {\n var plane = polygon.plane;\n var shared = polygon.shared;\n if (!isCanonicalized) {\n // in order to identify to polygons having the same plane, we need to canonicalize the planes\n // We don't have to do a full canonizalization (including vertices), to save time only do the planes and the shared data:\n plane = fuzzyfactory.getPlane(plane);\n shared = fuzzyfactory.getPolygonShared(shared);\n }\n var tag = plane.getTag() + \"/\" + shared.getTag();\n if (!(tag in polygonsPerPlane)) {\n polygonsPerPlane[tag] = [polygon];\n } else {\n polygonsPerPlane[tag].push(polygon);\n }\n });\n var destpolygons = [];\n for (var planetag in polygonsPerPlane) {\n var sourcepolygons = polygonsPerPlane[planetag];\n if (sourcepolygons.length < 2) {\n destpolygons = destpolygons.concat(sourcepolygons);\n } else {\n var retesselayedpolygons = [];\n CSG.reTesselateCoplanarPolygons(sourcepolygons, retesselayedpolygons);\n destpolygons = destpolygons.concat(retesselayedpolygons);\n }\n }\n var result = CSG.fromPolygons(destpolygons);\n result.isRetesselated = true;\n // result = result.canonicalized();\n result.properties = this.properties; // keep original properties\n return result;\n }\n },\n\n // returns an array of two CSG.Vector3Ds (minimum coordinates and maximum coordinates)\n getBounds: function() {\n if (!this.cachedBoundingBox) {\n var minpoint = new CSG.Vector3D(0, 0, 0);\n var maxpoint = new CSG.Vector3D(0, 0, 0);\n var polygons = this.polygons;\n var numpolygons = polygons.length;\n for (var i = 0; i < numpolygons; i++) {\n var polygon = polygons[i];\n var bounds = polygon.boundingBox();\n if (i === 0) {\n minpoint = bounds[0];\n maxpoint = bounds[1];\n } else {\n minpoint = minpoint.min(bounds[0]);\n maxpoint = maxpoint.max(bounds[1]);\n }\n }\n this.cachedBoundingBox = [minpoint, maxpoint];\n }\n return this.cachedBoundingBox;\n },\n\n // returns true if there is a possibility that the two solids overlap\n // returns false if we can be sure that they do not overlap\n mayOverlap: function(csg) {\n if ((this.polygons.length === 0) || (csg.polygons.length === 0)) {\n return false;\n } else {\n var mybounds = this.getBounds();\n var otherbounds = csg.getBounds();\n if (mybounds[1].x < otherbounds[0].x) return false;\n if (mybounds[0].x > otherbounds[1].x) return false;\n if (mybounds[1].y < otherbounds[0].y) return false;\n if (mybounds[0].y > otherbounds[1].y) return false;\n if (mybounds[1].z < otherbounds[0].z) return false;\n if (mybounds[0].z > otherbounds[1].z) return false;\n return true;\n }\n },\n\n // Cut the solid by a plane. Returns the solid on the back side of the plane\n cutByPlane: function(plane) {\n if (this.polygons.length === 0) {\n return new CSG();\n }\n // Ideally we would like to do an intersection with a polygon of inifinite size\n // but this is not supported by our implementation. As a workaround, we will create\n // a cube, with one face on the plane, and a size larger enough so that the entire\n // solid fits in the cube.\n // find the max distance of any vertex to the center of the plane:\n var planecenter = plane.normal.times(plane.w);\n var maxdistance = 0;\n this.polygons.map(function(polygon) {\n polygon.vertices.map(function(vertex) {\n var distance = vertex.pos.distanceToSquared(planecenter);\n if (distance > maxdistance) maxdistance = distance;\n });\n });\n maxdistance = Math.sqrt(maxdistance);\n maxdistance *= 1.01; // make sure it's really larger\n // Now build a polygon on the plane, at any point farther than maxdistance from the plane center:\n var vertices = [];\n var orthobasis = new CSG.OrthoNormalBasis(plane);\n vertices.push(new CSG.Vertex(orthobasis.to3D(new CSG.Vector2D(maxdistance, -maxdistance))));\n vertices.push(new CSG.Vertex(orthobasis.to3D(new CSG.Vector2D(-maxdistance, -maxdistance))));\n vertices.push(new CSG.Vertex(orthobasis.to3D(new CSG.Vector2D(-maxdistance, maxdistance))));\n vertices.push(new CSG.Vertex(orthobasis.to3D(new CSG.Vector2D(maxdistance, maxdistance))));\n var polygon = new CSG.Polygon(vertices, null, plane.flipped());\n\n // and extrude the polygon into a cube, backwards of the plane:\n var cube = polygon.extrude(plane.normal.times(-maxdistance));\n\n // Now we can do the intersection:\n var result = this.intersect(cube);\n result.properties = this.properties; // keep original properties\n return result;\n },\n\n // Connect a solid to another solid, such that two CSG.Connectors become connected\n // myConnector: a CSG.Connector of this solid\n // otherConnector: a CSG.Connector to which myConnector should be connected\n // mirror: false: the 'axis' vectors of the connectors should point in the same direction\n // true: the 'axis' vectors of the connectors should point in opposite direction\n // normalrotation: degrees of rotation between the 'normal' vectors of the two\n // connectors\n connectTo: function(myConnector, otherConnector, mirror, normalrotation) {\n var matrix = myConnector.getTransformationTo(otherConnector, mirror, normalrotation);\n return this.transform(matrix);\n },\n\n // set the .shared property of all polygons\n // Returns a new CSG solid, the original is unmodified!\n setShared: function(shared) {\n var polygons = this.polygons.map(function(p) {\n return new CSG.Polygon(p.vertices, shared, p.plane);\n });\n var result = CSG.fromPolygons(polygons);\n result.properties = this.properties; // keep original properties\n result.isRetesselated = this.isRetesselated;\n result.isCanonicalized = this.isCanonicalized;\n return result;\n },\n\n setColor: function(args) {\n var newshared = CSG.Polygon.Shared.fromColor.apply(this, arguments);\n return this.setShared(newshared);\n },\n\n toCompactBinary: function() {\n var csg = this.canonicalized(),\n numpolygons = csg.polygons.length,\n numpolygonvertices = 0,\n numvertices = 0,\n vertexmap = {},\n vertices = [],\n numplanes = 0,\n planemap = {},\n polygonindex = 0,\n planes = [],\n shareds = [],\n sharedmap = {},\n numshared = 0;\n // for (var i = 0, iMax = csg.polygons.length; i < iMax; i++) {\n // var p = csg.polygons[i];\n // for (var j = 0, jMax = p.length; j < jMax; j++) {\n // ++numpolygonvertices;\n // var vertextag = p[j].getTag();\n // if(!(vertextag in vertexmap)) {\n // vertexmap[vertextag] = numvertices++;\n // vertices.push(p[j]);\n // }\n // }\n csg.polygons.map(function(p) {\n p.vertices.map(function(v) {\n ++numpolygonvertices;\n var vertextag = v.getTag();\n if (!(vertextag in vertexmap)) {\n vertexmap[vertextag] = numvertices++;\n vertices.push(v);\n }\n });\n\n var planetag = p.plane.getTag();\n if (!(planetag in planemap)) {\n planemap[planetag] = numplanes++;\n planes.push(p.plane);\n }\n var sharedtag = p.shared.getTag();\n if (!(sharedtag in sharedmap)) {\n sharedmap[sharedtag] = numshared++;\n shareds.push(p.shared);\n }\n });\n var numVerticesPerPolygon = new Uint32Array(numpolygons),\n polygonSharedIndexes = new Uint32Array(numpolygons),\n polygonVertices = new Uint32Array(numpolygonvertices),\n polygonPlaneIndexes = new Uint32Array(numpolygons),\n vertexData = new Float64Array(numvertices * 3),\n planeData = new Float64Array(numplanes * 4),\n polygonVerticesIndex = 0;\n for (var polygonindex = 0; polygonindex < numpolygons; ++polygonindex) {\n var p = csg.polygons[polygonindex];\n numVerticesPerPolygon[polygonindex] = p.vertices.length;\n p.vertices.map(function(v) {\n var vertextag = v.getTag();\n var vertexindex = vertexmap[vertextag];\n polygonVertices[polygonVerticesIndex++] = vertexindex;\n });\n var planetag = p.plane.getTag();\n var planeindex = planemap[planetag];\n polygonPlaneIndexes[polygonindex] = planeindex;\n var sharedtag = p.shared.getTag();\n var sharedindex = sharedmap[sharedtag];\n polygonSharedIndexes[polygonindex] = sharedindex;\n }\n var verticesArrayIndex = 0;\n vertices.map(function(v) {\n var pos = v.pos;\n vertexData[verticesArrayIndex++] = pos._x;\n vertexData[verticesArrayIndex++] = pos._y;\n vertexData[verticesArrayIndex++] = pos._z;\n });\n var planesArrayIndex = 0;\n planes.map(function(p) {\n var normal = p.normal;\n planeData[planesArrayIndex++] = normal._x;\n planeData[planesArrayIndex++] = normal._y;\n planeData[planesArrayIndex++] = normal._z;\n planeData[planesArrayIndex++] = p.w;\n });\n var result = {\n \"class\": \"CSG\",\n numPolygons: numpolygons,\n numVerticesPerPolygon: numVerticesPerPolygon,\n polygonPlaneIndexes: polygonPlaneIndexes,\n polygonSharedIndexes: polygonSharedIndexes,\n polygonVertices: polygonVertices,\n vertexData: vertexData,\n planeData: planeData,\n shared: shareds\n };\n return result;\n },\n\n // For debugging\n // Creates a new solid with a tiny cube at every vertex of the source solid\n toPointCloud: function(cuberadius) {\n var csg = this.reTesselated();\n\n var result = new CSG();\n\n // make a list of all unique vertices\n // For each vertex we also collect the list of normals of the planes touching the vertices\n var vertexmap = {};\n csg.polygons.map(function(polygon) {\n polygon.vertices.map(function(vertex) {\n vertexmap[vertex.getTag()] = vertex.pos;\n });\n });\n\n for (var vertextag in vertexmap) {\n var pos = vertexmap[vertextag];\n var cube = CSG.cube({\n center: pos,\n radius: cuberadius\n });\n result = result.unionSub(cube, false, false);\n }\n result = result.reTesselated();\n return result;\n },\n\n // Get the transformation that transforms this CSG such that it is lying on the z=0 plane,\n // as flat as possible (i.e. the least z-height).\n // So that it is in an orientation suitable for CNC milling\n getTransformationAndInverseTransformationToFlatLying: function() {\n if (this.polygons.length === 0) {\n var m = new CSG.Matrix4x4(); // unity\n return [m,m];\n } else {\n // get a list of unique planes in the CSG:\n var csg = this.canonicalized();\n var planemap = {};\n csg.polygons.map(function(polygon) {\n planemap[polygon.plane.getTag()] = polygon.plane;\n });\n // try each plane in the CSG and find the plane that, when we align it flat onto z=0,\n // gives the least height in z-direction.\n // If two planes give the same height, pick the plane that originally had a normal closest\n // to [0,0,-1].\n var xvector = new CSG.Vector3D(1, 0, 0);\n var yvector = new CSG.Vector3D(0, 1, 0);\n var zvector = new CSG.Vector3D(0, 0, 1);\n var z0connectorx = new CSG.Connector([0, 0, 0], [0, 0, -1], xvector);\n var z0connectory = new CSG.Connector([0, 0, 0], [0, 0, -1], yvector);\n var isfirst = true;\n var minheight = 0;\n var maxdotz = 0;\n var besttransformation, bestinversetransformation;\n for (var planetag in planemap) {\n var plane = planemap[planetag];\n var pointonplane = plane.normal.times(plane.w);\n var transformation, inversetransformation;\n // We need a normal vecrtor for the transformation\n // determine which is more perpendicular to the plane normal: x or y?\n // we will align this as much as possible to the x or y axis vector\n var xorthogonality = plane.normal.cross(xvector).length();\n var yorthogonality = plane.normal.cross(yvector).length();\n if (xorthogonality > yorthogonality) {\n // x is better:\n var planeconnector = new CSG.Connector(pointonplane, plane.normal, xvector);\n transformation = planeconnector.getTransformationTo(z0connectorx, false, 0);\n inversetransformation = z0connectorx.getTransformationTo(planeconnector, false, 0);\n } else {\n // y is better:\n var planeconnector = new CSG.Connector(pointonplane, plane.normal, yvector);\n transformation = planeconnector.getTransformationTo(z0connectory, false, 0);\n inversetransformation = z0connectory.getTransformationTo(planeconnector, false, 0);\n }\n var transformedcsg = csg.transform(transformation);\n var dotz = -plane.normal.dot(zvector);\n var bounds = transformedcsg.getBounds();\n var zheight = bounds[1].z - bounds[0].z;\n var isbetter = isfirst;\n if (!isbetter) {\n if (zheight < minheight) {\n isbetter = true;\n } else if (zheight == minheight) {\n if (dotz > maxdotz) isbetter = true;\n }\n }\n if (isbetter) {\n // translate the transformation around the z-axis and onto the z plane:\n var translation = new CSG.Vector3D([-0.5 * (bounds[1].x + bounds[0].x), -0.5 * (bounds[1].y + bounds[0].y), -bounds[0].z]);\n transformation = transformation.multiply(CSG.Matrix4x4.translation(translation));\n inversetransformation = CSG.Matrix4x4.translation(translation.negated()).multiply(inversetransformation);\n minheight = zheight;\n maxdotz = dotz;\n besttransformation = transformation;\n bestinversetransformation = inversetransformation;\n }\n isfirst = false;\n }\n return [besttransformation, bestinversetransformation];\n }\n },\n\n getTransformationToFlatLying: function() {\n var result = this.getTransformationAndInverseTransformationToFlatLying();\n return result[0];\n },\n\n lieFlat: function() {\n var transformation = this.getTransformationToFlatLying();\n return this.transform(transformation);\n },\n\n // project the 3D CSG onto a plane\n // This returns a 2D CAG with the 'shadow' shape of the 3D solid when projected onto the\n // plane represented by the orthonormal basis\n projectToOrthoNormalBasis: function(orthobasis) {\n var EPS = 1e-5;\n var cags = [];\n this.polygons.filter(function(p) {\n // only return polys in plane, others may disturb result\n return p.plane.normal.minus(orthobasis.plane.normal).lengthSquared() < EPS*EPS;\n })\n .map(function(polygon) {\n var cag = polygon.projectToOrthoNormalBasis(orthobasis);\n if (cag.sides.length > 0) {\n cags.push(cag);\n }\n });\n var result = new CAG().union(cags);\n return result;\n },\n\n sectionCut: function(orthobasis) {\n var EPS = 1e-5;\n var plane1 = orthobasis.plane;\n var plane2 = orthobasis.plane.flipped();\n plane1 = new CSG.Plane(plane1.normal, plane1.w);\n plane2 = new CSG.Plane(plane2.normal, plane2.w + 5*EPS);\n var cut3d = this.cutByPlane(plane1);\n cut3d = cut3d.cutByPlane(plane2);\n return cut3d.projectToOrthoNormalBasis(orthobasis);\n },\n\n /*\n fixTJunctions:\n\n Suppose we have two polygons ACDB and EDGF:\n\n A-----B\n | |\n | E--F\n | | |\n C-----D--G\n\n Note that vertex E forms a T-junction on the side BD. In this case some STL slicers will complain\n that the solid is not watertight. This is because the watertightness check is done by checking if\n each side DE is matched by another side ED.\n\n This function will return a new solid with ACDB replaced by ACDEB\n\n Note that this can create polygons that are slightly non-convex (due to rounding errors). Therefore the result should\n not be used for further CSG operations!\n */\n fixTJunctions: function() {\n var csg = this.canonicalized();\n var sidemap = {};\n for (var polygonindex = 0; polygonindex < csg.polygons.length; polygonindex++) {\n var polygon = csg.polygons[polygonindex];\n var numvertices = polygon.vertices.length;\n if (numvertices >= 3) // should be true\n {\n var vertex = polygon.vertices[0];\n var vertextag = vertex.getTag();\n for (var vertexindex = 0; vertexindex < numvertices; vertexindex++) {\n var nextvertexindex = vertexindex + 1;\n if (nextvertexindex == numvertices) nextvertexindex = 0;\n var nextvertex = polygon.vertices[nextvertexindex];\n var nextvertextag = nextvertex.getTag();\n var sidetag = vertextag + \"/\" + nextvertextag;\n var reversesidetag = nextvertextag + \"/\" + vertextag;\n if (reversesidetag in sidemap) {\n // this side matches the same side in another polygon. Remove from sidemap:\n var ar = sidemap[reversesidetag];\n ar.splice(-1, 1);\n if (ar.length === 0) {\n delete sidemap[reversesidetag];\n }\n } else {\n var sideobj = {\n vertex0: vertex,\n vertex1: nextvertex,\n polygonindex: polygonindex\n };\n if (!(sidetag in sidemap)) {\n sidemap[sidetag] = [sideobj];\n } else {\n sidemap[sidetag].push(sideobj);\n }\n }\n vertex = nextvertex;\n vertextag = nextvertextag;\n }\n }\n }\n // now sidemap contains 'unmatched' sides\n // i.e. side AB in one polygon does not have a matching side BA in another polygon\n var vertextag2sidestart = {};\n var vertextag2sideend = {};\n var sidestocheck = {};\n var sidemapisempty = true;\n for (var sidetag in sidemap) {\n sidemapisempty = false;\n sidestocheck[sidetag] = true;\n sidemap[sidetag].map(function(sideobj) {\n var starttag = sideobj.vertex0.getTag();\n var endtag = sideobj.vertex1.getTag();\n if (starttag in vertextag2sidestart) {\n vertextag2sidestart[starttag].push(sidetag);\n } else {\n vertextag2sidestart[starttag] = [sidetag];\n }\n if (endtag in vertextag2sideend) {\n vertextag2sideend[endtag].push(sidetag);\n } else {\n vertextag2sideend[endtag] = [sidetag];\n }\n });\n }\n\n if (!sidemapisempty) {\n // make a copy of the polygons array, since we are going to modify it:\n var polygons = csg.polygons.slice(0);\n\n function addSide(vertex0, vertex1, polygonindex) {\n var starttag = vertex0.getTag();\n var endtag = vertex1.getTag();\n if (starttag == endtag) throw new Error(\"Assertion failed\");\n var newsidetag = starttag + \"/\" + endtag;\n var reversesidetag = endtag + \"/\" + starttag;\n if (reversesidetag in sidemap) {\n // we have a matching reverse oriented side.\n // Instead of adding the new side, cancel out the reverse side:\n // console.log(\"addSide(\"+newsidetag+\") has reverse side:\");\n deleteSide(vertex1, vertex0, null);\n return null;\n }\n // console.log(\"addSide(\"+newsidetag+\")\");\n var newsideobj = {\n vertex0: vertex0,\n vertex1: vertex1,\n polygonindex: polygonindex\n };\n if (!(newsidetag in sidemap)) {\n sidemap[newsidetag] = [newsideobj];\n } else {\n sidemap[newsidetag].push(newsideobj);\n }\n if (starttag in vertextag2sidestart) {\n vertextag2sidestart[starttag].push(newsidetag);\n } else {\n vertextag2sidestart[starttag] = [newsidetag];\n }\n if (endtag in vertextag2sideend) {\n vertextag2sideend[endtag].push(newsidetag);\n } else {\n vertextag2sideend[endtag] = [newsidetag];\n }\n return newsidetag;\n }\n\n function deleteSide(vertex0, vertex1, polygonindex) {\n var starttag = vertex0.getTag();\n var endtag = vertex1.getTag();\n var sidetag = starttag + \"/\" + endtag;\n // console.log(\"deleteSide(\"+sidetag+\")\");\n if (!(sidetag in sidemap)) throw new Error(\"Assertion failed\");\n var idx = -1;\n var sideobjs = sidemap[sidetag];\n for (var i = 0; i < sideobjs.length; i++) {\n var sideobj = sideobjs[i];\n if (sideobj.vertex0 != vertex0) continue;\n if (sideobj.vertex1 != vertex1) continue;\n if (polygonindex !== null) {\n if (sideobj.polygonindex != polygonindex) continue;\n }\n idx = i;\n break;\n }\n if (idx < 0) throw new Error(\"Assertion failed\");\n sideobjs.splice(idx, 1);\n if (sideobjs.length === 0) {\n delete sidemap[sidetag];\n }\n idx = vertextag2sidestart[starttag].indexOf(sidetag);\n if (idx < 0) throw new Error(\"Assertion failed\");\n vertextag2sidestart[starttag].splice(idx, 1);\n if (vertextag2sidestart[starttag].length === 0) {\n delete vertextag2sidestart[starttag];\n }\n\n idx = vertextag2sideend[endtag].indexOf(sidetag);\n if (idx < 0) throw new Error(\"Assertion failed\");\n vertextag2sideend[endtag].splice(idx, 1);\n if (vertextag2sideend[endtag].length === 0) {\n delete vertextag2sideend[endtag];\n }\n }\n\n\n while (true) {\n var sidemapisempty = true;\n for (var sidetag in sidemap) {\n sidemapisempty = false;\n sidestocheck[sidetag] = true;\n }\n if (sidemapisempty) break;\n var donesomething = false;\n while (true) {\n var sidetagtocheck = null;\n for (var sidetag in sidestocheck) {\n sidetagtocheck = sidetag;\n break;\n }\n if (sidetagtocheck === null) break; // sidestocheck is empty, we're done!\n var donewithside = true;\n if (sidetagtocheck in sidemap) {\n var sideobjs = sidemap[sidetagtocheck];\n if (sideobjs.length === 0) throw new Error(\"Assertion failed\");\n var sideobj = sideobjs[0];\n for (var directionindex = 0; directionindex < 2; directionindex++) {\n var startvertex = (directionindex === 0) ? sideobj.vertex0 : sideobj.vertex1;\n var endvertex = (directionindex === 0) ? sideobj.vertex1 : sideobj.vertex0;\n var startvertextag = startvertex.getTag();\n var endvertextag = endvertex.getTag();\n var matchingsides = [];\n if (directionindex === 0) {\n if (startvertextag in vertextag2sideend) {\n matchingsides = vertextag2sideend[startvertextag];\n }\n } else {\n if (startvertextag in vertextag2sidestart) {\n matchingsides = vertextag2sidestart[startvertextag];\n }\n }\n for (var matchingsideindex = 0; matchingsideindex < matchingsides.length; matchingsideindex++) {\n var matchingsidetag = matchingsides[matchingsideindex];\n var matchingside = sidemap[matchingsidetag][0];\n var matchingsidestartvertex = (directionindex === 0) ? matchingside.vertex0 : matchingside.vertex1;\n var matchingsideendvertex = (directionindex === 0) ? matchingside.vertex1 : matchingside.vertex0;\n var matchingsidestartvertextag = matchingsidestartvertex.getTag();\n var matchingsideendvertextag = matchingsideendvertex.getTag();\n if (matchingsideendvertextag != startvertextag) throw new Error(\"Assertion failed\");\n if (matchingsidestartvertextag == endvertextag) {\n // matchingside cancels sidetagtocheck\n deleteSide(startvertex, endvertex, null);\n deleteSide(endvertex, startvertex, null);\n donewithside = false;\n directionindex = 2; // skip reverse direction check\n donesomething = true;\n break;\n } else {\n var startpos = startvertex.pos;\n var endpos = endvertex.pos;\n var checkpos = matchingsidestartvertex.pos;\n var direction = checkpos.minus(startpos);\n // Now we need to check if endpos is on the line startpos-checkpos:\n var t = endpos.minus(startpos).dot(direction) / direction.dot(direction);\n if ((t > 0) && (t < 1)) {\n var closestpoint = startpos.plus(direction.times(t));\n var distancesquared = closestpoint.distanceToSquared(endpos);\n if (distancesquared < 1e-10) {\n // Yes it's a t-junction! We need to split matchingside in two:\n var polygonindex = matchingside.polygonindex;\n var polygon = polygons[polygonindex];\n // find the index of startvertextag in polygon:\n var insertionvertextag = matchingside.vertex1.getTag();\n var insertionvertextagindex = -1;\n for (var i = 0; i < polygon.vertices.length; i++) {\n if (polygon.vertices[i].getTag() == insertionvertextag) {\n insertionvertextagindex = i;\n break;\n }\n }\n if (insertionvertextagindex < 0) throw new Error(\"Assertion failed\");\n // split the side by inserting the vertex:\n var newvertices = polygon.vertices.slice(0);\n newvertices.splice(insertionvertextagindex, 0, endvertex);\n var newpolygon = new CSG.Polygon(newvertices, polygon.shared /*polygon.plane*/ );\n\n// FIX\n //calculate plane with differents point\n if(isNaN(newpolygon.plane.w)){\n\n var found = false,\n loop = function(callback){\n newpolygon.vertices.forEach(function(item){\n if(found) return;\n callback(item);\n })\n };\n\n loop(function(a){\n loop(function(b) {\n loop(function (c) {\n newpolygon.plane = CSG.Plane.fromPoints(a.pos, b.pos, c.pos)\n if(!isNaN(newpolygon.plane.w)) {\n found = true;\n }\n })\n })\n })\n }\n// FIX\n\n polygons[polygonindex] = newpolygon;\n\n // remove the original sides from our maps:\n // deleteSide(sideobj.vertex0, sideobj.vertex1, null);\n deleteSide(matchingside.vertex0, matchingside.vertex1, polygonindex);\n var newsidetag1 = addSide(matchingside.vertex0, endvertex, polygonindex);\n var newsidetag2 = addSide(endvertex, matchingside.vertex1, polygonindex);\n if (newsidetag1 !== null) sidestocheck[newsidetag1] = true;\n if (newsidetag2 !== null) sidestocheck[newsidetag2] = true;\n donewithside = false;\n directionindex = 2; // skip reverse direction check\n donesomething = true;\n break;\n } // if(distancesquared < 1e-10)\n } // if( (t > 0) && (t < 1) )\n } // if(endingstidestartvertextag == endvertextag)\n } // for matchingsideindex\n } // for directionindex\n } // if(sidetagtocheck in sidemap)\n if (donewithside) {\n delete sidestocheck[sidetag];\n }\n }\n if (!donesomething) break;\n }\n var newcsg = CSG.fromPolygons(polygons);\n newcsg.properties = csg.properties;\n newcsg.isCanonicalized = true;\n newcsg.isRetesselated = true;\n csg = newcsg;\n } // if(!sidemapisempty)\n var sidemapisempty = true;\n for (var sidetag in sidemap) {\n sidemapisempty = false;\n break;\n }\n if (!sidemapisempty) {\n // throw new Error(\"!sidemapisempty\");\n OpenJsCad.log(\"!sidemapisempty\");\n }\n return csg;\n },\n\n toTriangles: function() {\n var polygons = [];\n this.polygons.forEach(function(poly) {\n var firstVertex = poly.vertices[0];\n for (var i = poly.vertices.length - 3; i >= 0; i--) {\n polygons.push(new CSG.Polygon([\n firstVertex, poly.vertices[i + 1], poly.vertices[i + 2]\n ],\n poly.shared, poly.plane));\n }\n });\n return polygons;\n },\n\n // features: string, or array containing 1 or more strings of: 'volume', 'area'\n // more could be added here (Fourier coeff, moments)\n getFeatures: function(features) {\n if (!(features instanceof Array)) {\n features = [features];\n }\n var result = this.toTriangles().map(function(triPoly) {\n return triPoly.getTetraFeatures(features);\n })\n .reduce(function(pv, v) {\n return v.map(function(feat, i) {\n return feat + (pv === 0 ? 0 : pv[i]);\n });\n }, 0);\n return (result.length == 1) ? result[0] : result;\n }\n };\n\n // Parse an option from the options object\n // If the option is not present, return the default value\n CSG.parseOption = function(options, optionname, defaultvalue) {\n var result = defaultvalue;\n if (options) {\n if (optionname in options) {\n result = options[optionname];\n }\n }\n return result;\n };\n\n // Parse an option and force into a CSG.Vector3D. If a scalar is passed it is converted\n // into a vector with equal x,y,z\n CSG.parseOptionAs3DVector = function(options, optionname, defaultvalue) {\n var result = CSG.parseOption(options, optionname, defaultvalue);\n result = new CSG.Vector3D(result);\n return result;\n };\n\n CSG.parseOptionAs3DVectorList = function(options, optionname, defaultvalue) {\n var result = CSG.parseOption(options, optionname, defaultvalue);\n return result.map(function(res) {\n return new CSG.Vector3D(res);\n });\n };\n\n // Parse an option and force into a CSG.Vector2D. If a scalar is passed it is converted\n // into a vector with equal x,y\n CSG.parseOptionAs2DVector = function(options, optionname, defaultvalue) {\n var result = CSG.parseOption(options, optionname, defaultvalue);\n result = new CSG.Vector2D(result);\n return result;\n };\n\n CSG.parseOptionAsFloat = function(options, optionname, defaultvalue) {\n var result = CSG.parseOption(options, optionname, defaultvalue);\n if (typeof(result) == \"string\") {\n result = Number(result);\n }\n if (isNaN(result) || typeof(result) != \"number\") {\n throw new Error(\"Parameter \" + optionname + \" should be a number\");\n }\n return result;\n };\n\n CSG.parseOptionAsInt = function(options, optionname, defaultvalue) {\n var result = CSG.parseOption(options, optionname, defaultvalue);\n result = Number(Math.floor(result));\n if (isNaN(result)) {\n throw new Error(\"Parameter \" + optionname + \" should be a number\");\n }\n return result;\n };\n\n CSG.parseOptionAsBool = function(options, optionname, defaultvalue) {\n var result = CSG.parseOption(options, optionname, defaultvalue);\n if (typeof(result) == \"string\") {\n if (result == \"true\") result = true;\n else if (result == \"false\") result = false;\n else if (result == 0) result = false;\n }\n result = !!result;\n return result;\n };\n\n // Construct an axis-aligned solid cuboid.\n // Parameters:\n // center: center of cube (default [0,0,0])\n // radius: radius of cube (default [1,1,1]), can be specified as scalar or as 3D vector\n //\n // Example code:\n //\n // var cube = CSG.cube({\n // center: [0, 0, 0],\n // radius: 1\n // });\n CSG.cube = function(options) {\n var c, r;\n options = options || {};\n if (('corner1' in options) || ('corner2' in options)) {\n if (('center' in options) || ('radius' in options)) {\n throw new Error(\"cube: should either give a radius and center parameter, or a corner1 and corner2 parameter\")\n }\n corner1 = CSG.parseOptionAs3DVector(options, \"corner1\", [0, 0, 0]);\n corner2 = CSG.parseOptionAs3DVector(options, \"corner2\", [1, 1, 1]);\n c = corner1.plus(corner2).times(0.5);\n r = corner2.minus(corner1).times(0.5);\n } else {\n c = CSG.parseOptionAs3DVector(options, \"center\", [0, 0, 0]);\n r = CSG.parseOptionAs3DVector(options, \"radius\", [1, 1, 1]);\n }\n r = r.abs(); // negative radii make no sense\n var result = CSG.fromPolygons([\n [\n [0, 4, 6, 2],\n [-1, 0, 0]\n ],\n [\n [1, 3, 7, 5],\n [+1, 0, 0]\n ],\n [\n [0, 1, 5, 4],\n [0, -1, 0]\n ],\n [\n [2, 6, 7, 3],\n [0, +1, 0]\n ],\n [\n [0, 2, 3, 1],\n [0, 0, -1]\n ],\n [\n [4, 5, 7, 6],\n [0, 0, +1]\n ]\n ].map(function(info) {\n //var normal = new CSG.Vector3D(info[1]);\n //var plane = new CSG.Plane(normal, 1);\n var vertices = info[0].map(function(i) {\n var pos = new CSG.Vector3D(\n c.x + r.x * (2 * !!(i & 1) - 1), c.y + r.y * (2 * !!(i & 2) - 1), c.z + r.z * (2 * !!(i & 4) - 1));\n return new CSG.Vertex(pos);\n });\n return new CSG.Polygon(vertices, null /* , plane */ );\n }));\n result.properties.cube = new CSG.Properties();\n result.properties.cube.center = new CSG.Vector3D(c);\n // add 6 connectors, at the centers of each face:\n result.properties.cube.facecenters = [\n new CSG.Connector(new CSG.Vector3D([r.x, 0, 0]).plus(c), [1, 0, 0], [0, 0, 1]),\n new CSG.Connector(new CSG.Vector3D([-r.x, 0, 0]).plus(c), [-1, 0, 0], [0, 0, 1]),\n new CSG.Connector(new CSG.Vector3D([0, r.y, 0]).plus(c), [0, 1, 0], [0, 0, 1]),\n new CSG.Connector(new CSG.Vector3D([0, -r.y, 0]).plus(c), [0, -1, 0], [0, 0, 1]),\n new CSG.Connector(new CSG.Vector3D([0, 0, r.z]).plus(c), [0, 0, 1], [1, 0, 0]),\n new CSG.Connector(new CSG.Vector3D([0, 0, -r.z]).plus(c), [0, 0, -1], [1, 0, 0])\n ];\n return result;\n };\n\n // Construct a solid sphere\n //\n // Parameters:\n // center: center of sphere (default [0,0,0])\n // radius: radius of sphere (default 1), must be a scalar\n // resolution: determines the number of polygons per 360 degree revolution (default 12)\n // axes: (optional) an array with 3 vectors for the x, y and z base vectors\n //\n // Example usage:\n //\n // var sphere = CSG.sphere({\n // center: [0, 0, 0],\n // radius: 2,\n // resolution: 32,\n // });\n CSG.sphere = function(options) {\n options = options || {};\n var center = CSG.parseOptionAs3DVector(options, \"center\", [0, 0, 0]);\n var radius = CSG.parseOptionAsFloat(options, \"radius\", 1);\n var resolution = CSG.parseOptionAsInt(options, \"resolution\", CSG.defaultResolution3D);\n var xvector, yvector, zvector;\n if ('axes' in options) {\n xvector = options.axes[0].unit().times(radius);\n yvector = options.axes[1].unit().times(radius);\n zvector = options.axes[2].unit().times(radius);\n } else {\n xvector = new CSG.Vector3D([1, 0, 0]).times(radius);\n yvector = new CSG.Vector3D([0, -1, 0]).times(radius);\n zvector = new CSG.Vector3D([0, 0, 1]).times(radius);\n }\n if (resolution < 4) resolution = 4;\n var qresolution = Math.round(resolution / 4);\n var prevcylinderpoint;\n var polygons = [];\n for (var slice1 = 0; slice1 <= resolution; slice1++) {\n var angle = Math.PI * 2.0 * slice1 / resolution;\n var cylinderpoint = xvector.times(Math.cos(angle)).plus(yvector.times(Math.sin(angle)));\n if (slice1 > 0) {\n // cylinder vertices:\n var vertices = [];\n var prevcospitch, prevsinpitch;\n for (var slice2 = 0; slice2 <= qresolution; slice2++) {\n var pitch = 0.5 * Math.PI * slice2 / qresolution;\n var cospitch = Math.cos(pitch);\n var sinpitch = Math.sin(pitch);\n if (slice2 > 0) {\n vertices = [];\n vertices.push(new CSG.Vertex(center.plus(prevcylinderpoint.times(prevcospitch).minus(zvector.times(prevsinpitch)))));\n vertices.push(new CSG.Vertex(center.plus(cylinderpoint.times(prevcospitch).minus(zvector.times(prevsinpitch)))));\n if (slice2 < qresolution) {\n vertices.push(new CSG.Vertex(center.plus(cylinderpoint.times(cospitch).minus(zvector.times(sinpitch)))));\n }\n vertices.push(new CSG.Vertex(center.plus(prevcylinderpoint.times(cospitch).minus(zvector.times(sinpitch)))));\n polygons.push(new CSG.Polygon(vertices));\n vertices = [];\n vertices.push(new CSG.Vertex(center.plus(prevcylinderpoint.times(prevcospitch).plus(zvector.times(prevsinpitch)))));\n vertices.push(new CSG.Vertex(center.plus(cylinderpoint.times(prevcospitch).plus(zvector.times(prevsinpitch)))));\n if (slice2 < qresolution) {\n vertices.push(new CSG.Vertex(center.plus(cylinderpoint.times(cospitch).plus(zvector.times(sinpitch)))));\n }\n vertices.push(new CSG.Vertex(center.plus(prevcylinderpoint.times(cospitch).plus(zvector.times(sinpitch)))));\n vertices.reverse();\n polygons.push(new CSG.Polygon(vertices));\n }\n prevcospitch = cospitch;\n prevsinpitch = sinpitch;\n }\n }\n prevcylinderpoint = cylinderpoint;\n }\n var result = CSG.fromPolygons(polygons);\n result.properties.sphere = new CSG.Properties();\n result.properties.sphere.center = new CSG.Vector3D(center);\n result.properties.sphere.facepoint = center.plus(xvector);\n return result;\n };\n\n // Construct a solid cylinder.\n //\n // Parameters:\n // start: start point of cylinder (default [0, -1, 0])\n // end: end point of cylinder (default [0, 1, 0])\n // radius: radius of cylinder (default 1), must be a scalar\n // resolution: determines the number of polygons per 360 degree revolution (default 12)\n //\n // Example usage:\n //\n // var cylinder = CSG.cylinder({\n // start: [0, -1, 0],\n // end: [0, 1, 0],\n // radius: 1,\n // resolution: 16\n // });\n CSG.cylinder = function(options) {\n var s = CSG.parseOptionAs3DVector(options, \"start\", [0, -1, 0]);\n var e = CSG.parseOptionAs3DVector(options, \"end\", [0, 1, 0]);\n var r = CSG.parseOptionAsFloat(options, \"radius\", 1);\n var rEnd = CSG.parseOptionAsFloat(options, \"radiusEnd\", r);\n var rStart = CSG.parseOptionAsFloat(options, \"radiusStart\", r);\n var alpha = CSG.parseOptionAsFloat(options, \"sectorAngle\", 360);\n alpha = alpha > 360 ? alpha % 360 : alpha;\n\n if ((rEnd < 0) || (rStart < 0)) {\n throw new Error(\"Radius should be non-negative\");\n }\n if ((rEnd === 0) && (rStart === 0)) {\n throw new Error(\"Either radiusStart or radiusEnd should be positive\");\n }\n\n var slices = CSG.parseOptionAsInt(options, \"resolution\", CSG.defaultResolution2D);\n var ray = e.minus(s);\n var axisZ = ray.unit(); //, isY = (Math.abs(axisZ.y) > 0.5);\n var axisX = axisZ.randomNonParallelVector().unit();\n\n // var axisX = new CSG.Vector3D(isY, !isY, 0).cross(axisZ).unit();\n var axisY = axisX.cross(axisZ).unit();\n var start = new CSG.Vertex(s);\n var end = new CSG.Vertex(e);\n var polygons = [];\n\n function point(stack, slice, radius) {\n var angle = slice * Math.PI * alpha / 180;\n var out = axisX.times(Math.cos(angle)).plus(axisY.times(Math.sin(angle)));\n var pos = s.plus(ray.times(stack)).plus(out.times(radius));\n return new CSG.Vertex(pos);\n }\n if (alpha > 0) {\n for (var i = 0; i < slices; i++) {\n var t0 = i / slices,\n t1 = (i + 1) / slices;\n if (rEnd == rStart) {\n polygons.push(new CSG.Polygon([start, point(0, t0, rEnd), point(0, t1, rEnd)]));\n polygons.push(new CSG.Polygon([point(0, t1, rEnd), point(0, t0, rEnd), point(1, t0, rEnd), point(1, t1, rEnd)]));\n polygons.push(new CSG.Polygon([end, point(1, t1, rEnd), point(1, t0, rEnd)]));\n } else {\n if (rStart > 0) {\n polygons.push(new CSG.Polygon([start, point(0, t0, rStart), point(0, t1, rStart)]));\n polygons.push(new CSG.Polygon([point(0, t0, rStart), point(1, t0, rEnd), point(0, t1, rStart)]));\n }\n if (rEnd > 0) {\n polygons.push(new CSG.Polygon([end, point(1, t1, rEnd), point(1, t0, rEnd)]));\n polygons.push(new CSG.Polygon([point(1, t0, rEnd), point(1, t1, rEnd), point(0, t1, rStart)]));\n }\n }\n }\n if (alpha < 360) {\n polygons.push(new CSG.Polygon([start, end, point(0, 0, rStart)]));\n polygons.push(new CSG.Polygon([point(0, 0, rStart), end, point(1, 0, rEnd)]));\n polygons.push(new CSG.Polygon([start, point(0, 1, rStart), end]));\n polygons.push(new CSG.Polygon([point(0, 1, rStart), point(1, 1, rEnd), end]));\n }\n }\n var result = CSG.fromPolygons(polygons);\n result.properties.cylinder = new CSG.Properties();\n result.properties.cylinder.start = new CSG.Connector(s, axisZ.negated(), axisX);\n result.properties.cylinder.end = new CSG.Connector(e, axisZ, axisX);\n var cylCenter = s.plus(ray.times(0.5));\n var fptVec = axisX.rotate(s, axisZ, -alpha / 2).times((rStart + rEnd) / 2);\n var fptVec90 = fptVec.cross(axisZ);\n // note this one is NOT a face normal for a cone. - It's horizontal from cyl perspective\n result.properties.cylinder.facepointH = new CSG.Connector(cylCenter.plus(fptVec), fptVec, axisZ);\n result.properties.cylinder.facepointH90 = new CSG.Connector(cylCenter.plus(fptVec90), fptVec90, axisZ);\n return result;\n };\n\n // Like a cylinder, but with rounded ends instead of flat\n //\n // Parameters:\n // start: start point of cylinder (default [0, -1, 0])\n // end: end point of cylinder (default [0, 1, 0])\n // radius: radius of cylinder (default 1), must be a scalar\n // resolution: determines the number of polygons per 360 degree revolution (default 12)\n // normal: a vector determining the starting angle for tesselation. Should be non-parallel to start.minus(end)\n //\n // Example usage:\n //\n // var cylinder = CSG.roundedCylinder({\n // start: [0, -1, 0],\n // end: [0, 1, 0],\n // radius: 1,\n // resolution: 16\n // });\n CSG.roundedCylinder = function(options) {\n var p1 = CSG.parseOptionAs3DVector(options, \"start\", [0, -1, 0]);\n var p2 = CSG.parseOptionAs3DVector(options, \"end\", [0, 1, 0]);\n var radius = CSG.parseOptionAsFloat(options, \"radius\", 1);\n var direction = p2.minus(p1);\n var defaultnormal;\n if (Math.abs(direction.x) > Math.abs(direction.y)) {\n defaultnormal = new CSG.Vector3D(0, 1, 0);\n } else {\n defaultnormal = new CSG.Vector3D(1, 0, 0);\n }\n var normal = CSG.parseOptionAs3DVector(options, \"normal\", defaultnormal);\n var resolution = CSG.parseOptionAsInt(options, \"resolution\", CSG.defaultResolution3D);\n if (resolution < 4) resolution = 4;\n var polygons = [];\n var qresolution = Math.floor(0.25 * resolution);\n var length = direction.length();\n if (length < 1e-10) {\n return CSG.sphere({\n center: p1,\n radius: radius,\n resolution: resolution\n });\n }\n var zvector = direction.unit().times(radius);\n var xvector = zvector.cross(normal).unit().times(radius);\n var yvector = xvector.cross(zvector).unit().times(radius);\n var prevcylinderpoint;\n for (var slice1 = 0; slice1 <= resolution; slice1++) {\n var angle = Math.PI * 2.0 * slice1 / resolution;\n var cylinderpoint = xvector.times(Math.cos(angle)).plus(yvector.times(Math.sin(angle)));\n if (slice1 > 0) {\n // cylinder vertices:\n var vertices = [];\n vertices.push(new CSG.Vertex(p1.plus(cylinderpoint)));\n vertices.push(new CSG.Vertex(p1.plus(prevcylinderpoint)));\n vertices.push(new CSG.Vertex(p2.plus(prevcylinderpoint)));\n vertices.push(new CSG.Vertex(p2.plus(cylinderpoint)));\n polygons.push(new CSG.Polygon(vertices));\n var prevcospitch, prevsinpitch;\n for (var slice2 = 0; slice2 <= qresolution; slice2++) {\n var pitch = 0.5 * Math.PI * slice2 / qresolution;\n //var pitch = Math.asin(slice2/qresolution);\n var cospitch = Math.cos(pitch);\n var sinpitch = Math.sin(pitch);\n if (slice2 > 0) {\n vertices = [];\n vertices.push(new CSG.Vertex(p1.plus(prevcylinderpoint.times(prevcospitch).minus(zvector.times(prevsinpitch)))));\n vertices.push(new CSG.Vertex(p1.plus(cylinderpoint.times(prevcospitch).minus(zvector.times(prevsinpitch)))));\n if (slice2 < qresolution) {\n vertices.push(new CSG.Vertex(p1.plus(cylinderpoint.times(cospitch).minus(zvector.times(sinpitch)))));\n }\n vertices.push(new CSG.Vertex(p1.plus(prevcylinderpoint.times(cospitch).minus(zvector.times(sinpitch)))));\n polygons.push(new CSG.Polygon(vertices));\n vertices = [];\n vertices.push(new CSG.Vertex(p2.plus(prevcylinderpoint.times(prevcospitch).plus(zvector.times(prevsinpitch)))));\n vertices.push(new CSG.Vertex(p2.plus(cylinderpoint.times(prevcospitch).plus(zvector.times(prevsinpitch)))));\n if (slice2 < qresolution) {\n vertices.push(new CSG.Vertex(p2.plus(cylinderpoint.times(cospitch).plus(zvector.times(sinpitch)))));\n }\n vertices.push(new CSG.Vertex(p2.plus(prevcylinderpoint.times(cospitch).plus(zvector.times(sinpitch)))));\n vertices.reverse();\n polygons.push(new CSG.Polygon(vertices));\n }\n prevcospitch = cospitch;\n prevsinpitch = sinpitch;\n }\n }\n prevcylinderpoint = cylinderpoint;\n }\n var result = CSG.fromPolygons(polygons);\n var ray = zvector.unit();\n var axisX = xvector.unit();\n result.properties.roundedCylinder = new CSG.Properties();\n result.properties.roundedCylinder.start = new CSG.Connector(p1, ray.negated(), axisX);\n result.properties.roundedCylinder.end = new CSG.Connector(p2, ray, axisX);\n result.properties.roundedCylinder.facepoint = p1.plus(xvector);\n return result;\n };\n\n // Construct an axis-aligned solid rounded cuboid.\n // Parameters:\n // center: center of cube (default [0,0,0])\n // radius: radius of cube (default [1,1,1]), can be specified as scalar or as 3D vector\n // roundradius: radius of rounded corners (default 0.2), must be a scalar\n // resolution: determines the number of polygons per 360 degree revolution (default 8)\n //\n // Example code:\n //\n // var cube = CSG.roundedCube({\n // center: [0, 0, 0],\n // radius: 1,\n // roundradius: 0.2,\n // resolution: 8,\n // });\n CSG.roundedCube = function(options) {\n var EPS = 1e-5;\n var minRR = 1e-2; //minroundradius 1e-3 gives rounding errors already\n var center, cuberadius;\n options = options || {};\n if (('corner1' in options) || ('corner2' in options)) {\n if (('center' in options) || ('radius' in options)) {\n throw new Error(\"roundedCube: should either give a radius and center parameter, or a corner1 and corner2 parameter\");\n }\n corner1 = CSG.parseOptionAs3DVector(options, \"corner1\", [0, 0, 0]);\n corner2 = CSG.parseOptionAs3DVector(options, \"corner2\", [1, 1, 1]);\n center = corner1.plus(corner2).times(0.5);\n cuberadius = corner2.minus(corner1).times(0.5);\n } else {\n center = CSG.parseOptionAs3DVector(options, \"center\", [0, 0, 0]);\n cuberadius = CSG.parseOptionAs3DVector(options, \"radius\", [1, 1, 1]);\n }\n cuberadius = cuberadius.abs(); // negative radii make no sense\n var resolution = CSG.parseOptionAsInt(options, \"resolution\", CSG.defaultResolution3D);\n if (resolution < 4) resolution = 4;\n if (resolution%2 == 1 && resolution < 8) resolution = 8; // avoid ugly\n var roundradius = CSG.parseOptionAs3DVector(options, \"roundradius\", [0.2, 0.2, 0.2]);\n // slight hack for now - total radius stays ok\n roundradius = CSG.Vector3D.Create(Math.max(roundradius.x, minRR), Math.max(roundradius.y, minRR), Math.max(roundradius.z, minRR));\n var innerradius = cuberadius.minus(roundradius);\n if (innerradius.x < 0 || innerradius.y < 0 || innerradius.z < 0) {\n throw('roundradius <= radius!');\n }\n var res = CSG.sphere({radius:1, resolution:resolution});\n res = res.scale(roundradius);\n innerradius.x > EPS && (res = res.stretchAtPlane([1, 0, 0], [0, 0, 0], 2*innerradius.x));\n innerradius.y > EPS && (res = res.stretchAtPlane([0, 1, 0], [0, 0, 0], 2*innerradius.y));\n innerradius.z > EPS && (res = res.stretchAtPlane([0, 0, 1], [0, 0, 0], 2*innerradius.z));\n res = res.translate([-innerradius.x+center.x, -innerradius.y+center.y, -innerradius.z+center.z]);\n res = res.reTesselated();\n res.properties.roundedCube = new CSG.Properties();\n res.properties.roundedCube.center = new CSG.Vertex(center);\n res.properties.roundedCube.facecenters = [\n new CSG.Connector(new CSG.Vector3D([cuberadius.x, 0, 0]).plus(center), [1, 0, 0], [0, 0, 1]),\n new CSG.Connector(new CSG.Vector3D([-cuberadius.x, 0, 0]).plus(center), [-1, 0, 0], [0, 0, 1]),\n new CSG.Connector(new CSG.Vector3D([0, cuberadius.y, 0]).plus(center), [0, 1, 0], [0, 0, 1]),\n new CSG.Connector(new CSG.Vector3D([0, -cuberadius.y, 0]).plus(center), [0, -1, 0], [0, 0, 1]),\n new CSG.Connector(new CSG.Vector3D([0, 0, cuberadius.z]).plus(center), [0, 0, 1], [1, 0, 0]),\n new CSG.Connector(new CSG.Vector3D([0, 0, -cuberadius.z]).plus(center), [0, 0, -1], [1, 0, 0])\n ];\n return res;\n };\n\n /**\n * polyhedron accepts openscad style arguments. I.e. define face vertices clockwise looking from outside\n */\n CSG.polyhedron = function(options) {\n options = options || {};\n if (('points' in options) !== ('faces' in options)) {\n throw new Error(\"polyhedron needs 'points' and 'faces' arrays\");\n }\n var vertices = CSG.parseOptionAs3DVectorList(options, \"points\", [\n [1, 1, 0],\n [1, -1, 0],\n [-1, -1, 0],\n [-1, 1, 0],\n [0, 0, 1]\n ])\n .map(function(pt) {\n return new CSG.Vertex(pt);\n });\n var faces = CSG.parseOption(options, \"faces\", [\n [0, 1, 4],\n [1, 2, 4],\n [2, 3, 4],\n [3, 0, 4],\n [1, 0, 3],\n [2, 1, 3]\n ]);\n // openscad convention defines inward normals - so we have to invert here\n faces.forEach(function(face) {\n face.reverse();\n });\n var polygons = faces.map(function(face) {\n return new CSG.Polygon(face.map(function(idx) {\n return vertices[idx];\n }));\n });\n\n // TODO: facecenters as connectors? probably overkill. Maybe centroid\n // the re-tesselation here happens because it's so easy for a user to\n // create parametrized polyhedrons that end up with 1-2 dimensional polygons.\n // These will create infinite loops at CSG.Tree()\n return CSG.fromPolygons(polygons).reTesselated();\n };\n\n CSG.IsFloat = function(n) {\n return (!isNaN(n)) || (n === Infinity) || (n === -Infinity);\n };\n\n // solve 2x2 linear equation:\n // [ab][x] = [u]\n // [cd][y] [v]\n CSG.solve2Linear = function(a, b, c, d, u, v) {\n var det = a * d - b * c;\n var invdet = 1.0 / det;\n var x = u * d - b * v;\n var y = -u * c + a * v;\n x *= invdet;\n y *= invdet;\n return [x, y];\n };\n\n // # class Vector3D\n // Represents a 3D vector.\n //\n // Example usage:\n //\n // new CSG.Vector3D(1, 2, 3);\n // new CSG.Vector3D([1, 2, 3]);\n // new CSG.Vector3D({ x: 1, y: 2, z: 3 });\n // new CSG.Vector3D(1, 2); // assumes z=0\n // new CSG.Vector3D([1, 2]); // assumes z=0\n CSG.Vector3D = function(x, y, z) {\n if (arguments.length == 3) {\n this._x = parseFloat(x);\n this._y = parseFloat(y);\n this._z = parseFloat(z);\n } else if (arguments.length == 2) {\n this._x = parseFloat(x);\n this._y = parseFloat(y);\n this._z = 0;\n } else {\n var ok = true;\n if (arguments.length == 1) {\n if (typeof(x) == \"object\") {\n if (x instanceof CSG.Vector3D) {\n this._x = x._x;\n this._y = x._y;\n this._z = x._z;\n } else if (x instanceof CSG.Vector2D) {\n this._x = x._x;\n this._y = x._y;\n this._z = 0;\n } else if (x instanceof Array) {\n if ((x.length < 2) || (x.length > 3)) {\n ok = false;\n } else {\n this._x = parseFloat(x[0]);\n this._y = parseFloat(x[1]);\n if (x.length == 3) {\n this._z = parseFloat(x[2]);\n } else {\n this._z = 0;\n }\n }\n } else if (('_x' in x) && ('_y' in x)) {\n this._x = parseFloat(x._x);\n this._y = parseFloat(x._y);\n if ('_z' in x) {\n this._z = parseFloat(x._z);\n } else {\n this._z = 0;\n }\n } else ok = false;\n } else {\n var v = parseFloat(x);\n this._x = v;\n this._y = v;\n this._z = v;\n }\n } else ok = false;\n if (ok) {\n if ((!CSG.IsFloat(this._x)) || (!CSG.IsFloat(this._y)) || (!CSG.IsFloat(this._z))) ok = false;\n }\n if (!ok) {\n throw new Error(\"wrong arguments\");\n }\n }\n };\n\n // This does the same as new CSG.Vector3D(x,y,z) but it doesn't go through the constructor\n // and the parameters are not validated. Is much faster.\n CSG.Vector3D.Create = function(x, y, z) {\n var result = Object.create(CSG.Vector3D.prototype);\n result._x = x;\n result._y = y;\n result._z = z;\n return result;\n };\n\n CSG.Vector3D.prototype = {\n get x() {\n return this._x;\n },\n get y() {\n return this._y;\n },\n get z() {\n return this._z;\n },\n\n set x(v) {\n throw new Error(\"Vector3D is immutable\");\n },\n set y(v) {\n throw new Error(\"Vector3D is immutable\");\n },\n set z(v) {\n throw new Error(\"Vector3D is immutable\");\n },\n\n clone: function() {\n return CSG.Vector3D.Create(this._x, this._y, this._z);\n },\n\n negated: function() {\n return CSG.Vector3D.Create(-this._x, -this._y, -this._z);\n },\n\n abs: function() {\n return CSG.Vector3D.Create(Math.abs(this._x), Math.abs(this._y), Math.abs(this._z));\n },\n\n plus: function(a) {\n return CSG.Vector3D.Create(this._x + a._x, this._y + a._y, this._z + a._z);\n },\n\n minus: function(a) {\n return CSG.Vector3D.Create(this._x - a._x, this._y - a._y, this._z - a._z);\n },\n\n times: function(a) {\n return CSG.Vector3D.Create(this._x * a, this._y * a, this._z * a);\n },\n\n dividedBy: function(a) {\n return CSG.Vector3D.Create(this._x / a, this._y / a, this._z / a);\n },\n\n dot: function(a) {\n return this._x * a._x + this._y * a._y + this._z * a._z;\n },\n\n lerp: function(a, t) {\n return this.plus(a.minus(this).times(t));\n },\n\n lengthSquared: function() {\n return this.dot(this);\n },\n\n length: function() {\n return Math.sqrt(this.lengthSquared());\n },\n\n unit: function() {\n return this.dividedBy(this.length());\n },\n\n cross: function(a) {\n return CSG.Vector3D.Create(\n this._y * a._z - this._z * a._y, this._z * a._x - this._x * a._z, this._x * a._y - this._y * a._x);\n },\n\n distanceTo: function(a) {\n return this.minus(a).length();\n },\n\n distanceToSquared: function(a) {\n return this.minus(a).lengthSquared();\n },\n\n equals: function(a) {\n return (this._x == a._x) && (this._y == a._y) && (this._z == a._z);\n },\n\n // Right multiply by a 4x4 matrix (the vector is interpreted as a row vector)\n // Returns a new CSG.Vector3D\n multiply4x4: function(matrix4x4) {\n return matrix4x4.leftMultiply1x3Vector(this);\n },\n\n transform: function(matrix4x4) {\n return matrix4x4.leftMultiply1x3Vector(this);\n },\n\n toString: function() {\n return \"(\" + this._x.toFixed(2) + \", \" + this._y.toFixed(2) + \", \" + this._z.toFixed(2) + \")\";\n },\n\n // find a vector that is somewhat perpendicular to this one\n randomNonParallelVector: function() {\n var abs = this.abs();\n if ((abs._x <= abs._y) && (abs._x <= abs._z)) {\n return CSG.Vector3D.Create(1, 0, 0);\n } else if ((abs._y <= abs._x) && (abs._y <= abs._z)) {\n return CSG.Vector3D.Create(0, 1, 0);\n } else {\n return CSG.Vector3D.Create(0, 0, 1);\n }\n },\n\n min: function(p) {\n return CSG.Vector3D.Create(\n Math.min(this._x, p._x), Math.min(this._y, p._y), Math.min(this._z, p._z));\n },\n\n max: function(p) {\n return CSG.Vector3D.Create(\n Math.max(this._x, p._x), Math.max(this._y, p._y), Math.max(this._z, p._z));\n }\n };\n\n // # class Vertex\n // Represents a vertex of a polygon. Use your own vertex class instead of this\n // one to provide additional features like texture coordinates and vertex\n // colors. Custom vertex classes need to provide a `pos` property\n // `flipped()`, and `interpolate()` methods that behave analogous to the ones\n // defined by `CSG.Vertex`.\n CSG.Vertex = function(pos) {\n this.pos = pos;\n };\n\n // create from an untyped object with identical property names:\n CSG.Vertex.fromObject = function(obj) {\n var pos = new CSG.Vector3D(obj.pos);\n return new CSG.Vertex(pos);\n };\n\n CSG.Vertex.prototype = {\n // Return a vertex with all orientation-specific data (e.g. vertex normal) flipped. Called when the\n // orientation of a polygon is flipped.\n flipped: function() {\n return this;\n },\n\n getTag: function() {\n var result = this.tag;\n if (!result) {\n result = CSG.getTag();\n this.tag = result;\n }\n return result;\n },\n\n // Create a new vertex between this vertex and `other` by linearly\n // interpolating all properties using a parameter of `t`. Subclasses should\n // override this to interpolate additional properties.\n interpolate: function(other, t) {\n var newpos = this.pos.lerp(other.pos, t);\n return new CSG.Vertex(newpos);\n },\n\n // Affine transformation of vertex. Returns a new CSG.Vertex\n transform: function(matrix4x4) {\n var newpos = this.pos.multiply4x4(matrix4x4);\n return new CSG.Vertex(newpos);\n },\n\n toString: function() {\n return this.pos.toString();\n }\n };\n\n // # class Plane\n // Represents a plane in 3D space.\n CSG.Plane = function(normal, w) {\n this.normal = normal;\n this.w = w;\n };\n\n // create from an untyped object with identical property names:\n CSG.Plane.fromObject = function(obj) {\n var normal = new CSG.Vector3D(obj.normal);\n var w = parseFloat(obj.w);\n return new CSG.Plane(normal, w);\n };\n\n // `CSG.Plane.EPSILON` is the tolerance used by `splitPolygon()` to decide if a\n // point is on the plane.\n CSG.Plane.EPSILON = 1e-5;\n\n CSG.Plane.fromVector3Ds = function(a, b, c) {\n var n = b.minus(a).cross(c.minus(a)).unit();\n return new CSG.Plane(n, n.dot(a));\n };\n\n // like fromVector3Ds, but allow the vectors to be on one point or one line\n // in such a case a random plane through the given points is constructed\n CSG.Plane.anyPlaneFromVector3Ds = function(a, b, c) {\n var v1 = b.minus(a);\n var v2 = c.minus(a);\n if (v1.length() < 1e-5) {\n v1 = v2.randomNonParallelVector();\n }\n if (v2.length() < 1e-5) {\n v2 = v1.randomNonParallelVector();\n }\n var normal = v1.cross(v2);\n if (normal.length() < 1e-5) {\n // this would mean that v1 == v2.negated()\n v2 = v1.randomNonParallelVector();\n normal = v1.cross(v2);\n }\n normal = normal.unit();\n return new CSG.Plane(normal, normal.dot(a));\n };\n\n CSG.Plane.fromPoints = function(a, b, c) {\n a = new CSG.Vector3D(a);\n b = new CSG.Vector3D(b);\n c = new CSG.Vector3D(c);\n return CSG.Plane.fromVector3Ds(a, b, c);\n };\n\n CSG.Plane.fromNormalAndPoint = function(normal, point) {\n normal = new CSG.Vector3D(normal);\n point = new CSG.Vector3D(point);\n normal = normal.unit();\n var w = point.dot(normal);\n return new CSG.Plane(normal, w);\n };\n\n CSG.Plane.prototype = {\n flipped: function() {\n return new CSG.Plane(this.normal.negated(), -this.w);\n },\n\n getTag: function() {\n var result = this.tag;\n if (!result) {\n result = CSG.getTag();\n this.tag = result;\n }\n return result;\n },\n\n equals: function(n) {\n return this.normal.equals(n.normal) && this.w == n.w;\n },\n\n transform: function(matrix4x4) {\n var ismirror = matrix4x4.isMirroring();\n // get two vectors in the plane:\n var r = this.normal.randomNonParallelVector();\n var u = this.normal.cross(r);\n var v = this.normal.cross(u);\n // get 3 points in the plane:\n var point1 = this.normal.times(this.w);\n var point2 = point1.plus(u);\n var point3 = point1.plus(v);\n // transform the points:\n point1 = point1.multiply4x4(matrix4x4);\n point2 = point2.multiply4x4(matrix4x4);\n point3 = point3.multiply4x4(matrix4x4);\n // and create a new plane from the transformed points:\n var newplane = CSG.Plane.fromVector3Ds(point1, point2, point3);\n if (ismirror) {\n // the transform is mirroring\n // We should mirror the plane:\n newplane = newplane.flipped();\n }\n return newplane;\n },\n\n // Returns object:\n // .type:\n // 0: coplanar-front\n // 1: coplanar-back\n // 2: front\n // 3: back\n // 4: spanning\n // In case the polygon is spanning, returns:\n // .front: a CSG.Polygon of the front part\n // .back: a CSG.Polygon of the back part\n splitPolygon: function(polygon) {\n var result = {\n type: null,\n front: null,\n back: null\n };\n // cache in local vars (speedup):\n var planenormal = this.normal;\n var vertices = polygon.vertices;\n var numvertices = vertices.length;\n if (polygon.plane.equals(this)) {\n result.type = 0;\n } else {\n var EPS = CSG.Plane.EPSILON;\n var thisw = this.w;\n var hasfront = false;\n var hasback = false;\n var vertexIsBack = [];\n var MINEPS = -EPS;\n for (var i = 0; i < numvertices; i++) {\n var t = planenormal.dot(vertices[i].pos) - thisw;\n var isback = (t < 0);\n vertexIsBack.push(isback);\n if (t > EPS) hasfront = true;\n if (t < MINEPS) hasback = true;\n }\n if ((!hasfront) && (!hasback)) {\n // all points coplanar\n var t = planenormal.dot(polygon.plane.normal);\n result.type = (t >= 0) ? 0 : 1;\n } else if (!hasback) {\n result.type = 2;\n } else if (!hasfront) {\n result.type = 3;\n } else {\n // spanning\n result.type = 4;\n var frontvertices = [],\n backvertices = [];\n var isback = vertexIsBack[0];\n for (var vertexindex = 0; vertexindex < numvertices; vertexindex++) {\n var vertex = vertices[vertexindex];\n var nextvertexindex = vertexindex + 1;\n if (nextvertexindex >= numvertices) nextvertexindex = 0;\n var nextisback = vertexIsBack[nextvertexindex];\n if (isback == nextisback) {\n // line segment is on one side of the plane:\n if (isback) {\n backvertices.push(vertex);\n } else {\n frontvertices.push(vertex);\n }\n } else {\n // line segment intersects plane:\n var point = vertex.pos;\n var nextpoint = vertices[nextvertexindex].pos;\n var intersectionpoint = this.splitLineBetweenPoints(point, nextpoint);\n var intersectionvertex = new CSG.Vertex(intersectionpoint);\n if (isback) {\n backvertices.push(vertex);\n backvertices.push(intersectionvertex);\n frontvertices.push(intersectionvertex);\n } else {\n frontvertices.push(vertex);\n frontvertices.push(intersectionvertex);\n backvertices.push(intersectionvertex);\n }\n }\n isback = nextisback;\n } // for vertexindex\n // remove duplicate vertices:\n var EPS_SQUARED = CSG.Plane.EPSILON * CSG.Plane.EPSILON;\n if (backvertices.length >= 3) {\n var prevvertex = backvertices[backvertices.length - 1];\n for (var vertexindex = 0; vertexindex < backvertices.length; vertexindex++) {\n var vertex = backvertices[vertexindex];\n if (vertex.pos.distanceToSquared(prevvertex.pos) < EPS_SQUARED) {\n backvertices.splice(vertexindex, 1);\n vertexindex--;\n }\n prevvertex = vertex;\n }\n }\n if (frontvertices.length >= 3) {\n var prevvertex = frontvertices[frontvertices.length - 1];\n for (var vertexindex = 0; vertexindex < frontvertices.length; vertexindex++) {\n var vertex = frontvertices[vertexindex];\n if (vertex.pos.distanceToSquared(prevvertex.pos) < EPS_SQUARED) {\n frontvertices.splice(vertexindex, 1);\n vertexindex--;\n }\n prevvertex = vertex;\n }\n }\n if (frontvertices.length >= 3) {\n result.front = new CSG.Polygon(frontvertices, polygon.shared, polygon.plane);\n }\n if (backvertices.length >= 3) {\n result.back = new CSG.Polygon(backvertices, polygon.shared, polygon.plane);\n }\n }\n }\n return result;\n },\n\n // robust splitting of a line by a plane\n // will work even if the line is parallel to the plane\n splitLineBetweenPoints: function(p1, p2) {\n var direction = p2.minus(p1);\n var labda = (this.w - this.normal.dot(p1)) / this.normal.dot(direction);\n if (isNaN(labda)) labda = 0;\n if (labda > 1) labda = 1;\n if (labda < 0) labda = 0;\n var result = p1.plus(direction.times(labda));\n return result;\n },\n\n // returns CSG.Vector3D\n intersectWithLine: function(line3d) {\n return line3d.intersectWithPlane(this);\n },\n\n // intersection of two planes\n intersectWithPlane: function(plane) {\n return CSG.Line3D.fromPlanes(this, plane);\n },\n\n signedDistanceToPoint: function(point) {\n var t = this.normal.dot(point) - this.w;\n return t;\n },\n\n toString: function() {\n return \"[normal: \" + this.normal.toString() + \", w: \" + this.w + \"]\";\n },\n\n mirrorPoint: function(point3d) {\n var distance = this.signedDistanceToPoint(point3d);\n var mirrored = point3d.minus(this.normal.times(distance * 2.0));\n return mirrored;\n }\n };\n\n\n // # class Polygon\n // Represents a convex polygon. The vertices used to initialize a polygon must\n // be coplanar and form a convex loop. They do not have to be `CSG.Vertex`\n // instances but they must behave similarly (duck typing can be used for\n // customization).\n //\n // Each convex polygon has a `shared` property, which is shared between all\n // polygons that are clones of each other or were split from the same polygon.\n // This can be used to define per-polygon properties (such as surface color).\n //\n // The plane of the polygon is calculated from the vertex coordinates\n // To avoid unnecessary recalculation, the plane can alternatively be\n // passed as the third argument\n CSG.Polygon = function(vertices, shared, plane) {\n this.vertices = vertices;\n if (!shared) shared = CSG.Polygon.defaultShared;\n this.shared = shared;\n //var numvertices = vertices.length;\n\n if (arguments.length >= 3) {\n this.plane = plane;\n } else {\n this.plane = CSG.Plane.fromVector3Ds(vertices[0].pos, vertices[1].pos, vertices[2].pos);\n }\n\n if (_CSGDEBUG) {\n this.checkIfConvex();\n }\n };\n\n // create from an untyped object with identical property names:\n CSG.Polygon.fromObject = function(obj) {\n var vertices = obj.vertices.map(function(v) {\n return CSG.Vertex.fromObject(v);\n });\n var shared = CSG.Polygon.Shared.fromObject(obj.shared);\n var plane = CSG.Plane.fromObject(obj.plane);\n return new CSG.Polygon(vertices, shared, plane);\n };\n\n CSG.Polygon.prototype = {\n // check whether the polygon is convex (it should be, otherwise we will get unexpected results)\n checkIfConvex: function() {\n if (!CSG.Polygon.verticesConvex(this.vertices, this.plane.normal)) {\n CSG.Polygon.verticesConvex(this.vertices, this.plane.normal);\n throw new Error(\"Not convex!\");\n }\n },\n\n setColor: function(args) {\n var newshared = CSG.Polygon.Shared.fromColor.apply(this, arguments);\n this.shared = newshared;\n return this;\n },\n\n getSignedVolume: function() {\n var signedVolume = 0;\n for (var i = 0; i < this.vertices.length - 2; i++) {\n signedVolume += this.vertices[0].pos.dot(this.vertices[i+1].pos\n .cross(this.vertices[i+2].pos));\n }\n signedVolume /= 6;\n return signedVolume;\n },\n\n // Note: could calculate vectors only once to speed up\n getArea: function() {\n var polygonArea = 0;\n for (var i = 0; i < this.vertices.length - 2; i++) {\n polygonArea += this.vertices[i+1].pos.minus(this.vertices[0].pos)\n .cross(this.vertices[i+2].pos.minus(this.vertices[i+1].pos)).length();\n }\n polygonArea /= 2;\n return polygonArea;\n },\n\n\n // accepts array of features to calculate\n // returns array of results\n getTetraFeatures: function(features) {\n var result = [];\n features.forEach(function(feature) {\n if (feature == 'volume') {\n result.push(this.getSignedVolume());\n } else if (feature == 'area') {\n result.push(this.getArea());\n }\n }, this);\n return result;\n },\n\n // Extrude a polygon into the direction offsetvector\n // Returns a CSG object\n extrude: function(offsetvector) {\n var newpolygons = [];\n\n var polygon1 = this;\n var direction = polygon1.plane.normal.dot(offsetvector);\n if (direction > 0) {\n polygon1 = polygon1.flipped();\n }\n newpolygons.push(polygon1);\n var polygon2 = polygon1.translate(offsetvector);\n var numvertices = this.vertices.length;\n for (var i = 0; i < numvertices; i++) {\n var sidefacepoints = [];\n var nexti = (i < (numvertices - 1)) ? i + 1 : 0;\n sidefacepoints.push(polygon1.vertices[i].pos);\n sidefacepoints.push(polygon2.vertices[i].pos);\n sidefacepoints.push(polygon2.vertices[nexti].pos);\n sidefacepoints.push(polygon1.vertices[nexti].pos);\n var sidefacepolygon = CSG.Polygon.createFromPoints(sidefacepoints, this.shared);\n newpolygons.push(sidefacepolygon);\n }\n polygon2 = polygon2.flipped();\n newpolygons.push(polygon2);\n return CSG.fromPolygons(newpolygons);\n },\n\n translate: function(offset) {\n return this.transform(CSG.Matrix4x4.translation(offset));\n },\n\n // returns an array with a CSG.Vector3D (center point) and a radius\n boundingSphere: function() {\n if (!this.cachedBoundingSphere) {\n var box = this.boundingBox();\n var middle = box[0].plus(box[1]).times(0.5);\n var radius3 = box[1].minus(middle);\n var radius = radius3.length();\n this.cachedBoundingSphere = [middle, radius];\n }\n return this.cachedBoundingSphere;\n },\n\n // returns an array of two CSG.Vector3Ds (minimum coordinates and maximum coordinates)\n boundingBox: function() {\n if (!this.cachedBoundingBox) {\n var minpoint, maxpoint;\n var vertices = this.vertices;\n var numvertices = vertices.length;\n if (numvertices === 0) {\n minpoint = new CSG.Vector3D(0, 0, 0);\n } else {\n minpoint = vertices[0].pos;\n }\n maxpoint = minpoint;\n for (var i = 1; i < numvertices; i++) {\n var point = vertices[i].pos;\n minpoint = minpoint.min(point);\n maxpoint = maxpoint.max(point);\n }\n this.cachedBoundingBox = [minpoint, maxpoint];\n }\n return this.cachedBoundingBox;\n },\n\n flipped: function() {\n var newvertices = this.vertices.map(function(v) {\n return v.flipped();\n });\n newvertices.reverse();\n var newplane = this.plane.flipped();\n return new CSG.Polygon(newvertices, this.shared, newplane);\n },\n\n // Affine transformation of polygon. Returns a new CSG.Polygon\n transform: function(matrix4x4) {\n var newvertices = this.vertices.map(function(v) {\n return v.transform(matrix4x4);\n });\n var newplane = this.plane.transform(matrix4x4);\n if (matrix4x4.isMirroring()) {\n // need to reverse the vertex order\n // in order to preserve the inside/outside orientation:\n newvertices.reverse();\n }\n return new CSG.Polygon(newvertices, this.shared, newplane);\n },\n\n toString: function() {\n var result = \"Polygon plane: \" + this.plane.toString() + \"\\n\";\n this.vertices.map(function(vertex) {\n result += \" \" + vertex.toString() + \"\\n\";\n });\n return result;\n },\n\n // project the 3D polygon onto a plane\n projectToOrthoNormalBasis: function(orthobasis) {\n var points2d = this.vertices.map(function(vertex) {\n return orthobasis.to2D(vertex.pos);\n });\n var result = CAG.fromPointsNoCheck(points2d);\n var area = result.area();\n if (Math.abs(area) < 1e-5) {\n // the polygon was perpendicular to the orthnormal plane. The resulting 2D polygon would be degenerate\n // return an empty area instead:\n result = new CAG();\n } else if (area < 0) {\n result = result.flipped();\n }\n return result;\n },\n\n /**\n * Creates solid from slices (CSG.Polygon) by generating walls\n * @param {Object} options Solid generating options\n * - numslices {Number} Number of slices to be generated\n * - callback(t, slice) {Function} Callback function generating slices.\n * arguments: t = [0..1], slice = [0..numslices - 1]\n * return: CSG.Polygon or null to skip\n * - loop {Boolean} no flats, only walls, it's used to generate solids like a tor\n */\n solidFromSlices: function(options) {\n var polygons = [],\n csg = null,\n prev = null,\n bottom = null,\n top = null,\n numSlices = 2,\n bLoop = false,\n fnCallback,\n flipped = null;\n\n if (options) {\n bLoop = Boolean(options['loop']);\n\n if (options.numslices)\n numSlices = options.numslices;\n\n if (options.callback)\n fnCallback = options.callback;\n }\n if (!fnCallback) {\n var square = new CSG.Polygon.createFromPoints([\n [0, 0, 0],\n [1, 0, 0],\n [1, 1, 0],\n [0, 1, 0]\n ]);\n fnCallback = function(t, slice) {\n return t == 0 || t == 1 ? square.translate([0, 0, t]) : null;\n }\n }\n for (var i = 0, iMax = numSlices - 1; i <= iMax; i++) {\n csg = fnCallback.call(this, i / iMax, i);\n if (csg) {\n if (!(csg instanceof CSG.Polygon)) {\n throw new Error(\"CSG.Polygon.solidFromSlices callback error: CSG.Polygon expected\");\n }\n csg.checkIfConvex();\n\n if (prev) { //generate walls\n if (flipped === null) { //not generated yet\n flipped = prev.plane.signedDistanceToPoint(csg.vertices[0].pos) < 0;\n }\n this._addWalls(polygons, prev, csg, flipped);\n\n } else { //the first - will be a bottom\n bottom = csg;\n }\n prev = csg;\n } //callback can return null to skip that slice\n }\n top = csg;\n\n if (bLoop) {\n var bSameTopBottom = bottom.vertices.length == top.vertices.length &&\n bottom.vertices.every(function(v, index) {\n return v.pos.equals(top.vertices[index].pos)\n });\n //if top and bottom are not the same -\n //generate walls between them\n if (!bSameTopBottom) {\n this._addWalls(polygons, top, bottom, flipped);\n } //else - already generated\n } else {\n //save top and bottom\n //TODO: flip if necessary\n polygons.unshift(flipped ? bottom : bottom.flipped());\n polygons.push(flipped ? top.flipped() : top);\n }\n return CSG.fromPolygons(polygons);\n },\n /**\n *\n * @param walls Array of wall polygons\n * @param bottom Bottom polygon\n * @param top Top polygon\n */\n _addWalls: function(walls, bottom, top, bFlipped) {\n var bottomPoints = bottom.vertices.slice(0), //make a copy\n topPoints = top.vertices.slice(0), //make a copy\n color = top.shared || null;\n\n //check if bottom perimeter is closed\n if (!bottomPoints[0].pos.equals(bottomPoints[bottomPoints.length - 1].pos)) {\n bottomPoints.push(bottomPoints[0]);\n }\n\n //check if top perimeter is closed\n if (!topPoints[0].pos.equals(topPoints[topPoints.length - 1].pos)) {\n topPoints.push(topPoints[0]);\n }\n if (bFlipped) {\n bottomPoints = bottomPoints.reverse();\n topPoints = topPoints.reverse();\n }\n\n var iTopLen = topPoints.length - 1,\n iBotLen = bottomPoints.length - 1,\n iExtra = iTopLen - iBotLen, //how many extra triangles we need\n bMoreTops = iExtra > 0,\n bMoreBottoms = iExtra < 0;\n\n var aMin = []; //indexes to start extra triangles (polygon with minimal square)\n //init - we need exactly /iExtra/ small triangles\n for (var i = Math.abs(iExtra); i > 0; i--) {\n aMin.push({\n len: Infinity,\n index: -1\n });\n }\n\n var len;\n if (bMoreBottoms) {\n for (var i = 0; i < iBotLen; i++) {\n len = bottomPoints[i].pos.distanceToSquared(bottomPoints[i + 1].pos);\n //find the element to replace\n for (var j = aMin.length - 1; j >= 0; j--) {\n if (aMin[j].len > len) {\n aMin[j].len = len;\n aMin.index = j;\n break;\n }\n } //for\n }\n } else if (bMoreTops) {\n for (var i = 0; i < iTopLen; i++) {\n len = topPoints[i].pos.distanceToSquared(topPoints[i + 1].pos);\n //find the element to replace\n for (var j = aMin.length - 1; j >= 0; j--) {\n if (aMin[j].len > len) {\n aMin[j].len = len;\n aMin.index = j;\n break;\n }\n } //for\n }\n } //if\n //sort by index\n aMin.sort(fnSortByIndex);\n var getTriangle = function addWallsPutTriangle(pointA, pointB, pointC, color) {\n return new CSG.Polygon([pointA, pointB, pointC], color);\n //return bFlipped ? triangle.flipped() : triangle;\n };\n\n var bpoint = bottomPoints[0],\n tpoint = topPoints[0],\n secondPoint,\n nBotFacet, nTopFacet; //length of triangle facet side\n for (var iB = 0, iT = 0, iMax = iTopLen + iBotLen; iB + iT < iMax;) {\n if (aMin.length) {\n if (bMoreTops && iT == aMin[0].index) { //one vertex is on the bottom, 2 - on the top\n secondPoint = topPoints[++iT];\n //console.log('<<< extra top: ' + secondPoint + ', ' + tpoint + ', bottom: ' + bpoint);\n walls.push(getTriangle(\n secondPoint, tpoint, bpoint, color\n ));\n tpoint = secondPoint;\n aMin.shift();\n continue;\n } else if (bMoreBottoms && iB == aMin[0].index) {\n secondPoint = bottomPoints[++iB];\n walls.push(getTriangle(\n tpoint, bpoint, secondPoint, color\n ));\n bpoint = secondPoint;\n aMin.shift();\n continue;\n }\n }\n //choose the shortest path\n if (iB < iBotLen) { //one vertex is on the top, 2 - on the bottom\n nBotFacet = tpoint.pos.distanceToSquared(bottomPoints[iB + 1].pos);\n } else {\n nBotFacet = Infinity;\n }\n if (iT < iTopLen) { //one vertex is on the bottom, 2 - on the top\n nTopFacet = bpoint.pos.distanceToSquared(topPoints[iT + 1].pos);\n } else {\n nTopFacet = Infinity;\n }\n if (nBotFacet <= nTopFacet) {\n secondPoint = bottomPoints[++iB];\n walls.push(getTriangle(\n tpoint, bpoint, secondPoint, color\n ));\n bpoint = secondPoint;\n } else if (iT < iTopLen) { //nTopFacet < Infinity\n secondPoint = topPoints[++iT];\n //console.log('<<< top: ' + secondPoint + ', ' + tpoint + ', bottom: ' + bpoint);\n walls.push(getTriangle(\n secondPoint, tpoint, bpoint, color\n ));\n tpoint = secondPoint;\n };\n }\n return walls;\n }\n };\n\n CSG.Polygon.verticesConvex = function(vertices, planenormal) {\n var numvertices = vertices.length;\n if (numvertices > 2) {\n var prevprevpos = vertices[numvertices - 2].pos;\n var prevpos = vertices[numvertices - 1].pos;\n for (var i = 0; i < numvertices; i++) {\n var pos = vertices[i].pos;\n if (!CSG.Polygon.isConvexPoint(prevprevpos, prevpos, pos, planenormal)) {\n return false;\n }\n prevprevpos = prevpos;\n prevpos = pos;\n }\n }\n return true;\n };\n\n // Create a polygon from the given points\n CSG.Polygon.createFromPoints = function(points, shared, plane) {\n var normal;\n if (arguments.length < 3) {\n // initially set a dummy vertex normal:\n normal = new CSG.Vector3D(0, 0, 0);\n } else {\n normal = plane.normal;\n }\n var vertices = [];\n points.map(function(p) {\n var vec = new CSG.Vector3D(p);\n var vertex = new CSG.Vertex(vec);\n vertices.push(vertex);\n });\n var polygon;\n if (arguments.length < 3) {\n polygon = new CSG.Polygon(vertices, shared);\n } else {\n polygon = new CSG.Polygon(vertices, shared, plane);\n }\n return polygon;\n };\n\n // calculate whether three points form a convex corner\n // prevpoint, point, nextpoint: the 3 coordinates (CSG.Vector3D instances)\n // normal: the normal vector of the plane\n CSG.Polygon.isConvexPoint = function(prevpoint, point, nextpoint, normal) {\n var crossproduct = point.minus(prevpoint).cross(nextpoint.minus(point));\n var crossdotnormal = crossproduct.dot(normal);\n return (crossdotnormal >= 0);\n };\n\n CSG.Polygon.isStrictlyConvexPoint = function(prevpoint, point, nextpoint, normal) {\n var crossproduct = point.minus(prevpoint).cross(nextpoint.minus(point));\n var crossdotnormal = crossproduct.dot(normal);\n return (crossdotnormal >= 1e-5);\n };\n\n // # class CSG.Polygon.Shared\n // Holds the shared properties for each polygon (currently only color)\n // Constructor expects a 4 element array [r,g,b,a], values from 0 to 1, or null\n CSG.Polygon.Shared = function(color) {\n if(color !== null)\n {\n if (color.length != 4) {\n throw new Error(\"Expecting 4 element array\");\n }\n }\n this.color = color;\n };\n\n CSG.Polygon.Shared.fromObject = function(obj) {\n return new CSG.Polygon.Shared(obj.color);\n };\n\n // Create CSG.Polygon.Shared from a color, can be called as follows:\n // var s = CSG.Polygon.Shared.fromColor(r,g,b [,a])\n // var s = CSG.Polygon.Shared.fromColor([r,g,b [,a]])\n CSG.Polygon.Shared.fromColor = function(args) {\n var color;\n if(arguments.length == 1) {\n color = arguments[0].slice(); // make deep copy\n }\n else {\n color = [];\n for(var i=0; i < arguments.length; i++) {\n color.push(arguments[i]);\n }\n }\n if(color.length == 3) {\n color.push(1);\n } else if(color.length != 4) {\n throw new Error(\"setColor expects either an array with 3 or 4 elements, or 3 or 4 parameters.\");\n }\n return new CSG.Polygon.Shared(color);\n };\n\n CSG.Polygon.Shared.prototype = {\n getTag: function() {\n var result = this.tag;\n if (!result) {\n result = CSG.getTag();\n this.tag = result;\n }\n return result;\n },\n // get a string uniquely identifying this object\n getHash: function() {\n if (!this.color) return \"null\";\n return this.color.join(\"/\");\n }\n };\n\n CSG.Polygon.defaultShared = new CSG.Polygon.Shared(null);\n\n // # class PolygonTreeNode\n // This class manages hierarchical splits of polygons\n // At the top is a root node which doesn hold a polygon, only child PolygonTreeNodes\n // Below that are zero or more 'top' nodes; each holds a polygon. The polygons can be in different planes\n // splitByPlane() splits a node by a plane. If the plane intersects the polygon, two new child nodes\n // are created holding the splitted polygon.\n // getPolygons() retrieves the polygon from the tree. If for PolygonTreeNode the polygon is split but\n // the two split parts (child nodes) are still intact, then the unsplit polygon is returned.\n // This ensures that we can safely split a polygon into many fragments. If the fragments are untouched,\n // getPolygons() will return the original unsplit polygon instead of the fragments.\n // remove() removes a polygon from the tree. Once a polygon is removed, the parent polygons are invalidated\n // since they are no longer intact.\n // constructor creates the root node:\n CSG.PolygonTreeNode = function() {\n this.parent = null;\n this.children = [];\n this.polygon = null;\n this.removed = false;\n };\n\n CSG.PolygonTreeNode.prototype = {\n // fill the tree with polygons. Should be called on the root node only; child nodes must\n // always be a derivate (split) of the parent node.\n addPolygons: function(polygons) {\n if (!this.isRootNode())\n // new polygons can only be added to root node; children can only be splitted polygons\n throw new Error(\"Assertion failed\");\n var _this = this;\n polygons.map(function(polygon) {\n _this.addChild(polygon);\n });\n },\n\n // remove a node\n // - the siblings become toplevel nodes\n // - the parent is removed recursively\n remove: function() {\n if (!this.removed) {\n this.removed = true;\n\n if (_CSGDEBUG) {\n if (this.isRootNode()) throw new Error(\"Assertion failed\"); // can't remove root node\n if (this.children.length) throw new Error(\"Assertion failed\"); // we shouldn't remove nodes with children\n }\n\n // remove ourselves from the parent's children list:\n var parentschildren = this.parent.children;\n var i = parentschildren.indexOf(this);\n if (i < 0) throw new Error(\"Assertion failed\");\n parentschildren.splice(i, 1);\n\n // invalidate the parent's polygon, and of all parents above it:\n this.parent.recursivelyInvalidatePolygon();\n }\n },\n\n isRemoved: function() {\n return this.removed;\n },\n\n isRootNode: function() {\n return !this.parent;\n },\n\n // invert all polygons in the tree. Call on the root node\n invert: function() {\n if (!this.isRootNode()) throw new Error(\"Assertion failed\"); // can only call this on the root node\n this.invertSub();\n },\n\n getPolygon: function() {\n if (!this.polygon) throw new Error(\"Assertion failed\"); // doesn't have a polygon, which means that it has been broken down\n return this.polygon;\n },\n\n getPolygons: function(result) {\n var children = [this];\n var queue = [children];\n var i, j, l, node;\n for (i = 0; i < queue.length; ++i ) { // queue size can change in loop, don't cache length\n children = queue[i];\n for (j = 0, l = children.length; j < l; j++) { // ok to cache length\n node = children[j];\n if (node.polygon) {\n // the polygon hasn't been broken yet. We can ignore the children and return our polygon:\n result.push(node.polygon);\n } else {\n // our polygon has been split up and broken, so gather all subpolygons from the children\n queue.push(node.children);\n }\n }\n }\n },\n\n // split the node by a plane; add the resulting nodes to the frontnodes and backnodes array\n // If the plane doesn't intersect the polygon, the 'this' object is added to one of the arrays\n // If the plane does intersect the polygon, two new child nodes are created for the front and back fragments,\n // and added to both arrays.\n splitByPlane: function(plane, coplanarfrontnodes, coplanarbacknodes, frontnodes, backnodes) {\n if (this.children.length) {\n var queue = [this.children], i, j, l, node, nodes;\n for (i = 0; i < queue.length; i++) { // queue.length can increase, do not cache\n nodes = queue[i];\n for (j = 0, l = nodes.length; j < l; j++) { // ok to cache length\n node = nodes[j];\n if (node.children.length) {\n queue.push(node.children);\n } else {\n // no children. Split the polygon:\n node._splitByPlane(plane, coplanarfrontnodes, coplanarbacknodes, frontnodes, backnodes);\n }\n }\n }\n } else {\n this._splitByPlane(plane, coplanarfrontnodes, coplanarbacknodes, frontnodes, backnodes);\n }\n },\n\n // only to be called for nodes with no children\n _splitByPlane: function (plane, coplanarfrontnodes, coplanarbacknodes, frontnodes, backnodes) {\n var polygon = this.polygon;\n if (polygon) {\n var bound = polygon.boundingSphere();\n var sphereradius = bound[1] + 1e-4;\n var planenormal = plane.normal;\n var spherecenter = bound[0];\n var d = planenormal.dot(spherecenter) - plane.w;\n if (d > sphereradius) {\n frontnodes.push(this);\n } else if (d < -sphereradius) {\n backnodes.push(this);\n } else {\n var splitresult = plane.splitPolygon(polygon);\n switch (splitresult.type) {\n case 0:\n // coplanar front:\n coplanarfrontnodes.push(this);\n break;\n\n case 1:\n // coplanar back:\n coplanarbacknodes.push(this);\n break;\n\n case 2:\n // front:\n frontnodes.push(this);\n break;\n\n case 3:\n // back:\n backnodes.push(this);\n break;\n\n case 4:\n // spanning:\n if (splitresult.front) {\n var frontnode = this.addChild(splitresult.front);\n frontnodes.push(frontnode);\n }\n if (splitresult.back) {\n var backnode = this.addChild(splitresult.back);\n backnodes.push(backnode);\n }\n break;\n }\n }\n }\n },\n\n\n // PRIVATE methods from here:\n // add child to a node\n // this should be called whenever the polygon is split\n // a child should be created for every fragment of the split polygon\n // returns the newly created child\n addChild: function(polygon) {\n var newchild = new CSG.PolygonTreeNode();\n newchild.parent = this;\n newchild.polygon = polygon;\n this.children.push(newchild);\n return newchild;\n },\n\n invertSub: function() {\n var children = [this];\n var queue = [children];\n var i, j, l, node;\n for (i = 0; i < queue.length; i++) {\n children = queue[i];\n for (j = 0, l = children.length; j < l; j++) {\n node = children[j];\n if (node.polygon) {\n node.polygon = node.polygon.flipped();\n }\n queue.push(node.children);\n }\n }\n },\n\n recursivelyInvalidatePolygon: function() {\n var node = this;\n while (node.polygon) {\n node.polygon = null;\n if (node.parent) {\n node = node.parent;\n }\n }\n }\n };\n\n\n\n // # class Tree\n // This is the root of a BSP tree\n // We are using this separate class for the root of the tree, to hold the PolygonTreeNode root\n // The actual tree is kept in this.rootnode\n CSG.Tree = function(polygons) {\n this.polygonTree = new CSG.PolygonTreeNode();\n this.rootnode = new CSG.Node(null);\n if (polygons) this.addPolygons(polygons);\n };\n\n CSG.Tree.prototype = {\n invert: function() {\n this.polygonTree.invert();\n this.rootnode.invert();\n },\n\n // Remove all polygons in this BSP tree that are inside the other BSP tree\n // `tree`.\n clipTo: function(tree, alsoRemovecoplanarFront) {\n alsoRemovecoplanarFront = alsoRemovecoplanarFront ? true : false;\n this.rootnode.clipTo(tree, alsoRemovecoplanarFront);\n },\n\n allPolygons: function() {\n var result = [];\n this.polygonTree.getPolygons(result);\n return result;\n },\n\n addPolygons: function(polygons) {\n var _this = this;\n var polygontreenodes = polygons.map(function(p) {\n return _this.polygonTree.addChild(p);\n });\n this.rootnode.addPolygonTreeNodes(polygontreenodes);\n }\n };\n\n // # class Node\n // Holds a node in a BSP tree. A BSP tree is built from a collection of polygons\n // by picking a polygon to split along.\n // Polygons are not stored directly in the tree, but in PolygonTreeNodes, stored in\n // this.polygontreenodes. Those PolygonTreeNodes are children of the owning\n // CSG.Tree.polygonTree\n // This is not a leafy BSP tree since there is\n // no distinction between internal and leaf nodes.\n CSG.Node = function(parent) {\n this.plane = null;\n this.front = null;\n this.back = null;\n this.polygontreenodes = [];\n this.parent = parent;\n };\n\n CSG.Node.prototype = {\n // Convert solid space to empty space and empty space to solid space.\n invert: function() {\n var queue = [this];\n var i, node;\n for (var i = 0; i < queue.length; i++) {\n node = queue[i];\n if(node.plane) node.plane = node.plane.flipped();\n if(node.front) queue.push(node.front);\n if(node.back) queue.push(node.back);\n var temp = node.front;\n node.front = node.back;\n node.back = temp;\n }\n },\n\n // clip polygontreenodes to our plane\n // calls remove() for all clipped PolygonTreeNodes\n clipPolygons: function(polygontreenodes, alsoRemovecoplanarFront) {\n var args = {'node': this, 'polygontreenodes': polygontreenodes }\n var node;\n var stack = [];\n\n do {\n node = args.node;\n polygontreenodes = args.polygontreenodes;\n\n // begin \"function\"\n if(node.plane) {\n var backnodes = [];\n var frontnodes = [];\n var coplanarfrontnodes = alsoRemovecoplanarFront ? backnodes : frontnodes;\n var plane = node.plane;\n var numpolygontreenodes = polygontreenodes.length;\n for(i = 0; i < numpolygontreenodes; i++) {\n var node1 = polygontreenodes[i];\n if(!node1.isRemoved()) {\n node1.splitByPlane(plane, coplanarfrontnodes, backnodes, frontnodes, backnodes);\n }\n }\n\n if(node.front && (frontnodes.length > 0)) {\n stack.push({'node': node.front, 'polygontreenodes': frontnodes});\n }\n var numbacknodes = backnodes.length;\n if (node.back && (numbacknodes > 0)) {\n stack.push({'node': node.back, 'polygontreenodes': backnodes});\n } else {\n // there's nothing behind this plane. Delete the nodes behind this plane:\n for (var i = 0; i < numbacknodes; i++) {\n backnodes[i].remove();\n }\n }\n }\n args = stack.pop();\n } while (typeof(args) !== 'undefined');\n },\n\n // Remove all polygons in this BSP tree that are inside the other BSP tree\n // `tree`.\n clipTo: function(tree, alsoRemovecoplanarFront) {\n var node = this, stack = [];\n do {\n if(node.polygontreenodes.length > 0) {\n tree.rootnode.clipPolygons(node.polygontreenodes, alsoRemovecoplanarFront);\n }\n if(node.front) stack.push(node.front);\n if(node.back) stack.push(node.back);\n node = stack.pop();\n } while(typeof(node) !== 'undefined');\n },\n\n addPolygonTreeNodes: function(polygontreenodes) {\n var args = {'node': this, 'polygontreenodes': polygontreenodes };\n var node;\n var stack = [];\n do {\n node = args.node;\n polygontreenodes = args.polygontreenodes;\n\n if (polygontreenodes.length === 0) {\n args = stack.pop();\n continue;\n }\n var _this = node;\n if (!node.plane) {\n var bestplane = polygontreenodes[0].getPolygon().plane;\n node.plane = bestplane;\n }\n var frontnodes = [];\n var backnodes = [];\n\n for (var i = 0, n = polygontreenodes.length ; i < n; ++i) {\n polygontreenodes[i].splitByPlane(_this.plane, _this.polygontreenodes, backnodes, frontnodes, backnodes);\n }\n\n if (frontnodes.length > 0) {\n if (!node.front) node.front = new CSG.Node(node);\n stack.push({'node': node.front, 'polygontreenodes': frontnodes});\n }\n if (backnodes.length > 0) {\n if (!node.back) node.back = new CSG.Node(node);\n stack.push({'node': node.back, 'polygontreenodes': backnodes});\n }\n\n args = stack.pop();\n } while (typeof(args) !== 'undefined');\n },\n\n getParentPlaneNormals: function(normals, maxdepth) {\n if (maxdepth > 0) {\n if (this.parent) {\n normals.push(this.parent.plane.normal);\n this.parent.getParentPlaneNormals(normals, maxdepth - 1);\n }\n }\n }\n };\n\n //////////\n // # class Matrix4x4:\n // Represents a 4x4 matrix. Elements are specified in row order\n CSG.Matrix4x4 = function(elements) {\n if (arguments.length >= 1) {\n this.elements = elements;\n } else {\n // if no arguments passed: create unity matrix\n this.elements = [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1];\n }\n };\n\n CSG.Matrix4x4.prototype = {\n plus: function(m) {\n var r = [];\n for (var i = 0; i < 16; i++) {\n r[i] = this.elements[i] + m.elements[i];\n }\n return new CSG.Matrix4x4(r);\n },\n\n minus: function(m) {\n var r = [];\n for (var i = 0; i < 16; i++) {\n r[i] = this.elements[i] - m.elements[i];\n }\n return new CSG.Matrix4x4(r);\n },\n\n // right multiply by another 4x4 matrix:\n multiply: function(m) {\n // cache elements in local variables, for speedup:\n var this0 = this.elements[0];\n var this1 = this.elements[1];\n var this2 = this.elements[2];\n var this3 = this.elements[3];\n var this4 = this.elements[4];\n var this5 = this.elements[5];\n var this6 = this.elements[6];\n var this7 = this.elements[7];\n var this8 = this.elements[8];\n var this9 = this.elements[9];\n var this10 = this.elements[10];\n var this11 = this.elements[11];\n var this12 = this.elements[12];\n var this13 = this.elements[13];\n var this14 = this.elements[14];\n var this15 = this.elements[15];\n var m0 = m.elements[0];\n var m1 = m.elements[1];\n var m2 = m.elements[2];\n var m3 = m.elements[3];\n var m4 = m.elements[4];\n var m5 = m.elements[5];\n var m6 = m.elements[6];\n var m7 = m.elements[7];\n var m8 = m.elements[8];\n var m9 = m.elements[9];\n var m10 = m.elements[10];\n var m11 = m.elements[11];\n var m12 = m.elements[12];\n var m13 = m.elements[13];\n var m14 = m.elements[14];\n var m15 = m.elements[15];\n\n var result = [];\n result[0] = this0 * m0 + this1 * m4 + this2 * m8 + this3 * m12;\n result[1] = this0 * m1 + this1 * m5 + this2 * m9 + this3 * m13;\n result[2] = this0 * m2 + this1 * m6 + this2 * m10 + this3 * m14;\n result[3] = this0 * m3 + this1 * m7 + this2 * m11 + this3 * m15;\n result[4] = this4 * m0 + this5 * m4 + this6 * m8 + this7 * m12;\n result[5] = this4 * m1 + this5 * m5 + this6 * m9 + this7 * m13;\n result[6] = this4 * m2 + this5 * m6 + this6 * m10 + this7 * m14;\n result[7] = this4 * m3 + this5 * m7 + this6 * m11 + this7 * m15;\n result[8] = this8 * m0 + this9 * m4 + this10 * m8 + this11 * m12;\n result[9] = this8 * m1 + this9 * m5 + this10 * m9 + this11 * m13;\n result[10] = this8 * m2 + this9 * m6 + this10 * m10 + this11 * m14;\n result[11] = this8 * m3 + this9 * m7 + this10 * m11 + this11 * m15;\n result[12] = this12 * m0 + this13 * m4 + this14 * m8 + this15 * m12;\n result[13] = this12 * m1 + this13 * m5 + this14 * m9 + this15 * m13;\n result[14] = this12 * m2 + this13 * m6 + this14 * m10 + this15 * m14;\n result[15] = this12 * m3 + this13 * m7 + this14 * m11 + this15 * m15;\n return new CSG.Matrix4x4(result);\n },\n\n clone: function() {\n var elements = this.elements.map(function(p) {\n return p;\n });\n return new CSG.Matrix4x4(elements);\n },\n\n // Right multiply the matrix by a CSG.Vector3D (interpreted as 3 row, 1 column)\n // (result = M*v)\n // Fourth element is taken as 1\n rightMultiply1x3Vector: function(v) {\n var v0 = v._x;\n var v1 = v._y;\n var v2 = v._z;\n var v3 = 1;\n var x = v0 * this.elements[0] + v1 * this.elements[1] + v2 * this.elements[2] + v3 * this.elements[3];\n var y = v0 * this.elements[4] + v1 * this.elements[5] + v2 * this.elements[6] + v3 * this.elements[7];\n var z = v0 * this.elements[8] + v1 * this.elements[9] + v2 * this.elements[10] + v3 * this.elements[11];\n var w = v0 * this.elements[12] + v1 * this.elements[13] + v2 * this.elements[14] + v3 * this.elements[15];\n // scale such that fourth element becomes 1:\n if (w != 1) {\n var invw = 1.0 / w;\n x *= invw;\n y *= invw;\n z *= invw;\n }\n return new CSG.Vector3D(x, y, z);\n },\n\n // Multiply a CSG.Vector3D (interpreted as 3 column, 1 row) by this matrix\n // (result = v*M)\n // Fourth element is taken as 1\n leftMultiply1x3Vector: function(v) {\n var v0 = v._x;\n var v1 = v._y;\n var v2 = v._z;\n var v3 = 1;\n var x = v0 * this.elements[0] + v1 * this.elements[4] + v2 * this.elements[8] + v3 * this.elements[12];\n var y = v0 * this.elements[1] + v1 * this.elements[5] + v2 * this.elements[9] + v3 * this.elements[13];\n var z = v0 * this.elements[2] + v1 * this.elements[6] + v2 * this.elements[10] + v3 * this.elements[14];\n var w = v0 * this.elements[3] + v1 * this.elements[7] + v2 * this.elements[11] + v3 * this.elements[15];\n // scale such that fourth element becomes 1:\n if (w != 1) {\n var invw = 1.0 / w;\n x *= invw;\n y *= invw;\n z *= invw;\n }\n return new CSG.Vector3D(x, y, z);\n },\n\n // Right multiply the matrix by a CSG.Vector2D (interpreted as 2 row, 1 column)\n // (result = M*v)\n // Fourth element is taken as 1\n rightMultiply1x2Vector: function(v) {\n var v0 = v.x;\n var v1 = v.y;\n var v2 = 0;\n var v3 = 1;\n var x = v0 * this.elements[0] + v1 * this.elements[1] + v2 * this.elements[2] + v3 * this.elements[3];\n var y = v0 * this.elements[4] + v1 * this.elements[5] + v2 * this.elements[6] + v3 * this.elements[7];\n var z = v0 * this.elements[8] + v1 * this.elements[9] + v2 * this.elements[10] + v3 * this.elements[11];\n var w = v0 * this.elements[12] + v1 * this.elements[13] + v2 * this.elements[14] + v3 * this.elements[15];\n // scale such that fourth element becomes 1:\n if (w != 1) {\n var invw = 1.0 / w;\n x *= invw;\n y *= invw;\n z *= invw;\n }\n return new CSG.Vector2D(x, y);\n },\n\n // Multiply a CSG.Vector2D (interpreted as 2 column, 1 row) by this matrix\n // (result = v*M)\n // Fourth element is taken as 1\n leftMultiply1x2Vector: function(v) {\n var v0 = v.x;\n var v1 = v.y;\n var v2 = 0;\n var v3 = 1;\n var x = v0 * this.elements[0] + v1 * this.elements[4] + v2 * this.elements[8] + v3 * this.elements[12];\n var y = v0 * this.elements[1] + v1 * this.elements[5] + v2 * this.elements[9] + v3 * this.elements[13];\n var z = v0 * this.elements[2] + v1 * this.elements[6] + v2 * this.elements[10] + v3 * this.elements[14];\n var w = v0 * this.elements[3] + v1 * this.elements[7] + v2 * this.elements[11] + v3 * this.elements[15];\n // scale such that fourth element becomes 1:\n if (w != 1) {\n var invw = 1.0 / w;\n x *= invw;\n y *= invw;\n z *= invw;\n }\n return new CSG.Vector2D(x, y);\n },\n\n // determine whether this matrix is a mirroring transformation\n isMirroring: function() {\n var u = new CSG.Vector3D(this.elements[0], this.elements[4], this.elements[8]);\n var v = new CSG.Vector3D(this.elements[1], this.elements[5], this.elements[9]);\n var w = new CSG.Vector3D(this.elements[2], this.elements[6], this.elements[10]);\n\n // for a true orthogonal, non-mirrored base, u.cross(v) == w\n // If they have an opposite direction then we are mirroring\n var mirrorvalue = u.cross(v).dot(w);\n var ismirror = (mirrorvalue < 0);\n return ismirror;\n }\n };\n\n // return the unity matrix\n CSG.Matrix4x4.unity = function() {\n return new CSG.Matrix4x4();\n };\n\n // Create a rotation matrix for rotating around the x axis\n CSG.Matrix4x4.rotationX = function(degrees) {\n var radians = degrees * Math.PI * (1.0 / 180.0);\n var cos = Math.cos(radians);\n var sin = Math.sin(radians);\n var els = [\n 1, 0, 0, 0, 0, cos, sin, 0, 0, -sin, cos, 0, 0, 0, 0, 1\n ];\n return new CSG.Matrix4x4(els);\n };\n\n // Create a rotation matrix for rotating around the y axis\n CSG.Matrix4x4.rotationY = function(degrees) {\n var radians = degrees * Math.PI * (1.0 / 180.0);\n var cos = Math.cos(radians);\n var sin = Math.sin(radians);\n var els = [\n cos, 0, -sin, 0, 0, 1, 0, 0, sin, 0, cos, 0, 0, 0, 0, 1\n ];\n return new CSG.Matrix4x4(els);\n };\n\n // Create a rotation matrix for rotating around the z axis\n CSG.Matrix4x4.rotationZ = function(degrees) {\n var radians = degrees * Math.PI * (1.0 / 180.0);\n var cos = Math.cos(radians);\n var sin = Math.sin(radians);\n var els = [\n cos, sin, 0, 0, -sin, cos, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1\n ];\n return new CSG.Matrix4x4(els);\n };\n\n // Matrix for rotation about arbitrary point and axis\n CSG.Matrix4x4.rotation = function(rotationCenter, rotationAxis, degrees) {\n rotationCenter = new CSG.Vector3D(rotationCenter);\n rotationAxis = new CSG.Vector3D(rotationAxis);\n var rotationPlane = CSG.Plane.fromNormalAndPoint(rotationAxis, rotationCenter);\n var orthobasis = new CSG.OrthoNormalBasis(rotationPlane);\n var transformation = CSG.Matrix4x4.translation(rotationCenter.negated());\n transformation = transformation.multiply(orthobasis.getProjectionMatrix());\n transformation = transformation.multiply(CSG.Matrix4x4.rotationZ(degrees));\n transformation = transformation.multiply(orthobasis.getInverseProjectionMatrix());\n transformation = transformation.multiply(CSG.Matrix4x4.translation(rotationCenter));\n return transformation;\n };\n\n // Create an affine matrix for translation:\n CSG.Matrix4x4.translation = function(v) {\n // parse as CSG.Vector3D, so we can pass an array or a CSG.Vector3D\n var vec = new CSG.Vector3D(v);\n var els = [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, vec.x, vec.y, vec.z, 1];\n return new CSG.Matrix4x4(els);\n };\n\n // Create an affine matrix for mirroring into an arbitrary plane:\n CSG.Matrix4x4.mirroring = function(plane) {\n var nx = plane.normal.x;\n var ny = plane.normal.y;\n var nz = plane.normal.z;\n var w = plane.w;\n var els = [\n (1.0 - 2.0 * nx * nx), (-2.0 * ny * nx), (-2.0 * nz * nx), 0,\n (-2.0 * nx * ny), (1.0 - 2.0 * ny * ny), (-2.0 * nz * ny), 0,\n (-2.0 * nx * nz), (-2.0 * ny * nz), (1.0 - 2.0 * nz * nz), 0,\n (2.0 * nx * w), (2.0 * ny * w), (2.0 * nz * w), 1\n ];\n return new CSG.Matrix4x4(els);\n };\n\n // Create an affine matrix for scaling:\n CSG.Matrix4x4.scaling = function(v) {\n // parse as CSG.Vector3D, so we can pass an array or a CSG.Vector3D\n var vec = new CSG.Vector3D(v);\n var els = [\n vec.x, 0, 0, 0, 0, vec.y, 0, 0, 0, 0, vec.z, 0, 0, 0, 0, 1\n ];\n return new CSG.Matrix4x4(els);\n };\n\n ///////////////////////////////////////////////////\n // # class Vector2D:\n // Represents a 2 element vector\n CSG.Vector2D = function(x, y) {\n if (arguments.length == 2) {\n this._x = parseFloat(x);\n this._y = parseFloat(y);\n } else {\n var ok = true;\n if (arguments.length == 1) {\n if (typeof(x) == \"object\") {\n if (x instanceof CSG.Vector2D) {\n this._x = x._x;\n this._y = x._y;\n } else if (x instanceof Array) {\n this._x = parseFloat(x[0]);\n this._y = parseFloat(x[1]);\n } else if (('x' in x) && ('y' in x)) {\n this._x = parseFloat(x.x);\n this._y = parseFloat(x.y);\n } else ok = false;\n } else {\n var v = parseFloat(x);\n this._x = v;\n this._y = v;\n }\n } else ok = false;\n if (ok) {\n if ((!CSG.IsFloat(this._x)) || (!CSG.IsFloat(this._y))) ok = false;\n }\n if (!ok) {\n throw new Error(\"wrong arguments\");\n }\n }\n };\n\n CSG.Vector2D.fromAngle = function(radians) {\n return CSG.Vector2D.fromAngleRadians(radians);\n };\n\n CSG.Vector2D.fromAngleDegrees = function(degrees) {\n var radians = Math.PI * degrees / 180;\n return CSG.Vector2D.fromAngleRadians(radians);\n };\n\n CSG.Vector2D.fromAngleRadians = function(radians) {\n return CSG.Vector2D.Create(Math.cos(radians), Math.sin(radians));\n };\n\n // This does the same as new CSG.Vector2D(x,y) but it doesn't go through the constructor\n // and the parameters are not validated. Is much faster.\n CSG.Vector2D.Create = function(x, y) {\n var result = Object.create(CSG.Vector2D.prototype);\n result._x = x;\n result._y = y;\n return result;\n };\n\n CSG.Vector2D.prototype = {\n get x() {\n return this._x;\n },\n get y() {\n return this._y;\n },\n\n set x(v) {\n throw new Error(\"Vector2D is immutable\");\n },\n set y(v) {\n throw new Error(\"Vector2D is immutable\");\n },\n\n // extend to a 3D vector by adding a z coordinate:\n toVector3D: function(z) {\n return new CSG.Vector3D(this._x, this._y, z);\n },\n\n equals: function(a) {\n return (this._x == a._x) && (this._y == a._y);\n },\n\n clone: function() {\n return CSG.Vector2D.Create(this._x, this._y);\n },\n\n negated: function() {\n return CSG.Vector2D.Create(-this._x, -this._y);\n },\n\n plus: function(a) {\n return CSG.Vector2D.Create(this._x + a._x, this._y + a._y);\n },\n\n minus: function(a) {\n return CSG.Vector2D.Create(this._x - a._x, this._y - a._y);\n },\n\n times: function(a) {\n return CSG.Vector2D.Create(this._x * a, this._y * a);\n },\n\n dividedBy: function(a) {\n return CSG.Vector2D.Create(this._x / a, this._y / a);\n },\n\n dot: function(a) {\n return this._x * a._x + this._y * a._y;\n },\n\n lerp: function(a, t) {\n return this.plus(a.minus(this).times(t));\n },\n\n length: function() {\n return Math.sqrt(this.dot(this));\n },\n\n distanceTo: function(a) {\n return this.minus(a).length();\n },\n\n distanceToSquared: function(a) {\n return this.minus(a).lengthSquared();\n },\n\n lengthSquared: function() {\n return this.dot(this);\n },\n\n unit: function() {\n return this.dividedBy(this.length());\n },\n\n cross: function(a) {\n return this._x * a._y - this._y * a._x;\n },\n\n // returns the vector rotated by 90 degrees clockwise\n normal: function() {\n return CSG.Vector2D.Create(this._y, -this._x);\n },\n\n // Right multiply by a 4x4 matrix (the vector is interpreted as a row vector)\n // Returns a new CSG.Vector2D\n multiply4x4: function(matrix4x4) {\n return matrix4x4.leftMultiply1x2Vector(this);\n },\n\n transform: function(matrix4x4) {\n return matrix4x4.leftMultiply1x2Vector(this);\n },\n\n angle: function() {\n return this.angleRadians();\n },\n\n angleDegrees: function() {\n var radians = this.angleRadians();\n return 180 * radians / Math.PI;\n },\n\n angleRadians: function() {\n // y=sin, x=cos\n return Math.atan2(this._y, this._x);\n },\n\n min: function(p) {\n return CSG.Vector2D.Create(\n Math.min(this._x, p._x), Math.min(this._y, p._y));\n },\n\n max: function(p) {\n return CSG.Vector2D.Create(\n Math.max(this._x, p._x), Math.max(this._y, p._y));\n },\n\n toString: function() {\n return \"(\" + this._x.toFixed(2) + \", \" + this._y.toFixed(2) + \")\";\n },\n\n abs: function() {\n return CSG.Vector2D.Create(Math.abs(this._x), Math.abs(this._y));\n },\n };\n\n\n // # class Line2D\n // Represents a directional line in 2D space\n // A line is parametrized by its normal vector (perpendicular to the line, rotated 90 degrees counter clockwise)\n // and w. The line passes through the point .times(w).\n // normal must be a unit vector!\n // Equation: p is on line if normal.dot(p)==w\n CSG.Line2D = function(normal, w) {\n normal = new CSG.Vector2D(normal);\n w = parseFloat(w);\n var l = normal.length();\n // normalize:\n w *= l;\n normal = normal.times(1.0 / l);\n this.normal = normal;\n this.w = w;\n };\n\n CSG.Line2D.fromPoints = function(p1, p2) {\n p1 = new CSG.Vector2D(p1);\n p2 = new CSG.Vector2D(p2);\n var direction = p2.minus(p1);\n var normal = direction.normal().negated().unit();\n var w = p1.dot(normal);\n return new CSG.Line2D(normal, w);\n };\n\n CSG.Line2D.prototype = {\n // same line but opposite direction:\n reverse: function() {\n return new CSG.Line2D(this.normal.negated(), -this.w);\n },\n\n equals: function(l) {\n return (l.normal.equals(this.normal) && (l.w == this.w));\n },\n\n origin: function() {\n return this.normal.times(this.w);\n },\n\n direction: function() {\n return this.normal.normal();\n },\n\n xAtY: function(y) {\n // (py == y) && (normal * p == w)\n // -> px = (w - normal._y * y) / normal.x\n var x = (this.w - this.normal._y * y) / this.normal.x;\n return x;\n },\n\n absDistanceToPoint: function(point) {\n point = new CSG.Vector2D(point);\n var point_projected = point.dot(this.normal);\n var distance = Math.abs(point_projected - this.w);\n return distance;\n },\n /*FIXME: has error - origin is not defined, the method is never used\n closestPoint: function(point) {\n point = new CSG.Vector2D(point);\n var vector = point.dot(this.direction());\n return origin.plus(vector);\n },\n */\n\n // intersection between two lines, returns point as Vector2D\n intersectWithLine: function(line2d) {\n var point = CSG.solve2Linear(this.normal.x, this.normal.y, line2d.normal.x, line2d.normal.y, this.w, line2d.w);\n point = new CSG.Vector2D(point); // make vector2d\n return point;\n },\n\n transform: function(matrix4x4) {\n var origin = new CSG.Vector2D(0, 0);\n var pointOnPlane = this.normal.times(this.w);\n var neworigin = origin.multiply4x4(matrix4x4);\n var neworiginPlusNormal = this.normal.multiply4x4(matrix4x4);\n var newnormal = neworiginPlusNormal.minus(neworigin);\n var newpointOnPlane = pointOnPlane.multiply4x4(matrix4x4);\n var neww = newnormal.dot(newpointOnPlane);\n return new CSG.Line2D(newnormal, neww);\n }\n };\n\n // # class Line3D\n // Represents a line in 3D space\n // direction must be a unit vector\n // point is a random point on the line\n CSG.Line3D = function(point, direction) {\n point = new CSG.Vector3D(point);\n direction = new CSG.Vector3D(direction);\n this.point = point;\n this.direction = direction.unit();\n };\n\n CSG.Line3D.fromPoints = function(p1, p2) {\n p1 = new CSG.Vector3D(p1);\n p2 = new CSG.Vector3D(p2);\n var direction = p2.minus(p1);\n return new CSG.Line3D(p1, direction);\n };\n\n CSG.Line3D.fromPlanes = function(p1, p2) {\n var direction = p1.normal.cross(p2.normal);\n var l = direction.length();\n if (l < 1e-10) {\n throw new Error(\"Parallel planes\");\n }\n direction = direction.times(1.0 / l);\n\n var mabsx = Math.abs(direction.x);\n var mabsy = Math.abs(direction.y);\n var mabsz = Math.abs(direction.z);\n var origin;\n if ((mabsx >= mabsy) && (mabsx >= mabsz)) {\n // direction vector is mostly pointing towards x\n // find a point p for which x is zero:\n var r = CSG.solve2Linear(p1.normal.y, p1.normal.z, p2.normal.y, p2.normal.z, p1.w, p2.w);\n origin = new CSG.Vector3D(0, r[0], r[1]);\n } else if ((mabsy >= mabsx) && (mabsy >= mabsz)) {\n // find a point p for which y is zero:\n var r = CSG.solve2Linear(p1.normal.x, p1.normal.z, p2.normal.x, p2.normal.z, p1.w, p2.w);\n origin = new CSG.Vector3D(r[0], 0, r[1]);\n } else {\n // find a point p for which z is zero:\n var r = CSG.solve2Linear(p1.normal.x, p1.normal.y, p2.normal.x, p2.normal.y, p1.w, p2.w);\n origin = new CSG.Vector3D(r[0], r[1], 0);\n }\n return new CSG.Line3D(origin, direction);\n };\n\n\n CSG.Line3D.prototype = {\n intersectWithPlane: function(plane) {\n // plane: plane.normal * p = plane.w\n // line: p=line.point + labda * line.direction\n var labda = (plane.w - plane.normal.dot(this.point)) / plane.normal.dot(this.direction);\n var point = this.point.plus(this.direction.times(labda));\n return point;\n },\n\n clone: function(line) {\n return new CSG.Line3D(this.point.clone(), this.direction.clone());\n },\n\n reverse: function() {\n return new CSG.Line3D(this.point.clone(), this.direction.negated());\n },\n\n transform: function(matrix4x4) {\n var newpoint = this.point.multiply4x4(matrix4x4);\n var pointPlusDirection = this.point.plus(this.direction);\n var newPointPlusDirection = pointPlusDirection.multiply4x4(matrix4x4);\n var newdirection = newPointPlusDirection.minus(newpoint);\n return new CSG.Line3D(newpoint, newdirection);\n },\n\n closestPointOnLine: function(point) {\n point = new CSG.Vector3D(point);\n var t = point.minus(this.point).dot(this.direction) / this.direction.dot(this.direction);\n var closestpoint = this.point.plus(this.direction.times(t));\n return closestpoint;\n },\n\n distanceToPoint: function(point) {\n point = new CSG.Vector3D(point);\n var closestpoint = this.closestPointOnLine(point);\n var distancevector = point.minus(closestpoint);\n var distance = distancevector.length();\n return distance;\n },\n\n equals: function(line3d) {\n if (!this.direction.equals(line3d.direction)) return false;\n var distance = this.distanceToPoint(line3d.point);\n if (distance > 1e-8) return false;\n return true;\n }\n };\n\n\n // # class OrthoNormalBasis\n // Reprojects points on a 3D plane onto a 2D plane\n // or from a 2D plane back onto the 3D plane\n CSG.OrthoNormalBasis = function(plane, rightvector) {\n if (arguments.length < 2) {\n // choose an arbitrary right hand vector, making sure it is somewhat orthogonal to the plane normal:\n rightvector = plane.normal.randomNonParallelVector();\n } else {\n rightvector = new CSG.Vector3D(rightvector);\n }\n this.v = plane.normal.cross(rightvector).unit();\n this.u = this.v.cross(plane.normal);\n this.plane = plane;\n this.planeorigin = plane.normal.times(plane.w);\n };\n\n // Get an orthonormal basis for the standard XYZ planes.\n // Parameters: the names of two 3D axes. The 2d x axis will map to the first given 3D axis, the 2d y \n // axis will map to the second.\n // Prepend the axis with a \"-\" to invert the direction of this axis.\n // For example: CSG.OrthoNormalBasis.GetCartesian(\"-Y\",\"Z\")\n // will return an orthonormal basis where the 2d X axis maps to the 3D inverted Y axis, and\n // the 2d Y axis maps to the 3D Z axis.\n CSG.OrthoNormalBasis.GetCartesian = function(xaxisid, yaxisid) {\n var axisid = xaxisid + \"/\" + yaxisid;\n var planenormal, rightvector;\n if (axisid == \"X/Y\") {\n planenormal = [0, 0, 1];\n rightvector = [1, 0, 0];\n } else if (axisid == \"Y/-X\") {\n planenormal = [0, 0, 1];\n rightvector = [0, 1, 0];\n } else if (axisid == \"-X/-Y\") {\n planenormal = [0, 0, 1];\n rightvector = [-1, 0, 0];\n } else if (axisid == \"-Y/X\") {\n planenormal = [0, 0, 1];\n rightvector = [0, -1, 0];\n } else if (axisid == \"-X/Y\") {\n planenormal = [0, 0, -1];\n rightvector = [-1, 0, 0];\n } else if (axisid == \"-Y/-X\") {\n planenormal = [0, 0, -1];\n rightvector = [0, -1, 0];\n } else if (axisid == \"X/-Y\") {\n planenormal = [0, 0, -1];\n rightvector = [1, 0, 0];\n } else if (axisid == \"Y/X\") {\n planenormal = [0, 0, -1];\n rightvector = [0, 1, 0];\n } else if (axisid == \"X/Z\") {\n planenormal = [0, -1, 0];\n rightvector = [1, 0, 0];\n } else if (axisid == \"Z/-X\") {\n planenormal = [0, -1, 0];\n rightvector = [0, 0, 1];\n } else if (axisid == \"-X/-Z\") {\n planenormal = [0, -1, 0];\n rightvector = [-1, 0, 0];\n } else if (axisid == \"-Z/X\") {\n planenormal = [0, -1, 0];\n rightvector = [0, 0, -1];\n } else if (axisid == \"-X/Z\") {\n planenormal = [0, 1, 0];\n rightvector = [-1, 0, 0];\n } else if (axisid == \"-Z/-X\") {\n planenormal = [0, 1, 0];\n rightvector = [0, 0, -1];\n } else if (axisid == \"X/-Z\") {\n planenormal = [0, 1, 0];\n rightvector = [1, 0, 0];\n } else if (axisid == \"Z/X\") {\n planenormal = [0, 1, 0];\n rightvector = [0, 0, 1];\n } else if (axisid == \"Y/Z\") {\n planenormal = [1, 0, 0];\n rightvector = [0, 1, 0];\n } else if (axisid == \"Z/-Y\") {\n planenormal = [1, 0, 0];\n rightvector = [0, 0, 1];\n } else if (axisid == \"-Y/-Z\") {\n planenormal = [1, 0, 0];\n rightvector = [0, -1, 0];\n } else if (axisid == \"-Z/Y\") {\n planenormal = [1, 0, 0];\n rightvector = [0, 0, -1];\n } else if (axisid == \"-Y/Z\") {\n planenormal = [-1, 0, 0];\n rightvector = [0, -1, 0];\n } else if (axisid == \"-Z/-Y\") {\n planenormal = [-1, 0, 0];\n rightvector = [0, 0, -1];\n } else if (axisid == \"Y/-Z\") {\n planenormal = [-1, 0, 0];\n rightvector = [0, 1, 0];\n } else if (axisid == \"Z/Y\") {\n planenormal = [-1, 0, 0];\n rightvector = [0, 0, 1];\n } else {\n throw new Error(\"CSG.OrthoNormalBasis.GetCartesian: invalid combination of axis identifiers. Should pass two string arguments from [X,Y,Z,-X,-Y,-Z], being two different axes.\");\n }\n return new CSG.OrthoNormalBasis(new CSG.Plane(new CSG.Vector3D(planenormal), 0), new CSG.Vector3D(rightvector));\n };\n\n /*\n // test code for CSG.OrthoNormalBasis.GetCartesian()\n CSG.OrthoNormalBasis.GetCartesian_Test=function() {\n var axisnames=[\"X\",\"Y\",\"Z\",\"-X\",\"-Y\",\"-Z\"];\n var axisvectors=[[1,0,0], [0,1,0], [0,0,1], [-1,0,0], [0,-1,0], [0,0,-1]];\n for(var axis1=0; axis1 < 3; axis1++) {\n for(var axis1inverted=0; axis1inverted < 2; axis1inverted++) {\n var axis1name=axisnames[axis1+3*axis1inverted];\n var axis1vector=axisvectors[axis1+3*axis1inverted];\n for(var axis2=0; axis2 < 3; axis2++) {\n if(axis2 != axis1) {\n for(var axis2inverted=0; axis2inverted < 2; axis2inverted++) {\n var axis2name=axisnames[axis2+3*axis2inverted];\n var axis2vector=axisvectors[axis2+3*axis2inverted];\n var orthobasis=CSG.OrthoNormalBasis.GetCartesian(axis1name, axis2name);\n var test1=orthobasis.to3D(new CSG.Vector2D([1,0]));\n var test2=orthobasis.to3D(new CSG.Vector2D([0,1]));\n var expected1=new CSG.Vector3D(axis1vector);\n var expected2=new CSG.Vector3D(axis2vector);\n var d1=test1.distanceTo(expected1);\n var d2=test2.distanceTo(expected2);\n if( (d1 > 0.01) || (d2 > 0.01) ) {\n throw new Error(\"Wrong!\");\n }}}}}}\n throw new Error(\"OK\");\n };\n */\n\n // The z=0 plane, with the 3D x and y vectors mapped to the 2D x and y vector\n CSG.OrthoNormalBasis.Z0Plane = function() {\n var plane = new CSG.Plane(new CSG.Vector3D([0, 0, 1]), 0);\n return new CSG.OrthoNormalBasis(plane, new CSG.Vector3D([1, 0, 0]));\n };\n\n CSG.OrthoNormalBasis.prototype = {\n getProjectionMatrix: function() {\n return new CSG.Matrix4x4([\n this.u.x, this.v.x, this.plane.normal.x, 0,\n this.u.y, this.v.y, this.plane.normal.y, 0,\n this.u.z, this.v.z, this.plane.normal.z, 0,\n 0, 0, -this.plane.w, 1\n ]);\n },\n\n getInverseProjectionMatrix: function() {\n var p = this.plane.normal.times(this.plane.w);\n return new CSG.Matrix4x4([\n this.u.x, this.u.y, this.u.z, 0,\n this.v.x, this.v.y, this.v.z, 0,\n this.plane.normal.x, this.plane.normal.y, this.plane.normal.z, 0,\n p.x, p.y, p.z, 1\n ]);\n },\n\n to2D: function(vec3) {\n return new CSG.Vector2D(vec3.dot(this.u), vec3.dot(this.v));\n },\n\n to3D: function(vec2) {\n return this.planeorigin.plus(this.u.times(vec2.x)).plus(this.v.times(vec2.y));\n },\n\n line3Dto2D: function(line3d) {\n var a = line3d.point;\n var b = line3d.direction.plus(a);\n var a2d = this.to2D(a);\n var b2d = this.to2D(b);\n return CSG.Line2D.fromPoints(a2d, b2d);\n },\n\n line2Dto3D: function(line2d) {\n var a = line2d.origin();\n var b = line2d.direction().plus(a);\n var a3d = this.to3D(a);\n var b3d = this.to3D(b);\n return CSG.Line3D.fromPoints(a3d, b3d);\n },\n\n transform: function(matrix4x4) {\n // todo: this may not work properly in case of mirroring\n var newplane = this.plane.transform(matrix4x4);\n var rightpoint_transformed = this.u.transform(matrix4x4);\n var origin_transformed = new CSG.Vector3D(0, 0, 0).transform(matrix4x4);\n var newrighthandvector = rightpoint_transformed.minus(origin_transformed);\n var newbasis = new CSG.OrthoNormalBasis(newplane, newrighthandvector);\n return newbasis;\n }\n };\n\n function insertSorted(array, element, comparefunc) {\n var leftbound = 0;\n var rightbound = array.length;\n while (rightbound > leftbound) {\n var testindex = Math.floor((leftbound + rightbound) / 2);\n var testelement = array[testindex];\n var compareresult = comparefunc(element, testelement);\n if (compareresult > 0) // element > testelement\n {\n leftbound = testindex + 1;\n } else {\n rightbound = testindex;\n }\n }\n array.splice(leftbound, 0, element);\n }\n\n // Get the x coordinate of a point with a certain y coordinate, interpolated between two\n // points (CSG.Vector2D).\n // Interpolation is robust even if the points have the same y coordinate\n CSG.interpolateBetween2DPointsForY = function(point1, point2, y) {\n var f1 = y - point1.y;\n var f2 = point2.y - point1.y;\n if (f2 < 0) {\n f1 = -f1;\n f2 = -f2;\n }\n var t;\n if (f1 <= 0) {\n t = 0.0;\n } else if (f1 >= f2) {\n t = 1.0;\n } else if (f2 < 1e-10) {\n t = 0.5;\n } else {\n t = f1 / f2;\n }\n var result = point1.x + t * (point2.x - point1.x);\n return result;\n };\n\n // Retesselation function for a set of coplanar polygons. See the introduction at the top of\n // this file.\n CSG.reTesselateCoplanarPolygons = function(sourcepolygons, destpolygons) {\n var EPS = 1e-5;\n\n var numpolygons = sourcepolygons.length;\n if (numpolygons > 0) {\n var plane = sourcepolygons[0].plane;\n var shared = sourcepolygons[0].shared;\n var orthobasis = new CSG.OrthoNormalBasis(plane);\n var polygonvertices2d = []; // array of array of CSG.Vector2D\n var polygontopvertexindexes = []; // array of indexes of topmost vertex per polygon\n var topy2polygonindexes = {};\n var ycoordinatetopolygonindexes = {};\n\n var xcoordinatebins = {};\n var ycoordinatebins = {};\n\n // convert all polygon vertices to 2D\n // Make a list of all encountered y coordinates\n // And build a map of all polygons that have a vertex at a certain y coordinate:\n var ycoordinateBinningFactor = 1.0 / EPS * 10;\n for (var polygonindex = 0; polygonindex < numpolygons; polygonindex++) {\n var poly3d = sourcepolygons[polygonindex];\n var vertices2d = [];\n var numvertices = poly3d.vertices.length;\n var minindex = -1;\n if (numvertices > 0) {\n var miny, maxy, maxindex;\n for (var i = 0; i < numvertices; i++) {\n var pos2d = orthobasis.to2D(poly3d.vertices[i].pos);\n // perform binning of y coordinates: If we have multiple vertices very\n // close to each other, give them the same y coordinate:\n var ycoordinatebin = Math.floor(pos2d.y * ycoordinateBinningFactor);\n var newy;\n if (ycoordinatebin in ycoordinatebins) {\n newy = ycoordinatebins[ycoordinatebin];\n } else if (ycoordinatebin + 1 in ycoordinatebins) {\n newy = ycoordinatebins[ycoordinatebin + 1];\n } else if (ycoordinatebin - 1 in ycoordinatebins) {\n newy = ycoordinatebins[ycoordinatebin - 1];\n } else {\n newy = pos2d.y;\n ycoordinatebins[ycoordinatebin] = pos2d.y;\n }\n pos2d = CSG.Vector2D.Create(pos2d.x, newy);\n vertices2d.push(pos2d);\n var y = pos2d.y;\n if ((i === 0) || (y < miny)) {\n miny = y;\n minindex = i;\n }\n if ((i === 0) || (y > maxy)) {\n maxy = y;\n maxindex = i;\n }\n if (!(y in ycoordinatetopolygonindexes)) {\n ycoordinatetopolygonindexes[y] = {};\n }\n ycoordinatetopolygonindexes[y][polygonindex] = true;\n }\n if (miny >= maxy) {\n // degenerate polygon, all vertices have same y coordinate. Just ignore it from now:\n vertices2d = [];\n numvertices = 0;\n minindex = -1;\n } else {\n if (!(miny in topy2polygonindexes)) {\n topy2polygonindexes[miny] = [];\n }\n topy2polygonindexes[miny].push(polygonindex);\n }\n } // if(numvertices > 0)\n // reverse the vertex order:\n vertices2d.reverse();\n minindex = numvertices - minindex - 1;\n polygonvertices2d.push(vertices2d);\n polygontopvertexindexes.push(minindex);\n }\n var ycoordinates = [];\n for (var ycoordinate in ycoordinatetopolygonindexes) ycoordinates.push(ycoordinate);\n ycoordinates.sort(fnNumberSort);\n\n // Now we will iterate over all y coordinates, from lowest to highest y coordinate\n // activepolygons: source polygons that are 'active', i.e. intersect with our y coordinate\n // Is sorted so the polygons are in left to right order\n // Each element in activepolygons has these properties:\n // polygonindex: the index of the source polygon (i.e. an index into the sourcepolygons\n // and polygonvertices2d arrays)\n // leftvertexindex: the index of the vertex at the left side of the polygon (lowest x)\n // that is at or just above the current y coordinate\n // rightvertexindex: dito at right hand side of polygon\n // topleft, bottomleft: coordinates of the left side of the polygon crossing the current y coordinate\n // topright, bottomright: coordinates of the right hand side of the polygon crossing the current y coordinate\n var activepolygons = [];\n var prevoutpolygonrow = [];\n for (var yindex = 0; yindex < ycoordinates.length; yindex++) {\n var newoutpolygonrow = [];\n var ycoordinate_as_string = ycoordinates[yindex];\n var ycoordinate = Number(ycoordinate_as_string);\n\n // update activepolygons for this y coordinate:\n // - Remove any polygons that end at this y coordinate\n // - update leftvertexindex and rightvertexindex (which point to the current vertex index\n // at the the left and right side of the polygon\n // Iterate over all polygons that have a corner at this y coordinate:\n var polygonindexeswithcorner = ycoordinatetopolygonindexes[ycoordinate_as_string];\n for (var activepolygonindex = 0; activepolygonindex < activepolygons.length; ++activepolygonindex) {\n var activepolygon = activepolygons[activepolygonindex];\n var polygonindex = activepolygon.polygonindex;\n if (polygonindexeswithcorner[polygonindex]) {\n // this active polygon has a corner at this y coordinate:\n var vertices2d = polygonvertices2d[polygonindex];\n var numvertices = vertices2d.length;\n var newleftvertexindex = activepolygon.leftvertexindex;\n var newrightvertexindex = activepolygon.rightvertexindex;\n // See if we need to increase leftvertexindex or decrease rightvertexindex:\n while (true) {\n var nextleftvertexindex = newleftvertexindex + 1;\n if (nextleftvertexindex >= numvertices) nextleftvertexindex = 0;\n if (vertices2d[nextleftvertexindex].y != ycoordinate) break;\n newleftvertexindex = nextleftvertexindex;\n }\n var nextrightvertexindex = newrightvertexindex - 1;\n if (nextrightvertexindex < 0) nextrightvertexindex = numvertices - 1;\n if (vertices2d[nextrightvertexindex].y == ycoordinate) {\n newrightvertexindex = nextrightvertexindex;\n }\n if ((newleftvertexindex != activepolygon.leftvertexindex) && (newleftvertexindex == newrightvertexindex)) {\n // We have increased leftvertexindex or decreased rightvertexindex, and now they point to the same vertex\n // This means that this is the bottom point of the polygon. We'll remove it:\n activepolygons.splice(activepolygonindex, 1);\n --activepolygonindex;\n } else {\n activepolygon.leftvertexindex = newleftvertexindex;\n activepolygon.rightvertexindex = newrightvertexindex;\n activepolygon.topleft = vertices2d[newleftvertexindex];\n activepolygon.topright = vertices2d[newrightvertexindex];\n var nextleftvertexindex = newleftvertexindex + 1;\n if (nextleftvertexindex >= numvertices) nextleftvertexindex = 0;\n activepolygon.bottomleft = vertices2d[nextleftvertexindex];\n var nextrightvertexindex = newrightvertexindex - 1;\n if (nextrightvertexindex < 0) nextrightvertexindex = numvertices - 1;\n activepolygon.bottomright = vertices2d[nextrightvertexindex];\n }\n } // if polygon has corner here\n } // for activepolygonindex\n var nextycoordinate;\n if (yindex >= ycoordinates.length - 1) {\n // last row, all polygons must be finished here:\n activepolygons = [];\n nextycoordinate = null;\n } else // yindex < ycoordinates.length-1\n {\n nextycoordinate = Number(ycoordinates[yindex + 1]);\n var middleycoordinate = 0.5 * (ycoordinate + nextycoordinate);\n // update activepolygons by adding any polygons that start here:\n var startingpolygonindexes = topy2polygonindexes[ycoordinate_as_string];\n for (var polygonindex_key in startingpolygonindexes) {\n var polygonindex = startingpolygonindexes[polygonindex_key];\n var vertices2d = polygonvertices2d[polygonindex];\n var numvertices = vertices2d.length;\n var topvertexindex = polygontopvertexindexes[polygonindex];\n // the top of the polygon may be a horizontal line. In that case topvertexindex can point to any point on this line.\n // Find the left and right topmost vertices which have the current y coordinate:\n var topleftvertexindex = topvertexindex;\n while (true) {\n var i = topleftvertexindex + 1;\n if (i >= numvertices) i = 0;\n if (vertices2d[i].y != ycoordinate) break;\n if (i == topvertexindex) break; // should not happen, but just to prevent endless loops\n topleftvertexindex = i;\n }\n var toprightvertexindex = topvertexindex;\n while (true) {\n var i = toprightvertexindex - 1;\n if (i < 0) i = numvertices - 1;\n if (vertices2d[i].y != ycoordinate) break;\n if (i == topleftvertexindex) break; // should not happen, but just to prevent endless loops\n toprightvertexindex = i;\n }\n var nextleftvertexindex = topleftvertexindex + 1;\n if (nextleftvertexindex >= numvertices) nextleftvertexindex = 0;\n var nextrightvertexindex = toprightvertexindex - 1;\n if (nextrightvertexindex < 0) nextrightvertexindex = numvertices - 1;\n var newactivepolygon = {\n polygonindex: polygonindex,\n leftvertexindex: topleftvertexindex,\n rightvertexindex: toprightvertexindex,\n topleft: vertices2d[topleftvertexindex],\n topright: vertices2d[toprightvertexindex],\n bottomleft: vertices2d[nextleftvertexindex],\n bottomright: vertices2d[nextrightvertexindex],\n };\n insertSorted(activepolygons, newactivepolygon, function(el1, el2) {\n var x1 = CSG.interpolateBetween2DPointsForY(\n el1.topleft, el1.bottomleft, middleycoordinate);\n var x2 = CSG.interpolateBetween2DPointsForY(\n el2.topleft, el2.bottomleft, middleycoordinate);\n if (x1 > x2) return 1;\n if (x1 < x2) return -1;\n return 0;\n });\n } // for(var polygonindex in startingpolygonindexes)\n } // yindex < ycoordinates.length-1\n //if( (yindex == ycoordinates.length-1) || (nextycoordinate - ycoordinate > EPS) )\n if (true) {\n // Now activepolygons is up to date\n // Build the output polygons for the next row in newoutpolygonrow:\n for (var activepolygon_key in activepolygons) {\n var activepolygon = activepolygons[activepolygon_key];\n var polygonindex = activepolygon.polygonindex;\n var vertices2d = polygonvertices2d[polygonindex];\n var numvertices = vertices2d.length;\n\n var x = CSG.interpolateBetween2DPointsForY(activepolygon.topleft, activepolygon.bottomleft, ycoordinate);\n var topleft = CSG.Vector2D.Create(x, ycoordinate);\n x = CSG.interpolateBetween2DPointsForY(activepolygon.topright, activepolygon.bottomright, ycoordinate);\n var topright = CSG.Vector2D.Create(x, ycoordinate);\n x = CSG.interpolateBetween2DPointsForY(activepolygon.topleft, activepolygon.bottomleft, nextycoordinate);\n var bottomleft = CSG.Vector2D.Create(x, nextycoordinate);\n x = CSG.interpolateBetween2DPointsForY(activepolygon.topright, activepolygon.bottomright, nextycoordinate);\n var bottomright = CSG.Vector2D.Create(x, nextycoordinate);\n var outpolygon = {\n topleft: topleft,\n topright: topright,\n bottomleft: bottomleft,\n bottomright: bottomright,\n leftline: CSG.Line2D.fromPoints(topleft, bottomleft),\n rightline: CSG.Line2D.fromPoints(bottomright, topright)\n };\n if (newoutpolygonrow.length > 0) {\n var prevoutpolygon = newoutpolygonrow[newoutpolygonrow.length - 1];\n var d1 = outpolygon.topleft.distanceTo(prevoutpolygon.topright);\n var d2 = outpolygon.bottomleft.distanceTo(prevoutpolygon.bottomright);\n if ((d1 < EPS) && (d2 < EPS)) {\n // we can join this polygon with the one to the left:\n outpolygon.topleft = prevoutpolygon.topleft;\n outpolygon.leftline = prevoutpolygon.leftline;\n outpolygon.bottomleft = prevoutpolygon.bottomleft;\n newoutpolygonrow.splice(newoutpolygonrow.length - 1, 1);\n }\n }\n newoutpolygonrow.push(outpolygon);\n } // for(activepolygon in activepolygons)\n if (yindex > 0) {\n // try to match the new polygons against the previous row:\n var prevcontinuedindexes = {};\n var matchedindexes = {};\n for (var i = 0; i < newoutpolygonrow.length; i++) {\n var thispolygon = newoutpolygonrow[i];\n for (var ii = 0; ii < prevoutpolygonrow.length; ii++) {\n if (!matchedindexes[ii]) // not already processed?\n {\n // We have a match if the sidelines are equal or if the top coordinates\n // are on the sidelines of the previous polygon\n var prevpolygon = prevoutpolygonrow[ii];\n if (prevpolygon.bottomleft.distanceTo(thispolygon.topleft) < EPS) {\n if (prevpolygon.bottomright.distanceTo(thispolygon.topright) < EPS) {\n // Yes, the top of this polygon matches the bottom of the previous:\n matchedindexes[ii] = true;\n // Now check if the joined polygon would remain convex:\n var d1 = thispolygon.leftline.direction().x - prevpolygon.leftline.direction().x;\n var d2 = thispolygon.rightline.direction().x - prevpolygon.rightline.direction().x;\n var leftlinecontinues = Math.abs(d1) < EPS;\n var rightlinecontinues = Math.abs(d2) < EPS;\n var leftlineisconvex = leftlinecontinues || (d1 >= 0);\n var rightlineisconvex = rightlinecontinues || (d2 >= 0);\n if (leftlineisconvex && rightlineisconvex) {\n // yes, both sides have convex corners:\n // This polygon will continue the previous polygon\n thispolygon.outpolygon = prevpolygon.outpolygon;\n thispolygon.leftlinecontinues = leftlinecontinues;\n thispolygon.rightlinecontinues = rightlinecontinues;\n prevcontinuedindexes[ii] = true;\n }\n break;\n }\n }\n } // if(!prevcontinuedindexes[ii])\n } // for ii\n } // for i\n for (var ii = 0; ii < prevoutpolygonrow.length; ii++) {\n if (!prevcontinuedindexes[ii]) {\n // polygon ends here\n // Finish the polygon with the last point(s):\n var prevpolygon = prevoutpolygonrow[ii];\n prevpolygon.outpolygon.rightpoints.push(prevpolygon.bottomright);\n if (prevpolygon.bottomright.distanceTo(prevpolygon.bottomleft) > EPS) {\n // polygon ends with a horizontal line:\n prevpolygon.outpolygon.leftpoints.push(prevpolygon.bottomleft);\n }\n // reverse the left half so we get a counterclockwise circle:\n prevpolygon.outpolygon.leftpoints.reverse();\n var points2d = prevpolygon.outpolygon.rightpoints.concat(prevpolygon.outpolygon.leftpoints);\n var vertices3d = [];\n points2d.map(function(point2d) {\n var point3d = orthobasis.to3D(point2d);\n var vertex3d = new CSG.Vertex(point3d);\n vertices3d.push(vertex3d);\n });\n var polygon = new CSG.Polygon(vertices3d, shared, plane);\n destpolygons.push(polygon);\n }\n }\n } // if(yindex > 0)\n for (var i = 0; i < newoutpolygonrow.length; i++) {\n var thispolygon = newoutpolygonrow[i];\n if (!thispolygon.outpolygon) {\n // polygon starts here:\n thispolygon.outpolygon = {\n leftpoints: [],\n rightpoints: []\n };\n thispolygon.outpolygon.leftpoints.push(thispolygon.topleft);\n if (thispolygon.topleft.distanceTo(thispolygon.topright) > EPS) {\n // we have a horizontal line at the top:\n thispolygon.outpolygon.rightpoints.push(thispolygon.topright);\n }\n } else {\n // continuation of a previous row\n if (!thispolygon.leftlinecontinues) {\n thispolygon.outpolygon.leftpoints.push(thispolygon.topleft);\n }\n if (!thispolygon.rightlinecontinues) {\n thispolygon.outpolygon.rightpoints.push(thispolygon.topright);\n }\n }\n }\n prevoutpolygonrow = newoutpolygonrow;\n }\n } // for yindex\n } // if(numpolygons > 0)\n };\n\n ////////////////////////////////\n // ## class fuzzyFactory\n // This class acts as a factory for objects. We can search for an object with approximately\n // the desired properties (say a rectangle with width 2 and height 1)\n // The lookupOrCreate() method looks for an existing object (for example it may find an existing rectangle\n // with width 2.0001 and height 0.999. If no object is found, the user supplied callback is\n // called, which should generate a new object. The new object is inserted into the database\n // so it can be found by future lookupOrCreate() calls.\n // Constructor:\n // numdimensions: the number of parameters for each object\n // for example for a 2D rectangle this would be 2\n // tolerance: The maximum difference for each parameter allowed to be considered a match\n CSG.fuzzyFactory = function(numdimensions, tolerance) {\n this.lookuptable = {};\n this.multiplier = 1.0 / tolerance;\n };\n\n CSG.fuzzyFactory.prototype = {\n // var obj = f.lookupOrCreate([el1, el2, el3], function(elements) {/* create the new object */});\n // Performs a fuzzy lookup of the object with the specified elements.\n // If found, returns the existing object\n // If not found, calls the supplied callback function which should create a new object with\n // the specified properties. This object is inserted in the lookup database.\n lookupOrCreate: function(els, creatorCallback) {\n var hash = \"\";\n var multiplier = this.multiplier;\n els.forEach(function(el) {\n var valueQuantized = Math.round(el * multiplier);\n hash += valueQuantized + \"/\";\n });\n if (hash in this.lookuptable) {\n return this.lookuptable[hash];\n } else {\n var object = creatorCallback(els);\n var hashparts = els.map(function(el) {\n var q0 = Math.floor(el * multiplier);\n var q1 = q0 + 1;\n return [\"\" + q0 + \"/\", \"\" + q1 + \"/\"];\n });\n var numelements = els.length;\n var numhashes = 1 << numelements;\n for (var hashmask = 0; hashmask < numhashes; ++hashmask) {\n var hashmask_shifted = hashmask;\n hash = \"\";\n hashparts.forEach(function(hashpart) {\n hash += hashpart[hashmask_shifted & 1];\n hashmask_shifted >>= 1;\n });\n this.lookuptable[hash] = object;\n }\n return object;\n }\n },\n };\n\n\n //////////////////////////////////////\n CSG.fuzzyCSGFactory = function() {\n this.vertexfactory = new CSG.fuzzyFactory(3, 1e-5);\n this.planefactory = new CSG.fuzzyFactory(4, 1e-5);\n this.polygonsharedfactory = {};\n };\n\n CSG.fuzzyCSGFactory.prototype = {\n getPolygonShared: function(sourceshared) {\n var hash = sourceshared.getHash();\n if (hash in this.polygonsharedfactory) {\n return this.polygonsharedfactory[hash];\n } else {\n this.polygonsharedfactory[hash] = sourceshared;\n return sourceshared;\n }\n },\n\n getVertex: function(sourcevertex) {\n var elements = [sourcevertex.pos._x, sourcevertex.pos._y, sourcevertex.pos._z];\n var result = this.vertexfactory.lookupOrCreate(elements, function(els) {\n return sourcevertex;\n });\n return result;\n },\n\n getPlane: function(sourceplane) {\n var elements = [sourceplane.normal._x, sourceplane.normal._y, sourceplane.normal._z, sourceplane.w];\n var result = this.planefactory.lookupOrCreate(elements, function(els) {\n return sourceplane;\n });\n return result;\n },\n\n getPolygon: function(sourcepolygon) {\n var newplane = this.getPlane(sourcepolygon.plane);\n var newshared = this.getPolygonShared(sourcepolygon.shared);\n var _this = this;\n var newvertices = sourcepolygon.vertices.map(function(vertex) {\n return _this.getVertex(vertex);\n });\n // two vertices that were originally very close may now have become\n // truly identical (referring to the same CSG.Vertex object).\n // Remove duplicate vertices:\n var newvertices_dedup = [];\n if(newvertices.length > 0) {\n var prevvertextag = newvertices[newvertices.length-1].getTag();\n newvertices.forEach(function(vertex) {\n var vertextag = vertex.getTag();\n if(vertextag != prevvertextag)\n {\n newvertices_dedup.push(vertex);\n }\n prevvertextag = vertextag;\n });\n }\n // If it's degenerate, remove all vertices:\n if(newvertices_dedup.length < 3) {\n newvertices_dedup = [];\n }\n return new CSG.Polygon(newvertices_dedup, newshared, newplane);\n },\n\n getCSG: function(sourcecsg) {\n var _this = this;\n var newpolygons = [];\n sourcecsg.polygons.forEach(function(polygon) {\n var newpolygon = _this.getPolygon(polygon);\n // see getPolygon above: we may get a polygon with no vertices, discard it:\n if(newpolygon.vertices.length >= 3)\n {\n newpolygons.push(newpolygon);\n }\n });\n return CSG.fromPolygons(newpolygons);\n }\n };\n\n //////////////////////////////////////\n // Tag factory: we can request a unique tag through CSG.getTag()\n CSG.staticTag = 1;\n\n CSG.getTag = function() {\n return CSG.staticTag++;\n };\n\n //////////////////////////////////////\n // # Class Properties\n // This class is used to store properties of a solid\n // A property can for example be a CSG.Vertex, a CSG.Plane or a CSG.Line3D\n // Whenever an affine transform is applied to the CSG solid, all its properties are\n // transformed as well.\n // The properties can be stored in a complex nested structure (using arrays and objects)\n CSG.Properties = function() {};\n\n CSG.Properties.prototype = {\n _transform: function(matrix4x4) {\n var result = new CSG.Properties();\n CSG.Properties.transformObj(this, result, matrix4x4);\n return result;\n },\n _merge: function(otherproperties) {\n var result = new CSG.Properties();\n CSG.Properties.cloneObj(this, result);\n CSG.Properties.addFrom(result, otherproperties);\n return result;\n }\n };\n\n CSG.Properties.transformObj = function(source, result, matrix4x4) {\n for (var propertyname in source) {\n if (propertyname == \"_transform\") continue;\n if (propertyname == \"_merge\") continue;\n var propertyvalue = source[propertyname];\n var transformed = propertyvalue;\n if (typeof(propertyvalue) == \"object\") {\n if (('transform' in propertyvalue) && (typeof(propertyvalue.transform) == \"function\")) {\n transformed = propertyvalue.transform(matrix4x4);\n } else if (propertyvalue instanceof Array) {\n transformed = [];\n CSG.Properties.transformObj(propertyvalue, transformed, matrix4x4);\n } else if (propertyvalue instanceof CSG.Properties) {\n transformed = new CSG.Properties();\n CSG.Properties.transformObj(propertyvalue, transformed, matrix4x4);\n }\n }\n result[propertyname] = transformed;\n }\n };\n\n CSG.Properties.cloneObj = function(source, result) {\n for (var propertyname in source) {\n if (propertyname == \"_transform\") continue;\n if (propertyname == \"_merge\") continue;\n var propertyvalue = source[propertyname];\n var cloned = propertyvalue;\n if (typeof(propertyvalue) == \"object\") {\n if (propertyvalue instanceof Array) {\n cloned = [];\n for (var i = 0; i < propertyvalue.length; i++) {\n cloned.push(propertyvalue[i]);\n }\n } else if (propertyvalue instanceof CSG.Properties) {\n cloned = new CSG.Properties();\n CSG.Properties.cloneObj(propertyvalue, cloned);\n }\n }\n result[propertyname] = cloned;\n }\n };\n\n CSG.Properties.addFrom = function(result, otherproperties) {\n for (var propertyname in otherproperties) {\n if (propertyname == \"_transform\") continue;\n if (propertyname == \"_merge\") continue;\n if ((propertyname in result) &&\n (typeof(result[propertyname]) == \"object\") &&\n (result[propertyname] instanceof CSG.Properties) &&\n (typeof(otherproperties[propertyname]) == \"object\") &&\n (otherproperties[propertyname] instanceof CSG.Properties)) {\n CSG.Properties.addFrom(result[propertyname], otherproperties[propertyname]);\n } else if (!(propertyname in result)) {\n result[propertyname] = otherproperties[propertyname];\n }\n }\n };\n\n //////////////////////////////////////\n // # class Connector\n // A connector allows to attach two objects at predefined positions\n // For example a servo motor and a servo horn:\n // Both can have a Connector called 'shaft'\n // The horn can be moved and rotated such that the two connectors match\n // and the horn is attached to the servo motor at the proper position.\n // Connectors are stored in the properties of a CSG solid so they are\n // ge the same transformations applied as the solid\n CSG.Connector = function(point, axisvector, normalvector) {\n this.point = new CSG.Vector3D(point);\n this.axisvector = new CSG.Vector3D(axisvector).unit();\n this.normalvector = new CSG.Vector3D(normalvector).unit();\n };\n\n CSG.Connector.prototype = {\n normalized: function() {\n var axisvector = this.axisvector.unit();\n // make the normal vector truly normal:\n var n = this.normalvector.cross(axisvector).unit();\n var normalvector = axisvector.cross(n);\n return new CSG.Connector(this.point, axisvector, normalvector);\n },\n\n transform: function(matrix4x4) {\n var point = this.point.multiply4x4(matrix4x4);\n var axisvector = this.point.plus(this.axisvector).multiply4x4(matrix4x4).minus(point);\n var normalvector = this.point.plus(this.normalvector).multiply4x4(matrix4x4).minus(point);\n return new CSG.Connector(point, axisvector, normalvector);\n },\n\n // Get the transformation matrix to connect this Connector to another connector\n // other: a CSG.Connector to which this connector should be connected\n // mirror: false: the 'axis' vectors of the connectors should point in the same direction\n // true: the 'axis' vectors of the connectors should point in opposite direction\n // normalrotation: degrees of rotation between the 'normal' vectors of the two\n // connectors\n getTransformationTo: function(other, mirror, normalrotation) {\n mirror = mirror ? true : false;\n normalrotation = normalrotation ? Number(normalrotation) : 0;\n var us = this.normalized();\n other = other.normalized();\n // shift to the origin:\n var transformation = CSG.Matrix4x4.translation(this.point.negated());\n // construct the plane crossing through the origin and the two axes:\n var axesplane = CSG.Plane.anyPlaneFromVector3Ds(\n new CSG.Vector3D(0, 0, 0), us.axisvector, other.axisvector);\n var axesbasis = new CSG.OrthoNormalBasis(axesplane);\n var angle1 = axesbasis.to2D(us.axisvector).angle();\n var angle2 = axesbasis.to2D(other.axisvector).angle();\n var rotation = 180.0 * (angle2 - angle1) / Math.PI;\n if (mirror) rotation += 180.0;\n transformation = transformation.multiply(axesbasis.getProjectionMatrix());\n transformation = transformation.multiply(CSG.Matrix4x4.rotationZ(rotation));\n transformation = transformation.multiply(axesbasis.getInverseProjectionMatrix());\n var usAxesAligned = us.transform(transformation);\n // Now we have done the transformation for aligning the axes.\n // We still need to align the normals:\n var normalsplane = CSG.Plane.fromNormalAndPoint(other.axisvector, new CSG.Vector3D(0, 0, 0));\n var normalsbasis = new CSG.OrthoNormalBasis(normalsplane);\n angle1 = normalsbasis.to2D(usAxesAligned.normalvector).angle();\n angle2 = normalsbasis.to2D(other.normalvector).angle();\n rotation = 180.0 * (angle2 - angle1) / Math.PI;\n rotation += normalrotation;\n transformation = transformation.multiply(normalsbasis.getProjectionMatrix());\n transformation = transformation.multiply(CSG.Matrix4x4.rotationZ(rotation));\n transformation = transformation.multiply(normalsbasis.getInverseProjectionMatrix());\n // and translate to the destination point:\n transformation = transformation.multiply(CSG.Matrix4x4.translation(other.point));\n // var usAligned = us.transform(transformation);\n return transformation;\n },\n\n axisLine: function() {\n return new CSG.Line3D(this.point, this.axisvector);\n },\n\n // creates a new Connector, with the connection point moved in the direction of the axisvector\n extend: function(distance) {\n var newpoint = this.point.plus(this.axisvector.unit().times(distance));\n return new CSG.Connector(newpoint, this.axisvector, this.normalvector);\n }\n };\n\n CSG.ConnectorList = function(connectors) {\n this.connectors_ = connectors ? connectors.slice() : [];\n };\n\n CSG.ConnectorList.defaultNormal = [0, 0, 1];\n\n CSG.ConnectorList.fromPath2D = function(path2D, arg1, arg2) {\n if (arguments.length === 3) {\n return CSG.ConnectorList._fromPath2DTangents(path2D, arg1, arg2);\n } else if (arguments.length == 2) {\n return CSG.ConnectorList._fromPath2DExplicit(path2D, arg1);\n } else {\n throw(\"call with path2D and either 2 direction vectors, or a function returning direction vectors\");\n }\n };\n\n /*\n * calculate the connector axisvectors by calculating the \"tangent\" for path2D.\n * This is undefined for start and end points, so axis for these have to be manually\n * provided.\n */\n CSG.ConnectorList._fromPath2DTangents = function(path2D, start, end) {\n // path2D\n var axis;\n var pathLen = path2D.points.length;\n var result = new CSG.ConnectorList([new CSG.Connector(path2D.points[0],\n start, CSG.ConnectorList.defaultNormal)]);\n // middle points\n path2D.points.slice(1, pathLen - 1).forEach(function(p2, i) {\n axis = path2D.points[i + 2].minus(path2D.points[i]).toVector3D(0);\n result.appendConnector(new CSG.Connector(p2.toVector3D(0), axis,\n CSG.ConnectorList.defaultNormal));\n }, this);\n result.appendConnector(new CSG.Connector(path2D.points[pathLen - 1], end,\n CSG.ConnectorList.defaultNormal));\n result.closed = path2D.closed;\n return result;\n };\n\n /*\n * angleIsh: either a static angle, or a function(point) returning an angle\n */\n CSG.ConnectorList._fromPath2DExplicit = function(path2D, angleIsh) {\n function getAngle(angleIsh, pt, i) {\n if (typeof angleIsh == 'function') {\n angleIsh = angleIsh(pt, i);\n }\n return angleIsh;\n }\n var result = new CSG.ConnectorList(\n path2D.points.map(function(p2, i) {\n return new CSG.Connector(p2.toVector3D(0),\n CSG.Vector3D.Create(1, 0, 0).rotateZ(getAngle(angleIsh, p2, i)),\n CSG.ConnectorList.defaultNormal);\n }, this)\n );\n result.closed = path2D.closed;\n return result;\n };\n\n\n CSG.ConnectorList.prototype = {\n setClosed: function(bool) {\n this.closed = !!closed;\n },\n appendConnector: function(conn) {\n this.connectors_.push(conn);\n },\n /*\n * arguments: cagish: a cag or a function(connector) returning a cag\n * closed: whether the 3d path defined by connectors location\n * should be closed or stay open\n * Note: don't duplicate connectors in the path\n * TODO: consider an option \"maySelfIntersect\" to close & force union all single segments\n */\n followWith: function(cagish) {\n this.verify();\n function getCag(cagish, connector) {\n if (typeof cagish == \"function\") {\n cagish = cagish(connector.point, connector.axisvector, connector.normalvector);\n }\n return cagish;\n }\n\n var polygons = [], currCag;\n var prevConnector = this.connectors_[this.connectors_.length - 1];\n var prevCag = getCag(cagish, prevConnector);\n // add walls\n this.connectors_.forEach(function(connector, notFirst) {\n currCag = getCag(cagish, connector);\n if (notFirst || this.closed) {\n polygons.push.apply(polygons, prevCag._toWallPolygons({\n toConnector1: prevConnector, toConnector2: connector, cag: currCag}));\n } else {\n // it is the first, and shape not closed -> build start wall\n polygons.push.apply(polygons,\n currCag._toPlanePolygons({toConnector: connector, flipped: true}));\n }\n if (notFirst == this.connectors_.length - 1 && !this.closed) {\n // build end wall\n polygons.push.apply(polygons,\n currCag._toPlanePolygons({toConnector: connector}));\n }\n prevCag = currCag;\n prevConnector = connector;\n }, this);\n return CSG.fromPolygons(polygons).reTesselated().canonicalized();\n },\n /*\n * general idea behind these checks: connectors need to have smooth transition from one to another\n * TODO: add a check that 2 follow-on CAGs are not intersecting\n */\n verify: function() {\n var connI, connI1, dPosToAxis, axisToNextAxis;\n for (var i = 0; i < this.connectors_.length - 1; i++) {\n connI = this.connectors_[i], connI1 = this.connectors_[i + 1];\n if (connI1.point.minus(connI.point).dot(connI.axisvector) <= 0) {\n throw(\"Invalid ConnectorList. Each connectors position needs to be within a <90deg range of previous connectors axisvector\");\n }\n if (connI.axisvector.dot(connI1.axisvector) <= 0) {\n throw(\"invalid ConnectorList. No neighboring connectors axisvectors may span a >=90deg angle\");\n }\n }\n }\n };\n\n //////////////////////////////////////\n // # Class Path2D\n CSG.Path2D = function(points, closed) {\n closed = !!closed;\n points = points || [];\n // re-parse the points into CSG.Vector2D\n // and remove any duplicate points\n var prevpoint = null;\n if (closed && (points.length > 0)) {\n prevpoint = new CSG.Vector2D(points[points.length - 1]);\n }\n var newpoints = [];\n points.map(function(point) {\n point = new CSG.Vector2D(point);\n var skip = false;\n if (prevpoint !== null) {\n var distance = point.distanceTo(prevpoint);\n skip = distance < 1e-5;\n }\n if (!skip) newpoints.push(point);\n prevpoint = point;\n });\n this.points = newpoints;\n this.closed = closed;\n };\n\n /*\n Construct a (part of a) circle. Parameters:\n options.center: the center point of the arc (CSG.Vector2D or array [x,y])\n options.radius: the circle radius (float)\n options.startangle: the starting angle of the arc, in degrees\n 0 degrees corresponds to [1,0]\n 90 degrees to [0,1]\n and so on\n options.endangle: the ending angle of the arc, in degrees\n options.resolution: number of points per 360 degree of rotation\n options.maketangent: adds two extra tiny line segments at both ends of the circle\n this ensures that the gradients at the edges are tangent to the circle\n Returns a CSG.Path2D. The path is not closed (even if it is a 360 degree arc).\n close() the resulting path if you want to create a true circle.\n */\n CSG.Path2D.arc = function(options) {\n var center = CSG.parseOptionAs2DVector(options, \"center\", 0);\n var radius = CSG.parseOptionAsFloat(options, \"radius\", 1);\n var startangle = CSG.parseOptionAsFloat(options, \"startangle\", 0);\n var endangle = CSG.parseOptionAsFloat(options, \"endangle\", 360);\n var resolution = CSG.parseOptionAsInt(options, \"resolution\", CSG.defaultResolution2D);\n var maketangent = CSG.parseOptionAsBool(options, \"maketangent\", false);\n // no need to make multiple turns:\n while (endangle - startangle >= 720) {\n endangle -= 360;\n }\n while (endangle - startangle <= -720) {\n endangle += 360;\n }\n var points = [],\n point;\n var absangledif = Math.abs(endangle - startangle);\n if (absangledif < 1e-5) {\n point = CSG.Vector2D.fromAngle(startangle / 180.0 * Math.PI).times(radius);\n points.push(point.plus(center));\n } else {\n var numsteps = Math.floor(resolution * absangledif / 360) + 1;\n var edgestepsize = numsteps * 0.5 / absangledif; // step size for half a degree\n if (edgestepsize > 0.25) edgestepsize = 0.25;\n var numsteps_mod = maketangent ? (numsteps + 2) : numsteps;\n for (var i = 0; i <= numsteps_mod; i++) {\n var step = i;\n if (maketangent) {\n step = (i - 1) * (numsteps - 2 * edgestepsize) / numsteps + edgestepsize;\n if (step < 0) step = 0;\n if (step > numsteps) step = numsteps;\n }\n var angle = startangle + step * (endangle - startangle) / numsteps;\n point = CSG.Vector2D.fromAngle(angle / 180.0 * Math.PI).times(radius);\n points.push(point.plus(center));\n }\n }\n return new CSG.Path2D(points, false);\n };\n\n CSG.Path2D.prototype = {\n concat: function(otherpath) {\n if (this.closed || otherpath.closed) {\n throw new Error(\"Paths must not be closed\");\n }\n var newpoints = this.points.concat(otherpath.points);\n return new CSG.Path2D(newpoints);\n },\n\n appendPoint: function(point) {\n if (this.closed) {\n throw new Error(\"Path must not be closed\");\n }\n point = new CSG.Vector2D(point); // cast to Vector2D\n var newpoints = this.points.concat([point]);\n return new CSG.Path2D(newpoints);\n },\n\n appendPoints: function(points) {\n if (this.closed) {\n throw new Error(\"Path must not be closed\");\n }\n var newpoints = this.points;\n points.forEach(function(point) {\n newpoints.push(new CSG.Vector2D(point)); // cast to Vector2D\n })\n return new CSG.Path2D(newpoints);\n },\n\n close: function() {\n return new CSG.Path2D(this.points, true);\n },\n\n // Extrude the path by following it with a rectangle (upright, perpendicular to the path direction)\n // Returns a CSG solid\n // width: width of the extrusion, in the z=0 plane\n // height: height of the extrusion in the z direction\n // resolution: number of segments per 360 degrees for the curve in a corner\n rectangularExtrude: function(width, height, resolution) {\n var cag = this.expandToCAG(width / 2, resolution);\n var result = cag.extrude({\n offset: [0, 0, height]\n });\n return result;\n },\n\n // Expand the path to a CAG\n // This traces the path with a circle with radius pathradius\n expandToCAG: function(pathradius, resolution) {\n var sides = [];\n var numpoints = this.points.length;\n var startindex = 0;\n if (this.closed && (numpoints > 2)) startindex = -1;\n var prevvertex;\n for (var i = startindex; i < numpoints; i++) {\n var pointindex = i;\n if (pointindex < 0) pointindex = numpoints - 1;\n var point = this.points[pointindex];\n var vertex = new CAG.Vertex(point);\n if (i > startindex) {\n var side = new CAG.Side(prevvertex, vertex);\n sides.push(side);\n }\n prevvertex = vertex;\n }\n var shellcag = CAG.fromSides(sides);\n var expanded = shellcag.expandedShell(pathradius, resolution);\n return expanded;\n },\n\n innerToCAG: function() {\n if (!this.closed) throw new Error(\"The path should be closed!\");\n return CAG.fromPoints(this.points);\n },\n\n transform: function(matrix4x4) {\n var newpoints = this.points.map(function(point) {\n return point.multiply4x4(matrix4x4);\n });\n return new CSG.Path2D(newpoints, this.closed);\n },\n\n appendBezier: function(controlpoints, options) {\n if (arguments.length < 2) {\n options = {};\n }\n if (this.closed) {\n throw new Error(\"Path must not be closed\");\n }\n if (!(controlpoints instanceof Array)) {\n throw new Error(\"appendBezier: should pass an array of control points\")\n }\n if (controlpoints.length < 1) {\n throw new Error(\"appendBezier: need at least 1 control point\")\n }\n if (this.points.length < 1) {\n throw new Error(\"appendBezier: path must already contain a point (the endpoint of the path is used as the starting point for the bezier curve)\");\n }\n var resolution = CSG.parseOptionAsInt(options, \"resolution\", CSG.defaultResolution2D);\n if (resolution < 4) resolution = 4;\n var factorials = [];\n var controlpoints_parsed = [];\n controlpoints_parsed.push(this.points[this.points.length - 1]); // start at the previous end point\n for (var i = 0; i < controlpoints.length; ++i) {\n var p = controlpoints[i];\n if (p === null) {\n // we can pass null as the first control point. In that case a smooth gradient is ensured:\n if (i != 0) {\n throw new Error(\"appendBezier: null can only be passed as the first control point\");\n }\n if (controlpoints.length < 2) {\n throw new Error(\"appendBezier: null can only be passed if there is at least one more control point\");\n }\n var lastBezierControlPoint;\n if ('lastBezierControlPoint' in this) {\n lastBezierControlPoint = this.lastBezierControlPoint;\n } else {\n if (this.points.length < 2) {\n throw new Error(\"appendBezier: null is passed as a control point but this requires a previous bezier curve or at least two points in the existing path\");\n }\n lastBezierControlPoint = this.points[this.points.length - 2];\n }\n // mirror the last bezier control point:\n p = this.points[this.points.length - 1].times(2).minus(lastBezierControlPoint);\n } else {\n p = new CSG.Vector2D(p); // cast to Vector2D\n }\n controlpoints_parsed.push(p);\n }\n var bezier_order = controlpoints_parsed.length - 1;\n var fact = 1;\n for (var i = 0; i <= bezier_order; ++i) {\n if (i > 0) fact *= i;\n factorials.push(fact);\n }\n var binomials = [];\n for (var i = 0; i <= bezier_order; ++i) {\n var binomial = factorials[bezier_order] / (factorials[i] * factorials[bezier_order - i]);\n binomials.push(binomial);\n }\n var getPointForT = function(t) {\n var t_k = 1; // = pow(t,k)\n var one_minus_t_n_minus_k = Math.pow(1 - t, bezier_order); // = pow( 1-t, bezier_order - k)\n var inv_1_minus_t = (t != 1) ? (1 / (1 - t)) : 1;\n var point = new CSG.Vector2D(0, 0);\n for (var k = 0; k <= bezier_order; ++k) {\n if (k == bezier_order) one_minus_t_n_minus_k = 1;\n var bernstein_coefficient = binomials[k] * t_k * one_minus_t_n_minus_k;\n point = point.plus(controlpoints_parsed[k].times(bernstein_coefficient));\n t_k *= t;\n one_minus_t_n_minus_k *= inv_1_minus_t;\n }\n return point;\n };\n var newpoints = [];\n var newpoints_t = [];\n var numsteps = bezier_order + 1;\n for (var i = 0; i < numsteps; ++i) {\n var t = i / (numsteps - 1);\n var point = getPointForT(t);\n newpoints.push(point);\n newpoints_t.push(t);\n }\n // subdivide each segment until the angle at each vertex becomes small enough:\n var subdivide_base = 1;\n var maxangle = Math.PI * 2 / resolution; // segments may have differ no more in angle than this\n var maxsinangle = Math.sin(maxangle);\n while (subdivide_base < newpoints.length - 1) {\n var dir1 = newpoints[subdivide_base].minus(newpoints[subdivide_base - 1]).unit();\n var dir2 = newpoints[subdivide_base + 1].minus(newpoints[subdivide_base]).unit();\n var sinangle = dir1.cross(dir2); // this is the sine of the angle\n if (Math.abs(sinangle) > maxsinangle) {\n // angle is too big, we need to subdivide\n var t0 = newpoints_t[subdivide_base - 1];\n var t1 = newpoints_t[subdivide_base + 1];\n var t0_new = t0 + (t1 - t0) * 1 / 3;\n var t1_new = t0 + (t1 - t0) * 2 / 3;\n var point0_new = getPointForT(t0_new);\n var point1_new = getPointForT(t1_new);\n // remove the point at subdivide_base and replace with 2 new points:\n newpoints.splice(subdivide_base, 1, point0_new, point1_new);\n newpoints_t.splice(subdivide_base, 1, t0_new, t1_new);\n // re - evaluate the angles, starting at the previous junction since it has changed:\n subdivide_base--;\n if (subdivide_base < 1) subdivide_base = 1;\n } else {\n ++subdivide_base;\n }\n }\n // append to the previous points, but skip the first new point because it is identical to the last point:\n newpoints = this.points.concat(newpoints.slice(1));\n var result = new CSG.Path2D(newpoints);\n result.lastBezierControlPoint = controlpoints_parsed[controlpoints_parsed.length - 2];\n return result;\n },\n\n /*\n options:\n .resolution // smoothness of the arc (number of segments per 360 degree of rotation)\n // to create a circular arc:\n .radius\n // to create an elliptical arc:\n .xradius\n .yradius\n .xaxisrotation // the rotation (in degrees) of the x axis of the ellipse with respect to the x axis of our coordinate system\n // this still leaves 4 possible arcs between the two given points. The following two flags select which one we draw:\n .clockwise // = true | false (default is false). Two of the 4 solutions draw clockwise with respect to the center point, the other 2 counterclockwise\n .large // = true | false (default is false). Two of the 4 solutions are an arc longer than 180 degrees, the other two are <= 180 degrees\n This implementation follows the SVG arc specs. For the details see\n http://www.w3.org/TR/SVG/paths.html#PathDataEllipticalArcCommands\n */\n appendArc: function(endpoint, options) {\n var decimals = 100000;\n if (arguments.length < 2) {\n options = {};\n }\n if (this.closed) {\n throw new Error(\"Path must not be closed\");\n }\n if (this.points.length < 1) {\n throw new Error(\"appendArc: path must already contain a point (the endpoint of the path is used as the starting point for the arc)\");\n }\n var resolution = CSG.parseOptionAsInt(options, \"resolution\", CSG.defaultResolution2D);\n if (resolution < 4) resolution = 4;\n var xradius, yradius;\n if (('xradius' in options) || ('yradius' in options)) {\n if ('radius' in options) {\n throw new Error(\"Should either give an xradius and yradius parameter, or a radius parameter\");\n }\n xradius = CSG.parseOptionAsFloat(options, \"xradius\", 0);\n yradius = CSG.parseOptionAsFloat(options, \"yradius\", 0);\n } else {\n xradius = CSG.parseOptionAsFloat(options, \"radius\", 0);\n yradius = xradius;\n }\n var xaxisrotation = CSG.parseOptionAsFloat(options, \"xaxisrotation\", 0);\n var clockwise = CSG.parseOptionAsBool(options, \"clockwise\", false);\n var largearc = CSG.parseOptionAsBool(options, \"large\", false);\n var startpoint = this.points[this.points.length - 1];\n endpoint = new CSG.Vector2D(endpoint);\n // round to precision in order to have determinate calculations\n xradius = Math.round(xradius*decimals)/decimals;\n yradius = Math.round(yradius*decimals)/decimals;\n endpoint = new CSG.Vector2D(Math.round(endpoint.x*decimals)/decimals,Math.round(endpoint.y*decimals)/decimals);\n\n var sweep_flag = !clockwise;\n var newpoints = [];\n if ((xradius == 0) || (yradius == 0)) {\n // http://www.w3.org/TR/SVG/implnote.html#ArcImplementationNotes:\n // If rx = 0 or ry = 0, then treat this as a straight line from (x1, y1) to (x2, y2) and stop\n newpoints.push(endpoint);\n } else {\n xradius = Math.abs(xradius);\n yradius = Math.abs(yradius);\n\n // see http://www.w3.org/TR/SVG/implnote.html#ArcImplementationNotes :\n var phi = xaxisrotation * Math.PI / 180.0;\n var cosphi = Math.cos(phi);\n var sinphi = Math.sin(phi);\n var minushalfdistance = startpoint.minus(endpoint).times(0.5);\n // F.6.5.1:\n // round to precision in order to have determinate calculations\n var x = Math.round((cosphi * minushalfdistance.x + sinphi * minushalfdistance.y)*decimals)/decimals;\n var y = Math.round((-sinphi * minushalfdistance.x + cosphi * minushalfdistance.y)*decimals)/decimals;\n var start_translated = new CSG.Vector2D(x,y);\n // F.6.6.2:\n var biglambda = (start_translated.x * start_translated.x) / (xradius * xradius) + (start_translated.y * start_translated.y) / (yradius * yradius);\n if (biglambda > 1.0) {\n // F.6.6.3:\n var sqrtbiglambda = Math.sqrt(biglambda);\n xradius *= sqrtbiglambda;\n yradius *= sqrtbiglambda;\n // round to precision in order to have determinate calculations\n xradius = Math.round(xradius*decimals)/decimals;\n yradius = Math.round(yradius*decimals)/decimals;\n }\n // F.6.5.2:\n var multiplier1 = Math.sqrt((xradius * xradius * yradius * yradius - xradius * xradius * start_translated.y * start_translated.y - yradius * yradius * start_translated.x * start_translated.x) / (xradius * xradius * start_translated.y * start_translated.y + yradius * yradius * start_translated.x * start_translated.x));\n if (sweep_flag == largearc) multiplier1 = -multiplier1;\n var center_translated = new CSG.Vector2D(xradius * start_translated.y / yradius, -yradius * start_translated.x / xradius).times(multiplier1);\n // F.6.5.3:\n var center = new CSG.Vector2D(cosphi * center_translated.x - sinphi * center_translated.y, sinphi * center_translated.x + cosphi * center_translated.y).plus((startpoint.plus(endpoint)).times(0.5));\n // F.6.5.5:\n var vec1 = new CSG.Vector2D((start_translated.x - center_translated.x) / xradius, (start_translated.y - center_translated.y) / yradius);\n var vec2 = new CSG.Vector2D((-start_translated.x - center_translated.x) / xradius, (-start_translated.y - center_translated.y) / yradius);\n var theta1 = vec1.angleRadians();\n var theta2 = vec2.angleRadians();\n var deltatheta = theta2 - theta1;\n deltatheta = deltatheta % (2 * Math.PI);\n if ((!sweep_flag) && (deltatheta > 0)) {\n deltatheta -= 2 * Math.PI;\n } else if ((sweep_flag) && (deltatheta < 0)) {\n deltatheta += 2 * Math.PI;\n }\n\n // Ok, we have the center point and angle range (from theta1, deltatheta radians) so we can create the ellipse\n var numsteps = Math.ceil(Math.abs(deltatheta) / (2 * Math.PI) * resolution) + 1;\n if (numsteps < 1) numsteps = 1;\n for (var step = 1; step <= numsteps; step++) {\n var theta = theta1 + step / numsteps * deltatheta;\n var costheta = Math.cos(theta);\n var sintheta = Math.sin(theta);\n // F.6.3.1:\n var point = new CSG.Vector2D(cosphi * xradius * costheta - sinphi * yradius * sintheta, sinphi * xradius * costheta + cosphi * yradius * sintheta).plus(center);\n newpoints.push(point);\n }\n }\n newpoints = this.points.concat(newpoints);\n var result = new CSG.Path2D(newpoints);\n return result;\n },\n };\n\n // Add several convenience methods to the classes that support a transform() method:\n CSG.addTransformationMethodsToPrototype = function(prot) {\n prot.mirrored = function(plane) {\n return this.transform(CSG.Matrix4x4.mirroring(plane));\n };\n\n prot.mirroredX = function() {\n var plane = new CSG.Plane(CSG.Vector3D.Create(1, 0, 0), 0);\n return this.mirrored(plane);\n };\n\n prot.mirroredY = function() {\n var plane = new CSG.Plane(CSG.Vector3D.Create(0, 1, 0), 0);\n return this.mirrored(plane);\n };\n\n prot.mirroredZ = function() {\n var plane = new CSG.Plane(CSG.Vector3D.Create(0, 0, 1), 0);\n return this.mirrored(plane);\n };\n\n prot.translate = function(v) {\n return this.transform(CSG.Matrix4x4.translation(v));\n };\n\n prot.scale = function(f) {\n return this.transform(CSG.Matrix4x4.scaling(f));\n };\n\n prot.rotateX = function(deg) {\n return this.transform(CSG.Matrix4x4.rotationX(deg));\n };\n\n prot.rotateY = function(deg) {\n return this.transform(CSG.Matrix4x4.rotationY(deg));\n };\n\n prot.rotateZ = function(deg) {\n return this.transform(CSG.Matrix4x4.rotationZ(deg));\n };\n\n prot.rotate = function(rotationCenter, rotationAxis, degrees) {\n return this.transform(CSG.Matrix4x4.rotation(rotationCenter, rotationAxis, degrees));\n };\n\n prot.rotateEulerAngles = function(alpha, beta, gamma, position) {\n position = position || [0,0,0];\n\n var Rz1 = CSG.Matrix4x4.rotationZ(alpha);\n var Rx = CSG.Matrix4x4.rotationX(beta);\n var Rz2 = CSG.Matrix4x4.rotationZ(gamma);\n var T = CSG.Matrix4x4.translation(new CSG.Vector3D(position));\n\n return this.transform(Rz2.multiply(Rx).multiply(Rz1).multiply(T));\n };\n };\n\n // TODO: consider generalization and adding to addTransformationMethodsToPrototype\n CSG.addCenteringToPrototype = function(prot, axes) {\n prot.center = function(cAxes) {\n cAxes = Array.prototype.map.call(arguments, function(a) {\n return a; //.toLowerCase();\n });\n // no args: center on all axes\n if (!cAxes.length) {\n cAxes = axes.slice();\n }\n var b = this.getBounds();\n return this.translate(axes.map(function(a) {\n return cAxes.indexOf(a) > -1 ?\n -(b[0][a] + b[1][a])/2 : 0;\n }));\n };\n };\n\n //////////////////\n // CAG: solid area geometry: like CSG but 2D\n // Each area consists of a number of sides\n // Each side is a line between 2 points\n var CAG = function() {\n this.sides = [];\n this.isCanonicalized = false;\n };\n\n // create from an untyped object with identical property names:\n CAG.fromObject = function(obj) {\n var sides = obj.sides.map(function(s) {\n return CAG.Side.fromObject(s);\n });\n var cag = CAG.fromSides(sides);\n return cag;\n }\n\n // Construct a CAG from a list of `CAG.Side` instances.\n CAG.fromSides = function(sides) {\n var cag = new CAG();\n cag.sides = sides;\n return cag;\n };\n\n // Construct a CAG from a list of points (a polygon)\n // Rotation direction of the points is not relevant. Points can be a convex or concave polygon.\n // Polygon must not self intersect\n CAG.fromPoints = function(points) {\n var numpoints = points.length;\n if (numpoints < 3) throw new Error(\"CAG shape needs at least 3 points\");\n var sides = [];\n var prevpoint = new CSG.Vector2D(points[numpoints - 1]);\n var prevvertex = new CAG.Vertex(prevpoint);\n points.map(function(p) {\n var point = new CSG.Vector2D(p);\n var vertex = new CAG.Vertex(point);\n var side = new CAG.Side(prevvertex, vertex);\n sides.push(side);\n prevvertex = vertex;\n });\n var result = CAG.fromSides(sides);\n if (result.isSelfIntersecting()) {\n throw new Error(\"Polygon is self intersecting!\");\n }\n var area = result.area();\n if (Math.abs(area) < 1e-5) {\n throw new Error(\"Degenerate polygon!\");\n }\n if (area < 0) {\n result = result.flipped();\n }\n result = result.canonicalized();\n return result;\n };\n\n // Like CAG.fromPoints but does not check if it's a valid polygon.\n // Points should rotate counter clockwise\n CAG.fromPointsNoCheck = function(points) {\n var sides = [];\n var prevpoint = new CSG.Vector2D(points[points.length - 1]);\n var prevvertex = new CAG.Vertex(prevpoint);\n points.map(function(p) {\n var point = new CSG.Vector2D(p);\n var vertex = new CAG.Vertex(point);\n var side = new CAG.Side(prevvertex, vertex);\n sides.push(side);\n prevvertex = vertex;\n });\n return CAG.fromSides(sides);\n };\n\n // Converts a CSG to a CAG. The CSG must consist of polygons with only z coordinates +1 and -1\n // as constructed by CAG._toCSGWall(-1, 1). This is so we can use the 3D union(), intersect() etc\n CAG.fromFakeCSG = function(csg) {\n var sides = csg.polygons.map(function(p) {\n return CAG.Side._fromFakePolygon(p);\n })\n .filter(function(s) {\n return s !== null;\n });\n return CAG.fromSides(sides);\n };\n\n // see if the line between p0start and p0end intersects with the line between p1start and p1end\n // returns true if the lines strictly intersect, the end points are not counted!\n CAG.linesIntersect = function(p0start, p0end, p1start, p1end) {\n if (p0end.equals(p1start) || p1end.equals(p0start)) {\n var d = p1end.minus(p1start).unit().plus(p0end.minus(p0start).unit()).length();\n if (d < 1e-5) {\n return true;\n }\n } else {\n var d0 = p0end.minus(p0start);\n var d1 = p1end.minus(p1start);\n if (Math.abs(d0.cross(d1)) < 1e-9) return false; // lines are parallel\n var alphas = CSG.solve2Linear(-d0.x, d1.x, -d0.y, d1.y, p0start.x - p1start.x, p0start.y - p1start.y);\n if ((alphas[0] > 1e-6) && (alphas[0] < 0.999999) && (alphas[1] > 1e-5) && (alphas[1] < 0.999999)) return true;\n // if( (alphas[0] >= 0) && (alphas[0] <= 1) && (alphas[1] >= 0) && (alphas[1] <= 1) ) return true;\n }\n return false;\n };\n\n /* Construct a circle\n options:\n center: a 2D center point\n radius: a scalar\n resolution: number of sides per 360 degree rotation\n returns a CAG object\n */\n CAG.circle = function(options) {\n options = options || {};\n var center = CSG.parseOptionAs2DVector(options, \"center\", [0, 0]);\n var radius = CSG.parseOptionAsFloat(options, \"radius\", 1);\n var resolution = CSG.parseOptionAsInt(options, \"resolution\", CSG.defaultResolution2D);\n var sides = [];\n var prevvertex;\n for (var i = 0; i <= resolution; i++) {\n var radians = 2 * Math.PI * i / resolution;\n var point = CSG.Vector2D.fromAngleRadians(radians).times(radius).plus(center);\n var vertex = new CAG.Vertex(point);\n if (i > 0) {\n sides.push(new CAG.Side(prevvertex, vertex));\n }\n prevvertex = vertex;\n }\n return CAG.fromSides(sides);\n };\n\n /* Construct an ellispe\n options:\n center: a 2D center point\n radius: a 2D vector with width and height\n resolution: number of sides per 360 degree rotation\n returns a CAG object\n */\n CAG.ellipse = function(options) {\n options = options || {};\n var c = CSG.parseOptionAs2DVector(options, \"center\", [0, 0]);\n var r = CSG.parseOptionAs2DVector(options, \"radius\", [1, 1]);\n r = r.abs(); // negative radii make no sense\n var res = CSG.parseOptionAsInt(options, \"resolution\", CSG.defaultResolution2D);\n\n var e2 = new CSG.Path2D([[c.x,c.y + r.y]]);\n e2 = e2.appendArc([c.x,c.y - r.y], {\n xradius: r.x,\n yradius: r.y,\n xaxisrotation: 0,\n resolution: res,\n clockwise: true,\n large: false,\n });\n e2 = e2.appendArc([c.x,c.y + r.y], {\n xradius: r.x,\n yradius: r.y,\n xaxisrotation: 0,\n resolution: res,\n clockwise: true,\n large: false,\n });\n e2 = e2.close();\n return e2.innerToCAG();\n };\n\n /* Construct a rectangle\n options:\n center: a 2D center point\n radius: a 2D vector with width and height\n returns a CAG object\n */\n CAG.rectangle = function(options) {\n options = options || {};\n var c, r;\n if (('corner1' in options) || ('corner2' in options)) {\n if (('center' in options) || ('radius' in options)) {\n throw new Error(\"rectangle: should either give a radius and center parameter, or a corner1 and corner2 parameter\")\n }\n corner1 = CSG.parseOptionAs2DVector(options, \"corner1\", [0, 0]);\n corner2 = CSG.parseOptionAs2DVector(options, \"corner2\", [1, 1]);\n c = corner1.plus(corner2).times(0.5);\n r = corner2.minus(corner1).times(0.5);\n } else {\n c = CSG.parseOptionAs2DVector(options, \"center\", [0, 0]);\n r = CSG.parseOptionAs2DVector(options, \"radius\", [1, 1]);\n }\n r = r.abs(); // negative radii make no sense\n var rswap = new CSG.Vector2D(r.x, -r.y);\n var points = [\n c.plus(r), c.plus(rswap), c.minus(r), c.minus(rswap)\n ];\n return CAG.fromPoints(points);\n };\n\n // var r = CSG.roundedRectangle({\n // center: [0, 0],\n // radius: [2, 1],\n // roundradius: 0.2,\n // resolution: 8,\n // });\n CAG.roundedRectangle = function(options) {\n options = options || {};\n var center, radius;\n if (('corner1' in options) || ('corner2' in options)) {\n if (('center' in options) || ('radius' in options)) {\n throw new Error(\"roundedRectangle: should either give a radius and center parameter, or a corner1 and corner2 parameter\")\n }\n corner1 = CSG.parseOptionAs2DVector(options, \"corner1\", [0, 0]);\n corner2 = CSG.parseOptionAs2DVector(options, \"corner2\", [1, 1]);\n center = corner1.plus(corner2).times(0.5);\n radius = corner2.minus(corner1).times(0.5);\n } else {\n center = CSG.parseOptionAs2DVector(options, \"center\", [0, 0]);\n radius = CSG.parseOptionAs2DVector(options, \"radius\", [1, 1]);\n }\n radius = radius.abs(); // negative radii make no sense\n var roundradius = CSG.parseOptionAsFloat(options, \"roundradius\", 0.2);\n var resolution = CSG.parseOptionAsInt(options, \"resolution\", CSG.defaultResolution2D);\n var maxroundradius = Math.min(radius.x, radius.y);\n maxroundradius -= 0.1;\n roundradius = Math.min(roundradius, maxroundradius);\n roundradius = Math.max(0, roundradius);\n radius = new CSG.Vector2D(radius.x - roundradius, radius.y - roundradius);\n var rect = CAG.rectangle({\n center: center,\n radius: radius\n });\n if (roundradius > 0) {\n rect = rect.expand(roundradius, resolution);\n }\n return rect;\n };\n\n // Reconstruct a CAG from the output of toCompactBinary()\n CAG.fromCompactBinary = function(bin) {\n if (bin['class'] != \"CAG\") throw new Error(\"Not a CAG\");\n var vertices = [];\n var vertexData = bin.vertexData;\n var numvertices = vertexData.length / 2;\n var arrayindex = 0;\n for (var vertexindex = 0; vertexindex < numvertices; vertexindex++) {\n var x = vertexData[arrayindex++];\n var y = vertexData[arrayindex++];\n var pos = new CSG.Vector2D(x, y);\n var vertex = new CAG.Vertex(pos);\n vertices.push(vertex);\n }\n\n var sides = [];\n var numsides = bin.sideVertexIndices.length / 2;\n arrayindex = 0;\n for (var sideindex = 0; sideindex < numsides; sideindex++) {\n var vertexindex0 = bin.sideVertexIndices[arrayindex++];\n var vertexindex1 = bin.sideVertexIndices[arrayindex++];\n var side = new CAG.Side(vertices[vertexindex0], vertices[vertexindex1]);\n sides.push(side);\n }\n var cag = CAG.fromSides(sides);\n cag.isCanonicalized = true;\n return cag;\n };\n\n function fnSortByIndex(a, b) {\n return a.index - b.index;\n }\n\n CAG.prototype = {\n toString: function() {\n var result = \"CAG (\" + this.sides.length + \" sides):\\n\";\n this.sides.map(function(side) {\n result += \" \" + side.toString() + \"\\n\";\n });\n return result;\n },\n\n _toCSGWall: function(z0, z1) {\n var polygons = this.sides.map(function(side) {\n return side.toPolygon3D(z0, z1);\n });\n return CSG.fromPolygons(polygons);\n },\n\n _toVector3DPairs: function(m) {\n // transform m\n var pairs = this.sides.map(function(side) {\n var p0 = side.vertex0.pos, p1 = side.vertex1.pos;\n return [CSG.Vector3D.Create(p0.x, p0.y, 0),\n CSG.Vector3D.Create(p1.x, p1.y, 0)];\n });\n if (typeof m != 'undefined') {\n pairs = pairs.map(function(pair) {\n return pair.map(function(v) {\n return v.transform(m);\n });\n });\n }\n return pairs;\n },\n\n /*\n * transform a cag into the polygons of a corresponding 3d plane, positioned per options\n * Accepts a connector for plane positioning, or optionally\n * single translation, axisVector, normalVector arguments\n * (toConnector has precedence over single arguments if provided)\n */\n _toPlanePolygons: function(options) {\n var flipped = options.flipped || false;\n // reference connector for transformation\n var origin = [0, 0, 0], defaultAxis = [0, 0, 1], defaultNormal = [0, 1, 0];\n var thisConnector = new CSG.Connector(origin, defaultAxis, defaultNormal);\n // translated connector per options\n var translation = options.translation || origin;\n var axisVector = options.axisVector || defaultAxis;\n var normalVector = options.normalVector || defaultNormal;\n // will override above if options has toConnector\n var toConnector = options.toConnector ||\n new CSG.Connector(translation, axisVector, normalVector);\n // resulting transform\n var m = thisConnector.getTransformationTo(toConnector, false, 0);\n // create plane as a (partial non-closed) CSG in XY plane\n var bounds = this.getBounds();\n bounds[0] = bounds[0].minus(new CSG.Vector2D(1, 1));\n bounds[1] = bounds[1].plus(new CSG.Vector2D(1, 1));\n var csgshell = this._toCSGWall(-1, 1);\n var csgplane = CSG.fromPolygons([new CSG.Polygon([\n new CSG.Vertex(new CSG.Vector3D(bounds[0].x, bounds[0].y, 0)),\n new CSG.Vertex(new CSG.Vector3D(bounds[1].x, bounds[0].y, 0)),\n new CSG.Vertex(new CSG.Vector3D(bounds[1].x, bounds[1].y, 0)),\n new CSG.Vertex(new CSG.Vector3D(bounds[0].x, bounds[1].y, 0))\n ])]);\n if (flipped) {\n csgplane = csgplane.invert();\n }\n // intersectSub -> prevent premature retesselate/canonicalize\n csgplane = csgplane.intersectSub(csgshell);\n // only keep the polygons in the z plane:\n var polys = csgplane.polygons.filter(function(polygon) {\n return Math.abs(polygon.plane.normal.z) > 0.99;\n });\n // finally, position the plane per passed transformations\n return polys.map(function(poly) {\n return poly.transform(m);\n });\n },\n\n\n /*\n * given 2 connectors, this returns all polygons of a \"wall\" between 2\n * copies of this cag, positioned in 3d space as \"bottom\" and\n * \"top\" plane per connectors toConnector1, and toConnector2, respectively \n */\n _toWallPolygons: function(options) {\n // normals are going to be correct as long as toConn2.point - toConn1.point\n // points into cag normal direction (check in caller)\n // arguments: options.toConnector1, options.toConnector2, options.cag\n // walls go from toConnector1 to toConnector2\n // optionally, target cag to point to - cag needs to have same number of sides as this!\n var origin = [0, 0, 0], defaultAxis = [0, 0, 1], defaultNormal = [0, 1, 0];\n var thisConnector = new CSG.Connector(origin, defaultAxis, defaultNormal);\n // arguments:\n var toConnector1 = options.toConnector1;\n // var toConnector2 = new CSG.Connector([0, 0, -30], defaultAxis, defaultNormal);\n var toConnector2 = options.toConnector2;\n if (!(toConnector1 instanceof CSG.Connector && toConnector2 instanceof CSG.Connector)) {\n throw('could not parse CSG.Connector arguments toConnector1 or toConnector2');\n }\n if (options.cag) {\n if (options.cag.sides.length != this.sides.length) {\n throw('target cag needs same sides count as start cag');\n }\n }\n // target cag is same as this unless specified\n var toCag = options.cag || this;\n var m1 = thisConnector.getTransformationTo(toConnector1, false, 0);\n var m2 = thisConnector.getTransformationTo(toConnector2, false, 0);\n var vps1 = this._toVector3DPairs(m1);\n var vps2 = toCag._toVector3DPairs(m2);\n\n var polygons = [];\n vps1.forEach(function(vp1, i) {\n polygons.push(new CSG.Polygon([\n new CSG.Vertex(vps2[i][1]), new CSG.Vertex(vps2[i][0]), new CSG.Vertex(vp1[0])]));\n polygons.push(new CSG.Polygon([\n new CSG.Vertex(vps2[i][1]), new CSG.Vertex(vp1[0]), new CSG.Vertex(vp1[1])]));\n });\n return polygons;\n },\n\n union: function(cag) {\n var cags;\n if (cag instanceof Array) {\n cags = cag;\n } else {\n cags = [cag];\n }\n var r = this._toCSGWall(-1, 1);\n var r = r.union(\n cags.map(function(cag) {\n return cag._toCSGWall(-1, 1).reTesselated();\n }), false, false)\n return CAG.fromFakeCSG(r).canonicalized();\n },\n\n subtract: function(cag) {\n var cags;\n if (cag instanceof Array) {\n cags = cag;\n } else {\n cags = [cag];\n }\n var r = this._toCSGWall(-1, 1);\n cags.map(function(cag) {\n r = r.subtractSub(cag._toCSGWall(-1, 1), false, false);\n });\n r = r.reTesselated();\n r = r.canonicalized();\n r = CAG.fromFakeCSG(r);\n r = r.canonicalized();\n return r;\n },\n\n intersect: function(cag) {\n var cags;\n if (cag instanceof Array) {\n cags = cag;\n } else {\n cags = [cag];\n }\n var r = this._toCSGWall(-1, 1);\n cags.map(function(cag) {\n r = r.intersectSub(cag._toCSGWall(-1, 1), false, false);\n });\n r = r.reTesselated();\n r = r.canonicalized();\n r = CAG.fromFakeCSG(r);\n r = r.canonicalized();\n return r;\n },\n\n transform: function(matrix4x4) {\n var ismirror = matrix4x4.isMirroring();\n var newsides = this.sides.map(function(side) {\n return side.transform(matrix4x4);\n });\n var result = CAG.fromSides(newsides);\n if (ismirror) {\n result = result.flipped();\n }\n return result;\n },\n\n // see http://local.wasp.uwa.edu.au/~pbourke/geometry/polyarea/ :\n // Area of the polygon. For a counter clockwise rotating polygon the area is positive, otherwise negative\n // Note(bebbi): this looks wrong. See polygon getArea()\n area: function() {\n var polygonArea = 0;\n this.sides.map(function(side) {\n polygonArea += side.vertex0.pos.cross(side.vertex1.pos);\n });\n polygonArea *= 0.5;\n return polygonArea;\n },\n\n flipped: function() {\n var newsides = this.sides.map(function(side) {\n return side.flipped();\n });\n newsides.reverse();\n return CAG.fromSides(newsides);\n },\n\n getBounds: function() {\n var minpoint;\n if (this.sides.length === 0) {\n minpoint = new CSG.Vector2D(0, 0);\n } else {\n minpoint = this.sides[0].vertex0.pos;\n }\n var maxpoint = minpoint;\n this.sides.map(function(side) {\n minpoint = minpoint.min(side.vertex0.pos);\n minpoint = minpoint.min(side.vertex1.pos);\n maxpoint = maxpoint.max(side.vertex0.pos);\n maxpoint = maxpoint.max(side.vertex1.pos);\n });\n return [minpoint, maxpoint];\n },\n\n isSelfIntersecting: function(debug) {\n var numsides = this.sides.length;\n for (var i = 0; i < numsides; i++) {\n var side0 = this.sides[i];\n for (var ii = i + 1; ii < numsides; ii++) {\n var side1 = this.sides[ii];\n if (CAG.linesIntersect(side0.vertex0.pos, side0.vertex1.pos, side1.vertex0.pos, side1.vertex1.pos)) {\n if (debug) { OpenJsCad.log(side0); OpenJsCad.log(side1);}\n return true;\n }\n }\n }\n return false;\n },\n\n expandedShell: function(radius, resolution) {\n resolution = resolution || 8;\n if (resolution < 4) resolution = 4;\n var cags = [];\n var pointmap = {};\n var cag = this.canonicalized();\n cag.sides.map(function(side) {\n var d = side.vertex1.pos.minus(side.vertex0.pos);\n var dl = d.length();\n if (dl > 1e-5) {\n d = d.times(1.0 / dl);\n var normal = d.normal().times(radius);\n var shellpoints = [\n side.vertex1.pos.plus(normal),\n side.vertex1.pos.minus(normal),\n side.vertex0.pos.minus(normal),\n side.vertex0.pos.plus(normal)\n ];\n // var newcag = CAG.fromPointsNoCheck(shellpoints);\n var newcag = CAG.fromPoints(shellpoints);\n cags.push(newcag);\n for (var step = 0; step < 2; step++) {\n var p1 = (step === 0) ? side.vertex0.pos : side.vertex1.pos;\n var p2 = (step === 0) ? side.vertex1.pos : side.vertex0.pos;\n var tag = p1.x + \" \" + p1.y;\n if (!(tag in pointmap)) {\n pointmap[tag] = [];\n }\n pointmap[tag].push({\n \"p1\": p1,\n \"p2\": p2\n });\n }\n }\n });\n for (var tag in pointmap) {\n var m = pointmap[tag];\n var angle1, angle2;\n var pcenter = m[0].p1;\n if (m.length == 2) {\n var end1 = m[0].p2;\n var end2 = m[1].p2;\n angle1 = end1.minus(pcenter).angleDegrees();\n angle2 = end2.minus(pcenter).angleDegrees();\n if (angle2 < angle1) angle2 += 360;\n if (angle2 >= (angle1 + 360)) angle2 -= 360;\n if (angle2 < angle1 + 180) {\n var t = angle2;\n angle2 = angle1 + 360;\n angle1 = t;\n }\n angle1 += 90;\n angle2 -= 90;\n } else {\n angle1 = 0;\n angle2 = 360;\n }\n var fullcircle = (angle2 > angle1 + 359.999);\n if (fullcircle) {\n angle1 = 0;\n angle2 = 360;\n }\n if (angle2 > (angle1 + 1e-5)) {\n var points = [];\n if (!fullcircle) {\n points.push(pcenter);\n }\n var numsteps = Math.round(resolution * (angle2 - angle1) / 360);\n if (numsteps < 1) numsteps = 1;\n for (var step = 0; step <= numsteps; step++) {\n var angle = angle1 + step / numsteps * (angle2 - angle1);\n if (step == numsteps) angle = angle2; // prevent rounding errors\n var point = pcenter.plus(CSG.Vector2D.fromAngleDegrees(angle).times(radius));\n if ((!fullcircle) || (step > 0)) {\n points.push(point);\n }\n }\n var newcag = CAG.fromPointsNoCheck(points);\n cags.push(newcag);\n }\n }\n var result = new CAG();\n result = result.union(cags);\n return result;\n },\n\n expand: function(radius, resolution) {\n var result = this.union(this.expandedShell(radius, resolution));\n return result;\n },\n\n contract: function(radius, resolution) {\n var result = this.subtract(this.expandedShell(radius, resolution));\n return result;\n },\n\n // extrude the CAG in a certain plane. \n // Giving just a plane is not enough, multiple different extrusions in the same plane would be possible\n // by rotating around the plane's origin. An additional right-hand vector should be specified as well,\n // and this is exactly a CSG.OrthoNormalBasis.\n // orthonormalbasis: characterizes the plane in which to extrude\n // depth: thickness of the extruded shape. Extrusion is done symmetrically above and below the plane.\n extrudeInOrthonormalBasis: function(orthonormalbasis, depth) {\n // first extrude in the regular Z plane:\n if (!(orthonormalbasis instanceof CSG.OrthoNormalBasis)) {\n throw new Error(\"extrudeInPlane: the first parameter should be a CSG.OrthoNormalBasis\");\n }\n var extruded = this.extrude({\n offset: [0, 0, depth]\n });\n var matrix = orthonormalbasis.getInverseProjectionMatrix();\n extruded = extruded.transform(matrix);\n return extruded;\n },\n\n // Extrude in a standard cartesian plane, specified by two axis identifiers. Each identifier can be\n // one of [\"X\",\"Y\",\"Z\",\"-X\",\"-Y\",\"-Z\"]\n // The 2d x axis will map to the first given 3D axis, the 2d y axis will map to the second.\n // See CSG.OrthoNormalBasis.GetCartesian for details.\n extrudeInPlane: function(axis1, axis2, depth) {\n return this.extrudeInOrthonormalBasis(CSG.OrthoNormalBasis.GetCartesian(axis1, axis2), depth);\n },\n\n // extruded=cag.extrude({offset: [0,0,10], twistangle: 360, twiststeps: 100});\n // linear extrusion of 2D shape, with optional twist\n // The 2d shape is placed in in z=0 plane and extruded into direction (a CSG.Vector3D)\n // The final face is rotated degrees. Rotation is done around the origin of the 2d shape (i.e. x=0, y=0)\n // twiststeps determines the resolution of the twist (should be >= 1)\n // returns a CSG object\n extrude: function(options) {\n if (this.sides.length == 0) {\n // empty!\n return new CSG();\n }\n var offsetVector = CSG.parseOptionAs3DVector(options, \"offset\", [0, 0, 1]);\n var twistangle = CSG.parseOptionAsFloat(options, \"twistangle\", 0);\n var twiststeps = CSG.parseOptionAsInt(options, \"twiststeps\", CSG.defaultResolution3D);\n if (offsetVector.z == 0) {\n throw('offset cannot be orthogonal to Z axis');\n }\n if (twistangle == 0 || twiststeps < 1) {\n twiststeps = 1;\n }\n var normalVector = CSG.Vector3D.Create(0, 1, 0);\n\n var polygons = [];\n // bottom and top\n polygons = polygons.concat(this._toPlanePolygons({translation: [0, 0, 0],\n normalVector: normalVector, flipped: !(offsetVector.z < 0)}));\n polygons = polygons.concat(this._toPlanePolygons({translation: offsetVector,\n normalVector: normalVector.rotateZ(twistangle), flipped: offsetVector.z < 0}));\n // walls\n for (var i = 0; i < twiststeps; i++) {\n var c1 = new CSG.Connector(offsetVector.times(i / twiststeps), [0, 0, offsetVector.z],\n normalVector.rotateZ(i * twistangle/twiststeps));\n var c2 = new CSG.Connector(offsetVector.times((i + 1) / twiststeps), [0, 0, offsetVector.z],\n normalVector.rotateZ((i + 1) * twistangle/twiststeps));\n polygons = polygons.concat(this._toWallPolygons({toConnector1: c1, toConnector2: c2}));\n }\n\n return CSG.fromPolygons(polygons);\n },\n\n /*\n * extrude CAG to 3d object by rotating the origin around the y axis\n * (and turning everything into XY plane)\n * arguments: options dict with angle and resolution, both optional\n */\n rotateExtrude: function(options) {\n var alpha = CSG.parseOptionAsFloat(options, \"angle\", 360);\n var resolution = CSG.parseOptionAsInt(options, \"resolution\", CSG.defaultResolution3D);\n\n var EPS = 1e-5;\n\n alpha = alpha > 360 ? alpha % 360 : alpha;\n var origin = [0, 0, 0];\n var axisV = CSG.Vector3D.Create(0, 1, 0);\n var normalV = [0, 0, 1];\n var polygons = [];\n // planes only needed if alpha > 0\n var connS = new CSG.Connector(origin, axisV, normalV);\n if (alpha > 0 && alpha < 360) {\n // we need to rotate negative to satisfy wall function condition of\n // building in the direction of axis vector\n var connE = new CSG.Connector(origin, axisV.rotateZ(-alpha), normalV);\n polygons = polygons.concat(\n this._toPlanePolygons({toConnector: connS, flipped: true}));\n polygons = polygons.concat(\n this._toPlanePolygons({toConnector: connE}));\n }\n var connT1 = connS, connT2;\n var step = alpha/resolution;\n for (var a = step; a <= alpha + EPS; a += step) {\n connT2 = new CSG.Connector(origin, axisV.rotateZ(-a), normalV);\n polygons = polygons.concat(this._toWallPolygons(\n {toConnector1: connT1, toConnector2: connT2}));\n connT1 = connT2;\n }\n return CSG.fromPolygons(polygons).reTesselated();\n },\n\n // check if we are a valid CAG (for debugging)\n // NOTE(bebbi) uneven side count doesn't work because rounding with EPS isn't taken into account\n check: function() {\n var EPS = 1e-5;\n var errors = [];\n if (this.isSelfIntersecting(true)) {\n errors.push(\"Self intersects\");\n }\n var pointcount = {};\n this.sides.map(function(side) {\n function mappoint(p) {\n var tag = p.x + \" \" + p.y;\n if (!(tag in pointcount)) pointcount[tag] = 0;\n pointcount[tag] ++;\n }\n mappoint(side.vertex0.pos);\n mappoint(side.vertex1.pos);\n });\n for (var tag in pointcount) {\n var count = pointcount[tag];\n if (count & 1) {\n errors.push(\"Uneven number of sides (\" + count + \") for point \" + tag);\n }\n }\n var area = this.area();\n if (area < EPS*EPS) {\n errors.push(\"Area is \" + area);\n }\n if (errors.length > 0) {\n var ertxt = \"\";\n errors.map(function(err) {\n ertxt += err + \"\\n\";\n });\n throw new Error(ertxt);\n }\n },\n\n canonicalized: function() {\n if (this.isCanonicalized) {\n return this;\n } else {\n var factory = new CAG.fuzzyCAGFactory();\n var result = factory.getCAG(this);\n result.isCanonicalized = true;\n return result;\n }\n },\n\n toCompactBinary: function() {\n var cag = this.canonicalized();\n var numsides = cag.sides.length;\n var vertexmap = {};\n var vertices = [];\n var numvertices = 0;\n var sideVertexIndices = new Uint32Array(2 * numsides);\n var sidevertexindicesindex = 0;\n cag.sides.map(function(side) {\n [side.vertex0, side.vertex1].map(function(v) {\n var vertextag = v.getTag();\n var vertexindex;\n if (!(vertextag in vertexmap)) {\n vertexindex = numvertices++;\n vertexmap[vertextag] = vertexindex;\n vertices.push(v);\n } else {\n vertexindex = vertexmap[vertextag];\n }\n sideVertexIndices[sidevertexindicesindex++] = vertexindex;\n });\n });\n var vertexData = new Float64Array(numvertices * 2);\n var verticesArrayIndex = 0;\n vertices.map(function(v) {\n var pos = v.pos;\n vertexData[verticesArrayIndex++] = pos._x;\n vertexData[verticesArrayIndex++] = pos._y;\n });\n var result = {\n 'class': \"CAG\",\n sideVertexIndices: sideVertexIndices,\n vertexData: vertexData\n };\n return result;\n },\n\n getOutlinePaths: function() {\n var cag = this.canonicalized();\n var sideTagToSideMap = {};\n var startVertexTagToSideTagMap = {};\n cag.sides.map(function(side) {\n var sidetag = side.getTag();\n sideTagToSideMap[sidetag] = side;\n var startvertextag = side.vertex0.getTag();\n if (!(startvertextag in startVertexTagToSideTagMap)) {\n startVertexTagToSideTagMap[startvertextag] = [];\n }\n startVertexTagToSideTagMap[startvertextag].push(sidetag);\n });\n var paths = [];\n while (true) {\n var startsidetag = null;\n for (var aVertexTag in startVertexTagToSideTagMap) {\n var sidesForThisVertex = startVertexTagToSideTagMap[aVertexTag];\n startsidetag = sidesForThisVertex[0];\n sidesForThisVertex.splice(0, 1);\n if (sidesForThisVertex.length === 0) {\n delete startVertexTagToSideTagMap[aVertexTag];\n }\n break;\n }\n if (startsidetag === null) break; // we've had all sides\n var connectedVertexPoints = [];\n var sidetag = startsidetag;\n var thisside = sideTagToSideMap[sidetag];\n var startvertextag = thisside.vertex0.getTag();\n while (true) {\n connectedVertexPoints.push(thisside.vertex0.pos);\n var nextvertextag = thisside.vertex1.getTag();\n if (nextvertextag == startvertextag) break; // we've closed the polygon\n if (!(nextvertextag in startVertexTagToSideTagMap)) {\n throw new Error(\"Area is not closed!\");\n }\n var nextpossiblesidetags = startVertexTagToSideTagMap[nextvertextag];\n var nextsideindex = -1;\n if (nextpossiblesidetags.length == 1) {\n nextsideindex = 0;\n } else {\n // more than one side starting at the same vertex. This means we have\n // two shapes touching at the same corner\n var bestangle = null;\n var thisangle = thisside.direction().angleDegrees();\n for (var sideindex = 0; sideindex < nextpossiblesidetags.length; sideindex++) {\n var nextpossiblesidetag = nextpossiblesidetags[sideindex];\n var possibleside = sideTagToSideMap[nextpossiblesidetag];\n var angle = possibleside.direction().angleDegrees();\n var angledif = angle - thisangle;\n if (angledif < -180) angledif += 360;\n if (angledif >= 180) angledif -= 360;\n if ((nextsideindex < 0) || (angledif > bestangle)) {\n nextsideindex = sideindex;\n bestangle = angledif;\n }\n }\n }\n var nextsidetag = nextpossiblesidetags[nextsideindex];\n nextpossiblesidetags.splice(nextsideindex, 1);\n if (nextpossiblesidetags.length === 0) {\n delete startVertexTagToSideTagMap[nextvertextag];\n }\n thisside = sideTagToSideMap[nextsidetag];\n } // inner loop\n var path = new CSG.Path2D(connectedVertexPoints, true);\n paths.push(path);\n } // outer loop\n return paths;\n },\n\n /*\n cag = cag.overCutInsideCorners(cutterradius);\n\n Using a CNC router it's impossible to cut out a true sharp inside corner. The inside corner\n will be rounded due to the radius of the cutter. This function compensates for this by creating\n an extra cutout at each inner corner so that the actual cut out shape will be at least as large\n as needed.\n */\n overCutInsideCorners: function(cutterradius) {\n var cag = this.canonicalized();\n // for each vertex determine the 'incoming' side and 'outgoing' side:\n var pointmap = {}; // tag => {pos: coord, from: [], to: []}\n cag.sides.map(function(side) {\n if (!(side.vertex0.getTag() in pointmap)) {\n pointmap[side.vertex0.getTag()] = {\n pos: side.vertex0.pos,\n from: [],\n to: []\n };\n }\n pointmap[side.vertex0.getTag()].to.push(side.vertex1.pos);\n if (!(side.vertex1.getTag() in pointmap)) {\n pointmap[side.vertex1.getTag()] = {\n pos: side.vertex1.pos,\n from: [],\n to: []\n };\n }\n pointmap[side.vertex1.getTag()].from.push(side.vertex0.pos);\n });\n // overcut all sharp corners:\n var cutouts = [];\n for (var pointtag in pointmap) {\n var pointobj = pointmap[pointtag];\n if ((pointobj.from.length == 1) && (pointobj.to.length == 1)) {\n // ok, 1 incoming side and 1 outgoing side:\n var fromcoord = pointobj.from[0];\n var pointcoord = pointobj.pos;\n var tocoord = pointobj.to[0];\n var v1 = pointcoord.minus(fromcoord).unit();\n var v2 = tocoord.minus(pointcoord).unit();\n var crossproduct = v1.cross(v2);\n var isInnerCorner = (crossproduct < 0.001);\n if (isInnerCorner) {\n // yes it's a sharp corner:\n var alpha = v2.angleRadians() - v1.angleRadians() + Math.PI;\n if (alpha < 0) {\n alpha += 2 * Math.PI;\n } else if (alpha >= 2 * Math.PI) {\n alpha -= 2 * Math.PI;\n }\n var midvector = v2.minus(v1).unit();\n var circlesegmentangle = 30 / 180 * Math.PI; // resolution of the circle: segments of 30 degrees\n // we need to increase the radius slightly so that our imperfect circle will contain a perfect circle of cutterradius\n var radiuscorrected = cutterradius / Math.cos(circlesegmentangle / 2);\n var circlecenter = pointcoord.plus(midvector.times(radiuscorrected));\n // we don't need to create a full circle; a pie is enough. Find the angles for the pie:\n var startangle = alpha + midvector.angleRadians();\n var deltaangle = 2 * (Math.PI - alpha);\n var numsteps = 2 * Math.ceil(deltaangle / circlesegmentangle / 2); // should be even\n // build the pie:\n var points = [circlecenter];\n for (var i = 0; i <= numsteps; i++) {\n var angle = startangle + i / numsteps * deltaangle;\n var p = CSG.Vector2D.fromAngleRadians(angle).times(radiuscorrected).plus(circlecenter);\n points.push(p);\n }\n cutouts.push(CAG.fromPoints(points));\n }\n }\n }\n var result = cag.subtract(cutouts);\n return result;\n }\n };\n\n CAG.Vertex = function(pos) {\n this.pos = pos;\n };\n\n CAG.Vertex.fromObject = function(obj) {\n return new CAG.Vertex(new CSG.Vector2D(obj.pos._x,obj.pos._y));\n };\n\n CAG.Vertex.prototype = {\n toString: function() {\n return \"(\" + this.pos.x.toFixed(2) + \",\" + this.pos.y.toFixed(2) + \")\";\n },\n getTag: function() {\n var result = this.tag;\n if (!result) {\n result = CSG.getTag();\n this.tag = result;\n }\n return result;\n }\n };\n\n CAG.Side = function(vertex0, vertex1) {\n if (!(vertex0 instanceof CAG.Vertex)) throw new Error(\"Assertion failed\");\n if (!(vertex1 instanceof CAG.Vertex)) throw new Error(\"Assertion failed\");\n this.vertex0 = vertex0;\n this.vertex1 = vertex1;\n };\n\n CAG.Side.fromObject = function(obj) {\n var vertex0 = CAG.Vertex.fromObject(obj.vertex0);\n var vertex1 = CAG.Vertex.fromObject(obj.vertex1);\n return new CAG.Side(vertex0,vertex1);\n };\n\n CAG.Side._fromFakePolygon = function(polygon) {\n polygon.vertices.forEach(function(v) {\n if (!((v.pos.z >= -1.001) && (v.pos.z < -0.999)) && !((v.pos.z >= 0.999) && (v.pos.z < 1.001))) {\n throw(\"Assertion failed: _fromFakePolygon expects abs z values of 1\");\n }\n })\n // this can happen based on union, seems to be residuals -\n // return null and handle in caller\n if (polygon.vertices.length < 4) {\n return null;\n }\n var reverse = false;\n var vert1Indices = [];\n var pts2d = polygon.vertices.filter(function(v, i) {\n if (v.pos.z > 0) {\n vert1Indices.push(i);\n return true;\n }\n })\n .map(function(v) {\n return new CSG.Vector2D(v.pos.x, v.pos.y);\n });\n if (pts2d.length != 2) {\n throw('Assertion failed: _fromFakePolygon: not enough points found')\n }\n var d = vert1Indices[1] - vert1Indices[0];\n if (d == 1 || d == 3) {\n if (d == 1) {\n pts2d.reverse();\n }\n } else {\n throw('Assertion failed: _fromFakePolygon: unknown index ordering');\n }\n var result = new CAG.Side(new CAG.Vertex(pts2d[0]), new CAG.Vertex(pts2d[1]));\n return result;\n };\n\n CAG.Side.prototype = {\n toString: function() {\n return this.vertex0 + \" -> \" + this.vertex1;\n },\n\n toPolygon3D: function(z0, z1) {\n var vertices = [\n new CSG.Vertex(this.vertex0.pos.toVector3D(z0)),\n new CSG.Vertex(this.vertex1.pos.toVector3D(z0)),\n new CSG.Vertex(this.vertex1.pos.toVector3D(z1)),\n new CSG.Vertex(this.vertex0.pos.toVector3D(z1))\n ];\n return new CSG.Polygon(vertices);\n },\n\n transform: function(matrix4x4) {\n var newp1 = this.vertex0.pos.transform(matrix4x4);\n var newp2 = this.vertex1.pos.transform(matrix4x4);\n return new CAG.Side(new CAG.Vertex(newp1), new CAG.Vertex(newp2));\n },\n\n flipped: function() {\n return new CAG.Side(this.vertex1, this.vertex0);\n },\n\n direction: function() {\n return this.vertex1.pos.minus(this.vertex0.pos);\n },\n\n getTag: function() {\n var result = this.tag;\n if (!result) {\n result = CSG.getTag();\n this.tag = result;\n }\n return result;\n },\n\n lengthSquared: function() {\n var x = this.vertex1.pos.x - this.vertex0.pos.x,\n y = this.vertex1.pos.y - this.vertex0.pos.y;\n return x * x + y * y;\n },\n\n length: function() {\n return Math.sqrt(this.lengthSquared());\n }\n };\n\n //////////////////////////////////////\n CAG.fuzzyCAGFactory = function() {\n this.vertexfactory = new CSG.fuzzyFactory(2, 1e-5);\n };\n\n CAG.fuzzyCAGFactory.prototype = {\n getVertex: function(sourcevertex) {\n var elements = [sourcevertex.pos._x, sourcevertex.pos._y];\n var result = this.vertexfactory.lookupOrCreate(elements, function(els) {\n return sourcevertex;\n });\n return result;\n },\n\n getSide: function(sourceside) {\n var vertex0 = this.getVertex(sourceside.vertex0);\n var vertex1 = this.getVertex(sourceside.vertex1);\n return new CAG.Side(vertex0, vertex1);\n },\n\n getCAG: function(sourcecag) {\n var _this = this;\n var newsides = sourcecag.sides.map(function(side) {\n return _this.getSide(side);\n })\n // remove bad sides (mostly a user input issue)\n .filter(function(side) {\n return side.length() > 1e-5;\n });\n return CAG.fromSides(newsides);\n }\n };\n\n //////////////////////////////////////\n CSG.addTransformationMethodsToPrototype(CSG.prototype);\n CSG.addTransformationMethodsToPrototype(CSG.Vector2D.prototype);\n CSG.addTransformationMethodsToPrototype(CSG.Vector3D.prototype);\n CSG.addTransformationMethodsToPrototype(CSG.Vertex.prototype);\n CSG.addTransformationMethodsToPrototype(CSG.Plane.prototype);\n CSG.addTransformationMethodsToPrototype(CSG.Polygon.prototype);\n CSG.addTransformationMethodsToPrototype(CSG.Line3D.prototype);\n CSG.addTransformationMethodsToPrototype(CSG.Connector.prototype);\n CSG.addTransformationMethodsToPrototype(CSG.Path2D.prototype);\n CSG.addTransformationMethodsToPrototype(CSG.Line2D.prototype);\n CSG.addTransformationMethodsToPrototype(CAG.prototype);\n CSG.addTransformationMethodsToPrototype(CAG.Side.prototype);\n CSG.addTransformationMethodsToPrototype(CSG.OrthoNormalBasis.prototype);\n\n CSG.addCenteringToPrototype(CSG.prototype, ['x', 'y', 'z']);\n CSG.addCenteringToPrototype(CAG.prototype, ['x', 'y']);\n\n /*\n 2D polygons are now supported through the CAG class.\n With many improvements (see documentation):\n - shapes do no longer have to be convex\n - union/intersect/subtract is supported\n - expand / contract are supported\n\n But we'll keep CSG.Polygon2D as a stub for backwards compatibility\n */\n \n CSG.Polygon2D = function(points) {\n var cag = CAG.fromPoints(points);\n this.sides = cag.sides;\n };\n CSG.Polygon2D.prototype = CAG.prototype;\n\n\n //console.log('module', module)\n //module.CSG = CSG;\n //module.CAG = CAG;\n//})(this); //module to export to\n\nmodule.exports = {CSG,CAG}//({})(module)\n","/*\n * Blob.js\n * See https://developer.mozilla.org/en-US/docs/Web/API/Blob\n *\n * Node and Browserify Compatible\n *\n * Copyright (c) 2015 by Z3 Dev (@zdev/www.z3dev.jp)\n * License: MIT License\n *\n * This implementation uses the Buffer class for all storage.\n * See https://nodejs.org/api/buffer.html\n *\n * URL.createObjectURL(blob)\n *\n * History:\n * 2015/07/02: 0.0.1: contributed to OpenJSCAD.org CLI openjscad\n */\n\nexport default function makeBlob(contents, options){\n const blob = typeof window !== 'undefined' ? window.Blob : Blob\n return blob\n}\n\nfunction Blob (contents, options) {\n // make the optional options non-optional\n options = options || {}\n // number of bytes\n this.size = 0 // contents, not allocation\n // media type\n this.type = ''\n // readability state (CLOSED: true, OPENED: false)\n this.isClosed = false\n // encoding of given strings\n this.encoding = 'utf8'\n // storage\n this.buffer = null\n this.length = 32e+6 // allocation, not contents\n\n if (!contents) return\n if (!Array.isArray(contents)) return\n\n // process options if any\n if (options.type) {\n // TBD if type contains any chars outside range U+0020 to U+007E, then set type to the empty string\n // Convert every character in type to lowercase\n this.type = options.type.toLowerCase()\n }\n if (options.endings) {\n // convert the EOL on strings\n }\n if (options.encoding) {\n this.encoding = options.encoding.toLowerCase()\n }\n if (options.length) {\n this.length = options.length\n }\n\n let wbytes\n let object\n // convert the contents (String, ArrayBufferView, ArrayBuffer, Blob)\n this.buffer = new Buffer(this.length)\n var index = 0\n for (index = 0; index < contents.length; index++) {\n switch (typeof (contents[index])) {\n case 'string':\n wbytes = this.buffer.write(contents[index], this.size, this.encoding)\n this.size = this.size + wbytes\n break\n case 'object':\n object = contents[index] // this should be a reference to an object\n if (Buffer.isBuffer(object)) {\n }\n if (object instanceof ArrayBuffer) {\n var view = new DataView(object)\n var bindex = 0\n for (bindex = 0; bindex < object.byteLength; bindex++) {\n var xbyte = view.getUint8(bindex)\n wbytes = this.buffer.writeUInt8(xbyte, this.size, false)\n this.size++\n }\n }\n break\n default:\n break\n }\n }\n return this\n}\n\nBlob.prototype = {\n asBuffer: function () {\n return this.buffer.slice(0, this.size)\n },\n\n slice: function (start, end, type) {\n start = start || 0\n end = end || this.size\n type = type || ''\n return new Blob()\n },\n\n close: function () {\n // if state of context objext is already CLOSED then return\n if (this.isClosed) return\n // set the readbility state of the context object to CLOSED and remove storage\n this.isClosed = true\n },\n\n toString: function () {\n return 'blob blob blob'\n }\n}\n\nexport function revokeBlobUrl (url) {\n if (window.URL) window.URL.revokeObjectURL(url)\n else if (window.webkitURL) window.webkitURL.revokeObjectURL(url)\n else throw new Error(\"Your browser doesn't support window.URL\")\n}\n","import makeBlob from '../../utils/Blob'\nconst Blob = makeBlob()\n\nexport default function toStlString (CSG) {\n var result = 'solid csg.js\\n'\n CSG.polygons.map(function (p) {\n result += CSGPolygontoStlString(p)\n })\n result += 'endsolid csg.js\\n'\n return new Blob([result], {\n type: 'application/sla'\n })\n}\n\nfunction CSGVector3DtoStlString (v) {\n return v._x + ' ' + v._y + ' ' + v._z\n}\n\nfunction CSGVertextoStlString (vertex) {\n return 'vertex ' + CSGVector3DtoStlString(vertex.pos) + '\\n'\n}\n\nfunction CSGPolygontoStlString (polygon) {\n var result = ''\n if (polygon.vertices.length >= 3) // should be!\n {\n // STL requires triangular polygons. If our polygon has more vertices, create\n // multiple triangles:\n var firstVertexStl = CSGVertextoStlString(polygon.vertices[0])\n for (var i = 0; i < polygon.vertices.length - 2; i++) {\n result += 'facet normal ' + CSGVector3DtoStlString(polygon.plane.normal) + '\\nouter loop\\n'\n result += firstVertexStl\n result += CSGVertextoStlString(polygon.vertices[i + 1])\n result += CSGVertextoStlString(polygon.vertices[i + 2])\n result += 'endloop\\nendfacet\\n'\n }\n }\n return result\n}\n","import makeBlob from '../../utils/Blob'\nconst Blob = makeBlob()\n\n// see http://en.wikipedia.org/wiki/STL_%28file_format%29#Binary_STL\nexport default function toStlBinary (CSG) {\n // first check if the host is little-endian:\n var buffer = new ArrayBuffer(4)\n var int32buffer = new Int32Array(buffer, 0, 1)\n var int8buffer = new Int8Array(buffer, 0, 4)\n int32buffer[0] = 0x11223344\n if (int8buffer[0] != 0x44) {\n throw new Error('Binary STL output is currently only supported on little-endian (Intel) processors')\n }\n\n var numtriangles = 0\n CSG.polygons.map(function (p) {\n var numvertices = p.vertices.length\n var thisnumtriangles = (numvertices >= 3) ? numvertices - 2 : 0\n numtriangles += thisnumtriangles\n })\n var headerarray = new Uint8Array(80)\n for (var i = 0; i < 80; i++) {\n headerarray[i] = 65\n }\n var ar1 = new Uint32Array(1)\n ar1[0] = numtriangles\n // write the triangles to allTrianglesBuffer:\n var allTrianglesBuffer = new ArrayBuffer(50 * numtriangles)\n var allTrianglesBufferAsInt8 = new Int8Array(allTrianglesBuffer)\n // a tricky problem is that a Float32Array must be aligned at 4-byte boundaries (at least in certain browsers)\n // while each triangle takes 50 bytes. Therefore we write each triangle to a temporary buffer, and copy that\n // into allTrianglesBuffer:\n var triangleBuffer = new ArrayBuffer(50)\n var triangleBufferAsInt8 = new Int8Array(triangleBuffer)\n // each triangle consists of 12 floats:\n var triangleFloat32array = new Float32Array(triangleBuffer, 0, 12)\n // and one uint16:\n var triangleUint16array = new Uint16Array(triangleBuffer, 48, 1)\n var byteoffset = 0\n CSG.polygons.map(function (p) {\n var numvertices = p.vertices.length\n for (var i = 0; i < numvertices - 2; i++) {\n var normal = p.plane.normal\n triangleFloat32array[0] = normal._x\n triangleFloat32array[1] = normal._y\n triangleFloat32array[2] = normal._z\n var arindex = 3\n for (var v = 0; v < 3; v++) {\n var vv = v + ((v > 0) ? i : 0)\n var vertexpos = p.vertices[vv].pos\n triangleFloat32array[arindex++] = vertexpos._x\n triangleFloat32array[arindex++] = vertexpos._y\n triangleFloat32array[arindex++] = vertexpos._z\n }\n triangleUint16array[0] = 0\n // copy the triangle into allTrianglesBuffer:\n allTrianglesBufferAsInt8.set(triangleBufferAsInt8, byteoffset)\n byteoffset += 50\n }\n })\n return new Blob([headerarray.buffer, ar1.buffer, allTrianglesBuffer], {\n type: 'application/sla'\n })\n}\n","import makeBlob from '../../utils/Blob'\nconst Blob = makeBlob()\n\nexport default function toAMFString (CSG, m) {\n var result = '\\n\\n'\n for (var k in m) {\n result += '' + m[k] + '\\n'\n }\n result += '\\n\\n\\n'\n\n CSG.polygons.map(function (p) { // first we dump all vertices of all polygons\n for (var i = 0; i < p.vertices.length; i++) {\n result += CSGVertextoAMFString(p.vertices[i])\n }\n })\n result += '\\n'\n\n var n = 0\n CSG.polygons.map(function (p) { // then we dump all polygons\n result += '\\n'\n if (p.vertices.length < 3)\n return\n var color = null\n if (p.shared && p.shared.color) {\n color = p.shared.color\n } else if (p.color) {\n color = p.color\n }\n if (color != null) {\n if (color.length < 4) color.push(1.)\n result += '' + color[0] + '' + color[1] + '' + color[2] + '' + color[3] + ''\n }\n\n for (var i = 0; i < p.vertices.length - 2; i++) { // making sure they are all triangles (triangular polygons)\n result += ''\n result += '' + (n) + ''\n result += '' + (n + i + 1) + ''\n result += '' + (n + i + 2) + ''\n result += '\\n'\n }\n n += p.vertices.length\n result += '\\n'\n })\n result += '\\n\\n'\n result += '\\n'\n\n return new Blob([result], {\n type: 'application/amf+xml'\n })\n}\n\nfunction CSGVectortoAMFString(v){\n return '' + v._x + '' + v._y + '' + v._z + ''\n}\n\nfunction CSGVertextoAMFString(vertex){\n return '' + CSGVectortoAMFString(vertex.pos) + '\\n'\n}\n/*\nCSG.Vector3D.prototype.toAMFString = function () {\n return '' + this._x + '' + this._y + '' + this._z + ''\n}\n\nCSG.Vertex.prototype.toAMFString = function () {\n return '' + this.pos.toAMFString() + '\\n'\n}*/\n","import makeBlob from '../../utils/Blob'\nconst Blob = makeBlob()\n\nexport default function toX3D (CSG) {\n // materialPolygonLists\n // key: a color string (e.g. \"0 1 1\" for yellow)\n // value: an array of strings specifying polygons of this color\n // (as space-separated indices into vertexCoords)\n var materialPolygonLists = {},\n // list of coordinates (as \"x y z\" strings)\n vertexCoords = [],\n // map to look up the index in vertexCoords of a given vertex\n vertexTagToCoordIndexMap = {}\n\n CSG.polygons.map(function (p) {\n var red = 0,\n green = 0,\n blue = 1 // default color is blue\n if (p.shared && p.shared.color) {\n red = p.shared.color[0]\n green = p.shared.color[1]\n blue = p.shared.color[2]\n }\n\n var polygonVertexIndices = [],\n numvertices = p.vertices.length,\n vertex\n for (var i = 0; i < numvertices; i++) {\n vertex = p.vertices[i]\n if (!(vertex.getTag() in vertexTagToCoordIndexMap)) {\n vertexCoords.push(vertex.pos._x.toString() + ' ' +\n vertex.pos._y.toString() + ' ' +\n vertex.pos._z.toString()\n )\n vertexTagToCoordIndexMap[vertex.getTag()] = vertexCoords.length - 1\n }\n polygonVertexIndices.push(vertexTagToCoordIndexMap[vertex.getTag()])\n }\n\n var polygonString = polygonVertexIndices.join(' ')\n\n var colorString = red.toString() + ' ' + green.toString() + ' ' + blue.toString()\n if (!(colorString in materialPolygonLists)) {\n materialPolygonLists[colorString] = []\n }\n // add this polygonString to the list of colorString-colored polygons\n materialPolygonLists[colorString].push(polygonString)\n })\n\n // create output document\n var docType = document.implementation.createDocumentType('X3D',\n 'ISO//Web3D//DTD X3D 3.1//EN', 'http://www.web3d.org/specifications/x3d-3.1.dtd')\n var exportDoc = document.implementation.createDocument(null, 'X3D', docType)\n exportDoc.insertBefore(\n exportDoc.createProcessingInstruction('xml', 'version=\"1.0\" encoding=\"UTF-8\"'),\n exportDoc.doctype)\n\n var exportRoot = exportDoc.getElementsByTagName('X3D')[0]\n exportRoot.setAttribute('profile', 'Interchange')\n exportRoot.setAttribute('version', '3.1')\n exportRoot.setAttribute('xsd:noNamespaceSchemaLocation', 'http://www.web3d.org/specifications/x3d-3.1.xsd')\n exportRoot.setAttribute('xmlns:xsd', 'http://www.w3.org/2001/XMLSchema-instance')\n\n var exportScene = exportDoc.createElement('Scene')\n exportRoot.appendChild(exportScene)\n\n /*\n For each color, create a shape made of an appropriately colored\n material which contains all polygons that are this color.\n\n The first shape will contain the definition of all vertices,\n (), which will be referenced by\n subsequent shapes.\n */\n var coordsMeshDefined = false\n for (var colorString in materialPolygonLists) {\n var polygonList = materialPolygonLists[colorString]\n var shape = exportDoc.createElement('Shape')\n exportScene.appendChild(shape)\n\n var appearance = exportDoc.createElement('Appearance')\n shape.appendChild(appearance)\n\n var material = exportDoc.createElement('Material')\n appearance.appendChild(material)\n material.setAttribute('diffuseColor', colorString)\n material.setAttribute('ambientIntensity', '1.0')\n\n var ifs = exportDoc.createElement('IndexedFaceSet')\n shape.appendChild(ifs)\n ifs.setAttribute('solid', 'true')\n ifs.setAttribute('coordIndex', polygonList.join(' -1 ') + ' -1')\n\n var coordinate = exportDoc.createElement('Coordinate')\n ifs.appendChild(coordinate)\n if (coordsMeshDefined) {\n coordinate.setAttribute('USE', 'coords_mesh')\n } else {\n coordinate.setAttribute('DEF', 'coords_mesh')\n coordinate.setAttribute('point', vertexCoords.join(' '))\n coordsMeshDefined = true\n }\n }\n\n var x3dstring = (new XMLSerializer()).serializeToString(exportDoc)\n return new Blob([x3dstring], {\n type: 'model/x3d+xml'\n })\n}\n","import { CSG } from '../../csg'\nimport makeBlob from '../../utils/Blob'\nconst Blob = makeBlob()\n\nexport default function CAGtoSvg (cagObject) {\n var decimals = 1000\n\n // mirror the CAG about the X axis in order to generate paths into the POSITIVE direction\n var plane = new CSG.Plane(CSG.Vector3D.Create(0, 1, 0), 0)\n var cag = cagObject.transform(CSG.Matrix4x4.mirroring(plane))\n\n var bounds = cag.getBounds()\n var paths = cag.getOutlinePaths()\n var width = Math.round((bounds[1].x - bounds[0].x) * decimals) / decimals\n var height = Math.round((bounds[1].y - bounds[0].y) * decimals) / decimals\n var svg = '\\n'\n svg += '\\n'\n svg += '\\n'\n svg += '\\n'\n svg += PathsToSvg(paths, bounds)\n svg += ''\n return new Blob([svg], {\n type: 'image/svg+xml'\n })\n}\n\nfunction PathsToSvg (paths, bounds) {\n // calculate offsets in order to create paths orientated from the 0,0 axis\n var xoffset = 0 - bounds[0].x\n var yoffset = 0 - bounds[0].y\n var str = '\\n'\n paths.map(function (path) {\n str += '= path.points.length) pointindexwrapped -= path.points.length\n var point = path.points[pointindexwrapped]\n if (pointindex > 0) {\n str += 'L' + (point.x + xoffset) + ' ' + (point.y + yoffset)\n } else {\n str += 'M' + (point.x + xoffset) + ' ' + (point.y + yoffset)\n }\n }\n str += '\"/>\\n'\n })\n str += '\\n'\n return str\n}\n","import makeBlob from '../../utils/Blob'\nconst Blob = makeBlob()\n\nexport default function CAGToJson (CAG) {\n var str = '{ \"type\": \"cag\",\"sides\": ['\n var comma = ''\n CAG.sides.map(\n function (side) {\n str += comma\n str += JSON.stringify(side)\n comma = ','\n }\n )\n str += '] }'\n return new Blob([str], {\n type: 'application/json'\n })\n}\n","import makeBlob from '../../utils/Blob'\nconst Blob = makeBlob()\n\nexport default function CAGtoDxf (cagObject) {\n var paths = cagObject.getOutlinePaths()\n return PathsToDxf(paths)\n}\n\nfunction PathsToDxf (paths) {\n var str = '999\\nDXF generated by OpenJsCad\\n'\n str += ' 0\\nSECTION\\n 2\\nHEADER\\n'\n str += ' 0\\nENDSEC\\n'\n str += ' 0\\nSECTION\\n 2\\nTABLES\\n'\n str += ' 0\\nTABLE\\n 2\\nLTYPE\\n 70\\n1\\n'\n str += ' 0\\nLTYPE\\n 2\\nCONTINUOUS\\n 3\\nSolid Line\\n 72\\n65\\n 73\\n0\\n 40\\n0.0\\n'\n str += ' 0\\nENDTAB\\n'\n str += ' 0\\nTABLE\\n 2\\nLAYER\\n 70\\n1\\n'\n str += ' 0\\nLAYER\\n 2\\nOpenJsCad\\n 62\\n7\\n 6\\ncontinuous\\n'\n str += ' 0\\nENDTAB\\n'\n str += ' 0\\nTABLE\\n 2\\nSTYLE\\n 70\\n0\\n 0\\nENDTAB\\n'\n str += ' 0\\nTABLE\\n 2\\nVIEW\\n 70\\n0\\n 0\\nENDTAB\\n'\n str += ' 0\\nENDSEC\\n'\n str += ' 0\\nSECTION\\n 2\\nBLOCKS\\n'\n str += ' 0\\nENDSEC\\n'\n str += ' 0\\nSECTION\\n 2\\nENTITIES\\n'\n paths.map(function (path) {\n var numpoints_closed = path.points.length + (path.closed ? 1 : 0)\n str += ' 0\\nLWPOLYLINE\\n 8\\nOpenJsCad\\n 90\\n' + numpoints_closed + '\\n 70\\n' + (path.closed ? 1 : 0) + '\\n'\n for (var pointindex = 0; pointindex < numpoints_closed; pointindex++) {\n var pointindexwrapped = pointindex\n if (pointindexwrapped >= path.points.length) pointindexwrapped -= path.points.length\n var point = path.points[pointindexwrapped]\n str += ' 10\\n' + point.x + '\\n 20\\n' + point.y + '\\n 30\\n0.0\\n'\n }\n })\n str += ' 0\\nENDSEC\\n 0\\nEOF\\n'\n return new Blob([str], {\n type: 'application/dxf'\n })\n}\n","/* converts input data to array if it is not already an array*/\nexport function toArray (data) {\n if (!data) return []\n if (data.constructor !== Array) return [data]\n return data\n}\n","import { version } from '../jscad/version'\nimport { CSG, CAG } from '../csg'\nimport toStlString from '../io/writers/CSGToStla'\nimport toStlBinary from '../io/writers/CSGToStlb'\nimport toAMFString from '../io/writers/CSGToAMF'\nimport toX3D from '../io/writers/CSGToX3D'\nimport CAGtoSvg from '../io/writers/CAGtoSvg'\nimport CAGToJson from '../io/writers/CAGToJson'\nimport CAGtoDxf from '../io/writers/CAGtoDxf'\n\nimport {toArray} from '../utils/misc'\nimport makeBlob from '../utils/Blob'\nconst Blob = makeBlob()\n\nexport default function convertToBlob (objects, params) {\n const {format, formatInfo} = params\n\n let object\n\n if (format === 'jscad') {\n object = objects\n } else {\n objects = toArray(objects)\n //console.log('convertToBlob', objects, format)\n //console.log('object', objects[0], objects[0] instanceof CSG)\n\n // review the given objects\n let foundCSG = false\n let foundCAG = false\n for (let i = 0; i < objects.length; i++) {\n if (objects[i] instanceof CSG) { foundCSG = true }\n if (objects[i] instanceof CAG) { foundCAG = true }\n }\n // convert based on the given format\n foundCSG = foundCSG && formatInfo.convertCSG\n foundCAG = foundCAG && formatInfo.convertCAG\n if (foundCSG && foundCAG) { foundCAG = false } // use 3D conversion\n\n object = !foundCSG ? new CAG() : new CSG()\n\n for (let i = 0; i < objects.length; i++) {\n if (foundCSG === true && objects[i] instanceof CAG) {\n object = object.union(objects[i].extrude({offset: [0, 0, 0.1]})) // convert CAG to a thin solid CSG\n continue\n }\n if (foundCAG === true && objects[i] instanceof CSG) {\n continue\n }\n object = object.union(objects[i])\n }\n }\n\n const meta = {\n producer: 'OpenJSCAD.org ' + version,\n date: new Date()\n }\n\n const outputFormatHandlers = {\n amf: (object) => toAMFString(object, meta), // CSG to AMF\n stl: (object) => toStlString(object), // CSG to STL ASCII\n stla: (object) => toStlString(object), // CSG to STL ASCII\n stlb: (object) => toStlBinary(object, {webBlob: true}), // CSG to STL BINARY\n dxf: (object) => CAGtoDxf(object), // CAG to DXF\n svg: (object) => CAGtoSvg(object), // CAG to SVG\n x3d: (object) => toX3D(object.fixTJunctions()), // CSG to X3D Only possible via browsers\n json: (object) => CAGToJson(object), // CSG or CAG to JSON\n js: (object) => object, // js , pass through\n jscad: (object) => object, // jscad, pass through\n undefined: () => {\n throw new Error('Not supported : only jscad, stl, amf, dxf, svg or json as output format')\n }\n }\n\n let blob = outputFormatHandlers[format](object)\n\n if (format === 'jscad') {\n blob = new Blob([blob], { type: formatInfo.mimetype })\n }\n return blob\n}\n","// == OpenJSCAD.org, Copyright (c) 2013-2016, Licensed under MIT License\n//\n// History:\n// 2016/02/02: 0.4.0: GUI refactored, functionality split up into more files, mostly done by Z3 Dev\n\n/**\n * Create an function for processing the JSCAD script into CSG/CAG objects\n * @param {String} script the script\n * @param {Object} globals the globals to use when evaluating the script: these are not ..\n * ...ACTUAL globals, merely functions/ variable accessible AS IF they were globals !\n */\nexport default function createJscadFunction (script, globals) {\n // console.log('globals', globals)\n // not a fan of this, we have way too many explicit api elements\n let globalsList = ''\n // each top key is a library ie : openscad helpers etc\n // one level below that is the list of libs\n // last level is the actual function we want to export to 'local' scope\n Object.keys(globals).forEach(function (libKey) {\n const lib = globals[libKey]\n // console.log(`lib:${libKey}: ${lib}`)\n Object.keys(lib).forEach(function (libItemKey) {\n const libItems = lib[libItemKey]\n // console.log('libItems', libItems)\n Object.keys(libItems).forEach(function (toExposeKey) {\n // console.log('toExpose',toExpose )\n const text = `const ${toExposeKey} = globals['${libKey}']['${libItemKey}']['${toExposeKey}']\n`\n globalsList += text\n })\n })\n })\n\n const source = `// SYNC WORKER\n ${globalsList}\n\n //user defined script(s)\n ${script}\n\n if (typeof (main) !== 'function') {\n throw new Error('The JSCAD script must contain a function main() which returns one or more CSG or CAG solids.')\n }\n\n return main(params)\n `\n\n var f = new Function('params', 'include', 'globals', source)\n return f\n}\n","//\n// THESE FUNCTIONS ARE SERIALIZED FOR INCLUSION IN THE FULL SCRIPT\n//\n// TODO It might be possible to cache the serialized versions\n//\n\n// Include the requested script via MemFs (if available) or HTTP Request\n//\n// (Note: This function is appended together with the JSCAD script)\n//\nexport default function includeJscadSync (relpath, fn) {\n //console.log('include', relpath, fn)\n // include the requested script via MemFs if possible\n return new Promise(function (resolve, reject) {\n if (typeof (gMemFs) === 'object') {\n for (var fs in gMemFs) {\n if (gMemFs[fs].name === fn) {\n //eval(gMemFs[fs].source)\n resolve(gMemFs[fs].source)\n }\n }\n }\n // include the requested script via webserver access\n var xhr = new XMLHttpRequest()\n var url = relpath + fn\n if (fn.match(/^(https:|http:)/i)) {\n url = fn\n }\n xhr.open('GET', url, false)\n xhr.onload = function () {\n var src = this.responseText\n //console.log('src',src)\n //eval(src) // UGH ???\n resolve(src)\n }\n xhr.onerror = function () {}\n xhr.send()\n })\n}\n","import { CAG } from '../csg'\n\n// -- 2D primitives (OpenSCAD like notion)\n\nexport function square () {\n let v = [1, 1]\n let off\n let a = arguments\n let p = a[0]\n\n if (p && !p.size) v = [p, p]\n if (p && p.length) v = a[0], p = a[1]\n if (p && p.size && p.size.length) v = p.size\n\n off = [v[0] / 2, v[1] / 2]\n if (p && p.center === true) off = [0, 0]\n\n var o = CAG.rectangle({center: off, radius: [v[0] / 2, v[1] / 2]})\n\n return o\n}\n\nexport function circle () {\n let r = 1\n let off\n let fn = 32\n let a = arguments\n let p = a[0]\n if (p && p.r) r = p.r\n if (p && p.fn) fn = p.fn\n if (p && !p.r && !p.fn && !p.center) r = p\n off = [r, r]\n if (p && p.center === true) { off = [0, 0] }\n var o = CAG.circle({center: off, radius: r, resolution: fn})\n return o\n}\n\nexport function polygon (p) { // array of po(ints) and pa(ths)\n var points = [ ]\n if (p.paths && p.paths.length && p.paths[0].length) { // pa(th): [[0,1,2],[2,3,1]] (two paths)\n for (var j = 0; j < p.paths.length; j++) {\n for (var i = 0; i < p.paths[j].length; i++) {\n points[i] = p.points[p.paths[j][i]]\n }\n }\n } else if (p.paths && p.paths.length) { // pa(th): [0,1,2,3,4] (single path)\n for (var i = 0; i < p.paths.length; i++) {\n points[i] = p.points[p.paths[i]]\n }\n } else { // pa(th) = po(ints)\n if (p.length) {\n points = p\n } else {\n points = p.points\n }\n }\n return CAG.fromPoints(points)\n}\n\nexport function triangle () { // -- new addition\n var a = arguments\n if (a[0] && a[0].length) a = a[0]\n var o = CAG.fromPoints(a)\n return o\n}\n","import { CSG } from '../csg'\n// -- 2D to 3D primitives (OpenSCAD like notion)\n\nexport function linear_extrude (p, s) {\n // console.log(\"linear_extrude() not yet implemented\")\n // return\n let h = 1\n let off = 0\n let twist = 0\n let slices = 10\n /* convexity = 10,*/\n\n if (p.height) h = p.height\n // if(p.convexity) convexity = p.convexity // abandoned\n if (p.twist) twist = p.twist\n if (p.slices) slices = p.slices\n var o = s.extrude({offset: [0, 0, h], twistangle: twist, twiststeps: slices})\n if (p.center === true) {\n var b = [ ]\n b = o.getBounds() // b[0] = min, b[1] = max\n off = b[1].plus(b[0])\n off = off.times(-0.5)\n o = o.translate(off)\n }\n return o\n}\n\nexport function rotate_extrude (p, o) {\n var fn = 32\n if (arguments.length < 2) {\n o = p // no switches, just an object\n } else if (p !== undefined) {\n fn = p.fn\n }\n if (fn < 3) fn = 3\n var ps = []\n for (var i = 0; i < fn; i++) {\n // o.{x,y} -> rotate([0,0,i:0..360], obj->{o.x,0,o.y})\n for (var j = 0; j < o.sides.length; j++) {\n // has o.sides[j].vertex{0,1}.pos (only x,y)\n var p = []\n var m\n\n m = new CSG.Matrix4x4.rotationZ(i / fn * 360)\n p[0] = new CSG.Vector3D(o.sides[j].vertex0.pos.x, 0, o.sides[j].vertex0.pos.y)\n p[0] = m.rightMultiply1x3Vector(p[0])\n\n p[1] = new CSG.Vector3D(o.sides[j].vertex1.pos.x, 0, o.sides[j].vertex1.pos.y)\n p[1] = m.rightMultiply1x3Vector(p[1])\n\n m = new CSG.Matrix4x4.rotationZ((i + 1) / fn * 360)\n p[2] = new CSG.Vector3D(o.sides[j].vertex1.pos.x, 0, o.sides[j].vertex1.pos.y)\n p[2] = m.rightMultiply1x3Vector(p[2])\n\n p[3] = new CSG.Vector3D(o.sides[j].vertex0.pos.x, 0, o.sides[j].vertex0.pos.y)\n p[3] = m.rightMultiply1x3Vector(p[3])\n\n var p1 = new CSG.Polygon([\n new CSG.Vertex(p[0]),\n new CSG.Vertex(p[1]),\n new CSG.Vertex(p[2]),\n new CSG.Vertex(p[3]), // we make a square polygon (instead of 2 triangles)\n ])\n // var p2 = new CSG.Polygon([\n // new CSG.Vertex(p[0]),\n // new CSG.Vertex(p[2]),\n // new CSG.Vertex(p[3]),\n // ])\n ps.push(p1)\n // ps.push(p2)\n // echo(\"i=\"+i,i/fn*360,\"j=\"+j)\n }\n }\n return CSG.fromPolygons(ps)\n}\n\nexport function rectangular_extrude (pa, p) {\n let w = 1\n let h = 1\n let fn = 8\n let closed = false\n let round = true\n if (p) {\n if (p.w) w = p.w\n if (p.h) h = p.h\n if (p.fn) fn = p.fn\n if (p.closed !== undefined) closed = p.closed\n if (p.round !== undefined) round = p.round\n }\n return new CSG.Path2D(pa, closed).rectangularExtrude(w, h, fn, round)\n}\n","// -- 3D primitives (OpenSCAD like notion)\nimport { CSG } from '../csg'\nimport { circle } from './primitives2d'\nimport { rotate_extrude } from './ops-extrusions'\n\nexport function cube (p) {\n var s = 1, v = null, off = [0, 0, 0], round = false, r = 0, fn = 8\n if (p && p.length) v = p\n if (p && p.size && p.size.length) v = p.size // { size: [1,2,3] }\n if (p && p.size && !p.size.length) s = p.size // { size: 1 }\n // if(p&&!p.size&&!p.length&&p.center===undefined&&!p.round&&!p.radius) s = p // (2)\n if (p && (typeof p != 'object')) s = p// (2)\n if (p && p.round == true) { round = true, r = v && v.length ? (v[0] + v[1] + v[2]) / 30 : s / 10}\n if (p && p.radius) { round = true, r = p.radius }\n if (p && p.fn) fn = p.fn // applies in case of round: true\n\n var x = s, y = s, z = s\n if (v && v.length) {\n x = v[0], y = v[1], z = v[2]\n }\n off = [x / 2, y / 2, z / 2] // center: false default\n var o = round ?\n CSG.roundedCube({radius: [x / 2, y / 2, z / 2], roundradius: r, resolution: fn}) :\n CSG.cube({radius: [x / 2, y / 2, z / 2]})\n if (p && p.center && p.center.length) {\n off = [p.center[0] ? 0 : x / 2, p.center[1] ? 0 : y / 2, p.center[2] ? 0 : z / 2]\n } else if (p && p.center == true) {\n off = [0, 0, 0]\n } else if (p && p.center == false) {\n off = [x / 2, y / 2, z / 2]\n }\n if (off[0] || off[1] || off[2]) o = o.translate(off)\n // if(v&&v.length) o = o.scale(v) // we don't scale afterwards, we already created box with the correct size\n return o\n}\n\nexport function sphere (p) {\n var r = 1\n var fn = 32\n var off = [0, 0, 0]\n var type = 'normal'\n\n // var zoff = 0 // sphere() in openscad has no center:true|false\n if (p && p.r) r = p.r\n if (p && p.fn) fn = p.fn\n if (p && p.type) type = p.type\n // if(p&&!p.r&&!p.fn&&!p.type) r = p\n if (p && (typeof p != 'object')) r = p\n off = [0, 0, 0] // center: false (default)\n\n var o\n if (type == 'geodesic')\n o = geodesicSphere(p)\n else\n o = CSG.sphere({radius: r,resolution: fn})\n\n if (p && p.center && p.center.length) { // preparing individual x,y,z center\n off = [p.center[0] ? 0 : r, p.center[1] ? 0 : r, p.center[2] ? 0 : r]\n } else if (p && p.center == true) {\n off = [0, 0, 0]\n } else if (p && p.center == false) {\n off = [r, r, r]\n }\n if (off[0] || off[1] || off[2]) o = o.translate(off)\n return o\n}\n\nexport function geodesicSphere (p) {\n var r = 1, fn = 5\n\n var ci = [ // hard-coded data of icosahedron (20 faces, all triangles)\n [0.850651, 0.000000, -0.525731],\n [0.850651, -0.000000, 0.525731],\n [-0.850651, -0.000000, 0.525731],\n [-0.850651, 0.000000, -0.525731],\n [0.000000, -0.525731, 0.850651],\n [0.000000, 0.525731, 0.850651],\n [0.000000, 0.525731, -0.850651],\n [0.000000, -0.525731, -0.850651],\n [-0.525731, -0.850651, -0.000000],\n [0.525731, -0.850651, -0.000000],\n [0.525731, 0.850651, 0.000000],\n [-0.525731, 0.850651, 0.000000]]\n\n var ti = [ [0, 9, 1], [1, 10, 0], [6, 7, 0], [10, 6, 0], [7, 9, 0], [5, 1, 4], [4, 1, 9], [5, 10, 1], [2, 8, 3], [3, 11, 2], [2, 5, 4],\n [4, 8, 2], [2, 11, 5], [3, 7, 6], [6, 11, 3], [8, 7, 3], [9, 8, 4], [11, 10, 5], [10, 11, 6], [8, 9, 7]]\n\n var geodesicSubDivide = function (p, fn, off) {\n var p1 = p[0], p2 = p[1], p3 = p[2]\n var n = off\n var c = []\n var f = []\n\n // p3\n // /\\\n // /__\\ fn = 3\n // i /\\ /\\\n // /__\\/__\\ total triangles = 9 (fn*fn)\n // /\\ /\\ /\\\n // 0/__\\/__\\/__\\\n // p1 0 j p2\n\n for (var i = 0; i < fn; i++) {\n for (var j = 0; j < fn - i; j++) {\n var t0 = i / fn\n var t1 = (i + 1) / fn\n var s0 = j / (fn - i)\n var s1 = (j + 1) / (fn - i)\n var s2 = fn - i - 1 ? j / (fn - i - 1) : 1\n var q = []\n\n q[0] = mix3(mix3(p1, p2, s0), p3, t0)\n q[1] = mix3(mix3(p1, p2, s1), p3, t0)\n q[2] = mix3(mix3(p1, p2, s2), p3, t1)\n\n // -- normalize\n for (var k = 0; k < 3; k++) {\n var r = Math.sqrt(q[k][0] * q[k][0] + q[k][1] * q[k][1] + q[k][2] * q[k][2])\n for (var l = 0; l < 3; l++) {\n q[k][l] /= r\n }\n }\n c.push(q[0], q[1], q[2])\n f.push([n, n + 1, n + 2]); n += 3\n\n if (j < fn - i - 1) {\n var s3 = fn - i - 1 ? (j + 1) / (fn - i - 1) : 1\n q[0] = mix3(mix3(p1, p2, s1), p3, t0)\n q[1] = mix3(mix3(p1, p2, s3), p3, t1)\n q[2] = mix3(mix3(p1, p2, s2), p3, t1)\n\n // -- normalize\n for (var k = 0; k < 3; k++) {\n var r = Math.sqrt(q[k][0] * q[k][0] + q[k][1] * q[k][1] + q[k][2] * q[k][2])\n for (var l = 0; l < 3; l++) {\n q[k][l] /= r\n }\n }\n c.push(q[0], q[1], q[2])\n f.push([n, n + 1, n + 2]); n += 3\n }\n }\n }\n return { points: c, triangles: f, off: n }\n }\n\n var mix3 = function (a, b, f) {\n var _f = 1 - f\n var c = []\n for (var i = 0; i < 3; i++) {\n c[i] = a[i] * _f + b[i] * f\n }\n return c\n }\n\n if (p) {\n if (p.fn) fn = Math.floor(p.fn / 6)\n if (p.r) r = p.r\n }\n\n if (fn <= 0) fn = 1\n\n var q = []\n var c = [], f = []\n var off = 0\n\n for (var i = 0; i < ti.length; i++) {\n var g = geodesicSubDivide([ ci[ti[i][0]], ci[ti[i][1]], ci[ti[i][2]]], fn, off)\n c = c.concat(g.points)\n f = f.concat(g.triangles)\n off = g.off\n }\n return polyhedron({points: c, triangles: f}).scale(r)\n}\n\nexport function cylinder (p) {\n var r1 = 1, r2 = 1, h = 1, fn = 32, round = false\n var a = arguments\n var off = [0, 0, 0]\n if (p && p.d) {\n r1 = r2 = p.d / 2\n }\n if (p && p.r) {\n r1 = p.r\n r2 = p.r\n }\n if (p && p.h) {\n h = p.h\n }\n if (p && (p.r1 || p.r2)) {\n r1 = p.r1\n r2 = p.r2\n if (p.h) h = p.h\n }\n if (p && (p.d1 || p.d2)) {\n r1 = p.d1 / 2\n r2 = p.d2 / 2\n }\n\n if (a && a[0] && a[0].length) {\n a = a[0]\n r1 = a[0]\n r2 = a[1]\n h = a[2]\n if (a.length === 4) fn = a[3]\n }\n if (p && p.fn) fn = p.fn\n // if(p&&p.center==true) zoff = -h/2\n if (p && p.round === true) round = true\n var o\n if (p && (p.start && p.end)) {\n o = round ?\n CSG.roundedCylinder({start: p.start, end: p.end, radiusStart: r1, radiusEnd: r2, resolution: fn}) :\n CSG.cylinder({start: p.start, end: p.end, radiusStart: r1, radiusEnd: r2, resolution: fn})\n } else {\n o = round ?\n CSG.roundedCylinder({start: [0, 0, 0], end: [0, 0, h], radiusStart: r1, radiusEnd: r2, resolution: fn}) :\n CSG.cylinder({start: [0, 0, 0], end: [0, 0, h], radiusStart: r1, radiusEnd: r2, resolution: fn})\n var r = r1 > r2 ? r1 : r2\n if (p && p.center && p.center.length) { // preparing individual x,y,z center\n off = [p.center[0] ? 0 : r, p.center[1] ? 0 : r, p.center[2] ? -h / 2 : 0]\n } else if (p && p.center === true) {\n off = [0, 0, -h / 2]\n } else if (p && p.center === false) {\n off = [0, 0, 0]\n }\n if (off[0] || off[1] || off[2]) o = o.translate(off)\n }\n return o\n}\n\nexport function torus (p) {\n var ri = 1, ro = 4, fni = 16, fno = 32, roti = 0\n if (p) {\n if (p.ri) ri = p.ri\n if (p.fni) fni = p.fni\n if (p.roti) roti = p.roti\n if (p.ro) ro = p.ro\n if (p.fno) fno = p.fno\n }\n if (fni < 3) fni = 3\n if (fno < 3) fno = 3\n var c = circle({r: ri, fn: fni, center: true})\n if (roti) c = c.rotateZ(roti)\n return rotate_extrude({fn: fno}, c.translate([ro, 0, 0]))\n}\n\nexport function polyhedron (p) {\n var pgs = []\n var ref = p.triangles || p.polygons\n var colors = p.colors || null\n\n for (var i = 0; i < ref.length; i++) {\n var pp = []\n for (var j = 0; j < ref[i].length; j++) {\n pp[j] = p.points[ref[i][j]]\n }\n\n var v = []\n for (j = ref[i].length - 1; j >= 0; j--) { // --- we reverse order for examples of OpenSCAD work\n v.push(new CSG.Vertex(new CSG.Vector3D(pp[j][0], pp[j][1], pp[j][2])))\n }\n var s = CSG.Polygon.defaultShared\n if (colors && colors[i]) {\n s = CSG.Polygon.Shared.fromColor(colors[i])\n }\n pgs.push(new CSG.Polygon(v, s))\n }\n var r = CSG.fromPolygons(pgs)\n return r\n}\n","import {CAG, CSG} from '../csg'\n\n// -- 3D operations (OpenSCAD like notion)\nexport function union () {\n var o,i = 0,a = arguments\n if (a[0].length) a = a[0]\n\n o = a[i++]\n if (0) { // we leave to code for now, perhaps later we allow mixed CAG/CSG union\n if ((typeof (a[i]) == 'object') && (a[i] instanceof CAG)) {\n o = a[i].extrude({offset: [0, 0, 0.1]}) // -- convert a 2D shape to a thin solid, note: do not a[i] = a[i].extrude()\n } else {\n o = a[i++]\n }\n }\n for (; i < a.length; i++) {\n var obj = a[i]\n\n // for now disabled, later perhaps allow mixed union of CAG/CSG\n if (0 && (typeof (a[i]) == 'object') && (a[i] instanceof CAG)) {\n obj = a[i].extrude({offset: [0, 0, 0.1]}) // -- convert a 2D shape to a thin solid:\n }\n o = o.union(obj)\n }\n return o\n}\n\nexport function difference () {\n var o,i = 0,a = arguments\n if (a[0].length) a = a[0]\n for (o = a[i++]; i < a.length; i++) {\n if (a[i] instanceof CAG) {\n o = o.subtract(a[i])\n } else {\n o = o.subtract(a[i].setColor(1, 1, 0)) // -- color the cuts\n }\n }\n return o\n}\n\nexport function intersection () {\n var o,i = 0,a = arguments\n if (a[0].length) a = a[0]\n for (o = a[i++]; i < a.length; i++) {\n if (a[i] instanceof CAG) {\n o = o.intersect(a[i])\n } else {\n o = o.intersect(a[i].setColor(1, 1, 0)) // -- color the cuts\n }\n }\n return o\n}\n","import { CSG, CAG } from '../csg'\nimport { union } from './ops-booleans'\n// -- 3D transformations (OpenSCAD like notion)\n\n\nexport function translate() { // v, obj or array\n var a = arguments, v = a[0], o, i = 1;\n if(a[1].length) { a = a[1]; i = 0; }\n for(o=a[i++]; ip.angle)\n return 1;\n else {\n if (this.distancep.distance)\n return 1;\n }\n return 0;\n }\n }\n\n var ConvexHull = function() {\n this.points = null;\n this.indices = null;\n\n this.getIndices = function() {\n return this.indices;\n }\n\n this.clear = function() {\n this.indices = null;\n this.points = null;\n }\n\n this.ccw = function(p1, p2, p3) {\n var ccw = (this.points[p2].x - this.points[p1].x)*(this.points[p3].y - this.points[p1].y) -\n (this.points[p2].y - this.points[p1].y)*(this.points[p3].x - this.points[p1].x);\n if(ccw<1e-5) // we need this, otherwise sorting never ends, see https://github.com/Spiritdude/OpenJSCAD.org/issues/18\n return 0\n return ccw;\n }\n\n this.angle = function(o, a) {\n //return Math.atan((this.points[a].y-this.points[o].y) / (this.points[a].x - this.points[o].x));\n return Math.atan2((this.points[a].y-this.points[o].y), (this.points[a].x - this.points[o].x));\n }\n\n this.distance = function(a, b) {\n return ((this.points[b].x-this.points[a].x)*(this.points[b].x-this.points[a].x)+\n (this.points[b].y-this.points[a].y)*(this.points[b].y-this.points[a].y));\n }\n\n this.compute = function(_points) {\n this.indices=null;\n if (_points.length<3)\n return;\n this.points=_points;\n\n // Find the lowest point\n var min = 0;\n for(var i = 1; i < this.points.length; i++) {\n if(this.points[i].y==this.points[min].y) {\n if(this.points[i].x0) {\n var ch = [];\n for(var i=0; i 0.5 ? d / (2 - max - min) : d / (max + min)\n switch (max) {\n case r:\n h = (g - b) / d + (g < b ? 6 : 0)\n break\n case g:\n h = (b - r) / d + 2\n break\n case b:\n h = (r - g) / d + 4\n break\n }\n h /= 6\n }\n\n return [h, s, l]\n}\n\n/**\n * Converts an HSL color value to RGB. Conversion formula\n * adapted from http://en.wikipedia.org/wiki/HSL_color_space.\n * Assumes h, s, and l are contained in the set [0, 1] and\n * returns r, g, and b in the set [0, 1].\n *\n * @param Number h The hue\n * @param Number s The saturation\n * @param Number l The lightness\n * @return Array The RGB representation\n */\nexport function hsl2rgb (h, s, l) {\n if (h.length) { l = h[2], s = h[1], h = h[0]; }\n var r, g, b\n\n if (s == 0) {\n r = g = b = l // achromatic\n } else {\n function hue2rgb (p, q, t) {\n if (t < 0) t += 1\n if (t > 1) t -= 1\n if (t < 1 / 6) return p + (q - p) * 6 * t\n if (t < 1 / 2) return q\n if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6\n return p\n }\n\n var q = l < 0.5 ? l * (1 + s) : l + s - l * s\n var p = 2 * l - q\n r = hue2rgb(p, q, h + 1 / 3)\n g = hue2rgb(p, q, h)\n b = hue2rgb(p, q, h - 1 / 3)\n }\n\n return [r, g, b]\n}\n\n/**\n * Converts an RGB color value to HSV. Conversion formula\n * adapted from http://en.wikipedia.org/wiki/HSV_color_space.\n * Assumes r, g, and b are contained in the set [0, 1] and\n * returns h, s, and v in the set [0, 1].\n *\n * @param Number r The red color value\n * @param Number g The green color value\n * @param Number b The blue color value\n * @return Array The HSV representation\n */\n\nexport function rgb2hsv (r, g, b) {\n if (r.length) { b = r[2], g = r[1], r = r[0]; }\n var max = Math.max(r, g, b), min = Math.min(r, g, b)\n var h, s, v = max\n\n var d = max - min\n s = max == 0 ? 0 : d / max\n\n if (max == min) {\n h = 0 // achromatic\n } else {\n switch (max) {\n case r:\n h = (g - b) / d + (g < b ? 6 : 0)\n break\n case g:\n h = (b - r) / d + 2\n break\n case b:\n h = (r - g) / d + 4\n break\n }\n h /= 6\n }\n\n return [h, s, v]\n}\n\n/**\n * Converts an HSV color value to RGB. Conversion formula\n * adapted from http://en.wikipedia.org/wiki/HSV_color_space.\n * Assumes h, s, and v are contained in the set [0, 1] and\n * returns r, g, and b in the set [0, 1].\n *\n * @param Number h The hue\n * @param Number s The saturation\n * @param Number v The value\n * @return Array The RGB representation\n */\nexport function hsv2rgb (h, s, v) {\n if (h.length) { v = h[2], s = h[1], h = h[0]; }\n var r, g, b\n\n var i = Math.floor(h * 6)\n var f = h * 6 - i\n var p = v * (1 - s)\n var q = v * (1 - f * s)\n var t = v * (1 - (1 - f) * s)\n\n switch (i % 6) {\n case 0:\n r = v, g = t, b = p\n break\n case 1:\n r = q, g = v, b = p\n break\n case 2:\n r = p, g = v, b = t\n break\n case 3:\n r = p, g = q, b = v\n break\n case 4:\n r = t, g = p, b = v\n break\n case 5:\n r = v, g = p, b = q\n break\n }\n\n return [r, g, b]\n}\n\n/**\n * Converts a HTML5 color value (string) to RGB values\n * See the color input type of HTML5 forms\n * Conversion formula:\n * - split the string; \"#RRGGBB\" into RGB components\n * - convert the HEX value into RGB values\n */\nexport function html2rgb (s) {\n var r = 0\n var g = 0\n var b = 0\n if (s.length == 7) {\n r = parseInt('0x' + s.slice(1, 3)) / 255\n g = parseInt('0x' + s.slice(3, 5)) / 255\n b = parseInt('0x' + s.slice(5, 7)) / 255\n }\n return [r, g, b]\n}\n\n/**\n * Converts RGB color value to HTML5 color value (string)\n * Conversion forumla:\n * - convert R, G, B into HEX strings\n * - return HTML formatted string \"#RRGGBB\"\n */\nexport function rgb2html (r, g, b) {\n if (r.length) { b = r[2], g = r[1], r = r[0]; }\n var s = '#' +\n Number(0x1000000 + r * 255 * 0x10000 + g * 255 * 0x100 + b * 255).toString(16).substring(1)\n return s\n}\n","// -- Math functions (360 deg based vs 2pi)\n\nexport function sin (a) {\n return Math.sin(a / 360 * Math.PI * 2)\n}\nexport function cos (a) {\n return Math.cos(a / 360 * Math.PI * 2)\n}\nexport function asin (a) {\n return Math.asin(a) / (Math.PI * 2) * 360\n}\nexport function acos (a) {\n return Math.acos(a) / (Math.PI * 2) * 360\n}\nexport function tan (a) {\n return Math.tan(a / 360 * Math.PI * 2)\n}\nexport function atan (a) {\n return Math.atan(a) / (Math.PI * 2) * 360\n}\nexport function atan2 (a, b) {\n return Math.atan2(a, b) / (Math.PI * 2) * 360\n}\nexport function ceil (a) {\n return Math.ceil(a)\n}\nexport function floor (a) {\n return Math.floor(a)\n}\nexport function abs (a) {\n return Math.abs(a)\n}\nexport function min (a, b) {\n return a < b ? a : b\n}\nexport function max (a, b) {\n return a > b ? a : b\n}\nexport function rands (min, max, vn, seed) {\n // -- seed is ignored for now, FIX IT (requires reimplementation of random())\n // see http://stackoverflow.com/questions/424292/how-to-create-my-own-javascript-random-number-generator-that-i-can-also-set-the\n var v = new Array(vn)\n for (var i = 0; i < vn; i++) {\n v[i] = Math.random() * (max - min) + min\n }\n}\nexport function log (a) {\n return Math.log(a)\n}\nexport function lookup (ix, v) {\n var r = 0\n for (var i = 0; i < v.length; i++) {\n var a0 = v[i]\n if (a0[0] >= ix) {\n i--\n a0 = v[i]\n var a1 = v[i + 1]\n var m = 0\n if (a0[0] !== a1[0]) {\n m = abs((ix - a0[0]) / (a1[0] - a0[0]))\n }\n // echo(\">>\",i,ix,a0[0],a1[0],\";\",m,a0[1],a1[1])\n if (m > 0) {\n r = a0[1] * (1 - m) + a1[1] * m\n } else {\n r = a0[1]\n }\n return r\n }\n }\n return r\n}\n\nexport function pow (a, b) {\n return Math.pow(a, b)\n}\n\nexport function sign (a) {\n return a < 0 ? -1 : (a > 1 ? 1 : 0)\n}\n\nexport function sqrt (a) {\n return Math.sqrt(a)\n}\n\nexport function round (a) {\n return floor(a + 0.5)\n}\n","\nexport function vector_char(x,y,c) {\n c = c.charCodeAt(0);\n c -= 32;\n if(c<0||c>=95) return { width: 0, segments: [] };\n\n var off = c*112;\n var n = simplexFont[off++];\n var w = simplexFont[off++];\n var l = [];\n var segs = [];\n\n for(var i=0; i\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n * Redistributions of source code must retain the above copyright\n notice, this list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above copyright\n notice, this list of conditions and the following disclaimer in the\n documentation and/or other materials provided with the distribution.\n * Neither the name of sprintf() for JavaScript nor the\n names of its contributors may be used to endorse or promote products\n derived from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\nANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL Alexandru Marasteanu BE LIABLE FOR ANY\nDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\nON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\nChangelog:\n2010.09.06 - 0.7-beta1\n - features: vsprintf, support for named placeholders\n - enhancements: format cache, reduced global namespace pollution\n\n2010.05.22 - 0.6:\n - reverted to 0.4 and fixed the bug regarding the sign of the number 0\n Note:\n Thanks to Raphael Pigulla (http://www.n3rd.org/)\n who warned me about a bug in 0.5, I discovered that the last update was\n a regress. I appologize for that.\n\n2010.05.09 - 0.5:\n - bug fix: 0 is now preceeded with a + sign\n - bug fix: the sign was not at the right position on padded results (Kamal Abdali)\n - switched from GPL to BSD license\n\n2007.10.21 - 0.4:\n - unit test and patch (David Baird)\n\n2007.09.17 - 0.3:\n - bug fix: no longer throws exception on empty paramenters (Hans Pufal)\n\n2007.09.11 - 0.2:\n - feature: added argument swapping\n\n2007.04.03 - 0.1:\n - initial release\n**/\n\nlet sprintf = (function () {\n function get_type (variable) {\n return Object.prototype.toString.call(variable).slice(8, -1).toLowerCase()\n }\n function str_repeat (input, multiplier) {\n for (var output = []; multiplier > 0; output[--multiplier] = input) { /* do nothing */}\n return output.join('')\n }\n\n var str_format = function () {\n if (!str_format.cache.hasOwnProperty(arguments[0])) {\n str_format.cache[arguments[0]] = str_format.parse(arguments[0])\n }\n return str_format.format.call(null, str_format.cache[arguments[0]], arguments)\n }\n\n str_format.format = function (parse_tree, argv) {\n var cursor = 1, tree_length = parse_tree.length, node_type = '', arg, output = [], i, k, match, pad, pad_character, pad_length\n for (i = 0; i < tree_length; i++) {\n node_type = get_type(parse_tree[i])\n if (node_type === 'string') {\n output.push(parse_tree[i])\n }\n else if (node_type === 'array') {\n match = parse_tree[i] // convenience purposes only\n if (match[2]) { // keyword argument\n arg = argv[cursor]\n for (k = 0; k < match[2].length; k++) {\n if (!arg.hasOwnProperty(match[2][k])) {\n throw(sprintf('[sprintf] property \"%s\" does not exist', match[2][k]))\n }\n arg = arg[match[2][k]]\n }\n }\n else if (match[1]) { // positional argument (explicit)\n arg = argv[match[1]]\n } else { // positional argument (implicit)\n arg = argv[cursor++]\n }\n\n if (/[^s]/.test(match[8]) && (get_type(arg) != 'number')) {\n throw(sprintf('[sprintf] expecting number but found %s', get_type(arg)))\n }\n switch (match[8]) {\n case 'b':\n arg = arg.toString(2)\n break\n case 'c':\n arg = String.fromCharCode(arg)\n break\n case 'd':\n arg = parseInt(arg, 10)\n break\n case 'e':\n arg = match[7] ? arg.toExponential(match[7]) : arg.toExponential()\n break\n case 'f':\n arg = match[7] ? parseFloat(arg).toFixed(match[7]) : parseFloat(arg)\n break\n case 'o':\n arg = arg.toString(8)\n break\n case 's':\n arg = ((arg = String(arg)) && match[7] ? arg.substring(0, match[7]) : arg)\n break\n case 'u':\n arg = Math.abs(arg)\n break\n case 'x':\n arg = arg.toString(16)\n break\n case 'X':\n arg = arg.toString(16).toUpperCase()\n break\n }\n arg = (/[def]/.test(match[8]) && match[3] && arg >= 0 ? '+' + arg : arg)\n pad_character = match[4] ? match[4] == '0' ? '0' : match[4].charAt(1) : ' '\n pad_length = match[6] - String(arg).length\n pad = match[6] ? str_repeat(pad_character, pad_length) : ''\n output.push(match[5] ? arg + pad : pad + arg)\n }\n }\n return output.join('')\n }\n\n str_format.cache = {}\n\n str_format.parse = function (fmt) {\n var _fmt = fmt, match = [], parse_tree = [], arg_names = 0\n while (_fmt) {\n if ((match = /^[^\\x25]+/.exec(_fmt)) !== null) {\n parse_tree.push(match[0])\n }\n else if ((match = /^\\x25{2}/.exec(_fmt)) !== null) {\n parse_tree.push('%')\n }\n else if ((match = /^\\x25(?:([1-9]\\d*)\\$|\\(([^\\)]+)\\))?(\\+)?(0|'[^$])?(-)?(\\d+)?(?:\\.(\\d+))?([b-fosuxX])/.exec(_fmt)) !== null) {\n if (match[2]) {\n arg_names |= 1\n var field_list = [], replacement_field = match[2], field_match = []\n if ((field_match = /^([a-z_][a-z_\\d]*)/i.exec(replacement_field)) !== null) {\n field_list.push(field_match[1])\n while ((replacement_field = replacement_field.substring(field_match[0].length)) !== '') {\n if ((field_match = /^\\.([a-z_][a-z_\\d]*)/i.exec(replacement_field)) !== null) {\n field_list.push(field_match[1])\n }\n else if ((field_match = /^\\[(\\d+)\\]/.exec(replacement_field)) !== null) {\n field_list.push(field_match[1])\n } else {\n throw('[sprintf] huh?')\n }\n }\n } else {\n throw('[sprintf] huh?')\n }\n match[2] = field_list\n } else {\n arg_names |= 2\n }\n if (arg_names === 3) {\n throw('[sprintf] mixing positional and named placeholders is not (yet) supported')\n }\n parse_tree.push(match)\n } else {\n throw('[sprintf] huh?')\n }\n _fmt = _fmt.substring(match[0].length)\n }\n return parse_tree\n }\n\n return str_format\n})()\n\nfunction vsprintf (fmt, argv) {\n argv.unshift(fmt)\n return sprintf.apply(null, argv)\n}\n","export function log (txt) {\n var timeInMs = Date.now()\n var prevtime = undefined//OpenJsCad.log.prevLogTime\n if (!prevtime) prevtime = timeInMs\n var deltatime = timeInMs - prevtime\n log.prevLogTime = timeInMs\n var timefmt = (deltatime * 0.001).toFixed(3)\n txt = '[' + timefmt + '] ' + txt\n if ((typeof (console) == 'object') && (typeof (console.log) == 'function')) {\n console.log(txt)\n } else if ((typeof (self) == 'object') && (typeof (self.postMessage) == 'function')) {\n self.postMessage({cmd: 'log', txt: txt})\n }\n else throw new Error('Cannot log')\n}\n\n// See Processor.setStatus()\n// Note: leave for compatibility\nexport function status (s) {\n log(s)\n}\n","import * as primitives3d from './primitives3d'\nimport * as primitives2d from './primitives2d'\nimport * as booleanOps from './ops-booleans'\nimport * as transformations from './ops-transformations'\nimport * as extrusions from './ops-extrusions'\nimport * as color from './color'\nimport * as maths from './maths'\nimport * as text from './text'\nimport { echo } from './debug'\n\n// these are 'external' to this folder ...needs to be reviewed\nimport { CAG, CSG } from '../csg'\nimport { log } from '../jscad/log'\n\nconst exportedApi = {\n csg: {CAG, CSG},\n primitives2d,\n primitives3d,\n booleanOps,\n transformations,\n extrusions,\n color,\n maths,\n text,\n OpenJsCad: {OpenJsCad: {log}},\n debug: {echo}\n}\n\nexport default exportedApi\n","import createJscadFunction from './jscad-function'\nimport includeJscadSync from './includeJscadSync'\nimport WebWorkify from 'webWorkify'\nimport { CAG, CSG } from '../csg'\nimport { toArray } from '../utils/misc'\nimport oscad from '../modeling/index'\n\n/**\n * helper function that finds include() statements in files,\n * fetches their code & returns it (recursively) returning the whole code with\n * inlined includes\n * this is more reliable than async xhr + eval()\n * @param {String} text the original script (with include statements)\n * @param {String} relpath relative path, for xhr resolution\n * @returns {String} the full script, with inlined\n */\nfunction replaceIncludes (text, relpath) {\n return new Promise(function (resolve, reject) {\n let scriptWithIncludes = text\n const includesPattern = /(?:include)\\s?\\(\"([\\w\\/.\\s]*)\"\\);?/gm\n\n let foundIncludes = []\n let foundIncludesFull = []\n let match\n while(match = includesPattern.exec(text)) {\n foundIncludes.push(match[1])\n foundIncludesFull.push(match[0])\n }\n\n let tmpPromises = foundIncludes.map(function (uri, index) {\n const promise = includeJscadSync(relpath, uri)\n return promise.then(function (includedScript) {\n return replaceIncludes(includedScript, relpath).then(function (substring) {\n let currentItem = foundIncludesFull[index]\n scriptWithIncludes = scriptWithIncludes.replace(currentItem, substring)\n return scriptWithIncludes\n })\n })\n })\n Promise.all(tmpPromises).then(x => resolve(scriptWithIncludes))\n })\n}\n\n/**\n * evaluate script & rebuild solids, in main thread\n * @param {String} script the script\n * @param {String} fullurl full url of current script\n * @param {Object} parameters the parameters to use with the script\n * @param {Object} callback the callback to call once evaluation is done /failed\n * @param {Object} options the settings to use when rebuilding the solid\n */\nexport function rebuildSolidSync (script, fullurl, parameters, callback, options) {\n let relpath = fullurl\n if (relpath.lastIndexOf('/') >= 0) {\n relpath = relpath.substring(0, relpath.lastIndexOf('/') + 1)\n }\n const defaults = {\n implicitGlobals: true\n }\n options = Object.assign({}, defaults, options)\n\n replaceIncludes(script, relpath).then(function (fullScript) {\n const globals = options.implicitGlobals ? (options.globals ? options.globals : {oscad}) : {}\n const func = createJscadFunction(fullScript, globals)\n // stand-in for the include function(no-op)\n const include = (x) => x\n try {\n let objects = func(parameters, include, globals)\n objects = toArray(objects)\n if (objects.length === 0) {\n throw new Error('The JSCAD script must return one or more CSG or CAG solids.')\n }\n callback(undefined, objects)\n } catch(error) {\n callback(error, undefined)\n }\n }).catch(error => callback(error, undefined))\n\n // have we been asked to stop our work?\n return {\n cancel: () => {\n console.log('cannot stop work in main thread, sorry')\n }\n }\n}\n\n/**\n * evaluate script & rebuild solids, in seperate thread/webworker\n * @param {String} script the script\n * @param {String} fullurl full url of current script\n * @param {Object} parameters the parameters to use with the script\n * @param {Object} callback the callback to call once evaluation is done /failed\n * @param {Object} options the settings to use when rebuilding the solid\n */\nexport function rebuildSolidAsync (script, fullurl, parameters, callback, options) {\n if (!parameters) { throw new Error(\"JSCAD: missing 'parameters'\") }\n if (!window.Worker) throw new Error('Worker threads are unsupported.')\n const defaults = {\n implicitGlobals: true\n }\n options = Object.assign({}, defaults, options)\n\n let relpath = fullurl\n if (relpath.lastIndexOf('/') >= 0) {\n relpath = relpath.substring(0, relpath.lastIndexOf('/') + 1)\n }\n\n let worker\n replaceIncludes(script, relpath).then(function (script) {\n worker = WebWorkify(require('./jscad-worker.js'))\n worker.onmessage = function (e) {\n if (e.data instanceof Object) {\n const data = e.data.objects.map(function (object) {\n if (object['class'] === 'CSG') { return CSG.fromCompactBinary(object) }\n if (object['class'] === 'CAG') { return CAG.fromCompactBinary(object) }\n })\n callback(undefined, data)\n }\n }\n worker.onerror = function (e) {\n callback(`Error in line ${e.lineno} : ${e.message}`, undefined)\n }\n worker.postMessage({cmd: 'render', fullurl, script, parameters, options})\n }).catch(error => callback(error, undefined))\n\n // have we been asked to stop our work?\n return {\n cancel: () => {\n worker.terminate()\n }\n }\n}\n","import convertToBlob from './io/convertToBlob'\nimport { rebuildSolidSync } from './jscad/rebuildSolid'\nimport oscad from './modeling/index'\n\n/**\n * compile openjscad code and generates intermediate representation\n * ordering of parameters created with curying in mind\n * @param {String} source the openjscad script we want to compile\n * @param {Object} params the set of parameters to use for the script (optional)\n * @param {Object} options the set of options to use (optional)\n\n */\nfunction compile (source, params, options) {\n params = params || {}\n const defaults = {\n implicitGlobals: true\n }\n options = Object.assign({}, defaults, options)\n const {implicitGlobals} = options\n let globals = {}\n if (implicitGlobals) {\n globals.oscad = oscad\n }\n\n return new Promise(function (resolve, reject) {\n const callback = (err, result) => {\n if (!err) { return resolve(result) }\n reject(err)\n }\n rebuildSolidSync(source, '', params, callback, {implicitGlobals, globals})\n })\n}\n\n/**\n * generate output file from intermediate representation\n * @param {String} outputFormat the output file format\n * @param {Object} objects the openjscad intermediate representation\n */\nfunction generateOutput (outputFormat, objects) {\n return convertToBlob(objects, {format: outputFormat, formatInfo: {convertCAG: true, convertCSG: true}})\n}\n\nmodule.exports = {generateOutput, compile}\n"],"names":["const","this","arguments","Blob","let","CSG","CAG","i","log","color","index","oscad"],"mappings":"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C,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;GACL,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;GACpE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;IACnE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;GACL,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;GACpE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;GACpE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;GACL,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;IACnE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;IACnE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;GACL,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,EAAE;GACL,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,EAAE;IACJ,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,EAAE;IACJ,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,EAAE;IACJ,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,EAAE;GACL,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE;IACnE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;GACpE,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;IACnE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,EAAE;GACL,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;GACL,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE;IACnE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;GACL,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE;IACnE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,EAAE;GACL,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE;IACnE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;GACpE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;GACL,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;GACpE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;GACpE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,EAAE;GACL,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;GACpE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;GACL,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE;IACnE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;GACpE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;GACpE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;GACpE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;IACpD,CAAC,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;GACpE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;GACL,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;IACnE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE;IACnE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;GACL,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;IACnE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,EAAE,CAAC;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;GACL,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE;IACnE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;GACpE,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE;IACnE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;GACpE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;GACpE,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;GACL,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;IACnE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,EAAE;GACL,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,EAAE;IACJ,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;GACL,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;IACnE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE;IACnE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;GACL,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE;IACnE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;GACL,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;IACnE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;IACJ,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;IACnE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,EAAE;GACL,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;GACL,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;GACpE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,EAAE,CAAC;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,EAAE,CAAC;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE;GACpE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE;IACnE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE;IACnE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;GACL,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;IACnE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;GACL,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE;IACnE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,EAAE;GACL,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;GACpE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;IACnE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;GACpE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,EAAE,CAAC;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;GACpE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;IACnE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;GACpE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;IACJ,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EACvD,CAAC;;;;;;;;ACtmBK,SAAS,IAAI,IAAI;EACtB,OAAO,CAAC,IAAI,CAAC,yFAAyF,CAAC,CAAA;EACvG,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,SAAS,CAAA;EACzB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;IACjC,IAAI,CAAC,EAAE,EAAA,CAAC,IAAI,IAAI,CAAA,EAAA;IAChB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAA;GACV;;;EAGD,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;CACf;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6DDF,IAAI,OAAO,GAAG,CAAC,YAAY;EACzB,SAAS,QAAQ,EAAE,QAAQ,EAAE;IAC3B,OAAO,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE;GAC3E;EACD,SAAS,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE;IACtC,KAAK,IAAI,MAAM,GAAG,EAAE,EAAE,UAAU,GAAG,CAAC,EAAE,MAAM,CAAC,EAAE,UAAU,CAAC,GAAG,KAAK,EAAE,mBAAmB;IACvF,OAAO,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;GACvB;;EAED,IAAI,UAAU,GAAG,YAAY;IAC3B,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE;MAClD,UAAU,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAA;KAChE;IACD,OAAO,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC;GAC/E,CAAA;;EAED,UAAU,CAAC,MAAM,GAAG,UAAU,UAAU,EAAE,IAAI,EAAE;IAC9C,IAAI,MAAM,GAAG,CAAC,EAAE,WAAW,GAAG,UAAU,CAAC,MAAM,EAAE,SAAS,GAAG,EAAE,EAAE,GAAG,EAAE,MAAM,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,aAAa,EAAE,UAAU,CAAA;IAC9H,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,EAAE,CAAC,EAAE,EAAE;MAChC,SAAS,GAAG,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAA;MACnC,IAAI,SAAS,KAAK,QAAQ,EAAE;QAC1B,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAA;OAC3B;WACI,IAAI,SAAS,KAAK,OAAO,EAAE;QAC9B,KAAK,GAAG,UAAU,CAAC,CAAC,CAAC,CAAA;QACrB,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE;UACZ,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,CAAA;UAClB,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YACpC,IAAI,CAAC,GAAG,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE;cACpC,MAAM,OAAO,CAAC,wCAAwC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;aACtE;YACD,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;WACvB;SACF;aACI,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE;UACjB,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;SACrB,MAAM;UACL,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,CAAA;SACrB;;QAED,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,QAAQ,CAAC,GAAG,CAAC,IAAI,QAAQ,CAAC,EAAE;UACxD,MAAM,OAAO,CAAC,yCAAyC,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;SACzE;QACD,QAAQ,KAAK,CAAC,CAAC,CAAC;UACd,KAAK,GAAG;YACN,GAAG,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAA;YACrB,KAAK;UACP,KAAK,GAAG;YACN,GAAG,GAAG,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,CAAA;YAC9B,KAAK;UACP,KAAK,GAAG;YACN,GAAG,GAAG,QAAQ,CAAC,GAAG,EAAE,EAAE,CAAC,CAAA;YACvB,KAAK;UACP,KAAK,GAAG;YACN,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,aAAa,EAAE,CAAA;YAClE,KAAK;UACP,KAAK,GAAG;YACN,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,GAAG,CAAC,CAAA;YACpE,KAAK;UACP,KAAK,GAAG;YACN,GAAG,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAA;YACrB,KAAK;UACP,KAAK,GAAG;YACN,GAAG,IAAI,CAAC,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAA;YAC1E,KAAK;UACP,KAAK,GAAG;YACN,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;YACnB,KAAK;UACP,KAAK,GAAG;YACN,GAAG,GAAG,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAA;YACtB,KAAK;UACP,KAAK,GAAG;YACN,GAAG,GAAG,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,WAAW,EAAE,CAAA;YACpC,KAAK;SACR;QACD,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC,CAAA;QACxE,aAAa,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,GAAG,GAAG,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,GAAG,CAAA;QAC3E,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAA;QAC1C,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,aAAa,EAAE,UAAU,CAAC,GAAG,EAAE,CAAA;QAC3D,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC,CAAA;OAC9C;KACF;IACD,OAAO,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;GACvB,CAAA;;EAED,UAAU,CAAC,KAAK,GAAG,EAAE,CAAA;;EAErB,UAAU,CAAC,KAAK,GAAG,UAAU,GAAG,EAAE;IAChC,IAAI,IAAI,GAAG,GAAG,EAAE,KAAK,GAAG,EAAE,EAAE,UAAU,GAAG,EAAE,EAAE,SAAS,GAAG,CAAC,CAAA;IAC1D,OAAO,IAAI,EAAE;MACX,IAAI,CAAC,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,EAAE;QAC7C,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;OAC1B;WACI,IAAI,CAAC,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,EAAE;QACjD,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;OACrB;WACI,IAAI,CAAC,KAAK,GAAG,sFAAsF,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,EAAE;QAC7H,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE;UACZ,SAAS,IAAI,CAAC,CAAA;UACd,IAAI,UAAU,GAAG,EAAE,EAAE,iBAAiB,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,WAAW,GAAG,EAAE,CAAA;UACnE,IAAI,CAAC,WAAW,GAAG,qBAAqB,CAAC,IAAI,CAAC,iBAAiB,CAAC,MAAM,IAAI,EAAE;YAC1E,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAA;YAC/B,OAAO,CAAC,iBAAiB,GAAG,iBAAiB,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE;cACtF,IAAI,CAAC,WAAW,GAAG,uBAAuB,CAAC,IAAI,CAAC,iBAAiB,CAAC,MAAM,IAAI,EAAE;gBAC5E,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAA;eAChC;mBACI,IAAI,CAAC,WAAW,GAAG,YAAY,CAAC,IAAI,CAAC,iBAAiB,CAAC,MAAM,IAAI,EAAE;gBACtE,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAA;eAChC,MAAM;gBACL,MAAM,gBAAgB,CAAC;eACxB;aACF;WACF,MAAM;YACL,MAAM,gBAAgB,CAAC;WACxB;UACD,KAAK,CAAC,CAAC,CAAC,GAAG,UAAU,CAAA;SACtB,MAAM;UACL,SAAS,IAAI,CAAC,CAAA;SACf;QACD,IAAI,SAAS,KAAK,CAAC,EAAE;UACnB,MAAM,2EAA2E,CAAC;SACnF;QACD,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;OACvB,MAAM;QACL,MAAM,gBAAgB,CAAC;OACxB;MACD,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAA;KACvC;IACD,OAAO,UAAU;GAClB,CAAA;;EAED,OAAO,UAAU;CAClB,GAAG,CAAA;;AC3MG,SAASI,KAAG,EAAE,GAAG,EAAE;EACxB,IAAI,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;EACzB,IAAI,QAAQ,GAAG,SAAS,CAAA;EACxB,IAAI,CAAC,QAAQ,EAAE,EAAA,QAAQ,GAAG,QAAQ,CAAA,EAAA;EAClC,IAAI,SAAS,GAAG,QAAQ,GAAG,QAAQ,CAAA;EACnCA,KAAG,CAAC,WAAW,GAAG,QAAQ,CAAA;EAC1B,IAAI,OAAO,GAAG,CAAC,SAAS,GAAG,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,CAAA;EAC5C,GAAG,GAAG,GAAG,GAAG,OAAO,GAAG,IAAI,GAAG,GAAG,CAAA;EAChC,IAAI,CAAC,QAAQ,OAAO,CAAC,IAAI,QAAQ,MAAM,QAAQ,OAAO,CAAC,GAAG,CAAC,IAAI,UAAU,CAAC,EAAE;IAC1E,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;GACjB,MAAM,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,QAAQ,MAAM,QAAQ,IAAI,CAAC,WAAW,CAAC,IAAI,UAAU,CAAC,EAAE;IACnF,IAAI,CAAC,WAAW,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAA;GACzC;OACI,EAAA,MAAM,IAAI,KAAK,CAAC,YAAY,CAAC,EAAA;CACnC;;;;;;ACHD,IAGM,WAAW,GAAG;EAClB,GAAG,EAAE,CAAC,KAAAF,KAAG,EAAE,KAAAD,KAAG,CAAC;EACf,cAAA,YAAY;EACZ,cAAA,YAAY;EACZ,YAAA,UAAU;EACV,iBAAA,eAAe;EACf,YAAA,UAAU;EACV,OAAAI,OAAK;EACL,OAAA,KAAK;EACL,MAAA,IAAI;EACJ,SAAS,EAAE,CAAC,SAAS,EAAE,CAAC,KAAAD,KAAG,CAAC,CAAC;EAC7B,KAAK,EAAE,CAAC,MAAA,IAAI,CAAC;CACd,CAAA;;;;;;;;;;;ACVD,SAAS,eAAe,EAAE,IAAI,EAAE,OAAO,EAAE;EACvC,OAAO,IAAI,OAAO,CAAC,UAAU,OAAO,EAAE,MAAM,EAAE;IAC5CJ,IAAI,kBAAkB,GAAG,IAAI,CAAA;IAC7BJ,IAAM,eAAe,GAAG,sCAAsC,CAAA;;IAE9DI,IAAI,aAAa,GAAG,EAAE,CAAA;IACtBA,IAAI,iBAAiB,GAAG,EAAE,CAAA;IAC1BA,IAAI,KAAK,CAAA;IACT,MAAM,KAAK,GAAG,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;MACxC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;MAC5B,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;KACjC;;IAEDA,IAAI,WAAW,GAAG,aAAa,CAAC,GAAG,CAAC,UAAU,GAAG,EAAEM,QAAK,EAAE;MACxDV,IAAM,OAAO,GAAG,gBAAgB,CAAC,OAAO,EAAE,GAAG,CAAC,CAAA;MAC9C,OAAO,OAAO,CAAC,IAAI,CAAC,UAAU,cAAc,EAAE;QAC5C,OAAO,eAAe,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,UAAU,SAAS,EAAE;UACxEI,IAAI,WAAW,GAAG,iBAAiB,CAACM,QAAK,CAAC,CAAA;UAC1C,kBAAkB,GAAG,kBAAkB,CAAC,OAAO,CAAC,WAAW,EAAE,SAAS,CAAC,CAAA;UACvE,OAAO,kBAAkB;SAC1B,CAAC;OACH,CAAC;KACH,CAAC,CAAA;IACF,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,UAAA,CAAC,EAAC,SAAG,OAAO,CAAC,kBAAkB,CAAC,GAAA,CAAC,CAAA;GAChE,CAAC;CACH;;;;;;;;;;AAUD,SAAgB,gBAAgB,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE;EAChFN,IAAI,OAAO,GAAG,OAAO,CAAA;EACrB,IAAI,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;IACjC,OAAO,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAA;GAC7D;EACDJ,IAAM,QAAQ,GAAG;IACf,eAAe,EAAE,IAAI;GACtB,CAAA;EACD,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAA;;EAE9C,eAAe,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,UAAU,UAAU,EAAE;IAC1DA,IAAM,OAAO,GAAG,OAAO,CAAC,eAAe,IAAI,OAAO,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,GAAG,CAAC,OAAAW,WAAK,CAAC,IAAI,EAAE,CAAA;IAC5FX,IAAM,IAAI,GAAG,mBAAmB,CAAC,UAAU,EAAE,OAAO,CAAC,CAAA;;IAErDA,IAAM,OAAO,GAAG,UAAC,CAAC,EAAE,SAAG,CAAC,GAAA,CAAA;IACxB,IAAI;MACFI,IAAI,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE,OAAO,EAAE,OAAO,CAAC,CAAA;MAChD,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;MAC1B,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE;QACxB,MAAM,IAAI,KAAK,CAAC,6DAA6D,CAAC;OAC/E;MACD,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC,CAAA;KAC7B,CAAC,MAAM,KAAK,EAAE;MACb,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC,CAAA;KAC3B;GACF,CAAC,CAAC,KAAK,CAAC,UAAA,KAAK,EAAC,SAAG,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC,GAAA,CAAC,CAAA;;;EAG7C,OAAO;IACL,MAAM,EAAE,YAAG;MACT,OAAO,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAA;KACtD;GACF;CACF;;;;;;;;;;;;;;;;;;;ACxED,SAAS,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE;EACzC,MAAM,GAAG,MAAM,IAAI,EAAE,CAAA;EACrBJ,IAAM,QAAQ,GAAG;IACf,eAAe,EAAE,IAAI;GACtB,CAAA;EACD,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAA;EAC9C,IAAO,eAAe,2BAAhB;EACNI,IAAI,OAAO,GAAG,EAAE,CAAA;EAChB,IAAI,eAAe,EAAE;IACnB,OAAO,CAAC,KAAK,GAAGO,WAAK,CAAA;GACtB;;EAED,OAAO,IAAI,OAAO,CAAC,UAAU,OAAO,EAAE,MAAM,EAAE;IAC5CX,IAAM,QAAQ,GAAG,UAAC,GAAG,EAAE,MAAM,EAAE;MAC7B,IAAI,CAAC,GAAG,EAAE,EAAE,OAAO,OAAO,CAAC,MAAM,CAAC,EAAE;MACpC,MAAM,CAAC,GAAG,CAAC,CAAA;KACZ,CAAA;IACD,gBAAgB,CAAC,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,iBAAA,eAAe,EAAE,SAAA,OAAO,CAAC,CAAC,CAAA;GAC3E,CAAC;CACH;;;;;;;AAOD,SAAS,cAAc,EAAE,YAAY,EAAE,OAAO,EAAE;EAC9C,OAAO,aAAa,CAAC,OAAO,EAAE,CAAC,MAAM,EAAE,YAAY,EAAE,UAAU,EAAE,CAAC,UAAU,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,CAAC,CAAC,CAAC;CACxG;;AAED,MAAM,CAAC,OAAO,GAAG,CAAC,gBAAA,cAAc,EAAE,SAAA,OAAO,CAAC"} \ No newline at end of file +{"version":3,"file":null,"sources":["../src/jscad/version.js","../src/csg.js","../src/utils/Blob.js","../src/io/writers/CSGToStla.js","../src/io/writers/CSGToStlb.js","../src/io/writers/CSGToAMF.js","../node_modules/xmldom/sax.js","../node_modules/xmldom/dom.js","../node_modules/xmldom/dom-parser.js","../src/io/writers/CSGToX3D.js","../src/io/writers/CAGtoSvg.js","../src/io/writers/CAGToJson.js","../src/io/writers/CAGtoDxf.js","../src/utils/misc.js","../src/io/convertToBlob.js","../src/jscad/jscad-function.js","../src/jscad/includeJscadSync.js","../src/modeling/primitives2d.js","../src/modeling/ops-extrusions.js","../src/modeling/primitives3d.js","../src/modeling/ops-booleans.js","../src/modeling/ops-transformations.js","../src/modeling/color.js","../src/modeling/maths.js","../src/modeling/text.js","../src/modeling/debug.js","../src/jscad/log.js","../src/modeling/index.js","../src/jscad/rebuildSolid.js","../src/module.js"],"sourcesContent":["const json = require('../../package.json')\nexport const version = json.version // TODO/ add version date ?\n","/*\n\n## IMPORTANT NOTE --- IMPORTANT \nThe master for this file is located at:\nhttps://github.com/joostn/openjscad/tree/gh-pages\nThat is the gh-pages branch of the joostn/openjscad project\nIf contributing from openjscad.org, please do NOT edit this local file but make pull requests against\nabove joostn/gh-pages branch.\n## IMPORTANT NOTE --- IMPORTANT NOTE\n\n\n## License\n\nCopyright (c) 2014 bebbi (elghatta@gmail.com)\nCopyright (c) 2013 Eduard Bespalov (edwbes@gmail.com)\nCopyright (c) 2012 Joost Nieuwenhuijse (joost@newhouse.nl)\nCopyright (c) 2011 Evan Wallace (http://evanw.github.com/csg.js/)\nCopyright (c) 2012 Alexandre Girard (https://github.com/alx)\n\nAll code released under MIT license\n\n## Overview\n\nFor an overview of the CSG process see the original csg.js code:\nhttp://evanw.github.com/csg.js/\n\nCSG operations through BSP trees suffer from one problem: heavy fragmentation\nof polygons. If two CSG solids of n polygons are unified, the resulting solid may have\nin the order of n*n polygons, because each polygon is split by the planes of all other\npolygons. After a few operations the number of polygons explodes.\n\nThis version of CSG.js solves the problem in 3 ways:\n\n1. Every polygon split is recorded in a tree (CSG.PolygonTreeNode). This is a separate\ntree, not to be confused with the CSG tree. If a polygon is split into two parts but in\nthe end both fragments have not been discarded by the CSG operation, we can retrieve\nthe original unsplit polygon from the tree, instead of the two fragments.\n\nThis does not completely solve the issue though: if a polygon is split multiple times\nthe number of fragments depends on the order of subsequent splits, and we might still\nend up with unncessary splits:\nSuppose a polygon is first split into A and B, and then into A1, B1, A2, B2. Suppose B2 is\ndiscarded. We will end up with 2 polygons: A and B1. Depending on the actual split boundaries\nwe could still have joined A and B1 into one polygon. Therefore a second approach is used as well:\n\n2. After CSG operations all coplanar polygon fragments are joined by a retesselating\noperation. See CSG.reTesselated(). Retesselation is done through a\nlinear sweep over the polygon surface. The sweep line passes over the y coordinates\nof all vertices in the polygon. Polygons are split at each sweep line, and the fragments\nare joined horizontally and vertically into larger polygons (making sure that we\nwill end up with convex polygons).\nThis still doesn't solve the problem completely: due to floating point imprecisions\nwe may end up with small gaps between polygons, and polygons may not be exactly coplanar\nanymore, and as a result the retesselation algorithm may fail to join those polygons.\nTherefore:\n\n3. A canonicalization algorithm is implemented: it looks for vertices that have\napproximately the same coordinates (with a certain tolerance, say 1e-5) and replaces\nthem with the same vertex. If polygons share a vertex they will actually point to the\nsame CSG.Vertex instance. The same is done for polygon planes. See CSG.canonicalized().\n\n\nPerformance improvements to the original CSG.js:\n\nReplaced the flip() and invert() methods by flipped() and inverted() which don't\nmodify the source object. This allows to get rid of all clone() calls, so that\nmultiple polygons can refer to the same CSG.Plane instance etc.\n\nThe original union() used an extra invert(), clipTo(), invert() sequence just to remove the\ncoplanar front faces from b; this is now combined in a single b.clipTo(a, true) call.\n\nDetection whether a polygon is in front or in back of a plane: for each polygon\nwe are caching the coordinates of the bounding sphere. If the bounding sphere is\nin front or in back of the plane we don't have to check the individual vertices\nanymore.\n\n\nOther additions to the original CSG.js:\n\nCSG.Vector class has been renamed into CSG.Vector3D\n\nClasses for 3D lines, 2D vectors, 2D lines, and methods to find the intersection of\na line and a plane etc.\n\nTransformations: CSG.transform(), CSG.translate(), CSG.rotate(), CSG.scale()\n\nExpanding or contracting a solid: CSG.expand() and CSG.contract(). Creates nice\nsmooth corners.\n\nThe vertex normal has been removed since it complicates retesselation. It's not needed\nfor solid CAD anyway.\n\n*/\n\n var _CSGDEBUG = false;\n\n function fnNumberSort(a, b) {\n return a - b;\n }\n\n // # class CSG\n // Holds a binary space partition tree representing a 3D solid. Two solids can\n // be combined using the `union()`, `subtract()`, and `intersect()` methods.\n var CSG = function() {\n this.polygons = [];\n this.properties = new CSG.Properties();\n this.isCanonicalized = true;\n this.isRetesselated = true;\n };\n\n CSG.defaultResolution2D = 32;\n CSG.defaultResolution3D = 12;\n\n // Construct a CSG solid from a list of `CSG.Polygon` instances.\n CSG.fromPolygons = function(polygons) {\n var csg = new CSG();\n csg.polygons = polygons;\n csg.isCanonicalized = false;\n csg.isRetesselated = false;\n return csg;\n };\n\n // Construct a CSG solid from generated slices.\n // Look at CSG.Polygon.prototype.solidFromSlices for details\n CSG.fromSlices = function(options) {\n return (new CSG.Polygon.createFromPoints([\n [0, 0, 0],\n [1, 0, 0],\n [1, 1, 0],\n [0, 1, 0]\n ])).solidFromSlices(options);\n };\n\n // create from an untyped object with identical property names:\n CSG.fromObject = function(obj) {\n var polygons = obj.polygons.map(function(p) {\n return CSG.Polygon.fromObject(p);\n });\n var csg = CSG.fromPolygons(polygons);\n csg.isCanonicalized = obj.isCanonicalized;\n csg.isRetesselated = obj.isRetesselated;\n return csg;\n };\n\n // Reconstruct a CSG from the output of toCompactBinary()\n CSG.fromCompactBinary = function(bin) {\n if (bin['class'] != \"CSG\") throw new Error(\"Not a CSG\");\n var planes = [],\n planeData = bin.planeData,\n numplanes = planeData.length / 4,\n arrayindex = 0,\n x, y, z, w, normal, plane;\n for (var planeindex = 0; planeindex < numplanes; planeindex++) {\n x = planeData[arrayindex++];\n y = planeData[arrayindex++];\n z = planeData[arrayindex++];\n w = planeData[arrayindex++];\n normal = CSG.Vector3D.Create(x, y, z);\n plane = new CSG.Plane(normal, w);\n planes.push(plane);\n }\n\n var vertices = [],\n vertexData = bin.vertexData,\n numvertices = vertexData.length / 3,\n pos, vertex;\n arrayindex = 0;\n for (var vertexindex = 0; vertexindex < numvertices; vertexindex++) {\n x = vertexData[arrayindex++];\n y = vertexData[arrayindex++];\n z = vertexData[arrayindex++];\n pos = CSG.Vector3D.Create(x, y, z);\n vertex = new CSG.Vertex(pos);\n vertices.push(vertex);\n }\n\n var shareds = bin.shared.map(function(shared) {\n return CSG.Polygon.Shared.fromObject(shared);\n });\n\n var polygons = [],\n numpolygons = bin.numPolygons,\n numVerticesPerPolygon = bin.numVerticesPerPolygon,\n polygonVertices = bin.polygonVertices,\n polygonPlaneIndexes = bin.polygonPlaneIndexes,\n polygonSharedIndexes = bin.polygonSharedIndexes,\n numpolygonvertices, polygonvertices, shared, polygon; //already defined plane,\n arrayindex = 0;\n for (var polygonindex = 0; polygonindex < numpolygons; polygonindex++) {\n numpolygonvertices = numVerticesPerPolygon[polygonindex];\n polygonvertices = [];\n for (var i = 0; i < numpolygonvertices; i++) {\n polygonvertices.push(vertices[polygonVertices[arrayindex++]]);\n }\n plane = planes[polygonPlaneIndexes[polygonindex]];\n shared = shareds[polygonSharedIndexes[polygonindex]];\n polygon = new CSG.Polygon(polygonvertices, shared, plane);\n polygons.push(polygon);\n }\n var csg = CSG.fromPolygons(polygons);\n csg.isCanonicalized = true;\n csg.isRetesselated = true;\n return csg;\n };\n\n CSG.prototype = {\n toPolygons: function() {\n return this.polygons;\n },\n\n // Return a new CSG solid representing space in either this solid or in the\n // solid `csg`. Neither this solid nor the solid `csg` are modified.\n //\n // A.union(B)\n //\n // +-------+ +-------+\n // | | | |\n // | A | | |\n // | +--+----+ = | +----+\n // +----+--+ | +----+ |\n // | B | | |\n // | | | |\n // +-------+ +-------+\n //\n union: function(csg) {\n var csgs;\n if (csg instanceof Array) {\n csgs = csg.slice(0);\n csgs.push(this);\n } else {\n csgs = [this, csg];\n }\n\n // combine csg pairs in a way that forms a balanced binary tree pattern\n for (var i = 1; i < csgs.length; i += 2) {\n csgs.push(csgs[i-1].unionSub(csgs[i]));\n }\n\n return csgs[i - 1].reTesselated().canonicalized();\n },\n\n unionSub: function(csg, retesselate, canonicalize) {\n if (!this.mayOverlap(csg)) {\n return this.unionForNonIntersecting(csg);\n } else {\n var a = new CSG.Tree(this.polygons);\n var b = new CSG.Tree(csg.polygons);\n a.clipTo(b, false);\n\n // b.clipTo(a, true); // ERROR: this doesn't work\n b.clipTo(a);\n b.invert();\n b.clipTo(a);\n b.invert();\n\n var newpolygons = a.allPolygons().concat(b.allPolygons());\n var result = CSG.fromPolygons(newpolygons);\n result.properties = this.properties._merge(csg.properties);\n if (retesselate) result = result.reTesselated();\n if (canonicalize) result = result.canonicalized();\n return result;\n }\n },\n\n // Like union, but when we know that the two solids are not intersecting\n // Do not use if you are not completely sure that the solids do not intersect!\n unionForNonIntersecting: function(csg) {\n var newpolygons = this.polygons.concat(csg.polygons);\n var result = CSG.fromPolygons(newpolygons);\n result.properties = this.properties._merge(csg.properties);\n result.isCanonicalized = this.isCanonicalized && csg.isCanonicalized;\n result.isRetesselated = this.isRetesselated && csg.isRetesselated;\n return result;\n },\n\n // Return a new CSG solid representing space in this solid but not in the\n // solid `csg`. Neither this solid nor the solid `csg` are modified.\n //\n // A.subtract(B)\n //\n // +-------+ +-------+\n // | | | |\n // | A | | |\n // | +--+----+ = | +--+\n // +----+--+ | +----+\n // | B |\n // | |\n // +-------+\n //\n subtract: function(csg) {\n var csgs;\n if (csg instanceof Array) {\n csgs = csg;\n } else {\n csgs = [csg];\n }\n var result = this;\n for (var i = 0; i < csgs.length; i++) {\n var islast = (i == (csgs.length - 1));\n result = result.subtractSub(csgs[i], islast, islast);\n }\n return result;\n },\n\n subtractSub: function(csg, retesselate, canonicalize) {\n var a = new CSG.Tree(this.polygons);\n var b = new CSG.Tree(csg.polygons);\n a.invert();\n a.clipTo(b);\n b.clipTo(a, true);\n a.addPolygons(b.allPolygons());\n a.invert();\n var result = CSG.fromPolygons(a.allPolygons());\n result.properties = this.properties._merge(csg.properties);\n if (retesselate) result = result.reTesselated();\n if (canonicalize) result = result.canonicalized();\n return result;\n },\n\n // Return a new CSG solid representing space both this solid and in the\n // solid `csg`. Neither this solid nor the solid `csg` are modified.\n //\n // A.intersect(B)\n //\n // +-------+\n // | |\n // | A |\n // | +--+----+ = +--+\n // +----+--+ | +--+\n // | B |\n // | |\n // +-------+\n //\n intersect: function(csg) {\n var csgs;\n if (csg instanceof Array) {\n csgs = csg;\n } else {\n csgs = [csg];\n }\n var result = this;\n for (var i = 0; i < csgs.length; i++) {\n var islast = (i == (csgs.length - 1));\n result = result.intersectSub(csgs[i], islast, islast);\n }\n return result;\n },\n\n intersectSub: function(csg, retesselate, canonicalize) {\n var a = new CSG.Tree(this.polygons);\n var b = new CSG.Tree(csg.polygons);\n a.invert();\n b.clipTo(a);\n b.invert();\n a.clipTo(b);\n b.clipTo(a);\n a.addPolygons(b.allPolygons());\n a.invert();\n var result = CSG.fromPolygons(a.allPolygons());\n result.properties = this.properties._merge(csg.properties);\n if (retesselate) result = result.reTesselated();\n if (canonicalize) result = result.canonicalized();\n return result;\n },\n\n // Return a new CSG solid with solid and empty space switched. This solid is\n // not modified.\n invert: function() {\n var flippedpolygons = this.polygons.map(function(p) {\n return p.flipped();\n });\n return CSG.fromPolygons(flippedpolygons);\n // TODO: flip properties?\n },\n\n // Affine transformation of CSG object. Returns a new CSG object\n transform1: function(matrix4x4) {\n var newpolygons = this.polygons.map(function(p) {\n return p.transform(matrix4x4);\n });\n var result = CSG.fromPolygons(newpolygons);\n result.properties = this.properties._transform(matrix4x4);\n result.isRetesselated = this.isRetesselated;\n return result;\n },\n\n transform: function(matrix4x4) {\n var ismirror = matrix4x4.isMirroring();\n var transformedvertices = {};\n var transformedplanes = {};\n var newpolygons = this.polygons.map(function(p) {\n var newplane;\n var plane = p.plane;\n var planetag = plane.getTag();\n if (planetag in transformedplanes) {\n newplane = transformedplanes[planetag];\n } else {\n newplane = plane.transform(matrix4x4);\n transformedplanes[planetag] = newplane;\n }\n var newvertices = p.vertices.map(function(v) {\n var newvertex;\n var vertextag = v.getTag();\n if (vertextag in transformedvertices) {\n newvertex = transformedvertices[vertextag];\n } else {\n newvertex = v.transform(matrix4x4);\n transformedvertices[vertextag] = newvertex;\n }\n return newvertex;\n });\n if (ismirror) newvertices.reverse();\n return new CSG.Polygon(newvertices, p.shared, newplane);\n });\n var result = CSG.fromPolygons(newpolygons);\n result.properties = this.properties._transform(matrix4x4);\n result.isRetesselated = this.isRetesselated;\n result.isCanonicalized = this.isCanonicalized;\n return result;\n },\n\n toString: function() {\n var result = \"CSG solid:\\n\";\n this.polygons.map(function(p) {\n result += p.toString();\n });\n return result;\n },\n\n // Expand the solid\n // resolution: number of points per 360 degree for the rounded corners\n expand: function(radius, resolution) {\n var result = this.expandedShell(radius, resolution, true);\n result = result.reTesselated();\n result.properties = this.properties; // keep original properties\n return result;\n },\n\n // Contract the solid\n // resolution: number of points per 360 degree for the rounded corners\n contract: function(radius, resolution) {\n var expandedshell = this.expandedShell(radius, resolution, false);\n var result = this.subtract(expandedshell);\n result = result.reTesselated();\n result.properties = this.properties; // keep original properties\n return result;\n },\n\n // cut the solid at a plane, and stretch the cross-section found along plane normal\n stretchAtPlane: function(normal, point, length) {\n var plane = CSG.Plane.fromNormalAndPoint(normal, point);\n var onb = new CSG.OrthoNormalBasis(plane);\n var crosssect = this.sectionCut(onb);\n var midpiece = crosssect.extrudeInOrthonormalBasis(onb, length);\n var piece1 = this.cutByPlane(plane);\n var piece2 = this.cutByPlane(plane.flipped());\n var result = piece1.union([midpiece, piece2.translate(plane.normal.times(length))]);\n return result;\n },\n\n\n // Create the expanded shell of the solid:\n // All faces are extruded to get a thickness of 2*radius\n // Cylinders are constructed around every side\n // Spheres are placed on every vertex\n // unionWithThis: if true, the resulting solid will be united with 'this' solid;\n // the result is a true expansion of the solid\n // If false, returns only the shell\n expandedShell: function(radius, resolution, unionWithThis) {\n var csg = this.reTesselated();\n var result;\n if (unionWithThis) {\n result = csg;\n } else {\n result = new CSG();\n }\n\n // first extrude all polygons:\n csg.polygons.map(function(polygon) {\n var extrudevector = polygon.plane.normal.unit().times(2 * radius);\n var translatedpolygon = polygon.translate(extrudevector.times(-0.5));\n var extrudedface = translatedpolygon.extrude(extrudevector);\n result = result.unionSub(extrudedface, false, false);\n });\n\n // Make a list of all unique vertex pairs (i.e. all sides of the solid)\n // For each vertex pair we collect the following:\n // v1: first coordinate\n // v2: second coordinate\n // planenormals: array of normal vectors of all planes touching this side\n var vertexpairs = {}; // map of 'vertex pair tag' to {v1, v2, planenormals}\n csg.polygons.map(function(polygon) {\n var numvertices = polygon.vertices.length;\n var prevvertex = polygon.vertices[numvertices - 1];\n var prevvertextag = prevvertex.getTag();\n for (var i = 0; i < numvertices; i++) {\n var vertex = polygon.vertices[i];\n var vertextag = vertex.getTag();\n var vertextagpair;\n if (vertextag < prevvertextag) {\n vertextagpair = vertextag + \"-\" + prevvertextag;\n } else {\n vertextagpair = prevvertextag + \"-\" + vertextag;\n }\n var obj;\n if (vertextagpair in vertexpairs) {\n obj = vertexpairs[vertextagpair];\n } else {\n obj = {\n v1: prevvertex,\n v2: vertex,\n planenormals: []\n };\n vertexpairs[vertextagpair] = obj;\n }\n obj.planenormals.push(polygon.plane.normal);\n\n prevvertextag = vertextag;\n prevvertex = vertex;\n }\n });\n\n // now construct a cylinder on every side\n // The cylinder is always an approximation of a true cylinder: it will have polygons\n // around the sides. We will make sure though that the cylinder will have an edge at every\n // face that touches this side. This ensures that we will get a smooth fill even\n // if two edges are at, say, 10 degrees and the resolution is low.\n // Note: the result is not retesselated yet but it really should be!\n for (var vertextagpair in vertexpairs) {\n var vertexpair = vertexpairs[vertextagpair],\n startpoint = vertexpair.v1.pos,\n endpoint = vertexpair.v2.pos,\n // our x,y and z vectors:\n zbase = endpoint.minus(startpoint).unit(),\n xbase = vertexpair.planenormals[0].unit(),\n ybase = xbase.cross(zbase),\n\n // make a list of angles that the cylinder should traverse:\n angles = [];\n\n // first of all equally spaced around the cylinder:\n for (var i = 0; i < resolution; i++) {\n angles.push(i * Math.PI * 2 / resolution);\n }\n\n // and also at every normal of all touching planes:\n for (var i = 0, iMax = vertexpair.planenormals.length; i < iMax; i++) {\n var planenormal = vertexpair.planenormals[i],\n si = ybase.dot(planenormal),\n co = xbase.dot(planenormal),\n angle = Math.atan2(si, co);\n\n if (angle < 0) angle += Math.PI * 2;\n angles.push(angle);\n angle = Math.atan2(-si, -co);\n if (angle < 0) angle += Math.PI * 2;\n angles.push(angle);\n }\n\n // this will result in some duplicate angles but we will get rid of those later.\n // Sort:\n angles = angles.sort(fnNumberSort);\n\n // Now construct the cylinder by traversing all angles:\n var numangles = angles.length,\n prevp1, prevp2,\n startfacevertices = [],\n endfacevertices = [],\n polygons = [];\n for (var i = -1; i < numangles; i++) {\n var angle = angles[(i < 0) ? (i + numangles) : i],\n si = Math.sin(angle),\n co = Math.cos(angle),\n p = xbase.times(co * radius).plus(ybase.times(si * radius)),\n p1 = startpoint.plus(p),\n p2 = endpoint.plus(p),\n skip = false;\n if (i >= 0) {\n if (p1.distanceTo(prevp1) < 1e-5) {\n skip = true;\n }\n }\n if (!skip) {\n if (i >= 0) {\n startfacevertices.push(new CSG.Vertex(p1));\n endfacevertices.push(new CSG.Vertex(p2));\n var polygonvertices = [\n new CSG.Vertex(prevp2),\n new CSG.Vertex(p2),\n new CSG.Vertex(p1),\n new CSG.Vertex(prevp1)\n ];\n var polygon = new CSG.Polygon(polygonvertices);\n polygons.push(polygon);\n }\n prevp1 = p1;\n prevp2 = p2;\n }\n }\n endfacevertices.reverse();\n polygons.push(new CSG.Polygon(startfacevertices));\n polygons.push(new CSG.Polygon(endfacevertices));\n var cylinder = CSG.fromPolygons(polygons);\n result = result.unionSub(cylinder, false, false);\n }\n\n // make a list of all unique vertices\n // For each vertex we also collect the list of normals of the planes touching the vertices\n var vertexmap = {};\n csg.polygons.map(function(polygon) {\n polygon.vertices.map(function(vertex) {\n var vertextag = vertex.getTag();\n var obj;\n if (vertextag in vertexmap) {\n obj = vertexmap[vertextag];\n } else {\n obj = {\n pos: vertex.pos,\n normals: []\n };\n vertexmap[vertextag] = obj;\n }\n obj.normals.push(polygon.plane.normal);\n });\n });\n\n // and build spheres at each vertex\n // We will try to set the x and z axis to the normals of 2 planes\n // This will ensure that our sphere tesselation somewhat matches 2 planes\n for (var vertextag in vertexmap) {\n var vertexobj = vertexmap[vertextag];\n // use the first normal to be the x axis of our sphere:\n var xaxis = vertexobj.normals[0].unit();\n // and find a suitable z axis. We will use the normal which is most perpendicular to the x axis:\n var bestzaxis = null;\n var bestzaxisorthogonality = 0;\n for (var i = 1; i < vertexobj.normals.length; i++) {\n var normal = vertexobj.normals[i].unit();\n var cross = xaxis.cross(normal);\n var crosslength = cross.length();\n if (crosslength > 0.05) {\n if (crosslength > bestzaxisorthogonality) {\n bestzaxisorthogonality = crosslength;\n bestzaxis = normal;\n }\n }\n }\n if (!bestzaxis) {\n bestzaxis = xaxis.randomNonParallelVector();\n }\n var yaxis = xaxis.cross(bestzaxis).unit();\n var zaxis = yaxis.cross(xaxis);\n var sphere = CSG.sphere({\n center: vertexobj.pos,\n radius: radius,\n resolution: resolution,\n axes: [xaxis, yaxis, zaxis]\n });\n result = result.unionSub(sphere, false, false);\n }\n\n return result;\n },\n\n canonicalized: function() {\n if (this.isCanonicalized) {\n return this;\n } else {\n var factory = new CSG.fuzzyCSGFactory();\n var result = factory.getCSG(this);\n result.isCanonicalized = true;\n result.isRetesselated = this.isRetesselated;\n result.properties = this.properties; // keep original properties\n return result;\n }\n },\n\n reTesselated: function() {\n if (this.isRetesselated) {\n return this;\n } else {\n var csg = this;\n var polygonsPerPlane = {};\n var isCanonicalized = csg.isCanonicalized;\n var fuzzyfactory = new CSG.fuzzyCSGFactory();\n csg.polygons.map(function(polygon) {\n var plane = polygon.plane;\n var shared = polygon.shared;\n if (!isCanonicalized) {\n // in order to identify to polygons having the same plane, we need to canonicalize the planes\n // We don't have to do a full canonizalization (including vertices), to save time only do the planes and the shared data:\n plane = fuzzyfactory.getPlane(plane);\n shared = fuzzyfactory.getPolygonShared(shared);\n }\n var tag = plane.getTag() + \"/\" + shared.getTag();\n if (!(tag in polygonsPerPlane)) {\n polygonsPerPlane[tag] = [polygon];\n } else {\n polygonsPerPlane[tag].push(polygon);\n }\n });\n var destpolygons = [];\n for (var planetag in polygonsPerPlane) {\n var sourcepolygons = polygonsPerPlane[planetag];\n if (sourcepolygons.length < 2) {\n destpolygons = destpolygons.concat(sourcepolygons);\n } else {\n var retesselayedpolygons = [];\n CSG.reTesselateCoplanarPolygons(sourcepolygons, retesselayedpolygons);\n destpolygons = destpolygons.concat(retesselayedpolygons);\n }\n }\n var result = CSG.fromPolygons(destpolygons);\n result.isRetesselated = true;\n // result = result.canonicalized();\n result.properties = this.properties; // keep original properties\n return result;\n }\n },\n\n // returns an array of two CSG.Vector3Ds (minimum coordinates and maximum coordinates)\n getBounds: function() {\n if (!this.cachedBoundingBox) {\n var minpoint = new CSG.Vector3D(0, 0, 0);\n var maxpoint = new CSG.Vector3D(0, 0, 0);\n var polygons = this.polygons;\n var numpolygons = polygons.length;\n for (var i = 0; i < numpolygons; i++) {\n var polygon = polygons[i];\n var bounds = polygon.boundingBox();\n if (i === 0) {\n minpoint = bounds[0];\n maxpoint = bounds[1];\n } else {\n minpoint = minpoint.min(bounds[0]);\n maxpoint = maxpoint.max(bounds[1]);\n }\n }\n this.cachedBoundingBox = [minpoint, maxpoint];\n }\n return this.cachedBoundingBox;\n },\n\n // returns true if there is a possibility that the two solids overlap\n // returns false if we can be sure that they do not overlap\n mayOverlap: function(csg) {\n if ((this.polygons.length === 0) || (csg.polygons.length === 0)) {\n return false;\n } else {\n var mybounds = this.getBounds();\n var otherbounds = csg.getBounds();\n if (mybounds[1].x < otherbounds[0].x) return false;\n if (mybounds[0].x > otherbounds[1].x) return false;\n if (mybounds[1].y < otherbounds[0].y) return false;\n if (mybounds[0].y > otherbounds[1].y) return false;\n if (mybounds[1].z < otherbounds[0].z) return false;\n if (mybounds[0].z > otherbounds[1].z) return false;\n return true;\n }\n },\n\n // Cut the solid by a plane. Returns the solid on the back side of the plane\n cutByPlane: function(plane) {\n if (this.polygons.length === 0) {\n return new CSG();\n }\n // Ideally we would like to do an intersection with a polygon of inifinite size\n // but this is not supported by our implementation. As a workaround, we will create\n // a cube, with one face on the plane, and a size larger enough so that the entire\n // solid fits in the cube.\n // find the max distance of any vertex to the center of the plane:\n var planecenter = plane.normal.times(plane.w);\n var maxdistance = 0;\n this.polygons.map(function(polygon) {\n polygon.vertices.map(function(vertex) {\n var distance = vertex.pos.distanceToSquared(planecenter);\n if (distance > maxdistance) maxdistance = distance;\n });\n });\n maxdistance = Math.sqrt(maxdistance);\n maxdistance *= 1.01; // make sure it's really larger\n // Now build a polygon on the plane, at any point farther than maxdistance from the plane center:\n var vertices = [];\n var orthobasis = new CSG.OrthoNormalBasis(plane);\n vertices.push(new CSG.Vertex(orthobasis.to3D(new CSG.Vector2D(maxdistance, -maxdistance))));\n vertices.push(new CSG.Vertex(orthobasis.to3D(new CSG.Vector2D(-maxdistance, -maxdistance))));\n vertices.push(new CSG.Vertex(orthobasis.to3D(new CSG.Vector2D(-maxdistance, maxdistance))));\n vertices.push(new CSG.Vertex(orthobasis.to3D(new CSG.Vector2D(maxdistance, maxdistance))));\n var polygon = new CSG.Polygon(vertices, null, plane.flipped());\n\n // and extrude the polygon into a cube, backwards of the plane:\n var cube = polygon.extrude(plane.normal.times(-maxdistance));\n\n // Now we can do the intersection:\n var result = this.intersect(cube);\n result.properties = this.properties; // keep original properties\n return result;\n },\n\n // Connect a solid to another solid, such that two CSG.Connectors become connected\n // myConnector: a CSG.Connector of this solid\n // otherConnector: a CSG.Connector to which myConnector should be connected\n // mirror: false: the 'axis' vectors of the connectors should point in the same direction\n // true: the 'axis' vectors of the connectors should point in opposite direction\n // normalrotation: degrees of rotation between the 'normal' vectors of the two\n // connectors\n connectTo: function(myConnector, otherConnector, mirror, normalrotation) {\n var matrix = myConnector.getTransformationTo(otherConnector, mirror, normalrotation);\n return this.transform(matrix);\n },\n\n // set the .shared property of all polygons\n // Returns a new CSG solid, the original is unmodified!\n setShared: function(shared) {\n var polygons = this.polygons.map(function(p) {\n return new CSG.Polygon(p.vertices, shared, p.plane);\n });\n var result = CSG.fromPolygons(polygons);\n result.properties = this.properties; // keep original properties\n result.isRetesselated = this.isRetesselated;\n result.isCanonicalized = this.isCanonicalized;\n return result;\n },\n\n setColor: function(args) {\n var newshared = CSG.Polygon.Shared.fromColor.apply(this, arguments);\n return this.setShared(newshared);\n },\n\n toCompactBinary: function() {\n var csg = this.canonicalized(),\n numpolygons = csg.polygons.length,\n numpolygonvertices = 0,\n numvertices = 0,\n vertexmap = {},\n vertices = [],\n numplanes = 0,\n planemap = {},\n polygonindex = 0,\n planes = [],\n shareds = [],\n sharedmap = {},\n numshared = 0;\n // for (var i = 0, iMax = csg.polygons.length; i < iMax; i++) {\n // var p = csg.polygons[i];\n // for (var j = 0, jMax = p.length; j < jMax; j++) {\n // ++numpolygonvertices;\n // var vertextag = p[j].getTag();\n // if(!(vertextag in vertexmap)) {\n // vertexmap[vertextag] = numvertices++;\n // vertices.push(p[j]);\n // }\n // }\n csg.polygons.map(function(p) {\n p.vertices.map(function(v) {\n ++numpolygonvertices;\n var vertextag = v.getTag();\n if (!(vertextag in vertexmap)) {\n vertexmap[vertextag] = numvertices++;\n vertices.push(v);\n }\n });\n\n var planetag = p.plane.getTag();\n if (!(planetag in planemap)) {\n planemap[planetag] = numplanes++;\n planes.push(p.plane);\n }\n var sharedtag = p.shared.getTag();\n if (!(sharedtag in sharedmap)) {\n sharedmap[sharedtag] = numshared++;\n shareds.push(p.shared);\n }\n });\n var numVerticesPerPolygon = new Uint32Array(numpolygons),\n polygonSharedIndexes = new Uint32Array(numpolygons),\n polygonVertices = new Uint32Array(numpolygonvertices),\n polygonPlaneIndexes = new Uint32Array(numpolygons),\n vertexData = new Float64Array(numvertices * 3),\n planeData = new Float64Array(numplanes * 4),\n polygonVerticesIndex = 0;\n for (var polygonindex = 0; polygonindex < numpolygons; ++polygonindex) {\n var p = csg.polygons[polygonindex];\n numVerticesPerPolygon[polygonindex] = p.vertices.length;\n p.vertices.map(function(v) {\n var vertextag = v.getTag();\n var vertexindex = vertexmap[vertextag];\n polygonVertices[polygonVerticesIndex++] = vertexindex;\n });\n var planetag = p.plane.getTag();\n var planeindex = planemap[planetag];\n polygonPlaneIndexes[polygonindex] = planeindex;\n var sharedtag = p.shared.getTag();\n var sharedindex = sharedmap[sharedtag];\n polygonSharedIndexes[polygonindex] = sharedindex;\n }\n var verticesArrayIndex = 0;\n vertices.map(function(v) {\n var pos = v.pos;\n vertexData[verticesArrayIndex++] = pos._x;\n vertexData[verticesArrayIndex++] = pos._y;\n vertexData[verticesArrayIndex++] = pos._z;\n });\n var planesArrayIndex = 0;\n planes.map(function(p) {\n var normal = p.normal;\n planeData[planesArrayIndex++] = normal._x;\n planeData[planesArrayIndex++] = normal._y;\n planeData[planesArrayIndex++] = normal._z;\n planeData[planesArrayIndex++] = p.w;\n });\n var result = {\n \"class\": \"CSG\",\n numPolygons: numpolygons,\n numVerticesPerPolygon: numVerticesPerPolygon,\n polygonPlaneIndexes: polygonPlaneIndexes,\n polygonSharedIndexes: polygonSharedIndexes,\n polygonVertices: polygonVertices,\n vertexData: vertexData,\n planeData: planeData,\n shared: shareds\n };\n return result;\n },\n\n // For debugging\n // Creates a new solid with a tiny cube at every vertex of the source solid\n toPointCloud: function(cuberadius) {\n var csg = this.reTesselated();\n\n var result = new CSG();\n\n // make a list of all unique vertices\n // For each vertex we also collect the list of normals of the planes touching the vertices\n var vertexmap = {};\n csg.polygons.map(function(polygon) {\n polygon.vertices.map(function(vertex) {\n vertexmap[vertex.getTag()] = vertex.pos;\n });\n });\n\n for (var vertextag in vertexmap) {\n var pos = vertexmap[vertextag];\n var cube = CSG.cube({\n center: pos,\n radius: cuberadius\n });\n result = result.unionSub(cube, false, false);\n }\n result = result.reTesselated();\n return result;\n },\n\n // Get the transformation that transforms this CSG such that it is lying on the z=0 plane,\n // as flat as possible (i.e. the least z-height).\n // So that it is in an orientation suitable for CNC milling\n getTransformationAndInverseTransformationToFlatLying: function() {\n if (this.polygons.length === 0) {\n var m = new CSG.Matrix4x4(); // unity\n return [m,m];\n } else {\n // get a list of unique planes in the CSG:\n var csg = this.canonicalized();\n var planemap = {};\n csg.polygons.map(function(polygon) {\n planemap[polygon.plane.getTag()] = polygon.plane;\n });\n // try each plane in the CSG and find the plane that, when we align it flat onto z=0,\n // gives the least height in z-direction.\n // If two planes give the same height, pick the plane that originally had a normal closest\n // to [0,0,-1].\n var xvector = new CSG.Vector3D(1, 0, 0);\n var yvector = new CSG.Vector3D(0, 1, 0);\n var zvector = new CSG.Vector3D(0, 0, 1);\n var z0connectorx = new CSG.Connector([0, 0, 0], [0, 0, -1], xvector);\n var z0connectory = new CSG.Connector([0, 0, 0], [0, 0, -1], yvector);\n var isfirst = true;\n var minheight = 0;\n var maxdotz = 0;\n var besttransformation, bestinversetransformation;\n for (var planetag in planemap) {\n var plane = planemap[planetag];\n var pointonplane = plane.normal.times(plane.w);\n var transformation, inversetransformation;\n // We need a normal vecrtor for the transformation\n // determine which is more perpendicular to the plane normal: x or y?\n // we will align this as much as possible to the x or y axis vector\n var xorthogonality = plane.normal.cross(xvector).length();\n var yorthogonality = plane.normal.cross(yvector).length();\n if (xorthogonality > yorthogonality) {\n // x is better:\n var planeconnector = new CSG.Connector(pointonplane, plane.normal, xvector);\n transformation = planeconnector.getTransformationTo(z0connectorx, false, 0);\n inversetransformation = z0connectorx.getTransformationTo(planeconnector, false, 0);\n } else {\n // y is better:\n var planeconnector = new CSG.Connector(pointonplane, plane.normal, yvector);\n transformation = planeconnector.getTransformationTo(z0connectory, false, 0);\n inversetransformation = z0connectory.getTransformationTo(planeconnector, false, 0);\n }\n var transformedcsg = csg.transform(transformation);\n var dotz = -plane.normal.dot(zvector);\n var bounds = transformedcsg.getBounds();\n var zheight = bounds[1].z - bounds[0].z;\n var isbetter = isfirst;\n if (!isbetter) {\n if (zheight < minheight) {\n isbetter = true;\n } else if (zheight == minheight) {\n if (dotz > maxdotz) isbetter = true;\n }\n }\n if (isbetter) {\n // translate the transformation around the z-axis and onto the z plane:\n var translation = new CSG.Vector3D([-0.5 * (bounds[1].x + bounds[0].x), -0.5 * (bounds[1].y + bounds[0].y), -bounds[0].z]);\n transformation = transformation.multiply(CSG.Matrix4x4.translation(translation));\n inversetransformation = CSG.Matrix4x4.translation(translation.negated()).multiply(inversetransformation);\n minheight = zheight;\n maxdotz = dotz;\n besttransformation = transformation;\n bestinversetransformation = inversetransformation;\n }\n isfirst = false;\n }\n return [besttransformation, bestinversetransformation];\n }\n },\n\n getTransformationToFlatLying: function() {\n var result = this.getTransformationAndInverseTransformationToFlatLying();\n return result[0];\n },\n\n lieFlat: function() {\n var transformation = this.getTransformationToFlatLying();\n return this.transform(transformation);\n },\n\n // project the 3D CSG onto a plane\n // This returns a 2D CAG with the 'shadow' shape of the 3D solid when projected onto the\n // plane represented by the orthonormal basis\n projectToOrthoNormalBasis: function(orthobasis) {\n var EPS = 1e-5;\n var cags = [];\n this.polygons.filter(function(p) {\n // only return polys in plane, others may disturb result\n return p.plane.normal.minus(orthobasis.plane.normal).lengthSquared() < EPS*EPS;\n })\n .map(function(polygon) {\n var cag = polygon.projectToOrthoNormalBasis(orthobasis);\n if (cag.sides.length > 0) {\n cags.push(cag);\n }\n });\n var result = new CAG().union(cags);\n return result;\n },\n\n sectionCut: function(orthobasis) {\n var EPS = 1e-5;\n var plane1 = orthobasis.plane;\n var plane2 = orthobasis.plane.flipped();\n plane1 = new CSG.Plane(plane1.normal, plane1.w);\n plane2 = new CSG.Plane(plane2.normal, plane2.w + 5*EPS);\n var cut3d = this.cutByPlane(plane1);\n cut3d = cut3d.cutByPlane(plane2);\n return cut3d.projectToOrthoNormalBasis(orthobasis);\n },\n\n /*\n fixTJunctions:\n\n Suppose we have two polygons ACDB and EDGF:\n\n A-----B\n | |\n | E--F\n | | |\n C-----D--G\n\n Note that vertex E forms a T-junction on the side BD. In this case some STL slicers will complain\n that the solid is not watertight. This is because the watertightness check is done by checking if\n each side DE is matched by another side ED.\n\n This function will return a new solid with ACDB replaced by ACDEB\n\n Note that this can create polygons that are slightly non-convex (due to rounding errors). Therefore the result should\n not be used for further CSG operations!\n */\n fixTJunctions: function() {\n var csg = this.canonicalized();\n var sidemap = {};\n for (var polygonindex = 0; polygonindex < csg.polygons.length; polygonindex++) {\n var polygon = csg.polygons[polygonindex];\n var numvertices = polygon.vertices.length;\n if (numvertices >= 3) // should be true\n {\n var vertex = polygon.vertices[0];\n var vertextag = vertex.getTag();\n for (var vertexindex = 0; vertexindex < numvertices; vertexindex++) {\n var nextvertexindex = vertexindex + 1;\n if (nextvertexindex == numvertices) nextvertexindex = 0;\n var nextvertex = polygon.vertices[nextvertexindex];\n var nextvertextag = nextvertex.getTag();\n var sidetag = vertextag + \"/\" + nextvertextag;\n var reversesidetag = nextvertextag + \"/\" + vertextag;\n if (reversesidetag in sidemap) {\n // this side matches the same side in another polygon. Remove from sidemap:\n var ar = sidemap[reversesidetag];\n ar.splice(-1, 1);\n if (ar.length === 0) {\n delete sidemap[reversesidetag];\n }\n } else {\n var sideobj = {\n vertex0: vertex,\n vertex1: nextvertex,\n polygonindex: polygonindex\n };\n if (!(sidetag in sidemap)) {\n sidemap[sidetag] = [sideobj];\n } else {\n sidemap[sidetag].push(sideobj);\n }\n }\n vertex = nextvertex;\n vertextag = nextvertextag;\n }\n }\n }\n // now sidemap contains 'unmatched' sides\n // i.e. side AB in one polygon does not have a matching side BA in another polygon\n var vertextag2sidestart = {};\n var vertextag2sideend = {};\n var sidestocheck = {};\n var sidemapisempty = true;\n for (var sidetag in sidemap) {\n sidemapisempty = false;\n sidestocheck[sidetag] = true;\n sidemap[sidetag].map(function(sideobj) {\n var starttag = sideobj.vertex0.getTag();\n var endtag = sideobj.vertex1.getTag();\n if (starttag in vertextag2sidestart) {\n vertextag2sidestart[starttag].push(sidetag);\n } else {\n vertextag2sidestart[starttag] = [sidetag];\n }\n if (endtag in vertextag2sideend) {\n vertextag2sideend[endtag].push(sidetag);\n } else {\n vertextag2sideend[endtag] = [sidetag];\n }\n });\n }\n\n if (!sidemapisempty) {\n // make a copy of the polygons array, since we are going to modify it:\n var polygons = csg.polygons.slice(0);\n\n function addSide(vertex0, vertex1, polygonindex) {\n var starttag = vertex0.getTag();\n var endtag = vertex1.getTag();\n if (starttag == endtag) throw new Error(\"Assertion failed\");\n var newsidetag = starttag + \"/\" + endtag;\n var reversesidetag = endtag + \"/\" + starttag;\n if (reversesidetag in sidemap) {\n // we have a matching reverse oriented side.\n // Instead of adding the new side, cancel out the reverse side:\n // console.log(\"addSide(\"+newsidetag+\") has reverse side:\");\n deleteSide(vertex1, vertex0, null);\n return null;\n }\n // console.log(\"addSide(\"+newsidetag+\")\");\n var newsideobj = {\n vertex0: vertex0,\n vertex1: vertex1,\n polygonindex: polygonindex\n };\n if (!(newsidetag in sidemap)) {\n sidemap[newsidetag] = [newsideobj];\n } else {\n sidemap[newsidetag].push(newsideobj);\n }\n if (starttag in vertextag2sidestart) {\n vertextag2sidestart[starttag].push(newsidetag);\n } else {\n vertextag2sidestart[starttag] = [newsidetag];\n }\n if (endtag in vertextag2sideend) {\n vertextag2sideend[endtag].push(newsidetag);\n } else {\n vertextag2sideend[endtag] = [newsidetag];\n }\n return newsidetag;\n }\n\n function deleteSide(vertex0, vertex1, polygonindex) {\n var starttag = vertex0.getTag();\n var endtag = vertex1.getTag();\n var sidetag = starttag + \"/\" + endtag;\n // console.log(\"deleteSide(\"+sidetag+\")\");\n if (!(sidetag in sidemap)) throw new Error(\"Assertion failed\");\n var idx = -1;\n var sideobjs = sidemap[sidetag];\n for (var i = 0; i < sideobjs.length; i++) {\n var sideobj = sideobjs[i];\n if (sideobj.vertex0 != vertex0) continue;\n if (sideobj.vertex1 != vertex1) continue;\n if (polygonindex !== null) {\n if (sideobj.polygonindex != polygonindex) continue;\n }\n idx = i;\n break;\n }\n if (idx < 0) throw new Error(\"Assertion failed\");\n sideobjs.splice(idx, 1);\n if (sideobjs.length === 0) {\n delete sidemap[sidetag];\n }\n idx = vertextag2sidestart[starttag].indexOf(sidetag);\n if (idx < 0) throw new Error(\"Assertion failed\");\n vertextag2sidestart[starttag].splice(idx, 1);\n if (vertextag2sidestart[starttag].length === 0) {\n delete vertextag2sidestart[starttag];\n }\n\n idx = vertextag2sideend[endtag].indexOf(sidetag);\n if (idx < 0) throw new Error(\"Assertion failed\");\n vertextag2sideend[endtag].splice(idx, 1);\n if (vertextag2sideend[endtag].length === 0) {\n delete vertextag2sideend[endtag];\n }\n }\n\n\n while (true) {\n var sidemapisempty = true;\n for (var sidetag in sidemap) {\n sidemapisempty = false;\n sidestocheck[sidetag] = true;\n }\n if (sidemapisempty) break;\n var donesomething = false;\n while (true) {\n var sidetagtocheck = null;\n for (var sidetag in sidestocheck) {\n sidetagtocheck = sidetag;\n break;\n }\n if (sidetagtocheck === null) break; // sidestocheck is empty, we're done!\n var donewithside = true;\n if (sidetagtocheck in sidemap) {\n var sideobjs = sidemap[sidetagtocheck];\n if (sideobjs.length === 0) throw new Error(\"Assertion failed\");\n var sideobj = sideobjs[0];\n for (var directionindex = 0; directionindex < 2; directionindex++) {\n var startvertex = (directionindex === 0) ? sideobj.vertex0 : sideobj.vertex1;\n var endvertex = (directionindex === 0) ? sideobj.vertex1 : sideobj.vertex0;\n var startvertextag = startvertex.getTag();\n var endvertextag = endvertex.getTag();\n var matchingsides = [];\n if (directionindex === 0) {\n if (startvertextag in vertextag2sideend) {\n matchingsides = vertextag2sideend[startvertextag];\n }\n } else {\n if (startvertextag in vertextag2sidestart) {\n matchingsides = vertextag2sidestart[startvertextag];\n }\n }\n for (var matchingsideindex = 0; matchingsideindex < matchingsides.length; matchingsideindex++) {\n var matchingsidetag = matchingsides[matchingsideindex];\n var matchingside = sidemap[matchingsidetag][0];\n var matchingsidestartvertex = (directionindex === 0) ? matchingside.vertex0 : matchingside.vertex1;\n var matchingsideendvertex = (directionindex === 0) ? matchingside.vertex1 : matchingside.vertex0;\n var matchingsidestartvertextag = matchingsidestartvertex.getTag();\n var matchingsideendvertextag = matchingsideendvertex.getTag();\n if (matchingsideendvertextag != startvertextag) throw new Error(\"Assertion failed\");\n if (matchingsidestartvertextag == endvertextag) {\n // matchingside cancels sidetagtocheck\n deleteSide(startvertex, endvertex, null);\n deleteSide(endvertex, startvertex, null);\n donewithside = false;\n directionindex = 2; // skip reverse direction check\n donesomething = true;\n break;\n } else {\n var startpos = startvertex.pos;\n var endpos = endvertex.pos;\n var checkpos = matchingsidestartvertex.pos;\n var direction = checkpos.minus(startpos);\n // Now we need to check if endpos is on the line startpos-checkpos:\n var t = endpos.minus(startpos).dot(direction) / direction.dot(direction);\n if ((t > 0) && (t < 1)) {\n var closestpoint = startpos.plus(direction.times(t));\n var distancesquared = closestpoint.distanceToSquared(endpos);\n if (distancesquared < 1e-10) {\n // Yes it's a t-junction! We need to split matchingside in two:\n var polygonindex = matchingside.polygonindex;\n var polygon = polygons[polygonindex];\n // find the index of startvertextag in polygon:\n var insertionvertextag = matchingside.vertex1.getTag();\n var insertionvertextagindex = -1;\n for (var i = 0; i < polygon.vertices.length; i++) {\n if (polygon.vertices[i].getTag() == insertionvertextag) {\n insertionvertextagindex = i;\n break;\n }\n }\n if (insertionvertextagindex < 0) throw new Error(\"Assertion failed\");\n // split the side by inserting the vertex:\n var newvertices = polygon.vertices.slice(0);\n newvertices.splice(insertionvertextagindex, 0, endvertex);\n var newpolygon = new CSG.Polygon(newvertices, polygon.shared /*polygon.plane*/ );\n\n// FIX\n //calculate plane with differents point\n if(isNaN(newpolygon.plane.w)){\n\n var found = false,\n loop = function(callback){\n newpolygon.vertices.forEach(function(item){\n if(found) return;\n callback(item);\n })\n };\n\n loop(function(a){\n loop(function(b) {\n loop(function (c) {\n newpolygon.plane = CSG.Plane.fromPoints(a.pos, b.pos, c.pos)\n if(!isNaN(newpolygon.plane.w)) {\n found = true;\n }\n })\n })\n })\n }\n// FIX\n\n polygons[polygonindex] = newpolygon;\n\n // remove the original sides from our maps:\n // deleteSide(sideobj.vertex0, sideobj.vertex1, null);\n deleteSide(matchingside.vertex0, matchingside.vertex1, polygonindex);\n var newsidetag1 = addSide(matchingside.vertex0, endvertex, polygonindex);\n var newsidetag2 = addSide(endvertex, matchingside.vertex1, polygonindex);\n if (newsidetag1 !== null) sidestocheck[newsidetag1] = true;\n if (newsidetag2 !== null) sidestocheck[newsidetag2] = true;\n donewithside = false;\n directionindex = 2; // skip reverse direction check\n donesomething = true;\n break;\n } // if(distancesquared < 1e-10)\n } // if( (t > 0) && (t < 1) )\n } // if(endingstidestartvertextag == endvertextag)\n } // for matchingsideindex\n } // for directionindex\n } // if(sidetagtocheck in sidemap)\n if (donewithside) {\n delete sidestocheck[sidetag];\n }\n }\n if (!donesomething) break;\n }\n var newcsg = CSG.fromPolygons(polygons);\n newcsg.properties = csg.properties;\n newcsg.isCanonicalized = true;\n newcsg.isRetesselated = true;\n csg = newcsg;\n } // if(!sidemapisempty)\n var sidemapisempty = true;\n for (var sidetag in sidemap) {\n sidemapisempty = false;\n break;\n }\n if (!sidemapisempty) {\n // throw new Error(\"!sidemapisempty\");\n OpenJsCad.log(\"!sidemapisempty\");\n }\n return csg;\n },\n\n toTriangles: function() {\n var polygons = [];\n this.polygons.forEach(function(poly) {\n var firstVertex = poly.vertices[0];\n for (var i = poly.vertices.length - 3; i >= 0; i--) {\n polygons.push(new CSG.Polygon([\n firstVertex, poly.vertices[i + 1], poly.vertices[i + 2]\n ],\n poly.shared, poly.plane));\n }\n });\n return polygons;\n },\n\n // features: string, or array containing 1 or more strings of: 'volume', 'area'\n // more could be added here (Fourier coeff, moments)\n getFeatures: function(features) {\n if (!(features instanceof Array)) {\n features = [features];\n }\n var result = this.toTriangles().map(function(triPoly) {\n return triPoly.getTetraFeatures(features);\n })\n .reduce(function(pv, v) {\n return v.map(function(feat, i) {\n return feat + (pv === 0 ? 0 : pv[i]);\n });\n }, 0);\n return (result.length == 1) ? result[0] : result;\n }\n };\n\n // Parse an option from the options object\n // If the option is not present, return the default value\n CSG.parseOption = function(options, optionname, defaultvalue) {\n var result = defaultvalue;\n if (options) {\n if (optionname in options) {\n result = options[optionname];\n }\n }\n return result;\n };\n\n // Parse an option and force into a CSG.Vector3D. If a scalar is passed it is converted\n // into a vector with equal x,y,z\n CSG.parseOptionAs3DVector = function(options, optionname, defaultvalue) {\n var result = CSG.parseOption(options, optionname, defaultvalue);\n result = new CSG.Vector3D(result);\n return result;\n };\n\n CSG.parseOptionAs3DVectorList = function(options, optionname, defaultvalue) {\n var result = CSG.parseOption(options, optionname, defaultvalue);\n return result.map(function(res) {\n return new CSG.Vector3D(res);\n });\n };\n\n // Parse an option and force into a CSG.Vector2D. If a scalar is passed it is converted\n // into a vector with equal x,y\n CSG.parseOptionAs2DVector = function(options, optionname, defaultvalue) {\n var result = CSG.parseOption(options, optionname, defaultvalue);\n result = new CSG.Vector2D(result);\n return result;\n };\n\n CSG.parseOptionAsFloat = function(options, optionname, defaultvalue) {\n var result = CSG.parseOption(options, optionname, defaultvalue);\n if (typeof(result) == \"string\") {\n result = Number(result);\n }\n if (isNaN(result) || typeof(result) != \"number\") {\n throw new Error(\"Parameter \" + optionname + \" should be a number\");\n }\n return result;\n };\n\n CSG.parseOptionAsInt = function(options, optionname, defaultvalue) {\n var result = CSG.parseOption(options, optionname, defaultvalue);\n result = Number(Math.floor(result));\n if (isNaN(result)) {\n throw new Error(\"Parameter \" + optionname + \" should be a number\");\n }\n return result;\n };\n\n CSG.parseOptionAsBool = function(options, optionname, defaultvalue) {\n var result = CSG.parseOption(options, optionname, defaultvalue);\n if (typeof(result) == \"string\") {\n if (result == \"true\") result = true;\n else if (result == \"false\") result = false;\n else if (result == 0) result = false;\n }\n result = !!result;\n return result;\n };\n\n // Construct an axis-aligned solid cuboid.\n // Parameters:\n // center: center of cube (default [0,0,0])\n // radius: radius of cube (default [1,1,1]), can be specified as scalar or as 3D vector\n //\n // Example code:\n //\n // var cube = CSG.cube({\n // center: [0, 0, 0],\n // radius: 1\n // });\n CSG.cube = function(options) {\n var c, r;\n options = options || {};\n if (('corner1' in options) || ('corner2' in options)) {\n if (('center' in options) || ('radius' in options)) {\n throw new Error(\"cube: should either give a radius and center parameter, or a corner1 and corner2 parameter\")\n }\n corner1 = CSG.parseOptionAs3DVector(options, \"corner1\", [0, 0, 0]);\n corner2 = CSG.parseOptionAs3DVector(options, \"corner2\", [1, 1, 1]);\n c = corner1.plus(corner2).times(0.5);\n r = corner2.minus(corner1).times(0.5);\n } else {\n c = CSG.parseOptionAs3DVector(options, \"center\", [0, 0, 0]);\n r = CSG.parseOptionAs3DVector(options, \"radius\", [1, 1, 1]);\n }\n r = r.abs(); // negative radii make no sense\n var result = CSG.fromPolygons([\n [\n [0, 4, 6, 2],\n [-1, 0, 0]\n ],\n [\n [1, 3, 7, 5],\n [+1, 0, 0]\n ],\n [\n [0, 1, 5, 4],\n [0, -1, 0]\n ],\n [\n [2, 6, 7, 3],\n [0, +1, 0]\n ],\n [\n [0, 2, 3, 1],\n [0, 0, -1]\n ],\n [\n [4, 5, 7, 6],\n [0, 0, +1]\n ]\n ].map(function(info) {\n //var normal = new CSG.Vector3D(info[1]);\n //var plane = new CSG.Plane(normal, 1);\n var vertices = info[0].map(function(i) {\n var pos = new CSG.Vector3D(\n c.x + r.x * (2 * !!(i & 1) - 1), c.y + r.y * (2 * !!(i & 2) - 1), c.z + r.z * (2 * !!(i & 4) - 1));\n return new CSG.Vertex(pos);\n });\n return new CSG.Polygon(vertices, null /* , plane */ );\n }));\n result.properties.cube = new CSG.Properties();\n result.properties.cube.center = new CSG.Vector3D(c);\n // add 6 connectors, at the centers of each face:\n result.properties.cube.facecenters = [\n new CSG.Connector(new CSG.Vector3D([r.x, 0, 0]).plus(c), [1, 0, 0], [0, 0, 1]),\n new CSG.Connector(new CSG.Vector3D([-r.x, 0, 0]).plus(c), [-1, 0, 0], [0, 0, 1]),\n new CSG.Connector(new CSG.Vector3D([0, r.y, 0]).plus(c), [0, 1, 0], [0, 0, 1]),\n new CSG.Connector(new CSG.Vector3D([0, -r.y, 0]).plus(c), [0, -1, 0], [0, 0, 1]),\n new CSG.Connector(new CSG.Vector3D([0, 0, r.z]).plus(c), [0, 0, 1], [1, 0, 0]),\n new CSG.Connector(new CSG.Vector3D([0, 0, -r.z]).plus(c), [0, 0, -1], [1, 0, 0])\n ];\n return result;\n };\n\n // Construct a solid sphere\n //\n // Parameters:\n // center: center of sphere (default [0,0,0])\n // radius: radius of sphere (default 1), must be a scalar\n // resolution: determines the number of polygons per 360 degree revolution (default 12)\n // axes: (optional) an array with 3 vectors for the x, y and z base vectors\n //\n // Example usage:\n //\n // var sphere = CSG.sphere({\n // center: [0, 0, 0],\n // radius: 2,\n // resolution: 32,\n // });\n CSG.sphere = function(options) {\n options = options || {};\n var center = CSG.parseOptionAs3DVector(options, \"center\", [0, 0, 0]);\n var radius = CSG.parseOptionAsFloat(options, \"radius\", 1);\n var resolution = CSG.parseOptionAsInt(options, \"resolution\", CSG.defaultResolution3D);\n var xvector, yvector, zvector;\n if ('axes' in options) {\n xvector = options.axes[0].unit().times(radius);\n yvector = options.axes[1].unit().times(radius);\n zvector = options.axes[2].unit().times(radius);\n } else {\n xvector = new CSG.Vector3D([1, 0, 0]).times(radius);\n yvector = new CSG.Vector3D([0, -1, 0]).times(radius);\n zvector = new CSG.Vector3D([0, 0, 1]).times(radius);\n }\n if (resolution < 4) resolution = 4;\n var qresolution = Math.round(resolution / 4);\n var prevcylinderpoint;\n var polygons = [];\n for (var slice1 = 0; slice1 <= resolution; slice1++) {\n var angle = Math.PI * 2.0 * slice1 / resolution;\n var cylinderpoint = xvector.times(Math.cos(angle)).plus(yvector.times(Math.sin(angle)));\n if (slice1 > 0) {\n // cylinder vertices:\n var vertices = [];\n var prevcospitch, prevsinpitch;\n for (var slice2 = 0; slice2 <= qresolution; slice2++) {\n var pitch = 0.5 * Math.PI * slice2 / qresolution;\n var cospitch = Math.cos(pitch);\n var sinpitch = Math.sin(pitch);\n if (slice2 > 0) {\n vertices = [];\n vertices.push(new CSG.Vertex(center.plus(prevcylinderpoint.times(prevcospitch).minus(zvector.times(prevsinpitch)))));\n vertices.push(new CSG.Vertex(center.plus(cylinderpoint.times(prevcospitch).minus(zvector.times(prevsinpitch)))));\n if (slice2 < qresolution) {\n vertices.push(new CSG.Vertex(center.plus(cylinderpoint.times(cospitch).minus(zvector.times(sinpitch)))));\n }\n vertices.push(new CSG.Vertex(center.plus(prevcylinderpoint.times(cospitch).minus(zvector.times(sinpitch)))));\n polygons.push(new CSG.Polygon(vertices));\n vertices = [];\n vertices.push(new CSG.Vertex(center.plus(prevcylinderpoint.times(prevcospitch).plus(zvector.times(prevsinpitch)))));\n vertices.push(new CSG.Vertex(center.plus(cylinderpoint.times(prevcospitch).plus(zvector.times(prevsinpitch)))));\n if (slice2 < qresolution) {\n vertices.push(new CSG.Vertex(center.plus(cylinderpoint.times(cospitch).plus(zvector.times(sinpitch)))));\n }\n vertices.push(new CSG.Vertex(center.plus(prevcylinderpoint.times(cospitch).plus(zvector.times(sinpitch)))));\n vertices.reverse();\n polygons.push(new CSG.Polygon(vertices));\n }\n prevcospitch = cospitch;\n prevsinpitch = sinpitch;\n }\n }\n prevcylinderpoint = cylinderpoint;\n }\n var result = CSG.fromPolygons(polygons);\n result.properties.sphere = new CSG.Properties();\n result.properties.sphere.center = new CSG.Vector3D(center);\n result.properties.sphere.facepoint = center.plus(xvector);\n return result;\n };\n\n // Construct a solid cylinder.\n //\n // Parameters:\n // start: start point of cylinder (default [0, -1, 0])\n // end: end point of cylinder (default [0, 1, 0])\n // radius: radius of cylinder (default 1), must be a scalar\n // resolution: determines the number of polygons per 360 degree revolution (default 12)\n //\n // Example usage:\n //\n // var cylinder = CSG.cylinder({\n // start: [0, -1, 0],\n // end: [0, 1, 0],\n // radius: 1,\n // resolution: 16\n // });\n CSG.cylinder = function(options) {\n var s = CSG.parseOptionAs3DVector(options, \"start\", [0, -1, 0]);\n var e = CSG.parseOptionAs3DVector(options, \"end\", [0, 1, 0]);\n var r = CSG.parseOptionAsFloat(options, \"radius\", 1);\n var rEnd = CSG.parseOptionAsFloat(options, \"radiusEnd\", r);\n var rStart = CSG.parseOptionAsFloat(options, \"radiusStart\", r);\n var alpha = CSG.parseOptionAsFloat(options, \"sectorAngle\", 360);\n alpha = alpha > 360 ? alpha % 360 : alpha;\n\n if ((rEnd < 0) || (rStart < 0)) {\n throw new Error(\"Radius should be non-negative\");\n }\n if ((rEnd === 0) && (rStart === 0)) {\n throw new Error(\"Either radiusStart or radiusEnd should be positive\");\n }\n\n var slices = CSG.parseOptionAsInt(options, \"resolution\", CSG.defaultResolution2D);\n var ray = e.minus(s);\n var axisZ = ray.unit(); //, isY = (Math.abs(axisZ.y) > 0.5);\n var axisX = axisZ.randomNonParallelVector().unit();\n\n // var axisX = new CSG.Vector3D(isY, !isY, 0).cross(axisZ).unit();\n var axisY = axisX.cross(axisZ).unit();\n var start = new CSG.Vertex(s);\n var end = new CSG.Vertex(e);\n var polygons = [];\n\n function point(stack, slice, radius) {\n var angle = slice * Math.PI * alpha / 180;\n var out = axisX.times(Math.cos(angle)).plus(axisY.times(Math.sin(angle)));\n var pos = s.plus(ray.times(stack)).plus(out.times(radius));\n return new CSG.Vertex(pos);\n }\n if (alpha > 0) {\n for (var i = 0; i < slices; i++) {\n var t0 = i / slices,\n t1 = (i + 1) / slices;\n if (rEnd == rStart) {\n polygons.push(new CSG.Polygon([start, point(0, t0, rEnd), point(0, t1, rEnd)]));\n polygons.push(new CSG.Polygon([point(0, t1, rEnd), point(0, t0, rEnd), point(1, t0, rEnd), point(1, t1, rEnd)]));\n polygons.push(new CSG.Polygon([end, point(1, t1, rEnd), point(1, t0, rEnd)]));\n } else {\n if (rStart > 0) {\n polygons.push(new CSG.Polygon([start, point(0, t0, rStart), point(0, t1, rStart)]));\n polygons.push(new CSG.Polygon([point(0, t0, rStart), point(1, t0, rEnd), point(0, t1, rStart)]));\n }\n if (rEnd > 0) {\n polygons.push(new CSG.Polygon([end, point(1, t1, rEnd), point(1, t0, rEnd)]));\n polygons.push(new CSG.Polygon([point(1, t0, rEnd), point(1, t1, rEnd), point(0, t1, rStart)]));\n }\n }\n }\n if (alpha < 360) {\n polygons.push(new CSG.Polygon([start, end, point(0, 0, rStart)]));\n polygons.push(new CSG.Polygon([point(0, 0, rStart), end, point(1, 0, rEnd)]));\n polygons.push(new CSG.Polygon([start, point(0, 1, rStart), end]));\n polygons.push(new CSG.Polygon([point(0, 1, rStart), point(1, 1, rEnd), end]));\n }\n }\n var result = CSG.fromPolygons(polygons);\n result.properties.cylinder = new CSG.Properties();\n result.properties.cylinder.start = new CSG.Connector(s, axisZ.negated(), axisX);\n result.properties.cylinder.end = new CSG.Connector(e, axisZ, axisX);\n var cylCenter = s.plus(ray.times(0.5));\n var fptVec = axisX.rotate(s, axisZ, -alpha / 2).times((rStart + rEnd) / 2);\n var fptVec90 = fptVec.cross(axisZ);\n // note this one is NOT a face normal for a cone. - It's horizontal from cyl perspective\n result.properties.cylinder.facepointH = new CSG.Connector(cylCenter.plus(fptVec), fptVec, axisZ);\n result.properties.cylinder.facepointH90 = new CSG.Connector(cylCenter.plus(fptVec90), fptVec90, axisZ);\n return result;\n };\n\n // Like a cylinder, but with rounded ends instead of flat\n //\n // Parameters:\n // start: start point of cylinder (default [0, -1, 0])\n // end: end point of cylinder (default [0, 1, 0])\n // radius: radius of cylinder (default 1), must be a scalar\n // resolution: determines the number of polygons per 360 degree revolution (default 12)\n // normal: a vector determining the starting angle for tesselation. Should be non-parallel to start.minus(end)\n //\n // Example usage:\n //\n // var cylinder = CSG.roundedCylinder({\n // start: [0, -1, 0],\n // end: [0, 1, 0],\n // radius: 1,\n // resolution: 16\n // });\n CSG.roundedCylinder = function(options) {\n var p1 = CSG.parseOptionAs3DVector(options, \"start\", [0, -1, 0]);\n var p2 = CSG.parseOptionAs3DVector(options, \"end\", [0, 1, 0]);\n var radius = CSG.parseOptionAsFloat(options, \"radius\", 1);\n var direction = p2.minus(p1);\n var defaultnormal;\n if (Math.abs(direction.x) > Math.abs(direction.y)) {\n defaultnormal = new CSG.Vector3D(0, 1, 0);\n } else {\n defaultnormal = new CSG.Vector3D(1, 0, 0);\n }\n var normal = CSG.parseOptionAs3DVector(options, \"normal\", defaultnormal);\n var resolution = CSG.parseOptionAsInt(options, \"resolution\", CSG.defaultResolution3D);\n if (resolution < 4) resolution = 4;\n var polygons = [];\n var qresolution = Math.floor(0.25 * resolution);\n var length = direction.length();\n if (length < 1e-10) {\n return CSG.sphere({\n center: p1,\n radius: radius,\n resolution: resolution\n });\n }\n var zvector = direction.unit().times(radius);\n var xvector = zvector.cross(normal).unit().times(radius);\n var yvector = xvector.cross(zvector).unit().times(radius);\n var prevcylinderpoint;\n for (var slice1 = 0; slice1 <= resolution; slice1++) {\n var angle = Math.PI * 2.0 * slice1 / resolution;\n var cylinderpoint = xvector.times(Math.cos(angle)).plus(yvector.times(Math.sin(angle)));\n if (slice1 > 0) {\n // cylinder vertices:\n var vertices = [];\n vertices.push(new CSG.Vertex(p1.plus(cylinderpoint)));\n vertices.push(new CSG.Vertex(p1.plus(prevcylinderpoint)));\n vertices.push(new CSG.Vertex(p2.plus(prevcylinderpoint)));\n vertices.push(new CSG.Vertex(p2.plus(cylinderpoint)));\n polygons.push(new CSG.Polygon(vertices));\n var prevcospitch, prevsinpitch;\n for (var slice2 = 0; slice2 <= qresolution; slice2++) {\n var pitch = 0.5 * Math.PI * slice2 / qresolution;\n //var pitch = Math.asin(slice2/qresolution);\n var cospitch = Math.cos(pitch);\n var sinpitch = Math.sin(pitch);\n if (slice2 > 0) {\n vertices = [];\n vertices.push(new CSG.Vertex(p1.plus(prevcylinderpoint.times(prevcospitch).minus(zvector.times(prevsinpitch)))));\n vertices.push(new CSG.Vertex(p1.plus(cylinderpoint.times(prevcospitch).minus(zvector.times(prevsinpitch)))));\n if (slice2 < qresolution) {\n vertices.push(new CSG.Vertex(p1.plus(cylinderpoint.times(cospitch).minus(zvector.times(sinpitch)))));\n }\n vertices.push(new CSG.Vertex(p1.plus(prevcylinderpoint.times(cospitch).minus(zvector.times(sinpitch)))));\n polygons.push(new CSG.Polygon(vertices));\n vertices = [];\n vertices.push(new CSG.Vertex(p2.plus(prevcylinderpoint.times(prevcospitch).plus(zvector.times(prevsinpitch)))));\n vertices.push(new CSG.Vertex(p2.plus(cylinderpoint.times(prevcospitch).plus(zvector.times(prevsinpitch)))));\n if (slice2 < qresolution) {\n vertices.push(new CSG.Vertex(p2.plus(cylinderpoint.times(cospitch).plus(zvector.times(sinpitch)))));\n }\n vertices.push(new CSG.Vertex(p2.plus(prevcylinderpoint.times(cospitch).plus(zvector.times(sinpitch)))));\n vertices.reverse();\n polygons.push(new CSG.Polygon(vertices));\n }\n prevcospitch = cospitch;\n prevsinpitch = sinpitch;\n }\n }\n prevcylinderpoint = cylinderpoint;\n }\n var result = CSG.fromPolygons(polygons);\n var ray = zvector.unit();\n var axisX = xvector.unit();\n result.properties.roundedCylinder = new CSG.Properties();\n result.properties.roundedCylinder.start = new CSG.Connector(p1, ray.negated(), axisX);\n result.properties.roundedCylinder.end = new CSG.Connector(p2, ray, axisX);\n result.properties.roundedCylinder.facepoint = p1.plus(xvector);\n return result;\n };\n\n // Construct an axis-aligned solid rounded cuboid.\n // Parameters:\n // center: center of cube (default [0,0,0])\n // radius: radius of cube (default [1,1,1]), can be specified as scalar or as 3D vector\n // roundradius: radius of rounded corners (default 0.2), must be a scalar\n // resolution: determines the number of polygons per 360 degree revolution (default 8)\n //\n // Example code:\n //\n // var cube = CSG.roundedCube({\n // center: [0, 0, 0],\n // radius: 1,\n // roundradius: 0.2,\n // resolution: 8,\n // });\n CSG.roundedCube = function(options) {\n var EPS = 1e-5;\n var minRR = 1e-2; //minroundradius 1e-3 gives rounding errors already\n var center, cuberadius;\n options = options || {};\n if (('corner1' in options) || ('corner2' in options)) {\n if (('center' in options) || ('radius' in options)) {\n throw new Error(\"roundedCube: should either give a radius and center parameter, or a corner1 and corner2 parameter\");\n }\n corner1 = CSG.parseOptionAs3DVector(options, \"corner1\", [0, 0, 0]);\n corner2 = CSG.parseOptionAs3DVector(options, \"corner2\", [1, 1, 1]);\n center = corner1.plus(corner2).times(0.5);\n cuberadius = corner2.minus(corner1).times(0.5);\n } else {\n center = CSG.parseOptionAs3DVector(options, \"center\", [0, 0, 0]);\n cuberadius = CSG.parseOptionAs3DVector(options, \"radius\", [1, 1, 1]);\n }\n cuberadius = cuberadius.abs(); // negative radii make no sense\n var resolution = CSG.parseOptionAsInt(options, \"resolution\", CSG.defaultResolution3D);\n if (resolution < 4) resolution = 4;\n if (resolution%2 == 1 && resolution < 8) resolution = 8; // avoid ugly\n var roundradius = CSG.parseOptionAs3DVector(options, \"roundradius\", [0.2, 0.2, 0.2]);\n // slight hack for now - total radius stays ok\n roundradius = CSG.Vector3D.Create(Math.max(roundradius.x, minRR), Math.max(roundradius.y, minRR), Math.max(roundradius.z, minRR));\n var innerradius = cuberadius.minus(roundradius);\n if (innerradius.x < 0 || innerradius.y < 0 || innerradius.z < 0) {\n throw('roundradius <= radius!');\n }\n var res = CSG.sphere({radius:1, resolution:resolution});\n res = res.scale(roundradius);\n innerradius.x > EPS && (res = res.stretchAtPlane([1, 0, 0], [0, 0, 0], 2*innerradius.x));\n innerradius.y > EPS && (res = res.stretchAtPlane([0, 1, 0], [0, 0, 0], 2*innerradius.y));\n innerradius.z > EPS && (res = res.stretchAtPlane([0, 0, 1], [0, 0, 0], 2*innerradius.z));\n res = res.translate([-innerradius.x+center.x, -innerradius.y+center.y, -innerradius.z+center.z]);\n res = res.reTesselated();\n res.properties.roundedCube = new CSG.Properties();\n res.properties.roundedCube.center = new CSG.Vertex(center);\n res.properties.roundedCube.facecenters = [\n new CSG.Connector(new CSG.Vector3D([cuberadius.x, 0, 0]).plus(center), [1, 0, 0], [0, 0, 1]),\n new CSG.Connector(new CSG.Vector3D([-cuberadius.x, 0, 0]).plus(center), [-1, 0, 0], [0, 0, 1]),\n new CSG.Connector(new CSG.Vector3D([0, cuberadius.y, 0]).plus(center), [0, 1, 0], [0, 0, 1]),\n new CSG.Connector(new CSG.Vector3D([0, -cuberadius.y, 0]).plus(center), [0, -1, 0], [0, 0, 1]),\n new CSG.Connector(new CSG.Vector3D([0, 0, cuberadius.z]).plus(center), [0, 0, 1], [1, 0, 0]),\n new CSG.Connector(new CSG.Vector3D([0, 0, -cuberadius.z]).plus(center), [0, 0, -1], [1, 0, 0])\n ];\n return res;\n };\n\n /**\n * polyhedron accepts openscad style arguments. I.e. define face vertices clockwise looking from outside\n */\n CSG.polyhedron = function(options) {\n options = options || {};\n if (('points' in options) !== ('faces' in options)) {\n throw new Error(\"polyhedron needs 'points' and 'faces' arrays\");\n }\n var vertices = CSG.parseOptionAs3DVectorList(options, \"points\", [\n [1, 1, 0],\n [1, -1, 0],\n [-1, -1, 0],\n [-1, 1, 0],\n [0, 0, 1]\n ])\n .map(function(pt) {\n return new CSG.Vertex(pt);\n });\n var faces = CSG.parseOption(options, \"faces\", [\n [0, 1, 4],\n [1, 2, 4],\n [2, 3, 4],\n [3, 0, 4],\n [1, 0, 3],\n [2, 1, 3]\n ]);\n // openscad convention defines inward normals - so we have to invert here\n faces.forEach(function(face) {\n face.reverse();\n });\n var polygons = faces.map(function(face) {\n return new CSG.Polygon(face.map(function(idx) {\n return vertices[idx];\n }));\n });\n\n // TODO: facecenters as connectors? probably overkill. Maybe centroid\n // the re-tesselation here happens because it's so easy for a user to\n // create parametrized polyhedrons that end up with 1-2 dimensional polygons.\n // These will create infinite loops at CSG.Tree()\n return CSG.fromPolygons(polygons).reTesselated();\n };\n\n CSG.IsFloat = function(n) {\n return (!isNaN(n)) || (n === Infinity) || (n === -Infinity);\n };\n\n // solve 2x2 linear equation:\n // [ab][x] = [u]\n // [cd][y] [v]\n CSG.solve2Linear = function(a, b, c, d, u, v) {\n var det = a * d - b * c;\n var invdet = 1.0 / det;\n var x = u * d - b * v;\n var y = -u * c + a * v;\n x *= invdet;\n y *= invdet;\n return [x, y];\n };\n\n // # class Vector3D\n // Represents a 3D vector.\n //\n // Example usage:\n //\n // new CSG.Vector3D(1, 2, 3);\n // new CSG.Vector3D([1, 2, 3]);\n // new CSG.Vector3D({ x: 1, y: 2, z: 3 });\n // new CSG.Vector3D(1, 2); // assumes z=0\n // new CSG.Vector3D([1, 2]); // assumes z=0\n CSG.Vector3D = function(x, y, z) {\n if (arguments.length == 3) {\n this._x = parseFloat(x);\n this._y = parseFloat(y);\n this._z = parseFloat(z);\n } else if (arguments.length == 2) {\n this._x = parseFloat(x);\n this._y = parseFloat(y);\n this._z = 0;\n } else {\n var ok = true;\n if (arguments.length == 1) {\n if (typeof(x) == \"object\") {\n if (x instanceof CSG.Vector3D) {\n this._x = x._x;\n this._y = x._y;\n this._z = x._z;\n } else if (x instanceof CSG.Vector2D) {\n this._x = x._x;\n this._y = x._y;\n this._z = 0;\n } else if (x instanceof Array) {\n if ((x.length < 2) || (x.length > 3)) {\n ok = false;\n } else {\n this._x = parseFloat(x[0]);\n this._y = parseFloat(x[1]);\n if (x.length == 3) {\n this._z = parseFloat(x[2]);\n } else {\n this._z = 0;\n }\n }\n } else if (('_x' in x) && ('_y' in x)) {\n this._x = parseFloat(x._x);\n this._y = parseFloat(x._y);\n if ('_z' in x) {\n this._z = parseFloat(x._z);\n } else {\n this._z = 0;\n }\n } else ok = false;\n } else {\n var v = parseFloat(x);\n this._x = v;\n this._y = v;\n this._z = v;\n }\n } else ok = false;\n if (ok) {\n if ((!CSG.IsFloat(this._x)) || (!CSG.IsFloat(this._y)) || (!CSG.IsFloat(this._z))) ok = false;\n }\n if (!ok) {\n throw new Error(\"wrong arguments\");\n }\n }\n };\n\n // This does the same as new CSG.Vector3D(x,y,z) but it doesn't go through the constructor\n // and the parameters are not validated. Is much faster.\n CSG.Vector3D.Create = function(x, y, z) {\n var result = Object.create(CSG.Vector3D.prototype);\n result._x = x;\n result._y = y;\n result._z = z;\n return result;\n };\n\n CSG.Vector3D.prototype = {\n get x() {\n return this._x;\n },\n get y() {\n return this._y;\n },\n get z() {\n return this._z;\n },\n\n set x(v) {\n throw new Error(\"Vector3D is immutable\");\n },\n set y(v) {\n throw new Error(\"Vector3D is immutable\");\n },\n set z(v) {\n throw new Error(\"Vector3D is immutable\");\n },\n\n clone: function() {\n return CSG.Vector3D.Create(this._x, this._y, this._z);\n },\n\n negated: function() {\n return CSG.Vector3D.Create(-this._x, -this._y, -this._z);\n },\n\n abs: function() {\n return CSG.Vector3D.Create(Math.abs(this._x), Math.abs(this._y), Math.abs(this._z));\n },\n\n plus: function(a) {\n return CSG.Vector3D.Create(this._x + a._x, this._y + a._y, this._z + a._z);\n },\n\n minus: function(a) {\n return CSG.Vector3D.Create(this._x - a._x, this._y - a._y, this._z - a._z);\n },\n\n times: function(a) {\n return CSG.Vector3D.Create(this._x * a, this._y * a, this._z * a);\n },\n\n dividedBy: function(a) {\n return CSG.Vector3D.Create(this._x / a, this._y / a, this._z / a);\n },\n\n dot: function(a) {\n return this._x * a._x + this._y * a._y + this._z * a._z;\n },\n\n lerp: function(a, t) {\n return this.plus(a.minus(this).times(t));\n },\n\n lengthSquared: function() {\n return this.dot(this);\n },\n\n length: function() {\n return Math.sqrt(this.lengthSquared());\n },\n\n unit: function() {\n return this.dividedBy(this.length());\n },\n\n cross: function(a) {\n return CSG.Vector3D.Create(\n this._y * a._z - this._z * a._y, this._z * a._x - this._x * a._z, this._x * a._y - this._y * a._x);\n },\n\n distanceTo: function(a) {\n return this.minus(a).length();\n },\n\n distanceToSquared: function(a) {\n return this.minus(a).lengthSquared();\n },\n\n equals: function(a) {\n return (this._x == a._x) && (this._y == a._y) && (this._z == a._z);\n },\n\n // Right multiply by a 4x4 matrix (the vector is interpreted as a row vector)\n // Returns a new CSG.Vector3D\n multiply4x4: function(matrix4x4) {\n return matrix4x4.leftMultiply1x3Vector(this);\n },\n\n transform: function(matrix4x4) {\n return matrix4x4.leftMultiply1x3Vector(this);\n },\n\n toString: function() {\n return \"(\" + this._x.toFixed(2) + \", \" + this._y.toFixed(2) + \", \" + this._z.toFixed(2) + \")\";\n },\n\n // find a vector that is somewhat perpendicular to this one\n randomNonParallelVector: function() {\n var abs = this.abs();\n if ((abs._x <= abs._y) && (abs._x <= abs._z)) {\n return CSG.Vector3D.Create(1, 0, 0);\n } else if ((abs._y <= abs._x) && (abs._y <= abs._z)) {\n return CSG.Vector3D.Create(0, 1, 0);\n } else {\n return CSG.Vector3D.Create(0, 0, 1);\n }\n },\n\n min: function(p) {\n return CSG.Vector3D.Create(\n Math.min(this._x, p._x), Math.min(this._y, p._y), Math.min(this._z, p._z));\n },\n\n max: function(p) {\n return CSG.Vector3D.Create(\n Math.max(this._x, p._x), Math.max(this._y, p._y), Math.max(this._z, p._z));\n }\n };\n\n // # class Vertex\n // Represents a vertex of a polygon. Use your own vertex class instead of this\n // one to provide additional features like texture coordinates and vertex\n // colors. Custom vertex classes need to provide a `pos` property\n // `flipped()`, and `interpolate()` methods that behave analogous to the ones\n // defined by `CSG.Vertex`.\n CSG.Vertex = function(pos) {\n this.pos = pos;\n };\n\n // create from an untyped object with identical property names:\n CSG.Vertex.fromObject = function(obj) {\n var pos = new CSG.Vector3D(obj.pos);\n return new CSG.Vertex(pos);\n };\n\n CSG.Vertex.prototype = {\n // Return a vertex with all orientation-specific data (e.g. vertex normal) flipped. Called when the\n // orientation of a polygon is flipped.\n flipped: function() {\n return this;\n },\n\n getTag: function() {\n var result = this.tag;\n if (!result) {\n result = CSG.getTag();\n this.tag = result;\n }\n return result;\n },\n\n // Create a new vertex between this vertex and `other` by linearly\n // interpolating all properties using a parameter of `t`. Subclasses should\n // override this to interpolate additional properties.\n interpolate: function(other, t) {\n var newpos = this.pos.lerp(other.pos, t);\n return new CSG.Vertex(newpos);\n },\n\n // Affine transformation of vertex. Returns a new CSG.Vertex\n transform: function(matrix4x4) {\n var newpos = this.pos.multiply4x4(matrix4x4);\n return new CSG.Vertex(newpos);\n },\n\n toString: function() {\n return this.pos.toString();\n }\n };\n\n // # class Plane\n // Represents a plane in 3D space.\n CSG.Plane = function(normal, w) {\n this.normal = normal;\n this.w = w;\n };\n\n // create from an untyped object with identical property names:\n CSG.Plane.fromObject = function(obj) {\n var normal = new CSG.Vector3D(obj.normal);\n var w = parseFloat(obj.w);\n return new CSG.Plane(normal, w);\n };\n\n // `CSG.Plane.EPSILON` is the tolerance used by `splitPolygon()` to decide if a\n // point is on the plane.\n CSG.Plane.EPSILON = 1e-5;\n\n CSG.Plane.fromVector3Ds = function(a, b, c) {\n var n = b.minus(a).cross(c.minus(a)).unit();\n return new CSG.Plane(n, n.dot(a));\n };\n\n // like fromVector3Ds, but allow the vectors to be on one point or one line\n // in such a case a random plane through the given points is constructed\n CSG.Plane.anyPlaneFromVector3Ds = function(a, b, c) {\n var v1 = b.minus(a);\n var v2 = c.minus(a);\n if (v1.length() < 1e-5) {\n v1 = v2.randomNonParallelVector();\n }\n if (v2.length() < 1e-5) {\n v2 = v1.randomNonParallelVector();\n }\n var normal = v1.cross(v2);\n if (normal.length() < 1e-5) {\n // this would mean that v1 == v2.negated()\n v2 = v1.randomNonParallelVector();\n normal = v1.cross(v2);\n }\n normal = normal.unit();\n return new CSG.Plane(normal, normal.dot(a));\n };\n\n CSG.Plane.fromPoints = function(a, b, c) {\n a = new CSG.Vector3D(a);\n b = new CSG.Vector3D(b);\n c = new CSG.Vector3D(c);\n return CSG.Plane.fromVector3Ds(a, b, c);\n };\n\n CSG.Plane.fromNormalAndPoint = function(normal, point) {\n normal = new CSG.Vector3D(normal);\n point = new CSG.Vector3D(point);\n normal = normal.unit();\n var w = point.dot(normal);\n return new CSG.Plane(normal, w);\n };\n\n CSG.Plane.prototype = {\n flipped: function() {\n return new CSG.Plane(this.normal.negated(), -this.w);\n },\n\n getTag: function() {\n var result = this.tag;\n if (!result) {\n result = CSG.getTag();\n this.tag = result;\n }\n return result;\n },\n\n equals: function(n) {\n return this.normal.equals(n.normal) && this.w == n.w;\n },\n\n transform: function(matrix4x4) {\n var ismirror = matrix4x4.isMirroring();\n // get two vectors in the plane:\n var r = this.normal.randomNonParallelVector();\n var u = this.normal.cross(r);\n var v = this.normal.cross(u);\n // get 3 points in the plane:\n var point1 = this.normal.times(this.w);\n var point2 = point1.plus(u);\n var point3 = point1.plus(v);\n // transform the points:\n point1 = point1.multiply4x4(matrix4x4);\n point2 = point2.multiply4x4(matrix4x4);\n point3 = point3.multiply4x4(matrix4x4);\n // and create a new plane from the transformed points:\n var newplane = CSG.Plane.fromVector3Ds(point1, point2, point3);\n if (ismirror) {\n // the transform is mirroring\n // We should mirror the plane:\n newplane = newplane.flipped();\n }\n return newplane;\n },\n\n // Returns object:\n // .type:\n // 0: coplanar-front\n // 1: coplanar-back\n // 2: front\n // 3: back\n // 4: spanning\n // In case the polygon is spanning, returns:\n // .front: a CSG.Polygon of the front part\n // .back: a CSG.Polygon of the back part\n splitPolygon: function(polygon) {\n var result = {\n type: null,\n front: null,\n back: null\n };\n // cache in local vars (speedup):\n var planenormal = this.normal;\n var vertices = polygon.vertices;\n var numvertices = vertices.length;\n if (polygon.plane.equals(this)) {\n result.type = 0;\n } else {\n var EPS = CSG.Plane.EPSILON;\n var thisw = this.w;\n var hasfront = false;\n var hasback = false;\n var vertexIsBack = [];\n var MINEPS = -EPS;\n for (var i = 0; i < numvertices; i++) {\n var t = planenormal.dot(vertices[i].pos) - thisw;\n var isback = (t < 0);\n vertexIsBack.push(isback);\n if (t > EPS) hasfront = true;\n if (t < MINEPS) hasback = true;\n }\n if ((!hasfront) && (!hasback)) {\n // all points coplanar\n var t = planenormal.dot(polygon.plane.normal);\n result.type = (t >= 0) ? 0 : 1;\n } else if (!hasback) {\n result.type = 2;\n } else if (!hasfront) {\n result.type = 3;\n } else {\n // spanning\n result.type = 4;\n var frontvertices = [],\n backvertices = [];\n var isback = vertexIsBack[0];\n for (var vertexindex = 0; vertexindex < numvertices; vertexindex++) {\n var vertex = vertices[vertexindex];\n var nextvertexindex = vertexindex + 1;\n if (nextvertexindex >= numvertices) nextvertexindex = 0;\n var nextisback = vertexIsBack[nextvertexindex];\n if (isback == nextisback) {\n // line segment is on one side of the plane:\n if (isback) {\n backvertices.push(vertex);\n } else {\n frontvertices.push(vertex);\n }\n } else {\n // line segment intersects plane:\n var point = vertex.pos;\n var nextpoint = vertices[nextvertexindex].pos;\n var intersectionpoint = this.splitLineBetweenPoints(point, nextpoint);\n var intersectionvertex = new CSG.Vertex(intersectionpoint);\n if (isback) {\n backvertices.push(vertex);\n backvertices.push(intersectionvertex);\n frontvertices.push(intersectionvertex);\n } else {\n frontvertices.push(vertex);\n frontvertices.push(intersectionvertex);\n backvertices.push(intersectionvertex);\n }\n }\n isback = nextisback;\n } // for vertexindex\n // remove duplicate vertices:\n var EPS_SQUARED = CSG.Plane.EPSILON * CSG.Plane.EPSILON;\n if (backvertices.length >= 3) {\n var prevvertex = backvertices[backvertices.length - 1];\n for (var vertexindex = 0; vertexindex < backvertices.length; vertexindex++) {\n var vertex = backvertices[vertexindex];\n if (vertex.pos.distanceToSquared(prevvertex.pos) < EPS_SQUARED) {\n backvertices.splice(vertexindex, 1);\n vertexindex--;\n }\n prevvertex = vertex;\n }\n }\n if (frontvertices.length >= 3) {\n var prevvertex = frontvertices[frontvertices.length - 1];\n for (var vertexindex = 0; vertexindex < frontvertices.length; vertexindex++) {\n var vertex = frontvertices[vertexindex];\n if (vertex.pos.distanceToSquared(prevvertex.pos) < EPS_SQUARED) {\n frontvertices.splice(vertexindex, 1);\n vertexindex--;\n }\n prevvertex = vertex;\n }\n }\n if (frontvertices.length >= 3) {\n result.front = new CSG.Polygon(frontvertices, polygon.shared, polygon.plane);\n }\n if (backvertices.length >= 3) {\n result.back = new CSG.Polygon(backvertices, polygon.shared, polygon.plane);\n }\n }\n }\n return result;\n },\n\n // robust splitting of a line by a plane\n // will work even if the line is parallel to the plane\n splitLineBetweenPoints: function(p1, p2) {\n var direction = p2.minus(p1);\n var labda = (this.w - this.normal.dot(p1)) / this.normal.dot(direction);\n if (isNaN(labda)) labda = 0;\n if (labda > 1) labda = 1;\n if (labda < 0) labda = 0;\n var result = p1.plus(direction.times(labda));\n return result;\n },\n\n // returns CSG.Vector3D\n intersectWithLine: function(line3d) {\n return line3d.intersectWithPlane(this);\n },\n\n // intersection of two planes\n intersectWithPlane: function(plane) {\n return CSG.Line3D.fromPlanes(this, plane);\n },\n\n signedDistanceToPoint: function(point) {\n var t = this.normal.dot(point) - this.w;\n return t;\n },\n\n toString: function() {\n return \"[normal: \" + this.normal.toString() + \", w: \" + this.w + \"]\";\n },\n\n mirrorPoint: function(point3d) {\n var distance = this.signedDistanceToPoint(point3d);\n var mirrored = point3d.minus(this.normal.times(distance * 2.0));\n return mirrored;\n }\n };\n\n\n // # class Polygon\n // Represents a convex polygon. The vertices used to initialize a polygon must\n // be coplanar and form a convex loop. They do not have to be `CSG.Vertex`\n // instances but they must behave similarly (duck typing can be used for\n // customization).\n //\n // Each convex polygon has a `shared` property, which is shared between all\n // polygons that are clones of each other or were split from the same polygon.\n // This can be used to define per-polygon properties (such as surface color).\n //\n // The plane of the polygon is calculated from the vertex coordinates\n // To avoid unnecessary recalculation, the plane can alternatively be\n // passed as the third argument\n CSG.Polygon = function(vertices, shared, plane) {\n this.vertices = vertices;\n if (!shared) shared = CSG.Polygon.defaultShared;\n this.shared = shared;\n //var numvertices = vertices.length;\n\n if (arguments.length >= 3) {\n this.plane = plane;\n } else {\n this.plane = CSG.Plane.fromVector3Ds(vertices[0].pos, vertices[1].pos, vertices[2].pos);\n }\n\n if (_CSGDEBUG) {\n this.checkIfConvex();\n }\n };\n\n // create from an untyped object with identical property names:\n CSG.Polygon.fromObject = function(obj) {\n var vertices = obj.vertices.map(function(v) {\n return CSG.Vertex.fromObject(v);\n });\n var shared = CSG.Polygon.Shared.fromObject(obj.shared);\n var plane = CSG.Plane.fromObject(obj.plane);\n return new CSG.Polygon(vertices, shared, plane);\n };\n\n CSG.Polygon.prototype = {\n // check whether the polygon is convex (it should be, otherwise we will get unexpected results)\n checkIfConvex: function() {\n if (!CSG.Polygon.verticesConvex(this.vertices, this.plane.normal)) {\n CSG.Polygon.verticesConvex(this.vertices, this.plane.normal);\n throw new Error(\"Not convex!\");\n }\n },\n\n setColor: function(args) {\n var newshared = CSG.Polygon.Shared.fromColor.apply(this, arguments);\n this.shared = newshared;\n return this;\n },\n\n getSignedVolume: function() {\n var signedVolume = 0;\n for (var i = 0; i < this.vertices.length - 2; i++) {\n signedVolume += this.vertices[0].pos.dot(this.vertices[i+1].pos\n .cross(this.vertices[i+2].pos));\n }\n signedVolume /= 6;\n return signedVolume;\n },\n\n // Note: could calculate vectors only once to speed up\n getArea: function() {\n var polygonArea = 0;\n for (var i = 0; i < this.vertices.length - 2; i++) {\n polygonArea += this.vertices[i+1].pos.minus(this.vertices[0].pos)\n .cross(this.vertices[i+2].pos.minus(this.vertices[i+1].pos)).length();\n }\n polygonArea /= 2;\n return polygonArea;\n },\n\n\n // accepts array of features to calculate\n // returns array of results\n getTetraFeatures: function(features) {\n var result = [];\n features.forEach(function(feature) {\n if (feature == 'volume') {\n result.push(this.getSignedVolume());\n } else if (feature == 'area') {\n result.push(this.getArea());\n }\n }, this);\n return result;\n },\n\n // Extrude a polygon into the direction offsetvector\n // Returns a CSG object\n extrude: function(offsetvector) {\n var newpolygons = [];\n\n var polygon1 = this;\n var direction = polygon1.plane.normal.dot(offsetvector);\n if (direction > 0) {\n polygon1 = polygon1.flipped();\n }\n newpolygons.push(polygon1);\n var polygon2 = polygon1.translate(offsetvector);\n var numvertices = this.vertices.length;\n for (var i = 0; i < numvertices; i++) {\n var sidefacepoints = [];\n var nexti = (i < (numvertices - 1)) ? i + 1 : 0;\n sidefacepoints.push(polygon1.vertices[i].pos);\n sidefacepoints.push(polygon2.vertices[i].pos);\n sidefacepoints.push(polygon2.vertices[nexti].pos);\n sidefacepoints.push(polygon1.vertices[nexti].pos);\n var sidefacepolygon = CSG.Polygon.createFromPoints(sidefacepoints, this.shared);\n newpolygons.push(sidefacepolygon);\n }\n polygon2 = polygon2.flipped();\n newpolygons.push(polygon2);\n return CSG.fromPolygons(newpolygons);\n },\n\n translate: function(offset) {\n return this.transform(CSG.Matrix4x4.translation(offset));\n },\n\n // returns an array with a CSG.Vector3D (center point) and a radius\n boundingSphere: function() {\n if (!this.cachedBoundingSphere) {\n var box = this.boundingBox();\n var middle = box[0].plus(box[1]).times(0.5);\n var radius3 = box[1].minus(middle);\n var radius = radius3.length();\n this.cachedBoundingSphere = [middle, radius];\n }\n return this.cachedBoundingSphere;\n },\n\n // returns an array of two CSG.Vector3Ds (minimum coordinates and maximum coordinates)\n boundingBox: function() {\n if (!this.cachedBoundingBox) {\n var minpoint, maxpoint;\n var vertices = this.vertices;\n var numvertices = vertices.length;\n if (numvertices === 0) {\n minpoint = new CSG.Vector3D(0, 0, 0);\n } else {\n minpoint = vertices[0].pos;\n }\n maxpoint = minpoint;\n for (var i = 1; i < numvertices; i++) {\n var point = vertices[i].pos;\n minpoint = minpoint.min(point);\n maxpoint = maxpoint.max(point);\n }\n this.cachedBoundingBox = [minpoint, maxpoint];\n }\n return this.cachedBoundingBox;\n },\n\n flipped: function() {\n var newvertices = this.vertices.map(function(v) {\n return v.flipped();\n });\n newvertices.reverse();\n var newplane = this.plane.flipped();\n return new CSG.Polygon(newvertices, this.shared, newplane);\n },\n\n // Affine transformation of polygon. Returns a new CSG.Polygon\n transform: function(matrix4x4) {\n var newvertices = this.vertices.map(function(v) {\n return v.transform(matrix4x4);\n });\n var newplane = this.plane.transform(matrix4x4);\n if (matrix4x4.isMirroring()) {\n // need to reverse the vertex order\n // in order to preserve the inside/outside orientation:\n newvertices.reverse();\n }\n return new CSG.Polygon(newvertices, this.shared, newplane);\n },\n\n toString: function() {\n var result = \"Polygon plane: \" + this.plane.toString() + \"\\n\";\n this.vertices.map(function(vertex) {\n result += \" \" + vertex.toString() + \"\\n\";\n });\n return result;\n },\n\n // project the 3D polygon onto a plane\n projectToOrthoNormalBasis: function(orthobasis) {\n var points2d = this.vertices.map(function(vertex) {\n return orthobasis.to2D(vertex.pos);\n });\n var result = CAG.fromPointsNoCheck(points2d);\n var area = result.area();\n if (Math.abs(area) < 1e-5) {\n // the polygon was perpendicular to the orthnormal plane. The resulting 2D polygon would be degenerate\n // return an empty area instead:\n result = new CAG();\n } else if (area < 0) {\n result = result.flipped();\n }\n return result;\n },\n\n /**\n * Creates solid from slices (CSG.Polygon) by generating walls\n * @param {Object} options Solid generating options\n * - numslices {Number} Number of slices to be generated\n * - callback(t, slice) {Function} Callback function generating slices.\n * arguments: t = [0..1], slice = [0..numslices - 1]\n * return: CSG.Polygon or null to skip\n * - loop {Boolean} no flats, only walls, it's used to generate solids like a tor\n */\n solidFromSlices: function(options) {\n var polygons = [],\n csg = null,\n prev = null,\n bottom = null,\n top = null,\n numSlices = 2,\n bLoop = false,\n fnCallback,\n flipped = null;\n\n if (options) {\n bLoop = Boolean(options['loop']);\n\n if (options.numslices)\n numSlices = options.numslices;\n\n if (options.callback)\n fnCallback = options.callback;\n }\n if (!fnCallback) {\n var square = new CSG.Polygon.createFromPoints([\n [0, 0, 0],\n [1, 0, 0],\n [1, 1, 0],\n [0, 1, 0]\n ]);\n fnCallback = function(t, slice) {\n return t == 0 || t == 1 ? square.translate([0, 0, t]) : null;\n }\n }\n for (var i = 0, iMax = numSlices - 1; i <= iMax; i++) {\n csg = fnCallback.call(this, i / iMax, i);\n if (csg) {\n if (!(csg instanceof CSG.Polygon)) {\n throw new Error(\"CSG.Polygon.solidFromSlices callback error: CSG.Polygon expected\");\n }\n csg.checkIfConvex();\n\n if (prev) { //generate walls\n if (flipped === null) { //not generated yet\n flipped = prev.plane.signedDistanceToPoint(csg.vertices[0].pos) < 0;\n }\n this._addWalls(polygons, prev, csg, flipped);\n\n } else { //the first - will be a bottom\n bottom = csg;\n }\n prev = csg;\n } //callback can return null to skip that slice\n }\n top = csg;\n\n if (bLoop) {\n var bSameTopBottom = bottom.vertices.length == top.vertices.length &&\n bottom.vertices.every(function(v, index) {\n return v.pos.equals(top.vertices[index].pos)\n });\n //if top and bottom are not the same -\n //generate walls between them\n if (!bSameTopBottom) {\n this._addWalls(polygons, top, bottom, flipped);\n } //else - already generated\n } else {\n //save top and bottom\n //TODO: flip if necessary\n polygons.unshift(flipped ? bottom : bottom.flipped());\n polygons.push(flipped ? top.flipped() : top);\n }\n return CSG.fromPolygons(polygons);\n },\n /**\n *\n * @param walls Array of wall polygons\n * @param bottom Bottom polygon\n * @param top Top polygon\n */\n _addWalls: function(walls, bottom, top, bFlipped) {\n var bottomPoints = bottom.vertices.slice(0), //make a copy\n topPoints = top.vertices.slice(0), //make a copy\n color = top.shared || null;\n\n //check if bottom perimeter is closed\n if (!bottomPoints[0].pos.equals(bottomPoints[bottomPoints.length - 1].pos)) {\n bottomPoints.push(bottomPoints[0]);\n }\n\n //check if top perimeter is closed\n if (!topPoints[0].pos.equals(topPoints[topPoints.length - 1].pos)) {\n topPoints.push(topPoints[0]);\n }\n if (bFlipped) {\n bottomPoints = bottomPoints.reverse();\n topPoints = topPoints.reverse();\n }\n\n var iTopLen = topPoints.length - 1,\n iBotLen = bottomPoints.length - 1,\n iExtra = iTopLen - iBotLen, //how many extra triangles we need\n bMoreTops = iExtra > 0,\n bMoreBottoms = iExtra < 0;\n\n var aMin = []; //indexes to start extra triangles (polygon with minimal square)\n //init - we need exactly /iExtra/ small triangles\n for (var i = Math.abs(iExtra); i > 0; i--) {\n aMin.push({\n len: Infinity,\n index: -1\n });\n }\n\n var len;\n if (bMoreBottoms) {\n for (var i = 0; i < iBotLen; i++) {\n len = bottomPoints[i].pos.distanceToSquared(bottomPoints[i + 1].pos);\n //find the element to replace\n for (var j = aMin.length - 1; j >= 0; j--) {\n if (aMin[j].len > len) {\n aMin[j].len = len;\n aMin.index = j;\n break;\n }\n } //for\n }\n } else if (bMoreTops) {\n for (var i = 0; i < iTopLen; i++) {\n len = topPoints[i].pos.distanceToSquared(topPoints[i + 1].pos);\n //find the element to replace\n for (var j = aMin.length - 1; j >= 0; j--) {\n if (aMin[j].len > len) {\n aMin[j].len = len;\n aMin.index = j;\n break;\n }\n } //for\n }\n } //if\n //sort by index\n aMin.sort(fnSortByIndex);\n var getTriangle = function addWallsPutTriangle(pointA, pointB, pointC, color) {\n return new CSG.Polygon([pointA, pointB, pointC], color);\n //return bFlipped ? triangle.flipped() : triangle;\n };\n\n var bpoint = bottomPoints[0],\n tpoint = topPoints[0],\n secondPoint,\n nBotFacet, nTopFacet; //length of triangle facet side\n for (var iB = 0, iT = 0, iMax = iTopLen + iBotLen; iB + iT < iMax;) {\n if (aMin.length) {\n if (bMoreTops && iT == aMin[0].index) { //one vertex is on the bottom, 2 - on the top\n secondPoint = topPoints[++iT];\n //console.log('<<< extra top: ' + secondPoint + ', ' + tpoint + ', bottom: ' + bpoint);\n walls.push(getTriangle(\n secondPoint, tpoint, bpoint, color\n ));\n tpoint = secondPoint;\n aMin.shift();\n continue;\n } else if (bMoreBottoms && iB == aMin[0].index) {\n secondPoint = bottomPoints[++iB];\n walls.push(getTriangle(\n tpoint, bpoint, secondPoint, color\n ));\n bpoint = secondPoint;\n aMin.shift();\n continue;\n }\n }\n //choose the shortest path\n if (iB < iBotLen) { //one vertex is on the top, 2 - on the bottom\n nBotFacet = tpoint.pos.distanceToSquared(bottomPoints[iB + 1].pos);\n } else {\n nBotFacet = Infinity;\n }\n if (iT < iTopLen) { //one vertex is on the bottom, 2 - on the top\n nTopFacet = bpoint.pos.distanceToSquared(topPoints[iT + 1].pos);\n } else {\n nTopFacet = Infinity;\n }\n if (nBotFacet <= nTopFacet) {\n secondPoint = bottomPoints[++iB];\n walls.push(getTriangle(\n tpoint, bpoint, secondPoint, color\n ));\n bpoint = secondPoint;\n } else if (iT < iTopLen) { //nTopFacet < Infinity\n secondPoint = topPoints[++iT];\n //console.log('<<< top: ' + secondPoint + ', ' + tpoint + ', bottom: ' + bpoint);\n walls.push(getTriangle(\n secondPoint, tpoint, bpoint, color\n ));\n tpoint = secondPoint;\n };\n }\n return walls;\n }\n };\n\n CSG.Polygon.verticesConvex = function(vertices, planenormal) {\n var numvertices = vertices.length;\n if (numvertices > 2) {\n var prevprevpos = vertices[numvertices - 2].pos;\n var prevpos = vertices[numvertices - 1].pos;\n for (var i = 0; i < numvertices; i++) {\n var pos = vertices[i].pos;\n if (!CSG.Polygon.isConvexPoint(prevprevpos, prevpos, pos, planenormal)) {\n return false;\n }\n prevprevpos = prevpos;\n prevpos = pos;\n }\n }\n return true;\n };\n\n // Create a polygon from the given points\n CSG.Polygon.createFromPoints = function(points, shared, plane) {\n var normal;\n if (arguments.length < 3) {\n // initially set a dummy vertex normal:\n normal = new CSG.Vector3D(0, 0, 0);\n } else {\n normal = plane.normal;\n }\n var vertices = [];\n points.map(function(p) {\n var vec = new CSG.Vector3D(p);\n var vertex = new CSG.Vertex(vec);\n vertices.push(vertex);\n });\n var polygon;\n if (arguments.length < 3) {\n polygon = new CSG.Polygon(vertices, shared);\n } else {\n polygon = new CSG.Polygon(vertices, shared, plane);\n }\n return polygon;\n };\n\n // calculate whether three points form a convex corner\n // prevpoint, point, nextpoint: the 3 coordinates (CSG.Vector3D instances)\n // normal: the normal vector of the plane\n CSG.Polygon.isConvexPoint = function(prevpoint, point, nextpoint, normal) {\n var crossproduct = point.minus(prevpoint).cross(nextpoint.minus(point));\n var crossdotnormal = crossproduct.dot(normal);\n return (crossdotnormal >= 0);\n };\n\n CSG.Polygon.isStrictlyConvexPoint = function(prevpoint, point, nextpoint, normal) {\n var crossproduct = point.minus(prevpoint).cross(nextpoint.minus(point));\n var crossdotnormal = crossproduct.dot(normal);\n return (crossdotnormal >= 1e-5);\n };\n\n // # class CSG.Polygon.Shared\n // Holds the shared properties for each polygon (currently only color)\n // Constructor expects a 4 element array [r,g,b,a], values from 0 to 1, or null\n CSG.Polygon.Shared = function(color) {\n if(color !== null)\n {\n if (color.length != 4) {\n throw new Error(\"Expecting 4 element array\");\n }\n }\n this.color = color;\n };\n\n CSG.Polygon.Shared.fromObject = function(obj) {\n return new CSG.Polygon.Shared(obj.color);\n };\n\n // Create CSG.Polygon.Shared from a color, can be called as follows:\n // var s = CSG.Polygon.Shared.fromColor(r,g,b [,a])\n // var s = CSG.Polygon.Shared.fromColor([r,g,b [,a]])\n CSG.Polygon.Shared.fromColor = function(args) {\n var color;\n if(arguments.length == 1) {\n color = arguments[0].slice(); // make deep copy\n }\n else {\n color = [];\n for(var i=0; i < arguments.length; i++) {\n color.push(arguments[i]);\n }\n }\n if(color.length == 3) {\n color.push(1);\n } else if(color.length != 4) {\n throw new Error(\"setColor expects either an array with 3 or 4 elements, or 3 or 4 parameters.\");\n }\n return new CSG.Polygon.Shared(color);\n };\n\n CSG.Polygon.Shared.prototype = {\n getTag: function() {\n var result = this.tag;\n if (!result) {\n result = CSG.getTag();\n this.tag = result;\n }\n return result;\n },\n // get a string uniquely identifying this object\n getHash: function() {\n if (!this.color) return \"null\";\n return this.color.join(\"/\");\n }\n };\n\n CSG.Polygon.defaultShared = new CSG.Polygon.Shared(null);\n\n // # class PolygonTreeNode\n // This class manages hierarchical splits of polygons\n // At the top is a root node which doesn hold a polygon, only child PolygonTreeNodes\n // Below that are zero or more 'top' nodes; each holds a polygon. The polygons can be in different planes\n // splitByPlane() splits a node by a plane. If the plane intersects the polygon, two new child nodes\n // are created holding the splitted polygon.\n // getPolygons() retrieves the polygon from the tree. If for PolygonTreeNode the polygon is split but\n // the two split parts (child nodes) are still intact, then the unsplit polygon is returned.\n // This ensures that we can safely split a polygon into many fragments. If the fragments are untouched,\n // getPolygons() will return the original unsplit polygon instead of the fragments.\n // remove() removes a polygon from the tree. Once a polygon is removed, the parent polygons are invalidated\n // since they are no longer intact.\n // constructor creates the root node:\n CSG.PolygonTreeNode = function() {\n this.parent = null;\n this.children = [];\n this.polygon = null;\n this.removed = false;\n };\n\n CSG.PolygonTreeNode.prototype = {\n // fill the tree with polygons. Should be called on the root node only; child nodes must\n // always be a derivate (split) of the parent node.\n addPolygons: function(polygons) {\n if (!this.isRootNode())\n // new polygons can only be added to root node; children can only be splitted polygons\n throw new Error(\"Assertion failed\");\n var _this = this;\n polygons.map(function(polygon) {\n _this.addChild(polygon);\n });\n },\n\n // remove a node\n // - the siblings become toplevel nodes\n // - the parent is removed recursively\n remove: function() {\n if (!this.removed) {\n this.removed = true;\n\n if (_CSGDEBUG) {\n if (this.isRootNode()) throw new Error(\"Assertion failed\"); // can't remove root node\n if (this.children.length) throw new Error(\"Assertion failed\"); // we shouldn't remove nodes with children\n }\n\n // remove ourselves from the parent's children list:\n var parentschildren = this.parent.children;\n var i = parentschildren.indexOf(this);\n if (i < 0) throw new Error(\"Assertion failed\");\n parentschildren.splice(i, 1);\n\n // invalidate the parent's polygon, and of all parents above it:\n this.parent.recursivelyInvalidatePolygon();\n }\n },\n\n isRemoved: function() {\n return this.removed;\n },\n\n isRootNode: function() {\n return !this.parent;\n },\n\n // invert all polygons in the tree. Call on the root node\n invert: function() {\n if (!this.isRootNode()) throw new Error(\"Assertion failed\"); // can only call this on the root node\n this.invertSub();\n },\n\n getPolygon: function() {\n if (!this.polygon) throw new Error(\"Assertion failed\"); // doesn't have a polygon, which means that it has been broken down\n return this.polygon;\n },\n\n getPolygons: function(result) {\n var children = [this];\n var queue = [children];\n var i, j, l, node;\n for (i = 0; i < queue.length; ++i ) { // queue size can change in loop, don't cache length\n children = queue[i];\n for (j = 0, l = children.length; j < l; j++) { // ok to cache length\n node = children[j];\n if (node.polygon) {\n // the polygon hasn't been broken yet. We can ignore the children and return our polygon:\n result.push(node.polygon);\n } else {\n // our polygon has been split up and broken, so gather all subpolygons from the children\n queue.push(node.children);\n }\n }\n }\n },\n\n // split the node by a plane; add the resulting nodes to the frontnodes and backnodes array\n // If the plane doesn't intersect the polygon, the 'this' object is added to one of the arrays\n // If the plane does intersect the polygon, two new child nodes are created for the front and back fragments,\n // and added to both arrays.\n splitByPlane: function(plane, coplanarfrontnodes, coplanarbacknodes, frontnodes, backnodes) {\n if (this.children.length) {\n var queue = [this.children], i, j, l, node, nodes;\n for (i = 0; i < queue.length; i++) { // queue.length can increase, do not cache\n nodes = queue[i];\n for (j = 0, l = nodes.length; j < l; j++) { // ok to cache length\n node = nodes[j];\n if (node.children.length) {\n queue.push(node.children);\n } else {\n // no children. Split the polygon:\n node._splitByPlane(plane, coplanarfrontnodes, coplanarbacknodes, frontnodes, backnodes);\n }\n }\n }\n } else {\n this._splitByPlane(plane, coplanarfrontnodes, coplanarbacknodes, frontnodes, backnodes);\n }\n },\n\n // only to be called for nodes with no children\n _splitByPlane: function (plane, coplanarfrontnodes, coplanarbacknodes, frontnodes, backnodes) {\n var polygon = this.polygon;\n if (polygon) {\n var bound = polygon.boundingSphere();\n var sphereradius = bound[1] + 1e-4;\n var planenormal = plane.normal;\n var spherecenter = bound[0];\n var d = planenormal.dot(spherecenter) - plane.w;\n if (d > sphereradius) {\n frontnodes.push(this);\n } else if (d < -sphereradius) {\n backnodes.push(this);\n } else {\n var splitresult = plane.splitPolygon(polygon);\n switch (splitresult.type) {\n case 0:\n // coplanar front:\n coplanarfrontnodes.push(this);\n break;\n\n case 1:\n // coplanar back:\n coplanarbacknodes.push(this);\n break;\n\n case 2:\n // front:\n frontnodes.push(this);\n break;\n\n case 3:\n // back:\n backnodes.push(this);\n break;\n\n case 4:\n // spanning:\n if (splitresult.front) {\n var frontnode = this.addChild(splitresult.front);\n frontnodes.push(frontnode);\n }\n if (splitresult.back) {\n var backnode = this.addChild(splitresult.back);\n backnodes.push(backnode);\n }\n break;\n }\n }\n }\n },\n\n\n // PRIVATE methods from here:\n // add child to a node\n // this should be called whenever the polygon is split\n // a child should be created for every fragment of the split polygon\n // returns the newly created child\n addChild: function(polygon) {\n var newchild = new CSG.PolygonTreeNode();\n newchild.parent = this;\n newchild.polygon = polygon;\n this.children.push(newchild);\n return newchild;\n },\n\n invertSub: function() {\n var children = [this];\n var queue = [children];\n var i, j, l, node;\n for (i = 0; i < queue.length; i++) {\n children = queue[i];\n for (j = 0, l = children.length; j < l; j++) {\n node = children[j];\n if (node.polygon) {\n node.polygon = node.polygon.flipped();\n }\n queue.push(node.children);\n }\n }\n },\n\n recursivelyInvalidatePolygon: function() {\n var node = this;\n while (node.polygon) {\n node.polygon = null;\n if (node.parent) {\n node = node.parent;\n }\n }\n }\n };\n\n\n\n // # class Tree\n // This is the root of a BSP tree\n // We are using this separate class for the root of the tree, to hold the PolygonTreeNode root\n // The actual tree is kept in this.rootnode\n CSG.Tree = function(polygons) {\n this.polygonTree = new CSG.PolygonTreeNode();\n this.rootnode = new CSG.Node(null);\n if (polygons) this.addPolygons(polygons);\n };\n\n CSG.Tree.prototype = {\n invert: function() {\n this.polygonTree.invert();\n this.rootnode.invert();\n },\n\n // Remove all polygons in this BSP tree that are inside the other BSP tree\n // `tree`.\n clipTo: function(tree, alsoRemovecoplanarFront) {\n alsoRemovecoplanarFront = alsoRemovecoplanarFront ? true : false;\n this.rootnode.clipTo(tree, alsoRemovecoplanarFront);\n },\n\n allPolygons: function() {\n var result = [];\n this.polygonTree.getPolygons(result);\n return result;\n },\n\n addPolygons: function(polygons) {\n var _this = this;\n var polygontreenodes = polygons.map(function(p) {\n return _this.polygonTree.addChild(p);\n });\n this.rootnode.addPolygonTreeNodes(polygontreenodes);\n }\n };\n\n // # class Node\n // Holds a node in a BSP tree. A BSP tree is built from a collection of polygons\n // by picking a polygon to split along.\n // Polygons are not stored directly in the tree, but in PolygonTreeNodes, stored in\n // this.polygontreenodes. Those PolygonTreeNodes are children of the owning\n // CSG.Tree.polygonTree\n // This is not a leafy BSP tree since there is\n // no distinction between internal and leaf nodes.\n CSG.Node = function(parent) {\n this.plane = null;\n this.front = null;\n this.back = null;\n this.polygontreenodes = [];\n this.parent = parent;\n };\n\n CSG.Node.prototype = {\n // Convert solid space to empty space and empty space to solid space.\n invert: function() {\n var queue = [this];\n var i, node;\n for (var i = 0; i < queue.length; i++) {\n node = queue[i];\n if(node.plane) node.plane = node.plane.flipped();\n if(node.front) queue.push(node.front);\n if(node.back) queue.push(node.back);\n var temp = node.front;\n node.front = node.back;\n node.back = temp;\n }\n },\n\n // clip polygontreenodes to our plane\n // calls remove() for all clipped PolygonTreeNodes\n clipPolygons: function(polygontreenodes, alsoRemovecoplanarFront) {\n var args = {'node': this, 'polygontreenodes': polygontreenodes }\n var node;\n var stack = [];\n\n do {\n node = args.node;\n polygontreenodes = args.polygontreenodes;\n\n // begin \"function\"\n if(node.plane) {\n var backnodes = [];\n var frontnodes = [];\n var coplanarfrontnodes = alsoRemovecoplanarFront ? backnodes : frontnodes;\n var plane = node.plane;\n var numpolygontreenodes = polygontreenodes.length;\n for(i = 0; i < numpolygontreenodes; i++) {\n var node1 = polygontreenodes[i];\n if(!node1.isRemoved()) {\n node1.splitByPlane(plane, coplanarfrontnodes, backnodes, frontnodes, backnodes);\n }\n }\n\n if(node.front && (frontnodes.length > 0)) {\n stack.push({'node': node.front, 'polygontreenodes': frontnodes});\n }\n var numbacknodes = backnodes.length;\n if (node.back && (numbacknodes > 0)) {\n stack.push({'node': node.back, 'polygontreenodes': backnodes});\n } else {\n // there's nothing behind this plane. Delete the nodes behind this plane:\n for (var i = 0; i < numbacknodes; i++) {\n backnodes[i].remove();\n }\n }\n }\n args = stack.pop();\n } while (typeof(args) !== 'undefined');\n },\n\n // Remove all polygons in this BSP tree that are inside the other BSP tree\n // `tree`.\n clipTo: function(tree, alsoRemovecoplanarFront) {\n var node = this, stack = [];\n do {\n if(node.polygontreenodes.length > 0) {\n tree.rootnode.clipPolygons(node.polygontreenodes, alsoRemovecoplanarFront);\n }\n if(node.front) stack.push(node.front);\n if(node.back) stack.push(node.back);\n node = stack.pop();\n } while(typeof(node) !== 'undefined');\n },\n\n addPolygonTreeNodes: function(polygontreenodes) {\n var args = {'node': this, 'polygontreenodes': polygontreenodes };\n var node;\n var stack = [];\n do {\n node = args.node;\n polygontreenodes = args.polygontreenodes;\n\n if (polygontreenodes.length === 0) {\n args = stack.pop();\n continue;\n }\n var _this = node;\n if (!node.plane) {\n var bestplane = polygontreenodes[0].getPolygon().plane;\n node.plane = bestplane;\n }\n var frontnodes = [];\n var backnodes = [];\n\n for (var i = 0, n = polygontreenodes.length ; i < n; ++i) {\n polygontreenodes[i].splitByPlane(_this.plane, _this.polygontreenodes, backnodes, frontnodes, backnodes);\n }\n\n if (frontnodes.length > 0) {\n if (!node.front) node.front = new CSG.Node(node);\n stack.push({'node': node.front, 'polygontreenodes': frontnodes});\n }\n if (backnodes.length > 0) {\n if (!node.back) node.back = new CSG.Node(node);\n stack.push({'node': node.back, 'polygontreenodes': backnodes});\n }\n\n args = stack.pop();\n } while (typeof(args) !== 'undefined');\n },\n\n getParentPlaneNormals: function(normals, maxdepth) {\n if (maxdepth > 0) {\n if (this.parent) {\n normals.push(this.parent.plane.normal);\n this.parent.getParentPlaneNormals(normals, maxdepth - 1);\n }\n }\n }\n };\n\n //////////\n // # class Matrix4x4:\n // Represents a 4x4 matrix. Elements are specified in row order\n CSG.Matrix4x4 = function(elements) {\n if (arguments.length >= 1) {\n this.elements = elements;\n } else {\n // if no arguments passed: create unity matrix\n this.elements = [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1];\n }\n };\n\n CSG.Matrix4x4.prototype = {\n plus: function(m) {\n var r = [];\n for (var i = 0; i < 16; i++) {\n r[i] = this.elements[i] + m.elements[i];\n }\n return new CSG.Matrix4x4(r);\n },\n\n minus: function(m) {\n var r = [];\n for (var i = 0; i < 16; i++) {\n r[i] = this.elements[i] - m.elements[i];\n }\n return new CSG.Matrix4x4(r);\n },\n\n // right multiply by another 4x4 matrix:\n multiply: function(m) {\n // cache elements in local variables, for speedup:\n var this0 = this.elements[0];\n var this1 = this.elements[1];\n var this2 = this.elements[2];\n var this3 = this.elements[3];\n var this4 = this.elements[4];\n var this5 = this.elements[5];\n var this6 = this.elements[6];\n var this7 = this.elements[7];\n var this8 = this.elements[8];\n var this9 = this.elements[9];\n var this10 = this.elements[10];\n var this11 = this.elements[11];\n var this12 = this.elements[12];\n var this13 = this.elements[13];\n var this14 = this.elements[14];\n var this15 = this.elements[15];\n var m0 = m.elements[0];\n var m1 = m.elements[1];\n var m2 = m.elements[2];\n var m3 = m.elements[3];\n var m4 = m.elements[4];\n var m5 = m.elements[5];\n var m6 = m.elements[6];\n var m7 = m.elements[7];\n var m8 = m.elements[8];\n var m9 = m.elements[9];\n var m10 = m.elements[10];\n var m11 = m.elements[11];\n var m12 = m.elements[12];\n var m13 = m.elements[13];\n var m14 = m.elements[14];\n var m15 = m.elements[15];\n\n var result = [];\n result[0] = this0 * m0 + this1 * m4 + this2 * m8 + this3 * m12;\n result[1] = this0 * m1 + this1 * m5 + this2 * m9 + this3 * m13;\n result[2] = this0 * m2 + this1 * m6 + this2 * m10 + this3 * m14;\n result[3] = this0 * m3 + this1 * m7 + this2 * m11 + this3 * m15;\n result[4] = this4 * m0 + this5 * m4 + this6 * m8 + this7 * m12;\n result[5] = this4 * m1 + this5 * m5 + this6 * m9 + this7 * m13;\n result[6] = this4 * m2 + this5 * m6 + this6 * m10 + this7 * m14;\n result[7] = this4 * m3 + this5 * m7 + this6 * m11 + this7 * m15;\n result[8] = this8 * m0 + this9 * m4 + this10 * m8 + this11 * m12;\n result[9] = this8 * m1 + this9 * m5 + this10 * m9 + this11 * m13;\n result[10] = this8 * m2 + this9 * m6 + this10 * m10 + this11 * m14;\n result[11] = this8 * m3 + this9 * m7 + this10 * m11 + this11 * m15;\n result[12] = this12 * m0 + this13 * m4 + this14 * m8 + this15 * m12;\n result[13] = this12 * m1 + this13 * m5 + this14 * m9 + this15 * m13;\n result[14] = this12 * m2 + this13 * m6 + this14 * m10 + this15 * m14;\n result[15] = this12 * m3 + this13 * m7 + this14 * m11 + this15 * m15;\n return new CSG.Matrix4x4(result);\n },\n\n clone: function() {\n var elements = this.elements.map(function(p) {\n return p;\n });\n return new CSG.Matrix4x4(elements);\n },\n\n // Right multiply the matrix by a CSG.Vector3D (interpreted as 3 row, 1 column)\n // (result = M*v)\n // Fourth element is taken as 1\n rightMultiply1x3Vector: function(v) {\n var v0 = v._x;\n var v1 = v._y;\n var v2 = v._z;\n var v3 = 1;\n var x = v0 * this.elements[0] + v1 * this.elements[1] + v2 * this.elements[2] + v3 * this.elements[3];\n var y = v0 * this.elements[4] + v1 * this.elements[5] + v2 * this.elements[6] + v3 * this.elements[7];\n var z = v0 * this.elements[8] + v1 * this.elements[9] + v2 * this.elements[10] + v3 * this.elements[11];\n var w = v0 * this.elements[12] + v1 * this.elements[13] + v2 * this.elements[14] + v3 * this.elements[15];\n // scale such that fourth element becomes 1:\n if (w != 1) {\n var invw = 1.0 / w;\n x *= invw;\n y *= invw;\n z *= invw;\n }\n return new CSG.Vector3D(x, y, z);\n },\n\n // Multiply a CSG.Vector3D (interpreted as 3 column, 1 row) by this matrix\n // (result = v*M)\n // Fourth element is taken as 1\n leftMultiply1x3Vector: function(v) {\n var v0 = v._x;\n var v1 = v._y;\n var v2 = v._z;\n var v3 = 1;\n var x = v0 * this.elements[0] + v1 * this.elements[4] + v2 * this.elements[8] + v3 * this.elements[12];\n var y = v0 * this.elements[1] + v1 * this.elements[5] + v2 * this.elements[9] + v3 * this.elements[13];\n var z = v0 * this.elements[2] + v1 * this.elements[6] + v2 * this.elements[10] + v3 * this.elements[14];\n var w = v0 * this.elements[3] + v1 * this.elements[7] + v2 * this.elements[11] + v3 * this.elements[15];\n // scale such that fourth element becomes 1:\n if (w != 1) {\n var invw = 1.0 / w;\n x *= invw;\n y *= invw;\n z *= invw;\n }\n return new CSG.Vector3D(x, y, z);\n },\n\n // Right multiply the matrix by a CSG.Vector2D (interpreted as 2 row, 1 column)\n // (result = M*v)\n // Fourth element is taken as 1\n rightMultiply1x2Vector: function(v) {\n var v0 = v.x;\n var v1 = v.y;\n var v2 = 0;\n var v3 = 1;\n var x = v0 * this.elements[0] + v1 * this.elements[1] + v2 * this.elements[2] + v3 * this.elements[3];\n var y = v0 * this.elements[4] + v1 * this.elements[5] + v2 * this.elements[6] + v3 * this.elements[7];\n var z = v0 * this.elements[8] + v1 * this.elements[9] + v2 * this.elements[10] + v3 * this.elements[11];\n var w = v0 * this.elements[12] + v1 * this.elements[13] + v2 * this.elements[14] + v3 * this.elements[15];\n // scale such that fourth element becomes 1:\n if (w != 1) {\n var invw = 1.0 / w;\n x *= invw;\n y *= invw;\n z *= invw;\n }\n return new CSG.Vector2D(x, y);\n },\n\n // Multiply a CSG.Vector2D (interpreted as 2 column, 1 row) by this matrix\n // (result = v*M)\n // Fourth element is taken as 1\n leftMultiply1x2Vector: function(v) {\n var v0 = v.x;\n var v1 = v.y;\n var v2 = 0;\n var v3 = 1;\n var x = v0 * this.elements[0] + v1 * this.elements[4] + v2 * this.elements[8] + v3 * this.elements[12];\n var y = v0 * this.elements[1] + v1 * this.elements[5] + v2 * this.elements[9] + v3 * this.elements[13];\n var z = v0 * this.elements[2] + v1 * this.elements[6] + v2 * this.elements[10] + v3 * this.elements[14];\n var w = v0 * this.elements[3] + v1 * this.elements[7] + v2 * this.elements[11] + v3 * this.elements[15];\n // scale such that fourth element becomes 1:\n if (w != 1) {\n var invw = 1.0 / w;\n x *= invw;\n y *= invw;\n z *= invw;\n }\n return new CSG.Vector2D(x, y);\n },\n\n // determine whether this matrix is a mirroring transformation\n isMirroring: function() {\n var u = new CSG.Vector3D(this.elements[0], this.elements[4], this.elements[8]);\n var v = new CSG.Vector3D(this.elements[1], this.elements[5], this.elements[9]);\n var w = new CSG.Vector3D(this.elements[2], this.elements[6], this.elements[10]);\n\n // for a true orthogonal, non-mirrored base, u.cross(v) == w\n // If they have an opposite direction then we are mirroring\n var mirrorvalue = u.cross(v).dot(w);\n var ismirror = (mirrorvalue < 0);\n return ismirror;\n }\n };\n\n // return the unity matrix\n CSG.Matrix4x4.unity = function() {\n return new CSG.Matrix4x4();\n };\n\n // Create a rotation matrix for rotating around the x axis\n CSG.Matrix4x4.rotationX = function(degrees) {\n var radians = degrees * Math.PI * (1.0 / 180.0);\n var cos = Math.cos(radians);\n var sin = Math.sin(radians);\n var els = [\n 1, 0, 0, 0, 0, cos, sin, 0, 0, -sin, cos, 0, 0, 0, 0, 1\n ];\n return new CSG.Matrix4x4(els);\n };\n\n // Create a rotation matrix for rotating around the y axis\n CSG.Matrix4x4.rotationY = function(degrees) {\n var radians = degrees * Math.PI * (1.0 / 180.0);\n var cos = Math.cos(radians);\n var sin = Math.sin(radians);\n var els = [\n cos, 0, -sin, 0, 0, 1, 0, 0, sin, 0, cos, 0, 0, 0, 0, 1\n ];\n return new CSG.Matrix4x4(els);\n };\n\n // Create a rotation matrix for rotating around the z axis\n CSG.Matrix4x4.rotationZ = function(degrees) {\n var radians = degrees * Math.PI * (1.0 / 180.0);\n var cos = Math.cos(radians);\n var sin = Math.sin(radians);\n var els = [\n cos, sin, 0, 0, -sin, cos, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1\n ];\n return new CSG.Matrix4x4(els);\n };\n\n // Matrix for rotation about arbitrary point and axis\n CSG.Matrix4x4.rotation = function(rotationCenter, rotationAxis, degrees) {\n rotationCenter = new CSG.Vector3D(rotationCenter);\n rotationAxis = new CSG.Vector3D(rotationAxis);\n var rotationPlane = CSG.Plane.fromNormalAndPoint(rotationAxis, rotationCenter);\n var orthobasis = new CSG.OrthoNormalBasis(rotationPlane);\n var transformation = CSG.Matrix4x4.translation(rotationCenter.negated());\n transformation = transformation.multiply(orthobasis.getProjectionMatrix());\n transformation = transformation.multiply(CSG.Matrix4x4.rotationZ(degrees));\n transformation = transformation.multiply(orthobasis.getInverseProjectionMatrix());\n transformation = transformation.multiply(CSG.Matrix4x4.translation(rotationCenter));\n return transformation;\n };\n\n // Create an affine matrix for translation:\n CSG.Matrix4x4.translation = function(v) {\n // parse as CSG.Vector3D, so we can pass an array or a CSG.Vector3D\n var vec = new CSG.Vector3D(v);\n var els = [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, vec.x, vec.y, vec.z, 1];\n return new CSG.Matrix4x4(els);\n };\n\n // Create an affine matrix for mirroring into an arbitrary plane:\n CSG.Matrix4x4.mirroring = function(plane) {\n var nx = plane.normal.x;\n var ny = plane.normal.y;\n var nz = plane.normal.z;\n var w = plane.w;\n var els = [\n (1.0 - 2.0 * nx * nx), (-2.0 * ny * nx), (-2.0 * nz * nx), 0,\n (-2.0 * nx * ny), (1.0 - 2.0 * ny * ny), (-2.0 * nz * ny), 0,\n (-2.0 * nx * nz), (-2.0 * ny * nz), (1.0 - 2.0 * nz * nz), 0,\n (2.0 * nx * w), (2.0 * ny * w), (2.0 * nz * w), 1\n ];\n return new CSG.Matrix4x4(els);\n };\n\n // Create an affine matrix for scaling:\n CSG.Matrix4x4.scaling = function(v) {\n // parse as CSG.Vector3D, so we can pass an array or a CSG.Vector3D\n var vec = new CSG.Vector3D(v);\n var els = [\n vec.x, 0, 0, 0, 0, vec.y, 0, 0, 0, 0, vec.z, 0, 0, 0, 0, 1\n ];\n return new CSG.Matrix4x4(els);\n };\n\n ///////////////////////////////////////////////////\n // # class Vector2D:\n // Represents a 2 element vector\n CSG.Vector2D = function(x, y) {\n if (arguments.length == 2) {\n this._x = parseFloat(x);\n this._y = parseFloat(y);\n } else {\n var ok = true;\n if (arguments.length == 1) {\n if (typeof(x) == \"object\") {\n if (x instanceof CSG.Vector2D) {\n this._x = x._x;\n this._y = x._y;\n } else if (x instanceof Array) {\n this._x = parseFloat(x[0]);\n this._y = parseFloat(x[1]);\n } else if (('x' in x) && ('y' in x)) {\n this._x = parseFloat(x.x);\n this._y = parseFloat(x.y);\n } else ok = false;\n } else {\n var v = parseFloat(x);\n this._x = v;\n this._y = v;\n }\n } else ok = false;\n if (ok) {\n if ((!CSG.IsFloat(this._x)) || (!CSG.IsFloat(this._y))) ok = false;\n }\n if (!ok) {\n throw new Error(\"wrong arguments\");\n }\n }\n };\n\n CSG.Vector2D.fromAngle = function(radians) {\n return CSG.Vector2D.fromAngleRadians(radians);\n };\n\n CSG.Vector2D.fromAngleDegrees = function(degrees) {\n var radians = Math.PI * degrees / 180;\n return CSG.Vector2D.fromAngleRadians(radians);\n };\n\n CSG.Vector2D.fromAngleRadians = function(radians) {\n return CSG.Vector2D.Create(Math.cos(radians), Math.sin(radians));\n };\n\n // This does the same as new CSG.Vector2D(x,y) but it doesn't go through the constructor\n // and the parameters are not validated. Is much faster.\n CSG.Vector2D.Create = function(x, y) {\n var result = Object.create(CSG.Vector2D.prototype);\n result._x = x;\n result._y = y;\n return result;\n };\n\n CSG.Vector2D.prototype = {\n get x() {\n return this._x;\n },\n get y() {\n return this._y;\n },\n\n set x(v) {\n throw new Error(\"Vector2D is immutable\");\n },\n set y(v) {\n throw new Error(\"Vector2D is immutable\");\n },\n\n // extend to a 3D vector by adding a z coordinate:\n toVector3D: function(z) {\n return new CSG.Vector3D(this._x, this._y, z);\n },\n\n equals: function(a) {\n return (this._x == a._x) && (this._y == a._y);\n },\n\n clone: function() {\n return CSG.Vector2D.Create(this._x, this._y);\n },\n\n negated: function() {\n return CSG.Vector2D.Create(-this._x, -this._y);\n },\n\n plus: function(a) {\n return CSG.Vector2D.Create(this._x + a._x, this._y + a._y);\n },\n\n minus: function(a) {\n return CSG.Vector2D.Create(this._x - a._x, this._y - a._y);\n },\n\n times: function(a) {\n return CSG.Vector2D.Create(this._x * a, this._y * a);\n },\n\n dividedBy: function(a) {\n return CSG.Vector2D.Create(this._x / a, this._y / a);\n },\n\n dot: function(a) {\n return this._x * a._x + this._y * a._y;\n },\n\n lerp: function(a, t) {\n return this.plus(a.minus(this).times(t));\n },\n\n length: function() {\n return Math.sqrt(this.dot(this));\n },\n\n distanceTo: function(a) {\n return this.minus(a).length();\n },\n\n distanceToSquared: function(a) {\n return this.minus(a).lengthSquared();\n },\n\n lengthSquared: function() {\n return this.dot(this);\n },\n\n unit: function() {\n return this.dividedBy(this.length());\n },\n\n cross: function(a) {\n return this._x * a._y - this._y * a._x;\n },\n\n // returns the vector rotated by 90 degrees clockwise\n normal: function() {\n return CSG.Vector2D.Create(this._y, -this._x);\n },\n\n // Right multiply by a 4x4 matrix (the vector is interpreted as a row vector)\n // Returns a new CSG.Vector2D\n multiply4x4: function(matrix4x4) {\n return matrix4x4.leftMultiply1x2Vector(this);\n },\n\n transform: function(matrix4x4) {\n return matrix4x4.leftMultiply1x2Vector(this);\n },\n\n angle: function() {\n return this.angleRadians();\n },\n\n angleDegrees: function() {\n var radians = this.angleRadians();\n return 180 * radians / Math.PI;\n },\n\n angleRadians: function() {\n // y=sin, x=cos\n return Math.atan2(this._y, this._x);\n },\n\n min: function(p) {\n return CSG.Vector2D.Create(\n Math.min(this._x, p._x), Math.min(this._y, p._y));\n },\n\n max: function(p) {\n return CSG.Vector2D.Create(\n Math.max(this._x, p._x), Math.max(this._y, p._y));\n },\n\n toString: function() {\n return \"(\" + this._x.toFixed(2) + \", \" + this._y.toFixed(2) + \")\";\n },\n\n abs: function() {\n return CSG.Vector2D.Create(Math.abs(this._x), Math.abs(this._y));\n },\n };\n\n\n // # class Line2D\n // Represents a directional line in 2D space\n // A line is parametrized by its normal vector (perpendicular to the line, rotated 90 degrees counter clockwise)\n // and w. The line passes through the point .times(w).\n // normal must be a unit vector!\n // Equation: p is on line if normal.dot(p)==w\n CSG.Line2D = function(normal, w) {\n normal = new CSG.Vector2D(normal);\n w = parseFloat(w);\n var l = normal.length();\n // normalize:\n w *= l;\n normal = normal.times(1.0 / l);\n this.normal = normal;\n this.w = w;\n };\n\n CSG.Line2D.fromPoints = function(p1, p2) {\n p1 = new CSG.Vector2D(p1);\n p2 = new CSG.Vector2D(p2);\n var direction = p2.minus(p1);\n var normal = direction.normal().negated().unit();\n var w = p1.dot(normal);\n return new CSG.Line2D(normal, w);\n };\n\n CSG.Line2D.prototype = {\n // same line but opposite direction:\n reverse: function() {\n return new CSG.Line2D(this.normal.negated(), -this.w);\n },\n\n equals: function(l) {\n return (l.normal.equals(this.normal) && (l.w == this.w));\n },\n\n origin: function() {\n return this.normal.times(this.w);\n },\n\n direction: function() {\n return this.normal.normal();\n },\n\n xAtY: function(y) {\n // (py == y) && (normal * p == w)\n // -> px = (w - normal._y * y) / normal.x\n var x = (this.w - this.normal._y * y) / this.normal.x;\n return x;\n },\n\n absDistanceToPoint: function(point) {\n point = new CSG.Vector2D(point);\n var point_projected = point.dot(this.normal);\n var distance = Math.abs(point_projected - this.w);\n return distance;\n },\n /*FIXME: has error - origin is not defined, the method is never used\n closestPoint: function(point) {\n point = new CSG.Vector2D(point);\n var vector = point.dot(this.direction());\n return origin.plus(vector);\n },\n */\n\n // intersection between two lines, returns point as Vector2D\n intersectWithLine: function(line2d) {\n var point = CSG.solve2Linear(this.normal.x, this.normal.y, line2d.normal.x, line2d.normal.y, this.w, line2d.w);\n point = new CSG.Vector2D(point); // make vector2d\n return point;\n },\n\n transform: function(matrix4x4) {\n var origin = new CSG.Vector2D(0, 0);\n var pointOnPlane = this.normal.times(this.w);\n var neworigin = origin.multiply4x4(matrix4x4);\n var neworiginPlusNormal = this.normal.multiply4x4(matrix4x4);\n var newnormal = neworiginPlusNormal.minus(neworigin);\n var newpointOnPlane = pointOnPlane.multiply4x4(matrix4x4);\n var neww = newnormal.dot(newpointOnPlane);\n return new CSG.Line2D(newnormal, neww);\n }\n };\n\n // # class Line3D\n // Represents a line in 3D space\n // direction must be a unit vector\n // point is a random point on the line\n CSG.Line3D = function(point, direction) {\n point = new CSG.Vector3D(point);\n direction = new CSG.Vector3D(direction);\n this.point = point;\n this.direction = direction.unit();\n };\n\n CSG.Line3D.fromPoints = function(p1, p2) {\n p1 = new CSG.Vector3D(p1);\n p2 = new CSG.Vector3D(p2);\n var direction = p2.minus(p1);\n return new CSG.Line3D(p1, direction);\n };\n\n CSG.Line3D.fromPlanes = function(p1, p2) {\n var direction = p1.normal.cross(p2.normal);\n var l = direction.length();\n if (l < 1e-10) {\n throw new Error(\"Parallel planes\");\n }\n direction = direction.times(1.0 / l);\n\n var mabsx = Math.abs(direction.x);\n var mabsy = Math.abs(direction.y);\n var mabsz = Math.abs(direction.z);\n var origin;\n if ((mabsx >= mabsy) && (mabsx >= mabsz)) {\n // direction vector is mostly pointing towards x\n // find a point p for which x is zero:\n var r = CSG.solve2Linear(p1.normal.y, p1.normal.z, p2.normal.y, p2.normal.z, p1.w, p2.w);\n origin = new CSG.Vector3D(0, r[0], r[1]);\n } else if ((mabsy >= mabsx) && (mabsy >= mabsz)) {\n // find a point p for which y is zero:\n var r = CSG.solve2Linear(p1.normal.x, p1.normal.z, p2.normal.x, p2.normal.z, p1.w, p2.w);\n origin = new CSG.Vector3D(r[0], 0, r[1]);\n } else {\n // find a point p for which z is zero:\n var r = CSG.solve2Linear(p1.normal.x, p1.normal.y, p2.normal.x, p2.normal.y, p1.w, p2.w);\n origin = new CSG.Vector3D(r[0], r[1], 0);\n }\n return new CSG.Line3D(origin, direction);\n };\n\n\n CSG.Line3D.prototype = {\n intersectWithPlane: function(plane) {\n // plane: plane.normal * p = plane.w\n // line: p=line.point + labda * line.direction\n var labda = (plane.w - plane.normal.dot(this.point)) / plane.normal.dot(this.direction);\n var point = this.point.plus(this.direction.times(labda));\n return point;\n },\n\n clone: function(line) {\n return new CSG.Line3D(this.point.clone(), this.direction.clone());\n },\n\n reverse: function() {\n return new CSG.Line3D(this.point.clone(), this.direction.negated());\n },\n\n transform: function(matrix4x4) {\n var newpoint = this.point.multiply4x4(matrix4x4);\n var pointPlusDirection = this.point.plus(this.direction);\n var newPointPlusDirection = pointPlusDirection.multiply4x4(matrix4x4);\n var newdirection = newPointPlusDirection.minus(newpoint);\n return new CSG.Line3D(newpoint, newdirection);\n },\n\n closestPointOnLine: function(point) {\n point = new CSG.Vector3D(point);\n var t = point.minus(this.point).dot(this.direction) / this.direction.dot(this.direction);\n var closestpoint = this.point.plus(this.direction.times(t));\n return closestpoint;\n },\n\n distanceToPoint: function(point) {\n point = new CSG.Vector3D(point);\n var closestpoint = this.closestPointOnLine(point);\n var distancevector = point.minus(closestpoint);\n var distance = distancevector.length();\n return distance;\n },\n\n equals: function(line3d) {\n if (!this.direction.equals(line3d.direction)) return false;\n var distance = this.distanceToPoint(line3d.point);\n if (distance > 1e-8) return false;\n return true;\n }\n };\n\n\n // # class OrthoNormalBasis\n // Reprojects points on a 3D plane onto a 2D plane\n // or from a 2D plane back onto the 3D plane\n CSG.OrthoNormalBasis = function(plane, rightvector) {\n if (arguments.length < 2) {\n // choose an arbitrary right hand vector, making sure it is somewhat orthogonal to the plane normal:\n rightvector = plane.normal.randomNonParallelVector();\n } else {\n rightvector = new CSG.Vector3D(rightvector);\n }\n this.v = plane.normal.cross(rightvector).unit();\n this.u = this.v.cross(plane.normal);\n this.plane = plane;\n this.planeorigin = plane.normal.times(plane.w);\n };\n\n // Get an orthonormal basis for the standard XYZ planes.\n // Parameters: the names of two 3D axes. The 2d x axis will map to the first given 3D axis, the 2d y \n // axis will map to the second.\n // Prepend the axis with a \"-\" to invert the direction of this axis.\n // For example: CSG.OrthoNormalBasis.GetCartesian(\"-Y\",\"Z\")\n // will return an orthonormal basis where the 2d X axis maps to the 3D inverted Y axis, and\n // the 2d Y axis maps to the 3D Z axis.\n CSG.OrthoNormalBasis.GetCartesian = function(xaxisid, yaxisid) {\n var axisid = xaxisid + \"/\" + yaxisid;\n var planenormal, rightvector;\n if (axisid == \"X/Y\") {\n planenormal = [0, 0, 1];\n rightvector = [1, 0, 0];\n } else if (axisid == \"Y/-X\") {\n planenormal = [0, 0, 1];\n rightvector = [0, 1, 0];\n } else if (axisid == \"-X/-Y\") {\n planenormal = [0, 0, 1];\n rightvector = [-1, 0, 0];\n } else if (axisid == \"-Y/X\") {\n planenormal = [0, 0, 1];\n rightvector = [0, -1, 0];\n } else if (axisid == \"-X/Y\") {\n planenormal = [0, 0, -1];\n rightvector = [-1, 0, 0];\n } else if (axisid == \"-Y/-X\") {\n planenormal = [0, 0, -1];\n rightvector = [0, -1, 0];\n } else if (axisid == \"X/-Y\") {\n planenormal = [0, 0, -1];\n rightvector = [1, 0, 0];\n } else if (axisid == \"Y/X\") {\n planenormal = [0, 0, -1];\n rightvector = [0, 1, 0];\n } else if (axisid == \"X/Z\") {\n planenormal = [0, -1, 0];\n rightvector = [1, 0, 0];\n } else if (axisid == \"Z/-X\") {\n planenormal = [0, -1, 0];\n rightvector = [0, 0, 1];\n } else if (axisid == \"-X/-Z\") {\n planenormal = [0, -1, 0];\n rightvector = [-1, 0, 0];\n } else if (axisid == \"-Z/X\") {\n planenormal = [0, -1, 0];\n rightvector = [0, 0, -1];\n } else if (axisid == \"-X/Z\") {\n planenormal = [0, 1, 0];\n rightvector = [-1, 0, 0];\n } else if (axisid == \"-Z/-X\") {\n planenormal = [0, 1, 0];\n rightvector = [0, 0, -1];\n } else if (axisid == \"X/-Z\") {\n planenormal = [0, 1, 0];\n rightvector = [1, 0, 0];\n } else if (axisid == \"Z/X\") {\n planenormal = [0, 1, 0];\n rightvector = [0, 0, 1];\n } else if (axisid == \"Y/Z\") {\n planenormal = [1, 0, 0];\n rightvector = [0, 1, 0];\n } else if (axisid == \"Z/-Y\") {\n planenormal = [1, 0, 0];\n rightvector = [0, 0, 1];\n } else if (axisid == \"-Y/-Z\") {\n planenormal = [1, 0, 0];\n rightvector = [0, -1, 0];\n } else if (axisid == \"-Z/Y\") {\n planenormal = [1, 0, 0];\n rightvector = [0, 0, -1];\n } else if (axisid == \"-Y/Z\") {\n planenormal = [-1, 0, 0];\n rightvector = [0, -1, 0];\n } else if (axisid == \"-Z/-Y\") {\n planenormal = [-1, 0, 0];\n rightvector = [0, 0, -1];\n } else if (axisid == \"Y/-Z\") {\n planenormal = [-1, 0, 0];\n rightvector = [0, 1, 0];\n } else if (axisid == \"Z/Y\") {\n planenormal = [-1, 0, 0];\n rightvector = [0, 0, 1];\n } else {\n throw new Error(\"CSG.OrthoNormalBasis.GetCartesian: invalid combination of axis identifiers. Should pass two string arguments from [X,Y,Z,-X,-Y,-Z], being two different axes.\");\n }\n return new CSG.OrthoNormalBasis(new CSG.Plane(new CSG.Vector3D(planenormal), 0), new CSG.Vector3D(rightvector));\n };\n\n /*\n // test code for CSG.OrthoNormalBasis.GetCartesian()\n CSG.OrthoNormalBasis.GetCartesian_Test=function() {\n var axisnames=[\"X\",\"Y\",\"Z\",\"-X\",\"-Y\",\"-Z\"];\n var axisvectors=[[1,0,0], [0,1,0], [0,0,1], [-1,0,0], [0,-1,0], [0,0,-1]];\n for(var axis1=0; axis1 < 3; axis1++) {\n for(var axis1inverted=0; axis1inverted < 2; axis1inverted++) {\n var axis1name=axisnames[axis1+3*axis1inverted];\n var axis1vector=axisvectors[axis1+3*axis1inverted];\n for(var axis2=0; axis2 < 3; axis2++) {\n if(axis2 != axis1) {\n for(var axis2inverted=0; axis2inverted < 2; axis2inverted++) {\n var axis2name=axisnames[axis2+3*axis2inverted];\n var axis2vector=axisvectors[axis2+3*axis2inverted];\n var orthobasis=CSG.OrthoNormalBasis.GetCartesian(axis1name, axis2name);\n var test1=orthobasis.to3D(new CSG.Vector2D([1,0]));\n var test2=orthobasis.to3D(new CSG.Vector2D([0,1]));\n var expected1=new CSG.Vector3D(axis1vector);\n var expected2=new CSG.Vector3D(axis2vector);\n var d1=test1.distanceTo(expected1);\n var d2=test2.distanceTo(expected2);\n if( (d1 > 0.01) || (d2 > 0.01) ) {\n throw new Error(\"Wrong!\");\n }}}}}}\n throw new Error(\"OK\");\n };\n */\n\n // The z=0 plane, with the 3D x and y vectors mapped to the 2D x and y vector\n CSG.OrthoNormalBasis.Z0Plane = function() {\n var plane = new CSG.Plane(new CSG.Vector3D([0, 0, 1]), 0);\n return new CSG.OrthoNormalBasis(plane, new CSG.Vector3D([1, 0, 0]));\n };\n\n CSG.OrthoNormalBasis.prototype = {\n getProjectionMatrix: function() {\n return new CSG.Matrix4x4([\n this.u.x, this.v.x, this.plane.normal.x, 0,\n this.u.y, this.v.y, this.plane.normal.y, 0,\n this.u.z, this.v.z, this.plane.normal.z, 0,\n 0, 0, -this.plane.w, 1\n ]);\n },\n\n getInverseProjectionMatrix: function() {\n var p = this.plane.normal.times(this.plane.w);\n return new CSG.Matrix4x4([\n this.u.x, this.u.y, this.u.z, 0,\n this.v.x, this.v.y, this.v.z, 0,\n this.plane.normal.x, this.plane.normal.y, this.plane.normal.z, 0,\n p.x, p.y, p.z, 1\n ]);\n },\n\n to2D: function(vec3) {\n return new CSG.Vector2D(vec3.dot(this.u), vec3.dot(this.v));\n },\n\n to3D: function(vec2) {\n return this.planeorigin.plus(this.u.times(vec2.x)).plus(this.v.times(vec2.y));\n },\n\n line3Dto2D: function(line3d) {\n var a = line3d.point;\n var b = line3d.direction.plus(a);\n var a2d = this.to2D(a);\n var b2d = this.to2D(b);\n return CSG.Line2D.fromPoints(a2d, b2d);\n },\n\n line2Dto3D: function(line2d) {\n var a = line2d.origin();\n var b = line2d.direction().plus(a);\n var a3d = this.to3D(a);\n var b3d = this.to3D(b);\n return CSG.Line3D.fromPoints(a3d, b3d);\n },\n\n transform: function(matrix4x4) {\n // todo: this may not work properly in case of mirroring\n var newplane = this.plane.transform(matrix4x4);\n var rightpoint_transformed = this.u.transform(matrix4x4);\n var origin_transformed = new CSG.Vector3D(0, 0, 0).transform(matrix4x4);\n var newrighthandvector = rightpoint_transformed.minus(origin_transformed);\n var newbasis = new CSG.OrthoNormalBasis(newplane, newrighthandvector);\n return newbasis;\n }\n };\n\n function insertSorted(array, element, comparefunc) {\n var leftbound = 0;\n var rightbound = array.length;\n while (rightbound > leftbound) {\n var testindex = Math.floor((leftbound + rightbound) / 2);\n var testelement = array[testindex];\n var compareresult = comparefunc(element, testelement);\n if (compareresult > 0) // element > testelement\n {\n leftbound = testindex + 1;\n } else {\n rightbound = testindex;\n }\n }\n array.splice(leftbound, 0, element);\n }\n\n // Get the x coordinate of a point with a certain y coordinate, interpolated between two\n // points (CSG.Vector2D).\n // Interpolation is robust even if the points have the same y coordinate\n CSG.interpolateBetween2DPointsForY = function(point1, point2, y) {\n var f1 = y - point1.y;\n var f2 = point2.y - point1.y;\n if (f2 < 0) {\n f1 = -f1;\n f2 = -f2;\n }\n var t;\n if (f1 <= 0) {\n t = 0.0;\n } else if (f1 >= f2) {\n t = 1.0;\n } else if (f2 < 1e-10) {\n t = 0.5;\n } else {\n t = f1 / f2;\n }\n var result = point1.x + t * (point2.x - point1.x);\n return result;\n };\n\n // Retesselation function for a set of coplanar polygons. See the introduction at the top of\n // this file.\n CSG.reTesselateCoplanarPolygons = function(sourcepolygons, destpolygons) {\n var EPS = 1e-5;\n\n var numpolygons = sourcepolygons.length;\n if (numpolygons > 0) {\n var plane = sourcepolygons[0].plane;\n var shared = sourcepolygons[0].shared;\n var orthobasis = new CSG.OrthoNormalBasis(plane);\n var polygonvertices2d = []; // array of array of CSG.Vector2D\n var polygontopvertexindexes = []; // array of indexes of topmost vertex per polygon\n var topy2polygonindexes = {};\n var ycoordinatetopolygonindexes = {};\n\n var xcoordinatebins = {};\n var ycoordinatebins = {};\n\n // convert all polygon vertices to 2D\n // Make a list of all encountered y coordinates\n // And build a map of all polygons that have a vertex at a certain y coordinate:\n var ycoordinateBinningFactor = 1.0 / EPS * 10;\n for (var polygonindex = 0; polygonindex < numpolygons; polygonindex++) {\n var poly3d = sourcepolygons[polygonindex];\n var vertices2d = [];\n var numvertices = poly3d.vertices.length;\n var minindex = -1;\n if (numvertices > 0) {\n var miny, maxy, maxindex;\n for (var i = 0; i < numvertices; i++) {\n var pos2d = orthobasis.to2D(poly3d.vertices[i].pos);\n // perform binning of y coordinates: If we have multiple vertices very\n // close to each other, give them the same y coordinate:\n var ycoordinatebin = Math.floor(pos2d.y * ycoordinateBinningFactor);\n var newy;\n if (ycoordinatebin in ycoordinatebins) {\n newy = ycoordinatebins[ycoordinatebin];\n } else if (ycoordinatebin + 1 in ycoordinatebins) {\n newy = ycoordinatebins[ycoordinatebin + 1];\n } else if (ycoordinatebin - 1 in ycoordinatebins) {\n newy = ycoordinatebins[ycoordinatebin - 1];\n } else {\n newy = pos2d.y;\n ycoordinatebins[ycoordinatebin] = pos2d.y;\n }\n pos2d = CSG.Vector2D.Create(pos2d.x, newy);\n vertices2d.push(pos2d);\n var y = pos2d.y;\n if ((i === 0) || (y < miny)) {\n miny = y;\n minindex = i;\n }\n if ((i === 0) || (y > maxy)) {\n maxy = y;\n maxindex = i;\n }\n if (!(y in ycoordinatetopolygonindexes)) {\n ycoordinatetopolygonindexes[y] = {};\n }\n ycoordinatetopolygonindexes[y][polygonindex] = true;\n }\n if (miny >= maxy) {\n // degenerate polygon, all vertices have same y coordinate. Just ignore it from now:\n vertices2d = [];\n numvertices = 0;\n minindex = -1;\n } else {\n if (!(miny in topy2polygonindexes)) {\n topy2polygonindexes[miny] = [];\n }\n topy2polygonindexes[miny].push(polygonindex);\n }\n } // if(numvertices > 0)\n // reverse the vertex order:\n vertices2d.reverse();\n minindex = numvertices - minindex - 1;\n polygonvertices2d.push(vertices2d);\n polygontopvertexindexes.push(minindex);\n }\n var ycoordinates = [];\n for (var ycoordinate in ycoordinatetopolygonindexes) ycoordinates.push(ycoordinate);\n ycoordinates.sort(fnNumberSort);\n\n // Now we will iterate over all y coordinates, from lowest to highest y coordinate\n // activepolygons: source polygons that are 'active', i.e. intersect with our y coordinate\n // Is sorted so the polygons are in left to right order\n // Each element in activepolygons has these properties:\n // polygonindex: the index of the source polygon (i.e. an index into the sourcepolygons\n // and polygonvertices2d arrays)\n // leftvertexindex: the index of the vertex at the left side of the polygon (lowest x)\n // that is at or just above the current y coordinate\n // rightvertexindex: dito at right hand side of polygon\n // topleft, bottomleft: coordinates of the left side of the polygon crossing the current y coordinate\n // topright, bottomright: coordinates of the right hand side of the polygon crossing the current y coordinate\n var activepolygons = [];\n var prevoutpolygonrow = [];\n for (var yindex = 0; yindex < ycoordinates.length; yindex++) {\n var newoutpolygonrow = [];\n var ycoordinate_as_string = ycoordinates[yindex];\n var ycoordinate = Number(ycoordinate_as_string);\n\n // update activepolygons for this y coordinate:\n // - Remove any polygons that end at this y coordinate\n // - update leftvertexindex and rightvertexindex (which point to the current vertex index\n // at the the left and right side of the polygon\n // Iterate over all polygons that have a corner at this y coordinate:\n var polygonindexeswithcorner = ycoordinatetopolygonindexes[ycoordinate_as_string];\n for (var activepolygonindex = 0; activepolygonindex < activepolygons.length; ++activepolygonindex) {\n var activepolygon = activepolygons[activepolygonindex];\n var polygonindex = activepolygon.polygonindex;\n if (polygonindexeswithcorner[polygonindex]) {\n // this active polygon has a corner at this y coordinate:\n var vertices2d = polygonvertices2d[polygonindex];\n var numvertices = vertices2d.length;\n var newleftvertexindex = activepolygon.leftvertexindex;\n var newrightvertexindex = activepolygon.rightvertexindex;\n // See if we need to increase leftvertexindex or decrease rightvertexindex:\n while (true) {\n var nextleftvertexindex = newleftvertexindex + 1;\n if (nextleftvertexindex >= numvertices) nextleftvertexindex = 0;\n if (vertices2d[nextleftvertexindex].y != ycoordinate) break;\n newleftvertexindex = nextleftvertexindex;\n }\n var nextrightvertexindex = newrightvertexindex - 1;\n if (nextrightvertexindex < 0) nextrightvertexindex = numvertices - 1;\n if (vertices2d[nextrightvertexindex].y == ycoordinate) {\n newrightvertexindex = nextrightvertexindex;\n }\n if ((newleftvertexindex != activepolygon.leftvertexindex) && (newleftvertexindex == newrightvertexindex)) {\n // We have increased leftvertexindex or decreased rightvertexindex, and now they point to the same vertex\n // This means that this is the bottom point of the polygon. We'll remove it:\n activepolygons.splice(activepolygonindex, 1);\n --activepolygonindex;\n } else {\n activepolygon.leftvertexindex = newleftvertexindex;\n activepolygon.rightvertexindex = newrightvertexindex;\n activepolygon.topleft = vertices2d[newleftvertexindex];\n activepolygon.topright = vertices2d[newrightvertexindex];\n var nextleftvertexindex = newleftvertexindex + 1;\n if (nextleftvertexindex >= numvertices) nextleftvertexindex = 0;\n activepolygon.bottomleft = vertices2d[nextleftvertexindex];\n var nextrightvertexindex = newrightvertexindex - 1;\n if (nextrightvertexindex < 0) nextrightvertexindex = numvertices - 1;\n activepolygon.bottomright = vertices2d[nextrightvertexindex];\n }\n } // if polygon has corner here\n } // for activepolygonindex\n var nextycoordinate;\n if (yindex >= ycoordinates.length - 1) {\n // last row, all polygons must be finished here:\n activepolygons = [];\n nextycoordinate = null;\n } else // yindex < ycoordinates.length-1\n {\n nextycoordinate = Number(ycoordinates[yindex + 1]);\n var middleycoordinate = 0.5 * (ycoordinate + nextycoordinate);\n // update activepolygons by adding any polygons that start here:\n var startingpolygonindexes = topy2polygonindexes[ycoordinate_as_string];\n for (var polygonindex_key in startingpolygonindexes) {\n var polygonindex = startingpolygonindexes[polygonindex_key];\n var vertices2d = polygonvertices2d[polygonindex];\n var numvertices = vertices2d.length;\n var topvertexindex = polygontopvertexindexes[polygonindex];\n // the top of the polygon may be a horizontal line. In that case topvertexindex can point to any point on this line.\n // Find the left and right topmost vertices which have the current y coordinate:\n var topleftvertexindex = topvertexindex;\n while (true) {\n var i = topleftvertexindex + 1;\n if (i >= numvertices) i = 0;\n if (vertices2d[i].y != ycoordinate) break;\n if (i == topvertexindex) break; // should not happen, but just to prevent endless loops\n topleftvertexindex = i;\n }\n var toprightvertexindex = topvertexindex;\n while (true) {\n var i = toprightvertexindex - 1;\n if (i < 0) i = numvertices - 1;\n if (vertices2d[i].y != ycoordinate) break;\n if (i == topleftvertexindex) break; // should not happen, but just to prevent endless loops\n toprightvertexindex = i;\n }\n var nextleftvertexindex = topleftvertexindex + 1;\n if (nextleftvertexindex >= numvertices) nextleftvertexindex = 0;\n var nextrightvertexindex = toprightvertexindex - 1;\n if (nextrightvertexindex < 0) nextrightvertexindex = numvertices - 1;\n var newactivepolygon = {\n polygonindex: polygonindex,\n leftvertexindex: topleftvertexindex,\n rightvertexindex: toprightvertexindex,\n topleft: vertices2d[topleftvertexindex],\n topright: vertices2d[toprightvertexindex],\n bottomleft: vertices2d[nextleftvertexindex],\n bottomright: vertices2d[nextrightvertexindex],\n };\n insertSorted(activepolygons, newactivepolygon, function(el1, el2) {\n var x1 = CSG.interpolateBetween2DPointsForY(\n el1.topleft, el1.bottomleft, middleycoordinate);\n var x2 = CSG.interpolateBetween2DPointsForY(\n el2.topleft, el2.bottomleft, middleycoordinate);\n if (x1 > x2) return 1;\n if (x1 < x2) return -1;\n return 0;\n });\n } // for(var polygonindex in startingpolygonindexes)\n } // yindex < ycoordinates.length-1\n //if( (yindex == ycoordinates.length-1) || (nextycoordinate - ycoordinate > EPS) )\n if (true) {\n // Now activepolygons is up to date\n // Build the output polygons for the next row in newoutpolygonrow:\n for (var activepolygon_key in activepolygons) {\n var activepolygon = activepolygons[activepolygon_key];\n var polygonindex = activepolygon.polygonindex;\n var vertices2d = polygonvertices2d[polygonindex];\n var numvertices = vertices2d.length;\n\n var x = CSG.interpolateBetween2DPointsForY(activepolygon.topleft, activepolygon.bottomleft, ycoordinate);\n var topleft = CSG.Vector2D.Create(x, ycoordinate);\n x = CSG.interpolateBetween2DPointsForY(activepolygon.topright, activepolygon.bottomright, ycoordinate);\n var topright = CSG.Vector2D.Create(x, ycoordinate);\n x = CSG.interpolateBetween2DPointsForY(activepolygon.topleft, activepolygon.bottomleft, nextycoordinate);\n var bottomleft = CSG.Vector2D.Create(x, nextycoordinate);\n x = CSG.interpolateBetween2DPointsForY(activepolygon.topright, activepolygon.bottomright, nextycoordinate);\n var bottomright = CSG.Vector2D.Create(x, nextycoordinate);\n var outpolygon = {\n topleft: topleft,\n topright: topright,\n bottomleft: bottomleft,\n bottomright: bottomright,\n leftline: CSG.Line2D.fromPoints(topleft, bottomleft),\n rightline: CSG.Line2D.fromPoints(bottomright, topright)\n };\n if (newoutpolygonrow.length > 0) {\n var prevoutpolygon = newoutpolygonrow[newoutpolygonrow.length - 1];\n var d1 = outpolygon.topleft.distanceTo(prevoutpolygon.topright);\n var d2 = outpolygon.bottomleft.distanceTo(prevoutpolygon.bottomright);\n if ((d1 < EPS) && (d2 < EPS)) {\n // we can join this polygon with the one to the left:\n outpolygon.topleft = prevoutpolygon.topleft;\n outpolygon.leftline = prevoutpolygon.leftline;\n outpolygon.bottomleft = prevoutpolygon.bottomleft;\n newoutpolygonrow.splice(newoutpolygonrow.length - 1, 1);\n }\n }\n newoutpolygonrow.push(outpolygon);\n } // for(activepolygon in activepolygons)\n if (yindex > 0) {\n // try to match the new polygons against the previous row:\n var prevcontinuedindexes = {};\n var matchedindexes = {};\n for (var i = 0; i < newoutpolygonrow.length; i++) {\n var thispolygon = newoutpolygonrow[i];\n for (var ii = 0; ii < prevoutpolygonrow.length; ii++) {\n if (!matchedindexes[ii]) // not already processed?\n {\n // We have a match if the sidelines are equal or if the top coordinates\n // are on the sidelines of the previous polygon\n var prevpolygon = prevoutpolygonrow[ii];\n if (prevpolygon.bottomleft.distanceTo(thispolygon.topleft) < EPS) {\n if (prevpolygon.bottomright.distanceTo(thispolygon.topright) < EPS) {\n // Yes, the top of this polygon matches the bottom of the previous:\n matchedindexes[ii] = true;\n // Now check if the joined polygon would remain convex:\n var d1 = thispolygon.leftline.direction().x - prevpolygon.leftline.direction().x;\n var d2 = thispolygon.rightline.direction().x - prevpolygon.rightline.direction().x;\n var leftlinecontinues = Math.abs(d1) < EPS;\n var rightlinecontinues = Math.abs(d2) < EPS;\n var leftlineisconvex = leftlinecontinues || (d1 >= 0);\n var rightlineisconvex = rightlinecontinues || (d2 >= 0);\n if (leftlineisconvex && rightlineisconvex) {\n // yes, both sides have convex corners:\n // This polygon will continue the previous polygon\n thispolygon.outpolygon = prevpolygon.outpolygon;\n thispolygon.leftlinecontinues = leftlinecontinues;\n thispolygon.rightlinecontinues = rightlinecontinues;\n prevcontinuedindexes[ii] = true;\n }\n break;\n }\n }\n } // if(!prevcontinuedindexes[ii])\n } // for ii\n } // for i\n for (var ii = 0; ii < prevoutpolygonrow.length; ii++) {\n if (!prevcontinuedindexes[ii]) {\n // polygon ends here\n // Finish the polygon with the last point(s):\n var prevpolygon = prevoutpolygonrow[ii];\n prevpolygon.outpolygon.rightpoints.push(prevpolygon.bottomright);\n if (prevpolygon.bottomright.distanceTo(prevpolygon.bottomleft) > EPS) {\n // polygon ends with a horizontal line:\n prevpolygon.outpolygon.leftpoints.push(prevpolygon.bottomleft);\n }\n // reverse the left half so we get a counterclockwise circle:\n prevpolygon.outpolygon.leftpoints.reverse();\n var points2d = prevpolygon.outpolygon.rightpoints.concat(prevpolygon.outpolygon.leftpoints);\n var vertices3d = [];\n points2d.map(function(point2d) {\n var point3d = orthobasis.to3D(point2d);\n var vertex3d = new CSG.Vertex(point3d);\n vertices3d.push(vertex3d);\n });\n var polygon = new CSG.Polygon(vertices3d, shared, plane);\n destpolygons.push(polygon);\n }\n }\n } // if(yindex > 0)\n for (var i = 0; i < newoutpolygonrow.length; i++) {\n var thispolygon = newoutpolygonrow[i];\n if (!thispolygon.outpolygon) {\n // polygon starts here:\n thispolygon.outpolygon = {\n leftpoints: [],\n rightpoints: []\n };\n thispolygon.outpolygon.leftpoints.push(thispolygon.topleft);\n if (thispolygon.topleft.distanceTo(thispolygon.topright) > EPS) {\n // we have a horizontal line at the top:\n thispolygon.outpolygon.rightpoints.push(thispolygon.topright);\n }\n } else {\n // continuation of a previous row\n if (!thispolygon.leftlinecontinues) {\n thispolygon.outpolygon.leftpoints.push(thispolygon.topleft);\n }\n if (!thispolygon.rightlinecontinues) {\n thispolygon.outpolygon.rightpoints.push(thispolygon.topright);\n }\n }\n }\n prevoutpolygonrow = newoutpolygonrow;\n }\n } // for yindex\n } // if(numpolygons > 0)\n };\n\n ////////////////////////////////\n // ## class fuzzyFactory\n // This class acts as a factory for objects. We can search for an object with approximately\n // the desired properties (say a rectangle with width 2 and height 1)\n // The lookupOrCreate() method looks for an existing object (for example it may find an existing rectangle\n // with width 2.0001 and height 0.999. If no object is found, the user supplied callback is\n // called, which should generate a new object. The new object is inserted into the database\n // so it can be found by future lookupOrCreate() calls.\n // Constructor:\n // numdimensions: the number of parameters for each object\n // for example for a 2D rectangle this would be 2\n // tolerance: The maximum difference for each parameter allowed to be considered a match\n CSG.fuzzyFactory = function(numdimensions, tolerance) {\n this.lookuptable = {};\n this.multiplier = 1.0 / tolerance;\n };\n\n CSG.fuzzyFactory.prototype = {\n // var obj = f.lookupOrCreate([el1, el2, el3], function(elements) {/* create the new object */});\n // Performs a fuzzy lookup of the object with the specified elements.\n // If found, returns the existing object\n // If not found, calls the supplied callback function which should create a new object with\n // the specified properties. This object is inserted in the lookup database.\n lookupOrCreate: function(els, creatorCallback) {\n var hash = \"\";\n var multiplier = this.multiplier;\n els.forEach(function(el) {\n var valueQuantized = Math.round(el * multiplier);\n hash += valueQuantized + \"/\";\n });\n if (hash in this.lookuptable) {\n return this.lookuptable[hash];\n } else {\n var object = creatorCallback(els);\n var hashparts = els.map(function(el) {\n var q0 = Math.floor(el * multiplier);\n var q1 = q0 + 1;\n return [\"\" + q0 + \"/\", \"\" + q1 + \"/\"];\n });\n var numelements = els.length;\n var numhashes = 1 << numelements;\n for (var hashmask = 0; hashmask < numhashes; ++hashmask) {\n var hashmask_shifted = hashmask;\n hash = \"\";\n hashparts.forEach(function(hashpart) {\n hash += hashpart[hashmask_shifted & 1];\n hashmask_shifted >>= 1;\n });\n this.lookuptable[hash] = object;\n }\n return object;\n }\n },\n };\n\n\n //////////////////////////////////////\n CSG.fuzzyCSGFactory = function() {\n this.vertexfactory = new CSG.fuzzyFactory(3, 1e-5);\n this.planefactory = new CSG.fuzzyFactory(4, 1e-5);\n this.polygonsharedfactory = {};\n };\n\n CSG.fuzzyCSGFactory.prototype = {\n getPolygonShared: function(sourceshared) {\n var hash = sourceshared.getHash();\n if (hash in this.polygonsharedfactory) {\n return this.polygonsharedfactory[hash];\n } else {\n this.polygonsharedfactory[hash] = sourceshared;\n return sourceshared;\n }\n },\n\n getVertex: function(sourcevertex) {\n var elements = [sourcevertex.pos._x, sourcevertex.pos._y, sourcevertex.pos._z];\n var result = this.vertexfactory.lookupOrCreate(elements, function(els) {\n return sourcevertex;\n });\n return result;\n },\n\n getPlane: function(sourceplane) {\n var elements = [sourceplane.normal._x, sourceplane.normal._y, sourceplane.normal._z, sourceplane.w];\n var result = this.planefactory.lookupOrCreate(elements, function(els) {\n return sourceplane;\n });\n return result;\n },\n\n getPolygon: function(sourcepolygon) {\n var newplane = this.getPlane(sourcepolygon.plane);\n var newshared = this.getPolygonShared(sourcepolygon.shared);\n var _this = this;\n var newvertices = sourcepolygon.vertices.map(function(vertex) {\n return _this.getVertex(vertex);\n });\n // two vertices that were originally very close may now have become\n // truly identical (referring to the same CSG.Vertex object).\n // Remove duplicate vertices:\n var newvertices_dedup = [];\n if(newvertices.length > 0) {\n var prevvertextag = newvertices[newvertices.length-1].getTag();\n newvertices.forEach(function(vertex) {\n var vertextag = vertex.getTag();\n if(vertextag != prevvertextag)\n {\n newvertices_dedup.push(vertex);\n }\n prevvertextag = vertextag;\n });\n }\n // If it's degenerate, remove all vertices:\n if(newvertices_dedup.length < 3) {\n newvertices_dedup = [];\n }\n return new CSG.Polygon(newvertices_dedup, newshared, newplane);\n },\n\n getCSG: function(sourcecsg) {\n var _this = this;\n var newpolygons = [];\n sourcecsg.polygons.forEach(function(polygon) {\n var newpolygon = _this.getPolygon(polygon);\n // see getPolygon above: we may get a polygon with no vertices, discard it:\n if(newpolygon.vertices.length >= 3)\n {\n newpolygons.push(newpolygon);\n }\n });\n return CSG.fromPolygons(newpolygons);\n }\n };\n\n //////////////////////////////////////\n // Tag factory: we can request a unique tag through CSG.getTag()\n CSG.staticTag = 1;\n\n CSG.getTag = function() {\n return CSG.staticTag++;\n };\n\n //////////////////////////////////////\n // # Class Properties\n // This class is used to store properties of a solid\n // A property can for example be a CSG.Vertex, a CSG.Plane or a CSG.Line3D\n // Whenever an affine transform is applied to the CSG solid, all its properties are\n // transformed as well.\n // The properties can be stored in a complex nested structure (using arrays and objects)\n CSG.Properties = function() {};\n\n CSG.Properties.prototype = {\n _transform: function(matrix4x4) {\n var result = new CSG.Properties();\n CSG.Properties.transformObj(this, result, matrix4x4);\n return result;\n },\n _merge: function(otherproperties) {\n var result = new CSG.Properties();\n CSG.Properties.cloneObj(this, result);\n CSG.Properties.addFrom(result, otherproperties);\n return result;\n }\n };\n\n CSG.Properties.transformObj = function(source, result, matrix4x4) {\n for (var propertyname in source) {\n if (propertyname == \"_transform\") continue;\n if (propertyname == \"_merge\") continue;\n var propertyvalue = source[propertyname];\n var transformed = propertyvalue;\n if (typeof(propertyvalue) == \"object\") {\n if (('transform' in propertyvalue) && (typeof(propertyvalue.transform) == \"function\")) {\n transformed = propertyvalue.transform(matrix4x4);\n } else if (propertyvalue instanceof Array) {\n transformed = [];\n CSG.Properties.transformObj(propertyvalue, transformed, matrix4x4);\n } else if (propertyvalue instanceof CSG.Properties) {\n transformed = new CSG.Properties();\n CSG.Properties.transformObj(propertyvalue, transformed, matrix4x4);\n }\n }\n result[propertyname] = transformed;\n }\n };\n\n CSG.Properties.cloneObj = function(source, result) {\n for (var propertyname in source) {\n if (propertyname == \"_transform\") continue;\n if (propertyname == \"_merge\") continue;\n var propertyvalue = source[propertyname];\n var cloned = propertyvalue;\n if (typeof(propertyvalue) == \"object\") {\n if (propertyvalue instanceof Array) {\n cloned = [];\n for (var i = 0; i < propertyvalue.length; i++) {\n cloned.push(propertyvalue[i]);\n }\n } else if (propertyvalue instanceof CSG.Properties) {\n cloned = new CSG.Properties();\n CSG.Properties.cloneObj(propertyvalue, cloned);\n }\n }\n result[propertyname] = cloned;\n }\n };\n\n CSG.Properties.addFrom = function(result, otherproperties) {\n for (var propertyname in otherproperties) {\n if (propertyname == \"_transform\") continue;\n if (propertyname == \"_merge\") continue;\n if ((propertyname in result) &&\n (typeof(result[propertyname]) == \"object\") &&\n (result[propertyname] instanceof CSG.Properties) &&\n (typeof(otherproperties[propertyname]) == \"object\") &&\n (otherproperties[propertyname] instanceof CSG.Properties)) {\n CSG.Properties.addFrom(result[propertyname], otherproperties[propertyname]);\n } else if (!(propertyname in result)) {\n result[propertyname] = otherproperties[propertyname];\n }\n }\n };\n\n //////////////////////////////////////\n // # class Connector\n // A connector allows to attach two objects at predefined positions\n // For example a servo motor and a servo horn:\n // Both can have a Connector called 'shaft'\n // The horn can be moved and rotated such that the two connectors match\n // and the horn is attached to the servo motor at the proper position.\n // Connectors are stored in the properties of a CSG solid so they are\n // ge the same transformations applied as the solid\n CSG.Connector = function(point, axisvector, normalvector) {\n this.point = new CSG.Vector3D(point);\n this.axisvector = new CSG.Vector3D(axisvector).unit();\n this.normalvector = new CSG.Vector3D(normalvector).unit();\n };\n\n CSG.Connector.prototype = {\n normalized: function() {\n var axisvector = this.axisvector.unit();\n // make the normal vector truly normal:\n var n = this.normalvector.cross(axisvector).unit();\n var normalvector = axisvector.cross(n);\n return new CSG.Connector(this.point, axisvector, normalvector);\n },\n\n transform: function(matrix4x4) {\n var point = this.point.multiply4x4(matrix4x4);\n var axisvector = this.point.plus(this.axisvector).multiply4x4(matrix4x4).minus(point);\n var normalvector = this.point.plus(this.normalvector).multiply4x4(matrix4x4).minus(point);\n return new CSG.Connector(point, axisvector, normalvector);\n },\n\n // Get the transformation matrix to connect this Connector to another connector\n // other: a CSG.Connector to which this connector should be connected\n // mirror: false: the 'axis' vectors of the connectors should point in the same direction\n // true: the 'axis' vectors of the connectors should point in opposite direction\n // normalrotation: degrees of rotation between the 'normal' vectors of the two\n // connectors\n getTransformationTo: function(other, mirror, normalrotation) {\n mirror = mirror ? true : false;\n normalrotation = normalrotation ? Number(normalrotation) : 0;\n var us = this.normalized();\n other = other.normalized();\n // shift to the origin:\n var transformation = CSG.Matrix4x4.translation(this.point.negated());\n // construct the plane crossing through the origin and the two axes:\n var axesplane = CSG.Plane.anyPlaneFromVector3Ds(\n new CSG.Vector3D(0, 0, 0), us.axisvector, other.axisvector);\n var axesbasis = new CSG.OrthoNormalBasis(axesplane);\n var angle1 = axesbasis.to2D(us.axisvector).angle();\n var angle2 = axesbasis.to2D(other.axisvector).angle();\n var rotation = 180.0 * (angle2 - angle1) / Math.PI;\n if (mirror) rotation += 180.0;\n transformation = transformation.multiply(axesbasis.getProjectionMatrix());\n transformation = transformation.multiply(CSG.Matrix4x4.rotationZ(rotation));\n transformation = transformation.multiply(axesbasis.getInverseProjectionMatrix());\n var usAxesAligned = us.transform(transformation);\n // Now we have done the transformation for aligning the axes.\n // We still need to align the normals:\n var normalsplane = CSG.Plane.fromNormalAndPoint(other.axisvector, new CSG.Vector3D(0, 0, 0));\n var normalsbasis = new CSG.OrthoNormalBasis(normalsplane);\n angle1 = normalsbasis.to2D(usAxesAligned.normalvector).angle();\n angle2 = normalsbasis.to2D(other.normalvector).angle();\n rotation = 180.0 * (angle2 - angle1) / Math.PI;\n rotation += normalrotation;\n transformation = transformation.multiply(normalsbasis.getProjectionMatrix());\n transformation = transformation.multiply(CSG.Matrix4x4.rotationZ(rotation));\n transformation = transformation.multiply(normalsbasis.getInverseProjectionMatrix());\n // and translate to the destination point:\n transformation = transformation.multiply(CSG.Matrix4x4.translation(other.point));\n // var usAligned = us.transform(transformation);\n return transformation;\n },\n\n axisLine: function() {\n return new CSG.Line3D(this.point, this.axisvector);\n },\n\n // creates a new Connector, with the connection point moved in the direction of the axisvector\n extend: function(distance) {\n var newpoint = this.point.plus(this.axisvector.unit().times(distance));\n return new CSG.Connector(newpoint, this.axisvector, this.normalvector);\n }\n };\n\n CSG.ConnectorList = function(connectors) {\n this.connectors_ = connectors ? connectors.slice() : [];\n };\n\n CSG.ConnectorList.defaultNormal = [0, 0, 1];\n\n CSG.ConnectorList.fromPath2D = function(path2D, arg1, arg2) {\n if (arguments.length === 3) {\n return CSG.ConnectorList._fromPath2DTangents(path2D, arg1, arg2);\n } else if (arguments.length == 2) {\n return CSG.ConnectorList._fromPath2DExplicit(path2D, arg1);\n } else {\n throw(\"call with path2D and either 2 direction vectors, or a function returning direction vectors\");\n }\n };\n\n /*\n * calculate the connector axisvectors by calculating the \"tangent\" for path2D.\n * This is undefined for start and end points, so axis for these have to be manually\n * provided.\n */\n CSG.ConnectorList._fromPath2DTangents = function(path2D, start, end) {\n // path2D\n var axis;\n var pathLen = path2D.points.length;\n var result = new CSG.ConnectorList([new CSG.Connector(path2D.points[0],\n start, CSG.ConnectorList.defaultNormal)]);\n // middle points\n path2D.points.slice(1, pathLen - 1).forEach(function(p2, i) {\n axis = path2D.points[i + 2].minus(path2D.points[i]).toVector3D(0);\n result.appendConnector(new CSG.Connector(p2.toVector3D(0), axis,\n CSG.ConnectorList.defaultNormal));\n }, this);\n result.appendConnector(new CSG.Connector(path2D.points[pathLen - 1], end,\n CSG.ConnectorList.defaultNormal));\n result.closed = path2D.closed;\n return result;\n };\n\n /*\n * angleIsh: either a static angle, or a function(point) returning an angle\n */\n CSG.ConnectorList._fromPath2DExplicit = function(path2D, angleIsh) {\n function getAngle(angleIsh, pt, i) {\n if (typeof angleIsh == 'function') {\n angleIsh = angleIsh(pt, i);\n }\n return angleIsh;\n }\n var result = new CSG.ConnectorList(\n path2D.points.map(function(p2, i) {\n return new CSG.Connector(p2.toVector3D(0),\n CSG.Vector3D.Create(1, 0, 0).rotateZ(getAngle(angleIsh, p2, i)),\n CSG.ConnectorList.defaultNormal);\n }, this)\n );\n result.closed = path2D.closed;\n return result;\n };\n\n\n CSG.ConnectorList.prototype = {\n setClosed: function(bool) {\n this.closed = !!closed;\n },\n appendConnector: function(conn) {\n this.connectors_.push(conn);\n },\n /*\n * arguments: cagish: a cag or a function(connector) returning a cag\n * closed: whether the 3d path defined by connectors location\n * should be closed or stay open\n * Note: don't duplicate connectors in the path\n * TODO: consider an option \"maySelfIntersect\" to close & force union all single segments\n */\n followWith: function(cagish) {\n this.verify();\n function getCag(cagish, connector) {\n if (typeof cagish == \"function\") {\n cagish = cagish(connector.point, connector.axisvector, connector.normalvector);\n }\n return cagish;\n }\n\n var polygons = [], currCag;\n var prevConnector = this.connectors_[this.connectors_.length - 1];\n var prevCag = getCag(cagish, prevConnector);\n // add walls\n this.connectors_.forEach(function(connector, notFirst) {\n currCag = getCag(cagish, connector);\n if (notFirst || this.closed) {\n polygons.push.apply(polygons, prevCag._toWallPolygons({\n toConnector1: prevConnector, toConnector2: connector, cag: currCag}));\n } else {\n // it is the first, and shape not closed -> build start wall\n polygons.push.apply(polygons,\n currCag._toPlanePolygons({toConnector: connector, flipped: true}));\n }\n if (notFirst == this.connectors_.length - 1 && !this.closed) {\n // build end wall\n polygons.push.apply(polygons,\n currCag._toPlanePolygons({toConnector: connector}));\n }\n prevCag = currCag;\n prevConnector = connector;\n }, this);\n return CSG.fromPolygons(polygons).reTesselated().canonicalized();\n },\n /*\n * general idea behind these checks: connectors need to have smooth transition from one to another\n * TODO: add a check that 2 follow-on CAGs are not intersecting\n */\n verify: function() {\n var connI, connI1, dPosToAxis, axisToNextAxis;\n for (var i = 0; i < this.connectors_.length - 1; i++) {\n connI = this.connectors_[i], connI1 = this.connectors_[i + 1];\n if (connI1.point.minus(connI.point).dot(connI.axisvector) <= 0) {\n throw(\"Invalid ConnectorList. Each connectors position needs to be within a <90deg range of previous connectors axisvector\");\n }\n if (connI.axisvector.dot(connI1.axisvector) <= 0) {\n throw(\"invalid ConnectorList. No neighboring connectors axisvectors may span a >=90deg angle\");\n }\n }\n }\n };\n\n //////////////////////////////////////\n // # Class Path2D\n CSG.Path2D = function(points, closed) {\n closed = !!closed;\n points = points || [];\n // re-parse the points into CSG.Vector2D\n // and remove any duplicate points\n var prevpoint = null;\n if (closed && (points.length > 0)) {\n prevpoint = new CSG.Vector2D(points[points.length - 1]);\n }\n var newpoints = [];\n points.map(function(point) {\n point = new CSG.Vector2D(point);\n var skip = false;\n if (prevpoint !== null) {\n var distance = point.distanceTo(prevpoint);\n skip = distance < 1e-5;\n }\n if (!skip) newpoints.push(point);\n prevpoint = point;\n });\n this.points = newpoints;\n this.closed = closed;\n };\n\n /*\n Construct a (part of a) circle. Parameters:\n options.center: the center point of the arc (CSG.Vector2D or array [x,y])\n options.radius: the circle radius (float)\n options.startangle: the starting angle of the arc, in degrees\n 0 degrees corresponds to [1,0]\n 90 degrees to [0,1]\n and so on\n options.endangle: the ending angle of the arc, in degrees\n options.resolution: number of points per 360 degree of rotation\n options.maketangent: adds two extra tiny line segments at both ends of the circle\n this ensures that the gradients at the edges are tangent to the circle\n Returns a CSG.Path2D. The path is not closed (even if it is a 360 degree arc).\n close() the resulting path if you want to create a true circle.\n */\n CSG.Path2D.arc = function(options) {\n var center = CSG.parseOptionAs2DVector(options, \"center\", 0);\n var radius = CSG.parseOptionAsFloat(options, \"radius\", 1);\n var startangle = CSG.parseOptionAsFloat(options, \"startangle\", 0);\n var endangle = CSG.parseOptionAsFloat(options, \"endangle\", 360);\n var resolution = CSG.parseOptionAsInt(options, \"resolution\", CSG.defaultResolution2D);\n var maketangent = CSG.parseOptionAsBool(options, \"maketangent\", false);\n // no need to make multiple turns:\n while (endangle - startangle >= 720) {\n endangle -= 360;\n }\n while (endangle - startangle <= -720) {\n endangle += 360;\n }\n var points = [],\n point;\n var absangledif = Math.abs(endangle - startangle);\n if (absangledif < 1e-5) {\n point = CSG.Vector2D.fromAngle(startangle / 180.0 * Math.PI).times(radius);\n points.push(point.plus(center));\n } else {\n var numsteps = Math.floor(resolution * absangledif / 360) + 1;\n var edgestepsize = numsteps * 0.5 / absangledif; // step size for half a degree\n if (edgestepsize > 0.25) edgestepsize = 0.25;\n var numsteps_mod = maketangent ? (numsteps + 2) : numsteps;\n for (var i = 0; i <= numsteps_mod; i++) {\n var step = i;\n if (maketangent) {\n step = (i - 1) * (numsteps - 2 * edgestepsize) / numsteps + edgestepsize;\n if (step < 0) step = 0;\n if (step > numsteps) step = numsteps;\n }\n var angle = startangle + step * (endangle - startangle) / numsteps;\n point = CSG.Vector2D.fromAngle(angle / 180.0 * Math.PI).times(radius);\n points.push(point.plus(center));\n }\n }\n return new CSG.Path2D(points, false);\n };\n\n CSG.Path2D.prototype = {\n concat: function(otherpath) {\n if (this.closed || otherpath.closed) {\n throw new Error(\"Paths must not be closed\");\n }\n var newpoints = this.points.concat(otherpath.points);\n return new CSG.Path2D(newpoints);\n },\n\n appendPoint: function(point) {\n if (this.closed) {\n throw new Error(\"Path must not be closed\");\n }\n point = new CSG.Vector2D(point); // cast to Vector2D\n var newpoints = this.points.concat([point]);\n return new CSG.Path2D(newpoints);\n },\n\n appendPoints: function(points) {\n if (this.closed) {\n throw new Error(\"Path must not be closed\");\n }\n var newpoints = this.points;\n points.forEach(function(point) {\n newpoints.push(new CSG.Vector2D(point)); // cast to Vector2D\n })\n return new CSG.Path2D(newpoints);\n },\n\n close: function() {\n return new CSG.Path2D(this.points, true);\n },\n\n // Extrude the path by following it with a rectangle (upright, perpendicular to the path direction)\n // Returns a CSG solid\n // width: width of the extrusion, in the z=0 plane\n // height: height of the extrusion in the z direction\n // resolution: number of segments per 360 degrees for the curve in a corner\n rectangularExtrude: function(width, height, resolution) {\n var cag = this.expandToCAG(width / 2, resolution);\n var result = cag.extrude({\n offset: [0, 0, height]\n });\n return result;\n },\n\n // Expand the path to a CAG\n // This traces the path with a circle with radius pathradius\n expandToCAG: function(pathradius, resolution) {\n var sides = [];\n var numpoints = this.points.length;\n var startindex = 0;\n if (this.closed && (numpoints > 2)) startindex = -1;\n var prevvertex;\n for (var i = startindex; i < numpoints; i++) {\n var pointindex = i;\n if (pointindex < 0) pointindex = numpoints - 1;\n var point = this.points[pointindex];\n var vertex = new CAG.Vertex(point);\n if (i > startindex) {\n var side = new CAG.Side(prevvertex, vertex);\n sides.push(side);\n }\n prevvertex = vertex;\n }\n var shellcag = CAG.fromSides(sides);\n var expanded = shellcag.expandedShell(pathradius, resolution);\n return expanded;\n },\n\n innerToCAG: function() {\n if (!this.closed) throw new Error(\"The path should be closed!\");\n return CAG.fromPoints(this.points);\n },\n\n transform: function(matrix4x4) {\n var newpoints = this.points.map(function(point) {\n return point.multiply4x4(matrix4x4);\n });\n return new CSG.Path2D(newpoints, this.closed);\n },\n\n appendBezier: function(controlpoints, options) {\n if (arguments.length < 2) {\n options = {};\n }\n if (this.closed) {\n throw new Error(\"Path must not be closed\");\n }\n if (!(controlpoints instanceof Array)) {\n throw new Error(\"appendBezier: should pass an array of control points\")\n }\n if (controlpoints.length < 1) {\n throw new Error(\"appendBezier: need at least 1 control point\")\n }\n if (this.points.length < 1) {\n throw new Error(\"appendBezier: path must already contain a point (the endpoint of the path is used as the starting point for the bezier curve)\");\n }\n var resolution = CSG.parseOptionAsInt(options, \"resolution\", CSG.defaultResolution2D);\n if (resolution < 4) resolution = 4;\n var factorials = [];\n var controlpoints_parsed = [];\n controlpoints_parsed.push(this.points[this.points.length - 1]); // start at the previous end point\n for (var i = 0; i < controlpoints.length; ++i) {\n var p = controlpoints[i];\n if (p === null) {\n // we can pass null as the first control point. In that case a smooth gradient is ensured:\n if (i != 0) {\n throw new Error(\"appendBezier: null can only be passed as the first control point\");\n }\n if (controlpoints.length < 2) {\n throw new Error(\"appendBezier: null can only be passed if there is at least one more control point\");\n }\n var lastBezierControlPoint;\n if ('lastBezierControlPoint' in this) {\n lastBezierControlPoint = this.lastBezierControlPoint;\n } else {\n if (this.points.length < 2) {\n throw new Error(\"appendBezier: null is passed as a control point but this requires a previous bezier curve or at least two points in the existing path\");\n }\n lastBezierControlPoint = this.points[this.points.length - 2];\n }\n // mirror the last bezier control point:\n p = this.points[this.points.length - 1].times(2).minus(lastBezierControlPoint);\n } else {\n p = new CSG.Vector2D(p); // cast to Vector2D\n }\n controlpoints_parsed.push(p);\n }\n var bezier_order = controlpoints_parsed.length - 1;\n var fact = 1;\n for (var i = 0; i <= bezier_order; ++i) {\n if (i > 0) fact *= i;\n factorials.push(fact);\n }\n var binomials = [];\n for (var i = 0; i <= bezier_order; ++i) {\n var binomial = factorials[bezier_order] / (factorials[i] * factorials[bezier_order - i]);\n binomials.push(binomial);\n }\n var getPointForT = function(t) {\n var t_k = 1; // = pow(t,k)\n var one_minus_t_n_minus_k = Math.pow(1 - t, bezier_order); // = pow( 1-t, bezier_order - k)\n var inv_1_minus_t = (t != 1) ? (1 / (1 - t)) : 1;\n var point = new CSG.Vector2D(0, 0);\n for (var k = 0; k <= bezier_order; ++k) {\n if (k == bezier_order) one_minus_t_n_minus_k = 1;\n var bernstein_coefficient = binomials[k] * t_k * one_minus_t_n_minus_k;\n point = point.plus(controlpoints_parsed[k].times(bernstein_coefficient));\n t_k *= t;\n one_minus_t_n_minus_k *= inv_1_minus_t;\n }\n return point;\n };\n var newpoints = [];\n var newpoints_t = [];\n var numsteps = bezier_order + 1;\n for (var i = 0; i < numsteps; ++i) {\n var t = i / (numsteps - 1);\n var point = getPointForT(t);\n newpoints.push(point);\n newpoints_t.push(t);\n }\n // subdivide each segment until the angle at each vertex becomes small enough:\n var subdivide_base = 1;\n var maxangle = Math.PI * 2 / resolution; // segments may have differ no more in angle than this\n var maxsinangle = Math.sin(maxangle);\n while (subdivide_base < newpoints.length - 1) {\n var dir1 = newpoints[subdivide_base].minus(newpoints[subdivide_base - 1]).unit();\n var dir2 = newpoints[subdivide_base + 1].minus(newpoints[subdivide_base]).unit();\n var sinangle = dir1.cross(dir2); // this is the sine of the angle\n if (Math.abs(sinangle) > maxsinangle) {\n // angle is too big, we need to subdivide\n var t0 = newpoints_t[subdivide_base - 1];\n var t1 = newpoints_t[subdivide_base + 1];\n var t0_new = t0 + (t1 - t0) * 1 / 3;\n var t1_new = t0 + (t1 - t0) * 2 / 3;\n var point0_new = getPointForT(t0_new);\n var point1_new = getPointForT(t1_new);\n // remove the point at subdivide_base and replace with 2 new points:\n newpoints.splice(subdivide_base, 1, point0_new, point1_new);\n newpoints_t.splice(subdivide_base, 1, t0_new, t1_new);\n // re - evaluate the angles, starting at the previous junction since it has changed:\n subdivide_base--;\n if (subdivide_base < 1) subdivide_base = 1;\n } else {\n ++subdivide_base;\n }\n }\n // append to the previous points, but skip the first new point because it is identical to the last point:\n newpoints = this.points.concat(newpoints.slice(1));\n var result = new CSG.Path2D(newpoints);\n result.lastBezierControlPoint = controlpoints_parsed[controlpoints_parsed.length - 2];\n return result;\n },\n\n /*\n options:\n .resolution // smoothness of the arc (number of segments per 360 degree of rotation)\n // to create a circular arc:\n .radius\n // to create an elliptical arc:\n .xradius\n .yradius\n .xaxisrotation // the rotation (in degrees) of the x axis of the ellipse with respect to the x axis of our coordinate system\n // this still leaves 4 possible arcs between the two given points. The following two flags select which one we draw:\n .clockwise // = true | false (default is false). Two of the 4 solutions draw clockwise with respect to the center point, the other 2 counterclockwise\n .large // = true | false (default is false). Two of the 4 solutions are an arc longer than 180 degrees, the other two are <= 180 degrees\n This implementation follows the SVG arc specs. For the details see\n http://www.w3.org/TR/SVG/paths.html#PathDataEllipticalArcCommands\n */\n appendArc: function(endpoint, options) {\n var decimals = 100000;\n if (arguments.length < 2) {\n options = {};\n }\n if (this.closed) {\n throw new Error(\"Path must not be closed\");\n }\n if (this.points.length < 1) {\n throw new Error(\"appendArc: path must already contain a point (the endpoint of the path is used as the starting point for the arc)\");\n }\n var resolution = CSG.parseOptionAsInt(options, \"resolution\", CSG.defaultResolution2D);\n if (resolution < 4) resolution = 4;\n var xradius, yradius;\n if (('xradius' in options) || ('yradius' in options)) {\n if ('radius' in options) {\n throw new Error(\"Should either give an xradius and yradius parameter, or a radius parameter\");\n }\n xradius = CSG.parseOptionAsFloat(options, \"xradius\", 0);\n yradius = CSG.parseOptionAsFloat(options, \"yradius\", 0);\n } else {\n xradius = CSG.parseOptionAsFloat(options, \"radius\", 0);\n yradius = xradius;\n }\n var xaxisrotation = CSG.parseOptionAsFloat(options, \"xaxisrotation\", 0);\n var clockwise = CSG.parseOptionAsBool(options, \"clockwise\", false);\n var largearc = CSG.parseOptionAsBool(options, \"large\", false);\n var startpoint = this.points[this.points.length - 1];\n endpoint = new CSG.Vector2D(endpoint);\n // round to precision in order to have determinate calculations\n xradius = Math.round(xradius*decimals)/decimals;\n yradius = Math.round(yradius*decimals)/decimals;\n endpoint = new CSG.Vector2D(Math.round(endpoint.x*decimals)/decimals,Math.round(endpoint.y*decimals)/decimals);\n\n var sweep_flag = !clockwise;\n var newpoints = [];\n if ((xradius == 0) || (yradius == 0)) {\n // http://www.w3.org/TR/SVG/implnote.html#ArcImplementationNotes:\n // If rx = 0 or ry = 0, then treat this as a straight line from (x1, y1) to (x2, y2) and stop\n newpoints.push(endpoint);\n } else {\n xradius = Math.abs(xradius);\n yradius = Math.abs(yradius);\n\n // see http://www.w3.org/TR/SVG/implnote.html#ArcImplementationNotes :\n var phi = xaxisrotation * Math.PI / 180.0;\n var cosphi = Math.cos(phi);\n var sinphi = Math.sin(phi);\n var minushalfdistance = startpoint.minus(endpoint).times(0.5);\n // F.6.5.1:\n // round to precision in order to have determinate calculations\n var x = Math.round((cosphi * minushalfdistance.x + sinphi * minushalfdistance.y)*decimals)/decimals;\n var y = Math.round((-sinphi * minushalfdistance.x + cosphi * minushalfdistance.y)*decimals)/decimals;\n var start_translated = new CSG.Vector2D(x,y);\n // F.6.6.2:\n var biglambda = (start_translated.x * start_translated.x) / (xradius * xradius) + (start_translated.y * start_translated.y) / (yradius * yradius);\n if (biglambda > 1.0) {\n // F.6.6.3:\n var sqrtbiglambda = Math.sqrt(biglambda);\n xradius *= sqrtbiglambda;\n yradius *= sqrtbiglambda;\n // round to precision in order to have determinate calculations\n xradius = Math.round(xradius*decimals)/decimals;\n yradius = Math.round(yradius*decimals)/decimals;\n }\n // F.6.5.2:\n var multiplier1 = Math.sqrt((xradius * xradius * yradius * yradius - xradius * xradius * start_translated.y * start_translated.y - yradius * yradius * start_translated.x * start_translated.x) / (xradius * xradius * start_translated.y * start_translated.y + yradius * yradius * start_translated.x * start_translated.x));\n if (sweep_flag == largearc) multiplier1 = -multiplier1;\n var center_translated = new CSG.Vector2D(xradius * start_translated.y / yradius, -yradius * start_translated.x / xradius).times(multiplier1);\n // F.6.5.3:\n var center = new CSG.Vector2D(cosphi * center_translated.x - sinphi * center_translated.y, sinphi * center_translated.x + cosphi * center_translated.y).plus((startpoint.plus(endpoint)).times(0.5));\n // F.6.5.5:\n var vec1 = new CSG.Vector2D((start_translated.x - center_translated.x) / xradius, (start_translated.y - center_translated.y) / yradius);\n var vec2 = new CSG.Vector2D((-start_translated.x - center_translated.x) / xradius, (-start_translated.y - center_translated.y) / yradius);\n var theta1 = vec1.angleRadians();\n var theta2 = vec2.angleRadians();\n var deltatheta = theta2 - theta1;\n deltatheta = deltatheta % (2 * Math.PI);\n if ((!sweep_flag) && (deltatheta > 0)) {\n deltatheta -= 2 * Math.PI;\n } else if ((sweep_flag) && (deltatheta < 0)) {\n deltatheta += 2 * Math.PI;\n }\n\n // Ok, we have the center point and angle range (from theta1, deltatheta radians) so we can create the ellipse\n var numsteps = Math.ceil(Math.abs(deltatheta) / (2 * Math.PI) * resolution) + 1;\n if (numsteps < 1) numsteps = 1;\n for (var step = 1; step <= numsteps; step++) {\n var theta = theta1 + step / numsteps * deltatheta;\n var costheta = Math.cos(theta);\n var sintheta = Math.sin(theta);\n // F.6.3.1:\n var point = new CSG.Vector2D(cosphi * xradius * costheta - sinphi * yradius * sintheta, sinphi * xradius * costheta + cosphi * yradius * sintheta).plus(center);\n newpoints.push(point);\n }\n }\n newpoints = this.points.concat(newpoints);\n var result = new CSG.Path2D(newpoints);\n return result;\n },\n };\n\n // Add several convenience methods to the classes that support a transform() method:\n CSG.addTransformationMethodsToPrototype = function(prot) {\n prot.mirrored = function(plane) {\n return this.transform(CSG.Matrix4x4.mirroring(plane));\n };\n\n prot.mirroredX = function() {\n var plane = new CSG.Plane(CSG.Vector3D.Create(1, 0, 0), 0);\n return this.mirrored(plane);\n };\n\n prot.mirroredY = function() {\n var plane = new CSG.Plane(CSG.Vector3D.Create(0, 1, 0), 0);\n return this.mirrored(plane);\n };\n\n prot.mirroredZ = function() {\n var plane = new CSG.Plane(CSG.Vector3D.Create(0, 0, 1), 0);\n return this.mirrored(plane);\n };\n\n prot.translate = function(v) {\n return this.transform(CSG.Matrix4x4.translation(v));\n };\n\n prot.scale = function(f) {\n return this.transform(CSG.Matrix4x4.scaling(f));\n };\n\n prot.rotateX = function(deg) {\n return this.transform(CSG.Matrix4x4.rotationX(deg));\n };\n\n prot.rotateY = function(deg) {\n return this.transform(CSG.Matrix4x4.rotationY(deg));\n };\n\n prot.rotateZ = function(deg) {\n return this.transform(CSG.Matrix4x4.rotationZ(deg));\n };\n\n prot.rotate = function(rotationCenter, rotationAxis, degrees) {\n return this.transform(CSG.Matrix4x4.rotation(rotationCenter, rotationAxis, degrees));\n };\n\n prot.rotateEulerAngles = function(alpha, beta, gamma, position) {\n position = position || [0,0,0];\n\n var Rz1 = CSG.Matrix4x4.rotationZ(alpha);\n var Rx = CSG.Matrix4x4.rotationX(beta);\n var Rz2 = CSG.Matrix4x4.rotationZ(gamma);\n var T = CSG.Matrix4x4.translation(new CSG.Vector3D(position));\n\n return this.transform(Rz2.multiply(Rx).multiply(Rz1).multiply(T));\n };\n };\n\n // TODO: consider generalization and adding to addTransformationMethodsToPrototype\n CSG.addCenteringToPrototype = function(prot, axes) {\n prot.center = function(cAxes) {\n cAxes = Array.prototype.map.call(arguments, function(a) {\n return a; //.toLowerCase();\n });\n // no args: center on all axes\n if (!cAxes.length) {\n cAxes = axes.slice();\n }\n var b = this.getBounds();\n return this.translate(axes.map(function(a) {\n return cAxes.indexOf(a) > -1 ?\n -(b[0][a] + b[1][a])/2 : 0;\n }));\n };\n };\n\n //////////////////\n // CAG: solid area geometry: like CSG but 2D\n // Each area consists of a number of sides\n // Each side is a line between 2 points\n var CAG = function() {\n this.sides = [];\n this.isCanonicalized = false;\n };\n\n // create from an untyped object with identical property names:\n CAG.fromObject = function(obj) {\n var sides = obj.sides.map(function(s) {\n return CAG.Side.fromObject(s);\n });\n var cag = CAG.fromSides(sides);\n return cag;\n }\n\n // Construct a CAG from a list of `CAG.Side` instances.\n CAG.fromSides = function(sides) {\n var cag = new CAG();\n cag.sides = sides;\n return cag;\n };\n\n // Construct a CAG from a list of points (a polygon)\n // Rotation direction of the points is not relevant. Points can be a convex or concave polygon.\n // Polygon must not self intersect\n CAG.fromPoints = function(points) {\n var numpoints = points.length;\n if (numpoints < 3) throw new Error(\"CAG shape needs at least 3 points\");\n var sides = [];\n var prevpoint = new CSG.Vector2D(points[numpoints - 1]);\n var prevvertex = new CAG.Vertex(prevpoint);\n points.map(function(p) {\n var point = new CSG.Vector2D(p);\n var vertex = new CAG.Vertex(point);\n var side = new CAG.Side(prevvertex, vertex);\n sides.push(side);\n prevvertex = vertex;\n });\n var result = CAG.fromSides(sides);\n if (result.isSelfIntersecting()) {\n throw new Error(\"Polygon is self intersecting!\");\n }\n var area = result.area();\n if (Math.abs(area) < 1e-5) {\n throw new Error(\"Degenerate polygon!\");\n }\n if (area < 0) {\n result = result.flipped();\n }\n result = result.canonicalized();\n return result;\n };\n\n // Like CAG.fromPoints but does not check if it's a valid polygon.\n // Points should rotate counter clockwise\n CAG.fromPointsNoCheck = function(points) {\n var sides = [];\n var prevpoint = new CSG.Vector2D(points[points.length - 1]);\n var prevvertex = new CAG.Vertex(prevpoint);\n points.map(function(p) {\n var point = new CSG.Vector2D(p);\n var vertex = new CAG.Vertex(point);\n var side = new CAG.Side(prevvertex, vertex);\n sides.push(side);\n prevvertex = vertex;\n });\n return CAG.fromSides(sides);\n };\n\n // Converts a CSG to a CAG. The CSG must consist of polygons with only z coordinates +1 and -1\n // as constructed by CAG._toCSGWall(-1, 1). This is so we can use the 3D union(), intersect() etc\n CAG.fromFakeCSG = function(csg) {\n var sides = csg.polygons.map(function(p) {\n return CAG.Side._fromFakePolygon(p);\n })\n .filter(function(s) {\n return s !== null;\n });\n return CAG.fromSides(sides);\n };\n\n // see if the line between p0start and p0end intersects with the line between p1start and p1end\n // returns true if the lines strictly intersect, the end points are not counted!\n CAG.linesIntersect = function(p0start, p0end, p1start, p1end) {\n if (p0end.equals(p1start) || p1end.equals(p0start)) {\n var d = p1end.minus(p1start).unit().plus(p0end.minus(p0start).unit()).length();\n if (d < 1e-5) {\n return true;\n }\n } else {\n var d0 = p0end.minus(p0start);\n var d1 = p1end.minus(p1start);\n if (Math.abs(d0.cross(d1)) < 1e-9) return false; // lines are parallel\n var alphas = CSG.solve2Linear(-d0.x, d1.x, -d0.y, d1.y, p0start.x - p1start.x, p0start.y - p1start.y);\n if ((alphas[0] > 1e-6) && (alphas[0] < 0.999999) && (alphas[1] > 1e-5) && (alphas[1] < 0.999999)) return true;\n // if( (alphas[0] >= 0) && (alphas[0] <= 1) && (alphas[1] >= 0) && (alphas[1] <= 1) ) return true;\n }\n return false;\n };\n\n /* Construct a circle\n options:\n center: a 2D center point\n radius: a scalar\n resolution: number of sides per 360 degree rotation\n returns a CAG object\n */\n CAG.circle = function(options) {\n options = options || {};\n var center = CSG.parseOptionAs2DVector(options, \"center\", [0, 0]);\n var radius = CSG.parseOptionAsFloat(options, \"radius\", 1);\n var resolution = CSG.parseOptionAsInt(options, \"resolution\", CSG.defaultResolution2D);\n var sides = [];\n var prevvertex;\n for (var i = 0; i <= resolution; i++) {\n var radians = 2 * Math.PI * i / resolution;\n var point = CSG.Vector2D.fromAngleRadians(radians).times(radius).plus(center);\n var vertex = new CAG.Vertex(point);\n if (i > 0) {\n sides.push(new CAG.Side(prevvertex, vertex));\n }\n prevvertex = vertex;\n }\n return CAG.fromSides(sides);\n };\n\n /* Construct an ellispe\n options:\n center: a 2D center point\n radius: a 2D vector with width and height\n resolution: number of sides per 360 degree rotation\n returns a CAG object\n */\n CAG.ellipse = function(options) {\n options = options || {};\n var c = CSG.parseOptionAs2DVector(options, \"center\", [0, 0]);\n var r = CSG.parseOptionAs2DVector(options, \"radius\", [1, 1]);\n r = r.abs(); // negative radii make no sense\n var res = CSG.parseOptionAsInt(options, \"resolution\", CSG.defaultResolution2D);\n\n var e2 = new CSG.Path2D([[c.x,c.y + r.y]]);\n e2 = e2.appendArc([c.x,c.y - r.y], {\n xradius: r.x,\n yradius: r.y,\n xaxisrotation: 0,\n resolution: res,\n clockwise: true,\n large: false,\n });\n e2 = e2.appendArc([c.x,c.y + r.y], {\n xradius: r.x,\n yradius: r.y,\n xaxisrotation: 0,\n resolution: res,\n clockwise: true,\n large: false,\n });\n e2 = e2.close();\n return e2.innerToCAG();\n };\n\n /* Construct a rectangle\n options:\n center: a 2D center point\n radius: a 2D vector with width and height\n returns a CAG object\n */\n CAG.rectangle = function(options) {\n options = options || {};\n var c, r;\n if (('corner1' in options) || ('corner2' in options)) {\n if (('center' in options) || ('radius' in options)) {\n throw new Error(\"rectangle: should either give a radius and center parameter, or a corner1 and corner2 parameter\")\n }\n corner1 = CSG.parseOptionAs2DVector(options, \"corner1\", [0, 0]);\n corner2 = CSG.parseOptionAs2DVector(options, \"corner2\", [1, 1]);\n c = corner1.plus(corner2).times(0.5);\n r = corner2.minus(corner1).times(0.5);\n } else {\n c = CSG.parseOptionAs2DVector(options, \"center\", [0, 0]);\n r = CSG.parseOptionAs2DVector(options, \"radius\", [1, 1]);\n }\n r = r.abs(); // negative radii make no sense\n var rswap = new CSG.Vector2D(r.x, -r.y);\n var points = [\n c.plus(r), c.plus(rswap), c.minus(r), c.minus(rswap)\n ];\n return CAG.fromPoints(points);\n };\n\n // var r = CSG.roundedRectangle({\n // center: [0, 0],\n // radius: [2, 1],\n // roundradius: 0.2,\n // resolution: 8,\n // });\n CAG.roundedRectangle = function(options) {\n options = options || {};\n var center, radius;\n if (('corner1' in options) || ('corner2' in options)) {\n if (('center' in options) || ('radius' in options)) {\n throw new Error(\"roundedRectangle: should either give a radius and center parameter, or a corner1 and corner2 parameter\")\n }\n corner1 = CSG.parseOptionAs2DVector(options, \"corner1\", [0, 0]);\n corner2 = CSG.parseOptionAs2DVector(options, \"corner2\", [1, 1]);\n center = corner1.plus(corner2).times(0.5);\n radius = corner2.minus(corner1).times(0.5);\n } else {\n center = CSG.parseOptionAs2DVector(options, \"center\", [0, 0]);\n radius = CSG.parseOptionAs2DVector(options, \"radius\", [1, 1]);\n }\n radius = radius.abs(); // negative radii make no sense\n var roundradius = CSG.parseOptionAsFloat(options, \"roundradius\", 0.2);\n var resolution = CSG.parseOptionAsInt(options, \"resolution\", CSG.defaultResolution2D);\n var maxroundradius = Math.min(radius.x, radius.y);\n maxroundradius -= 0.1;\n roundradius = Math.min(roundradius, maxroundradius);\n roundradius = Math.max(0, roundradius);\n radius = new CSG.Vector2D(radius.x - roundradius, radius.y - roundradius);\n var rect = CAG.rectangle({\n center: center,\n radius: radius\n });\n if (roundradius > 0) {\n rect = rect.expand(roundradius, resolution);\n }\n return rect;\n };\n\n // Reconstruct a CAG from the output of toCompactBinary()\n CAG.fromCompactBinary = function(bin) {\n if (bin['class'] != \"CAG\") throw new Error(\"Not a CAG\");\n var vertices = [];\n var vertexData = bin.vertexData;\n var numvertices = vertexData.length / 2;\n var arrayindex = 0;\n for (var vertexindex = 0; vertexindex < numvertices; vertexindex++) {\n var x = vertexData[arrayindex++];\n var y = vertexData[arrayindex++];\n var pos = new CSG.Vector2D(x, y);\n var vertex = new CAG.Vertex(pos);\n vertices.push(vertex);\n }\n\n var sides = [];\n var numsides = bin.sideVertexIndices.length / 2;\n arrayindex = 0;\n for (var sideindex = 0; sideindex < numsides; sideindex++) {\n var vertexindex0 = bin.sideVertexIndices[arrayindex++];\n var vertexindex1 = bin.sideVertexIndices[arrayindex++];\n var side = new CAG.Side(vertices[vertexindex0], vertices[vertexindex1]);\n sides.push(side);\n }\n var cag = CAG.fromSides(sides);\n cag.isCanonicalized = true;\n return cag;\n };\n\n function fnSortByIndex(a, b) {\n return a.index - b.index;\n }\n\n CAG.prototype = {\n toString: function() {\n var result = \"CAG (\" + this.sides.length + \" sides):\\n\";\n this.sides.map(function(side) {\n result += \" \" + side.toString() + \"\\n\";\n });\n return result;\n },\n\n _toCSGWall: function(z0, z1) {\n var polygons = this.sides.map(function(side) {\n return side.toPolygon3D(z0, z1);\n });\n return CSG.fromPolygons(polygons);\n },\n\n _toVector3DPairs: function(m) {\n // transform m\n var pairs = this.sides.map(function(side) {\n var p0 = side.vertex0.pos, p1 = side.vertex1.pos;\n return [CSG.Vector3D.Create(p0.x, p0.y, 0),\n CSG.Vector3D.Create(p1.x, p1.y, 0)];\n });\n if (typeof m != 'undefined') {\n pairs = pairs.map(function(pair) {\n return pair.map(function(v) {\n return v.transform(m);\n });\n });\n }\n return pairs;\n },\n\n /*\n * transform a cag into the polygons of a corresponding 3d plane, positioned per options\n * Accepts a connector for plane positioning, or optionally\n * single translation, axisVector, normalVector arguments\n * (toConnector has precedence over single arguments if provided)\n */\n _toPlanePolygons: function(options) {\n var flipped = options.flipped || false;\n // reference connector for transformation\n var origin = [0, 0, 0], defaultAxis = [0, 0, 1], defaultNormal = [0, 1, 0];\n var thisConnector = new CSG.Connector(origin, defaultAxis, defaultNormal);\n // translated connector per options\n var translation = options.translation || origin;\n var axisVector = options.axisVector || defaultAxis;\n var normalVector = options.normalVector || defaultNormal;\n // will override above if options has toConnector\n var toConnector = options.toConnector ||\n new CSG.Connector(translation, axisVector, normalVector);\n // resulting transform\n var m = thisConnector.getTransformationTo(toConnector, false, 0);\n // create plane as a (partial non-closed) CSG in XY plane\n var bounds = this.getBounds();\n bounds[0] = bounds[0].minus(new CSG.Vector2D(1, 1));\n bounds[1] = bounds[1].plus(new CSG.Vector2D(1, 1));\n var csgshell = this._toCSGWall(-1, 1);\n var csgplane = CSG.fromPolygons([new CSG.Polygon([\n new CSG.Vertex(new CSG.Vector3D(bounds[0].x, bounds[0].y, 0)),\n new CSG.Vertex(new CSG.Vector3D(bounds[1].x, bounds[0].y, 0)),\n new CSG.Vertex(new CSG.Vector3D(bounds[1].x, bounds[1].y, 0)),\n new CSG.Vertex(new CSG.Vector3D(bounds[0].x, bounds[1].y, 0))\n ])]);\n if (flipped) {\n csgplane = csgplane.invert();\n }\n // intersectSub -> prevent premature retesselate/canonicalize\n csgplane = csgplane.intersectSub(csgshell);\n // only keep the polygons in the z plane:\n var polys = csgplane.polygons.filter(function(polygon) {\n return Math.abs(polygon.plane.normal.z) > 0.99;\n });\n // finally, position the plane per passed transformations\n return polys.map(function(poly) {\n return poly.transform(m);\n });\n },\n\n\n /*\n * given 2 connectors, this returns all polygons of a \"wall\" between 2\n * copies of this cag, positioned in 3d space as \"bottom\" and\n * \"top\" plane per connectors toConnector1, and toConnector2, respectively \n */\n _toWallPolygons: function(options) {\n // normals are going to be correct as long as toConn2.point - toConn1.point\n // points into cag normal direction (check in caller)\n // arguments: options.toConnector1, options.toConnector2, options.cag\n // walls go from toConnector1 to toConnector2\n // optionally, target cag to point to - cag needs to have same number of sides as this!\n var origin = [0, 0, 0], defaultAxis = [0, 0, 1], defaultNormal = [0, 1, 0];\n var thisConnector = new CSG.Connector(origin, defaultAxis, defaultNormal);\n // arguments:\n var toConnector1 = options.toConnector1;\n // var toConnector2 = new CSG.Connector([0, 0, -30], defaultAxis, defaultNormal);\n var toConnector2 = options.toConnector2;\n if (!(toConnector1 instanceof CSG.Connector && toConnector2 instanceof CSG.Connector)) {\n throw('could not parse CSG.Connector arguments toConnector1 or toConnector2');\n }\n if (options.cag) {\n if (options.cag.sides.length != this.sides.length) {\n throw('target cag needs same sides count as start cag');\n }\n }\n // target cag is same as this unless specified\n var toCag = options.cag || this;\n var m1 = thisConnector.getTransformationTo(toConnector1, false, 0);\n var m2 = thisConnector.getTransformationTo(toConnector2, false, 0);\n var vps1 = this._toVector3DPairs(m1);\n var vps2 = toCag._toVector3DPairs(m2);\n\n var polygons = [];\n vps1.forEach(function(vp1, i) {\n polygons.push(new CSG.Polygon([\n new CSG.Vertex(vps2[i][1]), new CSG.Vertex(vps2[i][0]), new CSG.Vertex(vp1[0])]));\n polygons.push(new CSG.Polygon([\n new CSG.Vertex(vps2[i][1]), new CSG.Vertex(vp1[0]), new CSG.Vertex(vp1[1])]));\n });\n return polygons;\n },\n\n union: function(cag) {\n var cags;\n if (cag instanceof Array) {\n cags = cag;\n } else {\n cags = [cag];\n }\n var r = this._toCSGWall(-1, 1);\n var r = r.union(\n cags.map(function(cag) {\n return cag._toCSGWall(-1, 1).reTesselated();\n }), false, false)\n return CAG.fromFakeCSG(r).canonicalized();\n },\n\n subtract: function(cag) {\n var cags;\n if (cag instanceof Array) {\n cags = cag;\n } else {\n cags = [cag];\n }\n var r = this._toCSGWall(-1, 1);\n cags.map(function(cag) {\n r = r.subtractSub(cag._toCSGWall(-1, 1), false, false);\n });\n r = r.reTesselated();\n r = r.canonicalized();\n r = CAG.fromFakeCSG(r);\n r = r.canonicalized();\n return r;\n },\n\n intersect: function(cag) {\n var cags;\n if (cag instanceof Array) {\n cags = cag;\n } else {\n cags = [cag];\n }\n var r = this._toCSGWall(-1, 1);\n cags.map(function(cag) {\n r = r.intersectSub(cag._toCSGWall(-1, 1), false, false);\n });\n r = r.reTesselated();\n r = r.canonicalized();\n r = CAG.fromFakeCSG(r);\n r = r.canonicalized();\n return r;\n },\n\n transform: function(matrix4x4) {\n var ismirror = matrix4x4.isMirroring();\n var newsides = this.sides.map(function(side) {\n return side.transform(matrix4x4);\n });\n var result = CAG.fromSides(newsides);\n if (ismirror) {\n result = result.flipped();\n }\n return result;\n },\n\n // see http://local.wasp.uwa.edu.au/~pbourke/geometry/polyarea/ :\n // Area of the polygon. For a counter clockwise rotating polygon the area is positive, otherwise negative\n // Note(bebbi): this looks wrong. See polygon getArea()\n area: function() {\n var polygonArea = 0;\n this.sides.map(function(side) {\n polygonArea += side.vertex0.pos.cross(side.vertex1.pos);\n });\n polygonArea *= 0.5;\n return polygonArea;\n },\n\n flipped: function() {\n var newsides = this.sides.map(function(side) {\n return side.flipped();\n });\n newsides.reverse();\n return CAG.fromSides(newsides);\n },\n\n getBounds: function() {\n var minpoint;\n if (this.sides.length === 0) {\n minpoint = new CSG.Vector2D(0, 0);\n } else {\n minpoint = this.sides[0].vertex0.pos;\n }\n var maxpoint = minpoint;\n this.sides.map(function(side) {\n minpoint = minpoint.min(side.vertex0.pos);\n minpoint = minpoint.min(side.vertex1.pos);\n maxpoint = maxpoint.max(side.vertex0.pos);\n maxpoint = maxpoint.max(side.vertex1.pos);\n });\n return [minpoint, maxpoint];\n },\n\n isSelfIntersecting: function(debug) {\n var numsides = this.sides.length;\n for (var i = 0; i < numsides; i++) {\n var side0 = this.sides[i];\n for (var ii = i + 1; ii < numsides; ii++) {\n var side1 = this.sides[ii];\n if (CAG.linesIntersect(side0.vertex0.pos, side0.vertex1.pos, side1.vertex0.pos, side1.vertex1.pos)) {\n if (debug) { OpenJsCad.log(side0); OpenJsCad.log(side1);}\n return true;\n }\n }\n }\n return false;\n },\n\n expandedShell: function(radius, resolution) {\n resolution = resolution || 8;\n if (resolution < 4) resolution = 4;\n var cags = [];\n var pointmap = {};\n var cag = this.canonicalized();\n cag.sides.map(function(side) {\n var d = side.vertex1.pos.minus(side.vertex0.pos);\n var dl = d.length();\n if (dl > 1e-5) {\n d = d.times(1.0 / dl);\n var normal = d.normal().times(radius);\n var shellpoints = [\n side.vertex1.pos.plus(normal),\n side.vertex1.pos.minus(normal),\n side.vertex0.pos.minus(normal),\n side.vertex0.pos.plus(normal)\n ];\n // var newcag = CAG.fromPointsNoCheck(shellpoints);\n var newcag = CAG.fromPoints(shellpoints);\n cags.push(newcag);\n for (var step = 0; step < 2; step++) {\n var p1 = (step === 0) ? side.vertex0.pos : side.vertex1.pos;\n var p2 = (step === 0) ? side.vertex1.pos : side.vertex0.pos;\n var tag = p1.x + \" \" + p1.y;\n if (!(tag in pointmap)) {\n pointmap[tag] = [];\n }\n pointmap[tag].push({\n \"p1\": p1,\n \"p2\": p2\n });\n }\n }\n });\n for (var tag in pointmap) {\n var m = pointmap[tag];\n var angle1, angle2;\n var pcenter = m[0].p1;\n if (m.length == 2) {\n var end1 = m[0].p2;\n var end2 = m[1].p2;\n angle1 = end1.minus(pcenter).angleDegrees();\n angle2 = end2.minus(pcenter).angleDegrees();\n if (angle2 < angle1) angle2 += 360;\n if (angle2 >= (angle1 + 360)) angle2 -= 360;\n if (angle2 < angle1 + 180) {\n var t = angle2;\n angle2 = angle1 + 360;\n angle1 = t;\n }\n angle1 += 90;\n angle2 -= 90;\n } else {\n angle1 = 0;\n angle2 = 360;\n }\n var fullcircle = (angle2 > angle1 + 359.999);\n if (fullcircle) {\n angle1 = 0;\n angle2 = 360;\n }\n if (angle2 > (angle1 + 1e-5)) {\n var points = [];\n if (!fullcircle) {\n points.push(pcenter);\n }\n var numsteps = Math.round(resolution * (angle2 - angle1) / 360);\n if (numsteps < 1) numsteps = 1;\n for (var step = 0; step <= numsteps; step++) {\n var angle = angle1 + step / numsteps * (angle2 - angle1);\n if (step == numsteps) angle = angle2; // prevent rounding errors\n var point = pcenter.plus(CSG.Vector2D.fromAngleDegrees(angle).times(radius));\n if ((!fullcircle) || (step > 0)) {\n points.push(point);\n }\n }\n var newcag = CAG.fromPointsNoCheck(points);\n cags.push(newcag);\n }\n }\n var result = new CAG();\n result = result.union(cags);\n return result;\n },\n\n expand: function(radius, resolution) {\n var result = this.union(this.expandedShell(radius, resolution));\n return result;\n },\n\n contract: function(radius, resolution) {\n var result = this.subtract(this.expandedShell(radius, resolution));\n return result;\n },\n\n // extrude the CAG in a certain plane. \n // Giving just a plane is not enough, multiple different extrusions in the same plane would be possible\n // by rotating around the plane's origin. An additional right-hand vector should be specified as well,\n // and this is exactly a CSG.OrthoNormalBasis.\n // orthonormalbasis: characterizes the plane in which to extrude\n // depth: thickness of the extruded shape. Extrusion is done symmetrically above and below the plane.\n extrudeInOrthonormalBasis: function(orthonormalbasis, depth) {\n // first extrude in the regular Z plane:\n if (!(orthonormalbasis instanceof CSG.OrthoNormalBasis)) {\n throw new Error(\"extrudeInPlane: the first parameter should be a CSG.OrthoNormalBasis\");\n }\n var extruded = this.extrude({\n offset: [0, 0, depth]\n });\n var matrix = orthonormalbasis.getInverseProjectionMatrix();\n extruded = extruded.transform(matrix);\n return extruded;\n },\n\n // Extrude in a standard cartesian plane, specified by two axis identifiers. Each identifier can be\n // one of [\"X\",\"Y\",\"Z\",\"-X\",\"-Y\",\"-Z\"]\n // The 2d x axis will map to the first given 3D axis, the 2d y axis will map to the second.\n // See CSG.OrthoNormalBasis.GetCartesian for details.\n extrudeInPlane: function(axis1, axis2, depth) {\n return this.extrudeInOrthonormalBasis(CSG.OrthoNormalBasis.GetCartesian(axis1, axis2), depth);\n },\n\n // extruded=cag.extrude({offset: [0,0,10], twistangle: 360, twiststeps: 100});\n // linear extrusion of 2D shape, with optional twist\n // The 2d shape is placed in in z=0 plane and extruded into direction (a CSG.Vector3D)\n // The final face is rotated degrees. Rotation is done around the origin of the 2d shape (i.e. x=0, y=0)\n // twiststeps determines the resolution of the twist (should be >= 1)\n // returns a CSG object\n extrude: function(options) {\n if (this.sides.length == 0) {\n // empty!\n return new CSG();\n }\n var offsetVector = CSG.parseOptionAs3DVector(options, \"offset\", [0, 0, 1]);\n var twistangle = CSG.parseOptionAsFloat(options, \"twistangle\", 0);\n var twiststeps = CSG.parseOptionAsInt(options, \"twiststeps\", CSG.defaultResolution3D);\n if (offsetVector.z == 0) {\n throw('offset cannot be orthogonal to Z axis');\n }\n if (twistangle == 0 || twiststeps < 1) {\n twiststeps = 1;\n }\n var normalVector = CSG.Vector3D.Create(0, 1, 0);\n\n var polygons = [];\n // bottom and top\n polygons = polygons.concat(this._toPlanePolygons({translation: [0, 0, 0],\n normalVector: normalVector, flipped: !(offsetVector.z < 0)}));\n polygons = polygons.concat(this._toPlanePolygons({translation: offsetVector,\n normalVector: normalVector.rotateZ(twistangle), flipped: offsetVector.z < 0}));\n // walls\n for (var i = 0; i < twiststeps; i++) {\n var c1 = new CSG.Connector(offsetVector.times(i / twiststeps), [0, 0, offsetVector.z],\n normalVector.rotateZ(i * twistangle/twiststeps));\n var c2 = new CSG.Connector(offsetVector.times((i + 1) / twiststeps), [0, 0, offsetVector.z],\n normalVector.rotateZ((i + 1) * twistangle/twiststeps));\n polygons = polygons.concat(this._toWallPolygons({toConnector1: c1, toConnector2: c2}));\n }\n\n return CSG.fromPolygons(polygons);\n },\n\n /*\n * extrude CAG to 3d object by rotating the origin around the y axis\n * (and turning everything into XY plane)\n * arguments: options dict with angle and resolution, both optional\n */\n rotateExtrude: function(options) {\n var alpha = CSG.parseOptionAsFloat(options, \"angle\", 360);\n var resolution = CSG.parseOptionAsInt(options, \"resolution\", CSG.defaultResolution3D);\n\n var EPS = 1e-5;\n\n alpha = alpha > 360 ? alpha % 360 : alpha;\n var origin = [0, 0, 0];\n var axisV = CSG.Vector3D.Create(0, 1, 0);\n var normalV = [0, 0, 1];\n var polygons = [];\n // planes only needed if alpha > 0\n var connS = new CSG.Connector(origin, axisV, normalV);\n if (alpha > 0 && alpha < 360) {\n // we need to rotate negative to satisfy wall function condition of\n // building in the direction of axis vector\n var connE = new CSG.Connector(origin, axisV.rotateZ(-alpha), normalV);\n polygons = polygons.concat(\n this._toPlanePolygons({toConnector: connS, flipped: true}));\n polygons = polygons.concat(\n this._toPlanePolygons({toConnector: connE}));\n }\n var connT1 = connS, connT2;\n var step = alpha/resolution;\n for (var a = step; a <= alpha + EPS; a += step) {\n connT2 = new CSG.Connector(origin, axisV.rotateZ(-a), normalV);\n polygons = polygons.concat(this._toWallPolygons(\n {toConnector1: connT1, toConnector2: connT2}));\n connT1 = connT2;\n }\n return CSG.fromPolygons(polygons).reTesselated();\n },\n\n // check if we are a valid CAG (for debugging)\n // NOTE(bebbi) uneven side count doesn't work because rounding with EPS isn't taken into account\n check: function() {\n var EPS = 1e-5;\n var errors = [];\n if (this.isSelfIntersecting(true)) {\n errors.push(\"Self intersects\");\n }\n var pointcount = {};\n this.sides.map(function(side) {\n function mappoint(p) {\n var tag = p.x + \" \" + p.y;\n if (!(tag in pointcount)) pointcount[tag] = 0;\n pointcount[tag] ++;\n }\n mappoint(side.vertex0.pos);\n mappoint(side.vertex1.pos);\n });\n for (var tag in pointcount) {\n var count = pointcount[tag];\n if (count & 1) {\n errors.push(\"Uneven number of sides (\" + count + \") for point \" + tag);\n }\n }\n var area = this.area();\n if (area < EPS*EPS) {\n errors.push(\"Area is \" + area);\n }\n if (errors.length > 0) {\n var ertxt = \"\";\n errors.map(function(err) {\n ertxt += err + \"\\n\";\n });\n throw new Error(ertxt);\n }\n },\n\n canonicalized: function() {\n if (this.isCanonicalized) {\n return this;\n } else {\n var factory = new CAG.fuzzyCAGFactory();\n var result = factory.getCAG(this);\n result.isCanonicalized = true;\n return result;\n }\n },\n\n toCompactBinary: function() {\n var cag = this.canonicalized();\n var numsides = cag.sides.length;\n var vertexmap = {};\n var vertices = [];\n var numvertices = 0;\n var sideVertexIndices = new Uint32Array(2 * numsides);\n var sidevertexindicesindex = 0;\n cag.sides.map(function(side) {\n [side.vertex0, side.vertex1].map(function(v) {\n var vertextag = v.getTag();\n var vertexindex;\n if (!(vertextag in vertexmap)) {\n vertexindex = numvertices++;\n vertexmap[vertextag] = vertexindex;\n vertices.push(v);\n } else {\n vertexindex = vertexmap[vertextag];\n }\n sideVertexIndices[sidevertexindicesindex++] = vertexindex;\n });\n });\n var vertexData = new Float64Array(numvertices * 2);\n var verticesArrayIndex = 0;\n vertices.map(function(v) {\n var pos = v.pos;\n vertexData[verticesArrayIndex++] = pos._x;\n vertexData[verticesArrayIndex++] = pos._y;\n });\n var result = {\n 'class': \"CAG\",\n sideVertexIndices: sideVertexIndices,\n vertexData: vertexData\n };\n return result;\n },\n\n getOutlinePaths: function() {\n var cag = this.canonicalized();\n var sideTagToSideMap = {};\n var startVertexTagToSideTagMap = {};\n cag.sides.map(function(side) {\n var sidetag = side.getTag();\n sideTagToSideMap[sidetag] = side;\n var startvertextag = side.vertex0.getTag();\n if (!(startvertextag in startVertexTagToSideTagMap)) {\n startVertexTagToSideTagMap[startvertextag] = [];\n }\n startVertexTagToSideTagMap[startvertextag].push(sidetag);\n });\n var paths = [];\n while (true) {\n var startsidetag = null;\n for (var aVertexTag in startVertexTagToSideTagMap) {\n var sidesForThisVertex = startVertexTagToSideTagMap[aVertexTag];\n startsidetag = sidesForThisVertex[0];\n sidesForThisVertex.splice(0, 1);\n if (sidesForThisVertex.length === 0) {\n delete startVertexTagToSideTagMap[aVertexTag];\n }\n break;\n }\n if (startsidetag === null) break; // we've had all sides\n var connectedVertexPoints = [];\n var sidetag = startsidetag;\n var thisside = sideTagToSideMap[sidetag];\n var startvertextag = thisside.vertex0.getTag();\n while (true) {\n connectedVertexPoints.push(thisside.vertex0.pos);\n var nextvertextag = thisside.vertex1.getTag();\n if (nextvertextag == startvertextag) break; // we've closed the polygon\n if (!(nextvertextag in startVertexTagToSideTagMap)) {\n throw new Error(\"Area is not closed!\");\n }\n var nextpossiblesidetags = startVertexTagToSideTagMap[nextvertextag];\n var nextsideindex = -1;\n if (nextpossiblesidetags.length == 1) {\n nextsideindex = 0;\n } else {\n // more than one side starting at the same vertex. This means we have\n // two shapes touching at the same corner\n var bestangle = null;\n var thisangle = thisside.direction().angleDegrees();\n for (var sideindex = 0; sideindex < nextpossiblesidetags.length; sideindex++) {\n var nextpossiblesidetag = nextpossiblesidetags[sideindex];\n var possibleside = sideTagToSideMap[nextpossiblesidetag];\n var angle = possibleside.direction().angleDegrees();\n var angledif = angle - thisangle;\n if (angledif < -180) angledif += 360;\n if (angledif >= 180) angledif -= 360;\n if ((nextsideindex < 0) || (angledif > bestangle)) {\n nextsideindex = sideindex;\n bestangle = angledif;\n }\n }\n }\n var nextsidetag = nextpossiblesidetags[nextsideindex];\n nextpossiblesidetags.splice(nextsideindex, 1);\n if (nextpossiblesidetags.length === 0) {\n delete startVertexTagToSideTagMap[nextvertextag];\n }\n thisside = sideTagToSideMap[nextsidetag];\n } // inner loop\n var path = new CSG.Path2D(connectedVertexPoints, true);\n paths.push(path);\n } // outer loop\n return paths;\n },\n\n /*\n cag = cag.overCutInsideCorners(cutterradius);\n\n Using a CNC router it's impossible to cut out a true sharp inside corner. The inside corner\n will be rounded due to the radius of the cutter. This function compensates for this by creating\n an extra cutout at each inner corner so that the actual cut out shape will be at least as large\n as needed.\n */\n overCutInsideCorners: function(cutterradius) {\n var cag = this.canonicalized();\n // for each vertex determine the 'incoming' side and 'outgoing' side:\n var pointmap = {}; // tag => {pos: coord, from: [], to: []}\n cag.sides.map(function(side) {\n if (!(side.vertex0.getTag() in pointmap)) {\n pointmap[side.vertex0.getTag()] = {\n pos: side.vertex0.pos,\n from: [],\n to: []\n };\n }\n pointmap[side.vertex0.getTag()].to.push(side.vertex1.pos);\n if (!(side.vertex1.getTag() in pointmap)) {\n pointmap[side.vertex1.getTag()] = {\n pos: side.vertex1.pos,\n from: [],\n to: []\n };\n }\n pointmap[side.vertex1.getTag()].from.push(side.vertex0.pos);\n });\n // overcut all sharp corners:\n var cutouts = [];\n for (var pointtag in pointmap) {\n var pointobj = pointmap[pointtag];\n if ((pointobj.from.length == 1) && (pointobj.to.length == 1)) {\n // ok, 1 incoming side and 1 outgoing side:\n var fromcoord = pointobj.from[0];\n var pointcoord = pointobj.pos;\n var tocoord = pointobj.to[0];\n var v1 = pointcoord.minus(fromcoord).unit();\n var v2 = tocoord.minus(pointcoord).unit();\n var crossproduct = v1.cross(v2);\n var isInnerCorner = (crossproduct < 0.001);\n if (isInnerCorner) {\n // yes it's a sharp corner:\n var alpha = v2.angleRadians() - v1.angleRadians() + Math.PI;\n if (alpha < 0) {\n alpha += 2 * Math.PI;\n } else if (alpha >= 2 * Math.PI) {\n alpha -= 2 * Math.PI;\n }\n var midvector = v2.minus(v1).unit();\n var circlesegmentangle = 30 / 180 * Math.PI; // resolution of the circle: segments of 30 degrees\n // we need to increase the radius slightly so that our imperfect circle will contain a perfect circle of cutterradius\n var radiuscorrected = cutterradius / Math.cos(circlesegmentangle / 2);\n var circlecenter = pointcoord.plus(midvector.times(radiuscorrected));\n // we don't need to create a full circle; a pie is enough. Find the angles for the pie:\n var startangle = alpha + midvector.angleRadians();\n var deltaangle = 2 * (Math.PI - alpha);\n var numsteps = 2 * Math.ceil(deltaangle / circlesegmentangle / 2); // should be even\n // build the pie:\n var points = [circlecenter];\n for (var i = 0; i <= numsteps; i++) {\n var angle = startangle + i / numsteps * deltaangle;\n var p = CSG.Vector2D.fromAngleRadians(angle).times(radiuscorrected).plus(circlecenter);\n points.push(p);\n }\n cutouts.push(CAG.fromPoints(points));\n }\n }\n }\n var result = cag.subtract(cutouts);\n return result;\n }\n };\n\n CAG.Vertex = function(pos) {\n this.pos = pos;\n };\n\n CAG.Vertex.fromObject = function(obj) {\n return new CAG.Vertex(new CSG.Vector2D(obj.pos._x,obj.pos._y));\n };\n\n CAG.Vertex.prototype = {\n toString: function() {\n return \"(\" + this.pos.x.toFixed(2) + \",\" + this.pos.y.toFixed(2) + \")\";\n },\n getTag: function() {\n var result = this.tag;\n if (!result) {\n result = CSG.getTag();\n this.tag = result;\n }\n return result;\n }\n };\n\n CAG.Side = function(vertex0, vertex1) {\n if (!(vertex0 instanceof CAG.Vertex)) throw new Error(\"Assertion failed\");\n if (!(vertex1 instanceof CAG.Vertex)) throw new Error(\"Assertion failed\");\n this.vertex0 = vertex0;\n this.vertex1 = vertex1;\n };\n\n CAG.Side.fromObject = function(obj) {\n var vertex0 = CAG.Vertex.fromObject(obj.vertex0);\n var vertex1 = CAG.Vertex.fromObject(obj.vertex1);\n return new CAG.Side(vertex0,vertex1);\n };\n\n CAG.Side._fromFakePolygon = function(polygon) {\n polygon.vertices.forEach(function(v) {\n if (!((v.pos.z >= -1.001) && (v.pos.z < -0.999)) && !((v.pos.z >= 0.999) && (v.pos.z < 1.001))) {\n throw(\"Assertion failed: _fromFakePolygon expects abs z values of 1\");\n }\n })\n // this can happen based on union, seems to be residuals -\n // return null and handle in caller\n if (polygon.vertices.length < 4) {\n return null;\n }\n var reverse = false;\n var vert1Indices = [];\n var pts2d = polygon.vertices.filter(function(v, i) {\n if (v.pos.z > 0) {\n vert1Indices.push(i);\n return true;\n }\n })\n .map(function(v) {\n return new CSG.Vector2D(v.pos.x, v.pos.y);\n });\n if (pts2d.length != 2) {\n throw('Assertion failed: _fromFakePolygon: not enough points found')\n }\n var d = vert1Indices[1] - vert1Indices[0];\n if (d == 1 || d == 3) {\n if (d == 1) {\n pts2d.reverse();\n }\n } else {\n throw('Assertion failed: _fromFakePolygon: unknown index ordering');\n }\n var result = new CAG.Side(new CAG.Vertex(pts2d[0]), new CAG.Vertex(pts2d[1]));\n return result;\n };\n\n CAG.Side.prototype = {\n toString: function() {\n return this.vertex0 + \" -> \" + this.vertex1;\n },\n\n toPolygon3D: function(z0, z1) {\n var vertices = [\n new CSG.Vertex(this.vertex0.pos.toVector3D(z0)),\n new CSG.Vertex(this.vertex1.pos.toVector3D(z0)),\n new CSG.Vertex(this.vertex1.pos.toVector3D(z1)),\n new CSG.Vertex(this.vertex0.pos.toVector3D(z1))\n ];\n return new CSG.Polygon(vertices);\n },\n\n transform: function(matrix4x4) {\n var newp1 = this.vertex0.pos.transform(matrix4x4);\n var newp2 = this.vertex1.pos.transform(matrix4x4);\n return new CAG.Side(new CAG.Vertex(newp1), new CAG.Vertex(newp2));\n },\n\n flipped: function() {\n return new CAG.Side(this.vertex1, this.vertex0);\n },\n\n direction: function() {\n return this.vertex1.pos.minus(this.vertex0.pos);\n },\n\n getTag: function() {\n var result = this.tag;\n if (!result) {\n result = CSG.getTag();\n this.tag = result;\n }\n return result;\n },\n\n lengthSquared: function() {\n var x = this.vertex1.pos.x - this.vertex0.pos.x,\n y = this.vertex1.pos.y - this.vertex0.pos.y;\n return x * x + y * y;\n },\n\n length: function() {\n return Math.sqrt(this.lengthSquared());\n }\n };\n\n //////////////////////////////////////\n CAG.fuzzyCAGFactory = function() {\n this.vertexfactory = new CSG.fuzzyFactory(2, 1e-5);\n };\n\n CAG.fuzzyCAGFactory.prototype = {\n getVertex: function(sourcevertex) {\n var elements = [sourcevertex.pos._x, sourcevertex.pos._y];\n var result = this.vertexfactory.lookupOrCreate(elements, function(els) {\n return sourcevertex;\n });\n return result;\n },\n\n getSide: function(sourceside) {\n var vertex0 = this.getVertex(sourceside.vertex0);\n var vertex1 = this.getVertex(sourceside.vertex1);\n return new CAG.Side(vertex0, vertex1);\n },\n\n getCAG: function(sourcecag) {\n var _this = this;\n var newsides = sourcecag.sides.map(function(side) {\n return _this.getSide(side);\n })\n // remove bad sides (mostly a user input issue)\n .filter(function(side) {\n return side.length() > 1e-5;\n });\n return CAG.fromSides(newsides);\n }\n };\n\n //////////////////////////////////////\n CSG.addTransformationMethodsToPrototype(CSG.prototype);\n CSG.addTransformationMethodsToPrototype(CSG.Vector2D.prototype);\n CSG.addTransformationMethodsToPrototype(CSG.Vector3D.prototype);\n CSG.addTransformationMethodsToPrototype(CSG.Vertex.prototype);\n CSG.addTransformationMethodsToPrototype(CSG.Plane.prototype);\n CSG.addTransformationMethodsToPrototype(CSG.Polygon.prototype);\n CSG.addTransformationMethodsToPrototype(CSG.Line3D.prototype);\n CSG.addTransformationMethodsToPrototype(CSG.Connector.prototype);\n CSG.addTransformationMethodsToPrototype(CSG.Path2D.prototype);\n CSG.addTransformationMethodsToPrototype(CSG.Line2D.prototype);\n CSG.addTransformationMethodsToPrototype(CAG.prototype);\n CSG.addTransformationMethodsToPrototype(CAG.Side.prototype);\n CSG.addTransformationMethodsToPrototype(CSG.OrthoNormalBasis.prototype);\n\n CSG.addCenteringToPrototype(CSG.prototype, ['x', 'y', 'z']);\n CSG.addCenteringToPrototype(CAG.prototype, ['x', 'y']);\n\n /*\n 2D polygons are now supported through the CAG class.\n With many improvements (see documentation):\n - shapes do no longer have to be convex\n - union/intersect/subtract is supported\n - expand / contract are supported\n\n But we'll keep CSG.Polygon2D as a stub for backwards compatibility\n */\n \n CSG.Polygon2D = function(points) {\n var cag = CAG.fromPoints(points);\n this.sides = cag.sides;\n };\n CSG.Polygon2D.prototype = CAG.prototype;\n\n\n //console.log('module', module)\n //module.CSG = CSG;\n //module.CAG = CAG;\n//})(this); //module to export to\n\nmodule.exports = {CSG,CAG}//({})(module)\n","/*\n * Blob.js\n * See https://developer.mozilla.org/en-US/docs/Web/API/Blob\n *\n * Node and Browserify Compatible\n *\n * Copyright (c) 2015 by Z3 Dev (@zdev/www.z3dev.jp)\n * License: MIT License\n *\n * This implementation uses the Buffer class for all storage.\n * See https://nodejs.org/api/buffer.html\n *\n * URL.createObjectURL(blob)\n *\n * History:\n * 2015/07/02: 0.0.1: contributed to OpenJSCAD.org CLI openjscad\n */\n\nexport default function makeBlob(contents, options){\n const blob = typeof window !== 'undefined' ? window.Blob : Blob\n return blob\n}\n\nfunction Blob (contents, options) {\n // make the optional options non-optional\n options = options || {}\n // number of bytes\n this.size = 0 // contents, not allocation\n // media type\n this.type = ''\n // readability state (CLOSED: true, OPENED: false)\n this.isClosed = false\n // encoding of given strings\n this.encoding = 'utf8'\n // storage\n this.buffer = null\n this.length = 32e+6 // allocation, not contents\n\n if (!contents) return\n if (!Array.isArray(contents)) return\n\n // process options if any\n if (options.type) {\n // TBD if type contains any chars outside range U+0020 to U+007E, then set type to the empty string\n // Convert every character in type to lowercase\n this.type = options.type.toLowerCase()\n }\n if (options.endings) {\n // convert the EOL on strings\n }\n if (options.encoding) {\n this.encoding = options.encoding.toLowerCase()\n }\n if (options.length) {\n this.length = options.length\n }\n\n let wbytes\n let object\n // convert the contents (String, ArrayBufferView, ArrayBuffer, Blob)\n this.buffer = new Buffer(this.length)\n var index = 0\n for (index = 0; index < contents.length; index++) {\n switch (typeof (contents[index])) {\n case 'string':\n wbytes = this.buffer.write(contents[index], this.size, this.encoding)\n this.size = this.size + wbytes\n break\n case 'object':\n object = contents[index] // this should be a reference to an object\n if (Buffer.isBuffer(object)) {\n }\n if (object instanceof ArrayBuffer) {\n var view = new DataView(object)\n var bindex = 0\n for (bindex = 0; bindex < object.byteLength; bindex++) {\n var xbyte = view.getUint8(bindex)\n wbytes = this.buffer.writeUInt8(xbyte, this.size, false)\n this.size++\n }\n }\n break\n default:\n break\n }\n }\n return this\n}\n\nBlob.prototype = {\n asBuffer: function () {\n return this.buffer.slice(0, this.size)\n },\n\n slice: function (start, end, type) {\n start = start || 0\n end = end || this.size\n type = type || ''\n return new Blob()\n },\n\n close: function () {\n // if state of context objext is already CLOSED then return\n if (this.isClosed) return\n // set the readbility state of the context object to CLOSED and remove storage\n this.isClosed = true\n },\n\n toString: function () {\n return 'blob blob blob'\n }\n}\n\nexport function revokeBlobUrl (url) {\n if (window.URL) window.URL.revokeObjectURL(url)\n else if (window.webkitURL) window.webkitURL.revokeObjectURL(url)\n else throw new Error(\"Your browser doesn't support window.URL\")\n}\n","import makeBlob from '../../utils/Blob'\nconst Blob = makeBlob()\n\nexport default function toStlString (CSG) {\n var result = 'solid csg.js\\n'\n CSG.polygons.map(function (p) {\n result += CSGPolygontoStlString(p)\n })\n result += 'endsolid csg.js\\n'\n return new Blob([result], {\n type: 'application/sla'\n })\n}\n\nfunction CSGVector3DtoStlString (v) {\n return v._x + ' ' + v._y + ' ' + v._z\n}\n\nfunction CSGVertextoStlString (vertex) {\n return 'vertex ' + CSGVector3DtoStlString(vertex.pos) + '\\n'\n}\n\nfunction CSGPolygontoStlString (polygon) {\n var result = ''\n if (polygon.vertices.length >= 3) // should be!\n {\n // STL requires triangular polygons. If our polygon has more vertices, create\n // multiple triangles:\n var firstVertexStl = CSGVertextoStlString(polygon.vertices[0])\n for (var i = 0; i < polygon.vertices.length - 2; i++) {\n result += 'facet normal ' + CSGVector3DtoStlString(polygon.plane.normal) + '\\nouter loop\\n'\n result += firstVertexStl\n result += CSGVertextoStlString(polygon.vertices[i + 1])\n result += CSGVertextoStlString(polygon.vertices[i + 2])\n result += 'endloop\\nendfacet\\n'\n }\n }\n return result\n}\n","import makeBlob from '../../utils/Blob'\nconst Blob = makeBlob()\n\n// see http://en.wikipedia.org/wiki/STL_%28file_format%29#Binary_STL\nexport default function toStlBinary (CSG) {\n // first check if the host is little-endian:\n var buffer = new ArrayBuffer(4)\n var int32buffer = new Int32Array(buffer, 0, 1)\n var int8buffer = new Int8Array(buffer, 0, 4)\n int32buffer[0] = 0x11223344\n if (int8buffer[0] != 0x44) {\n throw new Error('Binary STL output is currently only supported on little-endian (Intel) processors')\n }\n\n var numtriangles = 0\n CSG.polygons.map(function (p) {\n var numvertices = p.vertices.length\n var thisnumtriangles = (numvertices >= 3) ? numvertices - 2 : 0\n numtriangles += thisnumtriangles\n })\n var headerarray = new Uint8Array(80)\n for (var i = 0; i < 80; i++) {\n headerarray[i] = 65\n }\n var ar1 = new Uint32Array(1)\n ar1[0] = numtriangles\n // write the triangles to allTrianglesBuffer:\n var allTrianglesBuffer = new ArrayBuffer(50 * numtriangles)\n var allTrianglesBufferAsInt8 = new Int8Array(allTrianglesBuffer)\n // a tricky problem is that a Float32Array must be aligned at 4-byte boundaries (at least in certain browsers)\n // while each triangle takes 50 bytes. Therefore we write each triangle to a temporary buffer, and copy that\n // into allTrianglesBuffer:\n var triangleBuffer = new ArrayBuffer(50)\n var triangleBufferAsInt8 = new Int8Array(triangleBuffer)\n // each triangle consists of 12 floats:\n var triangleFloat32array = new Float32Array(triangleBuffer, 0, 12)\n // and one uint16:\n var triangleUint16array = new Uint16Array(triangleBuffer, 48, 1)\n var byteoffset = 0\n CSG.polygons.map(function (p) {\n var numvertices = p.vertices.length\n for (var i = 0; i < numvertices - 2; i++) {\n var normal = p.plane.normal\n triangleFloat32array[0] = normal._x\n triangleFloat32array[1] = normal._y\n triangleFloat32array[2] = normal._z\n var arindex = 3\n for (var v = 0; v < 3; v++) {\n var vv = v + ((v > 0) ? i : 0)\n var vertexpos = p.vertices[vv].pos\n triangleFloat32array[arindex++] = vertexpos._x\n triangleFloat32array[arindex++] = vertexpos._y\n triangleFloat32array[arindex++] = vertexpos._z\n }\n triangleUint16array[0] = 0\n // copy the triangle into allTrianglesBuffer:\n allTrianglesBufferAsInt8.set(triangleBufferAsInt8, byteoffset)\n byteoffset += 50\n }\n })\n return new Blob([headerarray.buffer, ar1.buffer, allTrianglesBuffer], {\n type: 'application/sla'\n })\n}\n","import makeBlob from '../../utils/Blob'\nconst Blob = makeBlob()\n\nexport default function toAMFString (CSG, m) {\n var result = '\\n\\n'\n for (var k in m) {\n result += '' + m[k] + '\\n'\n }\n result += '\\n\\n\\n'\n\n CSG.polygons.map(function (p) { // first we dump all vertices of all polygons\n for (var i = 0; i < p.vertices.length; i++) {\n result += CSGVertextoAMFString(p.vertices[i])\n }\n })\n result += '\\n'\n\n var n = 0\n CSG.polygons.map(function (p) { // then we dump all polygons\n result += '\\n'\n if (p.vertices.length < 3)\n return\n var color = null\n if (p.shared && p.shared.color) {\n color = p.shared.color\n } else if (p.color) {\n color = p.color\n }\n if (color != null) {\n if (color.length < 4) color.push(1.)\n result += '' + color[0] + '' + color[1] + '' + color[2] + '' + color[3] + ''\n }\n\n for (var i = 0; i < p.vertices.length - 2; i++) { // making sure they are all triangles (triangular polygons)\n result += ''\n result += '' + (n) + ''\n result += '' + (n + i + 1) + ''\n result += '' + (n + i + 2) + ''\n result += '\\n'\n }\n n += p.vertices.length\n result += '\\n'\n })\n result += '\\n\\n'\n result += '\\n'\n\n return new Blob([result], {\n type: 'application/amf+xml'\n })\n}\n\nfunction CSGVectortoAMFString(v){\n return '' + v._x + '' + v._y + '' + v._z + ''\n}\n\nfunction CSGVertextoAMFString(vertex){\n return '' + CSGVectortoAMFString(vertex.pos) + '\\n'\n}\n/*\nCSG.Vector3D.prototype.toAMFString = function () {\n return '' + this._x + '' + this._y + '' + this._z + ''\n}\n\nCSG.Vertex.prototype.toAMFString = function () {\n return '' + this.pos.toAMFString() + '\\n'\n}*/\n","//[4] \tNameStartChar\t ::= \t\":\" | [A-Z] | \"_\" | [a-z] | [#xC0-#xD6] | [#xD8-#xF6] | [#xF8-#x2FF] | [#x370-#x37D] | [#x37F-#x1FFF] | [#x200C-#x200D] | [#x2070-#x218F] | [#x2C00-#x2FEF] | [#x3001-#xD7FF] | [#xF900-#xFDCF] | [#xFDF0-#xFFFD] | [#x10000-#xEFFFF]\r\n//[4a] \tNameChar\t ::= \tNameStartChar | \"-\" | \".\" | [0-9] | #xB7 | [#x0300-#x036F] | [#x203F-#x2040]\r\n//[5] \tName\t ::= \tNameStartChar (NameChar)*\r\nvar nameStartChar = /[A-Z_a-z\\xC0-\\xD6\\xD8-\\xF6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD]///\\u10000-\\uEFFFF\r\nvar nameChar = new RegExp(\"[\\\\-\\\\.0-9\"+nameStartChar.source.slice(1,-1)+\"\\\\u00B7\\\\u0300-\\\\u036F\\\\u203F-\\\\u2040]\");\r\nvar tagNamePattern = new RegExp('^'+nameStartChar.source+nameChar.source+'*(?:\\:'+nameStartChar.source+nameChar.source+'*)?$');\r\n//var tagNamePattern = /^[a-zA-Z_][\\w\\-\\.]*(?:\\:[a-zA-Z_][\\w\\-\\.]*)?$/\r\n//var handlers = 'resolveEntity,getExternalSubset,characters,endDocument,endElement,endPrefixMapping,ignorableWhitespace,processingInstruction,setDocumentLocator,skippedEntity,startDocument,startElement,startPrefixMapping,notationDecl,unparsedEntityDecl,error,fatalError,warning,attributeDecl,elementDecl,externalEntityDecl,internalEntityDecl,comment,endCDATA,endDTD,endEntity,startCDATA,startDTD,startEntity'.split(',')\r\n\r\n//S_TAG,\tS_ATTR,\tS_EQ,\tS_ATTR_NOQUOT_VALUE\r\n//S_ATTR_SPACE,\tS_ATTR_END,\tS_TAG_SPACE, S_TAG_CLOSE\r\nvar S_TAG = 0;//tag name offerring\r\nvar S_ATTR = 1;//attr name offerring \r\nvar S_ATTR_SPACE=2;//attr name end and space offer\r\nvar S_EQ = 3;//=space?\r\nvar S_ATTR_NOQUOT_VALUE = 4;//attr value(no quot value only)\r\nvar S_ATTR_END = 5;//attr value end and no space(quot end)\r\nvar S_TAG_SPACE = 6;//(attr value end || tag end ) && (space offer)\r\nvar S_TAG_CLOSE = 7;//closed el\r\n\r\nfunction XMLReader(){\r\n\t\r\n}\r\n\r\nXMLReader.prototype = {\r\n\tparse:function(source,defaultNSMap,entityMap){\r\n\t\tvar domBuilder = this.domBuilder;\r\n\t\tdomBuilder.startDocument();\r\n\t\t_copy(defaultNSMap ,defaultNSMap = {})\r\n\t\tparse(source,defaultNSMap,entityMap,\r\n\t\t\t\tdomBuilder,this.errorHandler);\r\n\t\tdomBuilder.endDocument();\r\n\t}\r\n}\r\nfunction parse(source,defaultNSMapCopy,entityMap,domBuilder,errorHandler){\r\n\tfunction fixedFromCharCode(code) {\r\n\t\t// String.prototype.fromCharCode does not supports\r\n\t\t// > 2 bytes unicode chars directly\r\n\t\tif (code > 0xffff) {\r\n\t\t\tcode -= 0x10000;\r\n\t\t\tvar surrogate1 = 0xd800 + (code >> 10)\r\n\t\t\t\t, surrogate2 = 0xdc00 + (code & 0x3ff);\r\n\r\n\t\t\treturn String.fromCharCode(surrogate1, surrogate2);\r\n\t\t} else {\r\n\t\t\treturn String.fromCharCode(code);\r\n\t\t}\r\n\t}\r\n\tfunction entityReplacer(a){\r\n\t\tvar k = a.slice(1,-1);\r\n\t\tif(k in entityMap){\r\n\t\t\treturn entityMap[k]; \r\n\t\t}else if(k.charAt(0) === '#'){\r\n\t\t\treturn fixedFromCharCode(parseInt(k.substr(1).replace('x','0x')))\r\n\t\t}else{\r\n\t\t\terrorHandler.error('entity not found:'+a);\r\n\t\t\treturn a;\r\n\t\t}\r\n\t}\r\n\tfunction appendText(end){//has some bugs\r\n\t\tif(end>start){\r\n\t\t\tvar xt = source.substring(start,end).replace(/&#?\\w+;/g,entityReplacer);\r\n\t\t\tlocator&&position(start);\r\n\t\t\tdomBuilder.characters(xt,0,end-start);\r\n\t\t\tstart = end\r\n\t\t}\r\n\t}\r\n\tfunction position(p,m){\r\n\t\twhile(p>=lineEnd && (m = linePattern.exec(source))){\r\n\t\t\tlineStart = m.index;\r\n\t\t\tlineEnd = lineStart + m[0].length;\r\n\t\t\tlocator.lineNumber++;\r\n\t\t\t//console.log('line++:',locator,startPos,endPos)\r\n\t\t}\r\n\t\tlocator.columnNumber = p-lineStart+1;\r\n\t}\r\n\tvar lineStart = 0;\r\n\tvar lineEnd = 0;\r\n\tvar linePattern = /.*(?:\\r\\n?|\\n)|.*$/g\r\n\tvar locator = domBuilder.locator;\r\n\t\r\n\tvar parseStack = [{currentNSMap:defaultNSMapCopy}]\r\n\tvar closeMap = {};\r\n\tvar start = 0;\r\n\twhile(true){\r\n\t\ttry{\r\n\t\t\tvar tagStart = source.indexOf('<',start);\r\n\t\t\tif(tagStart<0){\r\n\t\t\t\tif(!source.substr(start).match(/^\\s*$/)){\r\n\t\t\t\t\tvar doc = domBuilder.doc;\r\n\t \t\t\tvar text = doc.createTextNode(source.substr(start));\r\n\t \t\t\tdoc.appendChild(text);\r\n\t \t\t\tdomBuilder.currentElement = text;\r\n\t\t\t\t}\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tif(tagStart>start){\r\n\t\t\t\tappendText(tagStart);\r\n\t\t\t}\r\n\t\t\tswitch(source.charAt(tagStart+1)){\r\n\t\t\tcase '/':\r\n\t\t\t\tvar end = source.indexOf('>',tagStart+3);\r\n\t\t\t\tvar tagName = source.substring(tagStart+2,end);\r\n\t\t\t\tvar config = parseStack.pop();\r\n\t\t\t\tif(end<0){\r\n\t\t\t\t\t\r\n\t \t\ttagName = source.substring(tagStart+2).replace(/[\\s<].*/,'');\r\n\t \t\t//console.error('#@@@@@@'+tagName)\r\n\t \t\terrorHandler.error(\"end tag name: \"+tagName+' is not complete:'+config.tagName);\r\n\t \t\tend = tagStart+1+tagName.length;\r\n\t \t}else if(tagName.match(/\\s\r\n\t\t\t\tlocator&&position(tagStart);\r\n\t\t\t\tend = parseInstruction(source,tagStart,domBuilder);\r\n\t\t\t\tbreak;\r\n\t\t\tcase '!':// start){\r\n\t\t\tstart = end;\r\n\t\t}else{\r\n\t\t\t//TODO: 这里有可能sax回退,有位置错误风险\r\n\t\t\tappendText(Math.max(tagStart,start)+1);\r\n\t\t}\r\n\t}\r\n}\r\nfunction copyLocator(f,t){\r\n\tt.lineNumber = f.lineNumber;\r\n\tt.columnNumber = f.columnNumber;\r\n\treturn t;\r\n}\r\n\r\n/**\r\n * @see #appendElement(source,elStartEnd,el,selfClosed,entityReplacer,domBuilder,parseStack);\r\n * @return end of the elementStartPart(end of elementEndPart for selfClosed el)\r\n */\r\nfunction parseElementStartPart(source,start,el,currentNSMap,entityReplacer,errorHandler){\r\n\tvar attrName;\r\n\tvar value;\r\n\tvar p = ++start;\r\n\tvar s = S_TAG;//status\r\n\twhile(true){\r\n\t\tvar c = source.charAt(p);\r\n\t\tswitch(c){\r\n\t\tcase '=':\r\n\t\t\tif(s === S_ATTR){//attrName\r\n\t\t\t\tattrName = source.slice(start,p);\r\n\t\t\t\ts = S_EQ;\r\n\t\t\t}else if(s === S_ATTR_SPACE){\r\n\t\t\t\ts = S_EQ;\r\n\t\t\t}else{\r\n\t\t\t\t//fatalError: equal must after attrName or space after attrName\r\n\t\t\t\tthrow new Error('attribute equal must after attrName');\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\t\tcase '\\'':\r\n\t\tcase '\"':\r\n\t\t\tif(s === S_EQ || s === S_ATTR //|| s == S_ATTR_SPACE\r\n\t\t\t\t){//equal\r\n\t\t\t\tif(s === S_ATTR){\r\n\t\t\t\t\terrorHandler.warning('attribute value must after \"=\"')\r\n\t\t\t\t\tattrName = source.slice(start,p)\r\n\t\t\t\t}\r\n\t\t\t\tstart = p+1;\r\n\t\t\t\tp = source.indexOf(c,start)\r\n\t\t\t\tif(p>0){\r\n\t\t\t\t\tvalue = source.slice(start,p).replace(/&#?\\w+;/g,entityReplacer);\r\n\t\t\t\t\tel.add(attrName,value,start-1);\r\n\t\t\t\t\ts = S_ATTR_END;\r\n\t\t\t\t}else{\r\n\t\t\t\t\t//fatalError: no end quot match\r\n\t\t\t\t\tthrow new Error('attribute value no end \\''+c+'\\' match');\r\n\t\t\t\t}\r\n\t\t\t}else if(s == S_ATTR_NOQUOT_VALUE){\r\n\t\t\t\tvalue = source.slice(start,p).replace(/&#?\\w+;/g,entityReplacer);\r\n\t\t\t\t//console.log(attrName,value,start,p)\r\n\t\t\t\tel.add(attrName,value,start);\r\n\t\t\t\t//console.dir(el)\r\n\t\t\t\terrorHandler.warning('attribute \"'+attrName+'\" missed start quot('+c+')!!');\r\n\t\t\t\tstart = p+1;\r\n\t\t\t\ts = S_ATTR_END\r\n\t\t\t}else{\r\n\t\t\t\t//fatalError: no equal before\r\n\t\t\t\tthrow new Error('attribute value must after \"=\"');\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\t\tcase '/':\r\n\t\t\tswitch(s){\r\n\t\t\tcase S_TAG:\r\n\t\t\t\tel.setTagName(source.slice(start,p));\r\n\t\t\tcase S_ATTR_END:\r\n\t\t\tcase S_TAG_SPACE:\r\n\t\t\tcase S_TAG_CLOSE:\r\n\t\t\t\ts =S_TAG_CLOSE;\r\n\t\t\t\tel.closed = true;\r\n\t\t\tcase S_ATTR_NOQUOT_VALUE:\r\n\t\t\tcase S_ATTR:\r\n\t\t\tcase S_ATTR_SPACE:\r\n\t\t\t\tbreak;\r\n\t\t\t//case S_EQ:\r\n\t\t\tdefault:\r\n\t\t\t\tthrow new Error(\"attribute invalid close char('/')\")\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\t\tcase ''://end document\r\n\t\t\t//throw new Error('unexpected end of input')\r\n\t\t\terrorHandler.error('unexpected end of input');\r\n\t\t\tif(s == S_TAG){\r\n\t\t\t\tel.setTagName(source.slice(start,p));\r\n\t\t\t}\r\n\t\t\treturn p;\r\n\t\tcase '>':\r\n\t\t\tswitch(s){\r\n\t\t\tcase S_TAG:\r\n\t\t\t\tel.setTagName(source.slice(start,p));\r\n\t\t\tcase S_ATTR_END:\r\n\t\t\tcase S_TAG_SPACE:\r\n\t\t\tcase S_TAG_CLOSE:\r\n\t\t\t\tbreak;//normal\r\n\t\t\tcase S_ATTR_NOQUOT_VALUE://Compatible state\r\n\t\t\tcase S_ATTR:\r\n\t\t\t\tvalue = source.slice(start,p);\r\n\t\t\t\tif(value.slice(-1) === '/'){\r\n\t\t\t\t\tel.closed = true;\r\n\t\t\t\t\tvalue = value.slice(0,-1)\r\n\t\t\t\t}\r\n\t\t\tcase S_ATTR_SPACE:\r\n\t\t\t\tif(s === S_ATTR_SPACE){\r\n\t\t\t\t\tvalue = attrName;\r\n\t\t\t\t}\r\n\t\t\t\tif(s == S_ATTR_NOQUOT_VALUE){\r\n\t\t\t\t\terrorHandler.warning('attribute \"'+value+'\" missed quot(\")!!');\r\n\t\t\t\t\tel.add(attrName,value.replace(/&#?\\w+;/g,entityReplacer),start)\r\n\t\t\t\t}else{\r\n\t\t\t\t\tif(currentNSMap[''] !== 'http://www.w3.org/1999/xhtml' || !value.match(/^(?:disabled|checked|selected)$/i)){\r\n\t\t\t\t\t\terrorHandler.warning('attribute \"'+value+'\" missed value!! \"'+value+'\" instead!!')\r\n\t\t\t\t\t}\r\n\t\t\t\t\tel.add(value,value,start)\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\t\t\tcase S_EQ:\r\n\t\t\t\tthrow new Error('attribute value missed!!');\r\n\t\t\t}\r\n//\t\t\tconsole.log(tagName,tagNamePattern,tagNamePattern.test(tagName))\r\n\t\t\treturn p;\r\n\t\t/*xml space '\\x20' | #x9 | #xD | #xA; */\r\n\t\tcase '\\u0080':\r\n\t\t\tc = ' ';\r\n\t\tdefault:\r\n\t\t\tif(c<= ' '){//space\r\n\t\t\t\tswitch(s){\r\n\t\t\t\tcase S_TAG:\r\n\t\t\t\t\tel.setTagName(source.slice(start,p));//tagName\r\n\t\t\t\t\ts = S_TAG_SPACE;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase S_ATTR:\r\n\t\t\t\t\tattrName = source.slice(start,p)\r\n\t\t\t\t\ts = S_ATTR_SPACE;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase S_ATTR_NOQUOT_VALUE:\r\n\t\t\t\t\tvar value = source.slice(start,p).replace(/&#?\\w+;/g,entityReplacer);\r\n\t\t\t\t\terrorHandler.warning('attribute \"'+value+'\" missed quot(\")!!');\r\n\t\t\t\t\tel.add(attrName,value,start)\r\n\t\t\t\tcase S_ATTR_END:\r\n\t\t\t\t\ts = S_TAG_SPACE;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t//case S_TAG_SPACE:\r\n\t\t\t\t//case S_EQ:\r\n\t\t\t\t//case S_ATTR_SPACE:\r\n\t\t\t\t//\tvoid();break;\r\n\t\t\t\t//case S_TAG_CLOSE:\r\n\t\t\t\t\t//ignore warning\r\n\t\t\t\t}\r\n\t\t\t}else{//not space\r\n//S_TAG,\tS_ATTR,\tS_EQ,\tS_ATTR_NOQUOT_VALUE\r\n//S_ATTR_SPACE,\tS_ATTR_END,\tS_TAG_SPACE, S_TAG_CLOSE\r\n\t\t\t\tswitch(s){\r\n\t\t\t\t//case S_TAG:void();break;\r\n\t\t\t\t//case S_ATTR:void();break;\r\n\t\t\t\t//case S_ATTR_NOQUOT_VALUE:void();break;\r\n\t\t\t\tcase S_ATTR_SPACE:\r\n\t\t\t\t\tvar tagName = el.tagName;\r\n\t\t\t\t\tif(currentNSMap[''] !== 'http://www.w3.org/1999/xhtml' || !attrName.match(/^(?:disabled|checked|selected)$/i)){\r\n\t\t\t\t\t\terrorHandler.warning('attribute \"'+attrName+'\" missed value!! \"'+attrName+'\" instead2!!')\r\n\t\t\t\t\t}\r\n\t\t\t\t\tel.add(attrName,attrName,start);\r\n\t\t\t\t\tstart = p;\r\n\t\t\t\t\ts = S_ATTR;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase S_ATTR_END:\r\n\t\t\t\t\terrorHandler.warning('attribute space is required\"'+attrName+'\"!!')\r\n\t\t\t\tcase S_TAG_SPACE:\r\n\t\t\t\t\ts = S_ATTR;\r\n\t\t\t\t\tstart = p;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase S_EQ:\r\n\t\t\t\t\ts = S_ATTR_NOQUOT_VALUE;\r\n\t\t\t\t\tstart = p;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase S_TAG_CLOSE:\r\n\t\t\t\t\tthrow new Error(\"elements closed character '/' and '>' must be connected to\");\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}//end outer switch\r\n\t\t//console.log('p++',p)\r\n\t\tp++;\r\n\t}\r\n}\r\n/**\r\n * @return true if has new namespace define\r\n */\r\nfunction appendElement(el,domBuilder,currentNSMap){\r\n\tvar tagName = el.tagName;\r\n\tvar localNSMap = null;\r\n\t//var currentNSMap = parseStack[parseStack.length-1].currentNSMap;\r\n\tvar i = el.length;\r\n\twhile(i--){\r\n\t\tvar a = el[i];\r\n\t\tvar qName = a.qName;\r\n\t\tvar value = a.value;\r\n\t\tvar nsp = qName.indexOf(':');\r\n\t\tif(nsp>0){\r\n\t\t\tvar prefix = a.prefix = qName.slice(0,nsp);\r\n\t\t\tvar localName = qName.slice(nsp+1);\r\n\t\t\tvar nsPrefix = prefix === 'xmlns' && localName\r\n\t\t}else{\r\n\t\t\tlocalName = qName;\r\n\t\t\tprefix = null\r\n\t\t\tnsPrefix = qName === 'xmlns' && ''\r\n\t\t}\r\n\t\t//can not set prefix,because prefix !== ''\r\n\t\ta.localName = localName ;\r\n\t\t//prefix == null for no ns prefix attribute \r\n\t\tif(nsPrefix !== false){//hack!!\r\n\t\t\tif(localNSMap == null){\r\n\t\t\t\tlocalNSMap = {}\r\n\t\t\t\t//console.log(currentNSMap,0)\r\n\t\t\t\t_copy(currentNSMap,currentNSMap={})\r\n\t\t\t\t//console.log(currentNSMap,1)\r\n\t\t\t}\r\n\t\t\tcurrentNSMap[nsPrefix] = localNSMap[nsPrefix] = value;\r\n\t\t\ta.uri = 'http://www.w3.org/2000/xmlns/'\r\n\t\t\tdomBuilder.startPrefixMapping(nsPrefix, value) \r\n\t\t}\r\n\t}\r\n\tvar i = el.length;\r\n\twhile(i--){\r\n\t\ta = el[i];\r\n\t\tvar prefix = a.prefix;\r\n\t\tif(prefix){//no prefix attribute has no namespace\r\n\t\t\tif(prefix === 'xml'){\r\n\t\t\t\ta.uri = 'http://www.w3.org/XML/1998/namespace';\r\n\t\t\t}if(prefix !== 'xmlns'){\r\n\t\t\t\ta.uri = currentNSMap[prefix || '']\r\n\t\t\t\t\r\n\t\t\t\t//{console.log('###'+a.qName,domBuilder.locator.systemId+'',currentNSMap,a.uri)}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\tvar nsp = tagName.indexOf(':');\r\n\tif(nsp>0){\r\n\t\tprefix = el.prefix = tagName.slice(0,nsp);\r\n\t\tlocalName = el.localName = tagName.slice(nsp+1);\r\n\t}else{\r\n\t\tprefix = null;//important!!\r\n\t\tlocalName = el.localName = tagName;\r\n\t}\r\n\t//no prefix element has default namespace\r\n\tvar ns = el.uri = currentNSMap[prefix || ''];\r\n\tdomBuilder.startElement(ns,localName,tagName,el);\r\n\t//endPrefixMapping and startPrefixMapping have not any help for dom builder\r\n\t//localNSMap = null\r\n\tif(el.closed){\r\n\t\tdomBuilder.endElement(ns,localName,tagName);\r\n\t\tif(localNSMap){\r\n\t\t\tfor(prefix in localNSMap){\r\n\t\t\t\tdomBuilder.endPrefixMapping(prefix) \r\n\t\t\t}\r\n\t\t}\r\n\t}else{\r\n\t\tel.currentNSMap = currentNSMap;\r\n\t\tel.localNSMap = localNSMap;\r\n\t\t//parseStack.push(el);\r\n\t\treturn true;\r\n\t}\r\n}\r\nfunction parseHtmlSpecialContent(source,elStartEnd,tagName,entityReplacer,domBuilder){\r\n\tif(/^(?:script|textarea)$/i.test(tagName)){\r\n\t\tvar elEndStart = source.indexOf('',elStartEnd);\r\n\t\tvar text = source.substring(elStartEnd+1,elEndStart);\r\n\t\tif(/[&<]/.test(text)){\r\n\t\t\tif(/^script$/i.test(tagName)){\r\n\t\t\t\t//if(!/\\]\\]>/.test(text)){\r\n\t\t\t\t\t//lexHandler.startCDATA();\r\n\t\t\t\t\tdomBuilder.characters(text,0,text.length);\r\n\t\t\t\t\t//lexHandler.endCDATA();\r\n\t\t\t\t\treturn elEndStart;\r\n\t\t\t\t//}\r\n\t\t\t}//}else{//text area\r\n\t\t\t\ttext = text.replace(/&#?\\w+;/g,entityReplacer);\r\n\t\t\t\tdomBuilder.characters(text,0,text.length);\r\n\t\t\t\treturn elEndStart;\r\n\t\t\t//}\r\n\t\t\t\r\n\t\t}\r\n\t}\r\n\treturn elStartEnd+1;\r\n}\r\nfunction fixSelfClosed(source,elStartEnd,tagName,closeMap){\r\n\t//if(tagName in closeMap){\r\n\tvar pos = closeMap[tagName];\r\n\tif(pos == null){\r\n\t\t//console.log(tagName)\r\n\t\tpos = source.lastIndexOf('')\r\n\t\tif(pos',start+4);\r\n\t\t\t//append comment source.substring(4,end)//\");\n\tcase DOCUMENT_TYPE_NODE:\n\t\tvar pubid = node.publicId;\n\t\tvar sysid = node.systemId;\n\t\tbuf.push('');\n\t\t}else if(sysid && sysid!='.'){\n\t\t\tbuf.push(' SYSTEM \"',sysid,'\">');\n\t\t}else{\n\t\t\tvar sub = node.internalSubset;\n\t\t\tif(sub){\n\t\t\t\tbuf.push(\" [\",sub,\"]\");\n\t\t\t}\n\t\t\tbuf.push(\">\");\n\t\t}\n\t\treturn;\n\tcase PROCESSING_INSTRUCTION_NODE:\n\t\treturn buf.push( \"\");\n\tcase ENTITY_REFERENCE_NODE:\n\t\treturn buf.push( '&',node.nodeName,';');\n\t//case ENTITY_NODE:\n\t//case NOTATION_NODE:\n\tdefault:\n\t\tbuf.push('??',node.nodeName);\n\t}\n}\nfunction importNode(doc,node,deep){\n\tvar node2;\n\tswitch (node.nodeType) {\n\tcase ELEMENT_NODE:\n\t\tnode2 = node.cloneNode(false);\n\t\tnode2.ownerDocument = doc;\n\t\t//var attrs = node2.attributes;\n\t\t//var len = attrs.length;\n\t\t//for(var i=0;i','amp':'&','quot':'\"','apos':\"'\"}\r\n\tif(locator){\r\n\t\tdomBuilder.setDocumentLocator(locator)\r\n\t}\r\n\t\r\n\tsax.errorHandler = buildErrorHandler(errorHandler,domBuilder,locator);\r\n\tsax.domBuilder = options.domBuilder || domBuilder;\r\n\tif(/\\/x?html?$/.test(mimeType)){\r\n\t\tentityMap.nbsp = '\\xa0';\r\n\t\tentityMap.copy = '\\xa9';\r\n\t\tdefaultNSMap['']= 'http://www.w3.org/1999/xhtml';\r\n\t}\r\n\tdefaultNSMap.xml = defaultNSMap.xml || 'http://www.w3.org/XML/1998/namespace';\r\n\tif(source){\r\n\t\tsax.parse(source,defaultNSMap,entityMap);\r\n\t}else{\r\n\t\tsax.errorHandler.error(\"invalid doc source\");\r\n\t}\r\n\treturn domBuilder.doc;\r\n}\r\nfunction buildErrorHandler(errorImpl,domBuilder,locator){\r\n\tif(!errorImpl){\r\n\t\tif(domBuilder instanceof DOMHandler){\r\n\t\t\treturn domBuilder;\r\n\t\t}\r\n\t\terrorImpl = domBuilder ;\r\n\t}\r\n\tvar errorHandler = {}\r\n\tvar isCallback = errorImpl instanceof Function;\r\n\tlocator = locator||{}\r\n\tfunction build(key){\r\n\t\tvar fn = errorImpl[key];\r\n\t\tif(!fn && isCallback){\r\n\t\t\tfn = errorImpl.length == 2?function(msg){errorImpl(key,msg)}:errorImpl;\r\n\t\t}\r\n\t\terrorHandler[key] = fn && function(msg){\r\n\t\t\tfn('[xmldom '+key+']\\t'+msg+_locator(locator));\r\n\t\t}||function(){};\r\n\t}\r\n\tbuild('warning');\r\n\tbuild('error');\r\n\tbuild('fatalError');\r\n\treturn errorHandler;\r\n}\r\n\r\n//console.log('#\\n\\n\\n\\n\\n\\n\\n####')\r\n/**\r\n * +ContentHandler+ErrorHandler\r\n * +LexicalHandler+EntityResolver2\r\n * -DeclHandler-DTDHandler \r\n * \r\n * DefaultHandler:EntityResolver, DTDHandler, ContentHandler, ErrorHandler\r\n * DefaultHandler2:DefaultHandler,LexicalHandler, DeclHandler, EntityResolver2\r\n * @link http://www.saxproject.org/apidoc/org/xml/sax/helpers/DefaultHandler.html\r\n */\r\nfunction DOMHandler() {\r\n this.cdata = false;\r\n}\r\nfunction position(locator,node){\r\n\tnode.lineNumber = locator.lineNumber;\r\n\tnode.columnNumber = locator.columnNumber;\r\n}\r\n/**\r\n * @see org.xml.sax.ContentHandler#startDocument\r\n * @link http://www.saxproject.org/apidoc/org/xml/sax/ContentHandler.html\r\n */ \r\nDOMHandler.prototype = {\r\n\tstartDocument : function() {\r\n \tthis.doc = new DOMImplementation().createDocument(null, null, null);\r\n \tif (this.locator) {\r\n \tthis.doc.documentURI = this.locator.systemId;\r\n \t}\r\n\t},\r\n\tstartElement:function(namespaceURI, localName, qName, attrs) {\r\n\t\tvar doc = this.doc;\r\n\t var el = doc.createElementNS(namespaceURI, qName||localName);\r\n\t var len = attrs.length;\r\n\t appendElement(this, el);\r\n\t this.currentElement = el;\r\n\t \r\n\t\tthis.locator && position(this.locator,el)\r\n\t for (var i = 0 ; i < len; i++) {\r\n\t var namespaceURI = attrs.getURI(i);\r\n\t var value = attrs.getValue(i);\r\n\t var qName = attrs.getQName(i);\r\n\t\t\tvar attr = doc.createAttributeNS(namespaceURI, qName);\r\n\t\t\tthis.locator &&position(attrs.getLocator(i),attr);\r\n\t\t\tattr.value = attr.nodeValue = value;\r\n\t\t\tel.setAttributeNode(attr)\r\n\t }\r\n\t},\r\n\tendElement:function(namespaceURI, localName, qName) {\r\n\t\tvar current = this.currentElement\r\n\t\tvar tagName = current.tagName;\r\n\t\tthis.currentElement = current.parentNode;\r\n\t},\r\n\tstartPrefixMapping:function(prefix, uri) {\r\n\t},\r\n\tendPrefixMapping:function(prefix) {\r\n\t},\r\n\tprocessingInstruction:function(target, data) {\r\n\t var ins = this.doc.createProcessingInstruction(target, data);\r\n\t this.locator && position(this.locator,ins)\r\n\t appendElement(this, ins);\r\n\t},\r\n\tignorableWhitespace:function(ch, start, length) {\r\n\t},\r\n\tcharacters:function(chars, start, length) {\r\n\t\tchars = _toString.apply(this,arguments)\r\n\t\t//console.log(chars)\r\n\t\tif(chars){\r\n\t\t\tif (this.cdata) {\r\n\t\t\t\tvar charNode = this.doc.createCDATASection(chars);\r\n\t\t\t} else {\r\n\t\t\t\tvar charNode = this.doc.createTextNode(chars);\r\n\t\t\t}\r\n\t\t\tif(this.currentElement){\r\n\t\t\t\tthis.currentElement.appendChild(charNode);\r\n\t\t\t}else if(/^\\s*$/.test(chars)){\r\n\t\t\t\tthis.doc.appendChild(charNode);\r\n\t\t\t\t//process xml\r\n\t\t\t}\r\n\t\t\tthis.locator && position(this.locator,charNode)\r\n\t\t}\r\n\t},\r\n\tskippedEntity:function(name) {\r\n\t},\r\n\tendDocument:function() {\r\n\t\tthis.doc.normalize();\r\n\t},\r\n\tsetDocumentLocator:function (locator) {\r\n\t if(this.locator = locator){// && !('lineNumber' in locator)){\r\n\t \tlocator.lineNumber = 0;\r\n\t }\r\n\t},\r\n\t//LexicalHandler\r\n\tcomment:function(chars, start, length) {\r\n\t\tchars = _toString.apply(this,arguments)\r\n\t var comm = this.doc.createComment(chars);\r\n\t this.locator && position(this.locator,comm)\r\n\t appendElement(this, comm);\r\n\t},\r\n\t\r\n\tstartCDATA:function() {\r\n\t //used in characters() methods\r\n\t this.cdata = true;\r\n\t},\r\n\tendCDATA:function() {\r\n\t this.cdata = false;\r\n\t},\r\n\t\r\n\tstartDTD:function(name, publicId, systemId) {\r\n\t\tvar impl = this.doc.implementation;\r\n\t if (impl && impl.createDocumentType) {\r\n\t var dt = impl.createDocumentType(name, publicId, systemId);\r\n\t this.locator && position(this.locator,dt)\r\n\t appendElement(this, dt);\r\n\t }\r\n\t},\r\n\t/**\r\n\t * @see org.xml.sax.ErrorHandler\r\n\t * @link http://www.saxproject.org/apidoc/org/xml/sax/ErrorHandler.html\r\n\t */\r\n\twarning:function(error) {\r\n\t\tconsole.warn('[xmldom warning]\\t'+error,_locator(this.locator));\r\n\t},\r\n\terror:function(error) {\r\n\t\tconsole.error('[xmldom error]\\t'+error,_locator(this.locator));\r\n\t},\r\n\tfatalError:function(error) {\r\n\t\tconsole.error('[xmldom fatalError]\\t'+error,_locator(this.locator));\r\n\t throw error;\r\n\t}\r\n}\r\nfunction _locator(l){\r\n\tif(l){\r\n\t\treturn '\\n@'+(l.systemId ||'')+'#[line:'+l.lineNumber+',col:'+l.columnNumber+']'\r\n\t}\r\n}\r\nfunction _toString(chars,start,length){\r\n\tif(typeof chars == 'string'){\r\n\t\treturn chars.substr(start,length)\r\n\t}else{//java sax connect width xmldom on rhino(what about: \"? && !(chars instanceof String)\")\r\n\t\tif(chars.length >= start+length || start){\r\n\t\t\treturn new java.lang.String(chars,start,length)+'';\r\n\t\t}\r\n\t\treturn chars;\r\n\t}\r\n}\r\n\r\n/*\r\n * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/LexicalHandler.html\r\n * used method of org.xml.sax.ext.LexicalHandler:\r\n * #comment(chars, start, length)\r\n * #startCDATA()\r\n * #endCDATA()\r\n * #startDTD(name, publicId, systemId)\r\n *\r\n *\r\n * IGNORED method of org.xml.sax.ext.LexicalHandler:\r\n * #endDTD()\r\n * #startEntity(name)\r\n * #endEntity(name)\r\n *\r\n *\r\n * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/DeclHandler.html\r\n * IGNORED method of org.xml.sax.ext.DeclHandler\r\n * \t#attributeDecl(eName, aName, type, mode, value)\r\n * #elementDecl(name, model)\r\n * #externalEntityDecl(name, publicId, systemId)\r\n * #internalEntityDecl(name, value)\r\n * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/EntityResolver2.html\r\n * IGNORED method of org.xml.sax.EntityResolver2\r\n * #resolveEntity(String name,String publicId,String baseURI,String systemId)\r\n * #resolveEntity(publicId, systemId)\r\n * #getExternalSubset(name, baseURI)\r\n * @link http://www.saxproject.org/apidoc/org/xml/sax/DTDHandler.html\r\n * IGNORED method of org.xml.sax.DTDHandler\r\n * #notationDecl(name, publicId, systemId) {};\r\n * #unparsedEntityDecl(name, publicId, systemId, notationName) {};\r\n */\r\n\"endDTD,startEntity,endEntity,attributeDecl,elementDecl,externalEntityDecl,internalEntityDecl,resolveEntity,getExternalSubset,notationDecl,unparsedEntityDecl\".replace(/\\w+/g,function(key){\r\n\tDOMHandler.prototype[key] = function(){return null}\r\n})\r\n\r\n/* Private static helpers treated below as private instance methods, so don't need to add these to the public API; we might use a Relator to also get rid of non-standard public properties */\r\nfunction appendElement (hander,node) {\r\n if (!hander.currentElement) {\r\n hander.doc.appendChild(node);\r\n } else {\r\n hander.currentElement.appendChild(node);\r\n }\r\n}//appendChild and setAttributeNS are preformance key\r\n\r\n//if(typeof require == 'function'){\r\n\tvar XMLReader = require('./sax').XMLReader;\r\n\tvar DOMImplementation = exports.DOMImplementation = require('./dom').DOMImplementation;\r\n\texports.XMLSerializer = require('./dom').XMLSerializer ;\r\n\texports.DOMParser = DOMParser;\r\n//}\r\n","import makeBlob from '../../utils/Blob'\nconst Blob = makeBlob()\n\nimport xmldom from 'xmldom'\nconst XMLSerializer = xmldom.XMLSerializer\n// NOTE: might be useful :https://github.com/jindw/xmldom/pull/152/commits/be5176ece6fa1591daef96a5f361aaacaa445175\n\nexport default function toX3D (CSG) {\n const DOMImplementation = typeof document !== 'undefined' ? document.implementation : new xmldom.DOMImplementation()\n // materialPolygonLists\n // key: a color string (e.g. \"0 1 1\" for yellow)\n // value: an array of strings specifying polygons of this color\n // (as space-separated indices into vertexCoords)\n var materialPolygonLists = {},\n // list of coordinates (as \"x y z\" strings)\n vertexCoords = [],\n // map to look up the index in vertexCoords of a given vertex\n vertexTagToCoordIndexMap = {}\n\n CSG.polygons.map(function (p) {\n var red = 0,\n green = 0,\n blue = 1 // default color is blue\n if (p.shared && p.shared.color) {\n red = p.shared.color[0]\n green = p.shared.color[1]\n blue = p.shared.color[2]\n }\n\n var polygonVertexIndices = [],\n numvertices = p.vertices.length,\n vertex\n for (var i = 0; i < numvertices; i++) {\n vertex = p.vertices[i]\n if (!(vertex.getTag() in vertexTagToCoordIndexMap)) {\n vertexCoords.push(vertex.pos._x.toString() + ' ' +\n vertex.pos._y.toString() + ' ' +\n vertex.pos._z.toString()\n )\n vertexTagToCoordIndexMap[vertex.getTag()] = vertexCoords.length - 1\n }\n polygonVertexIndices.push(vertexTagToCoordIndexMap[vertex.getTag()])\n }\n\n var polygonString = polygonVertexIndices.join(' ')\n\n var colorString = red.toString() + ' ' + green.toString() + ' ' + blue.toString()\n if (!(colorString in materialPolygonLists)) {\n materialPolygonLists[colorString] = []\n }\n // add this polygonString to the list of colorString-colored polygons\n materialPolygonLists[colorString].push(polygonString)\n })\n\n // create output document\n var docType = DOMImplementation.createDocumentType('X3D',\n 'ISO//Web3D//DTD X3D 3.1//EN', 'http://www.web3d.org/specifications/x3d-3.1.dtd')\n var exportDoc = DOMImplementation.createDocument(null, 'X3D', docType)\n exportDoc.insertBefore(\n exportDoc.createProcessingInstruction('xml', 'version=\"1.0\" encoding=\"UTF-8\"'),\n exportDoc.doctype)\n\n var exportRoot = exportDoc.getElementsByTagName('X3D')[0]\n exportRoot.setAttribute('profile', 'Interchange')\n exportRoot.setAttribute('version', '3.1')\n exportRoot.setAttribute('xsd:noNamespaceSchemaLocation', 'http://www.web3d.org/specifications/x3d-3.1.xsd')\n exportRoot.setAttribute('xmlns:xsd', 'http://www.w3.org/2001/XMLSchema-instance')\n\n var exportScene = exportDoc.createElement('Scene')\n exportRoot.appendChild(exportScene)\n\n /*\n For each color, create a shape made of an appropriately colored\n material which contains all polygons that are this color.\n\n The first shape will contain the definition of all vertices,\n (), which will be referenced by\n subsequent shapes.\n */\n var coordsMeshDefined = false\n for (var colorString in materialPolygonLists) {\n var polygonList = materialPolygonLists[colorString]\n var shape = exportDoc.createElement('Shape')\n exportScene.appendChild(shape)\n\n var appearance = exportDoc.createElement('Appearance')\n shape.appendChild(appearance)\n\n var material = exportDoc.createElement('Material')\n appearance.appendChild(material)\n material.setAttribute('diffuseColor', colorString)\n material.setAttribute('ambientIntensity', '1.0')\n\n var ifs = exportDoc.createElement('IndexedFaceSet')\n shape.appendChild(ifs)\n ifs.setAttribute('solid', 'true')\n ifs.setAttribute('coordIndex', polygonList.join(' -1 ') + ' -1')\n\n var coordinate = exportDoc.createElement('Coordinate')\n ifs.appendChild(coordinate)\n if (coordsMeshDefined) {\n coordinate.setAttribute('USE', 'coords_mesh')\n } else {\n coordinate.setAttribute('DEF', 'coords_mesh')\n coordinate.setAttribute('point', vertexCoords.join(' '))\n coordsMeshDefined = true\n }\n }\n\n var x3dstring = (new XMLSerializer()).serializeToString(exportDoc)\n return new Blob([x3dstring], {\n type: 'model/x3d+xml'\n })\n}\n","import { CSG } from '../../csg'\nimport makeBlob from '../../utils/Blob'\nconst Blob = makeBlob()\n\nexport default function CAGtoSvg (cagObject) {\n var decimals = 1000\n\n // mirror the CAG about the X axis in order to generate paths into the POSITIVE direction\n var plane = new CSG.Plane(CSG.Vector3D.Create(0, 1, 0), 0)\n var cag = cagObject.transform(CSG.Matrix4x4.mirroring(plane))\n\n var bounds = cag.getBounds()\n var paths = cag.getOutlinePaths()\n var width = Math.round((bounds[1].x - bounds[0].x) * decimals) / decimals\n var height = Math.round((bounds[1].y - bounds[0].y) * decimals) / decimals\n var svg = '\\n'\n svg += '\\n'\n svg += '\\n'\n svg += '\\n'\n svg += PathsToSvg(paths, bounds)\n svg += ''\n return new Blob([svg], {\n type: 'image/svg+xml'\n })\n}\n\nfunction PathsToSvg (paths, bounds) {\n // calculate offsets in order to create paths orientated from the 0,0 axis\n var xoffset = 0 - bounds[0].x\n var yoffset = 0 - bounds[0].y\n var str = '\\n'\n paths.map(function (path) {\n str += '= path.points.length) pointindexwrapped -= path.points.length\n var point = path.points[pointindexwrapped]\n if (pointindex > 0) {\n str += 'L' + (point.x + xoffset) + ' ' + (point.y + yoffset)\n } else {\n str += 'M' + (point.x + xoffset) + ' ' + (point.y + yoffset)\n }\n }\n str += '\"/>\\n'\n })\n str += '\\n'\n return str\n}\n","import makeBlob from '../../utils/Blob'\nconst Blob = makeBlob()\n\nexport default function CAGToJson (CAG) {\n var str = '{ \"type\": \"cag\",\"sides\": ['\n var comma = ''\n CAG.sides.map(\n function (side) {\n str += comma\n str += JSON.stringify(side)\n comma = ','\n }\n )\n str += '] }'\n return new Blob([str], {\n type: 'application/json'\n })\n}\n","import makeBlob from '../../utils/Blob'\nconst Blob = makeBlob()\n\nexport default function CAGtoDxf (cagObject) {\n var paths = cagObject.getOutlinePaths()\n return PathsToDxf(paths)\n}\n\nfunction PathsToDxf (paths) {\n var str = '999\\nDXF generated by OpenJsCad\\n'\n str += ' 0\\nSECTION\\n 2\\nHEADER\\n'\n str += ' 0\\nENDSEC\\n'\n str += ' 0\\nSECTION\\n 2\\nTABLES\\n'\n str += ' 0\\nTABLE\\n 2\\nLTYPE\\n 70\\n1\\n'\n str += ' 0\\nLTYPE\\n 2\\nCONTINUOUS\\n 3\\nSolid Line\\n 72\\n65\\n 73\\n0\\n 40\\n0.0\\n'\n str += ' 0\\nENDTAB\\n'\n str += ' 0\\nTABLE\\n 2\\nLAYER\\n 70\\n1\\n'\n str += ' 0\\nLAYER\\n 2\\nOpenJsCad\\n 62\\n7\\n 6\\ncontinuous\\n'\n str += ' 0\\nENDTAB\\n'\n str += ' 0\\nTABLE\\n 2\\nSTYLE\\n 70\\n0\\n 0\\nENDTAB\\n'\n str += ' 0\\nTABLE\\n 2\\nVIEW\\n 70\\n0\\n 0\\nENDTAB\\n'\n str += ' 0\\nENDSEC\\n'\n str += ' 0\\nSECTION\\n 2\\nBLOCKS\\n'\n str += ' 0\\nENDSEC\\n'\n str += ' 0\\nSECTION\\n 2\\nENTITIES\\n'\n paths.map(function (path) {\n var numpoints_closed = path.points.length + (path.closed ? 1 : 0)\n str += ' 0\\nLWPOLYLINE\\n 8\\nOpenJsCad\\n 90\\n' + numpoints_closed + '\\n 70\\n' + (path.closed ? 1 : 0) + '\\n'\n for (var pointindex = 0; pointindex < numpoints_closed; pointindex++) {\n var pointindexwrapped = pointindex\n if (pointindexwrapped >= path.points.length) pointindexwrapped -= path.points.length\n var point = path.points[pointindexwrapped]\n str += ' 10\\n' + point.x + '\\n 20\\n' + point.y + '\\n 30\\n0.0\\n'\n }\n })\n str += ' 0\\nENDSEC\\n 0\\nEOF\\n'\n return new Blob([str], {\n type: 'application/dxf'\n })\n}\n","/* converts input data to array if it is not already an array*/\nexport function toArray (data) {\n if (!data) return []\n if (data.constructor !== Array) return [data]\n return data\n}\n","import { version } from '../jscad/version'\nimport { CSG, CAG } from '../csg'\nimport toStlString from '../io/writers/CSGToStla'\nimport toStlBinary from '../io/writers/CSGToStlb'\nimport toAMFString from '../io/writers/CSGToAMF'\nimport toX3D from '../io/writers/CSGToX3D'\nimport CAGtoSvg from '../io/writers/CAGtoSvg'\nimport CAGToJson from '../io/writers/CAGToJson'\nimport CAGtoDxf from '../io/writers/CAGtoDxf'\n\nimport {toArray} from '../utils/misc'\nimport makeBlob from '../utils/Blob'\nconst Blob = makeBlob()\n\nexport default function convertToBlob (objects, params) {\n const {format, formatInfo} = params\n\n let object\n\n if (format === 'jscad') {\n object = objects\n } else {\n objects = toArray(objects)\n //console.log('convertToBlob', objects, format)\n //console.log('object', objects[0], objects[0] instanceof CSG)\n\n // review the given objects\n let foundCSG = false\n let foundCAG = false\n for (let i = 0; i < objects.length; i++) {\n if (objects[i] instanceof CSG) { foundCSG = true }\n if (objects[i] instanceof CAG) { foundCAG = true }\n }\n // convert based on the given format\n foundCSG = foundCSG && formatInfo.convertCSG\n foundCAG = foundCAG && formatInfo.convertCAG\n if (foundCSG && foundCAG) { foundCAG = false } // use 3D conversion\n\n object = !foundCSG ? new CAG() : new CSG()\n\n for (let i = 0; i < objects.length; i++) {\n if (foundCSG === true && objects[i] instanceof CAG) {\n object = object.union(objects[i].extrude({offset: [0, 0, 0.1]})) // convert CAG to a thin solid CSG\n continue\n }\n if (foundCAG === true && objects[i] instanceof CSG) {\n continue\n }\n object = object.union(objects[i])\n }\n }\n\n const meta = {\n producer: 'OpenJSCAD.org ' + version,\n date: new Date()\n }\n\n const outputFormatHandlers = {\n amf: (object) => toAMFString(object, meta), // CSG to AMF\n stl: (object) => toStlString(object), // CSG to STL ASCII\n stla: (object) => toStlString(object), // CSG to STL ASCII\n stlb: (object) => toStlBinary(object, {webBlob: true}), // CSG to STL BINARY\n dxf: (object) => CAGtoDxf(object), // CAG to DXF\n svg: (object) => CAGtoSvg(object), // CAG to SVG\n x3d: (object) => toX3D(object.fixTJunctions()), // CSG to X3D Only possible via browsers\n json: (object) => CAGToJson(object), // CSG or CAG to JSON\n js: (object) => object, // js , pass through\n jscad: (object) => object, // jscad, pass through\n undefined: () => {\n throw new Error('Not supported : only jscad, stl, amf, dxf, svg or json as output format')\n }\n }\n\n let blob = outputFormatHandlers[format](object)\n\n if (format === 'jscad') {\n blob = new Blob([blob], { type: formatInfo.mimetype })\n }\n return blob\n}\n","// == OpenJSCAD.org, Copyright (c) 2013-2016, Licensed under MIT License\n//\n// History:\n// 2016/02/02: 0.4.0: GUI refactored, functionality split up into more files, mostly done by Z3 Dev\n\n/**\n * Create an function for processing the JSCAD script into CSG/CAG objects\n * @param {String} script the script\n * @param {Object} globals the globals to use when evaluating the script: these are not ..\n * ...ACTUAL globals, merely functions/ variable accessible AS IF they were globals !\n */\nexport default function createJscadFunction (script, globals) {\n // console.log('globals', globals)\n // not a fan of this, we have way too many explicit api elements\n let globalsList = ''\n // each top key is a library ie : openscad helpers etc\n // one level below that is the list of libs\n // last level is the actual function we want to export to 'local' scope\n Object.keys(globals).forEach(function (libKey) {\n const lib = globals[libKey]\n // console.log(`lib:${libKey}: ${lib}`)\n Object.keys(lib).forEach(function (libItemKey) {\n const libItems = lib[libItemKey]\n // console.log('libItems', libItems)\n Object.keys(libItems).forEach(function (toExposeKey) {\n // console.log('toExpose',toExpose )\n const text = `const ${toExposeKey} = globals['${libKey}']['${libItemKey}']['${toExposeKey}']\n`\n globalsList += text\n })\n })\n })\n\n const source = `// SYNC WORKER\n ${globalsList}\n\n //user defined script(s)\n ${script}\n\n if (typeof (main) !== 'function') {\n throw new Error('The JSCAD script must contain a function main() which returns one or more CSG or CAG solids.')\n }\n\n return main(params)\n `\n\n var f = new Function('params', 'include', 'globals', source)\n return f\n}\n","//\n// THESE FUNCTIONS ARE SERIALIZED FOR INCLUSION IN THE FULL SCRIPT\n//\n// TODO It might be possible to cache the serialized versions\n//\n\n// Include the requested script via MemFs (if available) or HTTP Request\n//\n// (Note: This function is appended together with the JSCAD script)\n//\nexport default function includeJscadSync (relpath, fn) {\n //console.log('include', relpath, fn)\n // include the requested script via MemFs if possible\n return new Promise(function (resolve, reject) {\n if (typeof (gMemFs) === 'object') {\n for (var fs in gMemFs) {\n if (gMemFs[fs].name === fn) {\n //eval(gMemFs[fs].source)\n resolve(gMemFs[fs].source)\n }\n }\n }\n // include the requested script via webserver access\n var xhr = new XMLHttpRequest()\n var url = relpath + fn\n if (fn.match(/^(https:|http:)/i)) {\n url = fn\n }\n xhr.open('GET', url, false)\n xhr.onload = function () {\n var src = this.responseText\n //console.log('src',src)\n //eval(src) // UGH ???\n resolve(src)\n }\n xhr.onerror = function () {}\n xhr.send()\n })\n}\n","import { CAG } from '../csg'\n\n// -- 2D primitives (OpenSCAD like notion)\n\nexport function square () {\n let v = [1, 1]\n let off\n let a = arguments\n let p = a[0]\n\n if (p && !p.size) v = [p, p]\n if (p && p.length) v = a[0], p = a[1]\n if (p && p.size && p.size.length) v = p.size\n\n off = [v[0] / 2, v[1] / 2]\n if (p && p.center === true) off = [0, 0]\n\n var o = CAG.rectangle({center: off, radius: [v[0] / 2, v[1] / 2]})\n\n return o\n}\n\nexport function circle () {\n let r = 1\n let off\n let fn = 32\n let a = arguments\n let p = a[0]\n if (p && p.r) r = p.r\n if (p && p.fn) fn = p.fn\n if (p && !p.r && !p.fn && !p.center) r = p\n off = [r, r]\n if (p && p.center === true) { off = [0, 0] }\n var o = CAG.circle({center: off, radius: r, resolution: fn})\n return o\n}\n\nexport function polygon (p) { // array of po(ints) and pa(ths)\n var points = [ ]\n if (p.paths && p.paths.length && p.paths[0].length) { // pa(th): [[0,1,2],[2,3,1]] (two paths)\n for (var j = 0; j < p.paths.length; j++) {\n for (var i = 0; i < p.paths[j].length; i++) {\n points[i] = p.points[p.paths[j][i]]\n }\n }\n } else if (p.paths && p.paths.length) { // pa(th): [0,1,2,3,4] (single path)\n for (var i = 0; i < p.paths.length; i++) {\n points[i] = p.points[p.paths[i]]\n }\n } else { // pa(th) = po(ints)\n if (p.length) {\n points = p\n } else {\n points = p.points\n }\n }\n return CAG.fromPoints(points)\n}\n\nexport function triangle () { // -- new addition\n var a = arguments\n if (a[0] && a[0].length) a = a[0]\n var o = CAG.fromPoints(a)\n return o\n}\n","import { CSG } from '../csg'\n// -- 2D to 3D primitives (OpenSCAD like notion)\n\nexport function linear_extrude (p, s) {\n // console.log(\"linear_extrude() not yet implemented\")\n // return\n let h = 1\n let off = 0\n let twist = 0\n let slices = 10\n /* convexity = 10,*/\n\n if (p.height) h = p.height\n // if(p.convexity) convexity = p.convexity // abandoned\n if (p.twist) twist = p.twist\n if (p.slices) slices = p.slices\n var o = s.extrude({offset: [0, 0, h], twistangle: twist, twiststeps: slices})\n if (p.center === true) {\n var b = [ ]\n b = o.getBounds() // b[0] = min, b[1] = max\n off = b[1].plus(b[0])\n off = off.times(-0.5)\n o = o.translate(off)\n }\n return o\n}\n\nexport function rotate_extrude (p, o) {\n var fn = 32\n if (arguments.length < 2) {\n o = p // no switches, just an object\n } else if (p !== undefined) {\n fn = p.fn\n }\n if (fn < 3) fn = 3\n var ps = []\n for (var i = 0; i < fn; i++) {\n // o.{x,y} -> rotate([0,0,i:0..360], obj->{o.x,0,o.y})\n for (var j = 0; j < o.sides.length; j++) {\n // has o.sides[j].vertex{0,1}.pos (only x,y)\n var p = []\n var m\n\n m = new CSG.Matrix4x4.rotationZ(i / fn * 360)\n p[0] = new CSG.Vector3D(o.sides[j].vertex0.pos.x, 0, o.sides[j].vertex0.pos.y)\n p[0] = m.rightMultiply1x3Vector(p[0])\n\n p[1] = new CSG.Vector3D(o.sides[j].vertex1.pos.x, 0, o.sides[j].vertex1.pos.y)\n p[1] = m.rightMultiply1x3Vector(p[1])\n\n m = new CSG.Matrix4x4.rotationZ((i + 1) / fn * 360)\n p[2] = new CSG.Vector3D(o.sides[j].vertex1.pos.x, 0, o.sides[j].vertex1.pos.y)\n p[2] = m.rightMultiply1x3Vector(p[2])\n\n p[3] = new CSG.Vector3D(o.sides[j].vertex0.pos.x, 0, o.sides[j].vertex0.pos.y)\n p[3] = m.rightMultiply1x3Vector(p[3])\n\n var p1 = new CSG.Polygon([\n new CSG.Vertex(p[0]),\n new CSG.Vertex(p[1]),\n new CSG.Vertex(p[2]),\n new CSG.Vertex(p[3]), // we make a square polygon (instead of 2 triangles)\n ])\n // var p2 = new CSG.Polygon([\n // new CSG.Vertex(p[0]),\n // new CSG.Vertex(p[2]),\n // new CSG.Vertex(p[3]),\n // ])\n ps.push(p1)\n // ps.push(p2)\n // echo(\"i=\"+i,i/fn*360,\"j=\"+j)\n }\n }\n return CSG.fromPolygons(ps)\n}\n\nexport function rectangular_extrude (pa, p) {\n let w = 1\n let h = 1\n let fn = 8\n let closed = false\n let round = true\n if (p) {\n if (p.w) w = p.w\n if (p.h) h = p.h\n if (p.fn) fn = p.fn\n if (p.closed !== undefined) closed = p.closed\n if (p.round !== undefined) round = p.round\n }\n return new CSG.Path2D(pa, closed).rectangularExtrude(w, h, fn, round)\n}\n","// -- 3D primitives (OpenSCAD like notion)\nimport { CSG } from '../csg'\nimport { circle } from './primitives2d'\nimport { rotate_extrude } from './ops-extrusions'\n\nexport function cube (p) {\n var s = 1, v = null, off = [0, 0, 0], round = false, r = 0, fn = 8\n if (p && p.length) v = p\n if (p && p.size && p.size.length) v = p.size // { size: [1,2,3] }\n if (p && p.size && !p.size.length) s = p.size // { size: 1 }\n // if(p&&!p.size&&!p.length&&p.center===undefined&&!p.round&&!p.radius) s = p // (2)\n if (p && (typeof p != 'object')) s = p// (2)\n if (p && p.round == true) { round = true, r = v && v.length ? (v[0] + v[1] + v[2]) / 30 : s / 10}\n if (p && p.radius) { round = true, r = p.radius }\n if (p && p.fn) fn = p.fn // applies in case of round: true\n\n var x = s, y = s, z = s\n if (v && v.length) {\n x = v[0], y = v[1], z = v[2]\n }\n off = [x / 2, y / 2, z / 2] // center: false default\n var o = round ?\n CSG.roundedCube({radius: [x / 2, y / 2, z / 2], roundradius: r, resolution: fn}) :\n CSG.cube({radius: [x / 2, y / 2, z / 2]})\n if (p && p.center && p.center.length) {\n off = [p.center[0] ? 0 : x / 2, p.center[1] ? 0 : y / 2, p.center[2] ? 0 : z / 2]\n } else if (p && p.center == true) {\n off = [0, 0, 0]\n } else if (p && p.center == false) {\n off = [x / 2, y / 2, z / 2]\n }\n if (off[0] || off[1] || off[2]) o = o.translate(off)\n // if(v&&v.length) o = o.scale(v) // we don't scale afterwards, we already created box with the correct size\n return o\n}\n\nexport function sphere (p) {\n var r = 1\n var fn = 32\n var off = [0, 0, 0]\n var type = 'normal'\n\n // var zoff = 0 // sphere() in openscad has no center:true|false\n if (p && p.r) r = p.r\n if (p && p.fn) fn = p.fn\n if (p && p.type) type = p.type\n // if(p&&!p.r&&!p.fn&&!p.type) r = p\n if (p && (typeof p != 'object')) r = p\n off = [0, 0, 0] // center: false (default)\n\n var o\n if (type == 'geodesic')\n o = geodesicSphere(p)\n else\n o = CSG.sphere({radius: r,resolution: fn})\n\n if (p && p.center && p.center.length) { // preparing individual x,y,z center\n off = [p.center[0] ? 0 : r, p.center[1] ? 0 : r, p.center[2] ? 0 : r]\n } else if (p && p.center == true) {\n off = [0, 0, 0]\n } else if (p && p.center == false) {\n off = [r, r, r]\n }\n if (off[0] || off[1] || off[2]) o = o.translate(off)\n return o\n}\n\nexport function geodesicSphere (p) {\n var r = 1, fn = 5\n\n var ci = [ // hard-coded data of icosahedron (20 faces, all triangles)\n [0.850651, 0.000000, -0.525731],\n [0.850651, -0.000000, 0.525731],\n [-0.850651, -0.000000, 0.525731],\n [-0.850651, 0.000000, -0.525731],\n [0.000000, -0.525731, 0.850651],\n [0.000000, 0.525731, 0.850651],\n [0.000000, 0.525731, -0.850651],\n [0.000000, -0.525731, -0.850651],\n [-0.525731, -0.850651, -0.000000],\n [0.525731, -0.850651, -0.000000],\n [0.525731, 0.850651, 0.000000],\n [-0.525731, 0.850651, 0.000000]]\n\n var ti = [ [0, 9, 1], [1, 10, 0], [6, 7, 0], [10, 6, 0], [7, 9, 0], [5, 1, 4], [4, 1, 9], [5, 10, 1], [2, 8, 3], [3, 11, 2], [2, 5, 4],\n [4, 8, 2], [2, 11, 5], [3, 7, 6], [6, 11, 3], [8, 7, 3], [9, 8, 4], [11, 10, 5], [10, 11, 6], [8, 9, 7]]\n\n var geodesicSubDivide = function (p, fn, off) {\n var p1 = p[0], p2 = p[1], p3 = p[2]\n var n = off\n var c = []\n var f = []\n\n // p3\n // /\\\n // /__\\ fn = 3\n // i /\\ /\\\n // /__\\/__\\ total triangles = 9 (fn*fn)\n // /\\ /\\ /\\\n // 0/__\\/__\\/__\\\n // p1 0 j p2\n\n for (var i = 0; i < fn; i++) {\n for (var j = 0; j < fn - i; j++) {\n var t0 = i / fn\n var t1 = (i + 1) / fn\n var s0 = j / (fn - i)\n var s1 = (j + 1) / (fn - i)\n var s2 = fn - i - 1 ? j / (fn - i - 1) : 1\n var q = []\n\n q[0] = mix3(mix3(p1, p2, s0), p3, t0)\n q[1] = mix3(mix3(p1, p2, s1), p3, t0)\n q[2] = mix3(mix3(p1, p2, s2), p3, t1)\n\n // -- normalize\n for (var k = 0; k < 3; k++) {\n var r = Math.sqrt(q[k][0] * q[k][0] + q[k][1] * q[k][1] + q[k][2] * q[k][2])\n for (var l = 0; l < 3; l++) {\n q[k][l] /= r\n }\n }\n c.push(q[0], q[1], q[2])\n f.push([n, n + 1, n + 2]); n += 3\n\n if (j < fn - i - 1) {\n var s3 = fn - i - 1 ? (j + 1) / (fn - i - 1) : 1\n q[0] = mix3(mix3(p1, p2, s1), p3, t0)\n q[1] = mix3(mix3(p1, p2, s3), p3, t1)\n q[2] = mix3(mix3(p1, p2, s2), p3, t1)\n\n // -- normalize\n for (var k = 0; k < 3; k++) {\n var r = Math.sqrt(q[k][0] * q[k][0] + q[k][1] * q[k][1] + q[k][2] * q[k][2])\n for (var l = 0; l < 3; l++) {\n q[k][l] /= r\n }\n }\n c.push(q[0], q[1], q[2])\n f.push([n, n + 1, n + 2]); n += 3\n }\n }\n }\n return { points: c, triangles: f, off: n }\n }\n\n var mix3 = function (a, b, f) {\n var _f = 1 - f\n var c = []\n for (var i = 0; i < 3; i++) {\n c[i] = a[i] * _f + b[i] * f\n }\n return c\n }\n\n if (p) {\n if (p.fn) fn = Math.floor(p.fn / 6)\n if (p.r) r = p.r\n }\n\n if (fn <= 0) fn = 1\n\n var q = []\n var c = [], f = []\n var off = 0\n\n for (var i = 0; i < ti.length; i++) {\n var g = geodesicSubDivide([ ci[ti[i][0]], ci[ti[i][1]], ci[ti[i][2]]], fn, off)\n c = c.concat(g.points)\n f = f.concat(g.triangles)\n off = g.off\n }\n return polyhedron({points: c, triangles: f}).scale(r)\n}\n\nexport function cylinder (p) {\n var r1 = 1, r2 = 1, h = 1, fn = 32, round = false\n var a = arguments\n var off = [0, 0, 0]\n if (p && p.d) {\n r1 = r2 = p.d / 2\n }\n if (p && p.r) {\n r1 = p.r\n r2 = p.r\n }\n if (p && p.h) {\n h = p.h\n }\n if (p && (p.r1 || p.r2)) {\n r1 = p.r1\n r2 = p.r2\n if (p.h) h = p.h\n }\n if (p && (p.d1 || p.d2)) {\n r1 = p.d1 / 2\n r2 = p.d2 / 2\n }\n\n if (a && a[0] && a[0].length) {\n a = a[0]\n r1 = a[0]\n r2 = a[1]\n h = a[2]\n if (a.length === 4) fn = a[3]\n }\n if (p && p.fn) fn = p.fn\n // if(p&&p.center==true) zoff = -h/2\n if (p && p.round === true) round = true\n var o\n if (p && (p.start && p.end)) {\n o = round ?\n CSG.roundedCylinder({start: p.start, end: p.end, radiusStart: r1, radiusEnd: r2, resolution: fn}) :\n CSG.cylinder({start: p.start, end: p.end, radiusStart: r1, radiusEnd: r2, resolution: fn})\n } else {\n o = round ?\n CSG.roundedCylinder({start: [0, 0, 0], end: [0, 0, h], radiusStart: r1, radiusEnd: r2, resolution: fn}) :\n CSG.cylinder({start: [0, 0, 0], end: [0, 0, h], radiusStart: r1, radiusEnd: r2, resolution: fn})\n var r = r1 > r2 ? r1 : r2\n if (p && p.center && p.center.length) { // preparing individual x,y,z center\n off = [p.center[0] ? 0 : r, p.center[1] ? 0 : r, p.center[2] ? -h / 2 : 0]\n } else if (p && p.center === true) {\n off = [0, 0, -h / 2]\n } else if (p && p.center === false) {\n off = [0, 0, 0]\n }\n if (off[0] || off[1] || off[2]) o = o.translate(off)\n }\n return o\n}\n\nexport function torus (p) {\n var ri = 1, ro = 4, fni = 16, fno = 32, roti = 0\n if (p) {\n if (p.ri) ri = p.ri\n if (p.fni) fni = p.fni\n if (p.roti) roti = p.roti\n if (p.ro) ro = p.ro\n if (p.fno) fno = p.fno\n }\n if (fni < 3) fni = 3\n if (fno < 3) fno = 3\n var c = circle({r: ri, fn: fni, center: true})\n if (roti) c = c.rotateZ(roti)\n return rotate_extrude({fn: fno}, c.translate([ro, 0, 0]))\n}\n\nexport function polyhedron (p) {\n var pgs = []\n var ref = p.triangles || p.polygons\n var colors = p.colors || null\n\n for (var i = 0; i < ref.length; i++) {\n var pp = []\n for (var j = 0; j < ref[i].length; j++) {\n pp[j] = p.points[ref[i][j]]\n }\n\n var v = []\n for (j = ref[i].length - 1; j >= 0; j--) { // --- we reverse order for examples of OpenSCAD work\n v.push(new CSG.Vertex(new CSG.Vector3D(pp[j][0], pp[j][1], pp[j][2])))\n }\n var s = CSG.Polygon.defaultShared\n if (colors && colors[i]) {\n s = CSG.Polygon.Shared.fromColor(colors[i])\n }\n pgs.push(new CSG.Polygon(v, s))\n }\n var r = CSG.fromPolygons(pgs)\n return r\n}\n","import {CAG, CSG} from '../csg'\n\n// -- 3D operations (OpenSCAD like notion)\nexport function union () {\n var o,i = 0,a = arguments\n if (a[0].length) a = a[0]\n\n o = a[i++]\n if (0) { // we leave to code for now, perhaps later we allow mixed CAG/CSG union\n if ((typeof (a[i]) == 'object') && (a[i] instanceof CAG)) {\n o = a[i].extrude({offset: [0, 0, 0.1]}) // -- convert a 2D shape to a thin solid, note: do not a[i] = a[i].extrude()\n } else {\n o = a[i++]\n }\n }\n for (; i < a.length; i++) {\n var obj = a[i]\n\n // for now disabled, later perhaps allow mixed union of CAG/CSG\n if (0 && (typeof (a[i]) == 'object') && (a[i] instanceof CAG)) {\n obj = a[i].extrude({offset: [0, 0, 0.1]}) // -- convert a 2D shape to a thin solid:\n }\n o = o.union(obj)\n }\n return o\n}\n\nexport function difference () {\n var o,i = 0,a = arguments\n if (a[0].length) a = a[0]\n for (o = a[i++]; i < a.length; i++) {\n if (a[i] instanceof CAG) {\n o = o.subtract(a[i])\n } else {\n o = o.subtract(a[i].setColor(1, 1, 0)) // -- color the cuts\n }\n }\n return o\n}\n\nexport function intersection () {\n var o,i = 0,a = arguments\n if (a[0].length) a = a[0]\n for (o = a[i++]; i < a.length; i++) {\n if (a[i] instanceof CAG) {\n o = o.intersect(a[i])\n } else {\n o = o.intersect(a[i].setColor(1, 1, 0)) // -- color the cuts\n }\n }\n return o\n}\n","import { CSG, CAG } from '../csg'\nimport { union } from './ops-booleans'\n// -- 3D transformations (OpenSCAD like notion)\n\n\nexport function translate() { // v, obj or array\n var a = arguments, v = a[0], o, i = 1;\n if(a[1].length) { a = a[1]; i = 0; }\n for(o=a[i++]; ip.angle)\n return 1;\n else {\n if (this.distancep.distance)\n return 1;\n }\n return 0;\n }\n }\n\n var ConvexHull = function() {\n this.points = null;\n this.indices = null;\n\n this.getIndices = function() {\n return this.indices;\n }\n\n this.clear = function() {\n this.indices = null;\n this.points = null;\n }\n\n this.ccw = function(p1, p2, p3) {\n var ccw = (this.points[p2].x - this.points[p1].x)*(this.points[p3].y - this.points[p1].y) -\n (this.points[p2].y - this.points[p1].y)*(this.points[p3].x - this.points[p1].x);\n if(ccw<1e-5) // we need this, otherwise sorting never ends, see https://github.com/Spiritdude/OpenJSCAD.org/issues/18\n return 0\n return ccw;\n }\n\n this.angle = function(o, a) {\n //return Math.atan((this.points[a].y-this.points[o].y) / (this.points[a].x - this.points[o].x));\n return Math.atan2((this.points[a].y-this.points[o].y), (this.points[a].x - this.points[o].x));\n }\n\n this.distance = function(a, b) {\n return ((this.points[b].x-this.points[a].x)*(this.points[b].x-this.points[a].x)+\n (this.points[b].y-this.points[a].y)*(this.points[b].y-this.points[a].y));\n }\n\n this.compute = function(_points) {\n this.indices=null;\n if (_points.length<3)\n return;\n this.points=_points;\n\n // Find the lowest point\n var min = 0;\n for(var i = 1; i < this.points.length; i++) {\n if(this.points[i].y==this.points[min].y) {\n if(this.points[i].x0) {\n var ch = [];\n for(var i=0; i 0.5 ? d / (2 - max - min) : d / (max + min)\n switch (max) {\n case r:\n h = (g - b) / d + (g < b ? 6 : 0)\n break\n case g:\n h = (b - r) / d + 2\n break\n case b:\n h = (r - g) / d + 4\n break\n }\n h /= 6\n }\n\n return [h, s, l]\n}\n\n/**\n * Converts an HSL color value to RGB. Conversion formula\n * adapted from http://en.wikipedia.org/wiki/HSL_color_space.\n * Assumes h, s, and l are contained in the set [0, 1] and\n * returns r, g, and b in the set [0, 1].\n *\n * @param Number h The hue\n * @param Number s The saturation\n * @param Number l The lightness\n * @return Array The RGB representation\n */\nexport function hsl2rgb (h, s, l) {\n if (h.length) { l = h[2], s = h[1], h = h[0]; }\n var r, g, b\n\n if (s == 0) {\n r = g = b = l // achromatic\n } else {\n function hue2rgb (p, q, t) {\n if (t < 0) t += 1\n if (t > 1) t -= 1\n if (t < 1 / 6) return p + (q - p) * 6 * t\n if (t < 1 / 2) return q\n if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6\n return p\n }\n\n var q = l < 0.5 ? l * (1 + s) : l + s - l * s\n var p = 2 * l - q\n r = hue2rgb(p, q, h + 1 / 3)\n g = hue2rgb(p, q, h)\n b = hue2rgb(p, q, h - 1 / 3)\n }\n\n return [r, g, b]\n}\n\n/**\n * Converts an RGB color value to HSV. Conversion formula\n * adapted from http://en.wikipedia.org/wiki/HSV_color_space.\n * Assumes r, g, and b are contained in the set [0, 1] and\n * returns h, s, and v in the set [0, 1].\n *\n * @param Number r The red color value\n * @param Number g The green color value\n * @param Number b The blue color value\n * @return Array The HSV representation\n */\n\nexport function rgb2hsv (r, g, b) {\n if (r.length) { b = r[2], g = r[1], r = r[0]; }\n var max = Math.max(r, g, b), min = Math.min(r, g, b)\n var h, s, v = max\n\n var d = max - min\n s = max == 0 ? 0 : d / max\n\n if (max == min) {\n h = 0 // achromatic\n } else {\n switch (max) {\n case r:\n h = (g - b) / d + (g < b ? 6 : 0)\n break\n case g:\n h = (b - r) / d + 2\n break\n case b:\n h = (r - g) / d + 4\n break\n }\n h /= 6\n }\n\n return [h, s, v]\n}\n\n/**\n * Converts an HSV color value to RGB. Conversion formula\n * adapted from http://en.wikipedia.org/wiki/HSV_color_space.\n * Assumes h, s, and v are contained in the set [0, 1] and\n * returns r, g, and b in the set [0, 1].\n *\n * @param Number h The hue\n * @param Number s The saturation\n * @param Number v The value\n * @return Array The RGB representation\n */\nexport function hsv2rgb (h, s, v) {\n if (h.length) { v = h[2], s = h[1], h = h[0]; }\n var r, g, b\n\n var i = Math.floor(h * 6)\n var f = h * 6 - i\n var p = v * (1 - s)\n var q = v * (1 - f * s)\n var t = v * (1 - (1 - f) * s)\n\n switch (i % 6) {\n case 0:\n r = v, g = t, b = p\n break\n case 1:\n r = q, g = v, b = p\n break\n case 2:\n r = p, g = v, b = t\n break\n case 3:\n r = p, g = q, b = v\n break\n case 4:\n r = t, g = p, b = v\n break\n case 5:\n r = v, g = p, b = q\n break\n }\n\n return [r, g, b]\n}\n\n/**\n * Converts a HTML5 color value (string) to RGB values\n * See the color input type of HTML5 forms\n * Conversion formula:\n * - split the string; \"#RRGGBB\" into RGB components\n * - convert the HEX value into RGB values\n */\nexport function html2rgb (s) {\n var r = 0\n var g = 0\n var b = 0\n if (s.length == 7) {\n r = parseInt('0x' + s.slice(1, 3)) / 255\n g = parseInt('0x' + s.slice(3, 5)) / 255\n b = parseInt('0x' + s.slice(5, 7)) / 255\n }\n return [r, g, b]\n}\n\n/**\n * Converts RGB color value to HTML5 color value (string)\n * Conversion forumla:\n * - convert R, G, B into HEX strings\n * - return HTML formatted string \"#RRGGBB\"\n */\nexport function rgb2html (r, g, b) {\n if (r.length) { b = r[2], g = r[1], r = r[0]; }\n var s = '#' +\n Number(0x1000000 + r * 255 * 0x10000 + g * 255 * 0x100 + b * 255).toString(16).substring(1)\n return s\n}\n","// -- Math functions (360 deg based vs 2pi)\n\nexport function sin (a) {\n return Math.sin(a / 360 * Math.PI * 2)\n}\nexport function cos (a) {\n return Math.cos(a / 360 * Math.PI * 2)\n}\nexport function asin (a) {\n return Math.asin(a) / (Math.PI * 2) * 360\n}\nexport function acos (a) {\n return Math.acos(a) / (Math.PI * 2) * 360\n}\nexport function tan (a) {\n return Math.tan(a / 360 * Math.PI * 2)\n}\nexport function atan (a) {\n return Math.atan(a) / (Math.PI * 2) * 360\n}\nexport function atan2 (a, b) {\n return Math.atan2(a, b) / (Math.PI * 2) * 360\n}\nexport function ceil (a) {\n return Math.ceil(a)\n}\nexport function floor (a) {\n return Math.floor(a)\n}\nexport function abs (a) {\n return Math.abs(a)\n}\nexport function min (a, b) {\n return a < b ? a : b\n}\nexport function max (a, b) {\n return a > b ? a : b\n}\nexport function rands (min, max, vn, seed) {\n // -- seed is ignored for now, FIX IT (requires reimplementation of random())\n // see http://stackoverflow.com/questions/424292/how-to-create-my-own-javascript-random-number-generator-that-i-can-also-set-the\n var v = new Array(vn)\n for (var i = 0; i < vn; i++) {\n v[i] = Math.random() * (max - min) + min\n }\n}\nexport function log (a) {\n return Math.log(a)\n}\nexport function lookup (ix, v) {\n var r = 0\n for (var i = 0; i < v.length; i++) {\n var a0 = v[i]\n if (a0[0] >= ix) {\n i--\n a0 = v[i]\n var a1 = v[i + 1]\n var m = 0\n if (a0[0] !== a1[0]) {\n m = abs((ix - a0[0]) / (a1[0] - a0[0]))\n }\n // echo(\">>\",i,ix,a0[0],a1[0],\";\",m,a0[1],a1[1])\n if (m > 0) {\n r = a0[1] * (1 - m) + a1[1] * m\n } else {\n r = a0[1]\n }\n return r\n }\n }\n return r\n}\n\nexport function pow (a, b) {\n return Math.pow(a, b)\n}\n\nexport function sign (a) {\n return a < 0 ? -1 : (a > 1 ? 1 : 0)\n}\n\nexport function sqrt (a) {\n return Math.sqrt(a)\n}\n\nexport function round (a) {\n return floor(a + 0.5)\n}\n","\nexport function vector_char(x,y,c) {\n c = c.charCodeAt(0);\n c -= 32;\n if(c<0||c>=95) return { width: 0, segments: [] };\n\n var off = c*112;\n var n = simplexFont[off++];\n var w = simplexFont[off++];\n var l = [];\n var segs = [];\n\n for(var i=0; i\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n * Redistributions of source code must retain the above copyright\n notice, this list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above copyright\n notice, this list of conditions and the following disclaimer in the\n documentation and/or other materials provided with the distribution.\n * Neither the name of sprintf() for JavaScript nor the\n names of its contributors may be used to endorse or promote products\n derived from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\nANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL Alexandru Marasteanu BE LIABLE FOR ANY\nDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\nON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\nChangelog:\n2010.09.06 - 0.7-beta1\n - features: vsprintf, support for named placeholders\n - enhancements: format cache, reduced global namespace pollution\n\n2010.05.22 - 0.6:\n - reverted to 0.4 and fixed the bug regarding the sign of the number 0\n Note:\n Thanks to Raphael Pigulla (http://www.n3rd.org/)\n who warned me about a bug in 0.5, I discovered that the last update was\n a regress. I appologize for that.\n\n2010.05.09 - 0.5:\n - bug fix: 0 is now preceeded with a + sign\n - bug fix: the sign was not at the right position on padded results (Kamal Abdali)\n - switched from GPL to BSD license\n\n2007.10.21 - 0.4:\n - unit test and patch (David Baird)\n\n2007.09.17 - 0.3:\n - bug fix: no longer throws exception on empty paramenters (Hans Pufal)\n\n2007.09.11 - 0.2:\n - feature: added argument swapping\n\n2007.04.03 - 0.1:\n - initial release\n**/\n\nlet sprintf = (function () {\n function get_type (variable) {\n return Object.prototype.toString.call(variable).slice(8, -1).toLowerCase()\n }\n function str_repeat (input, multiplier) {\n for (var output = []; multiplier > 0; output[--multiplier] = input) { /* do nothing */}\n return output.join('')\n }\n\n var str_format = function () {\n if (!str_format.cache.hasOwnProperty(arguments[0])) {\n str_format.cache[arguments[0]] = str_format.parse(arguments[0])\n }\n return str_format.format.call(null, str_format.cache[arguments[0]], arguments)\n }\n\n str_format.format = function (parse_tree, argv) {\n var cursor = 1, tree_length = parse_tree.length, node_type = '', arg, output = [], i, k, match, pad, pad_character, pad_length\n for (i = 0; i < tree_length; i++) {\n node_type = get_type(parse_tree[i])\n if (node_type === 'string') {\n output.push(parse_tree[i])\n }\n else if (node_type === 'array') {\n match = parse_tree[i] // convenience purposes only\n if (match[2]) { // keyword argument\n arg = argv[cursor]\n for (k = 0; k < match[2].length; k++) {\n if (!arg.hasOwnProperty(match[2][k])) {\n throw(sprintf('[sprintf] property \"%s\" does not exist', match[2][k]))\n }\n arg = arg[match[2][k]]\n }\n }\n else if (match[1]) { // positional argument (explicit)\n arg = argv[match[1]]\n } else { // positional argument (implicit)\n arg = argv[cursor++]\n }\n\n if (/[^s]/.test(match[8]) && (get_type(arg) != 'number')) {\n throw(sprintf('[sprintf] expecting number but found %s', get_type(arg)))\n }\n switch (match[8]) {\n case 'b':\n arg = arg.toString(2)\n break\n case 'c':\n arg = String.fromCharCode(arg)\n break\n case 'd':\n arg = parseInt(arg, 10)\n break\n case 'e':\n arg = match[7] ? arg.toExponential(match[7]) : arg.toExponential()\n break\n case 'f':\n arg = match[7] ? parseFloat(arg).toFixed(match[7]) : parseFloat(arg)\n break\n case 'o':\n arg = arg.toString(8)\n break\n case 's':\n arg = ((arg = String(arg)) && match[7] ? arg.substring(0, match[7]) : arg)\n break\n case 'u':\n arg = Math.abs(arg)\n break\n case 'x':\n arg = arg.toString(16)\n break\n case 'X':\n arg = arg.toString(16).toUpperCase()\n break\n }\n arg = (/[def]/.test(match[8]) && match[3] && arg >= 0 ? '+' + arg : arg)\n pad_character = match[4] ? match[4] == '0' ? '0' : match[4].charAt(1) : ' '\n pad_length = match[6] - String(arg).length\n pad = match[6] ? str_repeat(pad_character, pad_length) : ''\n output.push(match[5] ? arg + pad : pad + arg)\n }\n }\n return output.join('')\n }\n\n str_format.cache = {}\n\n str_format.parse = function (fmt) {\n var _fmt = fmt, match = [], parse_tree = [], arg_names = 0\n while (_fmt) {\n if ((match = /^[^\\x25]+/.exec(_fmt)) !== null) {\n parse_tree.push(match[0])\n }\n else if ((match = /^\\x25{2}/.exec(_fmt)) !== null) {\n parse_tree.push('%')\n }\n else if ((match = /^\\x25(?:([1-9]\\d*)\\$|\\(([^\\)]+)\\))?(\\+)?(0|'[^$])?(-)?(\\d+)?(?:\\.(\\d+))?([b-fosuxX])/.exec(_fmt)) !== null) {\n if (match[2]) {\n arg_names |= 1\n var field_list = [], replacement_field = match[2], field_match = []\n if ((field_match = /^([a-z_][a-z_\\d]*)/i.exec(replacement_field)) !== null) {\n field_list.push(field_match[1])\n while ((replacement_field = replacement_field.substring(field_match[0].length)) !== '') {\n if ((field_match = /^\\.([a-z_][a-z_\\d]*)/i.exec(replacement_field)) !== null) {\n field_list.push(field_match[1])\n }\n else if ((field_match = /^\\[(\\d+)\\]/.exec(replacement_field)) !== null) {\n field_list.push(field_match[1])\n } else {\n throw('[sprintf] huh?')\n }\n }\n } else {\n throw('[sprintf] huh?')\n }\n match[2] = field_list\n } else {\n arg_names |= 2\n }\n if (arg_names === 3) {\n throw('[sprintf] mixing positional and named placeholders is not (yet) supported')\n }\n parse_tree.push(match)\n } else {\n throw('[sprintf] huh?')\n }\n _fmt = _fmt.substring(match[0].length)\n }\n return parse_tree\n }\n\n return str_format\n})()\n\nfunction vsprintf (fmt, argv) {\n argv.unshift(fmt)\n return sprintf.apply(null, argv)\n}\n","export function log (txt) {\n var timeInMs = Date.now()\n var prevtime = undefined//OpenJsCad.log.prevLogTime\n if (!prevtime) prevtime = timeInMs\n var deltatime = timeInMs - prevtime\n log.prevLogTime = timeInMs\n var timefmt = (deltatime * 0.001).toFixed(3)\n txt = '[' + timefmt + '] ' + txt\n if ((typeof (console) == 'object') && (typeof (console.log) == 'function')) {\n console.log(txt)\n } else if ((typeof (self) == 'object') && (typeof (self.postMessage) == 'function')) {\n self.postMessage({cmd: 'log', txt: txt})\n }\n else throw new Error('Cannot log')\n}\n\n// See Processor.setStatus()\n// Note: leave for compatibility\nexport function status (s) {\n log(s)\n}\n","import * as primitives3d from './primitives3d'\nimport * as primitives2d from './primitives2d'\nimport * as booleanOps from './ops-booleans'\nimport * as transformations from './ops-transformations'\nimport * as extrusions from './ops-extrusions'\nimport * as color from './color'\nimport * as maths from './maths'\nimport * as text from './text'\nimport { echo } from './debug'\n\n// these are 'external' to this folder ...needs to be reviewed\nimport { CAG, CSG } from '../csg'\nimport { log } from '../jscad/log'\n\nconst exportedApi = {\n csg: {CAG, CSG},\n primitives2d,\n primitives3d,\n booleanOps,\n transformations,\n extrusions,\n color,\n maths,\n text,\n OpenJsCad: {OpenJsCad: {log}},\n debug: {echo}\n}\n\nexport default exportedApi\n","import createJscadFunction from './jscad-function'\nimport includeJscadSync from './includeJscadSync'\nimport WebWorkify from 'webWorkify'\nimport { CAG, CSG } from '../csg'\nimport { toArray } from '../utils/misc'\nimport oscad from '../modeling/index'\n\n/**\n * helper function that finds include() statements in files,\n * fetches their code & returns it (recursively) returning the whole code with\n * inlined includes\n * this is more reliable than async xhr + eval()\n * @param {String} text the original script (with include statements)\n * @param {String} relpath relative path, for xhr resolution\n * @returns {String} the full script, with inlined\n */\nfunction replaceIncludes (text, relpath) {\n return new Promise(function (resolve, reject) {\n let scriptWithIncludes = text\n const includesPattern = /(?:include)\\s?\\(\"([\\w\\/.\\s]*)\"\\);?/gm\n\n let foundIncludes = []\n let foundIncludesFull = []\n let match\n while(match = includesPattern.exec(text)) {\n foundIncludes.push(match[1])\n foundIncludesFull.push(match[0])\n }\n\n let tmpPromises = foundIncludes.map(function (uri, index) {\n const promise = includeJscadSync(relpath, uri)\n return promise.then(function (includedScript) {\n return replaceIncludes(includedScript, relpath).then(function (substring) {\n let currentItem = foundIncludesFull[index]\n scriptWithIncludes = scriptWithIncludes.replace(currentItem, substring)\n return scriptWithIncludes\n })\n })\n })\n Promise.all(tmpPromises).then(x => resolve(scriptWithIncludes))\n })\n}\n\n/**\n * evaluate script & rebuild solids, in main thread\n * @param {String} script the script\n * @param {String} fullurl full url of current script\n * @param {Object} parameters the parameters to use with the script\n * @param {Object} callback the callback to call once evaluation is done /failed\n * @param {Object} options the settings to use when rebuilding the solid\n */\nexport function rebuildSolidSync (script, fullurl, parameters, callback, options) {\n let relpath = fullurl\n if (relpath.lastIndexOf('/') >= 0) {\n relpath = relpath.substring(0, relpath.lastIndexOf('/') + 1)\n }\n const defaults = {\n implicitGlobals: true\n }\n options = Object.assign({}, defaults, options)\n\n replaceIncludes(script, relpath).then(function (fullScript) {\n const globals = options.implicitGlobals ? (options.globals ? options.globals : {oscad}) : {}\n const func = createJscadFunction(fullScript, globals)\n // stand-in for the include function(no-op)\n const include = (x) => x\n try {\n let objects = func(parameters, include, globals)\n objects = toArray(objects)\n if (objects.length === 0) {\n throw new Error('The JSCAD script must return one or more CSG or CAG solids.')\n }\n callback(undefined, objects)\n } catch(error) {\n callback(error, undefined)\n }\n }).catch(error => callback(error, undefined))\n\n // have we been asked to stop our work?\n return {\n cancel: () => {\n console.log('cannot stop work in main thread, sorry')\n }\n }\n}\n\n/**\n * evaluate script & rebuild solids, in seperate thread/webworker\n * @param {String} script the script\n * @param {String} fullurl full url of current script\n * @param {Object} parameters the parameters to use with the script\n * @param {Object} callback the callback to call once evaluation is done /failed\n * @param {Object} options the settings to use when rebuilding the solid\n */\nexport function rebuildSolidAsync (script, fullurl, parameters, callback, options) {\n if (!parameters) { throw new Error(\"JSCAD: missing 'parameters'\") }\n if (!window.Worker) throw new Error('Worker threads are unsupported.')\n const defaults = {\n implicitGlobals: true\n }\n options = Object.assign({}, defaults, options)\n\n let relpath = fullurl\n if (relpath.lastIndexOf('/') >= 0) {\n relpath = relpath.substring(0, relpath.lastIndexOf('/') + 1)\n }\n\n let worker\n replaceIncludes(script, relpath).then(function (script) {\n worker = WebWorkify(require('./jscad-worker.js'))\n worker.onmessage = function (e) {\n if (e.data instanceof Object) {\n const data = e.data.objects.map(function (object) {\n if (object['class'] === 'CSG') { return CSG.fromCompactBinary(object) }\n if (object['class'] === 'CAG') { return CAG.fromCompactBinary(object) }\n })\n callback(undefined, data)\n }\n }\n worker.onerror = function (e) {\n callback(`Error in line ${e.lineno} : ${e.message}`, undefined)\n }\n worker.postMessage({cmd: 'render', fullurl, script, parameters, options})\n }).catch(error => callback(error, undefined))\n\n // have we been asked to stop our work?\n return {\n cancel: () => {\n worker.terminate()\n }\n }\n}\n","import convertToBlob from './io/convertToBlob'\nimport { rebuildSolidSync } from './jscad/rebuildSolid'\nimport oscad from './modeling/index'\n\n/**\n * compile openjscad code and generates intermediate representation\n * ordering of parameters created with curying in mind\n * @param {String} source the openjscad script we want to compile\n * @param {Object} params the set of parameters to use for the script (optional)\n * @param {Object} options the set of options to use (optional)\n\n */\nfunction compile (source, params, options) {\n params = params || {}\n const defaults = {\n implicitGlobals: true\n }\n options = Object.assign({}, defaults, options)\n const {implicitGlobals} = options\n let globals = {}\n if (implicitGlobals) {\n globals.oscad = oscad\n }\n\n return new Promise(function (resolve, reject) {\n const callback = (err, result) => {\n if (!err) { return resolve(result) }\n reject(err)\n }\n rebuildSolidSync(source, '', params, callback, {implicitGlobals, globals})\n })\n}\n\n/**\n * generate output file from intermediate representation\n * @param {String} outputFormat the output file format\n * @param {Object} objects the openjscad intermediate representation\n */\nfunction generateOutput (outputFormat, objects) {\n return convertToBlob(objects, {format: outputFormat, formatInfo: {convertCAG: true, convertCSG: true}})\n}\n\nmodule.exports = {generateOutput, compile}\n"],"names":["const","this","arguments","Blob","let","XMLSerializer","sax","require$$0","require$$1","xmldom","DOMImplementation","CSG","CAG","i","log","color","index","oscad"],"mappings":"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,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;GACL,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;GACpE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;IACnE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;GACL,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;GACpE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;GACpE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;GACL,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;IACnE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;IACnE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;GACL,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,EAAE;GACL,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,EAAE;IACJ,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,EAAE;IACJ,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,EAAE;IACJ,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,EAAE;GACL,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE;IACnE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;GACpE,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;IACnE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,EAAE;GACL,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;GACL,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE;IACnE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;GACL,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE;IACnE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,EAAE;GACL,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE;IACnE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;GACpE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;GACL,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;GACpE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;GACpE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,EAAE;GACL,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;GACpE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;GACL,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE;IACnE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;GACpE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;GACpE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;GACpE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;IACpD,CAAC,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;GACpE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;GACL,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;IACnE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE;IACnE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;GACL,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;IACnE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,EAAE,CAAC;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;GACL,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE;IACnE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;GACpE,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE;IACnE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;GACpE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;GACpE,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;GACL,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;IACnE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,EAAE;GACL,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,EAAE;IACJ,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;GACL,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;IACnE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE;IACnE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;GACL,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE;IACnE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;GACL,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;IACnE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;IACJ,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;IACnE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,EAAE;GACL,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;GACL,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;GACpE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,EAAE,CAAC;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,EAAE,CAAC;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE;GACpE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE;IACnE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE;IACnE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;GACL,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;IACnE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;GACL,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE;IACnE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,EAAE;GACL,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;GACpE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;IACnE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;GACpE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,EAAE,CAAC;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;IACJ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;GACpE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;IACnE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;GACpE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACrD,EAAE,CAAC,EAAE;IACJ,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACpE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,C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"} \ No newline at end of file